From 89426e8ac3c345ed9759de5aa4bb9e4530d0152b Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Mon, 27 Sep 2021 15:22:27 +0300 Subject: [PATCH] - in Gerber Object trying to solve the issue with too little details on plotting geometry with inch units --- CHANGELOG.md | 4 ++++ appEditors/AppGerberEditor.py | 14 +++++++++----- appObjects/FlatCAMGerber.py | 17 +++++++++++++---- appObjects/FlatCAMObj.py | 8 ++++++-- appParsers/ParseGerber.py | 24 ++++++++++++------------ 5 files changed, 44 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 698b8eb0..0e900b52 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ CHANGELOG for FlatCAM beta ================================================= +27.09.2021 + +- in Gerber Object trying to solve the issue with too little details on plotting geometry with inch units + 26.09.2021 - besides reporting the error into the log file now any application crash is reported also in a MessageBox after which the application will close diff --git a/appEditors/AppGerberEditor.py b/appEditors/AppGerberEditor.py index c3f61d88..8e79e2c3 100644 --- a/appEditors/AppGerberEditor.py +++ b/appEditors/AppGerberEditor.py @@ -1045,7 +1045,7 @@ class RegionEditorGrb(ShapeToolEditorGrb): y = data[1] if len(self.points) == 0: - new_geo_el['solid'] = Point((x, y)).buffer(self.buf_val, resolution=int(self.steps_per_circle / 4)) + new_geo_el['solid'] = Point((x, y)).buffer(self.buf_val, resolution=int(self.steps_per_circle)) return DrawToolUtilityShape(new_geo_el) elif len(self.points) == 1: @@ -1129,7 +1129,7 @@ class RegionEditorGrb(ShapeToolEditorGrb): if len(self.temp_points) > 1: try: geo_sol = LineString(self.temp_points) - geo_sol = geo_sol.buffer(self.buf_val, int(self.steps_per_circle / 4), join_style=1) + geo_sol = geo_sol.buffer(self.buf_val, int(self.steps_per_circle), join_style=1) new_geo_el = { 'solid': geo_sol } @@ -1137,7 +1137,7 @@ class RegionEditorGrb(ShapeToolEditorGrb): except Exception as e: log.error("AppGerberEditor.RegionEditorGrb.utility_geometry() --> %s" % str(e)) else: - geo_sol = Point(self.temp_points).buffer(self.buf_val, resolution=int(self.steps_per_circle / 4)) + geo_sol = Point(self.temp_points).buffer(self.buf_val, resolution=int(self.steps_per_circle)) new_geo_el = { 'solid': geo_sol } @@ -1225,7 +1225,7 @@ class RegionEditorGrb(ShapeToolEditorGrb): # create the geometry geo_line = LinearRing(self.temp_points) - geo_sol = geo_line.buffer(self.buf_val, int(self.steps_per_circle / 4), join_style=1) + geo_sol = geo_line.buffer(self.buf_val, int(self.steps_per_circle), join_style=1) new_geo_el = { 'solid': geo_sol, 'follow': geo_line @@ -1240,7 +1240,7 @@ class RegionEditorGrb(ShapeToolEditorGrb): if len(self.points) > 2: new_geo_el = { - 'solid': Polygon(self.points).buffer(self.buf_val, int(self.steps_per_circle / 4), join_style=2), + 'solid': Polygon(self.points).buffer(self.buf_val, int(self.steps_per_circle), join_style=2), 'follow': Polygon(self.points).exterior } @@ -4547,6 +4547,9 @@ class AppGerberEditor(QtCore.QObject): else: self.conversion_factor = 0.0393700787401575 + def_tol_val = float(self.app.defaults["global_tolerance"]) + self.tolerance = def_tol_val if self.units == 'MM' else def_tol_val / 25.4 + # Hide original geometry orig_grb_obj.visible = False @@ -5550,6 +5553,7 @@ class AppGerberEditor(QtCore.QObject): return if len(color) == 9: color = color[:7] + 'AF' + self.shapes.add(shape=geometry, color=color, face_color=color, layer=0, tolerance=self.tolerance) @property diff --git a/appObjects/FlatCAMGerber.py b/appObjects/FlatCAMGerber.py index 32a48bbf..5e7ac62f 100644 --- a/appObjects/FlatCAMGerber.py +++ b/appObjects/FlatCAMGerber.py @@ -942,10 +942,19 @@ class GerberObject(FlatCAMObj, Gerber): used_face_color = None plot_geometry = geometry.geoms if isinstance(geometry, (MultiPolygon, MultiLineString)) else geometry - for g in plot_geometry: - if isinstance(g, (Polygon, LineString, LinearRing)): - self.add_shape(shape=g, color=used_color, face_color=used_face_color, visible=visible) - + try: + for g in plot_geometry: + if isinstance(g, (Polygon, LineString)): + self.add_shape(shape=g, color=used_color, face_color=used_face_color, visible=visible) + elif isinstance(g, LinearRing): + g = LineString(g) + self.add_shape(shape=g, color=used_color, face_color=used_face_color, visible=visible) + except TypeError: + if isinstance(plot_geometry, (Polygon, LineString)): + self.add_shape(shape=plot_geometry, color=used_color, face_color=used_face_color, visible=visible) + elif isinstance(plot_geometry, LinearRing): + plot_geometry = LineString(plot_geometry) + self.add_shape(shape=plot_geometry, color=used_color, face_color=used_face_color, visible=visible) self.shapes.redraw( # update_colors=(self.fill_color, self.outline_color), # indexes=self.app.plotcanvas.shape_collection.data.keys() diff --git a/appObjects/FlatCAMObj.py b/appObjects/FlatCAMObj.py index f05e32bc..495b0e40 100644 --- a/appObjects/FlatCAMObj.py +++ b/appObjects/FlatCAMObj.py @@ -417,17 +417,21 @@ class FlatCAMObj(QtCore.QObject): return def add_shape(self, **kwargs): + tol = kwargs['tolerance'] if 'tolerance' in kwargs else self.drawing_tolerance + if self.deleted: raise ObjectDeleted() else: - key = self.shapes.add(tolerance=self.drawing_tolerance, **kwargs) + key = self.shapes.add(tolerance=tol, **kwargs) return key def add_mark_shape(self, **kwargs): + tol = kwargs['tolerance'] if 'tolerance' in kwargs else self.drawing_tolerance + if self.deleted: raise ObjectDeleted() else: - key = self.mark_shapes.add(tolerance=self.drawing_tolerance, layer=0, **kwargs) + key = self.mark_shapes.add(tolerance=tol, layer=0, **kwargs) return key def update_filters(self, last_ext, filter_string): diff --git a/appParsers/ParseGerber.py b/appParsers/ParseGerber.py index a36c6e68..a8136f98 100644 --- a/appParsers/ParseGerber.py +++ b/appParsers/ParseGerber.py @@ -508,7 +508,7 @@ class Gerber(Geometry): follow_buffer.append(geo_f) geo_dict['follow'] = geo_f - geo_s = LineString(path).buffer(width / 1.999, int(self.steps_per_circle / 4)) + geo_s = LineString(path).buffer(width / 1.999, int(self.steps_per_circle)) if self.app.defaults['gerber_simplification']: geo_s = geo_s.simplify(s_tol) if not geo_s.is_empty and geo_s.is_valid: @@ -789,7 +789,7 @@ class Gerber(Geometry): # --- Buffered ---- width = self.tools[last_path_aperture]["size"] - geo_s = LineString(path).buffer(width / 1.999, int(self.steps_per_circle / 4)) + geo_s = LineString(path).buffer(width / 1.999, int(self.steps_per_circle)) if self.app.defaults['gerber_simplification']: geo_s = geo_s.simplify(s_tol) if not geo_s.is_empty: @@ -829,7 +829,7 @@ class Gerber(Geometry): # --- Buffered ---- width = self.tools[last_path_aperture]["size"] - geo_s = LineString(path).buffer(width / 1.999, int(self.steps_per_circle / 4)) + geo_s = LineString(path).buffer(width / 1.999, int(self.steps_per_circle)) if not geo_s.is_valid: self.app.log.warning( "Found invalid Gerber geometry at line: %s. Fixing..." % str(line_num)) @@ -1228,7 +1228,7 @@ class Gerber(Geometry): self.app.log.warning("No aperture defined for curent path. (%d)" % line_num) # TODO: this may (should) fail width = self.tools[last_path_aperture]["size"] - geo_s = LineString(path).buffer(width / 1.999, int(self.steps_per_circle / 4)) + geo_s = LineString(path).buffer(width / 1.999, int(self.steps_per_circle)) try: if self.tools[last_path_aperture]["type"] != 'R': @@ -1297,7 +1297,7 @@ class Gerber(Geometry): # this treats the case when we are storing geometry as solids width = self.tools[last_path_aperture]["size"] - geo_s = LineString(path).buffer(width / 1.999, int(self.steps_per_circle / 4)) + geo_s = LineString(path).buffer(width / 1.999, int(self.steps_per_circle)) if not geo_s.is_empty: try: if self.tools[last_path_aperture]["type"] != 'R': @@ -1610,7 +1610,7 @@ class Gerber(Geometry): # this treats the case when we are storing geometry as solids width = self.tools[last_path_aperture]["size"] - geo_s = LineString(path).buffer(width / 1.999, int(self.steps_per_circle / 4)) + geo_s = LineString(path).buffer(width / 1.999, int(self.steps_per_circle)) if not geo_s.is_empty: if self.app.defaults['gerber_simplification']: geo_s = geo_s.simplify(s_tol) @@ -1671,7 +1671,7 @@ class Gerber(Geometry): else: self.app.log.debug("Union by union()...") new_poly = unary_union(poly_buffer) - new_poly = new_poly.buffer(0, int(self.steps_per_circle / 4)) + new_poly = new_poly.buffer(0, int(self.steps_per_circle)) self.app.log.warning("Union done.") if current_polarity == 'D': @@ -1749,7 +1749,7 @@ class Gerber(Geometry): location = Point(location) if aperture['type'] == 'C': # Circles - return location.buffer(aperture['size'] / 2, int(steps_per_circle / 4)) + return location.buffer(aperture['size'] / 2, int(steps_per_circle)) if aperture['type'] == 'R': # Rectangles loc = location.coords[0] @@ -1768,13 +1768,13 @@ class Gerber(Geometry): if width > height: p1 = Point(loc[0] + 0.5 * (width - height), loc[1]) p2 = Point(loc[0] - 0.5 * (width - height), loc[1]) - c1 = p1.buffer(height * 0.5, int(steps_per_circle / 4)) - c2 = p2.buffer(height * 0.5, int(steps_per_circle / 4)) + c1 = p1.buffer(height * 0.5, int(steps_per_circle)) + c2 = p2.buffer(height * 0.5, int(steps_per_circle)) else: p1 = Point(loc[0], loc[1] + 0.5 * (height - width)) p2 = Point(loc[0], loc[1] - 0.5 * (height - width)) - c1 = p1.buffer(width * 0.5, int(steps_per_circle / 4)) - c2 = p2.buffer(width * 0.5, int(steps_per_circle / 4)) + c1 = p1.buffer(width * 0.5, int(steps_per_circle)) + c2 = p2.buffer(width * 0.5, int(steps_per_circle)) return unary_union([c1, c2]).convex_hull if aperture['type'] == 'P': # Regular polygon