From 57632f895e15000b1b8c862b1c09f8a5dddc8583 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 3 Sep 2015 16:08:41 +0200 Subject: [PATCH 1/3] Fix one at a time iterator to not check things like the platform --- cura/OneAtATimeIterator.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cura/OneAtATimeIterator.py b/cura/OneAtATimeIterator.py index cf767a65ff..0be14e8703 100644 --- a/cura/OneAtATimeIterator.py +++ b/cura/OneAtATimeIterator.py @@ -2,6 +2,7 @@ # Cura is released under the terms of the AGPLv3 or higher. from UM.Scene.Iterator import Iterator +from UM.Scene.SceneNode import SceneNode from functools import cmp_to_key from UM.Application import Application @@ -10,13 +11,16 @@ from UM.Application import Application # Take note that the list of nodes can have children (that may or may not contain mesh data) class OneAtATimeIterator(Iterator.Iterator): def __init__(self, scene_node): - super(OneAtATimeIterator, self).__init__(scene_node) # Call super to make multiple inheritence work. + super().__init__(scene_node) # Call super to make multiple inheritence work. self._hit_map = [[]] self._original_node_list = [] def _fillStack(self): node_list = [] for node in self._scene_node.getChildren(): + if not type(node) is SceneNode: + continue + if node.getBoundingBox().height > Application.getInstance().getMachineManager().getActiveProfile().getSettingValue("gantry_height"): return if node.callDecoration("getConvexHull"): From 45f213cd82ebdb4f5963a217ac4a391d4dc53810 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 3 Sep 2015 16:34:25 +0200 Subject: [PATCH 2/3] Head shape is now also shown in hull --- cura/ConvexHullNode.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/cura/ConvexHullNode.py b/cura/ConvexHullNode.py index 3ea148dce8..4b36a11949 100644 --- a/cura/ConvexHullNode.py +++ b/cura/ConvexHullNode.py @@ -29,16 +29,24 @@ class ConvexHullNode(SceneNode): self._node.parentChanged.connect(self._onNodeParentChanged) self._node.decoratorsChanged.connect(self._onNodeDecoratorsChanged) self._onNodeDecoratorsChanged(self._node) - + self.convexHullHeadMesh = None self._hull = hull hull_points = self._hull.getPoints() + hull_mesh = self.createHullMesh(self._hull.getPoints()) + if hull_mesh: + self.setMeshData(hull_mesh) + convex_hull_head = self._node.callDecoration("getConvexHullHead") + if convex_hull_head: + self.convexHullHeadMesh = self.createHullMesh(convex_hull_head.getPoints()) + + def createHullMesh(self, hull_points): mesh = MeshData() if len(hull_points) > 3: center = (hull_points.min(0) + hull_points.max(0)) / 2.0 mesh.addVertex(center[0], 0.1, center[1]) - else: #Hull has not enough points - return + else: + return None for point in hull_points: mesh.addVertex(point[0], 0.1, point[1]) indices = [] @@ -48,8 +56,7 @@ class ConvexHullNode(SceneNode): indices.append([0, mesh.getVertexCount() - 1, 1]) mesh.addIndices(numpy.array(indices, numpy.int32)) - - self.setMeshData(mesh) + return mesh def getWatchedNode(self): return self._node @@ -61,6 +68,8 @@ class ConvexHullNode(SceneNode): if self.getParent(): self._material.setUniformValue("u_color", self._color) renderer.queueNode(self, material = self._material, transparent = True) + if self.convexHullHeadMesh: + renderer.queueNode(self, material = self._material,transparent = True, mesh = self.convexHullHeadMesh) return True From 6d184ea2810e796e083da0585a4a157c491ac6f3 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 3 Sep 2015 16:38:58 +0200 Subject: [PATCH 3/3] One at a time now has the correct push free behaviour --- cura/PlatformPhysics.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py index c91aaaabde..bf2860d7d6 100644 --- a/cura/PlatformPhysics.py +++ b/cura/PlatformPhysics.py @@ -111,7 +111,11 @@ class PlatformPhysics: # Get the overlap distance for both convex hulls. If this returns None, there is no intersection. try: - overlap = node.callDecoration("getConvexHull").intersectsPolygon(other_node.callDecoration("getConvexHull")) + head_hull = node.callDecoration("getConvexHullHead") + if head_hull: + overlap = head_hull.intersectsPolygon(other_node.callDecoration("getConvexHull")) + else: + overlap = node.callDecoration("getConvexHull").intersectsPolygon(other_node.callDecoration("getConvexHull")) except: overlap = None #It can sometimes occur that the caclulated convex hull has no size, in which case there is no overlap.