diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index d5d19b9bc7..4cb9ac3604 100644 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -433,32 +433,18 @@ class BuildVolume(SceneNode): # Add prime tower location as disallowed area. prime_tower_collision = False - if ExtruderManager.getInstance().getResolveOrValue("prime_tower_enable") == True: - prime_tower_size = self._global_container_stack.getProperty("prime_tower_size", "value") - prime_tower_x = self._global_container_stack.getProperty("prime_tower_position_x", "value") - machine_width / 2 - prime_tower_y = - self._global_container_stack.getProperty("prime_tower_position_y", "value") + machine_depth / 2 - - prime_tower_area = Polygon([ - [prime_tower_x - prime_tower_size, prime_tower_y - prime_tower_size], - [prime_tower_x, prime_tower_y - prime_tower_size], - [prime_tower_x, prime_tower_y], - [prime_tower_x - prime_tower_size, prime_tower_y], - ]) - # Using Minkowski of 0 fixes the prime tower area so it's rendered correctly - prime_tower_area = prime_tower_area.getMinkowskiHull(Polygon.approximatedCircle(0)) - - #Check if the prime tower area intersects with any of the other areas. - #If this is the case, add it to the error area's so it can be drawn in red. - #If not, add it back to disallowed area's, so it's rendered as normal. + prime_tower_areas = self._computeDisallowedAreasPrinted() + for prime_tower_area in prime_tower_areas: for area in result_areas: if prime_tower_area.intersectsPolygon(area) is not None: prime_tower_collision = True break - - if not prime_tower_collision: - result_areas.append(prime_tower_area) - else: - self._error_areas.append(prime_tower_area) + if prime_tower_collision: #Already found a collision. + break + if not prime_tower_collision: + result_areas.extend(prime_tower_areas) + else: + self._error_areas.extend(prime_tower_areas) # The buildplate has errors if either prime tower or prime has a colission. self._has_errors = prime_tower_collision or prime_collision @@ -473,6 +459,23 @@ class BuildVolume(SceneNode): # \return A list of polygons that represent the disallowed areas. def _computeDisallowedAreasPrinted(self): result = [] + #Currently, the only normally printed object is the prime tower. + if ExtruderManager.getInstance().getResolveOrValue("prime_tower_enable") == True: + prime_tower_size = self._global_container_stack.getProperty("prime_tower_size", "value") + machine_width = self._global_container_stack.getProperty("machine_width", "value") + machine_depth = self._global_container_stack.getProperty("machine_depth", "value") + prime_tower_x = self._global_container_stack.getProperty("prime_tower_position_x", "value") - machine_width / 2 + prime_tower_y = - self._global_container_stack.getProperty("prime_tower_position_y", "value") + machine_depth / 2 + + prime_tower_area = Polygon([ + [prime_tower_x - prime_tower_size, prime_tower_y - prime_tower_size], + [prime_tower_x, prime_tower_y - prime_tower_size], + [prime_tower_x, prime_tower_y], + [prime_tower_x - prime_tower_size, prime_tower_y], + ]) + result.append(prime_tower_area) + + return result ## Computes the disallowed areas that are statically placed in the machine. #