Browse Source

- Tool Cutout - some work in gaps thickness control for the free form cutout

Marius Stanciu 5 năm trước cách đây
mục cha
commit
6af295358d
2 tập tin đã thay đổi với 66 bổ sung12 xóa
  1. 4 0
      CHANGELOG.md
  2. 62 12
      appTools/ToolCutOut.py

+ 4 - 0
CHANGELOG.md

@@ -7,6 +7,10 @@ CHANGELOG for FlatCAM beta
 
 
 =================================================
 =================================================
 
 
+11.08.2020
+
+- CutOut Tool - finished handler for gaps thickness control for the free form cutout
+
 9.08.2020
 9.08.2020
 
 
 - small fix so the cx_freeze 6.2 module will work in building a frozen version of FlatCAM
 - small fix so the cx_freeze 6.2 module will work in building a frozen version of FlatCAM

+ 62 - 12
appTools/ToolCutOut.py

@@ -310,6 +310,11 @@ class CutOut(AppTool):
                 object_geo = cutout_obj.solid_geometry
                 object_geo = cutout_obj.solid_geometry
 
 
             def cutout_handler(geom):
             def cutout_handler(geom):
+                proc_geometry = []
+                rest_geometry = []
+                r_temp_geo = []
+                initial_geo = deepcopy(geom)
+
                 # Get min and max data for each object as we just cut rectangles across X or Y
                 # Get min and max data for each object as we just cut rectangles across X or Y
                 xxmin, yymin, xxmax, yymax = CutOut.recursive_bounds(geom)
                 xxmin, yymin, xxmax, yymax = CutOut.recursive_bounds(geom)
 
 
@@ -318,7 +323,6 @@ class CutOut(AppTool):
                 lenx = (xxmax - xxmin) + (margin * 2)
                 lenx = (xxmax - xxmin) + (margin * 2)
                 leny = (yymax - yymin) + (margin * 2)
                 leny = (yymax - yymin) + (margin * 2)
 
 
-                proc_geometry = []
                 if gaps == 'None':
                 if gaps == 'None':
                     pass
                     pass
                 else:
                 else:
@@ -330,6 +334,10 @@ class CutOut(AppTool):
                             py + gapsize + leny / 4  # topright_y
                             py + gapsize + leny / 4  # topright_y
                         )
                         )
                         geom = self.subtract_poly_from_geo(geom, points)
                         geom = self.subtract_poly_from_geo(geom, points)
+                        r_temp_geo.append(
+                            self.intersect_geo(initial_geo, box(points[0], points[1], points[2], points[3]))
+                        )
+
                         points = (
                         points = (
                             xxmin - gapsize,
                             xxmin - gapsize,
                             py - gapsize - leny / 4,
                             py - gapsize - leny / 4,
@@ -337,6 +345,9 @@ class CutOut(AppTool):
                             py + gapsize - leny / 4
                             py + gapsize - leny / 4
                         )
                         )
                         geom = self.subtract_poly_from_geo(geom, points)
                         geom = self.subtract_poly_from_geo(geom, points)
+                        r_temp_geo.append(
+                            self.intersect_geo(initial_geo, box(points[0], points[1], points[2], points[3]))
+                        )
 
 
                     if gaps == '8' or gaps == '2TB':
                     if gaps == '8' or gaps == '2TB':
                         points = (
                         points = (
@@ -346,6 +357,10 @@ class CutOut(AppTool):
                             yymax + gapsize
                             yymax + gapsize
                         )
                         )
                         geom = self.subtract_poly_from_geo(geom, points)
                         geom = self.subtract_poly_from_geo(geom, points)
+                        r_temp_geo.append(
+                            self.intersect_geo(initial_geo, box(points[0], points[1], points[2], points[3]))
+                        )
+
                         points = (
                         points = (
                             px - gapsize - lenx / 4,
                             px - gapsize - lenx / 4,
                             yymin - gapsize,
                             yymin - gapsize,
@@ -353,6 +368,9 @@ class CutOut(AppTool):
                             yymax + gapsize
                             yymax + gapsize
                         )
                         )
                         geom = self.subtract_poly_from_geo(geom, points)
                         geom = self.subtract_poly_from_geo(geom, points)
+                        r_temp_geo.append(
+                            self.intersect_geo(initial_geo, box(points[0], points[1], points[2], points[3]))
+                        )
 
 
                     if gaps == '4' or gaps == 'LR':
                     if gaps == '4' or gaps == 'LR':
                         points = (
                         points = (
@@ -362,6 +380,9 @@ class CutOut(AppTool):
                             py + gapsize
                             py + gapsize
                         )
                         )
                         geom = self.subtract_poly_from_geo(geom, points)
                         geom = self.subtract_poly_from_geo(geom, points)
