[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29640] branches/blender2.4/release/ scripts: DXF-exporter script update: v1.37 - 2010.06.23 by migius

Remigiusz Fiedler migius at gmx.net
Wed Jun 23 11:14:23 CEST 2010


Revision: 29640
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29640
Author:   migius
Date:     2010-06-23 11:14:22 +0200 (Wed, 23 Jun 2010)

Log Message:
-----------
DXF-exporter script update: v1.37 - 2010.06.23 by migius
- APPLY-MODIFIER: added exception for modifier-free instances to export them as BLOCK/INSERTs

DXF-export library update: v1.35 - 2010.06.23 by migius
 - added (as default) writing to DXF file without RAM-buffering: faster and low-RAM-machines friendly

Modified Paths:
--------------
    branches/blender2.4/release/scripts/bpymodules/dxfLibrary.py
    branches/blender2.4/release/scripts/export_dxf.py

Modified: branches/blender2.4/release/scripts/bpymodules/dxfLibrary.py
===================================================================
--- branches/blender2.4/release/scripts/bpymodules/dxfLibrary.py	2010-06-23 08:18:14 UTC (rev 29639)
+++ branches/blender2.4/release/scripts/bpymodules/dxfLibrary.py	2010-06-23 09:14:22 UTC (rev 29640)
@@ -1,9 +1,9 @@
 #dxfLibrary.py : provides functions for generating DXF files
 # --------------------------------------------------------------------------
-__version__ = "v1.34 - 2010.06.20"
+__version__ = "v1.35 - 2010.06.23"
 __author__ = "Stani Michiels(Stani), Remigiusz Fiedler(migius)"
 __license__ = "GPL"
-__url__ = "http://wiki.blender.org/index.php/Scripts/Manual/Export/autodesk_dxf"
+__url__ = "http://wiki.blender.org/index.php/Extensions:2.4/Py/Scripts/Export/DXF"
 __bpydoc__ ="""The library to export geometry data to DXF format r12 version.
 
 Copyright %s
@@ -18,12 +18,14 @@
 -
 
 TODO:
-- add support for DXFr14 (needs extended file header)
-- add support for SPLINEs (possible first in DXFr14 version)
-- add support for MTEXT
+- add support for DXFr14 version (needs extended file header)
+- add support for DXF-SPLINEs (possible first in DXFr14 version)
+- add support for DXF-MTEXT
 - add user preset for floating point precision (3-16?)
 
 History
+v1.35 - 2010.06.23 by migius
+ - added (as default) writing to DXF file without RAM-buffering: faster and low-RAM-machines friendly
 v1.34 - 2010.06.20 by migius
  - bugfix POLYFACE
  - added DXF-flags for POLYLINE and VERTEX class (NURBS-export)
@@ -760,10 +762,11 @@
 		self.vports=copy.copy(vports)
 		self.blocks=copy.copy(blocks)
 		self.fileName=fileName
+		#print 'deb: blocks=',blocks #----------
 		#private
 		#self.acadver='9\n$ACADVER\n1\nAC1006\n'
 		self.acadver='  9\n$ACADVER\n  1\nAC1009\n'
-		"""DXF AutoCAD-Release format codes
+		"""DXF AutoCAD-Release format codes:
 		AC1021  2008, 2007 
 		AC1018  2006, 2005, 2004 
 		AC1015  2002, 2000i, 2000 
@@ -808,24 +811,46 @@
 				self._table('view',[str(x) for x in self.views]),
 		]
 		tables=self._section('tables',tables)
-
 		blocks=self._section('blocks',[str(x) for x in self.blocks])
-
 		entities=self._section('entities',[str(x) for x in self.entities])
-
 		all=''.join([header,tables,blocks,entities,'  0\nEOF\n'])
 		return all
+		
+	def _write_section(self,file,name,data):
+		file.write('  0\nSECTION\n  2\n%s\n'%name.upper())
+		for x in data:
+			file.write(str(x))
+		file.write('  0\nENDSEC\n')
 
-	def saveas(self,fileName):
+	def saveas(self,fileName,buffer=0):
+		"""Writes DXF file. Needs target file name. If optional parameter buffer>0, then switch to old behavior: store entire output string in RAM.
+		"""
 		self.fileName=fileName
-		self.save()
+		if buffer: self.save()
+		else: self.export()
 
 	def save(self):
-		test=open(self.fileName,'w')
-		test.write(str(self))
-		test.close()
+		outfile=open(self.fileName,'w')
+		outfile.write(str(self))
+		outfile.close()
 
+	def export(self):
+		outfile=open(self.fileName,'w')
+		header=[self.acadver]+[self._point(attr,getattr(self,attr))+'\n' for attr in _HEADER_POINTS]
+		self._write_section(outfile,'header',header)
+		tables=[self._table('vport',[str(x) for x in self.vports]),
+			self._table('ltype',[str(x) for x in self.linetypes]),
+			self._table('layer',[str(x) for x in self.layers]),
+			self._table('style',[str(x) for x in self.styles]),
+			self._table('view',[str(x) for x in self.views]),
+			]
+		self._write_section(outfile,'tables',tables)
+		self._write_section(outfile,'blocks',self.blocks)
+		self._write_section(outfile,'entities',self.entities)
+		outfile.write('  0\nEOF\n')
+		outfile.close()
 
+
 #---extras
 #-----------------------------------------------
 class Rectangle(_Entity):

Modified: branches/blender2.4/release/scripts/export_dxf.py
===================================================================
--- branches/blender2.4/release/scripts/export_dxf.py	2010-06-23 08:18:14 UTC (rev 29639)
+++ branches/blender2.4/release/scripts/export_dxf.py	2010-06-23 09:14:22 UTC (rev 29640)
@@ -7,7 +7,7 @@
  Tooltip: 'Export geometry to DXF/DWG-r12 (Drawing eXchange Format).'
 """
 
