chiark / gitweb /
Add another optimalization to the object order calculator, do not evaluate impossible...
authordaid303 <daid303@gmail.com>
Tue, 16 Apr 2013 13:31:52 +0000 (15:31 +0200)
committerdaid303 <daid303@gmail.com>
Tue, 16 Apr 2013 13:31:52 +0000 (15:31 +0200)
Cura/gui/sceneView.py
Cura/util/objectScene.py

index 055f598a5db9b098779d182b39f7962d21e521de..c435a105aea252639cc79cddf705058f8bf87e0c 100644 (file)
@@ -233,6 +233,19 @@ class SceneView(openglGui.glGuiPanel):
                self._scene.centerAll()
                self.sceneUpdated()
 
+       def OnFillPlatform(self, e):
+               if self._selectedObj is None:
+                       return
+               while True:
+                       newObj = self._selectedObj.copy()
+                       self._scene.add(newObj)
+                       self._scene.centerAll()
+                       if not self._scene.checkPlatform(newObj):
+                               break
+               self._scene.remove(newObj)
+               self._scene.centerAll()
+               self.sceneUpdated()
+
        def OnSplitObject(self, e):
                if self._selectedObj is None:
                        return
@@ -376,6 +389,7 @@ class SceneView(openglGui.glGuiPanel):
                                        if self._selectedObj == self._focusObj:
                                                self.Bind(wx.EVT_MENU, self.OnDuplicateObject, menu.Append(-1, 'Duplicate'))
                                                self.Bind(wx.EVT_MENU, self.OnSplitObject, menu.Append(-1, 'Split'))
+                                               self.Bind(wx.EVT_MENU, self.OnFillPlatform, menu.Append(-1, 'Fill platform'))
                                        if self._selectedObj != self._focusObj and self._focusObj is not None:
                                                self.Bind(wx.EVT_MENU, self.OnMergeObjects, menu.Append(-1, 'Dual extrusion merge'))
                                        if menu.MenuItemCount > 0:
index 0338367a3cc1f7f99b0c7c0ffb664cba091e4e20..ba729dd72a9b1a26e9fcd1b0aa77ef4545784c46 100644 (file)
@@ -29,18 +29,21 @@ class _objectOrderFinder(object):
 
                initialList.sort(self._objIdxCmp)
 
+               n = 0
                self._todo = [_objectOrder([], initialList)]
                while len(self._todo) > 0:
+                       n += 1
                        current = self._todo.pop()
-                       #print len(self._todo), len(current.order), len(initialList)
+                       print len(self._todo), len(current.order), len(initialList), current.order
                        for addIdx in current.todo:
-                               if not self._checkHitFor(addIdx, current.order):
+                               if not self._checkHitFor(addIdx, current.order) and not self._checkBlocks(addIdx, current.todo):
                                        todoList = current.todo[:]
                                        todoList.remove(addIdx)
                                        order = current.order[:] + [addIdx]
                                        if len(todoList) == 0:
                                                self._todo = None
                                                self.order = order
+                                               print n
                                                return
                                        self._todo.append(_objectOrder(order, todoList))
                self.order = None
@@ -56,6 +59,12 @@ class _objectOrderFinder(object):
                                return True
                return False
 
+       def _checkBlocks(self, addIdx, others):
+               for idx in others:
+                       if addIdx != idx and self._hitMap[idx][addIdx]:
+                               return True
+               return False
+
        def _checkHit(self, addIdx, idx):
                addPos = self._scene._objectList[addIdx].getPosition()
                addSize = self._scene._objectList[addIdx].getSize()