- added a method to gracefully exit from threaded tasks and implemented it for the NCC Tool and for the Paint Tool
- modified the on_about() function to reflect the reality in 2019 - FlatCAM it is an Open Source contributed software
This commit is contained in:
@@ -1429,6 +1429,9 @@ class NonCopperClear(FlatCAMTool, Gerber):
|
||||
|
||||
geo_buff_list = []
|
||||
for poly in geo_n:
|
||||
if self.app.abort_flag:
|
||||
# graceful abort requested by the user
|
||||
raise FlatCAMApp.GracefulException
|
||||
geo_buff_list.append(poly.buffer(distance=ncc_margin, join_style=base.JOIN_STYLE.mitre))
|
||||
|
||||
bounding_box = cascaded_union(geo_buff_list)
|
||||
@@ -1444,6 +1447,9 @@ class NonCopperClear(FlatCAMTool, Gerber):
|
||||
|
||||
geo_buff_list = []
|
||||
for poly in geo_n:
|
||||
if self.app.abort_flag:
|
||||
# graceful abort requested by the user
|
||||
raise FlatCAMApp.GracefulException
|
||||
geo_buff_list.append(poly.buffer(distance=ncc_margin, join_style=base.JOIN_STYLE.mitre))
|
||||
|
||||
bounding_box = cascaded_union(geo_buff_list)
|
||||
@@ -1537,6 +1543,10 @@ class NonCopperClear(FlatCAMTool, Gerber):
|
||||
else:
|
||||
try:
|
||||
for geo_elem in isolated_geo:
|
||||
if self.app.abort_flag:
|
||||
# graceful abort requested by the user
|
||||
raise FlatCAMApp.GracefulException
|
||||
|
||||
if isinstance(geo_elem, Polygon):
|
||||
for ring in self.poly2rings(geo_elem):
|
||||
new_geo = ring.intersection(bounding_box)
|
||||
@@ -1627,6 +1637,10 @@ class NonCopperClear(FlatCAMTool, Gerber):
|
||||
cp = None
|
||||
for tool in sorted_tools:
|
||||
log.debug("Starting geometry processing for tool: %s" % str(tool))
|
||||
if self.app.abort_flag:
|
||||
# graceful abort requested by the user
|
||||
raise FlatCAMApp.GracefulException
|
||||
|
||||
app_obj.inform.emit(
|
||||
'[success] %s %s%s %s' % (_('NCC Tool clearing with tool diameter = '),
|
||||
str(tool),
|
||||
@@ -1661,6 +1675,9 @@ class NonCopperClear(FlatCAMTool, Gerber):
|
||||
if len(area.geoms) > 0:
|
||||
pol_nr = 0
|
||||
for p in area.geoms:
|
||||
if self.app.abort_flag:
|
||||
# graceful abort requested by the user
|
||||
raise FlatCAMApp.GracefulException
|
||||
if p is not None:
|
||||
try:
|
||||
if isinstance(p, Polygon):
|
||||
@@ -1836,6 +1853,10 @@ class NonCopperClear(FlatCAMTool, Gerber):
|
||||
else:
|
||||
try:
|
||||
for geo_elem in isolated_geo:
|
||||
if self.app.abort_flag:
|
||||
# graceful abort requested by the user
|
||||
raise FlatCAMApp.GracefulException
|
||||
|
||||
if isinstance(geo_elem, Polygon):
|
||||
for ring in self.poly2rings(geo_elem):
|
||||
new_geo = ring.intersection(bounding_box)
|
||||
@@ -1858,21 +1879,24 @@ class NonCopperClear(FlatCAMTool, Gerber):
|
||||
if new_geo and not new_geo.is_empty:
|
||||
new_geometry.append(new_geo)
|
||||
except TypeError:
|
||||
if isinstance(isolated_geo, Polygon):
|
||||
for ring in self.poly2rings(isolated_geo):
|
||||
new_geo = ring.intersection(bounding_box)
|
||||
if new_geo:
|
||||
if not new_geo.is_empty:
|
||||
new_geometry.append(new_geo)
|
||||
elif isinstance(isolated_geo, LineString):
|
||||
new_geo = isolated_geo.intersection(bounding_box)
|
||||
if new_geo and not new_geo.is_empty:
|
||||
new_geometry.append(new_geo)
|
||||
elif isinstance(isolated_geo, MultiLineString):
|
||||
for line_elem in isolated_geo:
|
||||
new_geo = line_elem.intersection(bounding_box)
|
||||
try:
|
||||
if isinstance(isolated_geo, Polygon):
|
||||
for ring in self.poly2rings(isolated_geo):
|
||||
new_geo = ring.intersection(bounding_box)
|
||||
if new_geo:
|
||||
if not new_geo.is_empty:
|
||||
new_geometry.append(new_geo)
|
||||
elif isinstance(isolated_geo, LineString):
|
||||
new_geo = isolated_geo.intersection(bounding_box)
|
||||
if new_geo and not new_geo.is_empty:
|
||||
new_geometry.append(new_geo)
|
||||
elif isinstance(isolated_geo, MultiLineString):
|
||||
for line_elem in isolated_geo:
|
||||
new_geo = line_elem.intersection(bounding_box)
|
||||
if new_geo and not new_geo.is_empty:
|
||||
new_geometry.append(new_geo)
|
||||
except Exception as e:
|
||||
pass
|
||||
|
||||
# a MultiLineString geometry element will show that the isolation is broken for this tool
|
||||
for geo_e in new_geometry:
|
||||
@@ -1919,6 +1943,10 @@ class NonCopperClear(FlatCAMTool, Gerber):
|
||||
_("Could not get the extent of the area to be non copper cleared."))
|
||||
return 'fail'
|
||||
|
||||
if self.app.abort_flag:
|
||||
# graceful abort requested by the user
|
||||
raise FlatCAMApp.GracefulException
|
||||
|
||||
if type(empty) is Polygon:
|
||||
empty = MultiPolygon([empty])
|
||||
|
||||
@@ -1929,6 +1957,10 @@ class NonCopperClear(FlatCAMTool, Gerber):
|
||||
|
||||
# Generate area for each tool
|
||||
while sorted_tools:
|
||||
if self.app.abort_flag:
|
||||
# graceful abort requested by the user
|
||||
raise FlatCAMApp.GracefulException
|
||||
|
||||
tool = sorted_tools.pop(0)
|
||||
log.debug("Starting geometry processing for tool: %s" % str(tool))
|
||||
|
||||
@@ -1945,6 +1977,9 @@ class NonCopperClear(FlatCAMTool, Gerber):
|
||||
|
||||
# Area to clear
|
||||
for poly in cleared_by_last_tool:
|
||||
if self.app.abort_flag:
|
||||
# graceful abort requested by the user
|
||||
raise FlatCAMApp.GracefulException
|
||||
try:
|
||||
area = area.difference(poly)
|
||||
except Exception as e:
|
||||
@@ -1973,6 +2008,10 @@ class NonCopperClear(FlatCAMTool, Gerber):
|
||||
if len(area.geoms) > 0:
|
||||
pol_nr = 0
|
||||
for p in area.geoms:
|
||||
if self.app.abort_flag:
|
||||
# graceful abort requested by the user
|
||||
raise FlatCAMApp.GracefulException
|
||||
|
||||
if p is not None:
|
||||
if isinstance(p, Polygon):
|
||||
try:
|
||||
@@ -2029,6 +2068,10 @@ class NonCopperClear(FlatCAMTool, Gerber):
|
||||
old_disp_number = disp_number
|
||||
# log.debug("Polygons cleared: %d. Percentage done: %d%%" % (pol_nr, disp_number))
|
||||
|
||||
if self.app.abort_flag:
|
||||
# graceful abort requested by the user
|
||||
raise FlatCAMApp.GracefulException
|
||||
|
||||
# check if there is a geometry at all in the cleared geometry
|
||||
if cleared_geo:
|
||||
# Overall cleared area
|
||||
@@ -2039,10 +2082,14 @@ class NonCopperClear(FlatCAMTool, Gerber):
|
||||
|
||||
# here we store the poly's already processed in the original geometry by the current tool
|
||||
# into cleared_by_last_tool list
|
||||
# this will be sustracted from the original geometry_to_be_cleared and make data for
|
||||
# this will be sutracted from the original geometry_to_be_cleared and make data for
|
||||
# the next tool
|
||||
buffer_value = tool_used / 2
|
||||
for p in cleared_area:
|
||||
if self.app.abort_flag:
|
||||
# graceful abort requested by the user
|
||||
raise FlatCAMApp.GracefulException
|
||||
|
||||
poly = p.buffer(buffer_value)
|
||||
cleared_by_last_tool.append(poly)
|
||||
|
||||
@@ -2091,6 +2138,9 @@ class NonCopperClear(FlatCAMTool, Gerber):
|
||||
app_obj.new_object("geometry", name, gen_clear_area_rest)
|
||||
else:
|
||||
app_obj.new_object("geometry", name, gen_clear_area)
|
||||
except FlatCAMApp.GracefulException:
|
||||
proc.done()
|
||||
return
|
||||
except Exception as e:
|
||||
proc.done()
|
||||
traceback.print_stack()
|
||||
|
||||
@@ -1254,32 +1254,38 @@ class ToolPaint(FlatCAMTool, Gerber):
|
||||
pass
|
||||
|
||||
def paint_p(polyg, tooldia):
|
||||
if paint_method == "seed":
|
||||
# Type(cp) == FlatCAMRTreeStorage | None
|
||||
cpoly = self.clear_polygon2(polyg,
|
||||
tooldia=tooldia,
|
||||
steps_per_circle=self.app.defaults["geometry_circle_steps"],
|
||||
overlap=over,
|
||||
contour=cont,
|
||||
connect=conn)
|
||||
cpoly = None
|
||||
try:
|
||||
if paint_method == "seed":
|
||||
# Type(cp) == FlatCAMRTreeStorage | None
|
||||
cpoly = self.clear_polygon2(polyg,
|
||||
tooldia=tooldia,
|
||||
steps_per_circle=self.app.defaults["geometry_circle_steps"],
|
||||
overlap=over,
|
||||
contour=cont,
|
||||
connect=conn)
|
||||
|
||||
elif paint_method == "lines":
|
||||
# Type(cp) == FlatCAMRTreeStorage | None
|
||||
cpoly = self.clear_polygon3(polyg,
|
||||
tooldia=tooldia,
|
||||
steps_per_circle=self.app.defaults["geometry_circle_steps"],
|
||||
overlap=over,
|
||||
contour=cont,
|
||||
connect=conn)
|
||||
elif paint_method == "lines":
|
||||
# Type(cp) == FlatCAMRTreeStorage | None
|
||||
cpoly = self.clear_polygon3(polyg,
|
||||
tooldia=tooldia,
|
||||
steps_per_circle=self.app.defaults["geometry_circle_steps"],
|
||||
overlap=over,
|
||||
contour=cont,
|
||||
connect=conn)
|
||||
|
||||
else:
|
||||
# Type(cp) == FlatCAMRTreeStorage | None
|
||||
cpoly = self.clear_polygon(polyg,
|
||||
tooldia=tooldia,
|
||||
steps_per_circle=self.app.defaults["geometry_circle_steps"],
|
||||
overlap=over,
|
||||
contour=cont,
|
||||
connect=conn)
|
||||
else:
|
||||
# Type(cp) == FlatCAMRTreeStorage | None
|
||||
cpoly = self.clear_polygon(polyg,
|
||||
tooldia=tooldia,
|
||||
steps_per_circle=self.app.defaults["geometry_circle_steps"],
|
||||
overlap=over,
|
||||
contour=cont,
|
||||
connect=conn)
|
||||
except FlatCAMApp.GracefulException:
|
||||
return "fail"
|
||||
except Exception as e:
|
||||
log.debug("ToolPaint.paint_poly().gen_paintarea().paint_p() --> %s" % str(e))
|
||||
|
||||
if cpoly is not None:
|
||||
geo_obj.solid_geometry += list(cpoly.get_objects())
|
||||
@@ -1326,13 +1332,15 @@ class ToolPaint(FlatCAMTool, Gerber):
|
||||
total_geometry += list(x.get_objects())
|
||||
else:
|
||||
total_geometry = list(cp.get_objects())
|
||||
except FlatCAMApp.GracefulException:
|
||||
return "fail"
|
||||
except Exception as e:
|
||||
log.debug("Could not Paint the polygons. %s" % str(e))
|
||||
self.app.inform.emit('[ERROR] %s\n%s' %
|
||||
(_("Could not do Paint. Try a different combination of parameters. "
|
||||
"Or a different strategy of paint"),
|
||||
str(e)))
|
||||
return
|
||||
return "fail"
|
||||
|
||||
# add the solid_geometry to the current too in self.paint_tools (tools_storage)
|
||||
# dictionary and then reset the temporary list that stored that solid_geometry
|
||||
@@ -1391,6 +1399,9 @@ class ToolPaint(FlatCAMTool, Gerber):
|
||||
def job_thread(app_obj):
|
||||
try:
|
||||
app_obj.new_object("geometry", name, gen_paintarea)
|
||||
except FlatCAMApp.GracefulException:
|
||||
proc.done()
|
||||
return
|
||||
except Exception as e:
|
||||
proc.done()
|
||||
self.app.inform.emit('[ERROR_NOTCL] %s --> %s' %
|
||||
@@ -1498,6 +1509,9 @@ class ToolPaint(FlatCAMTool, Gerber):
|
||||
:param geometry: Shapely type or list or list of list of such.
|
||||
:param reset: Clears the contents of self.flat_geometry.
|
||||
"""
|
||||
if self.app.abort_flag:
|
||||
# graceful abort requested by the user
|
||||
raise FlatCAMApp.GracefulException
|
||||
|
||||
if geometry is None:
|
||||
return
|
||||
@@ -1611,13 +1625,15 @@ class ToolPaint(FlatCAMTool, Gerber):
|
||||
|
||||
if cp is not None:
|
||||
total_geometry += list(cp.get_objects())
|
||||
except FlatCAMApp.GracefulException:
|
||||
return "fail"
|
||||
except Exception as e:
|
||||
log.debug("Could not Paint the polygons. %s" % str(e))
|
||||
self.app.inform.emit('[ERROR] %s\n%s' %
|
||||
(_("Could not do Paint All. Try a different combination of parameters. "
|
||||
"Or a different Method of paint"),
|
||||
str(e)))
|
||||
return
|
||||
return "fail"
|
||||
|
||||
pol_nr += 1
|
||||
disp_number = int(np.interp(pol_nr, [0, geo_len], [0, 99]))
|
||||
@@ -1741,14 +1757,15 @@ class ToolPaint(FlatCAMTool, Gerber):
|
||||
|
||||
if cp is not None:
|
||||
cleared_geo += list(cp.get_objects())
|
||||
|
||||
except FlatCAMApp.GracefulException:
|
||||
return "fail"
|
||||
except Exception as e:
|
||||
log.debug("Could not Paint the polygons. %s" % str(e))
|
||||
self.app.inform.emit('[ERROR] %s\n%s' %
|
||||
(_("Could not do Paint All. Try a different combination of parameters. "
|
||||
"Or a different Method of paint"),
|
||||
str(e)))
|
||||
return
|
||||
return "fail"
|
||||
|
||||
pol_nr += 1
|
||||
disp_number = int(np.interp(pol_nr, [0, geo_len], [0, 99]))
|
||||
@@ -1803,6 +1820,9 @@ class ToolPaint(FlatCAMTool, Gerber):
|
||||
app_obj.new_object("geometry", name, gen_paintarea_rest_machining)
|
||||
else:
|
||||
app_obj.new_object("geometry", name, gen_paintarea)
|
||||
except FlatCAMApp.GracefulException:
|
||||
proc.done()
|
||||
return
|
||||
except Exception as e:
|
||||
proc.done()
|
||||
traceback.print_stack()
|
||||
@@ -1896,6 +1916,9 @@ class ToolPaint(FlatCAMTool, Gerber):
|
||||
:param geometry: Shapely type or list or list of list of such.
|
||||
:param reset: Clears the contents of self.flat_geometry.
|
||||
"""
|
||||
if self.app.abort_flag:
|
||||
# graceful abort requested by the user
|
||||
raise FlatCAMApp.GracefulException
|
||||
|
||||
if geometry is None:
|
||||
return
|
||||
@@ -1991,6 +2014,7 @@ class ToolPaint(FlatCAMTool, Gerber):
|
||||
continue
|
||||
poly_buf = geo.buffer(-paint_margin)
|
||||
|
||||
cp = None
|
||||
if paint_method == "seed":
|
||||
# Type(cp) == FlatCAMRTreeStorage | None
|
||||
cp = self.clear_polygon2(poly_buf,
|
||||
@@ -2020,6 +2044,8 @@ class ToolPaint(FlatCAMTool, Gerber):
|
||||
|
||||
if cp is not None:
|
||||
total_geometry += list(cp.get_objects())
|
||||
except FlatCAMApp.GracefulException:
|
||||
return "fail"
|
||||
except Exception as e:
|
||||
log.debug("Could not Paint the polygons. %s" % str(e))
|
||||
self.app.inform.emit('[ERROR] %s' %
|
||||
@@ -2149,7 +2175,8 @@ class ToolPaint(FlatCAMTool, Gerber):
|
||||
|
||||
if cp is not None:
|
||||
cleared_geo += list(cp.get_objects())
|
||||
|
||||
except FlatCAMApp.GracefulException:
|
||||
return "fail"
|
||||
except Exception as e:
|
||||
log.debug("Could not Paint the polygons. %s" % str(e))
|
||||
self.app.inform.emit('[ERROR] %s' %
|
||||
@@ -2210,6 +2237,9 @@ class ToolPaint(FlatCAMTool, Gerber):
|
||||
app_obj.new_object("geometry", name, gen_paintarea_rest_machining)
|
||||
else:
|
||||
app_obj.new_object("geometry", name, gen_paintarea)
|
||||
except FlatCAMApp.GracefulException:
|
||||
proc.done()
|
||||
return
|
||||
except Exception as e:
|
||||
proc.done()
|
||||
traceback.print_stack()
|
||||
|
||||
Reference in New Issue
Block a user