From f54568e9eb6e4678ebe574a93a368ec9dbd7d72c Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Thu, 19 Sep 2019 16:54:22 +0300 Subject: [PATCH] - fixed bug in Gerber editor that did not allow to display all shapes after it encouterd one shape without 'solid' geometry --- README.md | 1 + flatcamEditors/FlatCAMGrbEditor.py | 30 +++++++++++++++++++++--------- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index ee4e3f12..1fb782d1 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ CAD program, and create G-Code for Isolation routing. - FlatCAM can be run in HEADLESS mode now. This mode can be selected by using the --headless=1 command line argument or by changing the line headless=False to True in config/configuration.txt file. In this mod the Sys Tray Icon menu will hold only the Run Scrip menu entry and Exit entry. - added a new TclCommand named quit_flatcam which will ... quit FlatCAM from Tcl Shell or from a script - fixed the command line argument --shellvar to work when there are spaces in the argument value +- fixed bug in Gerber editor that did not allow to display all shapes after it encouterd one shape without 'solid' geometry 18.09.2019 diff --git a/flatcamEditors/FlatCAMGrbEditor.py b/flatcamEditors/FlatCAMGrbEditor.py index 4b3efa48..f7601ddd 100644 --- a/flatcamEditors/FlatCAMGrbEditor.py +++ b/flatcamEditors/FlatCAMGrbEditor.py @@ -3702,6 +3702,7 @@ class FlatCAMGrbEditor(QtCore.QObject): # list of clear geos that are to be applied to the entire file global_clear_geo = [] + # create one big geometry made out of all 'negative' (clear) polygons for apid in self.gerber_obj.apertures: # first check if we have any clear_geometry (LPC) and if yes added it to the global_clear_geo if 'geometry' in self.gerber_obj.apertures[apid]: @@ -3710,8 +3711,19 @@ class FlatCAMGrbEditor(QtCore.QObject): global_clear_geo.append(elem['clear']) log.warning("Found %d clear polygons." % len(global_clear_geo)) + global_clear_geo = MultiPolygon(global_clear_geo) + if isinstance(global_clear_geo, Polygon): + global_clear_geo = list(global_clear_geo) + + # for debugging + # for geo in global_clear_geo: + # self.shapes.add(shape=geo, color='black', face_color='#000000'+'AF', layer=0, tolerance=self.tolerance) + # self.shapes.redraw() + + # we subtract the big "negative" (clear) geometry from each solid polygon but only the part of clear geometry + # that fits inside the solid. otherwise we may loose the solid for apid in self.gerber_obj.apertures: - temp_elem = [] + temp_solid_geometry= [] if 'geometry' in self.gerber_obj.apertures[apid]: # for elem in self.gerber_obj.apertures[apid]['geometry']: # if 'solid' in elem: @@ -3744,6 +3756,7 @@ class FlatCAMGrbEditor(QtCore.QObject): new_elem = dict() if 'solid' in elem: solid_geo = elem['solid'] + for clear_geo in global_clear_geo: # Make sure that the clear_geo is within the solid_geo otherwise we loose # the solid_geometry. We want for clear_geometry just to cut into solid_geometry not to @@ -3756,9 +3769,9 @@ class FlatCAMGrbEditor(QtCore.QObject): new_elem['clear'] = elem['clear'] if 'follow' in elem: new_elem['follow'] = elem['follow'] - temp_elem.append(deepcopy(new_elem)) + temp_solid_geometry.append(deepcopy(new_elem)) - self.gerber_obj.apertures[apid]['geometry'] = deepcopy(temp_elem) + self.gerber_obj.apertures[apid]['geometry'] = deepcopy(temp_solid_geometry) log.warning("Polygon difference done for %d apertures." % len(self.gerber_obj.apertures)) # and then add it to the storage elements (each storage elements is a member of a list @@ -3780,6 +3793,7 @@ class FlatCAMGrbEditor(QtCore.QObject): self.storage_dict[aperture_id][k] = self.gerber_obj.apertures[aperture_id][k] except Exception as e: log.debug("FlatCAMGrbEditor.edit_fcgerber().job_thread() --> %s" % str(e)) + # Check promises and clear if exists while True: try: @@ -3788,6 +3802,8 @@ class FlatCAMGrbEditor(QtCore.QObject): except ValueError: break + # we create a job work each aperture, job that work in a threaded way to store the geometry in local storage + # as DrawToolShapes for ap_id in self.gerber_obj.apertures: self.grb_plot_promises.append(ap_id) self.app.worker_task.emit({'fcn': job_thread, 'params': [ap_id]}) @@ -4419,12 +4435,11 @@ class FlatCAMGrbEditor(QtCore.QObject): :rtype: None """ with self.app.proc_container.new("Plotting"): - self.shapes.clear(update=True) for storage in self.storage_dict: - try: - for elem in self.storage_dict[storage]['geometry']: + for elem in self.storage_dict[storage]['geometry']: + if 'solid' in elem.geo: geometric_data = elem.geo['solid'] if geometric_data is None: continue @@ -4433,12 +4448,9 @@ class FlatCAMGrbEditor(QtCore.QObject): self.plot_shape(geometry=geometric_data, color=self.app.defaults['global_sel_draw_color'], linewidth=2) - else: self.plot_shape(geometry=geometric_data, color=self.app.defaults['global_draw_color']) - except KeyError: - pass if self.utility: for elem in self.utility: