From 2845da3a539b365db5fa4fa5ce20cb18a57db98d Mon Sep 17 00:00:00 2001 From: daid303 Date: Tue, 16 Apr 2013 15:31:52 +0200 Subject: [PATCH] Add another optimalization to the object order calculator, do not evaluate impossible options. Add fill platform feature. --- Cura/gui/sceneView.py | 14 ++++++++++++++ Cura/util/objectScene.py | 13 +++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/Cura/gui/sceneView.py b/Cura/gui/sceneView.py index 055f598a..c435a105 100644 --- a/Cura/gui/sceneView.py +++ b/Cura/gui/sceneView.py @@ -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: diff --git a/Cura/util/objectScene.py b/Cura/util/objectScene.py index 0338367a..ba729dd7 100644 --- a/Cura/util/objectScene.py +++ b/Cura/util/objectScene.py @@ -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() -- 2.30.2