diff --git a/cura/Arranging/GridArrange.py b/cura/Arranging/GridArrange.py index 3b00f44ddc..a049c20c82 100644 --- a/cura/Arranging/GridArrange.py +++ b/cura/Arranging/GridArrange.py @@ -54,6 +54,11 @@ class GridArrange(Arranger): self._fixed_nodes_grid_ids = self._fixed_nodes_grid_ids.union( self.intersectingGridIdxInclusive(node.getBoundingBox())) + #grid indexes that are in disallowed area + for polygon in self._build_volume.getDisallowedAreas(): + self._fixed_nodes_grid_ids = self._fixed_nodes_grid_ids.union( + self._getIntersectingGridIdForPolygon(polygon)) + self._build_plate_grid_ids = self.intersectingGridIdxExclusive(self._build_volume_bounding_box) # Filter out the corner grid squares if the build plate shape is elliptic @@ -241,6 +246,32 @@ class GridArrange(Arranger): grid_x2, grid_y2 = self.coordSpaceToGridSpace(coord_x2, coord_y2) return grid_x1, grid_y1, grid_x2, grid_y2 + def _getIntersectingGridIdForPolygon(self, polygon)-> Set[Tuple[int, int]]: + # (x0, y0) + # | + # v + # ┌─────────────┐ + # │ │ + # │ │ + # └─────────────┘ < (x1, y1) + x0 = float('inf') + y0 = float('inf') + x1 = float('-inf') + y1 = float('-inf') + grid_idx = set() + for [x, y] in polygon.getPoints(): + x0 = min(x0, x) + y0 = min(y0, y) + x1 = max(x1, x) + y1 = max(y1, y) + grid_x1, grid_y1 = self.coordSpaceToGridSpace(x0, y0) + grid_x2, grid_y2 = self.coordSpaceToGridSpace(x1, y1) + + for grid_x in range(math.floor(grid_x1), math.ceil(grid_x2)): + for grid_y in range(math.floor(grid_y1), math.ceil(grid_y2)): + grid_idx.add((grid_x, grid_y)) + return grid_idx + def intersectingGridIdxInclusive(self, bounding_box: "BoundingVolume") -> Set[Tuple[int, int]]: grid_x1, grid_y1, grid_x2, grid_y2 = self._getGridCornerPoints(bounding_box) grid_idx = set() @@ -326,8 +357,25 @@ class GridArrange(Arranger): /> """) - for grid_x in range(-10, 10): - for grid_y in range(-10, 10): + for polygon in self._build_volume.getDisallowedAreas(): + # Extract individual points and convert them to tuples + + path_data = "" + for [x,y] in polygon.getPoints(): + path_data += f"{x},{y} " + + f.write( + f""" + + """) + + for grid_x in range(-10, 100): + for grid_y in range(-10, 100): if (grid_x, grid_y) in self._allowed_grid_idx: fill_color = "rgba(0, 255, 0, 0.5)" elif (grid_x, grid_y) in self._build_plate_grid_ids: