[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16962] trunk/blender/release/scripts: DXF-Exporter update

Remigiusz Fiedler migius at 4d-vectors.de
Tue Oct 7 22:34:24 CEST 2008


Revision: 16962
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16962
Author:   migius
Date:     2008-10-07 22:34:24 +0200 (Tue, 07 Oct 2008)

Log Message:
-----------
DXF-Exporter update
v1.27 - 2008.10.07 by migius
- exclude Stani's DXF-Library to extern module
- add "hidden mode" substitut: back-faces removal
- add support for mesh ->POLYFACE
- optimized code for "Flat" procedure
- 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

Modified Paths:
--------------
    trunk/blender/release/scripts/export_dxf.py

Added Paths:
-----------
    trunk/blender/release/scripts/bpymodules/dxfLibrary.py

Added: trunk/blender/release/scripts/bpymodules/dxfLibrary.py
===================================================================
--- trunk/blender/release/scripts/bpymodules/dxfLibrary.py	                        (rev 0)
+++ trunk/blender/release/scripts/bpymodules/dxfLibrary.py	2008-10-07 20:34:24 UTC (rev 16962)
@@ -0,0 +1,708 @@
+#dxfLibrary.py : provides functions for generating DXF files
+# --------------------------------------------------------------------------
+__version__ = "v1.27beta - 2008.10.05"
+__author__  = "Stani Michiels(Stani), Remigiusz Fiedler(migius)"
+__license__ = "GPL"
+__url__	 = "http://wiki.blender.org/index.php/Scripts/Manual/Export/autodesk_dxf"
+__bpydoc__ ="""The script exports geometry data to DXF format r12 version.
+
+Copyright %s
+Version %s
+License %s
+Homepage %s
+
+See the homepage for documentation.
+url:
+
+IDEAs:
+-
+		
+TODO:
+-
+
+History
+v1.27 - 2008.10.07 by migius
+- beautifying output code: keys whitespace prefix
+- refactoring DXF-strings format: NewLine moved to the end of
+v1.26 - 2008.10.05 by migius
+- modif POLYLINE to support POLYFACE
+v1.25 - 2008.09.28 by migius
+- modif FACE class for r12
+v1.24 - 2008.09.27 by migius
+- modif POLYLINE class for r12
+- changing output format from r9 to r12(AC1009)
+v1.1 (20/6/2005) by www.stani.be/python/sdxf
+- Python library to generate dxf drawings
+______________________________________________________________
+""" % (__author__,__version__,__license__,__url__)
+
+# --------------------------------------------------------------------------
+# DXF Library: copyright (C) 2005 by Stani Michiels (AKA Stani)
+#                            2008 modif by Remigiusz Fiedler (AKA migius)
+# --------------------------------------------------------------------------
+# ***** 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 'deb: _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"""
+	out = '\n'.join([_point(plist[i],i)for i in range(len(plist))])
+	#print 'deb: points=\n', out #-------------------
+	return out
+
+#---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 =''
+		if parent.layer!=None: result+='  8\n%s\n'%parent.layer
+		if parent.color!=None: result+=' 62\n%s\n'%parent.color
+		if parent.extrusion!=None: result+='%s\n'%_point(parent.extrusion,200)
+		if parent.lineType!=None: result+='  6\n%s\n'%parent.lineType
+		#TODO: if parent.lineWeight!=None: result+='370\n%s\n'%parent.lineWeight
+		if parent.lineTypeScale!=None: result+=' 48\n%s\n'%parent.lineTypeScale
+		if parent.thickness!=None: result+=' 39\n%s\n'%parent.thickness
+		return result
+
+#--------------------------
+class _Entities:
+	"""Base class to deal with composed objects."""
+	def __dxf__(self):
+		return []
+
+	def __str__(self):
+		return ''.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%s\n 40\n%s\n 50\n%s\n 51\n%s\n'%\
+			   (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%s\n 40\n%s\n'%\
+			   (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):
+		out = '  0\n3DFACE\n%s%s\n' %(self._common(),_points(self.points))
+		#print 'deb:out=', out #-------------------
+		return out
+
+#-----------------------------------------------
+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\n  2\n%s\n%s\n%s\n'%\
+				(self.name,self._common(),_point(self.point))
+		if self.xscale!=None:result+=' 41\n%s\n'%self.xscale
+		if self.yscale!=None:result+=' 42\n%s\n'%self.yscale
+		if self.zscale!=None:result+=' 43\n%s\n'%self.zscale
+		if self.rotation:result+=' 50\n%s\n'%self.rotation
+		if self.cols!=None:result+=' 70\n%s\n'%self.cols
+		if self.colspacing!=None:result+=' 44\n%s\n'%self.colspacing
+		if self.rows!=None:result+=' 71\n%s\n'%self.rows
+		if self.rowspacing!=None:result+=' 45\n%s\n'%self.rowspacing
+		return result
+
+#-----------------------------------------------
+class Line(_Entity):
+	"""Line"""
+	def __init__(self,points,**common):
+		_Entity.__init__(self,**common)
+		self.points=points
+	def __str__(self):
+		return '  0\nLINE\n%s%s\n' %(
+				self._common(), _points(self.points))
+
+
+#-----------------------------------------------
+class PolyLine(_Entity):
+	def __init__(self,points,org_point=[0,0,0],flag=0,width=None,**common):
+		_Entity.__init__(self,**common)
+		self.points=points

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list