Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Musgrove <LetterRip@gmail.com>2006-01-13 03:24:23 +0300
committerTom Musgrove <LetterRip@gmail.com>2006-01-13 03:24:23 +0300
commit9b597819d6f57aa9a05e0ef4cc90fa703ae84ac8 (patch)
tree03746e371c48e56a6dd0b83c517db7d3bcee37bc /release
parentb367da593b2f9dc360d31b37c011d43609d8f221 (diff)
==python scripts==
added xfig exporter by Dino Ghilardi ply import and export in previous commit were by Bruce Merry
Diffstat (limited to 'release')
-rw-r--r--release/scripts/xfig_export.py441
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()