-__version__ = "1.36 - 2010.06.20"
+__version__ = "1.37 - 2010.06.23"
 __author__  = "Remigiusz Fiedler (AKA migius)"
 __license__ = "GPL"
 __url__  = "http://wiki.blender.org/index.php/Scripts/Manual/Export/autodesk_dxf"
@@ -34,7 +34,7 @@
 - export dupligroups and dupliverts as blocks (as option) 
 - optimize POLYFACE routine: remove double-vertices
 - fix support for X,Y-rotated curves(to POLYLINEs): fix blender negative-matrix.invert()
-- support hierarchies: groups, instances, parented structures
+- support hierarchies: groups, instances(done), parented structures
 - support n/f-gons as POLYFACEs with invisible edges
 - mapping materials to DXF-styles
 - ProgressBar
@@ -46,9 +46,11 @@
 - wip: fix support Include-Duplis, cause not conform with INSERT-method
 
 History
+v1.37 - 2010.06.23 by migius
+- APPLY-MODIFIER: added exception for modifier-free instances to export them as BLOCK/INSERTs
 v1.36 - 2010.06.20 by migius
-- added export Nurbs-Curve (3,4,5th-degree) into POLYLINE-NURBS(quad,cubic)
-  but no support for Bezier-Curves, because DXF doesnt support them
+- added export Nurbs-Curves (3,4,5th-degree) into POLYLINE-NURBS(quad,cubic)
+  caution: no Bezier-Curves support in autoCAD nor in DXF-specification
 v1.35 - 2009.06.18 by migius
 - export multiple-instances of Curve-Objects as BLOCK/INSERTs
 - added export Cameras (ortho and persp) to VPORTs, incl. clipping
@@ -512,17 +514,19 @@
 
 
 #-----------------------------------------------------
-def	exportMesh(ob, mx, mx_n, me=None, **common):
+def	exportMesh(ob, mx, mx_n, **common):
 	"""converts Mesh-Object to desired projection and representation(DXF-Entity type)
 	"""
 	global BLOCKREGISTRY
 	entities = []
 	block = None
 	#print 'deb:exportMesh() given common=', common #---------
-	if me==None:
-		me = ob.getData(mesh=1)
+	if ob.modifiers and APPLY_MODIFIERS:
+		me = Mesh.New()
+		me.getFromObject(ob) #this gets mesh with applied modifiers
 	else:
-		me.getFromObject(ob)
+		me = ob.getData(mesh=1) # is a Mesh if mesh>0 (otherwise it is a NMesh)
+	#print 'deb:exportMesh() mesh=', me #---------
 	# idea: me.transform(mx); get verts data; me.transform(mx_inv)= back to the origin state
 	# the .transform-method is fast, but bad, cause invasive:
 	# it manipulates original geometry and by retransformation lefts back rounding-errors
@@ -535,7 +539,7 @@
 		#print 'deb:exportMesh() me.name=', me.name #---------
 		#print 'deb:exportMesh() me.users=', me.users #---------
 		# check if there are more instances of this mesh (if used by other objects), then write to BLOCK/INSERT
-		if GUI_A['instances_on'].val and me.users>1 and not PROJECTION:
+		if INSTANCES and me.users>1 and not PROJECTION and not (ob.modifiers and APPLY_MODIFIERS):
 			if me.name in BLOCKREGISTRY.keys():
 				insert_name = BLOCKREGISTRY[me.name]
 				# write INSERT to entities
@@ -1008,7 +1012,7 @@
 	curve = ob.getData()
 	#print 'deb: curve=', dir(curve) #---------
 	# TODO: should be: if curve.users>1 and not (PERSPECTIVE or (PROJECTION and HIDDEN_MODE):
-	if GUI_A['instances_on'].val and curve.users>1 and not PROJECTION:
+	if INSTANCES and curve.users>1 and not PROJECTION:
 		if curve.name in BLOCKREGISTRY.keys():
 			insert_name = BLOCKREGISTRY[curve.name]
 			# write INSERT to entities
@@ -1547,8 +1551,9 @@
 	
 	#print 'deb: ViewMatrix=\n', mw #------------------
 	
-	if APPLY_MODIFIERS: tmp_me = Mesh.New('tmp')
-	else: tmp_me = None
+	#todo: fixme: seems to be the reason for missing BLOCK-export
+	#if APPLY_MODIFIERS: tmp_me = Mesh.New('tmp')
+	#else: tmp_me = None
 
 	if GUI_A['paper_space_on'].val==1: espace=1
 	else: espace=None
@@ -1585,7 +1590,7 @@
 					d.layers.append(DXF.Layer(color=tempcolor, name=elayer))
 
 			if (ob.type == 'Mesh') and GUI_B['bmesh'].val:
-				entities, block = exportMesh(ob, mx, mx_n, tmp_me,\
+				entities, block = exportMesh(ob, mx, mx_n, \
 						paperspace=espace, color=ecolor, layer=elayer, lineType=eltype)
 			elif (ob.type == 'Curve') and GUI_B['bcurve'].val:
 				entities, block = exportCurve(ob, mx, mw, \
@@ -2303,11 +2308,11 @@
 def update_globals():  #-----------------------------------------------------------------
 	""" update globals if GUI_A changed
 	"""
-	global  ONLYSELECTED,ONLYVISIBLE, DEBUG,\
+	global  ONLYSELECTED, ONLYVISIBLE, DEBUG,\
 	PROJECTION, HIDDEN_LINES,	CAMERA, \
 	G_SCALE, G_ORIGIN,\
 	PREFIX, LAYERNAME_DEF, LAYERCOLOR_DEF, LAYERLTYPE_DEF,\
-	APPLY_MODIFIERS, INCLUDE_DUPLIS,\
+	INSTANCES, APPLY_MODIFIERS, INCLUDE_DUPLIS,\
 	OUTPUT_DWG
 	#global POLYLINES
 	
@@ -2339,6 +2344,7 @@
 	LAYERCOLOR_DEF = GUI_A['layercolor_def'].val
 	LAYERLTYPE_DEF = layerltype_def_list[GUI_A['layerltype_def'].val]
 
+	INSTANCES = GUI_A['instances_on'].val
 	APPLY_MODIFIERS = GUI_A['apply_modifiers_on'].val
 	INCLUDE_DUPLIS = GUI_A['include_duplis_on'].val
 	OUTPUT_DWG = GUI_A['outputDWG_on'].val
@@ -2662,7 +2668,7 @@
 
 	y -= 30
 	b0, b0_ = but0c, but_0c + butt_margin +but_1c
-	GUI_A['only_selected_on'] = Draw.Toggle('Export Selection', EVENT_NONE, b0, y, b0_, 20, GUI_A['only_selected_on'].val, "Export only selected geometry   on/off")
+	GUI_A['only_selected_on'] = Draw.Toggle('Selected only', EVENT_NONE, b0, y, b0_, 20, GUI_A['only_selected_on'].val, "Export only selected geometry   on/off")
 	b0, b0_ = but2c, but_2c + butt_margin + but_3c
 	Draw.BeginAlign()
 	GUI_A['projection_on'] = Draw.Toggle('2d Projection', EVENT_REDRAW, b0, y, b0_, 20, GUI_A['projection_on'].val, "Export a 2d Projection according 3d-View or Camera-View   on/off")
@@ -3083,10 +3089,10 @@
 	if DXF:
 		print '\n\n\n'
 		print 'DXF-Exporter v%s *** start ***' %(__version__)   #---------------------
-		print 'with Library %s' %(DXF.__version__)   #---------------------
+		print '+DXF-Library %s' %(DXF.__version__)   #---------------------
 		if not DXF.copy:
-			print "DXF-Exporter: dxfLibrary.py script requires a full Python install"
-			Draw.PupMenu('Error%t|The dxfLibrary.py script requires a full Python install')
+			print "DXF-Exporter: dxfLibrary.py script requires a full Python installation"
+			Draw.PupMenu('Error%t|The dxfLibrary.py script requires a full Python installation')
 		else:
 			#Window.FileSelector(dxf_export_ui, 'EXPORT DXF', Blender.sys.makename(ext='.dxf'))
 			# recall last used DXF-file and INI-file names





More information about the Bf-blender-cvs mailing list