+                        r_temp_geo.append(
+                            self.intersect_geo(initial_geo, box(points[0], points[1], points[2], points[3]))
+                        )
 
 
                     if gaps == '4' or gaps == 'TB':
                     if gaps == '4' or gaps == 'TB':
                         points = (
                         points = (
@@ -371,6 +392,9 @@ class CutOut(AppTool):
                             yymax + gapsize
                             yymax + gapsize
                         )
                         )
                         geom = self.subtract_poly_from_geo(geom, points)
                         geom = self.subtract_poly_from_geo(geom, points)
+                        r_temp_geo.append(
+                            self.intersect_geo(initial_geo, box(points[0], points[1], points[2], points[3]))
+                        )
 
 
                 try:
                 try:
                     for g in geom:
                     for g in geom:
@@ -380,7 +404,12 @@ class CutOut(AppTool):
                     if geom and not geom.is_empty:
                     if geom and not geom.is_empty:
                         proc_geometry.append(geom)
                         proc_geometry.append(geom)
 
 
-                return proc_geometry
+                r_temp_geo = CutOut.flatten(r_temp_geo)
+                for g in r_temp_geo:
+                    if g and not g.is_empty:
+                        rest_geometry.append(g)
+
+                return proc_geometry, rest_geometry
 
 
             if kind == 'single':
             if kind == 'single':
                 object_geo = unary_union(object_geo)
                 object_geo = unary_union(object_geo)
@@ -399,9 +428,9 @@ class CutOut(AppTool):
                 else:
                 else:
                     geo = object_geo
                     geo = object_geo
 
 
-                solid_geo = cutout_handler(geom=geo)
+                solid_geo, rest_geo = cutout_handler(geom=geo)
                 if self.ui.thin_cb.get_value():
                 if self.ui.thin_cb.get_value():
-                    gaps_solid_geo = self.subtract_geo(geo, solid_geo)
+                    gaps_solid_geo = rest_geo
             else:
             else:
                 try:
                 try:
                     __ = iter(object_geo)
                     __ = iter(object_geo)
@@ -416,13 +445,10 @@ class CutOut(AppTool):
                             geom_struct_buff = geom_struct.buffer(-margin + abs(dia / 2))
                             geom_struct_buff = geom_struct.buffer(-margin + abs(dia / 2))
                             geom_struct = geom_struct_buff.interiors
                             geom_struct = geom_struct_buff.interiors
 
 
-                    c_geo = cutout_handler(geom=geom_struct)
+                    c_geo, r_geo = cutout_handler(geom=geom_struct)
                     solid_geo += c_geo
                     solid_geo += c_geo
                     if self.ui.thin_cb.get_value():
                     if self.ui.thin_cb.get_value():
-                        try:
-                            gaps_solid_geo += self.subtract_geo(geom_struct, c_geo)
-                        except TypeError:
-                            gaps_solid_geo.append(self.subtract_geo(geom_struct, c_geo))
+                        gaps_solid_geo += r_geo
 
 
             if not solid_geo:
             if not solid_geo:
                 app_obj.inform.emit('[ERROR_NOTCL] %s' % _("Failed."))
                 app_obj.inform.emit('[ERROR_NOTCL] %s' % _("Failed."))
@@ -1230,13 +1256,13 @@ class CutOut(AppTool):
         flat_geo = []
         flat_geo = []
         try:
         try:
             for geo in geometry:
             for geo in geometry:
-                if geo and not geo.is_empty:
+                if geo:
                     flat_geo += CutOut.flatten(geometry=geo)
                     flat_geo += CutOut.flatten(geometry=geo)
         except TypeError:
         except TypeError:
-            if isinstance(geometry, Polygon):
+            if isinstance(geometry, Polygon) and not geometry.is_empty:
                 flat_geo.append(geometry.exterior)
                 flat_geo.append(geometry.exterior)
                 CutOut.flatten(geometry=geometry.interiors)
                 CutOut.flatten(geometry=geometry.interiors)
-            else:
+            elif not geometry.is_empty:
                 flat_geo.append(geometry)
                 flat_geo.append(geometry)
 
 
         return flat_geo
         return flat_geo
@@ -1302,6 +1328,30 @@ class CutOut(AppTool):
 
 
         return unary_union(diffs)
         return unary_union(diffs)
 
 
+    @staticmethod
+    def intersect_geo(target_geo, second_geo):
+        """
+
+        :param target_geo:
+        :type target_geo:
+        :param second_geo:
+        :type second_geo:
+        :return:
+        :rtype:
+        """
+
+        results = []
+        try:
+            __ = iter(target_geo)
+        except TypeError:
+            target_geo = [target_geo]
+
+        for geo in target_geo:
+            if second_geo.intersects(geo):
+                results.append(second_geo.intersection(geo))
+
+        return  CutOut.flatten(results)
+
     def reset_fields(self):
     def reset_fields(self):
         self.ui.obj_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex()))
         self.ui.obj_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex()))