diff --git a/README.md b/README.md index 18973297..48c08f02 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,8 @@ CAD program, and create G-Code for Isolation routing. - in Paint Tool and NCC Tool fixed the RMB click detection when Area selection is used - finished the work on file extensions registration with FlatCAM. If the file extensions are deleted in the Preferences -> File Associations then those extensions are unregistered with FlatCAM - fixed bug in NCC Tools and in SolderPaste Tool if in Edit -> Preferences only one tool is entered +- fixed bug in camblib.clear_polygon3() which caused that some copper clearing / paintings were not complete (some polygons were not processed) when the Straight Lines method was used +- some changes in NCC Tools regarding of the clearing itself 2.09.2019 diff --git a/camlib.py b/camlib.py index 920ef251..922c3372 100644 --- a/camlib.py +++ b/camlib.py @@ -1027,9 +1027,15 @@ class Geometry(object): # Add margin (contour) to storage if contour: - geoms.insert(margin_poly.exterior) - for ints in margin_poly.interiors: - geoms.insert(ints) + if isinstance(margin_poly, Polygon): + geoms.insert(margin_poly.exterior) + for ints in margin_poly.interiors: + geoms.insert(ints) + elif isinstance(margin_poly, MultiPolygon): + for poly in margin_poly: + geoms.insert(poly.exterior) + for ints in poly.interiors: + geoms.insert(ints) # Optimization: Reduce lifts if connect: diff --git a/flatcamTools/ToolNonCopperClear.py b/flatcamTools/ToolNonCopperClear.py index ad0909d1..5259bac8 100644 --- a/flatcamTools/ToolNonCopperClear.py +++ b/flatcamTools/ToolNonCopperClear.py @@ -1601,6 +1601,7 @@ class NonCopperClear(FlatCAMTool, Gerber): if type(empty) is Polygon: empty = MultiPolygon([empty]) + cp = None for tool in sorted_tools: app_obj.inform.emit(_('[success] Non-Copper Clearing with ToolDia = %s started.') % str(tool)) cleared_geo[:] = [] @@ -1622,22 +1623,44 @@ class NonCopperClear(FlatCAMTool, Gerber): if area.geoms: if len(area.geoms) > 0: for p in area.geoms: - try: - if ncc_method == 'standard': - cp = self.clear_polygon(p, tool, self.app.defaults["gerber_circle_steps"], - overlap=overlap, contour=contour, connect=connect) - elif ncc_method == 'seed': - cp = self.clear_polygon2(p, tool, self.app.defaults["gerber_circle_steps"], - overlap=overlap, contour=contour, connect=connect) - else: - cp = self.clear_polygon3(p, tool, self.app.defaults["gerber_circle_steps"], - overlap=overlap, contour=contour, connect=connect) - if cp: - cleared_geo += list(cp.get_objects()) - except Exception as e: - log.warning("Polygon can not be cleared. %s" % str(e)) - app_obj.poly_not_cleared = True - continue + if p is not None: + try: + if isinstance(p, Polygon): + if ncc_method == 'standard': + cp = self.clear_polygon(p, tool, self.app.defaults["gerber_circle_steps"], + overlap=overlap, contour=contour, connect=connect) + elif ncc_method == 'seed': + cp = self.clear_polygon2(p, tool, self.app.defaults["gerber_circle_steps"], + overlap=overlap, contour=contour, connect=connect) + else: + cp = self.clear_polygon3(p, tool, self.app.defaults["gerber_circle_steps"], + overlap=overlap, contour=contour, connect=connect) + if cp: + cleared_geo += list(cp.get_objects()) + elif isinstance(p, MultiPolygon): + for pol in p: + if pol is not None: + if ncc_method == 'standard': + cp = self.clear_polygon(pol, tool, + self.app.defaults["gerber_circle_steps"], + overlap=overlap, contour=contour, + connect=connect) + elif ncc_method == 'seed': + cp = self.clear_polygon2(pol, tool, + self.app.defaults["gerber_circle_steps"], + overlap=overlap, contour=contour, + connect=connect) + else: + cp = self.clear_polygon3(pol, tool, + self.app.defaults["gerber_circle_steps"], + overlap=overlap, contour=contour, + connect=connect) + if cp: + cleared_geo += list(cp.get_objects()) + except Exception as e: + log.warning("Polygon can not be cleared. %s" % str(e)) + app_obj.poly_not_cleared = True + continue # check if there is a geometry at all in the cleared geometry if cleared_geo: @@ -1866,23 +1889,52 @@ class NonCopperClear(FlatCAMTool, Gerber): if area.geoms: if len(area.geoms) > 0: for p in area.geoms: - try: - if ncc_method == 'standard': - cp = self.clear_polygon(p, tool_used, self.app.defaults["gerber_circle_steps"], - overlap=overlap, contour=contour, connect=connect) - elif ncc_method == 'seed': - cp = self.clear_polygon2(p, tool_used, - self.app.defaults["gerber_circle_steps"], - overlap=overlap, contour=contour, connect=connect) - else: - cp = self.clear_polygon3(p, tool_used, - self.app.defaults["gerber_circle_steps"], - overlap=overlap, contour=contour, connect=connect) - cleared_geo.append(list(cp.get_objects())) - except: - log.warning("Polygon can't be cleared.") - # this polygon should be added to a list and then try clear it with a smaller tool - rest_geo.append(p) + if p is not None: + if isinstance(p, Polygon): + try: + if ncc_method == 'standard': + cp = self.clear_polygon(p, tool_used, + self.app.defaults["gerber_circle_steps"], + overlap=overlap, contour=contour, connect=connect) + elif ncc_method == 'seed': + cp = self.clear_polygon2(p, tool_used, + self.app.defaults["gerber_circle_steps"], + overlap=overlap, contour=contour, connect=connect) + else: + cp = self.clear_polygon3(p, tool_used, + self.app.defaults["gerber_circle_steps"], + overlap=overlap, contour=contour, connect=connect) + cleared_geo.append(list(cp.get_objects())) + except Exception as e: + log.warning("Polygon can't be cleared. %s" % str(e)) + # this polygon should be added to a list and then try clear it with + # a smaller tool + rest_geo.append(p) + elif isinstance(p, MultiPolygon): + for poly in p: + if poly is not None: + try: + if ncc_method == 'standard': + cp = self.clear_polygon(poly, tool_used, + self.app.defaults["gerber_circle_steps"], + overlap=overlap, contour=contour, + connect=connect) + elif ncc_method == 'seed': + cp = self.clear_polygon2(poly, tool_used, + self.app.defaults["gerber_circle_steps"], + overlap=overlap, contour=contour, + connect=connect) + else: + cp = self.clear_polygon3(poly, tool_used, + self.app.defaults["gerber_circle_steps"], + overlap=overlap, contour=contour, + connect=connect) + cleared_geo.append(list(cp.get_objects())) + except Exception as e: + log.warning("Polygon can't be cleared. %s" % str(e)) + # this polygon should be added to a list and then try clear it with + # a smaller tool + rest_geo.append(poly) # check if there is a geometry at all in the cleared geometry if cleared_geo: