From a5bf2e41c6c82b095dfd444c534b76be25d7dd01 Mon Sep 17 00:00:00 2001 From: Mario Voigt Date: Mon, 24 Aug 2020 15:55:25 +0200 Subject: [PATCH] Rework of DXF/DWG Importer --- .../dxfdwgimporter.inx | 183 +++++++----- .../dxfdwgimporter.py | 269 +++++++++++------- 2 files changed, 277 insertions(+), 175 deletions(-) diff --git a/extensions/fablabchemnitz_dxfdwgimporter/dxfdwgimporter.inx b/extensions/fablabchemnitz_dxfdwgimporter/dxfdwgimporter.inx index 776688bd..30fc7ca9 100644 --- a/extensions/fablabchemnitz_dxfdwgimporter/dxfdwgimporter.inx +++ b/extensions/fablabchemnitz_dxfdwgimporter/dxfdwgimporter.inx @@ -2,14 +2,15 @@ DXF/DWG Importer fablabchemnitz.de.dxfdwgimporter_configure - - - - + + + + - - - + + + + true 0.0 @@ -20,11 +21,31 @@ + C:\Users\ - + - C:\Program Files\ODA\ODAFileConverter_title 21.6.0\ODAFileConverter.exe - + + + + + + + + C:\Program Files\ODA\ODAFileConverter_title 21.6.0\ODAFileConverter.exe + true + + + + + + + + + + + + - - - - - - - - - - - - - true - false - true - - - - C:\Program Files (x86)\sK1 Project\UniConvertor-1.1.6\uniconvertor.cmd - true - - - - - + true + false + true + + - true + + true @@ -86,43 +87,71 @@ + false - - true - true - true - true - true - true - true - true - - - - true - true - true - true - true - true - true - true - + + + + + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + + + + + + + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + true + + - - - - - C:\Users\ - - - - - - - + + + + + C:\Program Files (x86)\sK1 Project\UniConvertor-1.1.6\uniconvertor.cmd + true + + all diff --git a/extensions/fablabchemnitz_dxfdwgimporter/dxfdwgimporter.py b/extensions/fablabchemnitz_dxfdwgimporter/dxfdwgimporter.py index 5a09c1b3..21f8bd20 100644 --- a/extensions/fablabchemnitz_dxfdwgimporter/dxfdwgimporter.py +++ b/extensions/fablabchemnitz_dxfdwgimporter/dxfdwgimporter.py @@ -8,7 +8,7 @@ Import any DWG or DXF file using ODA File Converter, sk1 UniConverter, ezdxf and Author: Mario Voigt / FabLab Chemnitz Mail: mario.voigt@stadtfabrikanten.org Date: 23.08.2020 -Last patch: 23.08.2020 +Last patch: 24.08.2020 License: GNU GPL v3 Module licenses @@ -17,6 +17,9 @@ Module licenses - https://github.com/bjnortier/dxf - MIT License - ODA File Converter - not bundled (due to restrictions by vendor) - sk1 UniConverter (https://github.com/sk1project/uniconvertor) - AGPL v3.0 - not bundled + +ToDos: +- change copy commands to movefile commands (put into temp. sub directories where the input file is located). We need to copy files in this script because ODA File Converter will process whole dirs instead of single files only.DXF files can be really large, which slows the process) """ import inkex @@ -28,6 +31,8 @@ from lxml import etree from subprocess import Popen, PIPE import shutil from pathlib import Path +from mimetypes import MimeTypes +import urllib.request as urllib #ezdxf related imports import matplotlib.pyplot as plt @@ -39,92 +44,140 @@ from ezdxf.addons import Importer class DXFDWGImport(inkex.Effect): def __init__(self): inkex.Effect.__init__(self) - self.arg_parser.add_argument("--odafileconverter", default=r"C:\Program Files\ODA\ODAFileConverter_title 21.6.0\ODAFileConverter.exe", help="Full path to 'ODAFileConverter.exe'") - self.arg_parser.add_argument("--odahidewindow", type=inkex.Boolean, default=True, help="Hide ODA GUI window") - self.arg_parser.add_argument("--outputformat", default="ACAD2018_DXF", help="ODA AutoCAD Output version") - self.arg_parser.add_argument("--sk1uniconverter", default=r"C:\Program Files (x86)\sK1 Project\UniConvertor-1.1.6\uniconvertor.cmd", help="Full path to 'uniconvertor.cmd'") - self.arg_parser.add_argument("--opendironerror", type=inkex.Boolean, default=True, help="Open containing output directory on conversion errors") - self.arg_parser.add_argument("--skip_dxf_to_dxf", type=inkex.Boolean, default=False, help="Skip conversion from DXF to DXF") - self.arg_parser.add_argument("--audit_repair", type=inkex.Boolean, default=True, help="Perform audit / autorepair") - self.arg_parser.add_argument("--dxf_to_svg_parser", default="bjnortier", help="Choose a DXF to SVG parser") - self.arg_parser.add_argument("--resizetoimport", type=inkex.Boolean, default=True, help="Resize the canvas to the imported drawing's bounding box") - self.arg_parser.add_argument("--THREE_DFACE", type=inkex.Boolean, default=True) #3DFACE - self.arg_parser.add_argument("--ARC", type=inkex.Boolean, default=True) - self.arg_parser.add_argument("--BLOCK", type=inkex.Boolean, default=True) - self.arg_parser.add_argument("--CIRCLE", type=inkex.Boolean, default=True) - self.arg_parser.add_argument("--ELLIPSE", type=inkex.Boolean, default=True) - self.arg_parser.add_argument("--LINE", type=inkex.Boolean, default=True) - self.arg_parser.add_argument("--LWPOLYLINE", type=inkex.Boolean, default=True) - self.arg_parser.add_argument("--POINT", type=inkex.Boolean, default=True) - self.arg_parser.add_argument("--POLYLINE", type=inkex.Boolean, default=True) - self.arg_parser.add_argument("--POP_TRAFO", type=inkex.Boolean, default=True) - self.arg_parser.add_argument("--SEQEND", type=inkex.Boolean, default=True) - self.arg_parser.add_argument("--SOLID", type=inkex.Boolean, default=True) - self.arg_parser.add_argument("--SPLINE", type=inkex.Boolean, default=True) - self.arg_parser.add_argument("--TABLE", type=inkex.Boolean, default=True) - self.arg_parser.add_argument("--VERTEX", type=inkex.Boolean, default=True) - self.arg_parser.add_argument("--VIEWPORT", type=inkex.Boolean, default=True) - self.arg_parser.add_argument("--inputfile") - self.arg_parser.add_argument("--extraborder", type=float, default=0.0) - self.arg_parser.add_argument("--extraborder_units") - self.arg_parser.add_argument("--ezdxf_output_version", default="SAME") - self.arg_parser.add_argument("--ezdxf_preprocessing", type=inkex.Boolean, default=True) - self.arg_parser.add_argument("--allentities", type=inkex.Boolean, default=True) - def effect(self): + #blank tabs + self.arg_parser.add_argument("--tab") + + #general + self.arg_parser.add_argument("--inputfile") + self.arg_parser.add_argument("--dxf_to_svg_parser", default="bjnortier", help="Choose a DXF to SVG parser") + self.arg_parser.add_argument("--resizetoimport", type=inkex.Boolean, default=True, help="Resize the canvas to the imported drawing's bounding box") + self.arg_parser.add_argument("--extraborder", type=float, default=0.0) + self.arg_parser.add_argument("--extraborder_units") + + #ODA File Converter + self.arg_parser.add_argument("--oda_fileconverter", default=r"C:\Program Files\ODA\oda_fileconverter_title 21.6.0\oda_fileconverter.exe", help="Full path to 'oda_fileconverter.exe'") + self.arg_parser.add_argument("--oda_hidewindow", type=inkex.Boolean, default=True, help="Hide ODA GUI window") + self.arg_parser.add_argument("--oda_outputformat", default="ACAD2018_DXF", help="ODA AutoCAD Output version") + self.arg_parser.add_argument("--oda_keepconverted_dxf", type=inkex.Boolean, default=True, help="Keep ODA converted DXF file") + self.arg_parser.add_argument("--oda_skip_dxf_to_dxf", type=inkex.Boolean, default=False, help="Skip conversion from DXF to DXF") + self.arg_parser.add_argument("--oda_audit_repair", type=inkex.Boolean, default=True, help="Perform audit / autorepair") + + #sk1 UniConverter + self.arg_parser.add_argument("--sk1_uniconverter", default=r"C:\Program Files (x86)\sK1 Project\UniConvertor-1.1.6\uniconvertor.cmd", help="Full path to 'uniconvertor.cmd'") + self.arg_parser.add_argument("--opendironerror", type=inkex.Boolean, default=True, help="Open containing output directory on conversion errors") + + #ezdxf preprocessing + self.arg_parser.add_argument("--ezdxf_output_version", default="SAME", help="ezdxf output version") + self.arg_parser.add_argument("--ezdfx_keep_preprocessed", type=inkex.Boolean, default=True, help="Keep ezdxf preprocessed DXF file") + self.arg_parser.add_argument("--ezdxf_preprocessing", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--allentities", type=inkex.Boolean, default=True) + + #sk1 compatible entities + self.arg_parser.add_argument("--THREE_DFACE", type=inkex.Boolean, default=True) #3DFACE + self.arg_parser.add_argument("--ARC", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--BLOCK", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--CIRCLE", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--ELLIPSE", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--LINE", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--LWPOLYLINE", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--POINT", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--POLYLINE", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--POP_TRAFO", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--SEQEND", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--SOLID", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--SPLINE", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--TABLE", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--VERTEX", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--VIEWPORT", type=inkex.Boolean, default=True) + + #other entities + self.arg_parser.add_argument("--THREE_DSOLID", type=inkex.Boolean, default=True) #3DSOLID + self.arg_parser.add_argument("--ATTRIB", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--BODY", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--DIMENSION", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--ARC_DIMENSION", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--HATCH", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--IMAGE", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--INSERT", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--LEADER", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--MESH", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--MTEXT", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--RAY", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--REGION", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--SHAPE", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--SURFACE", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--TRACE", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--UNDERLAY", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--XLINE", type=inkex.Boolean, default=True) + + + + def effect(self): #get input file and copy it to some new temporary directory inputfile = self.options.inputfile - - temp_input_dir = os.path.join(tempfile.gettempdir(),"inkscape-oda-convert-input") - - #remove the input directory before doing new job - shutil.rmtree(temp_input_dir, ignore_errors=True) + temp_input_dir = os.path.join(tempfile.gettempdir(),"dxfdwg_input") + shutil.rmtree(temp_input_dir, ignore_errors=True) #remove the input directory before doing new job if not os.path.exists(temp_input_dir): os.mkdir(temp_input_dir) #recreate blank dir - shutil.copy2(inputfile, os.path.join(temp_input_dir, Path(inputfile).name)) # complete target filename given #Prepapre output conversion - outputfilebase = os.path.splitext(os.path.splitext(os.path.basename(inputfile))[0])[0] - inputfile_ending = os.path.splitext(os.path.splitext(os.path.basename(inputfile))[1])[0] - temp_output_dir = os.path.join(tempfile.gettempdir(),"inkscape-oda-convert-output") - - #remove the output directory before doing new job - shutil.rmtree(temp_output_dir, ignore_errors=True) + outputfilebase = os.path.splitext(os.path.basename(inputfile))[0] + inputfile_ending = os.path.splitext(os.path.basename(inputfile))[1] + temp_output_dir = os.path.join(tempfile.gettempdir(),"dxfdwg_output") + shutil.rmtree(temp_output_dir, ignore_errors=True) #remove the output directory before doing new job if not os.path.exists(temp_output_dir): os.mkdir(temp_output_dir) - autocad_version = self.options.outputformat.split("_")[0] - autocad_format = self.options.outputformat.split("_")[1] - if self.options.audit_repair: #overwrite string bool with int value - self.options.audit_repair = "1" - else: - self.options.audit_repair = "0" + #Prepare some more options for proceeding + autocad_version = self.options.oda_outputformat.split("_")[0] + autocad_format = self.options.oda_outputformat.split("_")[1] + self.options.oda_audit_repair = "1" if self.options.oda_audit_repair else "0" #overwrite string bool with int value entityspace = [] if self.options.allentities or self.options.THREE_DFACE: entityspace.append("3DFACE") - if self.options.allentities or self.options.ARC: entityspace.append("ARC") - if self.options.allentities or self.options.BLOCK: entityspace.append("BLOCK") - if self.options.allentities or self.options.CIRCLE: entityspace.append("CIRCLE") - if self.options.allentities or self.options.ELLIPSE: entityspace.append("ELLIPSE") - if self.options.allentities or self.options.LINE: entityspace.append("LINE") - if self.options.allentities or self.options.LWPOLYLINE: entityspace.append("LWPOLYLINE") - if self.options.allentities or self.options.POINT: entityspace.append("POINT") - if self.options.allentities or self.options.POLYLINE: entityspace.append("POLYLINE") - if self.options.allentities or self.options.POP_TRAFO: entityspace.append("POP_TRAFO") - if self.options.allentities or self.options.SEQEND: entityspace.append("SEQEND") - if self.options.allentities or self.options.SOLID: entityspace.append("SOLID") - if self.options.allentities or self.options.SPLINE: entityspace.append("SPLINE") - if self.options.allentities or self.options.TABLE: entityspace.append("TABLE") - if self.options.allentities or self.options.VERTEX: entityspace.append("VERTEX") - if self.options.allentities or self.options.VIEWPORT: entityspace.append("VIEWPORT") + if self.options.allentities or self.options.ARC: entityspace.append("ARC") + if self.options.allentities or self.options.BLOCK: entityspace.append("BLOCK") + if self.options.allentities or self.options.CIRCLE: entityspace.append("CIRCLE") + if self.options.allentities or self.options.ELLIPSE: entityspace.append("ELLIPSE") + if self.options.allentities or self.options.LINE: entityspace.append("LINE") + if self.options.allentities or self.options.LWPOLYLINE: entityspace.append("LWPOLYLINE") + if self.options.allentities or self.options.POINT: entityspace.append("POINT") + if self.options.allentities or self.options.POLYLINE: entityspace.append("POLYLINE") + if self.options.allentities or self.options.POP_TRAFO: entityspace.append("POP_TRAFO") + if self.options.allentities or self.options.SEQEND: entityspace.append("SEQEND") + if self.options.allentities or self.options.SOLID: entityspace.append("SOLID") + if self.options.allentities or self.options.SPLINE: entityspace.append("SPLINE") + if self.options.allentities or self.options.TABLE: entityspace.append("TABLE") + if self.options.allentities or self.options.VERTEX: entityspace.append("VERTEX") + if self.options.allentities or self.options.VIEWPORT: entityspace.append("VIEWPORT") + + if self.options.allentities or self.options.THREE_DSOLID: entityspace.append("3DSOLID") + if self.options.allentities or self.options.ATTRIB: entityspace.append("ATTRIB") + if self.options.allentities or self.options.BODY: entityspace.append("BODY") + if self.options.allentities or self.options.DIMENSION: entityspace.append("DIMENSION") + if self.options.allentities or self.options.ARC_DIMENSION: entityspace.append("ARC_DIMENSION") + if self.options.allentities or self.options.HATCH: entityspace.append("HATCH") + if self.options.allentities or self.options.IMAGE: entityspace.append("IMAGE") + if self.options.allentities or self.options.INSERT: entityspace.append("INSERT") + if self.options.allentities or self.options.LEADER: entityspace.append("LEADER") + if self.options.allentities or self.options.MESH: entityspace.append("MESH") + if self.options.allentities or self.options.MTEXT: entityspace.append("MTEXT") + if self.options.allentities or self.options.RAY: entityspace.append("RAY") + if self.options.allentities or self.options.REGION: entityspace.append("REGION") + if self.options.allentities or self.options.SHAPE: entityspace.append("SHAPE") + if self.options.allentities or self.options.SURFACE: entityspace.append("SURFACE") + if self.options.allentities or self.options.TRACE: entityspace.append("TRACE") + if self.options.allentities or self.options.UNDERLAY: entityspace.append("UNDERLAY") + if self.options.allentities or self.options.XLINE: entityspace.append("XLINE") #ODA to ezdxf mapping oda_ezdxf_mapping = [] - oda_ezdxf_mapping.append(["ACAD9","R12","AC1004"]) #this mapping is not supported directly. so we use the lowest possible which is R12 - oda_ezdxf_mapping.append(["ACAD10","R12","AC1006"]) #this mapping is not supported directly. so we use the lowest possible which is R12 - oda_ezdxf_mapping.append(["ACAD12","R12","AC1009"]) - oda_ezdxf_mapping.append(["ACAD13","R2000","AC1012"]) #R13 was overwritten by R2000 which points to AC1015 instead of AC1014 (see documentation) - oda_ezdxf_mapping.append(["ACAD14","R2000","AC1014"]) #R14 was overwritten by R2000 which points to AC1015 instead of AC1014 (see documentation) + oda_ezdxf_mapping.append(["ACAD9", "R12", "AC1004"]) #this mapping is not supported directly. so we use the lowest possible which is R12 + oda_ezdxf_mapping.append(["ACAD10", "R12", "AC1006"]) #this mapping is not supported directly. so we use the lowest possible which is R12 + oda_ezdxf_mapping.append(["ACAD12", "R12", "AC1009"]) + oda_ezdxf_mapping.append(["ACAD13", "R2000","AC1012"]) #R13 was overwritten by R2000 which points to AC1015 instead of AC1014 (see documentation) + oda_ezdxf_mapping.append(["ACAD14", "R2000","AC1014"]) #R14 was overwritten by R2000 which points to AC1015 instead of AC1014 (see documentation) oda_ezdxf_mapping.append(["ACAD2000","R2000","AC1015"]) oda_ezdxf_mapping.append(["ACAD2004","R2004","AC1018"]) oda_ezdxf_mapping.append(["ACAD2007","R2007","AC1021"]) @@ -139,36 +192,48 @@ class DXFDWGImport(inkex.Effect): break if ezdxf_autocad_format is None: inkex.errormsg("ezdxf conversion format version unknown") - - if self.options.skip_dxf_to_dxf == False or inputfile_ending == ".dwg": - # Build and run ODA File Converter command // "cmd.exe /c start \"\" /MIN /WAIT" - oda_cmd = [self.options.odafileconverter, temp_input_dir, temp_output_dir, autocad_version, autocad_format, "0", self.options.audit_repair] - if self.options.odahidewindow: - info = subprocess.STARTUPINFO() #hide the ODA File Converter window because it is annoying - info.dwFlags = 1 - info.wShowWindow = 0 - proc = subprocess.Popen(oda_cmd, startupinfo=info, shell=False, stdout=PIPE, stderr=PIPE) - else: proc = subprocess.Popen(oda_cmd, shell=False, stdout=PIPE, stderr=PIPE) - stdout, stderr = proc.communicate() - if proc.returncode != 0: - inkex.errormsg("ODA File Converter failed: %d %s %s" % (proc.returncode, stdout, stderr)) - if self.options.skip_dxf_to_dxf: #if true we need to move the file to simulate "processed" - shutil.move(os.path.join(temp_input_dir, Path(inputfile).name), os.path.join(temp_output_dir, Path(inputfile).name)) - - # Prepare files + + #Prepare DXF and SVG paths dxf_file = os.path.join(temp_output_dir, outputfilebase + ".dxf") svg_file = os.path.join(temp_output_dir, outputfilebase + ".svg") - + + # Run ODA File Converter + if self.options.oda_skip_dxf_to_dxf == False or inputfile_ending == ".dwg": + # Executable test (check for proper configuration by checking mime type. Should return octet stream for a binary executable) + url = urllib.pathname2url(self.options.oda_fileconverter) + if "application/octet-stream" not in str(MimeTypes().guess_type(url)): + inkex.utils.debug("ODA File Converter was not properly configured.") + else: + # Build and run ODA File Converter command + oda_cmd = [self.options.oda_fileconverter, temp_input_dir, temp_output_dir, autocad_version, autocad_format, "0", self.options.oda_audit_repair] + if self.options.oda_hidewindow: + info = subprocess.STARTUPINFO() #hide the ODA File Converter window because it is annoying + info.dwFlags = 1 + info.wShowWindow = 0 + proc = subprocess.Popen(oda_cmd, startupinfo=info, shell=False, stdout=PIPE, stderr=PIPE) + else: proc = subprocess.Popen(oda_cmd, shell=False, stdout=PIPE, stderr=PIPE) + stdout, stderr = proc.communicate() + if proc.returncode != 0: + inkex.errormsg("ODA File Converter failed: %d %s %s" % (proc.returncode, stdout, stderr)) + exit(1) + # Preprocessing DXF to DXF (entity filter) + if self.options.oda_skip_dxf_to_dxf: #if true we need to move the file to simulate "processed" + shutil.move(os.path.join(temp_input_dir, Path(inputfile).name), os.path.join(temp_output_dir, Path(inputfile).name)) + + if self.options.oda_keepconverted_dxf and inputfile_ending != ".dxf": #if the input file already was DXF we don't need to make another copy + shutil.copy2(dxf_file, os.path.join(os.path.dirname(inputfile), outputfilebase + "_oda.dxf")) # complete target filename given + if self.options.ezdxf_preprocessing: - #uniconverter does not handle all entities. we parse the file to exlude stuff which lets uniconverter fail + # uniconverter does not handle all entities. we parse the file to exlude stuff which lets uniconverter fail dxf = ezdxf.readfile(dxf_file) modelspace = dxf.modelspace() allowed_entities = [] # supported entities by UniConverter- impossible: MTEXT TEXT INSERT and a lot of others query_string = str(entityspace)[1:-1].replace("'","").replace(",","") - for e in modelspace.query(query_string): - allowed_entities.append(e) + if query_string != "": + for e in modelspace.query(query_string): + allowed_entities.append(e) #inkex.utils.debug(ezdxf_autocad_format) #inkex.utils.debug(self.options.ezdxf_output_version) if self.options.ezdxf_output_version == "SAME": @@ -179,10 +244,17 @@ class DXFDWGImport(inkex.Effect): for e in allowed_entities: msp.add_foreign_entity(e) doc.saveas(dxf_file) + if self.options.ezdfx_keep_preprocessed: + shutil.copy2(dxf_file, os.path.join(os.path.dirname(inputfile), outputfilebase + "_ezdxf.dxf")) # complete target filename given - # make SVG from DXF - if self.options.dxf_to_svg_parser == "uniconverter": - uniconverter_cmd = [self.options.sk1uniconverter, dxf_file, svg_file] + # Make SVG from DXF + if sys.platform != "win32": + inkex.utils.debug("You selected sk1 UniConverter but you are not running on a Windows platform.") + sk1_command_ending = os.path.splitext(os.path.splitext(os.path.basename(self.options.sk1_uniconverter))[1])[0] + if sk1_command_ending != ".cmd": + inkex.utils.debug("You selected sk1 UniConverter but it was not configured properly. Check the path to the executable.") + elif self.options.dxf_to_svg_parser == "uniconverter": + uniconverter_cmd = [self.options.sk1_uniconverter, dxf_file, svg_file] #inkex.utils.debug(uniconverter_cmd) proc = subprocess.Popen(uniconverter_cmd, shell=False, stdout=PIPE, stderr=PIPE) stdout, stderr = proc.communicate() @@ -221,17 +293,18 @@ class DXFDWGImport(inkex.Effect): #plt.show() #fig.savefig(os.path.join(temp_output_dir, outputfilebase + ".png"), dpi=300) fig.savefig(svg_file) #see https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.savefig.html + elif self.options.dxf_to_svg_parser == "legacy": + inkex.utils.debug("The selected legacy DXF to SVG parser is not supported by this extension yet. Use File > Import > *.dxf. This calls the \"dxf_input.inx\" extension.") + exit(1) else: inkex.utils.debug("undefined parser") exit(1) - # Write the generated SVG into canvas + # Write the generated SVG into InkScape's canvas stream = open(svg_file, 'r') p = etree.XMLParser(huge_tree=True) doc = etree.parse(stream, parser=etree.XMLParser(huge_tree=True)).getroot() stream.close() - - #newGroup = self.document.getroot().add(inkex.Group()) doc.set('id', self.svg.get_unique_id('dxf_dwg_import')) self.document.getroot().append(doc)