diff --git a/CHANGELOG.md b/CHANGELOG.md index e9a233f4..df3a571c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ CHANGELOG for FlatCAM beta ================================================= +2.02.2022 + +- fixed some issue regarding Milling Plugin, importing DXF file as Geometry + 1.02.2022 - fixed the `cncjob` Tcl command: forgot to pop the arguments that are not recognized by the non-multigeo handler diff --git a/appParsers/ParseGerber.py b/appParsers/ParseGerber.py index c62787f1..135551a4 100644 --- a/appParsers/ParseGerber.py +++ b/appParsers/ParseGerber.py @@ -2022,11 +2022,32 @@ class Gerber(Geometry): """ self.app.log.debug("Parsing DXF file geometry into a Gerber object geometry.") + + self.multigeo = True + # Parse into list of shapely objects dxf = ezdxf.readfile(filename) geos = getdxfgeo(dxf) + # trying to optimize the resulting geometry by merging contiguous lines - geos = linemerge(geos) + geos = list(self.flatten_list(geos)) + geos_polys = [] + geos_lines = [] + for g in geos: + if isinstance(g, (Polygon, MultiPolygon)): + geos_polys.append(g) + else: + geos_lines.append(g) + + merged_lines = linemerge(geos_lines) + geos = geos_polys + + try: + w_geo = merged_lines.geoms if isinstance(merged_lines, MultiLineString) else merged_lines + for ml in w_geo: + geos.append(ml) + except TypeError: + geos.append(merged_lines) # Add to object if self.solid_geometry is None: diff --git a/appPlugins/ToolMilling.py b/appPlugins/ToolMilling.py index 1f2a6afe..64489c8d 100644 --- a/appPlugins/ToolMilling.py +++ b/appPlugins/ToolMilling.py @@ -3015,8 +3015,26 @@ class ToolMilling(AppTool, Excellon): # the segx and segy values are the same for all tools os we just take the values from the first tool sel_tool = tools_list[0] data_dict = geo_obj.tools[sel_tool]['data'] - segx = data_dict.get('segx') or data_dict.get('geometry_segx') - segy = data_dict.get('segy') or data_dict.get('geometry_segy') + try: + segx = data_dict['segx'] + except KeyError: + try: + segx = data_dict['geometry_segx'] + except KeyError: + try: + segx = geo_obj.options['segx'] + except KeyError: + segx = self.app.defaults['geometry_segx'] + try: + segy = data_dict['segy'] + except KeyError: + try: + segy = data_dict['geometry_segy'] + except KeyError: + try: + segy = geo_obj.options['segy'] + except KeyError: + segy = self.app.defaults['geometry_segy'] try: xmin = geo_obj.options['xmin'] diff --git a/app_Main.py b/app_Main.py index 64d7d2b8..84511e36 100644 --- a/app_Main.py +++ b/app_Main.py @@ -11367,7 +11367,6 @@ class MenuFileHandlers(QtCore.QObject): else: return "fail" - geo_obj.multigeo = True with open(filename) as f: file_content = f.read() geo_obj.source_file = file_content diff --git a/camlib.py b/camlib.py index d8871e42..d776baad 100644 --- a/camlib.py +++ b/camlib.py @@ -1325,6 +1325,9 @@ class Geometry(object): """ self.app.log.debug("Parsing DXF file geometry into a Geometry object solid geometry.") + # Multi-geo Geometry Object + self.multigeo = True + # Parse into list of shapely objects dxf = ezdxf.readfile(filename) geos = getdxfgeo(dxf) @@ -1334,7 +1337,7 @@ class Geometry(object): geos_polys = [] geos_lines = [] for g in geos: - if isinstance(g, Polygon): + if isinstance(g, (Polygon, MultiPolygon)): geos_polys.append(g) else: geos_lines.append(g) @@ -1343,7 +1346,8 @@ class Geometry(object): geos = geos_polys try: - for ml in merged_lines: + w_geo = merged_lines.geoms if isinstance(merged_lines, MultiLineString) else merged_lines + for ml in w_geo: geos.append(ml) except TypeError: geos.append(merged_lines) @@ -3921,7 +3925,6 @@ class CNCjob(Geometry): # Measurements total_travel = 0.0 total_cut = 0.0 - # Start GCode start_gcode = '' if is_first: @@ -7222,7 +7225,9 @@ class CNCjob(Geometry): :rtype: list """ - if len(coords) < 2 or self.segx <= 0 and self.segy <= 0: + if len(coords) < 2: + return list(coords) + if self.segx <= 0 and self.segy <= 0: return list(coords) # flag that the generated gcode was segmented for autolevelling diff --git a/tclCommands/TclCommandOpenDXF.py b/tclCommands/TclCommandOpenDXF.py index 4aa82cf3..6de1bd32 100644 --- a/tclCommands/TclCommandOpenDXF.py +++ b/tclCommands/TclCommandOpenDXF.py @@ -83,6 +83,7 @@ class TclCommandOpenDXF(TclCommandSignaled): if obj_type != "geometry" and obj_type != "gerber": self.raise_tcl_error("Option type can be 'geometry' or 'gerber' only, got '%s'." % obj_type) + return "fail" units = self.app.app_units.upper() @@ -93,14 +94,12 @@ class TclCommandOpenDXF(TclCommandSignaled): if ret_val == 'fail': filename = self.app.defaults['global_tcl_path'] + '/' + outname ret_val = self.app.app_obj.new_object(obj_type, outname, obj_init, plot=False) - self.app.shell.append_output( - "No path provided or path is wrong. Using the default Path... \n") + # self.app.shell.append_output( + # "No path provided or path is wrong. Using the default Path... \n") if ret_val == 'fail': - return "Failed. The OpenDXF command was used but could not open the DXF file" + self.app.log.error("Failed. The OpenDXF command was used but could not open the DXF file") + return "fail" # Register recent file self.app.file_opened.emit("dxf", filename) - - # GUI feedback - self.app.inform.emit("Opened: " + filename)