4 class _objectOrder(object):
5 def __init__(self, order, todo):
9 class _objectOrderFinder(object):
10 def __init__(self, scene, offset):
12 self._offset = offset - numpy.array([0.1,0.1])
13 self._objs = scene.objects()
14 self._leftToRight = True
15 self._frontToBack = True
17 for n in xrange(0, len(self._objs)):
18 if scene.checkPlatform(self._objs[n]):
20 if len(initialList) == 0:
23 self._todo = [_objectOrder([], initialList)]
24 while len(self._todo) > 0:
25 current = self._todo.pop()
26 for addIdx in current.todo:
27 if not self._checkHitFor(addIdx, current.order):
28 todoList = current.todo[:]
29 todoList.remove(addIdx)
30 order = current.order[:] + [addIdx]
31 if len(todoList) == 0:
35 self._todo.append(_objectOrder(order, todoList))
38 def _checkHitFor(self, addIdx, others):
40 if self._checkHit(addIdx, idx):
44 def _checkHit(self, addIdx, idx):
45 addPos = self._scene._objectList[addIdx].getPosition()
46 addSize = self._scene._objectList[addIdx].getSize()
47 pos = self._scene._objectList[idx].getPosition()
48 size = self._scene._objectList[idx].getSize()
51 if addPos[0] + addSize[0] / 2 + self._offset[0] <= pos[0] - size[0] / 2:
54 if addPos[0] - addSize[0] / 2 - self._offset[0] <= pos[0] + size[0] / 2:
58 if addPos[1] - addSize[1] / 2 - self._offset[1] >= pos[1] + size[1] / 2:
61 if addPos[1] + addSize[1] / 2 + self._offset[1] >= pos[1] - size[1] / 2:
69 self._sizeOffsets = numpy.array([3.0,3.0], numpy.float32)
70 self._machineSize = numpy.array([100,100,100], numpy.float32)
71 self._headOffsets = numpy.array([18.0,18.0], numpy.float32)
73 def setMachineSize(self, machineSize):
74 self._machineSize = machineSize
76 def setSizeOffsets(self, sizeOffsets):
77 self._sizeOffsets = sizeOffsets
79 def getObjectExtend(self):
80 return self._sizeOffsets + self._headOffsets
83 return self._objectList
86 self._findFreePositionFor(obj)
87 self._objectList.append(obj)
90 def remove(self, obj):
91 self._objectList.remove(obj)
95 while self._pushFree():
100 def arrangeAll(self):
101 oldList = self._objectList
102 self._objectList = []
104 obj.setPosition(numpy.array([0,0], numpy.float32))
108 minPos = numpy.array([9999999,9999999], numpy.float32)
109 maxPos = numpy.array([-9999999,-9999999], numpy.float32)
110 for obj in self._objectList:
111 pos = obj.getPosition()
113 minPos[0] = min(minPos[0], pos[0] - size[0] / 2)
114 minPos[1] = min(minPos[1], pos[1] - size[1] / 2)
115 maxPos[0] = max(maxPos[0], pos[0] + size[0] / 2)
116 maxPos[1] = max(maxPos[1], pos[1] + size[1] / 2)
117 offset = -(maxPos + minPos) / 2
118 for obj in self._objectList:
119 obj.setPosition(obj.getPosition() + offset)
121 def printOrder(self):
122 order = _objectOrderFinder(self, self._headOffsets + self._sizeOffsets).order
124 print "ODD! Cannot find out proper printing order!!!"
128 for a in self._objectList:
129 for b in self._objectList:
130 if not self._checkHit(a, b):
132 posDiff = a.getPosition() - b.getPosition()
133 if posDiff[0] == 0.0 and posDiff[1] == 0.0:
135 if abs(posDiff[0]) > abs(posDiff[1]):
139 aPos = a.getPosition()
140 bPos = b.getPosition()
141 center = (aPos[axis] + bPos[axis]) / 2
142 distance = (a.getSize()[axis] + b.getSize()[axis]) / 2 + 0.1 + self._sizeOffsets[axis] + self._headOffsets[axis]
143 if posDiff[axis] < 0:
145 aPos[axis] = center + distance / 2
146 bPos[axis] = center - distance / 2
152 def _checkHit(self, a, b):
155 posDiff = a.getPosition() - b.getPosition()
156 if abs(posDiff[0]) < (a.getSize()[0] + b.getSize()[0]) / 2 + self._sizeOffsets[0] + self._headOffsets[0]:
157 if abs(posDiff[1]) < (a.getSize()[1] + b.getSize()[1]) / 2 + self._sizeOffsets[1] + self._headOffsets[1]:
161 def checkPlatform(self, obj):
162 p = obj.getPosition()
163 s = obj.getSize()[0:2] / 2 + self._sizeOffsets
164 if p[0] - s[0] < -self._machineSize[0] / 2:
166 if p[0] + s[0] > self._machineSize[0] / 2:
168 if p[1] - s[1] < -self._machineSize[1] / 2:
170 if p[1] + s[1] > self._machineSize[1] / 2:
174 def _findFreePositionFor(self, obj):
176 for a in self._objectList:
178 s = (a.getSize()[0:2] + obj.getSize()[0:2]) / 2 + self._sizeOffsets + self._headOffsets
179 posList.append(p + s * ( 1, 1))
180 posList.append(p + s * ( 0, 1))
181 posList.append(p + s * (-1, 1))
182 posList.append(p + s * ( 1, 0))
183 posList.append(p + s * (-1, 0))
184 posList.append(p + s * ( 1,-1))
185 posList.append(p + s * ( 0,-1))
186 posList.append(p + s * (-1,-1))
193 for a in self._objectList:
194 if self._checkHit(a, obj):
199 dist = numpy.linalg.norm(p)
200 if not self.checkPlatform(obj):
202 if best is None or dist < bestDist:
206 obj.setPosition(best)