Selaa lähdekoodia

Support for parallel-line painting.

Juan Pablo Caram 9 vuotta sitten
vanhempi
commit
0b26a90175
3 muutettua tiedostoa jossa 80 lisäystä ja 3 poistoa
  1. 9 0
      FlatCAMObj.py
  2. 2 1
      ObjectUI.py
  3. 69 2
      camlib.py

+ 9 - 0
FlatCAMObj.py

@@ -1312,6 +1312,10 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                 cp = self.clear_polygon2(poly.buffer(-self.options["paintmargin"]),
                 cp = self.clear_polygon2(poly.buffer(-self.options["paintmargin"]),
                                          tooldia, overlap=overlap)
                                          tooldia, overlap=overlap)
 
 
+            elif self.options["paintmethod"] == "lines":
+                # Type(cp) == FlatCAMRTreeStorage | None
+                cp = self.clear_polygon3(poly.buffer(-self.options["paintmargin"]),
+                                         tooldia, overlap=overlap)
             else:
             else:
                 # Type(cp) == FlatCAMRTreeStorage | None
                 # Type(cp) == FlatCAMRTreeStorage | None
                 cp = self.clear_polygon(poly.buffer(-self.options["paintmargin"]),
                 cp = self.clear_polygon(poly.buffer(-self.options["paintmargin"]),
@@ -1387,6 +1391,11 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                     cp = self.clear_polygon2(poly.buffer(-self.options["paintmargin"]),
                     cp = self.clear_polygon2(poly.buffer(-self.options["paintmargin"]),
                                              tooldia, overlap=overlap)
                                              tooldia, overlap=overlap)
 
 
+                elif self.options["paintmethod"] == "lines":
+                    # Type(cp) == FlatCAMRTreeStorage | None
+                    cp = self.clear_polygon3(poly.buffer(-self.options["paintmargin"]),
+                                             tooldia, overlap=overlap)
+
                 else:
                 else:
                     # Type(cp) == FlatCAMRTreeStorage | None
                     # Type(cp) == FlatCAMRTreeStorage | None
                     cp = self.clear_polygon(poly.buffer(-self.options["paintmargin"]),
                     cp = self.clear_polygon(poly.buffer(-self.options["paintmargin"]),

+ 2 - 1
ObjectUI.py

@@ -393,7 +393,8 @@ class GeometryObjectUI(ObjectUI):
         grid2.addWidget(methodlabel, 3, 0)
         grid2.addWidget(methodlabel, 3, 0)
         self.paintmethod_combo = RadioSet([
         self.paintmethod_combo = RadioSet([
             {"label": "Standard", "value": "standard"},
             {"label": "Standard", "value": "standard"},
-            {"label": "Seed-based", "value": "seed"}
+            {"label": "Seed-based", "value": "seed"},
+            {"label": "Straight lines", "value": "lines"}
         ])
         ])
         grid2.addWidget(self.paintmethod_combo, 3, 1)
         grid2.addWidget(self.paintmethod_combo, 3, 1)
 
 

+ 69 - 2
camlib.py

@@ -31,7 +31,7 @@ from rtree import index as rtindex
 from shapely.geometry import Polygon, LineString, Point, LinearRing
 from shapely.geometry import Polygon, LineString, Point, LinearRing
 from shapely.geometry import MultiPoint, MultiPolygon
 from shapely.geometry import MultiPoint, MultiPolygon
 from shapely.geometry import box as shply_box
 from shapely.geometry import box as shply_box
-from shapely.ops import cascaded_union
+from shapely.ops import cascaded_union, unary_union
 import shapely.affinity as affinity
 import shapely.affinity as affinity
 from shapely.wkt import loads as sloads
 from shapely.wkt import loads as sloads
 from shapely.wkt import dumps as sdumps
 from shapely.wkt import dumps as sdumps
@@ -627,6 +627,72 @@ class Geometry(object):
 
 
         return geoms
         return geoms
 
 
+    @staticmethod
+    def clear_polygon3(polygon, tooldia, overlap=0.15, connect=True):
+        """
+        Creates geometry inside a polygon for a tool to cover
+        the whole area.
+
+        This algorithm draws horizontal lines inside the polygon.
+
+        :param polygon: The polygon being painted.
+        :type polygon: shapely.geometry.Polygon
+        :param tooldia: Tool diameter.
+        :param overlap: Tool path overlap percentage.
+        :param connect: Connect lines to avoid tool lifts.
+        :return:
+        """
+
+        log.debug("camlib.clear_polygon3()")
+
+        ## The toolpaths
+        # Index first and last points in paths
+        def get_pts(o):
+            return [o.coords[0], o.coords[-1]]
+
+        geoms = FlatCAMRTreeStorage()
+        geoms.get_points = get_pts
+
+        lines = []
+
+        # Bounding box
+        left, bot, right, top = polygon.bounds
+
+        # First line
+        y = top - tooldia / 2
+        while y > bot + tooldia / 2:
+            line = LineString([(left, y), (right, y)])
+            lines.append(line)
+            y -= tooldia * (1 - overlap)
+
+        # Last line
+        y = bot + tooldia / 2
+        line = LineString([(left, y), (right, y)])
+        lines.append(line)
+
+        # Combine
+        linesgeo = unary_union(lines)
+
+        # Trim to the polygon
+        margin_poly = polygon.buffer(-tooldia / 2)
+        lines_trimmed = linesgeo.intersection(margin_poly)
+
+        # Add lines to storage
+        for line in lines_trimmed:
+            geoms.insert(line)
+
+        # Add margin to storage
+        # geoms.insert(margin_poly.exterior)
+        # for ints in margin_poly.interiors:
+        #     geoms.insert(ints)
+
+        # Optimization: Reduce lifts
+        if connect:
+            log.debug("Reducing tool lifts...")
+            geoms = Geometry.paint_connect(geoms, polygon, tooldia)
+
+        return geoms
+
     def scale(self, factor):
     def scale(self, factor):
         """
         """
         Scales all of the object's geometry by a given factor. Override
         Scales all of the object's geometry by a given factor. Override
@@ -967,10 +1033,11 @@ class Geometry(object):
                     new_obj.append(mirror_geom(g))
                     new_obj.append(mirror_geom(g))
                 return new_obj
                 return new_obj
             else:
             else:
-                return affinity.scale(obj,xscale,yscale,origin=(px,py))
+                return affinity.scale(obj, xscale, yscale, origin=(px,py))
 
 
         self.solid_geometry = mirror_geom(self.solid_geometry)
         self.solid_geometry = mirror_geom(self.solid_geometry)
 
 
+
 class ApertureMacro:
 class ApertureMacro:
     """
     """
     Syntax of aperture macros.
     Syntax of aperture macros.