diff options
author | Tom Musgrove <LetterRip@gmail.com> | 2006-01-13 03:24:23 +0300 |
---|---|---|
committer | Tom Musgrove <LetterRip@gmail.com> | 2006-01-13 03:24:23 +0300 |
commit | 9b597819d6f57aa9a05e0ef4cc90fa703ae84ac8 (patch) | |
tree | 03746e371c48e56a6dd0b83c517db7d3bcee37bc /release/scripts/xfig_export.py | |
parent | b367da593b2f9dc360d31b37c011d43609d8f221 (diff) |
==python scripts==
added xfig exporter by Dino Ghilardi
ply import and export in previous commit were by Bruce Merry
Diffstat (limited to 'release/scripts/xfig_export.py')
-rw-r--r-- | release/scripts/xfig_export.py | 441 |
1 files changed, 441 insertions, 0 deletions
diff --git a/release/scripts/xfig_export.py b/release/scripts/xfig_export.py new file mode 100644 index 00000000000..94284120f34 --- /dev/null +++ b/release/scripts/xfig_export.py @@ -0,0 +1,441 @@ +#!BPY + +""" +Name: 'xfig export (.fig)' +Blender: 237 +Group: 'Export' +Tooltip: 'Export selected mesh to xfig Format (.fig)' +""" + +__author__ = "Dino Ghilardi " +__url__ = ("blender", "elysiun") +__version__ = "1.1" + +__bpydoc__ = """\ + This script exports the selected mesh to xfig (www.xfig.org) file format (i.e.: .fig) + + The starting point of this script was Anthony D'Agostino's raw triangle format export. + (some code is still here and there, cut'n pasted from his script) + + Usage:<br> + Select the mesh to be exported and run this script from "File->Export" menu. + The toggle button 'export 3 files' enables the generation of 4 files: one global + and three with the three different views of the object. + This script is licensed under the GPL license. (c) Dino Ghilardi, 2005 + +""" + +# .fig export, mostly brutally cut-n pasted from the +# 'Raw triangle export' (Anthony D'Agostino, http://www.redrival.com/scorpius)| + +import Blender +from Blender import NMesh, Draw, BGL +from Blender.Window import DrawProgressBar +#, meshtools +import sys +#import time + +# ================================= +# === Write xfig Format.=== +# ================================= + +#globals definition and init +mystring = "" +mymsg = "" +toggle=0 +sel3files=0 +maxX=-1000000000 +maxY=-1000000000 +maxZ=-1000000000 +minX=minY=minZ=10000000000 +boolmode=0 #0= export in inches, 1= export in cm +dimscale=float(1200) #scale due to the cm/inches select. default: inches +hidden_flag=0 + +space = float(2) #space between figures, in blender units. +scale= float(1200) #conversion scale to xfig units. +guiscale=float(1) #scale shown on the ruler in the GUI +#return values from gui items, just to deallocate them on exit. +guiret1=guiret2=guiret3=guiret4=guiret5=guiret6=guiret7=0 + +ScalePopup=0 +DistancePopup=0 +SpacePopup=0 +#end of globals definition + + +def getmaxmin(): + """Gets the max-min coordinates of the mesh""" + + global maxX,maxY,maxZ,minX,minY,minZ + """Getting the extremes of the mesh to be exported""" + objects = Blender.Object.GetSelected() + objname = objects[0].name + meshname = objects[0].data.name + mesh = Blender.NMesh.GetRaw(meshname) + obj = Blender.Object.Get(objname) + #initializing max-min find. + # ...is there a standard python function to find those values? + face =mesh.faces[1] + if len(face.v)==3: + v1,v2,v3=face.v + if len(face.v)==4: + v1,v2,v3,v4=face.v + if len(face.v)==2: + v1,v2=face.v + #is the next condition a nonsense for a face? ...Anyway, to be sure.... + if len(face.v)==1: + v1=face.v + + maxX,maxY,maxZ = v1 + minX, minY, minZ = v1 + + for face in mesh.faces: + #if (face.flag & Blender.NMesh.FaceFlags['ACTIVE']): + if len(face.v) == 3: # triangle + v1, v2, v3 = face.v + x1,y1,z1 = v1.co + x2,y2,z2 = v2.co + x3,y3,z3 = v3.co + maxX = max (maxX, x1, x2, x3) + maxY = max (maxY, y1, y2, y3) + maxZ = max (maxZ, z1, z2, z3) + minX = min (minX, x1, x2, x3) + minY = min (minY, y1, y2, y3) + minZ = min (minZ, z1, z2, z3) + elif len(face.v)==2: + v1,v2=face.v + x1,y1,z1 = v1.co + x2,y2,z2 = v2.co + maxX = max (maxX, x1, x2) + maxY = max (maxY, y1, y2) + maxZ = max (maxZ, z1, z2) + minX = min (minX, x1, x2) + minY = min (minY, y1, y2) + minZ = min (minZ, z1, z2) + elif len(face.v)==1: + v1=face.v + x1,y1,z1 = v1.co + maxX = max (maxX, x1) + maxY = max (maxY, y1) + maxZ = max (maxZ, z1) + minX = min (minX, x1) + minY = min (minY, y1) + minZ = min (minZ, z1) + elif len(face.v)==4: + v1,v2,v3,v4=face.v + x1,y1,z1 = v1.co + x2,y2,z2 = v2.co + x3,y3,z3 = v3.co + x4,y4,z4 = v4.co + maxX = max (maxX, x1, x2, x3, x4) + maxY = max (maxY, y1, y2, y3, y4) + maxZ = max (maxZ, z1, z2, z3, z4) + minX = min (minX, x1, x2, x3, x4) + minY = min (minY, y1, y2, y3, y4) + minZ = min (minZ, z1, z2, z3, z4) +def xfigheader(): + global export_type + print "#FIG 3.2 Produced by xfig version 3.2.5-alpha5" + print "Landscape" + print"Center" + if boolmode==0: + print"Inches" + else: + print"Metric" + #print export_type + print"Letter" + print"100.00" + print"Single" + print "-2" + print "1200 2" + +def xytransform (face): + """gives the face vertexes coordinates in the xfig format/translation (view xy)""" + v4=None + x4=y4=z4=None + if len(face.v)==3: + v1,v2,v3=face.v + else: + v1,v2,v3,v4=face.v + x1,y1,z1 = v1.co + x2,y2,z2 = v2.co + x3,y3,z3 = v3.co + y1=-y1 + y2=-y2 + y3=-y3 + if v4 !=None: + x4,y4,z4 = v4.co + y4=-y4 + return x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4 + +def xztransform(face): + """gives the face vertexes coordinates in the xfig format/translation (view xz)""" + v4=None + x4=y4=z4=None + if len(face.v)==3: + v1,v2,v3=face.v + else: + v1,v2,v3,v4=face.v + + #Order vertexes + x1,y1,z1 = v1.co + x2,y2,z2 = v2.co + x3,y3,z3 = v3.co + y1=-y1 + y2=-y2 + y3=-y3 + + z1=-z1+maxZ-minY +space + z2=-z2+maxZ-minY +space + z3=-z3+maxZ-minY +space + + if v4 !=None: + x4,y4,z4 = v4.co + y4=-y4 + z4=-z4+maxZ-minY +space + return x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4 + +def yztransform(face): + """gives the face vertexes coordinates in the xfig format/translation (view xz)""" + v4=None + x4=y4=z4=None + if len(face.v)==3: + v1,v2,v3=face.v + else: + v1,v2,v3,v4=face.v + + #Order vertexes + x1,y1,z1 = v1.co + x2,y2,z2 = v2.co + x3,y3,z3 = v3.co + y1=-y1 + y2=-y2 + y3=-y3 + z1=-(z1-maxZ-maxX-space) + z2=-(z2-maxZ-maxX-space) + z3=-(z3-maxZ-maxX-space) + + if v4 !=None: + x4,y4,z4 = v4.co + y4=-y4 + z4=-(z4-maxZ-maxX-space) + return x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4 + +def figdata(expview): + """Prints all the xfig data (no header)""" + objects = Blender.Object.GetSelected() + objname = objects[0].name + meshname = objects[0].data.name + mesh = Blender.NMesh.GetRaw(meshname) + obj = Blender.Object.Get(objname) + facenumber = len(mesh.faces) + for face in mesh.faces: + if len(face.v) == 3: # triangle + print "2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4" + if expview=="xy": + x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4=xytransform(face) + faceverts = int(x1*scale),int(y1*scale),int(x2*scale),int(y2*scale),int(x3*scale),int(y3*scale), int(x1*scale),int(y1*scale) + elif expview=="xz": + x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4=xztransform(face) + faceverts = int(x1*scale),int(z1*scale),int(x2*scale),int(z2*scale),int(x3*scale),int(z3*scale), int(x1*scale),int(z1*scale) + elif expview=="yz": + x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4=yztransform(face) + faceverts = int(z1*scale),int(y1*scale),int(z2*scale),int(y2*scale),int(z3*scale),int(y3*scale),int(z1*scale),int(y1*scale) + print "\t% i % i % i % i % i % i % i % i" % faceverts + else: + if len(face.v) == 4: #quadrilateral + print "2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5" + if expview=="xy": + x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4=xytransform(face) + faceverts = int(x1*scale),int(y1*scale),int(x2*scale),int(y2*scale),int(x3*scale),int(y3*scale),int(x4*scale),int(y4*scale), int(x1*scale),int(y1*scale) + + elif expview=="xz": + x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4=xztransform(face) + faceverts = int(x1*scale),int(z1*scale),int(x2*scale),int(z2*scale),int(x3*scale),int(z3*scale),int(x4*scale),int(z4*scale), int(x1*scale),int(z1*scale) + + elif expview=="yz": + x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4=yztransform(face) + faceverts = int(z1*scale),int(y1*scale),int(z2*scale),int(y2*scale),int(z3*scale),int(y3*scale),int(z4*scale),int(y4*scale), int(z1*scale),int(y1*scale) + print "\t% i % i % i % i % i % i % i % i % i % i" % faceverts + else: + pass #it should not occour, but.... + + +def writexy(filename): + """writes the x-y view file exported""" + global maxX, maxY, maxZ + global minX, minY, minZ + global space + global scale + #start = time.clock() + file = open(filename, "wb") + std=sys.stdout + sys.stdout=file + xfigheader() + figdata("xy")# xydata() + sys.stdout=std + Blender.Window.DrawProgressBar(1.0, '') # clear progressbar + file.close() + #end = time.clock() + #seconds = " in %.2f %s" % (end-start, "seconds") + message = "Successfully exported " + Blender.sys.basename(filename)# + seconds + print message + +def writexz(filename): + """writes the x-z view file exported""" + global space,maxX,maxY,maxZ, scale + #start = time.clock() + file = open(filename, "wb") + std=sys.stdout + sys.stdout=file + xfigheader() + figdata("xz")#xzdata() + sys.stdout=std + Blender.Window.DrawProgressBar(1.0, '') # clear progressbar + file.close() + #end = time.clock() + #seconds = " in %.2f %s" % (end-start, "seconds") + message = "Successfully exported " + Blender.sys.basename(filename)# + seconds + print message + +def writeyz(filename): + """writes the y-z view file exported""" + global maxX, maxY, maxZ, minX, minY, minZ,scale + #start = time.clock() + file = open(filename, "wb") + + std=sys.stdout + sys.stdout=file + + xfigheader() + figdata("yz")#yzdata() + sys.stdout=std + Blender.Window.DrawProgressBar(1.0, '') # clear progressbar + file.close() + #end = time.clock() + #seconds = " in %.2f %s" % (end-start, "seconds") + message = "Successfully exported " + Blender.sys.basename(filename)# + seconds + print message + +def writeall(filename): + """writes all 3 views + + Every view is a combined object in the resulting xfig. file.""" + global maxX, maxY, maxZ, minX, minY, minZ,scale + #start = time.clock() + file = open(filename, "wb") + + std=sys.stdout + sys.stdout=file + + xfigheader() + print "#upper view (7)" + print "6 % i % i % i % i ", minX, minY, maxX, maxY + figdata("xy") #xydata() + print "-6" + print "#bottom view (1)" + print "6 %i %i %i %i", minX, -minZ+maxZ-minY +space, maxX,-maxZ+maxZ-minY +space + figdata ("xz") #xzdata() + print "-6" + + print "#right view (3)" + print "6 %i %i %i %i", minX, minZ-maxZ-maxX-space, maxX,maxZ-maxZ-maxX-space + figdata ("yz") #yzdata() + print "-6" + + sys.stdout=std + Blender.Window.DrawProgressBar(1.0, '') # clear progressbar + file.close() + #end = time.clock() + #seconds = " in %.2f %s" % (end-start, "seconds") + message = "Successfully exported " + Blender.sys.basename(filename)# + seconds + + +#********************************************************USER INTERFACE***************************************************** +#********************************************************USER INTERFACE***************************************************** +#********************************************************USER INTERFACE***************************************************** +def gui(): # the function to draw the screen + global mystring, mymsg, toggle, sel3files, scale + global guiret1, guiret2, guiret3, guiret4, guiret5, guiret6, guiret7 + global ScalePopup, SpacePopup, boolmode, guiscale,hidden_flag + if len(mystring) > 90: mystring = "" + BGL.glClearColor(0,0,1,1) + BGL.glClear(BGL.GL_COLOR_BUFFER_BIT) + BGL.glColor3f(1,1,1) + guiret2=Draw.PushButton("Cancel", 2, 10, 10, 55, 20,"Cancel") + guiret3=Draw.Toggle("1 file per view", 3, 10, 40, 110,20, sel3files, "3 files") + guiret4=Draw.PushButton("Export", 4, 70, 10, 70, 20, "Select filename and export") + + ScalePopup=Draw.Number("Scale", 5, 10,70, 110,20, guiscale, 0.0001, 1000.1, "Scaling factor") + SpacePopup=Draw.Number("Space", 6, 10,90, 110,20, space, 0, 10000, "Space between projections") + + guiret5=Draw.Toggle("cm", 7, 120,70, 40,20, boolmode, "set scale to 1 blender unit = 1 cm in xfig") + guiret6=Draw.Toggle("in", 8, 162,70, 40,20, not boolmode, "set scale to 1 blender unit = 1 in in xfig") +# guiret7 = guiret6=Draw.Toggle("only visible", 9, 120,90, 82,20, hidden_flag, "hidden faces") + + + BGL.glRasterPos2i(72, 16) + if toggle: toggle_state = "down" + else: toggle_state = "up" + #Draw.Text("The toggle button is %s." % toggle_state, "small") + BGL.glRasterPos2i(10, 230) + #Draw.Text("Type letters from a to z, ESC to leave.") + BGL.glRasterPos2i(20, 200) + Draw.Text(mystring) + BGL.glColor3f(1,0.4,0.3) + BGL.glRasterPos2i(340, 70) + Draw.Text(mymsg, "tiny") + + +def event(evt, val): # the function to handle input events + Draw.Redraw(1) + +def button_event(evt): # the function to handle Draw Button events + global toggle, guiret5,scale, space, SpacePopup, boolmode, dimscale, guiscale + global hidden_flag, sel3files + if evt==1: + toggle = 1 - toggle + Draw.Redraw(1) + if evt==2: + Draw.Exit() + return + if evt==3: + sel3files = 1-sel3files + Draw.Redraw(1) + if evt==4: + Blender.Window.FileSelector(fs_callback, "Export fig") + Draw.Exit() + return + if evt==5: + guiscale = ScalePopup.val + scale=dimscale*guiscale + Draw.Redraw(1) + if evt==6: + space =SpacePopup.val + if evt==7: + boolmode=1 + dimscale=450 #converting to cm + scale = dimscale*guiscale + Draw.Redraw(1) + if evt==8: + boolmode=0 + dimscale = 1200 + scale = dimscale*guiscale + Draw.Redraw(1) + if evt==9: + hidden_flag=1-hidden_flag + Draw.Redraw(1) + +Draw.Register(gui, event, button_event) # registering the 3 callbacks + +def fs_callback(filename): + if filename.find('.fig', -4) > 0: filename = filename[:-4] + getmaxmin() + if sel3files: + writexy(filename+"_XY.fig") + writexz(filename+"_XZ.fig") + writeyz(filename+"_YZ.fig") + writeall(filename+"_ALL.fig") + print scale + Draw.Exit() |