[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20712] trunk/blender/release/scripts/ export_dxf.py: DXF-Exporter script update
Remigiusz Fiedler
migius at gmx.net
Sun Jun 7 16:57:50 CEST 2009
Revision: 20712
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20712
Author: migius
Date: 2009-06-07 16:57:50 +0200 (Sun, 07 Jun 2009)
Log Message:
-----------
DXF-Exporter script update
v1.34 - 2009.06.07 by migius
- cleaning code for release
- fix nasty bug in getExtrusion()
- support text-objects, also in ortho/persp-projection
- support XYmirrored 2d-curves to 2dPOLYLINEs
Modified Paths:
--------------
trunk/blender/release/scripts/export_dxf.py
Modified: trunk/blender/release/scripts/export_dxf.py
===================================================================
--- trunk/blender/release/scripts/export_dxf.py 2009-06-07 14:53:08 UTC (rev 20711)
+++ trunk/blender/release/scripts/export_dxf.py 2009-06-07 14:57:50 UTC (rev 20712)
@@ -7,7 +7,7 @@
Tooltip: 'Export geometry to DXF/DWG-r12 (Drawing eXchange Format).'
"""
-__version__ = "1.34 - 2009.06.02"
+__version__ = "1.34 - 2009.06.07"
__author__ = "Remigiusz Fiedler (AKA migius)"
__license__ = "GPL"
__url__ = "http://wiki.blender.org/index.php/Scripts/Manual/Export/autodesk_dxf"
@@ -34,14 +34,19 @@
- export dupligroups and dupliverts as blocks (option for the user to decide)
- optimize POLYFACE routine: remove double-vertices
- optimize POLYFACE routine: remove loose vertices
-- support any-oriented mirrored curves(to POLYLINEs): fix blender negative-matrix.invert()
+- stable support X,Y-rotated curves(to POLYLINEs): fix blender negative-matrix.invert()
- support hierarchies: groups, instances, parented structures
- write drawing extends for automatic view positioning in CAD
- mapping materials to DXF-styles
+- wip: corrected text-objects in persp-projection
+- wip: fix filter out objects from inactive(off) layers
History
-v1.34 - 2009.06.02 by migius
-- support XYmirrored 2d-curves to POLYLINEs: works correct only for rotX,rotY==0.0
+v1.34 - 2009.06.07 by migius
+- cleaning code
+- fix nasty bug in getExtrusion()
+- support text-objects, also in ortho/persp-projection
+- support XYmirrored 2d-curves to 2dPOLYLINEs
- support thickness and elevation for curve-objects
- fix extrusion 210-code (3d orientation vector)
- fix POLYFACE export, synchronized with dxfLibrary.py
@@ -186,7 +191,7 @@
M_OBJ = 0
FILENAME_MAX = 180 #max length of path+file_name string (FILE_MAXDIR + FILE_MAXFILE)
-MAX_NAMELENGTH = 17 #max_effective_obnamelength in blender =21=17+(.001)
+NAMELENGTH_MAX = 80 #max_obnamelength in DXF, (limited to 256? )
INIFILE_DEFAULT_NAME = 'exportDXF'
INIFILE_EXTENSION = '.ini'
INIFILE_HEADER = '#ExportDXF.py ver.1.0 config data'
@@ -194,7 +199,6 @@
SCENE = None
WORLDX = Mathutils.Vector((1,0,0))
-#TODO: a bug? WORLDY = Mathutils.Vector((1,1,0))
WORLDY = Mathutils.Vector((0,1,0))
WORLDZ = Mathutils.Vector((0,0,1))
@@ -267,7 +271,7 @@
#----------------------------------------------
def gotoCAMERA():
cam = Object.Get(CAMERAS[CAMERA-1])
- print 'deb: CAMERA, cam',CAMERA, cam
+ #print 'deb: CAMERA, cam',CAMERA, cam
if cam.getType() != 'Camera':
sure = Draw.PupMenu("Info: %t| It is not a Camera Object.")
else:
@@ -278,7 +282,7 @@
updateMenuCAMERA()
-#------- Duplicats support ----------------------------------------------
+#------- Duplicates support ----------------------------------------------
def dupTest(object):
"""
Checks objects for duplicates enabled (any type)
@@ -296,8 +300,8 @@
"""
Return a list of real objects and duplicates and optionally their matrices
oblist: List of Blender Objects
- MATRICES: Boolean - Check to also get the objects matrices default=False
- HACK: Boolean - See note default=False
+ MATRICES: Boolean - Check to also get the objects matrices, default=False
+ HACK: Boolean - See note, default=False
Returns: List of objects or
List of tuples of the form:(ob,matrix) if MATRICES is set to True
NOTE: There is an ugly hack here that excludes all objects whose name
@@ -334,7 +338,7 @@
#-----------------------------------------------------
def hidden_status(faces, mx, mx_n):
# sort out back-faces = with normals pointed away from camera
- print 'HIDDEN_LINES: caution! not full implemented yet'
+ #print 'HIDDEN_LINES: caution! not full implemented yet'
front_faces = []
front_edges = []
for f in faces:
@@ -376,25 +380,6 @@
return front_faces, front_edges
-#--------not used-------------------------------------
-def projected_co0(vec, mw):
- # convert the world coordinates of vector to screen coordinates
- #co = vec.co.copy().resize4D()
- co = vec.copy().resize4D()
- co[3] = 1.0
- sc = co * mw
- #print 'deb: viewprojection=', sc #---------
- return [sc[0],sc[1],0.0]
-
-
-#--------not used---------------------------------------------
-def flatten(points, mw):
- for i,v in enumerate(points):
- v = projected_co(v, mw)
- points[i]=v
- #print 'deb: flatten points=', points #---------
- return points
-
#---- migration to 2.49-------------------------------------------------
if 'cross' in dir(Mathutils.Vector()):
#Draw.PupMenu('DXF exporter: Abort%t|This script version works for Blender up 2.49 only!')
@@ -411,41 +396,45 @@
#-----------------------------------------------------
def getExtrusion(matrix):
- #print 'deb:getExtrusion() given matrix=\n', matrix #---------
+ """calculates DXF-Extrusion = Arbitrary Xaxis and Zaxis vectors
+
+ """
AZaxis = matrix[2].copy().resize3D().normalize() # = ArbitraryZvector
Extrusion = [AZaxis[0],AZaxis[1],AZaxis[2]]
if AZaxis[2]==1.0:
Extrusion = None
- AXaxis = matrix[0].copy().resize3D() # = ArbitraryZvector
+ AXaxis = matrix[0].copy().resize3D() # = ArbitraryXvector
else:
threshold = 1.0 / 64.0
- if abs(AZaxis[0]) < threshold or abs(AZaxis[1]) < threshold:
+ if abs(AZaxis[0]) < threshold and abs(AZaxis[1]) < threshold:
# AXaxis is the intersection WorldPlane and ExtrusionPlane
AXaxis = M_CrossVecs(WORLDY,AZaxis)
else:
AXaxis = M_CrossVecs(WORLDZ,AZaxis)
-
#print 'deb:\n' #-------------
#print 'deb:getExtrusion() Extrusion=', Extrusion #---------
- return Extrusion, AXaxis.normalize()
+ return Extrusion, AXaxis.normalize()
+
#-----------------------------------------------------
def getZRotation(AXaxis, rot_matrix_invert):
- #ZRotation = Mathutils.AngleBetweenVecs(WORLDX,AXaxis) #output in degrees
-
- # this works: Xaxis is the obj.matrix Xaxis vector
+ """calculates ZRotation = angle between ArbitraryXvector and obj.matrix.Xaxis
+
+ """
+ # this works: Xaxis is the obj.matrix-Xaxis vector
+ # but not correct for all orientations
#Xaxis = matrix[0].copy().resize3D() # = ArbitraryXvector
##Xaxis.normalize() # = ArbitraryXvector
- #ZRotation = - d2r * Mathutils.AngleBetweenVecs(Xaxis,AXaxis) #output in degrees
+ #ZRotation = - Mathutils.AngleBetweenVecs(Xaxis,AXaxis) #output in radians
- # this works too, maybe faster
+ # this works for all orientations, maybe a bit faster
# transform AXaxis into OCS:Object-Coord-System
#rot_matrix = normalizeMat(matrix.rotationPart())
#rot_matrix_invert = rot_matrix.invert()
vec = AXaxis * rot_matrix_invert
##vec = AXaxis * matrix.copy().invert()
##vec.normalize() # not needed for atan2()
- ##print '\ndeb:getExtrusion() vec=', vec #---------
+ #print '\ndeb:getExtrusion() vec=', vec #---------
ZRotation = - atan2(vec[1],vec[0]) #output in radians
#print 'deb:ZRotation() ZRotation=', ZRotation*r2d #---------
@@ -464,15 +453,15 @@
#-----------------------------------------------------
-def projected_co(verts, mx):
- # converts world coordinates of points to screen coordinates
- temp_verts = []
- for v in verts:
- #temp_verts.append(Blender.Mesh.MVert(v.co))
- temp_verts.append(Mesh.MVert(v))
- #print 'deb: temp_verts=', temp_verts #---------
- for v in temp_verts:
- v.co *= mx
+def projected_co(verts, matrix):
+ """ converts coordinates of points from OCS to WCS->ScreenCS
+ needs matrix: a projection matrix
+ needs verts: a list of vectors[x,y,z]
+ returns a list of [x,y,z]
+ """
+ #print 'deb:projected_co() verts=', verts #---------
+ temp_verts = [Mathutils.Vector(v)*matrix for v in verts]
+ #print 'deb:projected_co() temp_verts=', temp_verts #---------
if GUI_A['Z_force_on'].val: locZ = GUI_A['Z_elev'].val
else: locZ = 0.0
@@ -481,13 +470,14 @@
if PERSPECTIVE:
clipStart = 10.0
for v in temp_verts:
- coef = - clipStart / v.co[2]
- v.co[0] *= coef
- v.co[1] *= coef
- v.co[2] = locZ
+ coef = - clipStart / v[2]
+ v[0] *= coef
+ v[1] *= coef
+ v[2] = locZ
for v in temp_verts:
- v.co[2] = locZ
- temp_verts = [v.co[:3] for v in temp_verts]
+ v[2] = locZ
+ temp_verts = [v[:3] for v in temp_verts]
+ #print 'deb:projected_co() out_verts=', temp_verts #---------
return temp_verts
@@ -503,10 +493,11 @@
#-----------------------------------------------------
def exportMesh(ob, mx, mx_n, me=None, **common):
- global APPLY_MODIFIERS
+ """converts Mesh-Object to desired projection and representation(DXF-Entity type)
+ """
entities = []
#print 'deb:exportMesh() common=', common #---------
- if me is None: # me means mesh
+ if me==None:
me = ob.getData(mesh=1)
else:
me.getFromObject(ob)
@@ -519,14 +510,14 @@
#print 'deb:exportMesh() started' #---------
allpoints = [v.co for v in me.verts]
allpoints = projected_co(allpoints, mx)
- if GUI_A['g_origin_on'].val: #TODO: scale and object orientation
+ if GUI_A['g_origin_on'].val:
for p in allpoints:
p[0] += G_ORIGIN[0]
p[1] += G_ORIGIN[1]
p[2] += G_ORIGIN[2]
faces=[]
edges=[]
- if me.faces and HIDDEN_LINES:
+ if me.faces and PROJECTION and HIDDEN_LINES:
if DEBUG: print 'deb:exportMesh HIDDEN_LINES mode' #---------
faces, edges = hidden_status(me.faces, mx, mx_n)
faces = [[v.index for v in me.faces[f_nr].verts] for f_nr in faces]
@@ -562,9 +553,24 @@
if allpoints:
#TODO: purge allpoints: left only vertices used by faces
if DEBUG: mesh_drawBlender(allpoints, None, faces) #deb: draw to scene
- faces = [[v+1 for v in f] for f in faces]
+# faces = [[v+1 for v in f] for f in faces]
+
+ verts_state= [0]*len(allpoints)
+ for f in faces:
+ for v in f:
+ verts_state[v]=1
+ if 0: # in verts_state: # if dirty state
+ i,new_position,newverts=0,[],[]
+ for used_i,used in enumerate(verts_state):
+ if used:
+ newverts.append(allpoints[used_i])
+ new_position.append(i)
+ i+=1
+ allpoints = newverts
+ faces = [[new_position[v]+1 for v in f] for f in faces]
+ else:
+ faces = [[v+1 for v in f] for f in faces]
dxfPOLYFACE = DXF.PolyLine([allpoints, faces], flag=64, **common)
- #dxfPOLYFACE = DXF.PolyLine([allpoints, faces], flag=64)
#print '\n deb: dxfPOLYFACE=',dxfPOLYFACE #-------------
entities.append(dxfPOLYFACE)
elif '3DFACEs'==c:
@@ -638,8 +644,10 @@
#-----------------------------------------------------
def exportEmpty(ob, mx, mw, **common):
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list