From 9f2e87fdcb357394fde5072cc620f35a96bab61c Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 11 May 2016 17:44:58 +0200 Subject: [PATCH] Force updating the convex hull of a group node if one of its children is removed Before this fix, if a subselection of a group was deleted from the group, the convex hull would not update. CURA-1054 --- cura/ConvexHullDecorator.py | 43 +++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/cura/ConvexHullDecorator.py b/cura/ConvexHullDecorator.py index b53737cc80..381b5b2b69 100644 --- a/cura/ConvexHullDecorator.py +++ b/cura/ConvexHullDecorator.py @@ -8,11 +8,11 @@ class ConvexHullDecorator(SceneNodeDecorator): def __init__(self): super().__init__() self._convex_hull = None - + # In case of printing all at once this is the same as the convex hull. # For one at the time this is the area without the head. self._convex_hull_boundary = None - + # In case of printing all at once this is the same as the convex hull. # For one at the time this is area with intersection of mirrored head self._convex_hull_head = None @@ -20,15 +20,23 @@ class ConvexHullDecorator(SceneNodeDecorator): # In case of printing all at once this is the same as the convex hull. # For one at the time this is area with intersection of full head self._convex_hull_head_full = None - + self._convex_hull_node = None self._convex_hull_job = None + # Keep track of the previous parent so we can clear its convex hull when the object is reparented + self._parent_node = None + self._profile = None Application.getInstance().getMachineManager().activeProfileChanged.connect(self._onActiveProfileChanged) Application.getInstance().getMachineManager().activeMachineInstanceChanged.connect(self._onActiveMachineInstanceChanged) self._onActiveProfileChanged() + def setNode(self, node): + super().setNode(node) + self._parent_node = node.getParent() + node.parentChanged.connect(self._onParentChanged) + ## Force that a new (empty) object is created upon copy. def __deepcopy__(self, memo): copy = ConvexHullDecorator() @@ -59,7 +67,7 @@ class ConvexHullDecorator(SceneNodeDecorator): if not self._convex_hull_boundary: return self.getConvexHull() return self._convex_hull_boundary - + def setConvexHullBoundary(self, hull): self._convex_hull_boundary = hull @@ -68,22 +76,25 @@ class ConvexHullDecorator(SceneNodeDecorator): def setConvexHullHead(self, hull): self._convex_hull_head = hull - + def setConvexHull(self, hull): self._convex_hull = hull - + if not hull and self._convex_hull_node: + self._convex_hull_node.setParent(None) + self._convex_hull_node = None + def getConvexHullJob(self): return self._convex_hull_job - + def setConvexHullJob(self, job): self._convex_hull_job = job - + def getConvexHullNode(self): return self._convex_hull_node - + def setConvexHullNode(self, node): self._convex_hull_node = node - + def _onActiveProfileChanged(self): if self._profile: self._profile.settingValueChanged.disconnect(self._onSettingValueChanged) @@ -97,15 +108,15 @@ class ConvexHullDecorator(SceneNodeDecorator): if self._convex_hull_job: self._convex_hull_job.cancel() self.setConvexHull(None) - if self._convex_hull_node: - self._convex_hull_node.setParent(None) - self._convex_hull_node = None def _onSettingValueChanged(self, setting): if setting == "print_sequence": if self._convex_hull_job: self._convex_hull_job.cancel() self.setConvexHull(None) - if self._convex_hull_node: - self._convex_hull_node.setParent(None) - self._convex_hull_node = None + + def _onParentChanged(self, node): + # Force updating the convex hull of the parent group if the object is in a group + if self._parent_node and self._parent_node.callDecoration("isGroup"): + self._parent_node.callDecoration("setConvexHull", None) + self._parent_node = self.getNode().getParent()