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

- improved the Isolation Tool - rest machining: test if the isolated polygon has interiors (holes) and if those can't be isolated too then mark the polygon as a rest geometry to be isolated with the next tool and so on

Marius Stanciu 5 лет назад
Родитель
Сommit
dc8a34bc16
2 измененных файлов с 34 добавлено и 1 удалено
  1. 4 0
      CHANGELOG.md
  2. 30 1
      appTools/ToolIsolation.py

+ 4 - 0
CHANGELOG.md

@@ -7,6 +7,10 @@ CHANGELOG for FlatCAM beta
 
 =================================================
 
+4.06.2020
+
+- improved the Isolation Tool - rest machining: test if the isolated polygon has interiors (holes) and if those can't be isolated too then mark the polygon as a rest geometry to be isolated with the next tool and so on
+
 3.06.2020
 
 - updated Transform Tool to have a selection of possible references for the transformations that are now selectable in the GUI

+ 30 - 1
appTools/ToolIsolation.py

@@ -2850,9 +2850,38 @@ class ToolIsolation(AppTool, Gerber):
                             intersect_flag = True
                             break
 
-                # if we had an intersection do nothing, else add the geo to the good pass isolations
+                # if we had an intersection do nothing, else add the geo to the good pass isolation's
                 if intersect_flag is False:
                     temp_geo = geo.buffer(iso_offset)
+                    # this test is done only for the first pass because this is where is relevant
+                    # test if in the first pass, the geo that is isolated has interiors and if it has then test if the
+                    # resulting isolated geometry (buffered) number of subgeo is the same as the exterior + interiors
+                    # if not it means that the geo interiors most likely could not be isolated with this tool so we
+                    # abandon the whole isolation for this geo and add this geo to the not_isolated_geo
+                    if nr_pass == 0:
+                        if geo.interiors:
+                            len_interiors = len(geo.interiors)
+                            if len_interiors > 1:
+                                total_poly_len = 1 + len_interiors  # one exterior + len_interiors of interiors
+
+                                if isinstance(temp_geo, Polygon):
+                                    # calculate the number of subgeos in the buffered geo
+                                    temp_geo_len = len([1] + list(temp_geo.interiors))    # one exterior + interiors
+                                    if total_poly_len != temp_geo_len:
+                                        # some interiors could not be isolated
+                                        break
+                                else:
+                                    try:
+                                        temp_geo_len = len(temp_geo)
+                                        if total_poly_len != temp_geo_len:
+                                            # some interiors could not be isolated
+                                            break
+                                    except TypeError:
+                                        # this means that the buffered geo (temp_geo) is not iterable
+                                        # (one geo element only) therefore failure:
+                                        # we have more interiors but the resulting geo is only one
+                                        break
+
                     good_pass_iso.append(temp_geo)
                     if prog_plot == 'progressive':
                         prog_plot_handler(temp_geo)