[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16821] trunk/blender/release/scripts/ export_dxf.py: DXF-Exporter script - initial commit
Remigiusz Fiedler
migius at 4d-vectors.de
Mon Sep 29 16:03:16 CEST 2008
Revision: 16821
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16821
Author: migius
Date: 2008-09-29 16:03:15 +0200 (Mon, 29 Sep 2008)
Log Message:
-----------
DXF-Exporter script - initial commit
Built on "Stanis Python Library for generating dxf drawing":
History:
v1.25 - 2008.09.28 by migius
- modif FACE class for r12
- add mesh-polygon -> Bezier-curve converter (Yorik's code)
- add support for curves ->POLYLINEs
- add "3d-View to Flat" - geometry projection to XY-plane
v1.24 - 2008.09.27 by migius
- add start UI with preferences
- modif POLYLINE class for r12
- changing output format from r9 to r12(AC1009)
v1.23 - 2008.09.26 by migius
- add finish message-box
v1.22 - 2008.09.26 by migius
- add support for curves ->LINEs
- add support for mesh-edges ->LINEs
v1.21 - 2008.06.04 by migius
- initial adaptation for Blender
v1.1 (20/6/2005) by www.stani.be/python/sdxf
- Python library to generate dxf drawings
Added Paths:
-----------
trunk/blender/release/scripts/export_dxf.py
Added: trunk/blender/release/scripts/export_dxf.py
===================================================================
--- trunk/blender/release/scripts/export_dxf.py (rev 0)
+++ trunk/blender/release/scripts/export_dxf.py 2008-09-29 14:03:15 UTC (rev 16821)
@@ -0,0 +1,860 @@
+#!BPY
+
+"""
+ Name: 'Autodesk DXF (.dxf)'
+ Blender: 247
+ Group: 'Export'
+ Tooltip: 'Export geometry to DXF-r12 (Drawing eXchange Format).'
+"""
+
+__version__ = "v1.25beta - 2008.09.28"
+__author__ = "Stani & migius(Remigiusz Fiedler)"
+__license__ = "GPL"
+__url__ = "http://wiki.blender.org/index.php/Scripts/Manual/Export/autodesk_dxf"
+__bpydoc__ ="""The script exports Blender geometry to DXF format r12 version.
+
+Copyright %s
+Version %s
+License %s
+Homepage %s
+
+See the homepage for documentation.
+url:
+""" % (__author__,__version__,__license__,__url__)
+
+"""
+IDEAs:
+ - correct normals for POLYLINE-POLYFACE objects via correct point-order
+ - HPGL output for 2d and flattened3d content
+
+TODO:
+ - support hierarchies: groups, instances, parented structures
+ - support 210-code (3d orientation vector)
+ - presets for architectural scales
+
+History
+v1.25 - 2008.09.28 by migius
+ - modif FACE class for r12
+ - add mesh-polygon -> Bezier-curve converter (Yorik's code)
+ - add support for curves ->POLYLINEs
+ - add "3d-View to Flat" - geometry projection to XY-plane
+v1.24 - 2008.09.27 by migius
+ - add start UI with preferences
+ - modif POLYLINE class for r12
+ - changing output format from r9 to r12(AC1009)
+v1.23 - 2008.09.26 by migius
+ - add finish message-box
+v1.22 - 2008.09.26 by migius
+ - add support for curves ->LINEs
+ - add support for mesh-edges ->LINEs
+v1.21 - 2008.06.04 by migius
+ - initial adaptation for Blender
+v1.1 (20/6/2005) by www.stani.be/python/sdxf
+ - Python library to generate dxf drawings
+______________________________________________________________
+"""
+# ***** BEGIN GPL LICENSE BLOCK *****
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# ***** END GPL LICENCE BLOCK *****
+
+
+import Blender
+from Blender import Mathutils, Window, Scene, sys, Draw
+import BPyMessages
+
+try:
+ import copy
+ #from struct import pack
+except:
+ copy = None
+
+####1) Private (only for developpers)
+_HEADER_POINTS=['insbase','extmin','extmax']
+
+#---helper functions-----------------------------------
+def _point(x,index=0):
+ """Convert tuple to a dxf point"""
+ #print '_point=', x #-------------
+ return '\n'.join(['%s\n%s'%((i+1)*10+index,x[i]) for i in range(len(x))])
+
+def _points(plist):
+ """Convert a list of tuples to dxf points"""
+ return [_point(plist[i],i)for i in range(len(plist))]
+
+#---base classes----------------------------------------
+class _Call:
+ """Makes a callable class."""
+ def copy(self):
+ """Returns a copy."""
+ return copy.deepcopy(self)
+
+ def __call__(self,**attrs):
+ """Returns a copy with modified attributes."""
+ copied=self.copy()
+ for attr in attrs:setattr(copied,attr,attrs[attr])
+ return copied
+
+#-------------------------------------------------------
+class _Entity(_Call):
+ """Base class for _common group codes for entities."""
+ def __init__(self,color=None,extrusion=None,layer='0',
+ lineType=None,lineTypeScale=None,lineWeight=None,
+ thickness=None,parent=None):
+ """None values will be omitted."""
+ self.color = color
+ self.extrusion = extrusion
+ self.layer = layer
+ self.lineType = lineType
+ self.lineTypeScale = lineTypeScale
+ self.lineWeight = lineWeight
+ self.thickness = thickness
+ self.parent = parent
+
+ def _common(self):
+ """Return common group codes as a string."""
+ if self.parent:parent=self.parent
+ else:parent=self
+ result='8\n%s'%parent.layer
+ if parent.color!=None: result+='\n62\n%s'%parent.color
+ if parent.extrusion!=None: result+='\n%s'%_point(parent.extrusion,200)
+ if parent.lineType!=None: result+='\n6\n%s'%parent.lineType
+ if parent.lineWeight!=None: result+='\n370\n%s'%parent.lineWeight
+ if parent.lineTypeScale!=None: result+='\n48\n%s'%parent.lineTypeScale
+ if parent.thickness!=None: result+='\n39\n%s'%parent.thickness
+ return result
+
+#--------------------------
+class _Entities:
+ """Base class to deal with composed objects."""
+ def __dxf__(self):
+ return []
+
+ def __str__(self):
+ return '\n'.join([str(x) for x in self.__dxf__()])
+
+#--------------------------
+class _Collection(_Call):
+ """Base class to expose entities methods to main object."""
+ def __init__(self,entities=[]):
+ self.entities=copy.copy(entities)
+ #link entities methods to drawing
+ for attr in dir(self.entities):
+ if attr[0]!='_':
+ attrObject=getattr(self.entities,attr)
+ if callable(attrObject):
+ setattr(self,attr,attrObject)
+
+####2) Constants
+#---color values
+BYBLOCK=0
+BYLAYER=256
+
+#---block-type flags (bit coded values, may be combined):
+ANONYMOUS =1 # This is an anonymous block generated by hatching, associative dimensioning, other internal operations, or an application
+NON_CONSTANT_ATTRIBUTES =2 # This block has non-constant attribute definitions (this bit is not set if the block has any attribute definitions that are constant, or has no attribute definitions at all)
+XREF =4 # This block is an external reference (xref)
+XREF_OVERLAY =8 # This block is an xref overlay
+EXTERNAL =16 # This block is externally dependent
+RESOLVED =32 # This is a resolved external reference, or dependent of an external reference (ignored on input)
+REFERENCED =64 # This definition is a referenced external reference (ignored on input)
+
+#---mtext flags
+#attachment point
+TOP_LEFT = 1
+TOP_CENTER = 2
+TOP_RIGHT = 3
+MIDDLE_LEFT = 4
+MIDDLE_CENTER = 5
+MIDDLE_RIGHT = 6
+BOTTOM_LEFT = 7
+BOTTOM_CENTER = 8
+BOTTOM_RIGHT = 9
+#drawing direction
+LEFT_RIGHT = 1
+TOP_BOTTOM = 3
+BY_STYLE = 5 #the flow direction is inherited from the associated text style
+#line spacing style (optional):
+AT_LEAST = 1 #taller characters will override
+EXACT = 2 #taller characters will not override
+
+#---polyline flags
+CLOSED =1 # This is a closed polyline (or a polygon mesh closed in the M direction)
+CURVE_FIT =2 # Curve-fit vertices have been added
+SPLINE_FIT =4 # Spline-fit vertices have been added
+POLYLINE_3D =8 # This is a 3D polyline
+POLYGON_MESH =16 # This is a 3D polygon mesh
+CLOSED_N =32 # The polygon mesh is closed in the N direction
+POLYFACE_MESH =64 # The polyline is a polyface mesh
+CONTINOUS_LINETYPE_PATTERN =128 # The linetype pattern is generated continuously around the vertices of this polyline
+
+#---text flags
+#horizontal
+LEFT = 0
+CENTER = 1
+RIGHT = 2
+ALIGNED = 3 #if vertical alignment = 0
+MIDDLE = 4 #if vertical alignment = 0
+FIT = 5 #if vertical alignment = 0
+#vertical
+BASELINE = 0
+BOTTOM = 1
+MIDDLE = 2
+TOP = 3
+
+####3) Classes
+#---entitities -----------------------------------------------
+#--------------------------
+class Arc(_Entity):
+ """Arc, angles in degrees."""
+ def __init__(self,center=(0,0,0),radius=1,
+ startAngle=0.0,endAngle=90,**common):
+ """Angles in degrees."""
+ _Entity.__init__(self,**common)
+ self.center=center
+ self.radius=radius
+ self.startAngle=startAngle
+ self.endAngle=endAngle
+ def __str__(self):
+ return '0\nARC\n%s\n%s\n40\n%s\n50\n%s\n51\n%s'%\
+ (self._common(),_point(self.center),
+ self.radius,self.startAngle,self.endAngle)
+
+#-----------------------------------------------
+class Circle(_Entity):
+ """Circle"""
+ def __init__(self,center=(0,0,0),radius=1,**common):
+ _Entity.__init__(self,**common)
+ self.center=center
+ self.radius=radius
+ def __str__(self):
+ return '0\nCIRCLE\n%s\n%s\n40\n%s'%\
+ (self._common(),_point(self.center),self.radius)
+
+#-----------------------------------------------
+class Face(_Entity):
+ """3dface"""
+ def __init__(self,points,**common):
+ _Entity.__init__(self,**common)
+ if len(points)<4: #fix for r12 format
+ points.append(points[-1])
+ self.points=points
+
+ def __str__(self):
+ return '\n'.join(['0\n3DFACE',self._common()]+
+ _points(self.points)
+ )
+#-----------------------------------------------
+class Insert(_Entity):
+ """Block instance."""
+ def __init__(self,name,point=(0,0,0),
+ xscale=None,yscale=None,zscale=None,
+ cols=None,colspacing=None,rows=None,rowspacing=None,
+ rotation=None,
+ **common):
+ _Entity.__init__(self,**common)
+ self.name=name
+ self.point=point
+ self.xscale=xscale
+ self.yscale=yscale
+ self.zscale=zscale
+ self.cols=cols
+ self.colspacing=colspacing
+ self.rows=rows
+ self.rowspacing=rowspacing
+ self.rotation=rotation
+
+ def __str__(self):
+ result='0\nINSERT\n2\n%s\n%s\n%s'%\
+ (self.name,self._common(),_point(self.point))
+ if self.xscale!=None:result+='\n41\n%s'%self.xscale
+ if self.yscale!=None:result+='\n42\n%s'%self.yscale
+ if self.zscale!=None:result+='\n43\n%s'%self.zscale
+ if self.rotation:result+='\n50\n%s'%self.rotation
+ if self.cols!=None:result+='\n70\n%s'%self.cols
+ if self.colspacing!=None:result+='\n44\n%s'%self.colspacing
+ if self.rows!=None:result+='\n71\n%s'%self.rows
+ if self.rowspacing!=None:result+='\n45\n%s'%self.rowspacing
+ return result
+
+#-----------------------------------------------
+class Line(_Entity):
+ """Line"""
+ def __init__(self,points,**common):
+ _Entity.__init__(self,**common)
+ self.points=points
+ def __str__(self):
+ return '\n'.join(['0\nLINE',self._common()]+
+ _points(self.points))
+
+#-----------------------------------------------
+class PolyLine(_Entity):
+ #TODO: Finish polyline (now implemented as a series of lines)
+ def __init__(self,points,org_point=[0,0,0],flag=0,width=None,**common):
+ _Entity.__init__(self,**common)
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list