bugfix and updates for DXF-Importer/Exporter scripts

DXF-Library log:
v1.31 - 2009.06.02 by migius
 - modif _Entity class: added paperspace,elevation
v1.30 - 2009.05.28 by migius
 - bugfix 3dPOLYLINE/POLYFACE: VERTEX needs x,y,z coordinates, index starts with 1 not 0

DXF-Importer: minor changes

DXF-Exporter log:
v1.34 - 2009.06.02 by migius
- support XYmirrored 2d-curves to POLYLINEs: works correct only for rotX,rotY==0.0
- support thickness and elevation for curve-objects
- fix extrusion 210-code (3d orientation vector)
- fix POLYFACE export, synchronized with dxfLibrary.py
- changed to the new 2.49 method Vector.cross()
- output style manager (first try)
v1.33 - 2009.05.25 by migius
- bugfix flipping normals in mirrored mesh-objects
- added UI-Button for future Shadow Generator
- support curve objects in projection-2d mode
- UI stuff: camera selector/manager
This commit is contained in:
Remigiusz Fiedler 2009-06-04 19:49:19 +00:00
parent aa0f4fb694
commit 3cb4547b80
3 changed files with 329 additions and 175 deletions

@ -1,6 +1,6 @@
#dxfLibrary.py : provides functions for generating DXF files #dxfLibrary.py : provides functions for generating DXF files
# -------------------------------------------------------------------------- # --------------------------------------------------------------------------
__version__ = "v1.30 - 2009.05.28" __version__ = "v1.31 - 2009.06.02"
__author__ = "Stani Michiels(Stani), Remigiusz Fiedler(migius)" __author__ = "Stani Michiels(Stani), Remigiusz Fiedler(migius)"
__license__ = "GPL" __license__ = "GPL"
__url__ = "http://wiki.blender.org/index.php/Scripts/Manual/Export/autodesk_dxf" __url__ = "http://wiki.blender.org/index.php/Scripts/Manual/Export/autodesk_dxf"
@ -18,28 +18,30 @@ IDEAs:
- -
TODO: TODO:
- add support for DXFr14 (new file header) - add support for DXFr14 (needs extended file header)
- add support for SPLINEs, although it is DXFr14 object - add support for SPLINEs (possible first in DXFr14 version)
History History
v1.31 - 2009.06.02 by migius
- modif _Entity class: added paperspace,elevation
v1.30 - 2009.05.28 by migius v1.30 - 2009.05.28 by migius
- bugfix 3dPOLYLINE/POLYFACE: VERTEX needs x,y,z coordinates, index starts with 1 not 0 - bugfix 3dPOLYLINE/POLYFACE: VERTEX needs x,y,z coordinates, index starts with 1 not 0
v1.29 - 2008.12.28 by Yorik v1.29 - 2008.12.28 by Yorik
- modif POLYLINE to support bulge segments - modif POLYLINE to support bulge segments
v1.28 - 2008.12.13 by Steeve/BlenderArtists v1.28 - 2008.12.13 by Steeve/BlenderArtists
- bugfix for EXTMIN/EXTMAX to suit Cycas-CAD - bugfix for EXTMIN/EXTMAX to suit Cycas-CAD
v1.27 - 2008.10.07 by migius v1.27 - 2008.10.07 by migius
- beautifying output code: keys whitespace prefix - beautifying output code: keys whitespace prefix
- refactoring DXF-strings format: NewLine moved to the end of - refactoring DXF-strings format: NewLine moved to the end of
v1.26 - 2008.10.05 by migius v1.26 - 2008.10.05 by migius
- modif POLYLINE to support POLYFACE - modif POLYLINE to support POLYFACE
v1.25 - 2008.09.28 by migius v1.25 - 2008.09.28 by migius
- modif FACE class for r12 - modif FACE class for r12
v1.24 - 2008.09.27 by migius v1.24 - 2008.09.27 by migius
- modif POLYLINE class for r12 - modif POLYLINE class for r12
- changing output format from r9 to r12(AC1009) - changing output format from r9 to r12(AC1009)
v1.1 (20/6/2005) by www.stani.be/python/sdxf v1.1 (20/6/2005) by www.stani.be/python/sdxf
- Python library to generate dxf drawings - Python library to generate dxf drawings
______________________________________________________________ ______________________________________________________________
""" % (__author__,__version__,__license__,__url__) """ % (__author__,__version__,__license__,__url__)
@ -106,17 +108,21 @@ class _Call:
#------------------------------------------------------- #-------------------------------------------------------
class _Entity(_Call): class _Entity(_Call):
"""Base class for _common group codes for entities.""" """Base class for _common group codes for entities."""
def __init__(self,color=None,extrusion=None,layer='0', def __init__(self,paperspace=None,color=None,layer='0',
lineType=None,lineTypeScale=None,lineWeight=None, lineType=None,lineTypeScale=None,lineWeight=None,
thickness=None,parent=None): extrusion=None,elevation=None,thickness=None,
parent=None):
"""None values will be omitted.""" """None values will be omitted."""
self.paperspace = paperspace
self.color = color self.color = color
self.extrusion = extrusion
self.layer = layer self.layer = layer
self.lineType = lineType self.lineType = lineType
self.lineTypeScale = lineTypeScale self.lineTypeScale = lineTypeScale
self.lineWeight = lineWeight self.lineWeight = lineWeight
self.extrusion = extrusion
self.elevation = elevation
self.thickness = thickness self.thickness = thickness
#self.visible = visible
self.parent = parent self.parent = parent
def _common(self): def _common(self):
@ -124,13 +130,16 @@ class _Entity(_Call):
if self.parent:parent=self.parent if self.parent:parent=self.parent
else:parent=self else:parent=self
result ='' result =''
if parent.paperspace==1: result+=' 67\n1\n'
if parent.layer!=None: result+=' 8\n%s\n'%parent.layer if parent.layer!=None: result+=' 8\n%s\n'%parent.layer
if parent.color!=None: result+=' 62\n%s\n'%parent.color 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 if parent.lineType!=None: result+=' 6\n%s\n'%parent.lineType
#TODO: if parent.lineWeight!=None: result+='370\n%s\n'%parent.lineWeight #TODO: if parent.lineWeight!=None: result+='370\n%s\n'%parent.lineWeight
#TODO: if parent.visible!=None: result+='60\n%s\n'%parent.visible
if parent.lineTypeScale!=None: result+=' 48\n%s\n'%parent.lineTypeScale if parent.lineTypeScale!=None: result+=' 48\n%s\n'%parent.lineTypeScale
if parent.elevation!=None: result+=' 38\n%s\n'%parent.elevation
if parent.thickness!=None: result+=' 39\n%s\n'%parent.thickness if parent.thickness!=None: result+=' 39\n%s\n'%parent.thickness
if parent.extrusion!=None: result+='%s\n'%_point(parent.extrusion,200)
return result return result
#-------------------------- #--------------------------

