From 2545da79b59d9188f06fac4bbae7e188e06fd7a5 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Tue, 24 Nov 2020 21:33:29 +0200 Subject: [PATCH] - fixed an issue for importing DXF as Geometry when the DXF geometry is a single line - updated the convert_any2geo() method such that resulting geometry objects have the tools attribute required in the newer versions of the app --- CHANGELOG.md | 5 ++ appObjects/AppObject.py | 3 +- appObjects/FlatCAMGeometry.py | 6 +- appParsers/ParseGerber.py | 2 +- app_Main.py | 136 +++++++++++++++++++++++----------- camlib.py | 8 +- 6 files changed, 111 insertions(+), 49 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b7de50c4..757e3080 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ CHANGELOG for FlatCAM beta ================================================= +24.11.2020 + +- fixed an issue for importing DXF as Geometry when the DXF geometry is a single line +- updated the convert_any2geo() method such that resulting geometry objects have the tools attribute required in the newer versions of the app + 21.11.2020 - Tool Copper Thieving - made sure that the clearance for pattern plating mask is applied also for positive values diff --git a/appObjects/AppObject.py b/appObjects/AppObject.py index f8aac322..67e8fb5d 100644 --- a/appObjects/AppObject.py +++ b/appObjects/AppObject.py @@ -142,12 +142,13 @@ class AppObject(QtCore.QObject): obj.options[option] = self.app.options[option] if kind == 'gerber': for option in self.app.options: - if option.find('tools_iso_') == 0: + if option.find('tools_iso_') == 0 or option.find('tools_mill_') == 0: obj.options[option] = self.app.options[option] if kind == 'geometry': for option in self.app.options: if option.find('tools_mill_') == 0: obj.options[option] = self.app.options[option] + # ############################################################################################################ # ############################################################################################################ diff --git a/appObjects/FlatCAMGeometry.py b/appObjects/FlatCAMGeometry.py index f532e6d0..edff56f1 100644 --- a/appObjects/FlatCAMGeometry.py +++ b/appObjects/FlatCAMGeometry.py @@ -524,9 +524,9 @@ class GeometryObject(FlatCAMObj, Geometry): if opt_key.find('geometry' + "_") == 0: oname = opt_key[len('geometry') + 1:] self.default_data[oname] = self.app.options[opt_key] - if opt_key.find('tools_mill' + "_") == 0: - oname = opt_key[len('tools_mill') + 1:] - self.default_data[oname] = self.app.options[opt_key] + elif opt_key.find('tools_') == 0: + self.default_data[opt_key] = self.app.options[opt_key] + # fill in self.default_data values from self.options for def_key in self.default_data: for opt_key, opt_val in self.options.items(): diff --git a/appParsers/ParseGerber.py b/appParsers/ParseGerber.py index 2720a5e7..d27c19e0 100644 --- a/appParsers/ParseGerber.py +++ b/appParsers/ParseGerber.py @@ -1878,7 +1878,7 @@ class Gerber(Geometry): def import_dxf_as_gerber(self, filename, units='MM'): """ - Imports shapes from an DXF file into the Gerberobject geometry. + Imports shapes from an DXF file into the Gerber object geometry. :param filename: Path to the DXF file. :type filename: str diff --git a/app_Main.py b/app_Main.py index 54a56cce..0bb51048 100644 --- a/app_Main.py +++ b/app_Main.py @@ -5441,51 +5441,98 @@ class App(QtCore.QObject): """ self.defaults.report_usage("convert_any2geo()") - def initialize(obj_init, app): - obj_init.solid_geometry = obj.solid_geometry + # store here the default data for Geometry Data + default_data = {} + + for opt_key, opt_val in self.options.items(): + if opt_key.find('geometry' + "_") == 0: + oname = opt_key[len('geometry') + 1:] + default_data[oname] = self.options[opt_key] + if opt_key.find('tools_mill' + "_") == 0: + oname = opt_key[len('tools_mill') + 1:] + default_data[oname] = self.options[opt_key] + if opt_key.find('tools_ncc' + "_") == 0: + oname = opt_key[len('tools_ncc') + 1:] + default_data[oname] = self.options[opt_key] + if opt_key.find('tools_paint' + "_") == 0: + oname = opt_key[len('tools_paint') + 1:] + default_data[oname] = self.options[opt_key] + if opt_key.find('tools_cutout' + "_") == 0: + oname = opt_key[len('tools_cutout') + 1:] + default_data[oname] = self.options[opt_key] + + if type(self.defaults["geometry_cnctooldia"]) == float: + tools_diameters = [self.defaults["geometry_cnctooldia"]] + else: try: - obj_init.follow_geometry = obj.follow_geometry - except AttributeError: - pass + dias = str(self.defaults["geometry_cnctooldia"]).strip('[').strip(']') + tools_string = dias.split(",") + tools_diameters = [eval(a) for a in tools_string if a != ''] + except Exception as e: + log.debug("App.convert_any2geo() --> %s" % str(e)) + return 'fail' + + tools = {} + t_id = 0 + for tooldia in tools_diameters: + t_id += 1 + new_tool = { + 'tooldia': tooldia, + 'offset': 'Path', + 'offset_value': 0.0, + 'type': 'Rough', + 'tool_type': 'C1', + 'data': deepcopy(default_data), + 'solid_geometry': [] + } + tools[t_id] = deepcopy(new_tool) + + def initialize_from_gerber(new_obj, app): + new_obj.solid_geometry = deepcopy(obj.solid_geometry) try: - obj_init.apertures = obj.apertures + new_obj.follow_geometry = obj.follow_geometry except AttributeError: pass - try: - if obj.tools: - obj_init.tools = obj.tools - except AttributeError: - pass + new_obj.options.update(deepcopy(default_data)) + new_obj.options["cnctooldia"] = tools_diameters[0] if tools_diameters else 0.0 + new_obj.tools = deepcopy(tools) + for k in new_obj.tools: + new_obj.tools[k]['solid_geometry'] = deepcopy(obj.solid_geometry) - def initialize_excellon(obj_init, app_obj): - # objs = self.collection.get_selected() - # GeometryObject.merge(objs, obj) + def initialize_from_excellon(new_obj, app_obj): solid_geo = [] for tool in obj.tools: for geo in obj.tools[tool]['solid_geometry']: solid_geo.append(geo) - obj_init.solid_geometry = deepcopy(solid_geo) - if not obj_init.solid_geometry: + new_obj.solid_geometry = deepcopy(solid_geo) + if not new_obj.solid_geometry: app_obj.log("convert_any2geo() failed") return 'fail' + new_obj.options.update(deepcopy(default_data)) + new_obj.options["cnctooldia"] = tools_diameters[0] if tools_diameters else 0.0 + new_obj.tools = deepcopy(tools) + for k in new_obj.tools: + new_obj.tools[k]['solid_geometry'] = deepcopy(obj.solid_geometry) + if not self.collection.get_selected(): log.warning("App.convert_any2geo --> No object selected") - self.inform.emit('[WARNING_NOTCL] %s' % - _("No object is selected.")) + self.inform.emit('[WARNING_NOTCL] %s' % _("No object is selected.")) return for obj in self.collection.get_selected(): - obj_name = obj.options["name"] + outname = '%s_conv' % obj.options["name"] try: if obj.kind == 'excellon': - self.app_obj.new_object("geometry", str(obj_name) + "_conv", initialize_excellon) - else: - self.app_obj.new_object("geometry", str(obj_name) + "_conv", initialize) + self.app_obj.new_object("geometry", outname, initialize_from_excellon) + + if obj.kind == 'gerber': + self.app_obj.new_object("geometry", outname, initialize_from_gerber) + except Exception as e: - return "Operation failed: %s" % str(e) + log.debug("Convert any 2 geo operation failed: %s" % str(e)) def convert_any2gerber(self): """ @@ -5494,21 +5541,22 @@ class App(QtCore.QObject): :return: """ - def initialize_geometry(obj_init, app_obj): - apertures = {} - apid = 0 + def initialize_from_geometry(obj_init, app_obj): + apertures = { + '0': { + 'size': 0.0, + 'type': 'REG', + 'geometry': [] + } + } - apertures[str(apid)] = {} - apertures[str(apid)]['geometry'] = [] for obj_orig in obj.solid_geometry: new_elem = {'solid': obj_orig} try: new_elem['follow'] = obj_orig.exterior except AttributeError: pass - apertures[str(apid)]['geometry'].append(deepcopy(new_elem)) - apertures[str(apid)]['size'] = 0.0 - apertures[str(apid)]['type'] = 'C' + apertures['0']['geometry'].append(deepcopy(new_elem)) obj_init.solid_geometry = deepcopy(obj.solid_geometry) obj_init.apertures = deepcopy(apertures) @@ -5517,19 +5565,24 @@ class App(QtCore.QObject): app_obj.log("convert_any2gerber() failed") return 'fail' - def initialize_excellon(obj_init, app_obj): + def initialize_from_excellon(obj_init, app_obj): apertures = {} apid = 10 for tool in obj.tools: - apertures[str(apid)] = {} - apertures[str(apid)]['geometry'] = [] + apertures[str(apid)] = { + 'size': float(obj.tools[tool]['tooldia']), + 'type': 'C', + 'geometry': [] + } + for geo in obj.tools[tool]['solid_geometry']: - new_el = {'solid': geo, 'follow': geo.exterior} + new_el = { + 'solid': geo, + 'follow': geo.exterior + } apertures[str(apid)]['geometry'].append(deepcopy(new_el)) - apertures[str(apid)]['size'] = float(obj.tools[tool]['tooldia']) - apertures[str(apid)]['type'] = 'C' apid += 1 # create solid_geometry @@ -5550,19 +5603,18 @@ class App(QtCore.QObject): if not self.collection.get_selected(): log.warning("App.convert_any2gerber --> No object selected") - self.inform.emit('[WARNING_NOTCL] %s' % - _("No object is selected.")) + self.inform.emit('[WARNING_NOTCL] %s' % _("No object is selected.")) return for obj in self.collection.get_selected(): - obj_name = obj.options["name"] + outname = '%s_conv' % obj.options["name"] try: if obj.kind == 'excellon': - self.app_obj.new_object("gerber", str(obj_name) + "_conv", initialize_excellon) + self.app_obj.new_object("gerber", outname, initialize_from_excellon) elif obj.kind == 'geometry': - self.app_obj.new_object("gerber", str(obj_name) + "_conv", initialize_geometry) + self.app_obj.new_object("gerber", outname, initialize_from_geometry) else: log.warning("App.convert_any2gerber --> This is no valid object for conversion.") diff --git a/camlib.py b/camlib.py index 3f09d998..8b12583a 100644 --- a/camlib.py +++ b/camlib.py @@ -1261,8 +1261,12 @@ class Geometry(object): merged_lines = linemerge(geos_lines) geos = geos_polys - for ml in merged_lines: - geos.append(ml) + + try: + for ml in merged_lines: + geos.append(ml) + except TypeError: + geos.append(merged_lines) # Add to object if self.solid_geometry is None: