Просмотр исходного кода

Merged in phdussud/flatcam (pull request #10)

issue #143
jpcgt 10 лет назад
Родитель
Сommit
9de0357b0b
2 измененных файлов с 29 добавлено и 6 удалено
  1. 25 4
      FlatCAMObj.py
  2. 4 2
      camlib.py

+ 25 - 4
FlatCAMObj.py

@@ -441,6 +441,26 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
         base_name = self.options["name"] + "_iso"
         base_name = outname or base_name
 
+        def generate_envelope (offset, invert):
+            # isolation_geometry produces an envelope that is going on the left of the geometry
+            # (the copper features). To leave the least amount of burrs on the features
+            # the tool needs to travel on the right side of the features (this is called conventional milling)
+            # the first pass is the one cutting all of the features, so it needs to be reversed
+            # the other passes overlap preceding ones and cut the left over copper. It is better for them
+            # to cut on the right side of the left over copper i.e on the left side of the features. 
+            geom = self.isolation_geometry(offset)
+            if invert:
+                if type(geom) is MultiPolygon:
+                    pl = []
+                    for p in geom:
+                        pl.append(Polygon (p.exterior.coords[::-1], p.interiors))
+                    geom = MultiPolygon(pl)
+                elif type(geom) is Polygon:
+                    geom = Polygon (geom.exterior.coords[::-1], geom.interiors);
+                else:
+                    raise "Unexpected Geometry"
+            return geom
+
         if (combine):
             iso_name = base_name
 
@@ -451,7 +471,8 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
                 geo_obj.solid_geometry = []
                 for i in range(passes):
                     offset = (2 * i + 1) / 2.0 * dia - i * overlap * dia
-                    geo_obj.solid_geometry.append(self.isolation_geometry(offset))
+                    geom = generate_envelope (offset, i == 0)
+                    geo_obj.solid_geometry.append(geom)
                 app_obj.info("Isolation geometry created: %s" % geo_obj.options["name"])
 
             # TODO: Do something if this is None. Offer changing name?
@@ -470,7 +491,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
                 def iso_init(geo_obj, app_obj):
                     # Propagate options
                     geo_obj.options["cnctooldia"] = self.options["isotooldia"]
-                    geo_obj.solid_geometry = self.isolation_geometry(offset)
+                    geo_obj.solid_geometry = generate_envelope (offset, i == 0)
                     app_obj.info("Isolation geometry created: %s" % geo_obj.options["name"])
 
                 # TODO: Do something if this is None. Offer changing name?
@@ -1062,7 +1083,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
         z_move = z_move if z_move is not None else self.options["travelz"]
         feedrate = feedrate if feedrate is not None else self.options["feedrate"]
         tooldia = tooldia if tooldia is not None else self.options["cnctooldia"]
-
+        
         # Object initialization function for app.new_object()
         # RUNNING ON SEPARATE THREAD!
         def job_init(job_obj, app_obj):
@@ -1220,4 +1241,4 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
 
         self.plot_element(self.solid_geometry)
 
-        self.app.plotcanvas.auto_adjust_axes()
+        self.app.plotcanvas.auto_adjust_axes()

+ 4 - 2
camlib.py

@@ -540,7 +540,8 @@ class Geometry(object):
 
                 # If last point in geometry is the nearest
                 # then reverse coordinates.
-                if list(pt) == list(candidate.coords[-1]):
+                # but prefer the first one if last == first
+                if pt != candidate.coords[0] and pt == candidate.coords[-1]:
                     candidate.coords = list(candidate.coords)[::-1]
 
                 # Straight line from current_pt to pt.
@@ -2689,8 +2690,9 @@ class CNCjob(Geometry):
                 storage.remove(geo)
 
                 # If last point in geometry is the nearest
+                # but prefer the first one if last point == first point
                 # then reverse coordinates.
-                if list(pt) == list(geo.coords[-1]):
+                if pt != geo.coords[0] and pt == geo.coords[-1]:
                     geo.coords = list(geo.coords)[::-1]
 
                 # G-code