@ -7,7 +7,7 @@
Tooltip: 'Export geometry to DXF/DWG-r12 (Drawing eXchange Format).' Tooltip: 'Export geometry to DXF/DWG-r12 (Drawing eXchange Format).'
""" """
__version__ = "1.34 - 2009.05.28" __version__ = "1.34 - 2009.06.02"
__author__ = "Remigiusz Fiedler (AKA migius)" __author__ = "Remigiusz Fiedler (AKA migius)"
__license__ = "GPL" __license__ = "GPL"
__url__ = "http://wiki.blender.org/index.php/Scripts/Manual/Export/autodesk_dxf" __url__ = "http://wiki.blender.org/index.php/Scripts/Manual/Export/autodesk_dxf"
@ -28,25 +28,27 @@ See the homepage for documentation.
url: %s url: %s
IDEAs: IDEAs:
- correct normals for POLYLINE-POLYFACE via proper vertex-order
- HPGL output, especially usefull for correct scaled printing of 2d drawings - HPGL output, especially usefull for correct scaled printing of 2d drawings
TODO: TODO:
- export dupligroups and dupliverts as blocks ( option for the user to decide ) - export dupligroups and dupliverts as blocks (option for the user to decide)
- optimize POLYFACE routine: remove double-vertices - optimize POLYFACE routine: remove double-vertices
- optimize POLYFACE routine: remove unused vertices - optimize POLYFACE routine: remove loose vertices
- support any-oriented mirrored curves(to POLYLINEs): fix blender negative-matrix.invert()
- support hierarchies: groups, instances, parented structures - support hierarchies: groups, instances, parented structures
- support 210-code (3d orientation vector)
- write drawing extends for automatic view positioning in CAD - write drawing extends for automatic view positioning in CAD
- support mapping: materials to DXF-styles - mapping materials to DXF-styles
History History
v1.34 - 2009.05.28 by migius v1.34 - 2009.06.02 by migius
- bugfix POLYFACE export, synchronized with dxfLibrary.py - support XYmirrored 2d-curves to POLYLINEs: works correct only for rotX,rotY==0.0
- support thickness and elevation for curve-objects
- fix extrusion 210-code (3d orientation vector)
- fix POLYFACE export, synchronized with dxfLibrary.py
- changed to the new 2.49 method Vector.cross() - changed to the new 2.49 method Vector.cross()
- output style manager (first try) - output style manager (first try)
v1.33 - 2009.05.25 by migius v1.33 - 2009.05.25 by migius
- bugfix flipping normals in mirrored objects - bugfix flipping normals in mirrored mesh-objects
- added UI-Button for future Shadow Generator - added UI-Button for future Shadow Generator
- support curve objects in projection-2d mode - support curve objects in projection-2d mode
- UI stuff: camera selector/manager - UI stuff: camera selector/manager
@ -122,7 +124,7 @@ ______________________________________________________________
import Blender import Blender
from Blender import Mathutils, Window, Scene, Draw, Camera, BezTriple from Blender import Mathutils, Window, Scene, Draw, Camera, BezTriple
from Blender import Registry, Object, Mesh from Blender import Registry, Object, Mesh, Curve
import os import os
import subprocess import subprocess
@ -132,10 +134,11 @@ import dxfLibrary as DXF
#from dxfLibrary import * #from dxfLibrary import *
import math import math
from math import atan, log10 from math import atan, atan2, log10, sin, cos
#pi = math.pi #pi = math.pi
#pi = 3.14159265359 #pi = 3.14159265359
r2d = 180.0 / math.pi
d2r = math.pi / 180.0 d2r = math.pi / 180.0
#note: d2r * angle == math.radians(angle) #note: d2r * angle == math.radians(angle)
@ -392,26 +395,72 @@ def flatten(points, mw):
#print 'deb: flatten points=', points #--------- #print 'deb: flatten points=', points #---------
return points return points
#---- migration to 2.49-------------------------------------------------
if 'cross' in dir(Mathutils.Vector()):
#Draw.PupMenu('DXF exporter: Abort%t|This script version works for Blender up 2.49 only!')
def M_CrossVecs(v1,v2):
return v1.cross(v2) #for up2.49
def M_DotVecs(v1,v2):
return v1.dot(v2) #for up2.49
else:
def M_CrossVecs(v1,v2):
return Mathutils.CrossVecs(v1,v2) #for pre2.49
def M_DotVecs(v1,v2):
return Mathutils.DotVecs(v1,v2) #for pre2.49
#----------------------------------------------------- #-----------------------------------------------------
def getExtrusion(matrix): def getExtrusion(matrix):
#print 'deb:getExtrusion() given matrix=\n', matrix #---------
print 'deb:getExtrusion() matrix=\n', matrix #--------- AZaxis = matrix[2].copy().resize3D().normalize() # = ArbitraryZvector
ma = matrix.copy().normalize() Extrusion = [AZaxis[0],AZaxis[1],AZaxis[2]]
AZaxis = ma[2] # = ArbitraryZvector if AZaxis[2]==1.0:
ArbitraryZaxis = [AZaxis[0],AZaxis[1],AZaxis[2]] Extrusion = None
threshold = 1.0 / 64.0 AXaxis = matrix[0].copy().resize3D() # = ArbitraryZvector
if abs(Zaxis[0]) < threshold or abs(Zaxis[1]) < threshold:
#AXaxis = Mathutils.CrossVecs(WORLDY,AZaxis) #for<2.49
AXaxis = WORLDY.cross(AZaxis)
else: else:
#AXaxis = Mathutils.CrossVecs(WORLDZ,AZaxis) #for<2.49 threshold = 1.0 / 64.0
AXaxis = WORLDZ.cross(AZaxis) if abs(AZaxis[0]) < threshold or abs(AZaxis[1]) < threshold:
# AXaxis is the intersection WorldPlane and ExtrusionPlane
AXaxis = M_CrossVecs(WORLDY,AZaxis)
else:
AXaxis = M_CrossVecs(WORLDZ,AZaxis)
Rotation = Mathutils.AngleBetweenVecs(WORLDX,AXaxis) #output in degrees #print 'deb:\n' #-------------
Elevation = 1.0 #print 'deb:getExtrusion() Extrusion=', Extrusion #---------
return Extrusion, AXaxis.normalize()
return ArbitraryZaxis, Rotation, Elevation #-----------------------------------------------------
def getZRotation(AXaxis, rot_matrix_invert):
#ZRotation = Mathutils.AngleBetweenVecs(WORLDX,AXaxis) #output in degrees
# this works: Xaxis is the obj.matrix Xaxis vector
#Xaxis = matrix[0].copy().resize3D() # = ArbitraryXvector
##Xaxis.normalize() # = ArbitraryXvector
#ZRotation = - d2r * Mathutils.AngleBetweenVecs(Xaxis,AXaxis) #output in degrees
# this works too, maybe faster
# transform AXaxis into OCS:Object-Coord-System
#rot_matrix = normalizeMat(matrix.rotationPart())
#rot_matrix_invert = rot_matrix.invert()
vec = AXaxis * rot_matrix_invert
##vec = AXaxis * matrix.copy().invert()
##vec.normalize() # not needed for atan2()
##print '\ndeb:getExtrusion() vec=', vec #---------
ZRotation = - atan2(vec[1],vec[0]) #output in radians
#print 'deb:ZRotation() ZRotation=', ZRotation*r2d #---------
return ZRotation
#------------------------------------------
def normalizeMat(matrix):
mat12 = matrix.copy()
mat12 = [Mathutils.Vector(v).normalize() for v in mat12]
if len(mat12)>3:
matr12 = Mathutils.Matrix(mat12[0],mat12[1],mat12[2],mat12[3])
else:
matr12 = Mathutils.Matrix(mat12[0],mat12[1],mat12[2])
return matr12
#----------------------------------------------------- #-----------------------------------------------------
@ -422,12 +471,12 @@ def projected_co(verts, mx):
#temp_verts.append(Blender.Mesh.MVert(v.co)) #temp_verts.append(Blender.Mesh.MVert(v.co))
temp_verts.append(Mesh.MVert(v)) temp_verts.append(Mesh.MVert(v))
#print 'deb: temp_verts=', temp_verts #--------- #print 'deb: temp_verts=', temp_verts #---------
for v in temp_verts:
v.co *= mx
if GUI_A['Z_force_on'].val: locZ = GUI_A['Z_elev'].val if GUI_A['Z_force_on'].val: locZ = GUI_A['Z_elev'].val
else: locZ = 0.0 else: locZ = 0.0
for v in temp_verts:
v.co *= mx
if PROJECTION: if PROJECTION:
if PERSPECTIVE: if PERSPECTIVE:
clipStart = 10.0 clipStart = 10.0
@ -446,10 +495,8 @@ def projected_co(verts, mx):
def isLeftHand(matrix): def isLeftHand(matrix):
#Is the matrix a left-hand-system, or not? #Is the matrix a left-hand-system, or not?
ma = matrix.rotationPart() ma = matrix.rotationPart()
#crossXY = Mathutils.CrossVecs(ma[0], ma[1]) #for<2.49 crossXY = M_CrossVecs(ma[0], ma[1])
crossXY = ma[0].cross(ma[1]) check = M_DotVecs(ma[2], crossXY)
#check = Mathutils.DotVecs(ma[2], crossXY) #for<2.49
check = ma[2].dot(crossXY)
if check < 0.00001: return 1 if check < 0.00001: return 1
return 0 return 0
@ -501,7 +548,7 @@ def exportMesh(ob, mx, mx_n, me=None, **common):
c = mesh_as_list[GUI_A['mesh_as'].val] c = mesh_as_list[GUI_A['mesh_as'].val]
if 'POINTs'==c: # export Mesh as multiple POINTs if 'POINTs'==c: # export Mesh as multiple POINTs
for p in allpoints: for p in allpoints:
dxfPOINT = DXF.Point(p, **common) dxfPOINT = DXF.Point(points=[p],**common)
entities.append(dxfPOINT) entities.append(dxfPOINT)
elif 'LINEs'==c or (not faces): elif 'LINEs'==c or (not faces):
if edges and allpoints: if edges and allpoints:
@ -517,7 +564,6 @@ def exportMesh(ob, mx, mx_n, me=None, **common):
if DEBUG: mesh_drawBlender(allpoints, None, faces) #deb: draw to scene if DEBUG: mesh_drawBlender(allpoints, None, faces) #deb: draw to scene
faces = [[v+1 for v in f] for f in faces] faces = [[v+1 for v in f] for f in faces]
dxfPOLYFACE = DXF.PolyLine([allpoints, faces], flag=64, **common) dxfPOLYFACE = DXF.PolyLine([allpoints, faces], flag=64, **common)
#dxfPOLYFACE = DXF.PolyLine([allpoints, faces],org_point=[0,0,0], flag=64,width=None, **common)
#dxfPOLYFACE = DXF.PolyLine([allpoints, faces], flag=64) #dxfPOLYFACE = DXF.PolyLine([allpoints, faces], flag=64)
#print '\n deb: dxfPOLYFACE=',dxfPOLYFACE #------------- #print '\n deb: dxfPOLYFACE=',dxfPOLYFACE #-------------
entities.append(dxfPOLYFACE) entities.append(dxfPOLYFACE)
@ -591,30 +637,75 @@ def curve_drawBlender(vertList, org_point=[0.0,0.0,0.0], closed=0, name="dxfCurv
#----------------------------------------------------- #-----------------------------------------------------
def exportEmpty(ob, mx, mw, _common=None): def exportEmpty(ob, mx, mw, **common):
entities = [] p = Mathutils.Vector(ob.loc)
print 'is it a vector?:', p
[p] = projected_co([p], mx)
if GUI_A['g_origin_on'].val: #TODO: scale and object orientation
p[0] += G_ORIGIN[0]
p[1] += G_ORIGIN[1]
p[2] += G_ORIGIN[2]
if GUI_A['empty_as'].val==1: # export Empty as POINT entities = []
p = ob.loc c = empty_as_list[GUI_A['empty_as'].val]
dxfPOINT = Point(p) if c=="POINT": # export Empty as POINT
dxfPOINT = DXF.Point(points=[p],**common)
entities.append(dxfPOINT) entities.append(dxfPOINT)
return entities return entities
#----------------------------------------------------- #-----------------------------------------------------
def exportCurve(ob, mx, mw, _common=None): def exportCurve(ob, mx, mw, **common):
entities = [] entities = []
curve = ob.getData() curve = ob.getData()
Thickness,Extrusion,ZRotation,Elevation = None,None,None,None
if not PROJECTION:
#Extrusion, ZRotation, Elevation = getExtrusion(mx)
Extrusion, AXaxis = getExtrusion(mx)
""" if not PROJECTION: WCS_loc = ob.loc # WCS_loc is object location in WorldCoordSystem
Extrusion, Rotation, Elevation = getExtrusion(mx) #WCS_loc = [0.0,0.0,0.0]
else: #print 'deb: WCS_loc=', WCS_loc #---------
Extrusion = None
""" sizeX = ob.SizeX
sizeY = ob.SizeY
sizeZ = ob.SizeZ
rotZ = ob.RotZ
#print 'deb: sizeX=%s, sizeY=%s' %(sizeX, sizeY) #---------
#print 'deb: curve.ext1=', curve.ext1 #---------
if curve.ext1: Thickness = curve.ext1 * sizeZ
if "POLYLINE"==curve_as_list[GUI_A['curve_as'].val]: # export as POLYLINE
rot_matrix = normalizeMat(mx.rotationPart())
#TODO: workaround for blender negative-matrix.invert()
# partially done: works only for rotX,rotY==0.0
if sizeX<0.0: rot_matrix[0] *= -1
if sizeY<0.0: rot_matrix[1] *= -1
#if sizeZ<0.0: rot_matrix[2] *= -1
rot_matrix_invert = rot_matrix.invert()
OCS_origin = Mathutils.Vector(WCS_loc) * rot_matrix_invert
# OCS_origin is global origin in ObjectCoordSystem
#print 'deb: OCS_origin=', OCS_origin #---------
ZRotation = rotZ
if Extrusion!=None:
ZRotation = getZRotation(AXaxis,rot_matrix_invert)
#print 'deb: ZRotation=', ZRotation * r2d #--------------
#Zrotmatrix = Mathutils.RotationMatrix(-ZRotation, 3, "Z")
rs, rc = sin(ZRotation), cos(ZRotation)
Zrotmatrix = Mathutils.Matrix([rc, rs,0.0],[-rs,rc,0.0],[0.0,0.0,1.0])
ECS_origin = OCS_origin.copy()
#if sizeX<0.0: ECS_origin[0] *= -1
#if sizeY<0.0: ECS_origin[1] *= -1
#if sizeZ<0.0: ECS_origin[2] *= -1
ECS_origin = ECS_origin * Zrotmatrix
#print 'deb: ECS_origin=', ECS_origin #---------
# ECS_origin is global origin in EntityCoordSystem
#TODO: it doesnt work yet for negative scaled curve-objects!
for cur in curve: for cur in curve:
print 'deb: START cur=', cur #-------------- #print 'deb: START cur=', cur #--------------
org_point = [0.0,0.0,0.0]
points = [] points = []
if cur.isNurb(): if cur.isNurb():
for point in cur: for point in cur:
@ -626,29 +717,83 @@ def exportCurve(ob, mx, mw, _common=None):
points.append(pkt) points.append(pkt)
else: else:
for point in cur: for point in cur:
#point = point.getTriple() #print 'deb:isBezier point=', point.getTriple() #---------
#print 'deb:isBezier point=', point #---------
vec = point.getTriple()[1] vec = point.getTriple()[1]
#print 'deb: vec=', vec #--------- #print 'deb: vec=', vec #---------
pkt = Mathutils.Vector(vec) pkt = Mathutils.Vector(vec)
#print 'deb: pkt=', pkt #--------- #print 'deb: pkt=', pkt #---------
points.append(pkt) points.append(pkt)
if len(points)>1:
#print 'deb: points', points #-------------- #print 'deb: points', points #--------------
points = projected_co(points, mx) if len(points)>1:
c = curve_as_list[GUI_A['curve_as'].val]
if c=="POLYLINE": # export Curve as POLYLINE
for p in points: # vectors4d
p[0] *= sizeX
p[1] *= sizeY
p2 = p * Zrotmatrix
p2[0] += ECS_origin[0]
p2[1] += ECS_origin[1]
p[0],p[1] = p2[0],p2[1]
#print 'deb:points', points #--------------
if cur.isCyclic(): closed = 1 if cur.isCyclic(): closed = 1
else: closed = 0 else: closed = 0
if DEBUG: curve_drawBlender(points,org_point,closed) #deb: draw to scene if GUI_A['g_origin_on'].val: #TODO: scale and object orientation
if GUI_A['curve_as'].val==2: # export Curve as POLYLINE
dxfPLINE = DXF.PolyLine(points,org_point,closed,**common)
entities.append(dxfPLINE)
elif GUI_A['curve_as'].val==1: # export Curve as multiple LINEs
dxfPLINE = DXF.LineList(points,org_point,closed,**common)
entities.append(dxfPLINE)
elif GUI_A['curve_as'].val==5: # export Curve as multiple POINTs
for p in points: for p in points:
dxfPOINT = DXF.Point(p,**common) p[0] += G_ORIGIN[0]
p[1] += G_ORIGIN[1]
p[2] += G_ORIGIN[2]
if DEBUG: curve_drawBlender(points,OCS_origin,closed) #deb: draw to scene
common['extrusion']= Extrusion
#common['rotation']= ZRotation
#common['elevation']= Elevation
common['thickness']= Thickness
#print 'deb: common=', common #------------------
if 0: #DEBUG
linepoints = [[0,0,0], [AXaxis[0],AXaxis[1],AXaxis[2]]]
dxfLINE = DXF.Line(linepoints,**common)
entities.append(dxfLINE)
dxfPLINE = DXF.PolyLine(points,OCS_origin,closed,**common)
entities.append(dxfPLINE)
if Thickness:
common['thickness']= -Thickness
dxfPLINE = DXF.PolyLine(points,OCS_origin,closed,**common)
entities.append(dxfPLINE)
elif c=="LINEs": # export Curve as multiple LINEs
points = projected_co(points, mx)
if cur.isCyclic(): points.append(points[0])
#print 'deb: points', points #--------------
if GUI_A['g_origin_on'].val: #TODO: scale and object orientation
for p in points:
p[0] += G_ORIGIN[0]
p[1] += G_ORIGIN[1]
p[2] += G_ORIGIN[2]
if DEBUG: curve_drawBlender(points,WCS_loc,closed) #deb: draw to scene
common['extrusion']= Extrusion
common['elevation']= Elevation
common['thickness']= Thickness
#print 'deb: common=', common #------------------
for i in range(len(points)-1):
linepoints = [points[i], points[i+1]]
dxfLINE = DXF.Line(linepoints,**common)
entities.append(dxfLINE)
if Thickness:
common['thickness']= -Thickness
for i in range(len(points)-1):
linepoints = [points[i], points[i+1]]
dxfLINE = DXF.Line(linepoints,**common)
entities.append(dxfLINE)
elif c=="POINTs": # export Curve as multiple POINTs
for p in points:
dxfPOINT = DXF.Point(points=[p],**common)
entities.append(dxfPOINT) entities.append(dxfPOINT)
return entities return entities
#----------------------------------------------------- #-----------------------------------------------------
@ -656,7 +801,6 @@ def getClipBox(camera):
sce = Scene.GetCurrent() sce = Scene.GetCurrent()
context = sce.getRenderingContext() context = sce.getRenderingContext()
#print 'deb: context=\n', context #------------------ #print 'deb: context=\n', context #------------------
#print 'deb: context=\n', dir(context) #------------------
sizeX = context.sizeX sizeX = context.sizeX
sizeY = context.sizeY sizeY = context.sizeY
ratioXY = sizeX/float(sizeY) ratioXY = sizeX/float(sizeY)
@ -863,8 +1007,8 @@ def do_export(export_list, filepath):
#add Tables ----------------- #add Tables -----------------
#d.blocks.append(b) #table blocks #d.blocks.append(b) #table blocks
#goes automatic: d.styles.append(DXF.Style()) #table styles #goes automatic: d.styles.append(DXF.Style()) #table styles
d.views.append(DXF.View('Normal')) #table view #d.views.append(DXF.View('Normal')) #table view
d.views.append(DXF.ViewByWindow('Window',leftBottom=(1,0),rightTop=(2,1))) #idem d.views.append(DXF.ViewByWindow('BF_TOPVIEW',leftBottom=(-10,-6),rightTop=(10,6))) #idem
#add Entities -------------------- #add Entities --------------------
something_ready = 0 something_ready = 0
@ -931,6 +1075,8 @@ def do_export(export_list, filepath):
#print 'deb: mx_inv=\n', mx_inv #--------- #print 'deb: mx_inv=\n', mx_inv #---------
if ob.type in ('Mesh', 'Curve', 'Empty'): if ob.type in ('Mesh', 'Curve', 'Empty'):
if GUI_A['paper_space_on'].val==1: espace=1
else: espace=None
elayer,ecolor,eltype = getCommons(ob) elayer,ecolor,eltype = getCommons(ob)
#print 'deb: elayer,ecolor,eltype =', elayer,ecolor,eltype #-------------- #print 'deb: elayer,ecolor,eltype =', elayer,ecolor,eltype #--------------
@ -943,13 +1089,13 @@ def do_export(export_list, filepath):
if (ob.type == 'Mesh') and GUI_B['bmesh'].val: if (ob.type == 'Mesh') and GUI_B['bmesh'].val:
entities = exportMesh(ob, mx, mx_n, tmp_me,\ entities = exportMesh(ob, mx, mx_n, tmp_me,\
color=ecolor, layer=elayer, lineType=eltype) paperspace=espace, color=ecolor, layer=elayer, lineType=eltype)
elif (ob.type == 'Curve') and GUI_B['bcurve'].val: elif (ob.type == 'Curve') and GUI_B['bcurve'].val:
entities = exportCurve(ob, mx, mw, \ entities = exportCurve(ob, mx, mw, \
color=ecolor, layer=elayer, lineType=eltype) paperspace=espace, color=ecolor, layer=elayer, lineType=eltype)
elif (ob.type == 'Empty') and GUI_B['empty'].val: elif (ob.type == 'Empty') and GUI_B['empty'].val:
entities = exportEmpty(ob, mx, mw, \ entities = exportEmpty(ob, mx, mw, \
color=ecolor, layer=elayer, lineType=eltype) paperspace=espace, color=ecolor, layer=elayer, lineType=eltype)
for e in entities: for e in entities:
d.append(e) d.append(e)
@ -958,14 +1104,16 @@ def do_export(export_list, filepath):
if something_ready: if something_ready:
if not GUI_A['outputDWG_on'].val: if not GUI_A['outputDWG_on'].val:
print 'exporting to %s' % filepath print 'exporting to %s' % filepath
try: d.saveas(filepath) try:
except IOError: d.saveas(filepath)
Draw.PupMenu('DXF Exporter: Write Error: Permission denied:| %s' %filepath)
Window.WaitCursor(0) Window.WaitCursor(0)
#print '%s objects exported to %s' %(something_ready,filepath) #print '%s objects exported to %s' %(something_ready,filepath)
print '%s objects exported in %.2f seconds. -----DONE-----' %(something_ready,(Blender.sys.time()-t)) print '%s objects exported in %.2f seconds. -----DONE-----' %(something_ready,(Blender.sys.time()-t))
Draw.PupMenu('DXF Exporter: job finished!| %s objects exported in %.2f sek.' %(something_ready, (Blender.sys.time()-t))) Draw.PupMenu('DXF Exporter: job finished!| %s objects exported in %.2f sek.' %(something_ready, (Blender.sys.time()-t)))
except IOError:
Window.WaitCursor(0)
Draw.PupMenu('DXF Exporter: Write Error: Permission denied:| %s' %filepath)
else: else:
if not extCONV_OK: if not extCONV_OK:
Draw.PupMenu(extCONV_TEXT) Draw.PupMenu(extCONV_TEXT)
@ -983,6 +1131,7 @@ def do_export(export_list, filepath):
os.remove(filepath) os.remove(filepath)
Window.WaitCursor(0) Window.WaitCursor(0)
print ' finished in %.2f seconds. -----DONE-----' % (Blender.sys.time()-t) print ' finished in %.2f seconds. -----DONE-----' % (Blender.sys.time()-t)
Draw.PupMenu('DWG Exporter: job finished!| %s objects exported in %.2f sek.' %(something_ready, (Blender.sys.time()-t)))
else: else:
Window.WaitCursor(0) Window.WaitCursor(0)
print "Abort: selected objects dont match choosen export option, nothing exported!" print "Abort: selected objects dont match choosen export option, nothing exported!"
@ -1245,7 +1394,7 @@ entitylayer_from_menu = prepareMenu("entityLAYER from: %t", entitylayer_from_lis
entitycolor_from_list = ["default_COLOR","BYLAYER","BYBLOCK","obj.layer","obj.color","obj.material","obj.data.material","..map_table"] entitycolor_from_list = ["default_COLOR","BYLAYER","BYBLOCK","obj.layer","obj.color","obj.material","obj.data.material","..map_table"]
entitycolor_from_menu = prepareMenu("entityCOLOR set to: %t",entitycolor_from_list) entitycolor_from_menu = prepareMenu("entityCOLOR set to: %t",entitycolor_from_list)
entityltype_from_list = ["default_LTYPE","BYLAYER","BYBLOCK","CONTINUOUS","DOT","DASH","DASH-DOT"] entityltype_from_list = ["default_LTYPE","BYLAYER","BYBLOCK","CONTINUOUS","..DOT","..DASHED","..DASHDOT","..BORDER","..HIDDEN"]
entityltype_from_menu = prepareMenu("entityCOLOR set to: %t",entityltype_from_list) entityltype_from_menu = prepareMenu("entityCOLOR set to: %t",entityltype_from_list)
#dxf-LINE,ARC,CIRCLE,ELLIPSE #dxf-LINE,ARC,CIRCLE,ELLIPSE
@ -1318,7 +1467,7 @@ keywords_org = {
'layername_def' : LAYERNAME_DEF, 'layername_def' : LAYERNAME_DEF,
'layercolor_def': LAYERCOLOR_DEF, 'layercolor_def': LAYERCOLOR_DEF,
'layerltype_def': LAYERLTYPE_DEF, 'layerltype_def': LAYERLTYPE_DEF,
'entitylayer_from': 2, 'entitylayer_from': 5,
'entitycolor_from': 1, 'entitycolor_from': 1,
'entityltype_from' : 1, 'entityltype_from' : 1,
@ -1848,12 +1997,12 @@ def draw_UI(): #---------------------------------------------------------------
but_ = menu_w / 6 but_ = menu_w / 6
b0 = but0c + (menu_w - but_*6)/2 b0 = but0c + (menu_w - but_*6)/2
Draw.BeginAlign() Draw.BeginAlign()
GUI_A['paper_space_on'] = Draw.Toggle('..paper', EVENT_NONE, b0+but_*0, y, but_, 20, GUI_A['paper_space_on'].val, "Export only to Paper-Space on/off") GUI_A['paper_space_on'] = Draw.Toggle('paper', EVENT_NONE, b0+but_*0, y, but_, 20, GUI_A['paper_space_on'].val, "Export to Paper-Space, otherwise to Model-Space on/off")
GUI_A['layFrozen_on'] = Draw.Toggle ('..frozen', EVENT_NONE, b0+but_*1, y, but_, 20, GUI_A['layFrozen_on'].val, "Support LAYER.frozen status on/off") GUI_A['layFrozen_on'] = Draw.Toggle ('..frozen', EVENT_NONE, b0+but_*1, y, but_, 20, GUI_A['layFrozen_on'].val, "(*todo) Support LAYER.frozen status on/off")
GUI_A['materialFilter_on'] = Draw.Toggle('..material', EVENT_NONE, b0+but_*2, y, but_, 20, GUI_A['materialFilter_on'].val, "(*todo) material filtering on/off") GUI_A['materialFilter_on'] = Draw.Toggle('..material', EVENT_NONE, b0+but_*2, y, but_, 20, GUI_A['materialFilter_on'].val, "(*todo) Material filtering on/off")
GUI_A['colorFilter_on'] = Draw.Toggle('..color', EVENT_NONE, b0+but_*3, y, but_, 20, GUI_A['colorFilter_on'].val, "(*todo) color filtering on/off") GUI_A['colorFilter_on'] = Draw.Toggle('..color', EVENT_NONE, b0+but_*3, y, but_, 20, GUI_A['colorFilter_on'].val, "(*todo) Color filtering on/off")
GUI_A['groupFilter_on'] = Draw.Toggle('..group', EVENT_NONE, b0+but_*4, y, but_, 20, GUI_A['groupFilter_on'].val, "(*todo) group filtering on/off") GUI_A['groupFilter_on'] = Draw.Toggle('..group', EVENT_NONE, b0+but_*4, y, but_, 20, GUI_A['groupFilter_on'].val, "(*todo) Group filtering on/off")
GUI_A['objectFilter_on'] = Draw.Toggle('..object', EVENT_NONE, b0+but_*5, y, but_, 20, GUI_A['objectFilter_on'].val, "(*todo) object filtering on/off") GUI_A['objectFilter_on'] = Draw.Toggle('..object', EVENT_NONE, b0+but_*5, y, but_, 20, GUI_A['objectFilter_on'].val, "(*todo) Object filtering on/off")
#GUI_A['dummy_on'] = Draw.Toggle('-', EVENT_NONE, but3c, y, but_3c, 20, GUI_A['dummy_on'].val, "dummy on/off") #GUI_A['dummy_on'] = Draw.Toggle('-', EVENT_NONE, but3c, y, but_3c, 20, GUI_A['dummy_on'].val, "dummy on/off")
Draw.EndAlign() Draw.EndAlign()
@ -1924,6 +2073,7 @@ def draw_UI(): #---------------------------------------------------------------
b3, b3_ = but3c, but_3c b3, b3_ = but3c, but_3c
y -= 30 y -= 30
Draw.Label('Output:', b0, y, b0_, 20)
Draw.Label('LAYER:', b1, y, b1_, 20) Draw.Label('LAYER:', b1, y, b1_, 20)
Draw.Label('COLOR:', b2, y, b2_, 20) Draw.Label('COLOR:', b2, y, b2_, 20)
Draw.Label('LINETYPE:', b3, y, b3_, 20) Draw.Label('LINETYPE:', b3, y, b3_, 20)
@ -1931,7 +2081,7 @@ def draw_UI(): #---------------------------------------------------------------
y -= 20 y -= 20
Draw.BeginAlign() Draw.BeginAlign()
GUI_A['prefix_def'] = Draw.String('', EVENT_NONE, b0, y, b0_, 20, GUI_A['prefix_def'].val, 10, "Type Prefix for DXF names") GUI_A['prefix_def'] = Draw.String('', EVENT_NONE, b0, y, b0_, 20, GUI_A['prefix_def'].val, 10, "Type Prefix for LAYERs")
GUI_A['layername_def'] = Draw.String('', EVENT_NONE, b1, y, b1_, 20, GUI_A['layername_def'].val, 10, "Type default LAYER name") GUI_A['layername_def'] = Draw.String('', EVENT_NONE, b1, y, b1_, 20, GUI_A['layername_def'].val, 10, "Type default LAYER name")
GUI_A['layercolor_def'] = Draw.Number('', EVENT_NONE, b2, y, b2_, 20, GUI_A['layercolor_def'].val, 1, 255, "Set default COLOR. (0=BYBLOCK,256=BYLAYER)") GUI_A['layercolor_def'] = Draw.Number('', EVENT_NONE, b2, y, b2_, 20, GUI_A['layercolor_def'].val, 1, 255, "Set default COLOR. (0=BYBLOCK,256=BYLAYER)")
GUI_A['layerltype_def'] = Draw.Menu(layerltype_def_menu, EVENT_NONE, b3, y, b3_, 20, GUI_A['layerltype_def'].val, "Set default LINETYPE") GUI_A['layerltype_def'] = Draw.Menu(layerltype_def_menu, EVENT_NONE, b3, y, b3_, 20, GUI_A['layerltype_def'].val, "Set default LINETYPE")
@ -2029,8 +2179,8 @@ def draw_UI(): #---------------------------------------------------------------
GUI_A['camera_on'] = Draw.Menu(MenuCAMERA, EVENT_CAMERA, b0, y, b0_-20, 20, GUI_A['camera_on'].val, 'Choose the camera to be rendered') GUI_A['camera_on'] = Draw.Menu(MenuCAMERA, EVENT_CAMERA, b0, y, b0_-20, 20, GUI_A['camera_on'].val, 'Choose the camera to be rendered')
Draw.PushButton('>', EVENT_setCAMERA, b0+b0_-20, y, 20, 20, 'switch to selected Camera - make it active') Draw.PushButton('>', EVENT_setCAMERA, b0+b0_-20, y, 20, 20, 'switch to selected Camera - make it active')
GUI_A['hidden_lines_on'] = Draw.Toggle('.Hidden Lines', EVENT_NONE, b0, y-20, b0_, 20, GUI_A['hidden_lines_on'].val, "Filter out hidden lines on/off") GUI_A['hidden_lines_on'] = Draw.Toggle('.Hidden Lines', EVENT_NONE, b0, y-20, b0_, 20, GUI_A['hidden_lines_on'].val, "Filter out hidden lines on/off")
GUI_A['shadows_on'] = Draw.Toggle('..Shadows', EVENT_REDRAW, b0, y-40, but_2c, 20, GUI_A['shadows_on'].val, "(*todo) Shadow tracing on/off") #GUI_A['shadows_on'] = Draw.Toggle('..Shadows', EVENT_REDRAW, b0, y-40, but_2c, 20, GUI_A['shadows_on'].val, "(*todo) Shadow tracing on/off")
GUI_A['light_on'] = Draw.Menu(MenuLIGHT, EVENT_LIGHT, but3c, y-40, but_3c, 20, GUI_A['light_on'].val, '(*todo) Choose the light source(sun) to be rendered') #GUI_A['light_on'] = Draw.Menu(MenuLIGHT, EVENT_LIGHT, but3c, y-40, but_3c, 20, GUI_A['light_on'].val, '(*todo) Choose the light source(sun) to be rendered')
Draw.EndAlign() Draw.EndAlign()
y -= 20 y -= 20
@ -2425,9 +2575,6 @@ def multi_import(DIR):
#----------------------------------------------------- #-----------------------------------------------------
if __name__=='__main__': if __name__=='__main__':
if 'cross' not in dir(Mathutils.Vector()):
Draw.PupMenu('DXF exporter: Abort%t|This script version works for Blender up 2.49 only!')
else:
if not DXF.copy: if not DXF.copy:
Draw.PupMenu('Error%t|The dxfLibrary.py script requires a full python install') Draw.PupMenu('Error%t|The dxfLibrary.py script requires a full python install')
#Window.FileSelector(dxf_export_ui, 'EXPORT DXF', Blender.sys.makename(ext='.dxf')) #Window.FileSelector(dxf_export_ui, 'EXPORT DXF', Blender.sys.makename(ext='.dxf'))

@ -44,8 +44,8 @@ Supported DXF>r12 objects:
ELLIPSE, ELLIPSE,
LWPOLYLINE (LightWeight Polyline), LWPOLYLINE (LightWeight Polyline),
SPLINE, SPLINE,
(wip v1.13) MLINE, (todo v1.13) MLINE,
(wip v1.13) MTEXT (todo v1.13) MTEXT
Unsupported objects: Unsupported objects:
DXF r12: DIMENSION. DXF r12: DIMENSION.
@ -74,7 +74,7 @@ thickness,
width, width,
color, color,
layer, layer,
(wip v1.13: XDATA, grouped status) (todo v1.13: XDATA, grouped status)
It is recommended to use DXF-object properties for assign Blender materials. It is recommended to use DXF-object properties for assign Blender materials.
Notes: Notes:
@ -113,7 +113,6 @@ History:
v1.12 - 2009.05.27 by migius v1.12 - 2009.05.27 by migius
d6 todo: bugfix negative scaled INSERTs - isLeftHand(Matrix) check d6 todo: bugfix negative scaled INSERTs - isLeftHand(Matrix) check
v1.12 - 2009.05.26 by migius v1.12 - 2009.05.26 by migius
d5 changed to the new 2.49 method Vector.cross() d5 changed to the new 2.49 method Vector.cross()
d5 bugfix WORLDY(1,1,0) to (0,1,0) d5 bugfix WORLDY(1,1,0) to (0,1,0)
@ -378,7 +377,7 @@ GROUP_BYLAYER = 0 #(0/1) all entities from same layer import into one blender-
LAYER_DEF_NAME = 'AAAA' #default layer name LAYER_DEF_NAME = 'AAAA' #default layer name
LAYER_DEF_COLOR = 4 #default layer color LAYER_DEF_COLOR = 4 #default layer color
E_M = 0 E_M = 0
LAB = "*) parts under construction" LAB = ". wip .. todo" #"*) parts under construction"
M_OBJ = 0 M_OBJ = 0
FILENAME_MAX = 180 #max length of path+file_name string (FILE_MAXDIR + FILE_MAXFILE) FILENAME_MAX = 180 #max length of path+file_name string (FILE_MAXDIR + FILE_MAXFILE)
@ -395,14 +394,19 @@ ALIGN = BezTriple.HandleTypes.ALIGN
UI_MODE = True #activates UI-popup-print, if not multiple files imported UI_MODE = True #activates UI-popup-print, if not multiple files imported
#TODO:---patch for pre2.49------------- #---- migration to 2.49-------------------------------------------------
if 0: if 'cross' in dir(Mathutils.Vector()):
print Blender.Get('version') #Draw.PupMenu('DXF exporter: Abort%t|This script version works for Blender up 2.49 only!')
#def Mathutil_CrossVecs(v1,v2): def M_CrossVecs(v1,v2):
az = Mathutils.Vector((0,0.5,0.4)) return v1.cross(v2) #for up2.49
print dir(az) def M_DotVecs(v1,v2):
ax = WORLDZ.cross(az) return v1.dot(v2) #for up2.49
print ax else:
def M_CrossVecs(v1,v2):
return Mathutils.CrossVecs(v1,v2) #for pre2.49
def M_DotVecs(v1,v2):
return Mathutils.DotVecs(v1,v2) #for pre2.49
#-------- DWG support ------------------------------------------ #-------- DWG support ------------------------------------------
extCONV_OK = True extCONV_OK = True
@ -2248,7 +2252,6 @@ class LWpolyline(Polyline): #--------------------------------------------------
self.spline = False self.spline = False
self.curved = False self.curved = False
#print 'deb:LWpolyline.obj.data:\n', obj.data #------------------------ #print 'deb:LWpolyline.obj.data:\n', obj.data #------------------------
#print 'deb:LWpolyline.ENDinit:----------------' #------------------------ #print 'deb:LWpolyline.ENDinit:----------------' #------------------------
@ -4430,14 +4433,11 @@ def getOCS(az): #--------------------------------------------------------------
cap = 0.015625 # square polar cap value (1/64.0) cap = 0.015625 # square polar cap value (1/64.0)
if abs(az.x) < cap and abs(az.y) < cap: if abs(az.x) < cap and abs(az.y) < cap:
#ax = Mathutils.CrossVecs(WORLDY, az) #for<2.49 ax = M_CrossVecs(WORLDY,az)
ax = WORLDY.cross(az)
else: else:
#ax = Mathutils.CrossVecs(WORLDZ, az) #for<2.49 ax = M_CrossVecs(WORLDZ,az)
ax = WORLDZ.cross(az)
ax = ax.normalize() ax = ax.normalize()
#ay = Mathutils.CrossVecs(az, ax) #for<2.49 ay = M_CrossVecs(az, ax)
ay = az.cross(ax)
ay = ay.normalize() ay = ay.normalize()
return ax, ay, az return ax, ay, az
@ -5180,17 +5180,17 @@ GUI_B = {} # GUI-buttons dictionary for drawingTypes
# settings default, initialize ------------------------ # settings default, initialize ------------------------
points_as_menu = "convert to: %t|empty %x1|mesh.vertex %x2|thin sphere %x3|thin box %x4|*curve.vertex %x5" points_as_menu = "convert to: %t|empty %x1|mesh.vertex %x2|thin sphere %x3|thin box %x4|..curve.vertex %x5"
lines_as_menu = "convert to: %t|*edge %x1|mesh %x2|*thin cylinder %x3|thin box %x4|Bezier-curve %x5|*NURBS-curve %x6" lines_as_menu = "convert to: %t|..edge %x1|mesh %x2|..thin cylinder %x3|thin box %x4|Bezier-curve %x5|..NURBS-curve %x6"
mlines_as_menu = "convert to: %t|*edge %x1|*mesh %x2|*thin cylinder %x3|*thin box %x|*curve %x5" mlines_as_menu = "convert to: %t|..edge %x1|..mesh %x2|..thin cylinder %x3|..thin box %x|..curve %x5"
plines_as_menu = "convert to: %t|*edge %x1|mesh %x2|*thin cylinder %x3|*thin box %x4|Bezier-curve %x5|NURBS-curve %x6" plines_as_menu = "convert to: %t|..edge %x1|mesh %x2|..thin cylinder %x3|..thin box %x4|Bezier-curve %x5|NURBS-curve %x6"
splines_as_menu = "convert to: %t|mesh %x2|*thin cylinder %x3|*thin box %x4|*Bezier-curve %x5|NURBS-curve %x6" splines_as_menu = "convert to: %t|mesh %x2|..thin cylinder %x3|..thin box %x4|Bezier-curve %x5|NURBS-curve %x6"
plines3_as_menu = "convert to: %t|*edge %x1|mesh %x2|*thin cylinder %x3|*thin box %x4|Bezier-curve %x5|NURBS-curve %x6" plines3_as_menu = "convert to: %t|..edge %x1|mesh %x2|..thin cylinder %x3|..thin box %x4|Bezier-curve %x5|NURBS-curve %x6"
plmesh_as_menu = "convert to: %t|*edge %x1|mesh %x2|*NURBS-surface %x6" plmesh_as_menu = "convert to: %t|..edge %x1|mesh %x2|..NURBS-surface %x6"
solids_as_menu = "convert to: %t|*edge %x1|mesh %x2" solids_as_menu = "convert to: %t|..edge %x1|mesh %x2"
blocks_as_menu = "convert to: %t|dupliGroup %x1|*real.Group %x2|*exploded %x3" blocks_as_menu = "convert to: %t|dupliGroup %x1|..real.Group %x2|..exploded %x3"
texts_as_menu = "convert to: %t|text %x1|*mesh %x2|*curve %x5" texts_as_menu = "convert to: %t|text %x1|..mesh %x2|..curve %x5"
material_from_menu= "material from: %t|*LINESTYLE %x7|COLOR %x1|LAYER %x2|*LAYER+COLOR %x3|*BLOCK %x4|*XDATA %x5|*INI-File %x6" material_from_menu= "material from: %t|..LINESTYLE %x7|COLOR %x1|LAYER %x2|..LAYER+COLOR %x3|..BLOCK %x4|..XDATA %x5|..INI-File %x6"
g_scale_list = ''.join(( g_scale_list = ''.join((
'scale factor: %t', 'scale factor: %t',
'|user def. %x12', '|user def. %x12',
@ -5676,7 +5676,7 @@ def draw_UI(): #---------------------------------------------------------------
y -= 20 y -= 20
Draw.BeginAlign() Draw.BeginAlign()
GUI_B['mline'] = Draw.Toggle('*MLINE', EVENT_REDRAW, b0, y, b0_, 20, GUI_B['mline'].val, "(*wip)support dxf-MLINE on/off") GUI_B['mline'] = Draw.Toggle('..MLINE', EVENT_REDRAW, b0, y, b0_, 20, GUI_B['mline'].val, "(*todo)support dxf-MLINE on/off")
if GUI_B['mline'].val: if GUI_B['mline'].val:
GUI_A['mlines_as'] = Draw.Menu(mlines_as_menu, EVENT_NONE, but1c, y, but_1c, 20, GUI_A['mlines_as'].val, "select target Blender-object") GUI_A['mlines_as'] = Draw.Menu(mlines_as_menu, EVENT_NONE, but1c, y, but_1c, 20, GUI_A['mlines_as'].val, "select target Blender-object")
Draw.EndAlign() Draw.EndAlign()
@ -5727,7 +5727,7 @@ def draw_UI(): #---------------------------------------------------------------
y -= 20 y -= 20
GUI_B['text'] = Draw.Toggle('TEXT', EVENT_NONE, b0, y, b0_, 20, GUI_B['text'].val, "support dxf-TEXT on/off") GUI_B['text'] = Draw.Toggle('TEXT', EVENT_NONE, b0, y, b0_, 20, GUI_B['text'].val, "support dxf-TEXT on/off")
GUI_B['mtext'] = Draw.Toggle('*MTEXT', EVENT_NONE, b1, y, b1_, 20, GUI_B['mtext'].val, "(*wip)support dxf-MTEXT on/off") GUI_B['mtext'] = Draw.Toggle('..MTEXT', EVENT_NONE, b1, y, b1_, 20, GUI_B['mtext'].val, "(*todo)support dxf-MTEXT on/off")
# GUI_A['texts_as'] = Draw.Menu(texts_as_menu, EVENT_NONE, but3c, y, but_3c, 20, GUI_A['texts_as'].val, "select target Blender-object") # GUI_A['texts_as'] = Draw.Menu(texts_as_menu, EVENT_NONE, but3c, y, but_3c, 20, GUI_A['texts_as'].val, "select target Blender-object")
y -= 20 y -= 20
@ -5746,8 +5746,8 @@ def draw_UI(): #---------------------------------------------------------------
Draw.BeginAlign() Draw.BeginAlign()
GUI_A['views_on'] = Draw.Toggle('views', EVENT_NONE, b0, y, b0_-25, 20, GUI_A['views_on'].val, "imports VIEWs and VIEWPORTs as cameras on/off") GUI_A['views_on'] = Draw.Toggle('views', EVENT_NONE, b0, y, b0_-25, 20, GUI_A['views_on'].val, "imports VIEWs and VIEWPORTs as cameras on/off")
GUI_A['cams_on'] = Draw.Toggle('*cams', EVENT_NONE, b1-25, y, b1_-25, 20, GUI_A['cams_on'].val, "(*wip) support ASHADE cameras on/off") GUI_A['cams_on'] = Draw.Toggle('..cams', EVENT_NONE, b1-25, y, b1_-25, 20, GUI_A['cams_on'].val, "(*todo) support ASHADE cameras on/off")
GUI_A['lights_on'] = Draw.Toggle('*lights', EVENT_NONE, b1+25, y, b1_-25, 20, GUI_A['lights_on'].val, "(*wip) support AVE_RENDER lights on/off") GUI_A['lights_on'] = Draw.Toggle('..lights', EVENT_NONE, b1+25, y, b1_-25, 20, GUI_A['lights_on'].val, "(*todo) support AVE_RENDER lights on/off")
Draw.EndAlign() Draw.EndAlign()
@ -5763,10 +5763,10 @@ def draw_UI(): #---------------------------------------------------------------
Draw.BeginAlign() Draw.BeginAlign()
GUI_A['paper_space_on'] = Draw.Toggle('paper', EVENT_NONE, b0+but_*0, y, but_, 20, GUI_A['paper_space_on'].val, "import only from Paper-Space on/off") GUI_A['paper_space_on'] = Draw.Toggle('paper', EVENT_NONE, b0+but_*0, y, but_, 20, GUI_A['paper_space_on'].val, "import only from Paper-Space on/off")
GUI_A['layFrozen_on'] = Draw.Toggle ('frozen', EVENT_NONE, b0+but_*1, y, but_, 20, GUI_A['layFrozen_on'].val, "import also from frozen LAYERs on/off") GUI_A['layFrozen_on'] = Draw.Toggle ('frozen', EVENT_NONE, b0+but_*1, y, but_, 20, GUI_A['layFrozen_on'].val, "import also from frozen LAYERs on/off")
GUI_A['layerFilter_on'] = Draw.Toggle('layer', EVENT_NONE, b0+but_*2, y, but_, 20, GUI_A['layerFilter_on'].val, "(*wip) LAYER filtering on/off") GUI_A['layerFilter_on'] = Draw.Toggle('..layer', EVENT_NONE, b0+but_*2, y, but_, 20, GUI_A['layerFilter_on'].val, "(*todo) LAYER filtering on/off")
GUI_A['colorFilter_on'] = Draw.Toggle('color', EVENT_NONE, b0+but_*3, y, but_, 20, GUI_A['colorFilter_on'].val, "(*wip) COLOR filtering on/off") GUI_A['colorFilter_on'] = Draw.Toggle('..color', EVENT_NONE, b0+but_*3, y, but_, 20, GUI_A['colorFilter_on'].val, "(*todo) COLOR filtering on/off")
GUI_A['groupFilter_on'] = Draw.Toggle('group', EVENT_NONE, b0+but_*4, y, but_, 20, GUI_A['groupFilter_on'].val, "(*wip) GROUP filtering on/off") GUI_A['groupFilter_on'] = Draw.Toggle('..group', EVENT_NONE, b0+but_*4, y, but_, 20, GUI_A['groupFilter_on'].val, "(*todo) GROUP filtering on/off")
GUI_A['blockFilter_on'] = Draw.Toggle('block', EVENT_NONE, b0+but_*5, y, but_, 20, GUI_A['blockFilter_on'].val, "(*wip) BLOCK filtering on/off") GUI_A['blockFilter_on'] = Draw.Toggle('..block', EVENT_NONE, b0+but_*5, y, but_, 20, GUI_A['blockFilter_on'].val, "(*todo) BLOCK filtering on/off")
#GUI_A['dummy_on'] = Draw.Toggle('-', EVENT_NONE, but3c, y, but_3c, 20, GUI_A['dummy_on'].val, "dummy on/off") #GUI_A['dummy_on'] = Draw.Toggle('-', EVENT_NONE, but3c, y, but_3c, 20, GUI_A['dummy_on'].val, "dummy on/off")
Draw.EndAlign() Draw.EndAlign()
@ -5867,7 +5867,7 @@ def draw_UI(): #---------------------------------------------------------------
y -= 10 y -= 10
y -= 20 y -= 20
Draw.BeginAlign() Draw.BeginAlign()
GUI_A['Z_force_on'] = Draw.Toggle('*elevation', EVENT_REDRAW, b0, y, b0_, 20, GUI_A['Z_force_on'].val, "*set objects Z-coordinates to elevation on/off") GUI_A['Z_force_on'] = Draw.Toggle('.elevation', EVENT_REDRAW, b0, y, b0_, 20, GUI_A['Z_force_on'].val, ".set objects Z-coordinates to elevation on/off")
if GUI_A['Z_force_on'].val: if GUI_A['Z_force_on'].val:
GUI_A['Z_elev'] = Draw.Number('', EVENT_NONE, b1, y, b1_, 20, GUI_A['Z_elev'].val, -1000, 1000, "set default elevation(Z-coordinate)") GUI_A['Z_elev'] = Draw.Number('', EVENT_NONE, b1, y, b1_, 20, GUI_A['Z_elev'].val, -1000, 1000, "set default elevation(Z-coordinate)")
Draw.EndAlign() Draw.EndAlign()
@ -6169,9 +6169,7 @@ def multi_import(DIR):
if __name__ == "__main__": if __name__ == "__main__":
if 'cross' not in dir(Mathutils.Vector()): #Draw.PupMenu('DXF importer: Abort%t|This script version works for Blender up 2.49 only!')
Draw.PupMenu('DXF importer: Abort%t|This script version works for Blender up 2.49 only!')
else:
UI_MODE = True UI_MODE = True
# recall last used DXF-file and INI-file names # recall last used DXF-file and INI-file names
dxffilename = check_RegistryKey('dxfFileName') dxffilename = check_RegistryKey('dxfFileName')