chiark / gitweb /
Add proper slicing order.
authordaid303 <daid303@gmail.com>
Thu, 4 Apr 2013 12:33:31 +0000 (14:33 +0200)
committerdaid303 <daid303@gmail.com>
Thu, 4 Apr 2013 12:33:31 +0000 (14:33 +0200)
Cura/util/objectScene.py
Cura/util/sliceEngine.py

index 4ddfdddde755dd7300c19c6a61dd2c637967bbbb..b469c0714ec9d7032478a474640e88f06829371d 100644 (file)
@@ -1,7 +1,65 @@
 import random
 import numpy
 
-class Scene():
+class _objectOrder(object):
+       def __init__(self, order, todo):
+               self.order = order
+               self.todo = todo
+
+class _objectOrderFinder(object):
+       def __init__(self, scene, offset):
+               self._scene = scene
+               self._offset = offset - numpy.array([0.1,0.1])
+               self._objs = scene.objects()
+               self._leftToRight = True
+               self._frontToBack = True
+               initialList = []
+               for n in xrange(0, len(self._objs)):
+                       if scene.checkPlatform(self._objs[n]):
+                               initialList.append(n)
+               self._todo = [_objectOrder([], initialList)]
+               while len(self._todo) > 0:
+                       current = self._todo.pop()
+                       for addIdx in current.todo:
+                               if not self._checkHitFor(addIdx, current.order):
+                                       todoList = current.todo[:]
+                                       todoList.remove(addIdx)
+                                       order = current.order[:] + [addIdx]
+                                       if len(todoList) == 0:
+                                               self.order = order
+                                               return
+                                       self._todo.append(_objectOrder(order, todoList))
+               self.order = None
+
+       def _checkHitFor(self, addIdx, others):
+               for idx in others:
+                       if self._checkHit(addIdx, idx):
+                               return True
+               return False
+
+       def _checkHit(self, addIdx, idx):
+               addPos = self._scene._objectList[addIdx].getPosition()
+               addSize = self._scene._objectList[addIdx].getSize()
+               pos = self._scene._objectList[idx].getPosition()
+               size = self._scene._objectList[idx].getSize()
+
+               if self._leftToRight:
+                       if addPos[0] + addSize[0] / 2 + self._offset[0] <= pos[0] - size[0] / 2:
+                               return False
+               else:
+                       if addPos[0] - addSize[0] / 2 - self._offset[0] <= pos[0] + size[0] / 2:
+                               return False
+
+               if self._frontToBack:
+                       if addPos[1] - addSize[1] / 2 - self._offset[1] >= pos[1] + size[1] / 2:
+                               return False
+               else:
+                       if addPos[1] + addSize[1] / 2 + self._offset[1] >= pos[1] - size[1] / 2:
+                               return False
+
+               return True
+
+class Scene(object):
        def __init__(self):
                self._objectList = []
                self._sizeOffsets = numpy.array([3.0,3.0], numpy.float32)
@@ -54,8 +112,7 @@ class Scene():
                        obj.setPosition(obj.getPosition() + offset)
 
        def printOrder(self):
-               order = range(0, len(self._objectList))
-               return order
+               return _objectOrderFinder(self, self._headOffsets + self._sizeOffsets).order
 
        def _pushFree(self):
                for a in self._objectList:
index 84fab9a71bb3dadc87a8ae862a16c761d71480e3..5eca15448f71de5331ca8b395a9abbb3fafdc14c 100644 (file)
@@ -47,9 +47,8 @@ class Slicer(object):
                commandList += ['-b', self._binaryStorageFilename]
                self._objCount = 0
                with open(self._binaryStorageFilename, "wb") as f:
-                       for obj in scene._objectList:
-                               if not scene.checkPlatform(obj):
-                                       continue
+                       for n in scene.printOrder():
+                               obj = scene.objects()[n]
                                for mesh in obj._meshList:
                                        n = numpy.array(mesh.vertexCount, numpy.int32)
                                        f.write(n.tostring())