From 7ec01bee7dce36f136d12a50e0e2421676dcdcfb Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Fri, 9 Jun 2017 00:00:08 -0300 Subject: [PATCH] Draft: Fixed unicode conversion bug in DXF export --- src/Mod/Draft/importDXF.py | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/src/Mod/Draft/importDXF.py b/src/Mod/Draft/importDXF.py index 75dccec194..c699589f00 100644 --- a/src/Mod/Draft/importDXF.py +++ b/src/Mod/Draft/importDXF.py @@ -1717,7 +1717,7 @@ def getWire(wire,nospline=False,lw=True,asis=False): def getBlock(sh,obj,lwPoly=False): "returns a dxf block with the contents of the object" - block = dxfLibrary.Block(name=obj.Name,layer=getGroup(obj)) + block = dxfLibrary.Block(name=obj.Name,layer=getStrGroup(obj)) writeShape(sh,obj,block,lwPoly) return block @@ -1725,7 +1725,7 @@ def writeShape(sh,ob,dxfobject,nospline=False,lwPoly=False,layer=None,color=None "writes the object's shape contents in the given dxf object" processededges = [] if not layer: - layer=getGroup(ob) + layer=getStrGroup(ob) if not color: color = getACI(ob) for wire in sh.Wires: # polylines @@ -1885,6 +1885,21 @@ def writePanelCut(ob,dxf,nospline,lwPoly,parent=None): # pts = [(v.X,v.Y,v.Z) for v in w.Vertexes] # dxf.append(dxfLibrary.Line(pts,color=getACI(ob),layer="Tags")) +def getStrGroup(ob): + "gets a string version of the group name" + l = getGroup(ob) + if isinstance(l,unicode): + # dxf R12 files are rather over-sensitive with utf8... + try: + import unicodedata + except: + # fallback + return l.encode("ascii",errors="replace") + else: + # better encoding, replaces accented latin characters with corrsponding ascii letter + return ''.join((c for c in unicodedata.normalize('NFD', l) if unicodedata.category(c) != 'Mn')).encode("ascii",errors="replace") + return l + def export(objectslist,filename,nospline=False,lwPoly=False): "called when freecad exports a file. If nospline=True, bsplines are exported as straight segs lwPoly=True for OpenSCAD DXF" readPreferences() @@ -1966,14 +1981,14 @@ def export(objectslist,filename,nospline=False,lwPoly=False): dxf.blocks.append(block) dxf.append(dxfLibrary.Insert(name=ob.Name.upper(), color=getACI(ob), - layer=getGroup(ob))) + layer=getStrGroup(ob))) else: # all other cases: block block = getBlock(sh,ob,lwPoly) dxf.blocks.append(block) dxf.append(dxfLibrary.Insert(name=ob.Name.upper(), color=getACI(ob), - layer=getGroup(ob))) + layer=getStrGroup(ob))) else: writeShape(sh,ob,dxf,nospline,lwPoly) @@ -1992,7 +2007,7 @@ def export(objectslist,filename,nospline=False,lwPoly=False): dxf.append(dxfLibrary.Text(text,point,height=height, color=getACI(ob,text=True), style='STANDARD', - layer=getGroup(ob))) + layer=getStrGroup(ob))) elif Draft.getType(ob) == "Dimension": p1 = DraftVecUtils.tup(ob.Start) @@ -2004,8 +2019,10 @@ def export(objectslist,filename,nospline=False,lwPoly=False): else: pbase = DraftVecUtils.tup(ob.End.add(proj.negative())) dxf.append(dxfLibrary.Dimension(pbase,p1,p2,color=getACI(ob), - layer=getGroup(ob))) + layer=getStrGroup(ob))) + if isinstance(filename,unicode): + filename = filename.encode("utf8") dxf.saveas(filename) FreeCAD.Console.PrintMessage("successfully exported "+filename+"\r\n") else: