Check for adhesion area collisions in one-at-a-time ordering

CURA-6785
This commit is contained in:
Nino van Hooff 2019-10-02 13:07:11 +02:00
parent 7bf2fa3b43
commit 9512030060
2 changed files with 26 additions and 3 deletions

View File

@ -92,12 +92,24 @@ class OneAtATimeIterator(Iterator.Iterator):
score_b = sum(self._hit_map[self._original_node_list.index(b)])
return score_a - score_b
# Checks if A can be printed before B
## Checks if A can be printed before B
def _checkHit(self, a: SceneNode, b: SceneNode) -> bool:
if a == b:
return False
overlap = a.callDecoration("getConvexHullBoundary").intersectsPolygon(b.callDecoration("getConvexHullHeadFull"))
a_hit_hull = a.callDecoration("getConvexHullBoundary")
b_hit_hull = b.callDecoration("getConvexHullHeadFull")
overlap = a_hit_hull.intersectsPolygon(b_hit_hull)
if overlap:
return True
# Adhesion areas must never overlap, regardless of printing order
# This would cause over-extrusion
a_hit_hull = a.callDecoration("getAdhesionArea")
b_hit_hull = b.callDecoration("getAdhesionArea")
overlap = a_hit_hull.intersectsPolygon(b_hit_hull)
if overlap:
return True
else:

View File

@ -76,7 +76,18 @@ class ConvexHullDecorator(SceneNodeDecorator):
def __deepcopy__(self, memo):
return ConvexHullDecorator()
## Get the unmodified 2D projected convex hull of the node (if any)
## The polygon representing the 2D adhesion area.
# If no adhesion is used, the regular convex hull is returned
def getAdhesionArea(self) -> Optional[Polygon]:
if self._node is None:
return None
hull = self._compute2DConvexHull()
return self._add2DAdhesionMargin(hull)
## Get the unmodified 2D projected convex hull with 2D adhesion area of the node (if any)
def getConvexHull(self) -> Optional[Polygon]:
if self._node is None:
return None