[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11962] branches/2-44-stable/blender/ release/scripts/import_dxf.py: update from migius

Campbell Barton cbarton at metavr.com
Sat Sep 8 01:12:25 CEST 2007


Revision: 11962
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11962
Author:   campbellbarton
Date:     2007-09-08 01:12:24 +0200 (Sat, 08 Sep 2007)

Log Message:
-----------
update from migius

Modified Paths:
--------------
    branches/2-44-stable/blender/release/scripts/import_dxf.py

Modified: branches/2-44-stable/blender/release/scripts/import_dxf.py
===================================================================
--- branches/2-44-stable/blender/release/scripts/import_dxf.py	2007-09-07 12:29:41 UTC (rev 11961)
+++ branches/2-44-stable/blender/release/scripts/import_dxf.py	2007-09-07 23:12:24 UTC (rev 11962)
@@ -1,13 +1,13 @@
 #!BPY
 
 """
-Name: 'DXF (.dxf)'
+Name: 'Autodesk DXF (.dxf)'
 Blender: 244
 Group: 'Import'
 Tooltip: 'Import for DXF geometry data (Drawing eXchange Format).'
 """
 __author__ = 'Kitsu(Ed Blake) & migius(Remigiusz Fiedler)'
-__version__ = '1.0.beta09 by migius 19.08.2007'
+__version__ = '1.0.beta09 by migius 02.09.2007'
 __url__ = ["http://blenderartists.org/forum/showthread.php?t=84319",
 	 "http://wiki.blender.org/index.php/Scripts/Manual/Import/DXF-3D"]
 __email__ = ["Kitsune_e(at)yahoo.com", "remi_(at)gmx.de"]
@@ -18,41 +18,44 @@
 This version is focused on import of 3d-objects.
 
 Supported DXF Objects:
- LINE
- POINT
- SOLID
- TRACE
- INSERT  (=block)
- MINSERT (=array)
- CIRCLE
- ARC
- 3DFACE
- 2d-POLYLINE (incl.:arc-segments, variable-width-segments)
- 2d-POLYLINE (curved, spline)
- 3d-POLYLINE (curved, spline)
- 3d-POLYMESH
- 3d-POLYFACE
- TEXT
+LINE
+POINT
+SOLID
+TRACE
+TEXT
+INSERT (=block)
+MINSERT (=array)
+CIRCLE
+ARC
+3DFACE
+2d-POLYLINE (=plane, incl. arc, variable-width, curve, spline)
+3d-POLYLINE (=no-plane)
+3d-POLYMESH
+3d-POLYFACE
+under construction, partly supported DXF>r12:
+LWPOLYLINE (LightWeight), MLINE, MTEXT, ELLIPSE
 
-Supported DXF Objects: (*)-under construction
- *LWPOLYLINE (DXF>r12 LightWeight POLYLINE)
- *MTEXT   (DXF>r12)
- *ELLIPSE (DXF>r12)
+Unsupported DXF Objects:
+DXF r12: DIMENSION, XREF (External Reference)
+DXF>r12: SPLINE, GROUP, RAY/XLINE, LEADER, 3DSOLID, BODY, REGION, dynamic BLOCK
 
-Not supported DXF Objects:
- DIMENSION
- XREF (External Reference)
- SPLINE  (DXF>r12)
- GROUP   (DXF>r12)
- RAY/XLINE  (DXF>r12)
- LEADER  (DXF>r12)
- 3DSOLID, BODY, REGION (DXF>r12)
- dynamic BLOCK (DXF 2006)
+Supported Properties:
+Hierarchy: Entire DXF BLOCKs hierarchy is preserved after import into Blender
+visibility, frozen
+COLOR
+LAYER
+thickness
+width
+(todo: grouped, XDATA)
+It is recommended to use DXF-object properties for coding Blender materials.
 
 Notes:
 - Recommend that you run 'RemoveDoubles' on each imported mesh after using this script
 - Blocks are created on layer 19 then referenced at each insert point.
-
+* Big DXF-files (over 1500 objects) decrease import performance. The problem is not the inefficiency of python-scripting but Blenders performance in creating new objects in his database - probably a database management problem.
+* The Blender curves of imported ARCs and POLYLINE-arc-segments have light malformed ends.(to fix in beta10)
+- Bug in newScene-option: ARCs and CIRCLEs are drawn at (0,0,0). (wip)
+	
 TODO:  
 - filtering of unused/not-inserted Blocks
 - the new style object visibility
@@ -62,7 +65,7 @@
 
 
 History:
- v1.0 by migius 08.2007: "full 3d"-release
+ v1.0 08.2007 by migius: "full 3d"-release
     TODO:
  -- command-line-mode/batch-mode
  -- human-formating of data in INI-File
@@ -70,13 +73,18 @@
  -- suport for Ellipse
  -- suport for Mtext
  -- blender_object.ID.properties[dxf_layer_name]
+ -- Configuration files(.ini) can handle various material setups
  -- added f_layerFilter
  -- to-check: new_scene-idea from ideasman42: each import create a new scene
  -- to-check: obj/mat/group/_mapping-idea from ideasman42:
  -- better support for long dxf-layer-names 
  -- support width_force for LINEs/ARCs/CIRCLEs/ELLIPSEs = "solidify"
- beta09: 19.08.2007 by migius
- -- redesign UI: grouping of buttons
+ -- added fill/non-fill option for closed curves: CIRCLEs,PLINEs
+ -- bug:? Circle/Arcs in each "newScene" drawn at <0,0,0>
+ -- bug:? object = Object.Get(obname) -> = SCENE.getChildren(obname)
+ beta09: 02.09.2007 by migius
+ g5 redesign UI: grouping of buttons
+ g3 update multi-import-mode: <*.*> button
  g- added multi-import-mode: (path/*) for importing many dxf-files at once
  g- added import into newScene
  g- redesign UI: user presets, into newScene-import  
@@ -209,6 +217,7 @@
 G_SCALE = 1.0		#(0.0001-1000) global scaling factor for all dxf data
 MIN_DIST = 0.001	#cut-off value for sort out short-distance polyline-"duoble_vertex"
 ARC_RESOLUTION = 64   #(4-500) arc/circle resolution - number of segments
+ARC_RADIUS = 1.0   #(0.01-100) arc/circle radius for number of segments algorithm
 THIN_RESOLUTION = 8   #(4-500) thin_cylinder arc_resolution - number of segments
 MIN_THICK = MIN_DIST * 10.0  #minimal thickness by forced thickness
 MIN_WIDTH = MIN_DIST * 10.0  #minimal width by forced width
@@ -556,6 +565,7 @@
 			obname = activObjectName
 			#print 'deb:line.draw obname from activObjectName: ', obname #---------------------
 			ob = Object.Get(obname)  # open an existing mesh_object
+			#ob = SCENE.getChildren(obname)  # open an existing mesh_object
 			me = Mesh.Get(ob.name)	 # open objects mesh data
 		else:
 			obname = 'li_%s' %self.layer  # create object name from layer name
@@ -672,6 +682,7 @@
 				obname = activObjectName
 				#print 'deb:draw:point.ob obname from activObjectName: ', obname #---------------------
 				ob = Object.Get(obname)  # open an existing mesh_object
+				#ob = SCENE.getChildren(obname)  # open an existing mesh_object
 				me = Mesh.Get(ob.name)	 # open objects mesh data
 			else:
 				me = Mesh.New(obname)		   # create a new mesh
@@ -779,7 +790,8 @@
 					point2 = self.points[0]
 				else:
 					point2 = self.points[i+1]
-				verts = drawBulge(point, point2, settings.var['arc_res'])
+				arc_res = settings.var['arc_res']/sqrt(settings.var['arc_rad'])
+				verts = drawBulge(point, point2, arc_res)
 #				if i == len(self.points)-1:
 #					if self.closed:
 #						verts.pop() #remove last(=first) vertex
@@ -1105,8 +1117,7 @@
 				point1 = d_points[i]
 				point2 = d_points[i+1]
 				if point1.bulge and (i < len(d_points)-2 or self.closed):
-					arc_res = 8
-					verts = drawBulge(point1, point2, arc_res) #calculate additional points for bulge
+					verts = drawBulge(point1, point2, arc_res=8, curve_on=True) #calculate additional points for bulge
 					if i == 0: curve = pline.appendNurb(BezTriple.New(verts[0]))
 					else: curve.append(BezTriple.New(verts[0]))
 					curve[-1].handleTypes = [VECT, VECT]  #--todo--calculate bezier-tangents
@@ -1221,7 +1232,8 @@
 					ewidth = settings.var['width_min']
 
 			if point1.bulge and (i < (len(d_points)-2) or self.closed):
-				verts = drawBulge(point1, point2, settings.var['arc_res']) #calculate additional points for bulge
+				arc_res = settings.var['arc_res']/sqrt(settings.var['arc_rad'])
+				verts = drawBulge(point1, point2, arc_res) #calculate additional points for bulge
 				points.extend(verts)
 				delta_width = (ewidth - swidth) / len(verts)
 				width_list = [swidth + (delta_width * ii) for ii in xrange(len(verts)+1)]
@@ -1683,6 +1695,8 @@
 def set_thick(thickness, settings):
 	"""Set thickness relative to settings variables.
 	
+	Set thickness relative to settings variables:
+	'thick_on','thick_force','thick_min'.
 	python trick: sign(x)=cmp(x,0)
 	"""
 	if settings.var['thick_force']:
@@ -1883,12 +1897,14 @@
 			return ob
 
 		else:
-			if radius < 2 * settings.var['dist_min']: # if circumfence is very small
-				verts_num = settings.var['thin_res'] # set a fixed number of verts
-			else:
-				#verts = circ/settings.var['dist_min'] # figure out how many verts we need
-				verts_num = settings.var['arc_res'] # figure out how many verts we need
-				if verts_num > 500: verts_num = 500 # Blender accepts only values [3:500]
+#			if False: #if radius < 2 * settings.var['dist_min']: # if circumfence is very small
+#				verts_num = settings.var['thin_res'] # set a fixed number of verts
+#			else:
+#				#verts = circ/settings.var['dist_min'] # figure out how many verts we need
+#				verts_num = settings.var['arc_res'] # figure out how many verts we need
+			verts_num = settings.var['arc_res'] * sqrt(radius / settings.var['arc_rad'])
+			if verts_num > 100: verts_num = 100 # Blender accepts only values [3:500]
+			if verts_num < 4: verts_num = 4 # Blender accepts only values [3:500]
 			if thic != 0:
 				loc2 = thic * 0.5	#-----blenderAPI draw Cylinder with 2*thickness
 				self.loc[2] += loc2  #---new location for the basis of cylinder
@@ -1897,6 +1913,7 @@
 			else:
 				c = Mesh.Primitives.Circle(int(verts_num), radius*2)
 
+			c.update()
 			ob = SCENE.objects.new(c, obname) # create a new circle_mesh_object
 			ob.loc = tuple(self.loc)
 			transform(self.extrusion, 0, ob)
@@ -1991,7 +2008,9 @@
 
 		else:
 			arc = Mesh.New(obname)		   # create a new mesh
-			verts, edges = drawArc(None, radius, start, end, settings.var['arc_res'])
+			# set a number of segments in entire circle
+			arc_res = settings.var['arc_res'] * sqrt(radius) / sqrt(settings.var['arc_rad'])
+			verts, edges = drawArc(None, radius, start, end, arc_res)
 			if thic != 0:
 				len1 = len(verts)
 				thic_verts = []
@@ -2012,11 +2031,13 @@
 				arc.verts.extend(verts)	# add vertices to mesh
 				arc.edges.extend(edges)	 # add edges to the mesh
 
+			arc.update()
 			ob = SCENE.objects.new(arc) # create a new arc_object
+			#ob.link(arc)
 			ob.loc = tuple(center)
+			ob.loc = Mathutils.Vector(ob.loc)
 			transform(self.extrusion, 0, ob)
 			#ob.size = (1,1,1)
-	
 			return ob
 
 
@@ -2282,8 +2303,11 @@
 			radius = major.length
 			start = degrees(self.start_angle)
 			end = degrees(self.end_angle)
-			verts, edges = drawArc(None, radius, start, end, settings.var['arc_res'])
 
+			# set a number of segments in entire circle
+			arc_res = settings.var['arc_res'] * sqrt(radius) / sqrt(settings.var['arc_rad'])
+			verts, edges = drawArc(None, radius, start, end, arc_res)
+
 			if thic != 0:
 				len1 = len(verts)
 				thic_verts = []
@@ -2380,6 +2404,7 @@
 			obname = activObjectName
 			#print 'deb:face.draw obname from activObjectName: ', obname #---------------------
 			ob = Object.Get(obname)  # open an existing mesh_object
+			#ob = SCENE.getChildren(obname)  # open an existing mesh_object
 		else:
 			obname = 'fa_%s' %self.layer  # create object name from layer name
 			obname = obname[:MAX_NAMELENGTH]
@@ -2894,7 +2919,9 @@
 
 		# Set the visable layers
 		SCENE.setLayers([i+1 for i in range(18)])
-		Blender.Redraw(-1)
+		SCENE.update(1)
+		#Blender.Redraw(-1)
+		Blender.Redraw()
 
 		time_text = Blender.sys.time() - time2

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list