Draft: Export of Arch Axes to DXF

This commit is contained in:
Yorik van Havre
2018-11-07 12:38:07 -02:00
parent bff6312263
commit d2089999e0
2 changed files with 81 additions and 6 deletions

View File

@@ -21,7 +21,7 @@
#* *
#***************************************************************************
import FreeCAD,Draft,math,DraftVecUtils,ArchCommands
import FreeCAD,Draft,math,DraftVecUtils,ArchCommands,sys
from FreeCAD import Vector
if FreeCAD.GuiUp:
import FreeCADGui
@@ -575,7 +575,10 @@ class _ViewProviderAxis:
('C',100),('XC',90),('L',50),('XL',40),
('X',10),('IX',9),('V',5),('IV',4),('I',1))
if hasattr(vobj.Object,"CustomNumber") and vobj.Object.CustomNumber:
return vobj.Object.CustomNumber.encode("utf8")
if sys.version_info.major < 3:
return vobj.Object.CustomNumber.encode("utf8")
else:
return vobj.Object.CustomNumber
elif hasattr(vobj,"NumberingStyle"):
if vobj.NumberingStyle == "1,2,3":
return str(num+1)

View File

@@ -1914,17 +1914,29 @@ def getStrGroup(ob):
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"
"called when freecad exports a file. If nospline=True, bsplines are exported as straight segs. lwPoly=True is for OpenSCAD DXF"
readPreferences()
getDXFlibs()
if dxfLibrary:
global exportList
exportList = objectslist
exportList = Draft.getGroupContents(exportList)
nlist = []
for ob in exportList:
if Draft.getType(ob) == "AxisSystem":
nlist.extend(ob.Axes)
else:
nlist.append(ob)
exportList = nlist
if (len(exportList) == 1) and (Draft.getType(exportList[0]) == "ArchSectionView"):
# arch view: export it "as is"
dxf = exportList[0].Proxy.getDXF()
if dxf:
f = open(filename,"w")
@@ -1932,19 +1944,28 @@ def export(objectslist,filename,nospline=False,lwPoly=False):
f.close()
elif (len(exportList) == 1) and (exportList[0].isDerivedFrom("Drawing::FeaturePage")):
# page: special hack-export! (see below)
exportPage(exportList[0],filename)
elif (len(exportList) == 1) and (exportList[0].isDerivedFrom("TechDraw::DrawPage")):
# page: special hack-export! (see below)
exportPage(exportList[0],filename)
else:
# other cases, treat edges
# other cases, treat objects one by one
dxf = dxfLibrary.Drawing()
for ob in exportList:
print("processing "+str(ob.Name))
if Draft.getType(ob) == "PanelSheet":
if not hasattr(ob.Proxy,"sheetborder"):
ob.Proxy.execute(ob)
sb = ob.Proxy.sheetborder
@@ -1962,9 +1983,49 @@ def export(objectslist,filename,nospline=False,lwPoly=False):
shp = subob.Shape.copy()
shp.Placement = ob.Placement.multiply(shp.Placement)
writeShape(shp,ob,dxf,nospline,lwPoly,layer="Outlines",color=5)
elif Draft.getType(ob) == "PanelCut":
writePanelCut(ob,dxf,nospline,lwPoly)
elif Draft.getType(ob) == "Axis":
axes = ob.Proxy.getAxisData(ob)
if not axes:
continue
for ax in axes:
dxf.append(dxfLibrary.Line([tuple(ax[0]),tuple(ax[1])],color=getACI(ob),layer=getStrGroup(ob)))
p = ax[1]
h = 1
if FreeCAD.GuiUp:
vobj = ob.ViewObject
rad = vobj.BubbleSize.Value/2
n = 0
pos = ["Start"]
if hasattr(vobj,"BubblePosition"):
if vobj.BubblePosition == "Both":
pos = ["Start","End"]
else:
pos = [vobj.BubblePosition]
for p in pos:
if p == "Start":
p1 = ax[0]
p2 = ax[1]
else:
p1 = ax[1]
p2 = ax[0]
dv = p2.sub(p1)
dv.normalize()
center = p2.add(dv.scale(rad,rad,rad))
h = float(ob.ViewObject.FontSize)
dxf.append(dxfLibrary.Circle(center,rad,color=getACI(ob),layer=getStrGroup(ob)))
dxf.append(dxfLibrary.Text(ax[2],center,alignment=center,height=h,justifyhor=1,justifyver=2,color=getACI(ob),style='STANDARD',layer=getStrGroup(ob)))
else:
dxf.append(dxfLibrary.Text(ax[2],p,alignment=p,height=h,justifyhor=1,justifyver=2,color=getACI(ob),style='STANDARD',layer=getStrGroup(ob)))
elif ob.isDerivedFrom("Part::Feature"):
tess = None
if hasattr(ob,"Tessellation"):
if ob.Tessellation:
@@ -2008,6 +2069,7 @@ def export(objectslist,filename,nospline=False,lwPoly=False):
writeShape(sh,ob,dxf,nospline,lwPoly)
elif Draft.getType(ob) == "Annotation":
# texts
# temporary - as dxfLibrary doesn't support mtexts well, we use several single-line texts
@@ -2024,16 +2086,22 @@ def export(objectslist,filename,nospline=False,lwPoly=False):
layer=getStrGroup(ob)))
elif Draft.getType(ob) == "DraftText":
# texts
# temporary - as dxfLibrary doesn't support mtexts well, we use several single-line texts
# well, anyway, at the moment, Draft only writes single-line texts, so...
for text in ob.Text:
point = DraftVecUtils.tup(FreeCAD.Vector(ob.Placement.Base.x,
ob.Placement.Base.y-ob.Text.index(text),
ob.Placement.Base.z))
if gui: height = float(ob.ViewObject.FontSize)
else: height = 1
dxf.append(dxfLibrary.Text(text,point,height=height,
color=getACI(ob,text=True),
style='STANDARD',
layer=getStrGroup(ob)))
elif Draft.getType(ob) == "Dimension":
p1 = DraftVecUtils.tup(ob.Start)
p2 = DraftVecUtils.tup(ob.End)
base = Part.LineSegment(ob.Start,ob.End).toShape()
@@ -2044,12 +2112,16 @@ def export(objectslist,filename,nospline=False,lwPoly=False):
pbase = DraftVecUtils.tup(ob.End.add(proj.negative()))
dxf.append(dxfLibrary.Dimension(pbase,p1,p2,color=getACI(ob),
layer=getStrGroup(ob)))
if sys.version_info.major < 3:
if isinstance(filename,unicode):
filename = filename.encode("utf8")
dxf.saveas(filename)
FreeCAD.Console.PrintMessage("successfully exported "+filename+"\r\n")
else:
errorDXFLib(gui)
class dxfcounter: