[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