From f658e052401357e5f9ae41348c5d57d06c5fe29d Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Tue, 10 Sep 2019 15:08:42 +0300 Subject: [PATCH] - added progress and possibility of graceful exit in Panel Tool - added graceful exit possibility when creating Isolation --- README.md | 2 + camlib.py | 4 + flatcamTools/ToolPanelize.py | 201 +++++++++++++++++++++++++++++++---- 3 files changed, 186 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index d43ccfef..7a05a45e 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,8 @@ CAD program, and create G-Code for Isolation routing. - made changing the Plot kind in CNCJob selected tab, threaded - fixed an object used before declaring it in NCC Tool - Area option - added progress for the generation of Isolation geometry +- added progress and possibility of graceful exit in Panel Tool +- added graceful exit possibility when creating Isolation 9.09.2019 diff --git a/camlib.py b/camlib.py index 47ed7182..3ee37310 100644 --- a/camlib.py +++ b/camlib.py @@ -578,6 +578,9 @@ class Geometry(object): # yet, it can be done by issuing an unary_union in the end, thus getting rid of the overlapping geo try: for pol in self.solid_geometry: + if self.app.abort_flag: + # graceful abort requested by the user + raise FlatCAMApp.GracefulException if corner is None: geo_iso.append(pol.buffer(offset, int(int(self.geo_steps_per_circle) / 4))) else: @@ -601,6 +604,7 @@ class Geometry(object): self.app.proc_container.update_view_text(' %s' % _("Buffering")) geo_iso = unary_union(geo_iso) + self.app.proc_container.update_view_text('') # end of replaced block if follow: return geo_iso diff --git a/flatcamTools/ToolPanelize.py b/flatcamTools/ToolPanelize.py index d0747ebb..9880184c 100644 --- a/flatcamTools/ToolPanelize.py +++ b/flatcamTools/ToolPanelize.py @@ -506,11 +506,24 @@ class Panelize(FlatCAMTool): except KeyError: log.warning("Failed to copy option. %s" % str(option)) + geo_len_drills = len(panel_obj.drills) if panel_obj.drills else 0 + geo_len_slots = len(panel_obj.slots) if panel_obj.slots else 0 + + element = 0 for row in range(rows): currentx = 0.0 for col in range(columns): + element += 1 + disp_number = 0 + old_disp_number = 0 + if panel_obj.drills: + drill_nr = 0 for tool_dict in panel_obj.drills: + if self.app.abort_flag: + # graceful abort requested by the user + raise FlatCAMApp.GracefulException + point_offseted = affinity.translate(tool_dict['point'], currentx, currenty) obj_fin.drills.append( { @@ -518,8 +531,24 @@ class Panelize(FlatCAMTool): "tool": tool_dict['tool'] } ) + + drill_nr += 1 + disp_number = int(np.interp(drill_nr, [0, geo_len_drills], [0, 100])) + + if disp_number > old_disp_number and disp_number <= 100: + self.app.proc_container.update_view_text(' %s: %d D:%d%%' % + (_("Copy"), + int(element), + disp_number)) + old_disp_number = disp_number + if panel_obj.slots: + slot_nr = 0 for tool_dict in panel_obj.slots: + if self.app.abort_flag: + # graceful abort requested by the user + raise FlatCAMApp.GracefulException + start_offseted = affinity.translate(tool_dict['start'], currentx, currenty) stop_offseted = affinity.translate(tool_dict['stop'], currentx, currenty) obj_fin.slots.append( @@ -529,12 +558,24 @@ class Panelize(FlatCAMTool): "tool": tool_dict['tool'] } ) + + slot_nr += 1 + disp_number = int(np.interp(slot_nr, [0, geo_len_slots], [0, 100])) + + if disp_number > old_disp_number and disp_number <= 100: + self.app.proc_container.update_view_text(' %s: %d S:%d%%' % + (_("Copy"), + int(element), + disp_number)) + old_disp_number = disp_number + currentx += lenghtx currenty += lenghty obj_fin.create_geometry() obj_fin.zeros = panel_obj.zeros obj_fin.units = panel_obj.units + self.app.proc_container.update_view_text('') def job_init_geometry(obj_fin, app_obj): currentx = 0.0 @@ -555,46 +596,153 @@ class Panelize(FlatCAMTool): obj_fin.solid_geometry = [] + # create the initial structure on which to create the panel if isinstance(panel_obj, FlatCAMGeometry): obj_fin.multigeo = panel_obj.multigeo obj_fin.tools = deepcopy(panel_obj.tools) if panel_obj.multigeo is True: for tool in panel_obj.tools: obj_fin.tools[tool]['solid_geometry'][:] = [] - - if isinstance(panel_obj, FlatCAMGerber): + elif isinstance(panel_obj, FlatCAMGerber): obj_fin.apertures = deepcopy(panel_obj.apertures) for ap in obj_fin.apertures: obj_fin.apertures[ap]['geometry'] = list() + # find the number of polygons in the source solid_geometry + geo_len = 0 + if isinstance(panel_obj, FlatCAMGeometry): + if panel_obj.multigeo is True: + for tool in panel_obj.tools: + try: + for pol in panel_obj.tools[tool]['solid_geometry']: + geo_len += 1 + except TypeError: + geo_len = 1 + else: + try: + for pol in panel_obj.solid_geometry: + geo_len += 1 + except TypeError: + geo_len = 1 + elif isinstance(panel_obj, FlatCAMGerber): + for ap in panel_obj.apertures: + for elem in panel_obj.apertures[ap]['geometry']: + geo_len += 1 + self.app.progress.emit(0) + element = 0 for row in range(rows): currentx = 0.0 for col in range(columns): + element += 1 + disp_number = 0 + old_disp_number = 0 + if isinstance(panel_obj, FlatCAMGeometry): if panel_obj.multigeo is True: for tool in panel_obj.tools: - geo = translate_recursion(panel_obj.tools[tool]['solid_geometry']) - if isinstance(geo, list): - obj_fin.tools[tool]['solid_geometry'] += geo - else: - obj_fin.tools[tool]['solid_geometry'].append(geo) + if self.app.abort_flag: + # graceful abort requested by the user + raise FlatCAMApp.GracefulException + + # geo = translate_recursion(panel_obj.tools[tool]['solid_geometry']) + # if isinstance(geo, list): + # obj_fin.tools[tool]['solid_geometry'] += geo + # else: + # obj_fin.tools[tool]['solid_geometry'].append(geo) + + # calculate the number of polygons + geo_len = len(panel_obj.tools[tool]['solid_geometry']) + pol_nr = 0 + for geo_el in panel_obj.tools[tool]['solid_geometry']: + trans_geo = translate_recursion(geo_el) + obj_fin.tools[tool]['solid_geometry'].append(trans_geo) + + pol_nr += 1 + disp_number = int(np.interp(pol_nr, [0, geo_len], [0, 100])) + + if disp_number > old_disp_number and disp_number <= 100: + self.app.proc_container.update_view_text(' %s: %d %d%%' % + (_("Copy"), + int(element), + disp_number)) + old_disp_number = disp_number else: - geo = translate_recursion(panel_obj.solid_geometry) - if isinstance(geo, list): - obj_fin.solid_geometry += geo - else: - obj_fin.solid_geometry.append(geo) + # geo = translate_recursion(panel_obj.solid_geometry) + # if isinstance(geo, list): + # obj_fin.solid_geometry += geo + # else: + # obj_fin.solid_geometry.append(geo) + if self.app.abort_flag: + # graceful abort requested by the user + raise FlatCAMApp.GracefulException + + try: + # calculate the number of polygons + geo_len = len(panel_obj.solid_geometry) + except TypeError: + geo_len = 1 + pol_nr = 0 + try: + for geo_el in panel_obj.solid_geometry: + if self.app.abort_flag: + # graceful abort requested by the user + raise FlatCAMApp.GracefulException + + trans_geo = translate_recursion(geo_el) + obj_fin.solid_geometry.append(trans_geo) + + pol_nr += 1 + disp_number = int(np.interp(pol_nr, [0, geo_len], [0, 100])) + + if disp_number > old_disp_number and disp_number <= 100: + self.app.proc_container.update_view_text(' %s: %d %d%%' % + (_("Copy"), + int(element), + disp_number)) + old_disp_number = disp_number + except TypeError: + trans_geo = translate_recursion(panel_obj.solid_geometry) + obj_fin.solid_geometry.append(trans_geo) else: - geo = translate_recursion(panel_obj.solid_geometry) - if isinstance(geo, list): - obj_fin.solid_geometry += geo - else: - obj_fin.solid_geometry.append(geo) + # geo = translate_recursion(panel_obj.solid_geometry) + # if isinstance(geo, list): + # obj_fin.solid_geometry += geo + # else: + # obj_fin.solid_geometry.append(geo) + if self.app.abort_flag: + # graceful abort requested by the user + raise FlatCAMApp.GracefulException + + try: + for geo_el in panel_obj.solid_geometry: + if self.app.abort_flag: + # graceful abort requested by the user + raise FlatCAMApp.GracefulException + + trans_geo = translate_recursion(geo_el) + obj_fin.solid_geometry.append(trans_geo) + except TypeError: + trans_geo = translate_recursion(panel_obj.solid_geometry) + obj_fin.solid_geometry.append(trans_geo) for apid in panel_obj.apertures: + if self.app.abort_flag: + # graceful abort requested by the user + raise FlatCAMApp.GracefulException + + try: + # calculate the number of polygons + geo_len = len(panel_obj.apertures[apid]['geometry']) + except TypeError: + geo_len = 1 + pol_nr = 0 for el in panel_obj.apertures[apid]['geometry']: + if self.app.abort_flag: + # graceful abort requested by the user + raise FlatCAMApp.GracefulException + new_el = dict() if 'solid' in el: geo_aper = translate_recursion(el['solid']) @@ -610,14 +758,25 @@ class Panelize(FlatCAMTool): obj_fin.apertures[apid]['geometry'].append(deepcopy(new_el)) + pol_nr += 1 + disp_number = int(np.interp(pol_nr, [0, geo_len], [0, 100])) + + if disp_number > old_disp_number and disp_number <= 100: + self.app.proc_container.update_view_text(' %s: %d %d%%' % + (_("Copy"), + int(element), + disp_number)) + old_disp_number = disp_number + currentx += lenghtx currenty += lenghty - app_obj.log.debug("Found %s geometries. Creating a panel geometry cascaded union ..." % - len(obj_fin.solid_geometry)) + # app_obj.log.debug("Found %s geometries. Creating a panel geometry cascaded union ..." % + # len(obj_fin.solid_geometry)) # obj_fin.solid_geometry = cascaded_union(obj_fin.solid_geometry) - app_obj.log.debug("Finished creating a cascaded union for the panel.") + # app_obj.log.debug("Finished creating a cascaded union for the panel.") + self.app.proc_container.update_view_text('') if isinstance(panel_obj, FlatCAMExcellon): self.app.progress.emit(50) @@ -635,7 +794,7 @@ class Panelize(FlatCAMTool): "Final panel has {col} columns and {row} rows").format( text='[WARNING] ', col=columns, row=rows)) - proc = self.app.proc_container.new(_("Generating panel...")) + proc = self.app.proc_container.new(_("Working...")) def job_thread(app_obj): try: