Browse Source

Fixes for the problem where duplicated objects were broken, missing hull 'shadows' or would fly off the build plate.
Contributes to CURA-1504 Improve performance/simplicity by using Convex Hulls in Scene Graph

Simon Edwards 8 years ago
parent
commit
551dc7d757
3 changed files with 14 additions and 17 deletions
  1. 2 2
      cura/CuraApplication.py
  2. 9 15
      cura/PlatformPhysics.py
  3. 3 0
      cura/ZOffsetDecorator.py

+ 2 - 2
cura/CuraApplication.py

@@ -546,12 +546,12 @@ class CuraApplication(QtApplication):
             for _ in range(count):
                 if node.getParent() and node.getParent().callDecoration("isGroup"):
                     new_node = copy.deepcopy(node.getParent()) #Copy the group node.
-                    new_node.callDecoration("setConvexHull",None)
+                    new_node.callDecoration("recomputeConvexHull")
 
                     op.addOperation(AddSceneNodeOperation(new_node,node.getParent().getParent()))
                 else:
                     new_node = copy.deepcopy(node)
-                    new_node.callDecoration("setConvexHull", None)
+                    new_node.callDecoration("recomputeConvexHull")
                     op.addOperation(AddSceneNodeOperation(new_node, node.getParent()))
 
             op.push()

+ 9 - 15
cura/PlatformPhysics.py

@@ -7,7 +7,6 @@ from UM.Scene.SceneNode import SceneNode
 from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator
 from UM.Math.Vector import Vector
 from UM.Math.AxisAlignedBox import AxisAlignedBox
-from UM.Application import Application
 from UM.Scene.Selection import Selection
 from UM.Preferences import Preferences
 
@@ -16,8 +15,6 @@ from cura.ConvexHullDecorator import ConvexHullDecorator
 from . import PlatformPhysicsOperation
 from . import ZOffsetDecorator
 
-import copy
-
 class PlatformPhysics:
     def __init__(self, controller, volume):
         super().__init__()
@@ -100,18 +97,15 @@ class PlatformPhysics:
                     #    continue
 
                     # Get the overlap distance for both convex hulls. If this returns None, there is no intersection.
-                    try:
-                        head_hull = node.callDecoration("getConvexHullHead")
-                        if head_hull:
-                            overlap = head_hull.intersectsPolygon(other_node.callDecoration("getConvexHull"))
-                            if not overlap:
-                                other_head_hull = other_node.callDecoration("getConvexHullHead")
-                                if other_head_hull:
-                                    overlap = node.callDecoration("getConvexHull").intersectsPolygon(other_head_hull)
-                        else:
-                            overlap = node.callDecoration("getConvexHull").intersectsPolygon(other_node.callDecoration("getConvexHull"))
-                    except:
-                        overlap = None #It can sometimes occur that the calculated convex hull has no size, in which case there is no overlap.
+                    head_hull = node.callDecoration("getConvexHullHead")
+                    if head_hull:
+                        overlap = head_hull.intersectsPolygon(other_node.callDecoration("getConvexHull"))
+                        if not overlap:
+                            other_head_hull = other_node.callDecoration("getConvexHullHead")
+                            if other_head_hull:
+                                overlap = node.callDecoration("getConvexHull").intersectsPolygon(other_head_hull)
+                    else:
+                        overlap = node.callDecoration("getConvexHull").intersectsPolygon(other_node.callDecoration("getConvexHull"))
 
                     if overlap is None:
                         continue

+ 3 - 0
cura/ZOffsetDecorator.py

@@ -10,3 +10,6 @@ class ZOffsetDecorator(SceneNodeDecorator):
 
     def getZOffset(self):
         return self._z_offset
+
+    def __deepcopy__(self, memo):
+        return ZOffsetDecorator()