Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRemigiusz Fiedler <migius@gmx.net>2009-05-29 10:50:31 +0400
committerRemigiusz Fiedler <migius@gmx.net>2009-05-29 10:50:31 +0400
commit9c158175ab78936b6694320dbfe0f9b3bd989e11 (patch)
tree5b9ad62f39b974182fd61c48079756117b337569 /release
parent17c51c6cb778aa584dee93c9bd70d1a0844d53ac (diff)
bugfix and update DXF-Exporter scripts
please get it in 2.49 release
Diffstat (limited to 'release')
-rw-r--r--release/scripts/bpymodules/dxfLibrary.py16
-rw-r--r--release/scripts/export_dxf.py2492
2 files changed, 2213 insertions, 295 deletions
diff --git a/release/scripts/bpymodules/dxfLibrary.py b/release/scripts/bpymodules/dxfLibrary.py
index 55907e03bc1..1e190fec772 100644
--- a/release/scripts/bpymodules/dxfLibrary.py
+++ b/release/scripts/bpymodules/dxfLibrary.py
@@ -1,6 +1,6 @@
#dxfLibrary.py : provides functions for generating DXF files
# --------------------------------------------------------------------------
-__version__ = "v1.29beta - 2008.12.28"
+__version__ = "v1.30 - 2009.05.28"
__author__ = "Stani Michiels(Stani), Remigiusz Fiedler(migius)"
__license__ = "GPL"
__url__ = "http://wiki.blender.org/index.php/Scripts/Manual/Export/autodesk_dxf"
@@ -18,9 +18,12 @@ IDEAs:
-
TODO:
-- add support for SPLINEs, (bad idea, cause DXF r14 object :(
+- add support for DXFr14 (new file header)
+- add support for SPLINEs, although it is DXFr14 object
History
+v1.30 - 2009.05.28 by migius
+- bugfix 3dPOLYLINE/POLYFACE: VERTEX needs x,y,z coordinates, index starts with 1 not 0
v1.29 - 2008.12.28 by Yorik
- modif POLYLINE to support bulge segments
v1.28 - 2008.12.13 by Steeve/BlenderArtists
@@ -42,7 +45,7 @@ ______________________________________________________________
# --------------------------------------------------------------------------
# DXF Library: copyright (C) 2005 by Stani Michiels (AKA Stani)
-# 2008 modif by Remigiusz Fiedler (AKA migius)
+# 2008/2009 modif by Remigiusz Fiedler (AKA migius)
# --------------------------------------------------------------------------
# ***** BEGIN GPL LICENSE BLOCK *****
#
@@ -85,7 +88,6 @@ def _point(x,index=0):
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----------------------------------------
@@ -326,7 +328,6 @@ class PolyLine(_Entity):
def __str__(self):
result= ' 0\nPOLYLINE\n%s 70\n%s\n' %(self._common(),self.flag)
- #print 'deb: self._common()', self._common() #----------
result+=' 66\n1\n'
result+='%s\n' %_point(self.org_point)
if self.polyface:
@@ -337,10 +338,11 @@ class PolyLine(_Entity):
for point in self.points:
result+=' 0\nVERTEX\n'
result+=' 8\n%s\n' %self.layer
- result+='%s\n' %_point(point[0:2])
if self.polyface:
+ result+='%s\n' %_point(point[0:3])
result+=' 70\n192\n'
elif self.polyline2d:
+ result+='%s\n' %_point(point[0:2])
if len(point)>4:
width1, width2 = point[3], point[4]
if width1!=None: result+=' 40\n%s\n' %width1
@@ -348,6 +350,8 @@ class PolyLine(_Entity):
if len(point)==6:
bulge = point[5]
if bulge: result+=' 42\n%s\n' %bulge
+ else:
+ result+='%s\n' %_point(point[0:3])
for face in self.faces:
result+=' 0\nVERTEX\n'
result+=' 8\n%s\n' %self.layer
diff --git a/release/scripts/export_dxf.py b/release/scripts/export_dxf.py
index 84a173c1e7d..5f7a6ecad37 100644
--- a/release/scripts/export_dxf.py
+++ b/release/scripts/export_dxf.py
@@ -1,47 +1,76 @@
#!BPY
"""
- Name: 'Autodesk (.dxf .dwg)'
- Blender: 247
+ Name: 'Autodesk DXF (.dxf)'
+ Blender: 249
Group: 'Export'
- Tooltip: 'Export geometry to Autocad DXF/DWG-r12 (Drawing eXchange Format).'
+ Tooltip: 'Export geometry to DXF/DWG-r12 (Drawing eXchange Format).'
"""
-__version__ = "v1.29 - 2009.04.11"
-__author__ = "Remigiusz Fiedler (AKA migius), Alexandros Sigalas (AKA alxarch), Stani Michiels"
+__version__ = "1.34 - 2009.05.28"
+__author__ = "Remigiusz Fiedler (AKA migius)"
__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"
__bpydoc__ ="""The script exports Blender geometry to DXF format r12 version.
Version %s
Copyright %s
License %s
-extern dependances: dxfLibrary.py
+extern dependances: dxfLibrary.py, (optionaly: DConvertCon.exe)
+
+CONTRIBUTORS:
+Remigiusz Fiedler (AKA migius)
+Alexandros Sigalas (AKA alxarch)
+Stani Michiels (AKA stani)
See the homepage for documentation.
url: %s
IDEAs:
- - correct normals for POLYLINE-POLYFACE via proper point-order
- - HPGL output for 2d and flattened 3d content
-
+- correct normals for POLYLINE-POLYFACE via proper vertex-order
+- HPGL output, especially usefull for correct scaled printing of 2d drawings
+
TODO:
- export dupligroups and dupliverts as blocks ( option for the user to decide )
-- optimize back-faces removal (probably needs matrix transform)
- optimize POLYFACE routine: remove double-vertices
- optimize POLYFACE routine: remove unused vertices
- support hierarchies: groups, instances, parented structures
- support 210-code (3d orientation vector)
-- presets for architectural scales
- write drawing extends for automatic view positioning in CAD
+- support mapping: materials to DXF-styles
History
-v1.29 - 2009.04.11 by migius
+v1.34 - 2009.05.28 by migius
+- bugfix 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 objects
+- added UI-Button for future Shadow Generator
+- support curve objects in projection-2d mode
+- UI stuff: camera selector/manager
+v1.32 - 2009.05.22 by migius
+- debug mode for curve-objects: output pass to Blender
+- wip support 210-code(extrusion) calculation
+- default settings for 2D and 3D export
+v1.31 - 2009.05.18 by migius
+- globals translated to GUI_A/B dictionary
+- optimizing back-faces removal for "hidden-lines" mode
+- presets for global location and scale (architecture)
+- UI layout: scrollbars, pan with MMB/WHEEL, dynamic width
+- new GUI with Draw.Register() from DXF-importer.py
+v1.30 - 2008.12.14 by migius
+- started work on GUI with Draw.Register()
+v1.29 - 2009.04.11 by stani
- added DWG support, Stani Michiels idea for binding an extern DXF-DWG-converter
-v1.28 - 2009.02.05 by alxarch
+v1.28 - 2009.02.05 by Alexandros Sigalas (alxarch)
- added option to apply modifiers on exported meshes
- added option to also export duplicates (from dupliverts etc)
+v1.28 - 2008.10.22 by migius
+- workaround for PVert-bug on ubuntu (reported by Yorik)
+- add support for FGons - ignore invisible_tagged edges
+- add support for camera: ortho and perspective
v1.27 - 2008.10.07 by migius
- exclude Stani's DXF-Library to extern module
v1.26 - 2008.10.05 by migius
@@ -92,46 +121,161 @@ ______________________________________________________________
import Blender
-from Blender import Mathutils, Window, Scene, sys, Draw, Mesh
-import BPyMessages
-try: import os
-except: os = None
-try: import subprocess
-except: subprocess = None
-try: import copy
-except: copy = None
-
-#print os.sys.platform
-#print dir(os.sys.version)
-
-#import dxfLibrary
+from Blender import Mathutils, Window, Scene, Draw, Camera, BezTriple
+from Blender import Registry, Object, Mesh
+import os
+import subprocess
+
+import dxfLibrary as DXF
+#reload(DXF)
#reload(dxfLibrary)
-if copy and os:
- from dxfLibrary import *
- #-------- DWG support ------------------------------------------
- extCONV_OK = True
- extCONV = 'DConvertCon.exe'
- extCONV_PATH = os.path.join(Blender.Get('scriptsdir'),extCONV)
- if not os.path.isfile(extCONV_PATH):
- extCONV_OK = False
- extCONV_TEXT = 'DWG-Exporter: Abort, nothing done!|\
- Copy first %s into Blender script directory.|\
- More details in online Help.' %extCONV
- else:
- if not os.sys.platform.startswith('win'):
- # check if Wine installed:
- if subprocess.Popen(('which', 'winepath'), stdout=subprocess.PIPE).stdout.read().strip():
- extCONV_PATH = 'wine %s'%extCONV_PATH
- else:
- extCONV_OK = False
- extCONV_TEXT = 'DWG-Exporter: Abort, nothing done!|\
- The external DWG-converter (%s) needs Wine installed on your system.|\
- More details in online Help.' %extCONV
- #print 'extCONV_PATH = ', extCONV_PATH
+#from dxfLibrary import *
+import math
+from math import atan, log10
+#pi = math.pi
+#pi = 3.14159265359
+d2r = math.pi / 180.0
+#note: d2r * angle == math.radians(angle)
-#-----------------------------------------------------
+print '\n\n\n'
+print 'DXF-Exporter v%s *** start ***' %(__version__) #---------------------
+
+#DEBUG = True #activets debug mode
+
+
+#----globals------------------------------------------
+ONLYSELECTED = 1 # 0/1 = False/True
+POLYLINES = 1 # prefer POLYLINEs not LINEs
+POLYFACES = 1 # prefer POLYFACEs not 3DFACEs
+PROJECTION = 0 # flatten output geometry to Z = 0.0
+HIDDEN_LINES = 0 #filter out hidden geometry
+SHADOWS = 0 # sun/shadows simulation
+CAMERA = 1 # view from active camera or from 3d-view
+PERSPECTIVE = 0 #perspective camera
+APPLY_MODIFIERS = 1
+INCLUDE_DUPLIS = 0
+OUTPUT_DWG = 0 #optional save to DWG with extern converter
+
+G_SCALE = 1.0 #(0.0001-1000) global scaling factor for output dxf data
+G_ORIGIN = [0.0,0.0,0.0] #global translation-vector (x,y,z) in Blender units
+ELEVATION = 0.0 #standard elevation = coordinate Z value in Blender units
+
+MIN_DIST = 0.001 #cut-off value for sort out short-distance polyline-"duoble_vertex"
+CURV_RESOLUTION = 12 #(1-128) Bezier curves U-resolution
+CURVARC_RESOLUTION = 4 #(3-32) resolution of circle represented as Bezier curve
+THIN_RESOLUTION = 8 #(4-64) 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
+
+BYBLOCK = 0 #DXF-attribute: assign property to BLOCK defaults
+BYLAYER = None #256 #DXF-attribute: assign property to LAYER defaults
+PREFIX = 'BF_' #used as prefix for DXF names
+LAYERNAME_DEF = '' #default layer name
+LAYERCOLOR_DEF = 7 #default layer color index
+LAYERLTYPE_DEF = 0 #'CONTINUOUS' - default layer lineType
+ENTITYLAYER_DEF = LAYERNAME_DEF #default entity color index
+ENTITYCOLOR_DEF = BYLAYER #default entity color index
+ENTITYLTYPE_DEF = BYLAYER #default entity lineType
+E_M = 0
+LAB = "scroll MMB/WHEEL . wip .. todo" #"*) parts under construction"
+M_OBJ = 0
+
+FILENAME_MAX = 180 #max length of path+file_name string (FILE_MAXDIR + FILE_MAXFILE)
+MAX_NAMELENGTH = 17 #max_effective_obnamelength in blender =21=17+(.001)
+INIFILE_DEFAULT_NAME = 'exportDXF'
+INIFILE_EXTENSION = '.ini'
+INIFILE_HEADER = '#ExportDXF.py ver.1.0 config data'
+INFFILE_HEADER = '#ExportDXF.py ver.1.0 analyze of DXF-data'
+
+SCENE = None
+WORLDX = Mathutils.Vector((1,0,0))
+#TODO: a bug? WORLDY = Mathutils.Vector((1,1,0))
+WORLDY = Mathutils.Vector((0,1,0))
+WORLDZ = Mathutils.Vector((0,0,1))
+
+AUTO = BezTriple.HandleTypes.AUTO
+FREE = BezTriple.HandleTypes.FREE
+VECT = BezTriple.HandleTypes.VECT
+ALIGN = BezTriple.HandleTypes.ALIGN
+
+
+#-------- DWG support ------------------------------------------
+extCONV_OK = True
+extCONV = 'DConvertCon.exe'
+extCONV_PATH = os.path.join(Blender.Get('scriptsdir'),extCONV)
+if not os.path.isfile(extCONV_PATH):
+ extCONV_OK = False
+ extCONV_TEXT = 'DWG-Exporter: Abort, nothing done!|\
+Copy first %s into Blender script directory.|\
+More details in online Help.' %extCONV
+else:
+ if not os.sys.platform.startswith('win'):
+ # check if Wine installed:
+ if subprocess.Popen(('which', 'winepath'), stdout=subprocess.PIPE).stdout.read().strip():
+ extCONV_PATH = 'wine %s'%extCONV_PATH
+ else:
+ extCONV_OK = False
+ extCONV_TEXT = 'DWG-Exporter: Abort, nothing done!|\
+The external DWG-converter (%s) needs Wine installed on your system.|\
+More details in online Help.' %extCONV
+#print 'extCONV_PATH = ', extCONV_PATH
+
+
+#----------------------------------------------
+def updateMenuCAMERA():
+ global CAMERAS
+ global MenuCAMERA
+ global MenuLIGHT
+
+ scn = Scene.GetCurrent()
+ objs = scn.getChildren()
+ currcam = scn.getCurrentCamera()
+ if currcam: currcam = currcam.getName()
+ maincams = []
+ MenuCAMERA = "Select Camera%t"
+ for cam in objs:
+ if cam.getType() == 'Camera':
+ if cam.getName()[0:4] != "Temp":
+ maincams.append(cam.getName())
+ maincams.sort()
+ maincams.reverse()
+ CAMERAS = maincams
+ for i, cam in enumerate(CAMERAS):
+ if cam==currcam:
+ MenuCAMERA += "|* " + cam
+ else: MenuCAMERA += "| " + cam
+ MenuCAMERA += "|current 3d-View"
+ MenuLIGHT = "Select Sun%t| *todo"
+
+
+#----------------------------------------------
+def updateCAMERA():
+ global CAMERA, GUI_A
+ #CAMERA = 1
+ scn = Scene.GetCurrent()
+ currcam = scn.getCurrentCamera()
+ if currcam: currcam = currcam.getName()
+ if currcam in CAMERAS:
+ CAMERA = CAMERAS.index(currcam)+1
+ GUI_A['camera_on'].val = CAMERA
+
+#----------------------------------------------
+def gotoCAMERA():
+ cam = Object.Get(CAMERAS[CAMERA-1])
+ print 'deb: CAMERA, cam',CAMERA, cam
+ if cam.getType() != 'Camera':
+ sure = Draw.PupMenu("Info: %t| It is not a Camera Object.")
+ else:
+ scn = Scene.getCurrent()
+ scn.setCurrentCamera(cam)
+ Window.CameraView(0)
+ Window.Redraw()
+ updateMenuCAMERA()
+
+
+#------- Duplicats support ----------------------------------------------
def dupTest(object):
"""
Checks objects for duplicates enabled (any type)
@@ -160,7 +304,7 @@ def getObjectsAndDuplis(oblist,MATRICES=False,HACK=False):
result = []
for ob in oblist:
- if dupTest(ob):
+ if INCLUDE_DUPLIS and dupTest(ob):
dup_obs=ob.DupObjects
if len(dup_obs):
for dup_ob, dup_mx in dup_obs:
@@ -185,39 +329,52 @@ def getObjectsAndDuplis(oblist,MATRICES=False,HACK=False):
return result
#-----------------------------------------------------
-def hidden_status(faces, mx_n):
- #print 'HIDDEN_MODE: caution! not full implemented yet'
- ok_faces = []
- ok_edges = []
- #sort out back-faces = with normals pointed away from camera
+def hidden_status(faces, mx, mx_n):
+ # sort out back-faces = with normals pointed away from camera
+ print 'HIDDEN_LINES: caution! not full implemented yet'
+ front_faces = []
+ front_edges = []
for f in faces:
#print 'deb: face=', f #---------
+ #print 'deb: dir(face)=', dir(f) #---------
# get its normal-vector in localCS
vec_normal = f.no.copy()
#print 'deb: vec_normal=', vec_normal #------------------
- #must be transfered to camera/view-CS
+ # must be transfered to camera/view-CS
vec_normal *= mx_n
#vec_normal *= mb.rotationPart()
#print 'deb:2vec_normal=', vec_normal #------------------
#vec_normal *= mw0.rotationPart()
#print 'deb:3vec_normal=', vec_normal, '\n' #------------------
- # normal must point the Z direction-hemisphere
- if vec_normal[2] > 0.0 :
- ok_faces.append(f.index)
+
+ frontFace = False
+ if not PERSPECTIVE: #for ortho mode ----------
+ # normal must point the Z direction-hemisphere
+ if vec_normal[2] > 0.00001:
+ frontFace = True
+ else:
+ v = f.verts[0]
+ vert = Mathutils.Vector(v.co) * mx
+ if Mathutils.DotVecs(vert, vec_normal) < 0.00001:
+ frontFace = True
+
+ if frontFace:
+ front_faces.append(f.index)
for key in f.edge_keys:
#this test can be done faster with set()
- if key not in ok_edges:
- ok_edges.append(key)
- #print 'deb: amount of visible faces=', len(ok_faces) #---------
- #print 'deb: visible faces=', ok_faces #---------
- #print 'deb: amount of visible edges=', len(ok_edges) #---------
- #print 'deb: visible edges=', ok_edges #---------
- return ok_faces, ok_edges
+ if key not in front_edges:
+ front_edges.append(key)
+ #print 'deb: amount of visible faces=', len(front_faces) #---------
+ #print 'deb: visible faces=', front_faces #---------
+ #print 'deb: amount of visible edges=', len(front_edges) #---------
+ #print 'deb: visible edges=', front_edges #---------
+ return front_faces, front_edges
-#-----------------------------------------------------
-def projected_co(vec, mw):
+
+#--------not used-------------------------------------
+def projected_co0(vec, mw):
# convert the world coordinates of vector to screen coordinates
#co = vec.co.copy().resize4D()
co = vec.copy().resize4D()
@@ -235,181 +392,580 @@ def flatten(points, mw):
#print 'deb: flatten points=', points #---------
return points
+
#-----------------------------------------------------
-def exportMesh(ob, mx, mx_n,me=None):
- entities = []
+def getExtrusion(matrix):
+
+ print 'deb:getExtrusion() matrix=\n', matrix #---------
+ ma = matrix.copy().normalize()
+ AZaxis = ma[2] # = ArbitraryZvector
+ ArbitraryZaxis = [AZaxis[0],AZaxis[1],AZaxis[2]]
+ threshold = 1.0 / 64.0
+ if abs(Zaxis[0]) < threshold or abs(Zaxis[1]) < threshold:
+ #AXaxis = Mathutils.CrossVecs(WORLDY,AZaxis) #for<2.49
+ AXaxis = WORLDY.cross(AZaxis)
+ else:
+ #AXaxis = Mathutils.CrossVecs(WORLDZ,AZaxis) #for<2.49
+ AXaxis = WORLDZ.cross(AZaxis)
+
+ Rotation = Mathutils.AngleBetweenVecs(WORLDX,AXaxis) #output in degrees
+ Elevation = 1.0
+
+ return ArbitraryZaxis, Rotation, Elevation
+
+
+#-----------------------------------------------------
+def projected_co(verts, mx):
+ # converts world coordinates of points to screen coordinates
+ temp_verts = []
+ for v in verts:
+ #temp_verts.append(Blender.Mesh.MVert(v.co))
+ temp_verts.append(Mesh.MVert(v))
+ #print 'deb: temp_verts=', temp_verts #---------
+
+ if GUI_A['Z_force_on'].val: locZ = GUI_A['Z_elev'].val
+ else: locZ = 0.0
+
+ for v in temp_verts:
+ v.co *= mx
+ if PROJECTION:
+ if PERSPECTIVE:
+ clipStart = 10.0
+ for v in temp_verts:
+ coef = - clipStart / v.co[2]
+ v.co[0] *= coef
+ v.co[1] *= coef
+ v.co[2] = locZ
+ for v in temp_verts:
+ v.co[2] = locZ
+ temp_verts = [v.co[:3] for v in temp_verts]
+ return temp_verts
+
+
+#-----------------------------------------------------
+def isLeftHand(matrix):
+ #Is the matrix a left-hand-system, or not?
+ ma = matrix.rotationPart()
+ #crossXY = Mathutils.CrossVecs(ma[0], ma[1]) #for<2.49
+ crossXY = ma[0].cross(ma[1])
+ #check = Mathutils.DotVecs(ma[2], crossXY) #for<2.49
+ check = ma[2].dot(crossXY)
+ if check < 0.00001: return 1
+ return 0
+
+
+#-----------------------------------------------------
+def exportMesh(ob, mx, mx_n, me=None, **common):
global APPLY_MODIFIERS
- if me is None:
+ entities = []
+ #print 'deb:exportMesh() common=', common #---------
+ if me is None: # me means mesh
me = ob.getData(mesh=1)
else:
me.getFromObject(ob)
- #me.transform(mx)
+ # me.transform(mx); get verts data; me.transform(mx_inv)= back to the origin state
# above is eventualy faster, but bad, cause
- # directly transforms origin geometry and write back rounding errors
- me_verts = me.verts[:] #we dont want manipulate origin data
- #print 'deb: me_verts=', me_verts #---------
- #me.transform(mx_inv) #counterpart to - back to the origin state
- for v in me_verts:
- v.co *= mx
- faces=[]
- edges=[]
- if HIDDEN_MODE:
- ok_faces, ok_edges = hidden_status(me.faces, mx_n)
-
- #if (not FLATTEN) and len(me.faces)>0 and ONLYFACES:
- if ONLYFACES:
- if POLYFACES: #export 3D as POLYFACEs
- allpoints = []
- allfaces = []
- allpoints = [v.co[:3] for v in me_verts]
- for f in me.faces:
- #print 'deb: face=', f #---------
- if not HIDDEN_MODE or \
- (HIDDEN_MODE and f.index in ok_faces):
- if 1:
- points = f.verts
- face = [p.index+1 for p in points]
- #print 'deb: face=', face #---------
- allfaces.append(face)
- else: #bad, cause create multiple vertex instances
- points = f.verts
- points = [ me_verts[p.index].co[:3] for p in points]
- #points = [p.co[:3] for p in points]
- #print 'deb: points=', points #---------
- index = len(allpoints)+1
- face = [index+i for i in range(len(points))]
- allpoints.extend(points)
- allfaces.append(face)
- if allpoints and allfaces:
- #print 'deb: allpoints=', allpoints #---------
- #print 'deb: allfaces=', allfaces #---------
- dxfPOLYFACE = PolyLine([allpoints, allfaces], flag=64)
- entities.append(dxfPOLYFACE)
- else: #export 3D as 3DFACEs
- for f in me.faces:
- #print 'deb: face=', f #---------
- if not HIDDEN_MODE or \
- (HIDDEN_MODE and f.index in ok_faces):
- points = f.verts
- points = [ me_verts[p.index].co[:3] for p in points]
+ # invasive: directly transforms origin geometry and write back rounding errors
+ #we dont want to manipulate origin data
+ #temp_verts = me.verts[:] #doesn't work on ubuntu(Yorik), bug?
+ if me.verts:
+ #print 'deb:exportMesh() started' #---------
+ allpoints = [v.co for v in me.verts]
+ allpoints = projected_co(allpoints, mx)
+ if GUI_A['g_origin_on'].val: #TODO: scale and object orientation
+ for p in allpoints:
+ p[0] += G_ORIGIN[0]
+ p[1] += G_ORIGIN[1]
+ p[2] += G_ORIGIN[2]
+ faces=[]
+ edges=[]
+ if me.faces and HIDDEN_LINES:
+ if DEBUG: print 'deb:exportMesh HIDDEN_LINES mode' #---------
+ faces, edges = hidden_status(me.faces, mx, mx_n)
+ faces = [[v.index for v in me.faces[f_nr].verts] for f_nr in faces]
+ else:
+ if DEBUG: print 'deb:exportMesh STANDARD mode' #---------
+ for e in me.edges: edges.append(e.key)
+ #faces = [f.index for f in me.faces]
+ faces = [[v.index for v in f.verts] for f in me.faces]
+ #faces = [[allpoints[v.index] for v in f.verts] for f in me.faces]
+ #print 'deb: allpoints=\n', allpoints #---------
+ #print 'deb: edges=\n', edges #---------
+ #print 'deb: faces=\n', faces #---------
+ if isLeftHand(mx): # then change vertex-order in every face
+ for f in faces:
+ f.reverse()
+ #f = [f[-1]] + f[:-1] #TODO: might be needed
+ #print 'deb: faces=\n', faces #---------
+
+ c = mesh_as_list[GUI_A['mesh_as'].val]
+ if 'POINTs'==c: # export Mesh as multiple POINTs
+ for p in allpoints:
+ dxfPOINT = DXF.Point(p, **common)
+ entities.append(dxfPOINT)
+ elif 'LINEs'==c or (not faces):
+ if edges and allpoints:
+ if DEBUG: mesh_drawBlender(allpoints, edges, None) #deb: draw to blender scene
+ for e in edges:
+ points = [allpoints[e[0]], allpoints[e[1]]]
+ dxfLINE = DXF.Line(points, **common)
+ entities.append(dxfLINE)
+ elif faces:
+ if c in ('POLYFACE','POLYLINE'):
+ if allpoints:
+ #TODO: purge allpoints: left only vertices used by faces
+ if DEBUG: mesh_drawBlender(allpoints, None, faces) #deb: draw to scene
+ faces = [[v+1 for v in f] for f in faces]
+ 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)
+ #print '\n deb: dxfPOLYFACE=',dxfPOLYFACE #-------------
+ entities.append(dxfPOLYFACE)
+ elif '3DFACEs'==c:
+ if DEBUG: mesh_drawBlender(allpoints, None, faces) #deb: draw to scene
+ for f in faces:
+ #print 'deb: face=', f #---------
+ points = [allpoints[key] for key in f]
#points = [p.co[:3] for p in points]
- #print 'deb: points=', points #---------
- dxfFACE = Face(points)
+ #print 'deb: pointsXX=\n', points #---------
+ dxfFACE = DXF.Face(points, **common)
entities.append(dxfFACE)
+
+ return entities
+
+#-----------------------------------------------------
+def mesh_drawBlender(vertList, edgeList, faceList, name="dxfMesh", flatten=False, AT_CUR=True, link=True):
+ #print 'deb:mesh_drawBlender started XXXXXXXXXXXXXXXXXX' #---------
+ ob = Object.New("Mesh",name)
+ me = Mesh.New(name)
+ #print 'deb: vertList=\n', vertList #---------
+ #print 'deb: edgeList=\n', edgeList #---------
+ #print 'deb: faceList=\n', faceList #---------
+ me.verts.extend(vertList)
+ if edgeList: me.edges.extend(edgeList)
+ if faceList: me.faces.extend(faceList)
+ if flatten:
+ for v in me.verts: v.co.z = 0.0
+ ob.link(me)
+ if link:
+ sce = Scene.getCurrent()
+ sce.objects.link(ob)
+ #me.triangleToQuad()
+ if AT_CUR:
+ cur_loc = Window.GetCursorPos()
+ ob.setLocation(cur_loc)
+ Blender.Redraw()
+ #return ob
- else: #export 3D as LINEs
- if HIDDEN_MODE and len(me.faces)!=0:
- for e in ok_edges:
- points = [ me_verts[key].co[:3] for key in e]
- dxfLINE = Line(points)
- entities.append(dxfLINE)
+#-----------------------------------------------------
+def curve_drawBlender(vertList, org_point=[0.0,0.0,0.0], closed=0, name="dxfCurve", flatten=False, AT_CUR=True, link=True):
+ #print 'deb:curve_drawBlender started XXXXXXXXXXXXXXXXXX' #---------
+ ob = Object.New("Curve",name)
+ cu = Curve.New(name)
+ #print 'deb: vertList=\n', vertList #---------
+ curve = cu.appendNurb(BezTriple.New(vertList[0]))
+ for p in vertList[1:]:
+ curve.append(BezTriple.New(p))
+ for point in curve:
+ #point.handleTypes = [VECT, VECT]
+ point.handleTypes = [FREE, FREE]
+ point.radius = 1.0
+ curve.flagU = closed # 0 sets the curve not cyclic=open
+ cu.setResolu(6)
+ cu.update() #important for handles calculation
+ if flatten:
+ for v in cu.verts: v.co.z = 0.0
+ ob.link(cu)
+ if link:
+ sce = Scene.getCurrent()
+ sce.objects.link(ob)
+ #me.triangleToQuad()
+ if AT_CUR:
+ cur_loc = Window.GetCursorPos()
+ ob.setLocation(cur_loc)
+ elif org_point:
+ cur_loc=org_point
+ ob.setLocation(cur_loc)
+ Blender.Redraw()
+ #return ob
- else:
- for e in me.edges:
- #print 'deb: edge=', e #---------
- points=[]
- #points = [e.v1.co*mx, e.v2.co*mx]
- points = [ me_verts[key].co[:3] for key in e.key]
- #print 'deb: points=', points #---------
- dxfLINE = Line(points)
- entities.append(dxfLINE)
+
+#-----------------------------------------------------
+def exportEmpty(ob, mx, mw, _common=None):
+ entities = []
+
+ if GUI_A['empty_as'].val==1: # export Empty as POINT
+ p = ob.loc
+ dxfPOINT = Point(p)
+ entities.append(dxfPOINT)
return entities
#-----------------------------------------------------
-def exportCurve(ob, mx):
+def exportCurve(ob, mx, mw, _common=None):
entities = []
curve = ob.getData()
+
+ """ if not PROJECTION:
+ Extrusion, Rotation, Elevation = getExtrusion(mx)
+ else:
+ Extrusion = None
+ """
+
for cur in curve:
- #print 'deb: START cur=', cur #--------------
- if 1: #not cur.isNurb():
- #print 'deb: START points' #--------------
- points = []
- org_point = [0.0,0.0,0.0]
+ print 'deb: START cur=', cur #--------------
+ org_point = [0.0,0.0,0.0]
+ points = []
+ if cur.isNurb():
for point in cur:
- #print 'deb: point=', point #---------
- if cur.isNurb():
- vec = point[0:3]
- else:
- point = point.getTriple()
- #print 'deb: point=', point #---------
- vec = point[1]
+ #print 'deb:isNurb point=', point #---------
+ vec = point[0:3]
#print 'deb: vec=', vec #---------
- pkt = Mathutils.Vector(vec) * mx
+ pkt = Mathutils.Vector(vec)
#print 'deb: pkt=', pkt #---------
- #pkt *= SCALE_FACTOR
- if 0: #FLATTEN:
- pkt = projected_co(pkt, mw)
points.append(pkt)
+ else:
+ for point in cur:
+ #point = point.getTriple()
+ #print 'deb:isBezier point=', point #---------
+ vec = point.getTriple()[1]
+ #print 'deb: vec=', vec #---------
+ pkt = Mathutils.Vector(vec)
+ #print 'deb: pkt=', pkt #---------
+ points.append(pkt)
+ if len(points)>1:
+ #print 'deb: points', points #--------------
+ points = projected_co(points, mx)
if cur.isCyclic(): closed = 1
else: closed = 0
- if len(points)>1:
- #print 'deb: points', points #--------------
- if POLYLINES: dxfPLINE = PolyLine(points,org_point,closed)
- else: dxfPLINE = LineList(points,org_point,closed)
+ if DEBUG: curve_drawBlender(points,org_point,closed) #deb: draw to scene
+ 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:
+ dxfPOINT = DXF.Point(p,**common)
+ entities.append(dxfPOINT)
return entities
#-----------------------------------------------------
+def getClipBox(camera):
+ sce = Scene.GetCurrent()
+ context = sce.getRenderingContext()
+ #print 'deb: context=\n', context #------------------
+ #print 'deb: context=\n', dir(context) #------------------
+ sizeX = context.sizeX
+ sizeY = context.sizeY
+ ratioXY = sizeX/float(sizeY)
+ #print 'deb: size X,Y, ratio=', sizeX, sizeY, ratioXY #------------------
+
+ clip1_Z = - camera.clipStart
+ clip2_Z = - camera.clipEnd
+ #print 'deb: clip Start=', camera.clipStart #------------------
+ #print 'deb: clip End=', camera.clipEnd #------------------
+
+ if camera.type=='ortho':
+ scale = camera.scale
+ #print 'deb: camscale=', scale #------------------
+ clip1shiftX = clip2shiftX = camera.shiftX * scale
+ clip1shiftY = clip2shiftY = camera.shiftY * scale
+ clip1_X = scale * 0.5
+ clip1_Y = scale * 0.5
+ if ratioXY > 1.0: clip1_Y /= ratioXY
+ else: clip1_X *= ratioXY
+ clip2_X = clip1_X
+ clip2_Y = clip1_Y
+
+ near = clip1_Z
+ far = clip2_Z
+ right, left = clip1_X, -clip1_X
+ top, bottom = clip1_Y, -clip1_Y
+
+ scaleX = 2.0/float(right - left)
+ x3 = -float(right + left)/float(right - left)
+ scaleY = 2.0/float(top - bottom)
+ y3 = -float(top + bottom)/float(top - bottom)
+ scaleZ = 1.0/float(far - near)
+ z3 = -float(near)/float(far - near)
+
+ matr = Mathutils.Matrix( [scaleX, 0.0, 0.0, x3],
+ [0.0, scaleY, 0.0, y3],
+ [0.0, 0.0, scaleZ, z3],
+ [0.0, 0.0, 0.0, 1.0])
+
+ elif camera.type=='persp':
+ #viewpoint = [0.0, 0.0, 0.0] #camera's coordinate system, hehe
+ #lens = camera.lens
+ angle = camera.angle
+ #print 'deb: cam angle=', angle #------------------
+ shiftX = camera.shiftX
+ shiftY = camera.shiftY
+ fov_coef = atan(angle * d2r)
+ fov_coef *= 1.3 #incl. passpartou
+ clip1_k = clip1_Z * fov_coef
+ clip2_k = clip2_Z * fov_coef
+ clip1shiftX = - camera.shiftX * clip1_k
+ clip2shiftX = - camera.shiftX * clip2_k
+ clip1shiftY = - camera.shiftY * clip1_k
+ clip2shiftY = - camera.shiftY * clip2_k
+ clip1_X = clip1_Y = clip1_k * 0.5
+ clip2_X = clip2_Y = clip2_k * 0.5
+ if ratioXY > 1.0:
+ clip1_Y /= ratioXY
+ clip2_Y /= ratioXY
+ else:
+ clip1_X *= ratioXY
+ clip2_X *= ratioXY
+
+ near = clip1_Z
+ far = clip2_Z
+ right, left = clip1_X, -clip1_X
+ top, bottom = clip1_Y, -clip1_Y
+ #return Matrix( [scaleX, 0.0, x2, 0.0],
+ #[0.0, scaleY, y2, 0.0],
+ #[0.0, 0.0, scaleZ, wZ],
+ #[0.0, 0.0, -1.0, 0.0])
+ matr = Mathutils.Matrix( [(2.0 * near)/float(right - left), 0.0, float(right + left)/float(right - left), 0.0],
+ [0.0, (2.0 * near)/float(top - bottom), float(top + bottom)/float(top - bottom), 0.0],
+ [0.0, 0.0, -float(far + near)/float(far - near), -(2.0 * far * near)/float(far - near)],
+ [0.0, 0.0, -1.0, 0.0])
+
+
+ clip_box = [
+ -clip1_X + clip1shiftX, clip1_X + clip1shiftX,
+ -clip1_Y + clip1shiftY, clip1_Y + clip1shiftY,
+ -clip2_X + clip2shiftX, clip2_X + clip2shiftX,
+ -clip2_Y + clip2shiftY, clip2_Y + clip2shiftY,
+ clip1_Z, clip2_Z]
+ #print 'deb: clip_box=\n', clip_box #------------------
+ #drawClipBox(clip_box)
+ return clip_box, matr
+
+
+#-----------------------------------------------------
+def drawClipBox(clip_box):
+ min_X1, max_X1, min_Y1, max_Y1,\
+ min_X2, max_X2, min_Y2, max_Y2,\
+ min_Z, max_Z = clip_box
+ verts = []
+ verts.append([min_X1, min_Y1, min_Z])
+ verts.append([max_X1, min_Y1, min_Z])
+ verts.append([max_X1, max_Y1, min_Z])
+ verts.append([min_X1, max_Y1, min_Z])
+ verts.append([min_X2, min_Y2, max_Z])
+ verts.append([max_X2, min_Y2, max_Z])
+ verts.append([max_X2, max_Y2, max_Z])
+ verts.append([min_X2, max_Y2, max_Z])
+ faces = [[0,1,2,3],[4,5,6,7]]
+ nme = Mesh.New()
+ nme.verts.extend(verts)
+ nme.faces.extend(faces)
+
+ plan = Object.New('Mesh','clip_box')
+ plan.link(nme)
+ sce = Scene.GetCurrent()
+ sce.objects.link(plan)
+ plan.setMatrix(sce.objects.camera.matrix)
+
+
+#-------------------------------------------------
+def getCommons(ob):
+ #set up common attributes for output style:
+ # color=None
+ # extrusion=None
+ # layer='0',
+ # lineType=None
+ # lineTypeScale=None
+ # lineWeight=None
+ # thickness=None
+ # parent=None
+
+ layers = ob.layers #gives a list e.g.[1,5,19]
+ if layers: ob_layer_nr = layers[0]
+ #print 'ob_layer_nr=', ob_layer_nr #--------------
+
+ materials = ob.getMaterials()
+ if materials:
+ ob_material = materials[0]
+ ob_mat_color = ob_material.rgbCol
+ else: ob_mat_color, ob_material = None, None
+ #print 'ob_mat_color, ob_material=', ob_mat_color, ob_material #--------------
+
+ data = ob.getData()
+ data_materials = ob.getMaterials()
+ if data_materials:
+ data_material = data_materials[0]
+ data_mat_color = data_material.rgbCol
+ else: data_mat_color, data_material = None, None
+ #print 'data_mat_color, data_material=', data_mat_color, data_material #--------------
+
+ entitylayer = ENTITYLAYER_DEF
+ c = entitylayer_from_list[GUI_A['entitylayer_from'].val]
+ #["default_LAYER","obj.name","obj.layer","obj.material","obj.data.name","obj.data.material","..vertexgroup","..group","..map_table"]
+ if c=="default_LAYER":
+ entitylayer = LAYERNAME_DEF
+ elif c=="obj.layer" and ob_layer_nr:
+ entitylayer = 'LAYER'+ str(ob_layer_nr)
+ elif c=="obj.material" and ob_material:
+ entitylayer = ob_material.name
+ elif c=="obj.name":
+ entitylayer = ob.name
+ elif c=="obj.data.material" and ob_material:
+ entitylayer = data_material.name
+ elif c=="obj.data.name":
+ entitylayer = data.name
+ entitylayer = validDXFr12name(PREFIX+entitylayer)
+ if entitylayer=="": entitylayer = "BF_0"
+
+ entitycolor = ENTITYCOLOR_DEF
+ c = entitycolor_from_list[GUI_A['entitycolor_from'].val]
+ if c=="default_COLOR":
+ entitycolor = LAYERCOLOR_DEF
+ elif c=="BYLAYER":
+ entitycolor = BYLAYER
+ elif c=="BYBLOCK":
+ entitycolor = BYBLOCK
+ elif c=="obj.layer" and ob_layer_nr:
+ entitycolor = ob_layer_nr
+ elif c=="obj.color" and ob.color:
+ entitycolor = col2DXF(ob.color)
+ elif c=="obj.material" and ob_mat_color:
+ entitycolor = col2DXF(ob_mat_color)
+ elif c=="obj.data.material" and data_mat_color:
+ entitycolor = col2DXF(data_mat_color)
+ #if entitycolor!=None: layercolor = entitycolor
+
+ entityltype = ENTITYLTYPE_DEF
+ c = entityltype_from_list[GUI_A['entityltype_from'].val]
+ if c=="default_LTYPE":
+ entityltype = LAYERLTYPE_DEF
+ elif c=="BYLAYER":
+ entityltype = BYLAYER
+ elif c=="BYBLOCK":
+ entityltype = BYBLOCK
+ elif c:
+ entityltype = c
+
+ return entitylayer,entitycolor,entityltype
+
+
+#-----------------------------------------------------
def do_export(export_list, filepath):
+ global PERSPECTIVE
Window.WaitCursor(1)
- t = sys.time()
+ t = Blender.sys.time()
#init Drawing ---------------------
- d=Drawing()
+ d=DXF.Drawing()
#add Tables -----------------
- #d.blocks.append(b) #table blocks
- d.styles.append(Style()) #table styles
- d.views.append(View('Normal')) #table view
- d.views.append(ViewByWindow('Window',leftBottom=(1,0),rightTop=(2,1))) #idem
+ #d.blocks.append(b) #table blocks
+ #goes automatic: d.styles.append(DXF.Style()) #table styles
+ d.views.append(DXF.View('Normal')) #table view
+ d.views.append(DXF.ViewByWindow('Window',leftBottom=(1,0),rightTop=(2,1))) #idem
#add Entities --------------------
- something_ready = False
- #ViewVector = Mathutils.Vector(Window.GetViewVector())
- #print 'deb: ViewVector=', ViewVector #------------------
- mw0 = Window.GetViewMatrix()
- #mw0 = Window.GetPerspMatrix() #TODO: how get it working?
- mw = mw0.copy()
- if FLATTEN:
- m0 = Mathutils.Matrix()
- m0[2][2]=0.0
- mw *= m0 #flatten ViewMatrix
-
- if APPLY_MODIFIERS:
- tmp_me = Mesh.New('tmp')
- else:
- tmp_me = None
+ something_ready = 0
+ sce = Scene.GetCurrent()
+ mw = Mathutils.Matrix( [1.0, 0.0, 0.0, 0.0],
+ [0.0, 1.0, 0.0, 0.0],
+ [0.0, 0.0, 1.0, 0.0],
+ [0.0, 0.0, 0.0, 1.0])
+ if PROJECTION:
+ if CAMERA<len(CAMERAS)+1: #the biggest number is the current view
+ act_camera = Object.Get(CAMERAS[CAMERA-1])
+ context = sce.getRenderingContext()
+ #print 'deb: context=\n', context #------------------
+ #print 'deb: context=\n', dir(context) #------------------
+ #act_camera = sce.objects.camera
+ #print 'deb: act_camera=', act_camera #------------------
+ if act_camera:
+ mc0 = act_camera.matrix.copy()
+ #print 'deb: camera.Matrix=\n', mc0 #------------------
+ camera = Camera.Get(act_camera.getData(name_only=True))
+ #print 'deb: camera=', dir(camera) #------------------
+ if camera.type=='persp': PERSPECTIVE = 1
+ elif camera.type=='ortho': PERSPECTIVE = 0
+ clip_box, mcp = getClipBox(camera)
+
+ #mcp = getPerspMatrix(camera)
+ mw = mc0.copy().invert()
+
+ else: # get 3D-View instead of camera
+ #ViewVector = Mathutils.Vector(Window.GetViewVector())
+ #print 'deb: ViewVector=\n', ViewVector #------------------
+ #TODO: for what is Window.GetViewOffset() ??
+ #print 'deb: Window.GetViewOffset():', Window.GetViewOffset() #---------
+ #Window.SetViewOffset([0,0,0])
+ #print 'deb: Window.GetViewOffset():', Window.GetViewOffset() #---------
+ mw0 = Window.GetViewMatrix()
+ #print 'deb: mwOrtho =\n', mw0 #---------
+ mwp = Window.GetPerspMatrix() #TODO: how get it working?
+ #print 'deb: mwPersp =\n', mwp #---------
+ #mw0 = mwp
+ #clip_box = getClipBox(camera, context)
+ mw = mw0.copy()
+
+ #print 'deb: ViewMatrix=\n', mw #------------------
+
+ if APPLY_MODIFIERS: tmp_me = Mesh.New('tmp')
+ else: tmp_me = None
+
+ layernames = []
for ob,mx in export_list:
entities = []
#mx = ob.matrix.copy()
- mb = mx.copy()
- #print 'deb: mb =\n', mb #---------
- #print 'deb: mw0 =\n', mw0 #---------
- mx_n = mx.rotationPart() * mw0.rotationPart() #trans-matrix for normal_vectors
- if SCALE_FACTOR!=1.0: mx *= SCALE_FACTOR
- if FLATTEN: mx *= mw
-
+ #print 'deb: ob =', ob #---------
+ #print 'deb: mx =\n', mx #---------
+ #print 'deb: mw0 =\n', mw0 #---------
+ #mx_n is trans-matrix for normal_vectors for front-side faces
+ mx_n = mx.rotationPart() * mw.rotationPart()
+ if G_SCALE!=1.0: mx *= G_SCALE
+ mx *= mw
+
#mx_inv = mx.copy().invert()
- #print 'deb: mx =\n', mx #---------
+ #print 'deb: mx =\n', mx #---------
#print 'deb: mx_inv=\n', mx_inv #---------
- if (ob.type == 'Mesh'):
- entities = exportMesh(ob, mx, mx_n,tmp_me)
- elif (ob.type == 'Curve'):
- entities = exportCurve(ob, mx)
+ if ob.type in ('Mesh', 'Curve', 'Empty'):
+ elayer,ecolor,eltype = getCommons(ob)
+ #print 'deb: elayer,ecolor,eltype =', elayer,ecolor,eltype #--------------
+ if elayer!=None:
+ if elayer not in layernames:
+ layernames.append(elayer)
+ if ecolor!=None: tempcolor = ecolor
+ else: tempcolor = LAYERCOLOR_DEF
+ d.layers.append(DXF.Layer(color=tempcolor, name=elayer))
+
+ if (ob.type == 'Mesh') and GUI_B['bmesh'].val:
+ entities = exportMesh(ob, mx, mx_n, tmp_me,\
+ color=ecolor, layer=elayer, lineType=eltype)
+ elif (ob.type == 'Curve') and GUI_B['bcurve'].val:
+ entities = exportCurve(ob, mx, mw, \
+ color=ecolor, layer=elayer, lineType=eltype)
+ elif (ob.type == 'Empty') and GUI_B['empty'].val:
+ entities = exportEmpty(ob, mx, mw, \
+ color=ecolor, layer=elayer, lineType=eltype)
+
for e in entities:
d.append(e)
- something_ready = True
+ something_ready += 1
if something_ready:
- if not OUTPUT_DWG:
+ if not GUI_A['outputDWG_on'].val:
print 'exporting to %s' % filepath
- d.saveas(filepath)
+ try: d.saveas(filepath)
+ except IOError:
+ Draw.PupMenu('DXF Exporter: Write Error: Permission denied:| %s' %filepath)
+
Window.WaitCursor(0)
- #Draw.PupMenu('DXF Exporter: job finished')
- print ' finished in %.2f seconds. -----DONE-----' % (sys.time()-t)
+ #print '%s objects exported to %s' %(something_ready,filepath)
+ 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)))
else:
if not extCONV_OK:
Draw.PupMenu(extCONV_TEXT)
@@ -419,118 +975,1476 @@ def do_export(export_list, filepath):
d.saveas(filepath)
#Draw.PupMenu('DXF Exporter: job finished')
#print 'exported to %s' % filepath
- #print 'finished in %.2f seconds' % (sys.time()-t)
+ #print 'finished in %.2f seconds' % (Blender.sys.time()-t)
filedwg = filepath[:-3]+'dwg'
print 'exporting to %s' % filedwg
os.system('%s %s -acad13 -dwg' %(extCONV_PATH,filepath))
#os.chdir(cwd)
os.remove(filepath)
Window.WaitCursor(0)
- print ' finished in %.2f seconds. -----DONE-----' % (sys.time()-t)
-
+ print ' finished in %.2f seconds. -----DONE-----' % (Blender.sys.time()-t)
else:
Window.WaitCursor(0)
- print "Abort: selected objects dont mach choosen export option, nothing exported!"
- Draw.PupMenu('DXF Exporter: nothing exported!|selected objects dont mach choosen export option!')
+ print "Abort: selected objects dont match choosen export option, nothing exported!"
+ Draw.PupMenu('DXF Exporter: nothing exported!|selected objects dont match choosen export option!')
-#----globals------------------------------------------
-ONLYSELECTED = True
-POLYLINES = True
-ONLYFACES = False
-POLYFACES = 1
-FLATTEN = 0
-HIDDEN_MODE = False #filter out hidden lines
-SCALE_FACTOR = 1.0 #optional, can be done later in CAD too
-APPLY_MODIFIERS = True
-INCLUDE_DUPLIS = False
-OUTPUT_DWG = False #optional save to DWG with extern converter
-#-----------------------------------------------------
-def dxf_export_ui(filepath):
- global ONLYSELECTED,\
- POLYLINES,\
- ONLYFACES,\
- POLYFACES,\
- FLATTEN,\
- HIDDEN_MODE,\
- SCALE_FACTOR,\
- APPLY_MODIFIERS,\
- OUTPUT_DWG,\
- INCLUDE_DUPLIS
-
- print '\n\nDXF-Export %s -----------START-----------' %__version__
- #filepath = 'blend_test.dxf'
- # Dont overwrite
- if not BPyMessages.Warning_SaveOver(filepath):
- print 'Aborted by user: nothing exported'
- return
- #test():return
-
-
- PREF_ONLYSELECTED= Draw.Create(ONLYSELECTED)
- PREF_POLYLINES= Draw.Create(POLYLINES)
- PREF_ONLYFACES= Draw.Create(ONLYFACES)
- PREF_POLYFACES= Draw.Create(POLYFACES)
- PREF_FLATTEN= Draw.Create(FLATTEN)
- PREF_HIDDEN_MODE= Draw.Create(HIDDEN_MODE)
- PREF_SCALE_FACTOR= Draw.Create(SCALE_FACTOR)
- PREF_APPLY_MODIFIERS= Draw.Create(APPLY_MODIFIERS)
- PREF_INCLUDE_DUPLIS= Draw.Create(INCLUDE_DUPLIS)
- PREF_HELP= Draw.Create(0)
- PREF_DWG= Draw.Create(OUTPUT_DWG)
- block = [\
- ("only selected", PREF_ONLYSELECTED, "export only selected geometry"),\
- ("Apply Modifiers", PREF_APPLY_MODIFIERS, "Apply modifier stack to mesh objects before export"),\
- ("Include Duplis", PREF_INCLUDE_DUPLIS, "Export also Duplicates (dupliverts, dupliframes etc)"),\
- ("global Scale:", PREF_SCALE_FACTOR, 0.001, 1000, "set global Scale factor for exporting geometry"),\
- (''),\
- ("export to 3DFaces", PREF_ONLYFACES, "from mesh-objects export only faces, otherwise only edges"),\
- ("mesh to POLYFACE", PREF_POLYFACES, "export mesh to POLYFACE, otherwise to 3DFACEs"),\
- ("curves to POLYLINEs", PREF_POLYLINES, "export curve to POLYLINE, otherwise to LINEs"),\
- ("3D-View to Flat", PREF_FLATTEN, "flatten geometry according current 3d-View"),\
- ("Hidden Mode", PREF_HIDDEN_MODE, "filter out hidden lines"),\
- ("online Help", PREF_HELP, "calls DXF-Exporter Manual Page on Wiki.Blender.org"),\
- (''),\
- ("DXF->DWG", PREF_DWG, "writes DWG with extern converter"),\
- ]
-
- if not Draw.PupBlock("DXF-Exporter %s" %__version__[:10], block): return
-
- if PREF_HELP.val!=0:
+#------------------------------------------------------
+"""
+v = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,\
+28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,46,47,58,59,60,61,62,63,64,91,92,93,94,96,\
+123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,\
+151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,\
+171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,\
+191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,\
+211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,\
+231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254]
+invalid = ''.join([chr(i) for i in v])
+del v, i
+"""
+#TODO: validDXFr14 = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.'
+validDXFr12 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_'
+
+#------------------------------------------------------
+def cleanName(name,valid):
+ validname = ''
+ for ch in name:
+ if ch not in valid: ch = '_'
+ validname += ch
+ return validname
+
+#------------------------------------------------------
+def validDXFr12name(str_name):
+ dxfname = str(str_name)
+ dxfname = dxfname[:MAX_NAMELENGTH].upper()
+ dxfname = cleanName(dxfname,validDXFr12)
+ return dxfname
+
+#print cleanName('dumka',validDXFr12)
+#print validDXFr12name('dum 15%ka')
+
+#------------------------------------------------------
+def col2RGB(color):
+ return [int(floor(255*color[0])),
+ int(floor(255*color[1])),
+ int(floor(255*color[2]))]
+
+global dxfColors
+dxfColors=None
+
+#------------------------------------------------------
+def col2DXF(rgbcolor):
+ global dxfColors
+ if dxfColors is None:
+ from dxfColorMap import color_map
+ dxfColors = [(tuple(color),idx) for idx, color in color_map.iteritems()]
+ dxfColors.sort()
+ entry = (tuple(rgbcolor), -1)
+ dxfColors.append(entry)
+ dxfColors.sort()
+ i = dxfColors.index(entry)
+ dxfColors.pop(i)
+ return dxfColors[i-1][1]
+
+
+
+# NEW UI -----#################################################-----------------
+# ------------#################################################-----------------
+
+class Settings: #-----------------------------------------------------------------
+ """A container for all the import settings and objects used by the draw functions.
+
+ This is like a collection of globally accessable persistant properties and functions.
+ """
+ # Optimization constants
+ MIN = 0
+ MID = 1
+ PRO = 2
+ MAX = 3
+
+ def __init__(self, keywords, drawTypes):
+ """initialize all the important settings used by the draw functions.
+ """
+ self.obj_number = 1 #global object_number for progress_bar
+
+ self.var = dict(keywords) #a dictionary of (key_variable:Value) control parameter
+ self.drawTypes = dict(drawTypes) #a dictionary of (entity_type:True/False) = import on/off for this entity_type
+
+ self.var['colorFilter_on'] = False #deb:remi------------
+ self.acceptedColors = [0,2,3,4,5,6,7,8,9,
+ 10 ]
+
+ self.var['materialFilter_on'] = False #deb:remi------------
+ self.acceptedLayers = ['3',
+ '0'
+ ]
+
+ self.var['groupFilter_on'] = False #deb:remi------------
+ self.acceptedLayers = ['3',
+ '0'
+ ]
+
+ #self.var['objectFilter_on'] = 0 #deb:remi------------
+ self.acceptedBlocks = ['WALL_1871',
+ 'BOX02'
+ ]
+ self.unwantedBlocks = ['BOX05',
+ 'BOX04'
+ ]
+
+
+ def update(self, keywords, drawTypes):
+ """update all the important settings used by the draw functions.
+ mostly used after loading parameters from INI-file
+ """
+
+ for k, v in keywords.iteritems():
+ self.var[k] = v
+ #print 'deb:settings_update var %s= %s' %(k, self.var[k]) #--------------
+ for t, v in drawTypes.iteritems():
+ self.drawTypes[t] = v
+ #print 'deb:settings_update drawType %s= %s' %(t, self.drawTypes[t]) #--------------
+
+ self.drawTypes['arc'] = self.drawTypes['surface']
+ self.drawTypes['circle'] = self.drawTypes['surface']
+ self.drawTypes['ellipse'] = self.drawTypes['surface']
+ self.drawTypes['trace'] = self.drawTypes['solid']
+ self.drawTypes['insert'] = self.drawTypes['group']
+ #self.drawTypes['vport'] = self.drawTypes['view']
+
+ #print 'deb:self.drawTypes', self.drawTypes #---------------
+
+
+ def validate(self, drawing):
+ """Given the drawing, build dictionaries of Layers, Colors and Blocks.
+ """
+ global oblist
+ #adjust the distance parameter to globalScale
+ if self.var['g_scale'] != 1.0:
+ self.var['dist_min'] = self.var['dist_min'] / self.var['g_scale']
+ self.g_origin = Mathutils.Vector(self.var['g_originX'], self.var['g_originY'], self.var['g_originZ'])
+
+
+ def write(self, text, newline=True):
+ """Wraps the built-in print command in a optimization check.
+ """
+ if self.var['optimization'] <= self.MID:
+ if newline:
+ print text
+ else:
+ print text,
+
+
+ def redraw(self):
+ """Update Blender if optimization level is low enough.
+ """
+ if self.var['optimization'] <= self.MIN:
+ Blender.Redraw()
+
+
+ def progress(self, done, text):
+ """Wrapper for Blender.Window.DrawProgressBar.
+ """
+ if self.var['optimization'] <= self.PRO:
+ progressbar = done * self.obj_number
+ Window.DrawProgressBar(progressbar, text)
+ #print 'deb:drawer done, progressbar: ', done, progressbar #-----------------------
+
+
+
+# GUI STUFF -----#################################################-----------------
+from Blender.BGL import *
+
+EVENT_NONE = 1
+EVENT_START = 2
+EVENT_REDRAW = 3
+EVENT_LOAD_INI = 4
+EVENT_SAVE_INI = 5
+EVENT_RESET = 6
+EVENT_CHOOSE_INI = 7
+EVENT_CHOOSE_DXF = 8
+EVENT_HELP = 9
+EVENT_CAMERA = 10
+EVENT_LIGHT =11
+EVENT_DXF_DIR = 12
+EVENT_setCAMERA = 13
+EVENT_LIST = 14
+EVENT_ORIGIN = 15
+EVENT_SCALE = 16
+EVENT_PRESET2D = 20
+EVENT_PRESET3D = 21
+EVENT_PRESETPLINE = 22
+EVENT_PRESETS = 23
+EVENT_EXIT = 100
+GUI_EVENT = EVENT_NONE
+
+GUI_A = {} # GUI-buttons dictionary for parameter
+GUI_B = {} # GUI-buttons dictionary for drawingTypes
+
+# settings default, initialize ------------------------
+
+#-----------------------------------------------
+def prepareMenu(title,list):
+ menu = title
+ for i, item in enumerate(list):
+ menu += '|'+ item + ' %x' + str(i)
+ return menu
+
+#-----------------------------------------------
+mesh_as_list = ["3DFACEs","POLYFACE","POLYLINE","LINEs","POINTs"]
+mesh_as_menu = prepareMenu("export to: %t", mesh_as_list)
+
+curve_as_list = ["LINEs","POLYLINE","..LWPOLYLINE r14","..SPLINE r14","POINTs"]
+curve_as_menu = prepareMenu("export to: %t", curve_as_list)
+
+surface_as_list = ["..3DFACEs","..POLYFACE","..POINTs","..NURBS"]
+surface_as_menu = prepareMenu("export to: %t", surface_as_list)
+
+meta_as_list = ["..3DFACEs","..POLYFACE","..3DSOLID"]
+meta_as_menu = prepareMenu("export to: %t", meta_as_list)
+
+text_as_list = ["..TEXT","..MTEXT","..ATTRIBUTs"]
+text_as_menu = prepareMenu("export to: %t", text_as_list)
+
+empty_as_list = ["POINT","..INSERT","..XREF"]
+empty_as_menu = prepareMenu("export to: %t|", empty_as_list)
+
+group_as_list = ["..GROUP","..BLOCK","..ungroup"]
+group_as_menu = prepareMenu("export to: %t", group_as_list)
+
+parent_as_list = ["..BLOCK","..ungroup"]
+parent_as_menu = prepareMenu("export to: %t", parent_as_list)
+
+proxy_as_list = ["..BLOCK","..XREF","..ungroup","..POINT"]
+proxy_as_menu = prepareMenu("export to: %t", proxy_as_list)
+
+camera_as_list = ["..BLOCK","..A_CAMERA","..VPORT","..VIEW","..POINT"]
+camera_as_menu = prepareMenu("export to: %t", camera_as_list)
+
+lamp_as_list = ["..BLOCK","..A_LAMP","..POINT"]
+lamp_as_menu = prepareMenu("export to: %t", lamp_as_list)
+
+material_to_list= ["COLOR","LAYER","..LINESTYLE","..BLOCK","..XDATA","..INI-File"]
+material_to_menu = prepareMenu("export to: %t", material_to_list)
+
+ltype_map_list= ["object_rgb","material_rgb","..map_table"]
+ltype_map_menu = prepareMenu("export to: %t", ltype_map_list)
+
+
+
+layername_from_list = [LAYERNAME_DEF,"drawing_name","scene_name"]
+layername_from_menu = prepareMenu("defaultLAYER: %t", layername_from_list)
+
+layerltype_def_list = ["CONTINUOUS","DOT","DASH","DASH-DOT"]
+layerltype_def_menu = prepareMenu("LINETYPE set to: %t",layerltype_def_list)
+
+entitylayer_from_list = ["default_LAYER","obj.name","obj.layer","obj.material","obj.data.name","obj.data.material","..vertexgroup","..group","..map_table"]
+entitylayer_from_menu = prepareMenu("entityLAYER from: %t", entitylayer_from_list)
+#print 'deb: entitylayer_from_menu=', entitylayer_from_menu #--------------
+
+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)
+
+entityltype_from_list = ["default_LTYPE","BYLAYER","BYBLOCK","CONTINUOUS","DOT","DASH","DASH-DOT"]
+entityltype_from_menu = prepareMenu("entityCOLOR set to: %t",entityltype_from_list)
+
+#dxf-LINE,ARC,CIRCLE,ELLIPSE
+
+g_scale_list = ''.join((
+ 'scale factor: %t',
+ '|user def. %x12',
+ '|yard to m %x8',
+ '|feet to m %x7',
+ '|inch to m %x6',
+ '| x 100000 %x5',
+ '| x 10000 %x4',
+ '| x 1000 %x3',
+ '| x 100 %x2',
+ '| x 10 %x1',
+ '| x 1 %x0',
+ '| x 0.1 %x-1',
+ '| x 0.01 %x-2',
+ '| x 0.001 %x-3',
+ '| x 0.0001 %x-4',
+ '| x 0.00001 %x-5'))
+
+#print 'deb: g_scale_list', g_scale_list #-----------
+
+dxfFileName = Draw.Create("")
+iniFileName = Draw.Create(INIFILE_DEFAULT_NAME + INIFILE_EXTENSION)
+user_preset = 0
+config_UI = Draw.Create(0) #switch_on/off extended config_UI
+g_scale_as = Draw.Create(int(log10(G_SCALE)))
+
+
+keywords_org = {
+ 'optimization': 2,
+ 'dummy_on' : 0,
+
+ 'xref_on' : 1,
+ 'block_nn': 0,
+
+ 'paper_space_on': 0,
+ 'layFrozen_on': 0,
+ 'objectFilter_on': 0,
+ 'materialFilter_on': 0,
+ 'colorFilter_on': 0,
+ 'groupFilter_on': 0,
+
+ 'only_selected_on': ONLYSELECTED,
+ 'projection_on' : PROJECTION,
+ 'hidden_lines_on': HIDDEN_LINES,
+ 'shadows_on' : SHADOWS,
+ 'light_on' : 1,
+ 'outputDWG_on' : OUTPUT_DWG,
+ 'to_polyline_on': POLYLINES,
+ 'to_polyface_on': POLYFACES,
+ 'apply_modifiers_on': APPLY_MODIFIERS,
+ 'include_duplis_on': INCLUDE_DUPLIS,
+ 'camera_on': CAMERA,
+
+ 'g_originX' : G_ORIGIN[0],
+ 'g_originY' : G_ORIGIN[1],
+ 'g_originZ' : G_ORIGIN[2],
+ 'g_origin_on': 0,
+ 'g_scale' : float(G_SCALE),
+# 'g_scale_as': int(log10(G_SCALE)), # 0,
+ 'g_scale_on': 0,
+ 'Z_force_on': 0,
+ 'Z_elev': float(ELEVATION),
+
+
+ 'prefix_def' : PREFIX,
+ 'layername_def' : LAYERNAME_DEF,
+ 'layercolor_def': LAYERCOLOR_DEF,
+ 'layerltype_def': LAYERLTYPE_DEF,
+ 'entitylayer_from': 2,
+ 'entitycolor_from': 1,
+ 'entityltype_from' : 1,
+
+ 'material_on': 1,
+ 'material_to': 2,
+ 'fill_on' : 1,
+
+ 'mesh_as' : 1,
+ 'curve_as' : 1,
+ 'surface_as' : 1,
+ 'meta_as' : 1,
+ 'text_as' : 0,
+ 'empty_as' : 0,
+ 'group_as' : 0,
+ 'parent_as' : 0,
+ 'proxy_as' : 0,
+ 'camera_as': 1,
+ 'lamp_as' : 1,
+ }
+
+drawTypes_org = {
+ 'bmesh' : 1,
+ 'bcurve': 1,
+ 'surface': 0,
+ 'bmeta' : 0,
+ 'text' : 0,
+ 'empty' : 1,
+ 'group' : 1,
+ 'parent': 1,
+ 'proxy' : 0,
+ 'camera': 0,
+ 'lamp' : 0,
+
+# 'view' : 0,
+ }
+
+# creating of GUI-buttons
+# GUI_A - GUI-buttons dictionary for parameter
+# GUI_B - GUI-buttons dictionary for drawingTypes
+for k, v in keywords_org.iteritems():
+ GUI_A[k] = Draw.Create(v)
+for k, v in drawTypes_org.iteritems():
+ GUI_B[k] = Draw.Create(v)
+#print 'deb:init GUI_A: ', GUI_A #---------------
+#print 'deb:init GUI_B: ', GUI_B #---------------
+
+model_space_on = Draw.Create(1)
+
+# initialize settings-object controls how dxf entities are drawn
+settings = Settings(keywords_org, drawTypes_org)
+
+
+def update_RegistryKey(key, item): #
+ """updates key in Blender.Registry
+ """
+ cache = True # data is also saved to a file
+ rdict = Registry.GetKey('DXF_Exporter', cache)
+ if not rdict: rdict = {}
+ if item:
+ rdict[key] = item
+ Registry.SetKey('DXF_Exporter', rdict, cache)
+ #print 'deb:update_RegistryKey rdict', rdict #---------------
+
+
+def check_RegistryKey(key):
+ """ check if the key is already there (saved on a previous execution of this script)
+ """
+ cache = True # data is also saved to a file
+ rdict = Registry.GetKey('DXF_Exporter', cache)
+ #print 'deb:check_RegistryKey rdict:', rdict #----------------
+ if rdict: # if found, get the values saved there
+ try:
+ item = rdict[key]
+ return item
+ except:
+ #update_RegistryKey() # if data isn't valid rewrite it
+ pass
+
+def saveConfig(): #--todo-----------------------------------------------
+ """Save settings/config/materials from GUI to INI-file.
+
+ Write all config data to INI-file.
+ """
+ global iniFileName
+
+ iniFile = iniFileName.val
+ #print 'deb:saveConfig inifFile: ', inifFile #----------------------
+ if iniFile.lower().endswith(INIFILE_EXTENSION):
+
+ #--todo-- sort key.list for output
+ #key_list = GUI_A.keys().val
+ #key_list.sort()
+ #for key in key_list:
+ # l_name, l_data = key, GUI_A[key].val
+ # list_A
+
+ output_str = '[%s,%s]' %(GUI_A, GUI_B)
+ if output_str =='None':
+ Draw.PupMenu('DXF-Exporter: INI-file: Alert!%t|no config-data present to save!')
+ else:
+ if Blender.sys.exists(iniFile):
+ f = file(iniFile, 'r')
+ header_str = f.readline()
+ f.close()
+ if header_str.startswith(INIFILE_HEADER[0:13]):
+ if Draw.PupMenu(' OK ? %t|SAVE OVER: ' + '\'%s\'' %iniFile) == 1:
+ save_ok = True
+ else: save_ok = False
+ elif Draw.PupMenu(' OK ? %t|SAVE OVER: ' + '\'%s\'' %iniFile +
+ '|Alert: this file has no valid ImportDXF-header| ! it may belong to another aplication !') == 1:
+ save_ok = True
+ else: save_ok = False
+ else: save_ok = True
+
+ if save_ok:
+ # replace: ',' -> ',\n'
+ # replace: '{' -> '\n{\n'
+ # replace: '}' -> '\n}\n'
+ output_str = ',\n'.join(output_str.split(','))
+ output_str = '\n}'.join(output_str.split('}'))
+ output_str = '{\n'.join(output_str.split('{'))
+ try:
+ f = file(iniFile, 'w')
+ f.write(INIFILE_HEADER + '\n# this is a comment line\n')
+ f.write(output_str)
+ f.close()
+ #Draw.PupMenu('DXF-Exporter: INI-file: Done!%t|config-data saved in ' + '\'%s\'' %iniFile)
+ except:
+ Draw.PupMenu('DXF-Exporter: INI-file: Error!%t|failure by writing to ' + '\'%s\'|no config-data saved!' %iniFile)
+
+ else:
+ Draw.PupMenu('DXF-Exporter: INI-file: Alert!%t|no valid name/extension for INI-file selected!')
+ print "DXF-Exporter: Alert!: no valid INI-file selected."
+ if not iniFile:
+ if dxfFileName.val.lower().endswith('.dxf'):
+ iniFileName.val = dxfFileName.val[0:-4] + INIFILE_EXTENSION
+
+
+def loadConfig(): #remi--todo-----------------------------------------------
+ """Load settings/config/materials from INI-file.
+
+ Read material-assignements from config-file.
+ """
+ #070724 buggy Window.FileSelector(loadConfigFile, 'Load config data from INI-file', inifilename)
+ global iniFileName, GUI_A, GUI_B
+
+ iniFile = iniFileName.val
+ update_RegistryKey('iniFileName', iniFile)
+ #print 'deb:loadConfig iniFile: ', iniFile #----------------------
+ if iniFile.lower().endswith(INIFILE_EXTENSION) and Blender.sys.exists(iniFile):
+ f = file(iniFile, 'r')
+ header_str = f.readline()
+ if header_str.startswith(INIFILE_HEADER):
+ data_str = f.read()
+ f.close()
+ #print 'deb:loadConfig data_str from %s: \n' %iniFile , data_str #-----------------
+ data = eval(data_str)
+ for k, v in data[0].iteritems():
+ try: GUI_A[k].val = v
+ except: GUI_A[k] = Draw.Create(v)
+ for k, v in data[1].iteritems():
+ try: GUI_B[k].val = v
+ except: GUI_B[k] = Draw.Create(v)
+ else:
+ f.close()
+ Draw.PupMenu('DXF-Exporter: INI-file: Alert!%t|no valid header in INI-file: ' + '\'%s\'' %iniFile)
+ else:
+ Draw.PupMenu('DXF-Exporter: INI-file: Alert!%t|no valid INI-file selected!')
+ print "DXF-Exporter: Alert!: no valid INI-file selected."
+ if not iniFileName:
+ if dxfFileName.val.lower().endswith('.dxf'):
+ iniFileName.val = dxfFileName.val[0:-4] + INIFILE_EXTENSION
+
+
+
+def updateConfig(keywords, drawTypes): #-----------------------------------------------
+ """updates GUI_settings with given dictionaries
+
+ """
+ global GUI_A, GUI_B
+ #print 'deb:lresetDefaultConfig keywords_org: \n', keywords_org #---------
+ for k, v in keywords.iteritems():
+ GUI_A[k].val = v
+ for k, v in drawTypes.iteritems():
+ GUI_B[k].val = v
+
+def resetDefaultConfig(): #-----------------------------------------------
+ """Resets settings/config/materials to defaults.
+
+ """
+ #print 'deb:lresetDefaultConfig keywords_org: \n', keywords_org #---------
+ updateConfig(keywords_org, drawTypes_org)
+
+
+def presetConfig_polyline(activate): #-----------------------------------------------
+ """Sets settings/config for polygon representation: POLYLINE(FACE) or LINEs/3DFACEs.
+
+ """
+ global GUI_A
+ if activate:
+ GUI_A['to_polyline_on'].val = 1
+ GUI_A['mesh_as'].val = 1
+ GUI_A['curve_as'].val = 1
+ else:
+ GUI_A['to_polyline_on'].val = 0
+ GUI_A['mesh_as'].val = 0
+ GUI_A['curve_as'].val = 0
+
+def resetDefaultConfig_2D(): #-----------------------------------------------
+ """Sets settings/config/materials to defaults 2D.
+
+ """
+ keywords2d = {
+ 'projection_on' : 1,
+ 'fill_on' : 1,
+ 'text_as' : 0,
+ 'group_as' : 0,
+ }
+
+ drawTypes2d = {
+ 'bmesh' : 1,
+ 'bcurve': 1,
+ 'surface':0,
+ 'bmeta' : 0,
+ 'text' : 1,
+ 'empty' : 1,
+ 'group' : 1,
+ 'parent' : 1,
+ #'proxy' : 0,
+ #'camera': 0,
+ #'lamp' : 0,
+
+ }
+ presetConfig_polyline(1)
+ updateConfig(keywords2d, drawTypes2d)
+
+def resetDefaultConfig_3D(): #-----------------------------------------------
+ """Sets settings/config/materials to defaults 3D.
+
+ """
+ keywords3d = {
+ 'projection_on' : 0,
+ 'fill_on' : 0,
+ #'text_as' : 0,
+ 'group_as' : 0,
+ }
+
+ drawTypes3d = {
+ 'bmesh' : 1,
+ 'bcurve': 1,
+ 'surface':0,
+ 'bmeta' : 0,
+ 'text' : 0,
+ 'empty' : 1,
+ 'group' : 1,
+ 'parent' : 1,
+ #'proxy' : 0,
+ 'camera': 1,
+ 'lamp' : 1,
+ }
+ presetConfig_polyline(1)
+ updateConfig(keywords3d, drawTypes3d)
+
+
+def inputGlobalScale():
+ """Pop-up UI-Block for global scale factor
+ """
+ global GUI_A
+ #print 'deb:inputGlobalScale ##########' #------------
+ x_scale = Draw.Create(GUI_A['g_scale'].val)
+ block = []
+ #block.append("global translation vector:")
+ block.append(("", x_scale, 0.0, 10000000.0))
+
+ retval = Draw.PupBlock("set global scale factor:", block)
+
+ GUI_A['g_scale'].val = float(x_scale.val)
+
+
+def inputOriginVector():
+ """Pop-up UI-Block for global translation vector
+ """
+ global GUI_A
+ #print 'deb:inputOriginVector ##########' #------------
+ x_origin = Draw.Create(GUI_A['g_originX'].val)
+ y_origin = Draw.Create(GUI_A['g_originY'].val)
+ z_origin = Draw.Create(GUI_A['g_originZ'].val)
+ block = []
+ #block.append("global translation vector:")
+ block.append(("X: ", x_origin, -100000000.0, 100000000.0))
+ block.append(("Y: ", y_origin, -100000000.0, 100000000.0))
+ block.append(("Z: ", z_origin, -100000000.0, 100000000.0))
+
+ retval = Draw.PupBlock("set global translation vector:", block)
+
+ GUI_A['g_originX'].val = x_origin.val
+ GUI_A['g_originY'].val = y_origin.val
+ GUI_A['g_originZ'].val = z_origin.val
+
+
+def update_globals(): #-----------------------------------------------------------------
+ """ update globals if GUI_A changed
+ """
+ global ONLYSELECTED, DEBUG,\
+ PROJECTION, HIDDEN_LINES, CAMERA, \
+ G_SCALE, G_ORIGIN,\
+ PREFIX, LAYERNAME_DEF, LAYERCOLOR_DEF, LAYERLTYPE_DEF,\
+ APPLY_MODIFIERS, INCLUDE_DUPLIS,\
+ OUTPUT_DWG
+ #global POLYLINES
+
+ ONLYSELECTED = GUI_A['only_selected_on'].val
+ """
+ POLYLINES = GUI_A['to_polyline_on'].val
+ if GUI_A['curve_as'].val==1: POLYLINES=1
+ else: POLYLINES=0
+ """
+
+ if GUI_A['optimization'].val==0: DEBUG = 1
+ else: DEBUG = 0
+ PROJECTION = GUI_A['projection_on'].val
+ HIDDEN_LINES = GUI_A['hidden_lines_on'].val
+ CAMERA = GUI_A['camera_on'].val
+ G_SCALE = GUI_A['g_scale'].val
+ if GUI_A['g_origin_on'].val: #TODO: scale and object orientation
+ G_ORIGIN[0] = GUI_A['g_originX'].val
+ G_ORIGIN[1] = GUI_A['g_originY'].val
+ G_ORIGIN[2] = GUI_A['g_originZ'].val
+ if GUI_A['g_scale_on'].val:
+ G_ORIGIN[0] *= G_SCALE
+ G_ORIGIN[1] *= G_SCALE
+ G_ORIGIN[2] *= G_SCALE
+
+ PREFIX = GUI_A['prefix_def'].val
+ LAYERNAME_DEF = GUI_A['layername_def'].val
+ LAYERCOLOR_DEF = GUI_A['layercolor_def'].val
+ LAYERLTYPE_DEF = layerltype_def_list[GUI_A['layerltype_def'].val]
+
+ APPLY_MODIFIERS = GUI_A['apply_modifiers_on'].val
+ INCLUDE_DUPLIS = GUI_A['include_duplis_on'].val
+ OUTPUT_DWG = GUI_A['outputDWG_on'].val
+ #print 'deb: GUI HIDDEN_LINES=', HIDDEN_LINES #---------
+ #print 'deb: GUI GUI_A: ', GUI_A['hidden_lines_on'].val #---------------
+ #print 'deb: GUI GUI_B: ', GUI_B #---------------
+
+
+def draw_UI(): #-----------------------------------------------------------------
+ """ Draw startUI and setup Settings.
+ """
+ global GUI_A, GUI_B #__version__
+ global user_preset, iniFileName, dxfFileName, config_UI, g_scale_as
+ global model_space_on
+ global SCROLL
+
+ global mPAN_X, menu_orgX, mPAN_Xmax
+ global mPAN_Y, menu_orgY, mPAN_Ymax
+ global menu__Area, headerArea, screenArea, scrollArea
+
+ size=Buffer(GL_FLOAT, 4)
+ glGetFloatv(GL_SCISSOR_BOX, size) #window X,Y,sizeX,sizeY
+ size= size.list
+ #print '-------------size:', size #--------------------------
+ for s in [0,1,2,3]: size[s]=int(size[s])
+ window_Area = [0,0,size[2],size[3]-2]
+ scrollXArea = [0,0,window_Area[2],15]
+ scrollYArea = [0,0,15,window_Area[3]]
+
+ menu_orgX = -mPAN_X
+ #menu_orgX = 0 #scrollW
+ #if menu_pan: menu_orgX -= mPAN_X
+ if menu_orgX < -mPAN_Xmax: menu_orgX, mPAN_X = -mPAN_Xmax,mPAN_Xmax
+ if menu_orgX > 0: menu_orgX, mPAN_X = 0,0
+
+ menu_orgY = -mPAN_Y
+ #if menu_pan: menu_orgY -= mPAN_Y
+ if menu_orgY < -mPAN_Ymax: menu_orgY, mPAN_Y = -mPAN_Ymax,mPAN_Ymax
+ if menu_orgY > 0: menu_orgY, mPAN_Y = 0,0
+
+
+ menu_margin = 10
+ butt_margin = 10
+ common_column = int((window_Area[2] - (3 * butt_margin) - (2 * menu_margin)-30) / 4.0)
+ common_column = 70
+ # This is for easy layout changes
+ but_0c = common_column #button 1.column width
+ but_1c = common_column #button 1.column width
+ but_2c = common_column #button 2.column
+ but_3c = common_column #button 3.column
+ menu_w = (3 * butt_margin) + but_0c + but_1c + but_2c + but_3c #menu width
+
+ simple_menu_h = 240
+ extend_menu_h = 345
+ menu_h = simple_menu_h # y is menu upper.y
+ if config_UI.val:
+ menu_h += extend_menu_h
+
+ mPAN_Xmax = menu_w-window_Area[2]+50
+ mPAN_Ymax = menu_h-window_Area[3]+30
+
+ y = menu_h
+ x = 0 #menu left.x
+ x +=menu_orgX+20
+ y +=menu_orgY+20
+
+
+ but0c = x + menu_margin #buttons 0.column position.x
+ but1c = but0c + but_0c + butt_margin
+ but2c = but1c + but_1c + butt_margin
+ but3c = but2c + but_2c + butt_margin
+ but4c = but3c + but_3c
+
+ # Here starts menu -----------------------------------------------------
+ #glClear(GL_COLOR_BUFFER_BIT)
+ #glRasterPos2d(8, 125)
+
+
+ ui_box(x, y, x+menu_w+menu_margin*2, y-menu_h)
+ y -= 20
+ Draw.Label("DXF(r12)-Exporter v" + __version__, but0c, y, menu_w, 20)
+
+ if config_UI.val:
+ b0, b0_ = but0c, but_0c-20 + butt_margin
+ b1, b1_ = but1c-20, but_1c+20
+ y_top = y
+
+ y -= 10
+ y -= 20
+ Draw.BeginAlign()
+ GUI_B['bmesh'] = Draw.Toggle('Mesh', EVENT_REDRAW, b0, y, b0_, 20, GUI_B['bmesh'].val, "Export Mesh-Objects on/off")
+ if GUI_B['bmesh'].val:
+ GUI_A['mesh_as'] = Draw.Menu(mesh_as_menu, EVENT_NONE, b1, y, b1_, 20, GUI_A['mesh_as'].val, "Select target DXF-object")
+ Draw.EndAlign()
+
+ y -= 20
+ Draw.BeginAlign()
+ GUI_B['bcurve'] = Draw.Toggle('Curve', EVENT_REDRAW, b0, y, b0_, 20, GUI_B['bcurve'].val, "Export Curve-Objects on/off")
+ if GUI_B['bcurve'].val:
+ GUI_A['curve_as'] = Draw.Menu(curve_as_menu, EVENT_NONE, b1, y, b1_, 20, GUI_A['curve_as'].val, "Select target DXF-object")
+ Draw.EndAlign()
+
+ y -= 20
+ Draw.BeginAlign()
+ GUI_B['surface'] = Draw.Toggle('..Surface', EVENT_REDRAW, b0, y, b0_, 20, GUI_B['surface'].val, "(*todo) Export Surface-Objects on/off")
+ if GUI_B['surface'].val:
+ GUI_A['surface_as'] = Draw.Menu(surface_as_menu, EVENT_NONE, b1, y, b1_, 20, GUI_A['surface_as'].val, "Select target DXF-object")
+ Draw.EndAlign()
+
+ y -= 20
+ Draw.BeginAlign()
+ GUI_B['bmeta'] = Draw.Toggle('..Meta', EVENT_REDRAW, b0, y, b0_, 20, GUI_B['bmeta'].val, "(*todo) Export Meta-Objects on/off")
+ if GUI_B['bmeta'].val:
+ GUI_A['meta_as'] = Draw.Menu(meta_as_menu, EVENT_NONE, b1, y, b1_, 20, GUI_A['meta_as'].val, "Select target DXF-object")
+ #GUI_A['plmesh_flip'] = Draw.Toggle('N', EVENT_NONE, b1+b1_-40, y, 20, 20, GUI_A['plmesh_flip'].val, "flip DXF normals on/off")
+ #GUI_A['normals_out'] = Draw.Toggle('N', EVENT_NONE, b1+b1_-20, y, 20, 20, GUI_A['normals_out'].val, "force Blender normals to outside on/off")
+ Draw.EndAlign()
+
+ y -= 20
+ Draw.BeginAlign()
+ GUI_B['text'] = Draw.Toggle('..Text', EVENT_REDRAW, b0, y, b0_, 20, GUI_B['text'].val, "(*todo) Export Text-Objects on/off")
+ #GUI_B['mtext'] = Draw.Toggle('..MTEXT', EVENT_NONE, b1, y, b1_, 20, GUI_B['mtext'].val, "(*todo) support dxf-MTEXT on/off")
+ if GUI_B['text'].val:
+ GUI_A['text_as'] = Draw.Menu(text_as_menu, EVENT_NONE, b1, y, b1_, 20, GUI_A['text_as'].val, "Select target DXF-object")
+ Draw.EndAlign()
+
+ y -= 20
+ Draw.BeginAlign()
+ GUI_B['empty'] = Draw.Toggle('Empty', EVENT_REDRAW, b0, y, b0_, 20, GUI_B['empty'].val, "Export Empty-Objects on/off")
+ if GUI_B['empty'].val:
+ GUI_A['empty_as'] = Draw.Menu(empty_as_menu, EVENT_NONE, b1, y, b1_, 20, GUI_A['empty_as'].val, "Select target DXF-object")
+# Draw.Label('-->', but2c, y, but_2c, 20)
+ Draw.EndAlign()
+
+ y_down = y
+ # -----------------------------------------------
+
+ y = y_top
+ b0, b0_ = but2c, but_2c-20 + butt_margin
+ b1, b1_ = but3c-20, but_3c+20
+
+ y -= 10
+ y -= 20
+ Draw.BeginAlign()
+ GUI_B['group'] = Draw.Toggle('..Group', EVENT_REDRAW, b0, y, b0_, 20, GUI_B['group'].val, "(*todo) Export Group-Relationships on/off")
+ #GUI_B['insert'].val = GUI_B['group'].val
+ if GUI_B['group'].val:
+ #GUI_A['block_nn'] = Draw.Toggle('n', EVENT_NONE, b1-30, y, 15, 20, GUI_A['block_nn'].val, "Export hatch/noname BLOCKs *X... on/off")
+ #GUI_A['xref_on'] = Draw.Toggle('Xref', EVENT_NONE, b1-15, y, 35, 20, GUI_A['xref_on'].val, "Export for XREF-BLOCKs (place holders) on/off")
+ GUI_A['group_as'] = Draw.Menu(group_as_menu, EVENT_NONE, b1, y, b1_, 20, GUI_A['group_as'].val, "Select target DXF-object")
+ Draw.EndAlign()
+
+ y -= 20
+ Draw.BeginAlign()
+ GUI_B['parent'] = Draw.Toggle('..Parent', EVENT_REDRAW, b0, y, b0_, 20, GUI_B['parent'].val, "(*todo) Export Parent-Relationships on/off")
+ if GUI_B['parent'].val:
+ GUI_A['parent_as'] = Draw.Menu(parent_as_menu, EVENT_NONE, b1, y, b1_, 20, GUI_A['parent_as'].val, "Select target DXF-object")
+ Draw.EndAlign()
+
+ y -= 20
+ Draw.BeginAlign()
+ GUI_B['proxy'] = Draw.Toggle('..Proxy', EVENT_REDRAW, b0, y, b0_, 20, GUI_B['proxy'].val, "(*todo) Export Proxy-Objects on/off")
+ if GUI_B['proxy'].val:
+ GUI_A['proxy_as'] = Draw.Menu(proxy_as_menu, EVENT_NONE, b1, y, b1_, 20, GUI_A['proxy_as'].val, "Select target DXF-object")
+ Draw.EndAlign()
+
+ y -= 20
+ Draw.BeginAlign()
+ GUI_B['camera'] = Draw.Toggle('..Camera', EVENT_REDRAW, b0, y, b0_, 20, GUI_B['camera'].val, "(*todo) Export Camera-Objects on/off")
+ if GUI_B['camera'].val:
+ GUI_A['camera_as'] = Draw.Menu(camera_as_menu, EVENT_NONE, b1, y, b1_, 20, GUI_A['camera_as'].val, "Select target DXF-object")
+ Draw.EndAlign()
+
+ y -= 20
+ Draw.BeginAlign()
+ GUI_B['lamp'] = Draw.Toggle('..Lamp', EVENT_REDRAW, b0, y, b0_, 20, GUI_B['lamp'].val, "(*todo) Export Lamp-Objects on/off")
+ if GUI_B['lamp'].val:
+ GUI_A['lamp_as'] = Draw.Menu(lamp_as_menu, EVENT_NONE, b1, y, b1_, 20, GUI_A['lamp_as'].val, "Select target DXF-object")
+ Draw.EndAlign()
+
+
+ if y < y_down: y_down = y
+ # -----end supported objects--------------------------------------
+
+ y_top = y_down
+ y = y_top
+ y -= 10
+ y -= 20
+ but_ = menu_w / 6
+ b0 = but0c + (menu_w - but_*6)/2
+ 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['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['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['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['dummy_on'] = Draw.Toggle('-', EVENT_NONE, but3c, y, but_3c, 20, GUI_A['dummy_on'].val, "dummy on/off")
+ Draw.EndAlign()
+
+ # -----end filters--------------------------------------
+
+ b0, b0_ = but0c, but_0c + butt_margin
+ b1, b1_ = but1c, but_1c
+
+ y -= 10
+ y -= 20
+ Draw.BeginAlign()
+ GUI_A['g_origin_on'] = Draw.Toggle('Location', EVENT_REDRAW, b0, y, b0_, 20, GUI_A['g_origin_on'].val, "Global relocate all objects on/off")
+ if GUI_A['g_origin_on'].val:
+ tmp = Draw.PushButton('=', EVENT_ORIGIN, b1, y, 20, 20, "Edit relocation-vector (x,y,z in DXF units)")
+ origin_str = '(%.4f, %.4f, %.4f)' % (
+ GUI_A['g_originX'].val,
+ GUI_A['g_originY'].val,
+ GUI_A['g_originZ'].val
+ )
+ tmp = Draw.Label(origin_str, b1+20, y, 300, 20)
+ #GUI_A['g_origin'] = Draw.String('', EVENT_ORIGIN, b1, y, b1_, 20, GUI_A['g_origin'].val, "Global translation-vector (x,y,z) in DXF units")
+ Draw.EndAlign()
+
+ y -= 20
+ Draw.BeginAlign()
+ GUI_A['g_scale_on'] = Draw.Toggle('Scale', EVENT_REDRAW, b0, y, b0_, 20, GUI_A['g_scale_on'].val, "Global scale all objects on/off")
+ if GUI_A['g_scale_on'].val:
+ g_scale_as = Draw.Menu(g_scale_list, EVENT_SCALE, b1, y, 45, 20, g_scale_as.val, "Factor for scaling the DXFdata")
+ if g_scale_as.val == 12:
+ pass
+ else:
+ if g_scale_as.val == 6: #scale inches to meters
+ GUI_A['g_scale'].val = 0.0254000
+ elif g_scale_as.val == 7: #scale feets to meters
+ GUI_A['g_scale'].val = 0.3048000
+ elif g_scale_as.val == 8: #scale yards to meters
+ GUI_A['g_scale'].val = 0.9144000
+ else:
+ GUI_A['g_scale'].val = 10.0 ** int(g_scale_as.val)
+ scale_float = GUI_A['g_scale'].val
+ if scale_float < 0.000001 or scale_float > 1000000:
+ scale_str = ' = %s' % GUI_A['g_scale'].val
+ else:
+ scale_str = ' = %.6f' % GUI_A['g_scale'].val
+ Draw.Label(scale_str, b1+45, y, 200, 20)
+ Draw.EndAlign()
+
+ y -= 20
+ Draw.BeginAlign()
+ GUI_A['Z_force_on'] = Draw.Toggle('Elevation', EVENT_REDRAW, b0, y, b0_, 20, GUI_A['Z_force_on'].val, "Overwrite Z-coordinates (flatten geometry) on/off")
+ 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 value for default Z-coordinate (in DXF units)")
+ Draw.EndAlign()
+
+ """
+ y -= 30
+ Draw.BeginAlign()
+ GUI_A['material_on'] = Draw.Toggle('.material', EVENT_REDRAW, b0, y, b0_-20, 20, GUI_A['material_on'].val, "Support for material assignment on/off")
+ if GUI_A['material_on'].val:
+ GUI_A['material_to'] = Draw.Menu(material_to_menu, EVENT_NONE, b1-20, y, b1_+20, 20, GUI_A['material_to'].val, "Material assigned to?")
+ Draw.EndAlign()
+ """
+
+ #b0, b0_ = but0c, but_0c + butt_margin
+ b0, b0_ = but0c, 50
+ b1, b1_ = b0+b0_, but_0c-b0_+ but_1c + butt_margin
+ b2, b2_ = but2c, but_2c
+ b3, b3_ = but3c, but_3c
+
+ y -= 30
+ Draw.Label('LAYER:', b1, y, b1_, 20)
+ Draw.Label('COLOR:', b2, y, b2_, 20)
+ Draw.Label('LINETYPE:', b3, y, b3_, 20)
+ #Draw.Label('LINESIZE:', b4, y, b4_, 20)
+
+ y -= 20
+ 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['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['layerltype_def'] = Draw.Menu(layerltype_def_menu, EVENT_NONE, b3, y, b3_, 20, GUI_A['layerltype_def'].val, "Set default LINETYPE")
+ Draw.EndAlign()
+
+ y -= 25
+ Draw.Label('Style:', b0, y, b0_, 20)
+ Draw.BeginAlign()
+ GUI_A['entitylayer_from'] = Draw.Menu(entitylayer_from_menu, EVENT_NONE, b1, y, b1_, 20, GUI_A['entitylayer_from'].val, "entity LAYER assigned to?")
+ GUI_A['entitycolor_from'] = Draw.Menu(entitycolor_from_menu, EVENT_NONE, b2, y, b2_, 20, GUI_A['entitycolor_from'].val, "entity COLOR assigned to?")
+ GUI_A['entityltype_from'] = Draw.Menu(entityltype_from_menu, EVENT_NONE, b3, y, b3_, 20, GUI_A['entityltype_from'].val, "Set entity LINETYPE")
+ Draw.EndAlign()
+
+ y -= 10
+
+ y_down = y
+ # -----end material,translate,scale------------------------------------------
+
+ """
+ b0, b0_ = but0c, but_0c + butt_margin
+ b1, b1_ = but1c, but_1c
+
+ y_top = y_down
+ y = y_top
+ y -= 10
+
+ y -= 20
+ GUI_A['group_bylayer_on'] = Draw.Toggle('Layer', EVENT_NONE, b0, y, 30, 20, GUI_A['group_bylayer_on'].val, "DXF-entities group by layer on/off")
+
+ y_down = y
+ # -----------------------------------------------
+
+ b0, b0_ = but2c, but_2c + butt_margin
+ b1, b1_ = but3c, but_3c
+
+ y = y_top
+ y -= 10
+ y -= 20
+
+
+ if y < y_down: y_down = y
+ # -----end options --------------------------------------
+ """
+
+
+ #--------------------------------------
+ y_top = y_down
+ y = y_top
+ #GUI_A['dummy_on'] = Draw.Toggle(' - ', EVENT_NONE, but0c, y, but_0c, 20, GUI_A['dummy_on'].val, "reserved")
+ y -= 30
+ Draw.BeginAlign()
+ Draw.PushButton('INI file >', EVENT_CHOOSE_INI, but0c, y, but_0c, 20, 'Select INI-file with file selector')
+ iniFileName = Draw.String(' :', EVENT_NONE, but1c, y, menu_w-but_1c-60, 20, iniFileName.val, FILENAME_MAX, "Write here the name of the INI-file")
+ but = but4c-60
+ Draw.PushButton('#', EVENT_PRESETS, but, y, 20, 20, "Toggle Preset-INI-files")
+ Draw.PushButton('L', EVENT_LOAD_INI, but+20, y, 20, 20, 'Loads configuration from selected ini-file: %s' % iniFileName.val)
+ Draw.PushButton('S', EVENT_SAVE_INI, but+40, y, 20, 20, 'Saves configuration to selected ini-file: %s' % iniFileName.val)
+ Draw.EndAlign()
+
+ bm = butt_margin/2
+
+ y -= 10
+ y -= 20
+ Draw.BeginAlign()
+ Draw.PushButton('DXFfile >', EVENT_CHOOSE_DXF, but0c, y, but_0c, 20, 'Select DXF-file with file selector')
+ dxfFileName = Draw.String(' :', EVENT_NONE, but1c, y, menu_w-but_0c-menu_margin, 20, dxfFileName.val, FILENAME_MAX, "Type path/name of output DXF-file")
+ Draw.EndAlign()
+
+ y -= 30
+ config_UI = Draw.Toggle('CONFIG', EVENT_REDRAW, but0c, y, but_0c+bm, 20, config_UI.val, 'Advanced configuration on/off' )
+ Draw.BeginAlign()
+ but, but_ = but1c, but_1c+bm
+ but_ /= 3
+ Draw.PushButton('X', EVENT_RESET, but, y, 15, 20, "Reset configuration to defaults")
+ Draw.PushButton('2D', EVENT_PRESET2D, but+but_, y, but_, 20, 'Set to standard configuration for 2D export')
+ Draw.PushButton('3D', EVENT_PRESET3D, but+(but_*2), y, but_, 20, 'Set to standard configuration for 3D import')
+ Draw.EndAlign()
+
+
+ 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")
+ b0, b0_ = but2c, but_2c + butt_margin + but_3c
+
+ y -= 20
+ b0, b0_ = but0c, but_0c + butt_margin +but_1c
+ GUI_A['to_polyline_on'] = Draw.Toggle('POLYLINE', EVENT_PRESETPLINE, b0, y, b0_, 20, GUI_A['to_polyline_on'].val, "Export to POLYLINEs, otherwise to LINEs/3DFACEs on/off")
+ b0, b0_ = but2c, but_2c + butt_margin + but_3c
+ Draw.BeginAlign()
+
+ #y -=20
+ GUI_A['projection_on'] = Draw.Toggle('Projection 2d', EVENT_REDRAW, b0, y+20, b0_, 20, GUI_A['projection_on'].val, "Export a 2d Projection according 3dView or Camera on/off")
+ if GUI_A['projection_on'].val:
+ #GUI_A['camera_on'] = Draw.Toggle('Camera / 3dView', EVENT_NONE, b0, y, b0_, 20, GUI_A['camera_on'].val, "get Projection from current Camera, otherwise from 3dView on/off")
+ 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')
+ 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['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()
+
+ y -= 20
+ b0, b0_ = but0c, but_0c + butt_margin +but_1c
+ GUI_A['apply_modifiers_on'] = Draw.Toggle('Apply Modifiers', EVENT_NONE, b0, y, b0_, 20, GUI_A['apply_modifiers_on'].val, "Apply modifier stack to mesh objects before export on/off")
+ b0, b0_ = but2c, but_2c + butt_margin + but_3c
+ #GUI_A['target_layer'] = Draw.Number('layer', EVENT_NONE, but3c, y, but_3c, 20, GUI_A['target_layer'].val, 1, 18, "target Blender-layer (<19> reserved for block_definitions)")
+
+ y -= 20
+ b0, b0_ = but0c, but_0c + butt_margin +but_1c
+ GUI_A['include_duplis_on'] = Draw.Toggle('Include Duplis', EVENT_NONE, b0, y, b0_, 20, GUI_A['include_duplis_on'].val, "Export Duplicates (dupliverts, dupliframes, dupligroups) on/off")
+ b0, b0_ = but2c, but_2c + butt_margin + but_3c
+
+
+ y -= 50
+ Draw.PushButton('EXIT', EVENT_EXIT, but0c, y, but_0c+bm, 20, '' )
+ Draw.PushButton('HELP', EVENT_HELP, but1c, y, but_1c+bm, 20, 'goes to online-Manual on wiki.blender.org')
+ GUI_A['optimization'] = Draw.Number('', EVENT_NONE, but2c, y, 40, 20, GUI_A['optimization'].val, 0, 3, "Optimization Level: 0=Debug/Draw-in, 1=Verbose, 2=ProgressBar, 3=SilentMode")
+ GUI_A['outputDWG_on'] = Draw.Toggle('DWG*', EVENT_NONE, but2c, y+20, 40, 20, GUI_A['outputDWG_on'].val, "converts DXF to DWG (needs external converter) on/off")
+
+ Draw.BeginAlign()
+ #Draw.PushButton('TEST', EVENT_LIST, but2c, y, 40, 20, 'DXF-Analyze-Tool: reads data from selected dxf file and writes report in project_directory/dxf_blendname.INF')
+ Draw.PushButton('START EXPORT', EVENT_START, but2c+40, y, but_2c-40+but_3c+butt_margin, 40, 'Start the export process. For Cancel go to console and hit Ctrl-C')
+ Draw.EndAlign()
+
+ y -= 20
+ #Draw.BeginAlign()
+ #Draw.Label(' ', but0c-menu_margin, y, menu_margin, 20)
+ #Draw.Label(LAB, but0c, y, menu_w, 20)
+ Draw.Label(LAB, 30, y, menu_w, 20)
+ #Draw.Label(' ', but0c+menu_w, y, menu_margin, 20)
+ #Draw.EndAlign()
+
+ ui_scrollbarX(menu_orgX, menu_w+50, scrollXArea, c_fg, c_bg)
+ ui_scrollbarY(menu_orgY, menu_h+30, scrollYArea, c_fg, c_bg)
+
+
+
+
+#-- END GUI Stuf-----------------------------------------------------
+
+c0=[0.2,0.2,0.2,0.0]
+c1=[0.7,0.7,0.9,0.0]
+c2=[0.71,0.71,0.71,0.0]
+c3=[0.4,0.4,0.4,0.0]
+c4=[0.95,0.95,0.9,0.0]
+c5=[0.64,0.64,0.64,0]
+c6=[0.75,0.75,0.75,0]
+c7=[0.6,0.6,0.6,0]
+c8=[1.0,0.0,0.0,0]
+c9=[0.7,0.0,0.0,0]
+c10=[0.64,0.81,0.81,0]
+c11=[0.57,0.71,0.71,0]
+c_nor= c5[:3]
+c_act= c10[:3]
+c_sel= c11[:3]
+c_tx = c0[:3]
+c_fg = c2[:3]
+c_bg = c5[:3]
+
+def ui_rect(coords,color):
+ [X1,Y1,X2,Y2],[r,g,b] = coords,color
+ glColor3f(r,g,b)
+ glRecti(X1,Y1,X2,Y2)
+def ui_rectA(coords,color):
+ [X1,Y1,X2,Y2],[r,g,b,a] = coords,color
+ glColor4f(r,g,b,a)
+ glRecti(X1,Y1,X2,Y2) #integer coords
+ #glRectf(X1,Y1,X2,Y2) #floating coords
+def ui_line(coords,color):
+ [X1,Y1,X2,Y2],[r,g,b] = coords,color
+ glColor3f(r,g,b)
+ glBegin(GL_LINES)
+ glVertex2i(X1,Y1)
+ glVertex2i(X2,Y2)
+ glEnd()
+def ui_panel(posX,posY,L,H,color):
+ [r,g,b] = color
+ ui_rect([posX+4,posY-4,posX+L+4,posY-H-4],[.55,.55,.55]) #1st shadow
+ ui_rect([posX+3,posY-3,posX+L+3,posY-H-3],[.45,.45,.45])
+ ui_rect([posX+3,posY-3,posX+L+2,posY-H-2],[.30,.30,.30]) #2nd shadow
+ ui_rect([posX,posY-H,posX+L,posY],[r,g,b]) #Main
+ ui_rect([posX+3,posY-19,posX+L-3,posY-2],[.75*r,.75*g,.75*b]) #Titlebar
+ ui_line([posX+3,posY-19,posX+3,posY-2],[.25,.25,.25])
+ ui_line([posX+4,posY-19,posX+4,posY-2],[(r+.75)/4,(g+.75)/4,(b+.75)/4])
+ ui_line([posX+4,posY-2,posX+L-3,posY-2],[(r+.75)/4,(g+.75)/4,(b+.75)/4])
+def ui_box(x,y,xright,bottom):
+ color = [0.75, 0.75, 0.75]
+ coords = x+1,y+1,xright-1,bottom-1
+ ui_rect(coords,color)
+
+def ui_scrollbarX(Focus,PanelH,Area, color_fg, color_bg):
+ # Area = ScrollBarArea
+ # point1=down/left, point2=top/right
+ P1X,P1Y,P2X,P2Y = Area
+ AreaH = P2X-P1X
+ if PanelH > AreaH:
+ Slider = int(AreaH * (AreaH / float(PanelH)))
+ if Slider<3: Slider = 3 #minimal slider heigh
+ posX = -int(AreaH * (Focus / float(PanelH)))
+ ui_rect([P1X,P1Y,P2X,P2Y], color_bg)
+ ui_rect([P1X+posX,P1Y+3,P1X+posX+Slider,P2Y-3], color_fg)
+
+def ui_scrollbarY(Focus,PanelH,Area, color_fg, color_bg):
+ # Area = ScrollBarArea
+ # point1=down/left, point2=top/right
+ P1X,P1Y,P2X,P2Y = Area
+ AreaH = P2Y-P1Y
+ if PanelH > AreaH:
+ Slider = int(AreaH * (AreaH / float(PanelH)))
+ if Slider<3: Slider = 3 #minimal slider heigh
+ posY = -int(AreaH * (Focus / float(PanelH)))
+ ui_rect([P1X,P1Y,P2X-1,P2Y], color_bg)
+ #ui_rect([P1X+3,P2Y-posY,P2X-4,P2Y-posY-Slider], color_fg)
+ ui_rect([P1X+3,P1Y+posY,P2X-4,P1Y+posY+Slider], color_fg)
+
+
+#------------------------------------------------------------
+def dxf_callback(input_filename):
+ global dxfFileName
+ dxfFileName.val=input_filename
+# dirname == Blender.sys.dirname(Blender.Get('filename'))
+# update_RegistryKey('DirName', dirname)
+# update_RegistryKey('dxfFileName', input_filename)
+
+def ini_callback(input_filename):
+ global iniFileName
+ iniFileName.val=input_filename
+
+#------------------------------------------------------------
+def getSpaceRect():
+ __UI_RECT__ = Buffer(GL_FLOAT, 4)
+ glGetFloatv(GL_SCISSOR_BOX, __UI_RECT__)
+ __UI_RECT__ = __UI_RECT__.list
+ return (int(__UI_RECT__[0]), int(__UI_RECT__[1]), int(__UI_RECT__[2]), int(__UI_RECT__[3]))
+
+def getRelMousePos(mco, winRect):
+ # mco = Blender.Window.GetMouseCoords()
+ if pointInRect(mco, winRect):
+ return (mco[0] - winRect[0], mco[1] - winRect[1])
+ return None
+
+
+def pointInRect(pt, rect):
+ if rect[0] < pt[0] < rect[0]+rect[2] and\
+ rect[1] < pt[1] < rect[1]+rect[3]:
+ return True
+ else:
+ return False
+
+
+
+#--- variables UI menu ---------------------------
+mco = [0,0] # mouse coordinaten
+mbX, mbY = 0,0 # mouse buffer coordinaten
+scrollW = 20 # width of scrollbar
+rowH = 20 # height of menu raw
+menu__H = 2 * rowH +5 # height of menu bar
+headerH = 1 * rowH # height of column header bar
+scroll_left = True # position of scrollbar
+menu_bottom = False # position of menu
+edit_mode = False # indicator/activator
+iconlib_mode = False # indicator/activator
+icon_maps = [] #[['blenderbuttons.png',12,25,20,21],
+#['referenceicons.png',12,25,20,21]]
+help_text = False # indicator/activator
+menu_pan = False # indicator/activator
+compact_DESIGN = True # toggle UI
+showLINK = True # toggle Links
+filterList=[-1,-1,-1,-1,-1]
+dubbleclik_delay = 0.25
+
+PAN_X,PAN_Y = 0,0 # pan coordinates in characters
+mPAN_X,mPAN_Y = 0,0 # manu pan coordinates in characters
+menu_orgX = 0
+menu_orgY = 0
+mPAN_Xmax = 800
+mPAN_Ymax = 800
+
+
+#------------------------------------------------------------
+def event(evt, val):
+ global mbX, mbY, UP, UP0, scroll_pan, FOCUS_fix
+ global menu_bottom, scroll_left, mco
+ global PAN_X, PAN_Y, PAN_X0, PAN_Y0
+ global mPAN_X, mPAN_Y, mPAN_X0, mPAN_Y0, menu_pan
+
+ #if Blender.event:
+ # print 'Blender.event:%s, evt:%s' %(Blender.event, evt) #------------
+
+ if evt in (Draw.QKEY, Draw.ESCKEY) and not val:
+ print 'DXF-Exporter *** end ***' #---------------------
+ Draw.Exit()
+
+ elif val:
+ if evt==Draw.MIDDLEMOUSE:
+ mco2 = Window.GetMouseCoords()
+ relativeMouseCo = getRelMousePos(mco2, getSpaceRect())
+ if relativeMouseCo != None:
+ #rect = [menu__X1,menu__Y1,menu__X2,menu__Y2]
+ if 1: #pointInRect(relativeMouseCo, menu__Area):
+ menu_pan = True
+ mPAN_X0 = mPAN_X
+ mPAN_Y0 = mPAN_Y
+ mco = mco2
+ elif evt == Draw.MOUSEY or evt == Draw.MOUSEX:
+ if menu_pan:
+ mco2 = Window.GetMouseCoords()
+ mbX = mco2[0]-mco[0]
+ mbY = mco2[1]-mco[1]
+ mPAN_X = mPAN_X0 - mbX
+ mPAN_Y = mPAN_Y0 - mbY
+ #print mbX, mbY #--------------------
+ Draw.Redraw()
+ elif evt == Draw.WHEELDOWNMOUSE:
+ mPAN_Y -= 80
+ Draw.Redraw()
+ elif evt == Draw.WHEELUPMOUSE:
+ mPAN_Y += 80
+ Draw.Redraw()
+ else: # = if val==False:
+ if evt==Draw.LEFTMOUSE:
+ scroll_pan = False
+ elif evt==Draw.MIDDLEMOUSE:
+ menu_pan = False
+
+def bevent(evt):
+# global EVENT_NONE,EVENT_LOAD_DXF,EVENT_LOAD_INI,EVENT_SAVE_INI,EVENT_EXIT
+ global config_UI, user_preset
+ global CAMERA, GUI_A
+
+ ######### Manages GUI events
+ if (evt==EVENT_EXIT):
+ Draw.Exit()
+ print 'DXF-Exporter *** end ***' #---------------------
+ elif (evt==EVENT_CHOOSE_INI):
+ Window.FileSelector(ini_callback, "INI-file Selection", '*.ini')
+ elif (evt==EVENT_REDRAW):
+ Draw.Redraw()
+ elif (evt==EVENT_RESET):
+ resetDefaultConfig()
+ Draw.Redraw()
+ elif (evt==EVENT_PRESET2D):
+ resetDefaultConfig_2D()
+ Draw.Redraw()
+ elif (evt==EVENT_PRESET3D):
+ resetDefaultConfig_3D()
+ Draw.Redraw()
+ elif evt in (EVENT_CAMERA,EVENT_LIGHT):
+ CAMERA = GUI_A['camera_on'].val
+ if CAMERA==len(CAMERAS)+1:
+ doAllCameras = True
+ else:
+ print 'deb: CAMERAS=',CAMERAS #----------------
+ Draw.Redraw()
+ elif (evt==EVENT_setCAMERA):
+ if CAMERA<len(CAMERAS)+1:
+ gotoCAMERA()
+
+ elif (evt==EVENT_SCALE):
+ if g_scale_as.val == 12:
+ inputGlobalScale()
+ if GUI_A['g_scale'].val < 0.00000001:
+ GUI_A['g_scale'].val = 0.00000001
+ Draw.Redraw()
+ elif (evt==EVENT_ORIGIN):
+ inputOriginVector()
+ Draw.Redraw()
+ elif (evt==EVENT_PRESETPLINE):
+ presetConfig_polyline(GUI_A['to_polyline_on'].val)
+ Draw.Redraw()
+ elif (evt==EVENT_PRESETS):
+ user_preset += 1
+ index = str(user_preset)
+ if user_preset > 5: user_preset = 0; index = ''
+ iniFileName.val = INIFILE_DEFAULT_NAME + index + INIFILE_EXTENSION
+ Draw.Redraw()
+ elif (evt==EVENT_LIST):
+ dxfFile = dxfFileName.val
+ update_RegistryKey('dxfFileName', dxfFileName.val)
+ if dxfFile.lower().endswith('.dxf') and Blender.sys.exists(dxfFile):
+ analyzeDXF(dxfFile)
+ else:
+ Draw.PupMenu('DXF-Exporter: Alert!%t|no valid DXF-file selected!')
+ print "DXF-Exporter: error, no valid DXF-file selected! try again"
+ Draw.Redraw()
+ elif (evt==EVENT_HELP):
try:
import webbrowser
webbrowser.open('http://wiki.blender.org/index.php?title=Scripts/Manual/Export/autodesk_dxf')
except:
- Draw.PupMenu('DXF Exporter: %t|no connection to manual-page on Blender-Wiki! try:|\
+ Draw.PupMenu('DXF-Exporter: HELP Alert!%t|no connection to manual-page on Blender-Wiki! try:|\
http://wiki.blender.org/index.php?title=Scripts/Manual/Export/autodesk_dxf')
- return
+ Draw.Redraw()
+ elif (evt==EVENT_LOAD_INI):
+ loadConfig()
+ Draw.Redraw()
+ elif (evt==EVENT_SAVE_INI):
+ saveConfig()
+ Draw.Redraw()
+ elif (evt==EVENT_DXF_DIR):
+ dxfFile = dxfFileName.val
+ dxfPathName = ''
+ if '/' in dxfFile:
+ dxfPathName = '/'.join(dxfFile.split('/')[:-1]) + '/'
+ elif '\\' in dxfFile:
+ dxfPathName = '\\'.join(dxfFile.split('\\')[:-1]) + '\\'
+ dxfFileName.val = dxfPathName + '*.dxf'
+# dirname == Blender.sys.dirname(Blender.Get('filename'))
+# update_RegistryKey('DirName', dirname)
+# update_RegistryKey('dxfFileName', dxfFileName.val)
+ GUI_A['only_selected_on'].val = 1
+ Draw.Redraw()
+ elif (evt==EVENT_CHOOSE_DXF):
+ filename = '' # '*.dxf'
+ if dxfFileName.val: filename = dxfFileName.val
+ Window.FileSelector(dxf_callback, "DXF-file Selection", filename)
+ elif (evt==EVENT_START):
+ dxfFile = dxfFileName.val
+ #print 'deb: dxfFile file: ', dxfFile #----------------------
+ if E_M: dxfFileName.val, dxfFile = e_mode(dxfFile) #evaluation mode
+ update_RegistryKey('dxfFileName', dxfFileName.val)
+ update_globals()
+ if dxfFile.lower().endswith('*.dxf'):
+ if Draw.PupMenu('DXF-Exporter: OK?|will write multiple DXF-files, one for each Scene, in:|%s' % dxfFile) == 1:
+ global UI_MODE
+ UI_MODE = False
+ #multi_import(dxfFile[:-5]) # cut last 5 characters '*.dxf'
+ Draw.Redraw()
+ #Draw.Exit()
+ else:
+ Draw.Redraw()
+ elif dxfFile.lower()[-4:] in ('.dxf','.dwg'): # and Blender.sys.exists(dxfFile):
+ print '\nStandard Mode: active'
+ filepath = dxfFile
+ sce = Scene.GetCurrent()
+ if ONLYSELECTED: sel_group = sce.objects.selected
+ else: sel_group = sce.objects
+
+ export_list = getObjectsAndDuplis(sel_group,MATRICES=True)
+
+ if export_list: do_export(export_list, filepath)
+ else:
+ print "Abort: selection was empty, no object to export!"
+ Draw.PupMenu('DXF Exporter: nothing exported!|empty selection!')
+ else:
+ Draw.PupMenu('DXF-Exporter: Alert!%t|no valid DXF-file selected!')
+ print "DXF-Exporter: error, no valid DXF-file selected! try again"
+ Draw.Redraw()
+
- ONLYSELECTED = PREF_ONLYSELECTED.val
- POLYLINES = PREF_POLYLINES.val
- ONLYFACES = PREF_ONLYFACES.val
- POLYFACES = PREF_POLYFACES.val
- FLATTEN = PREF_FLATTEN.val
- HIDDEN_MODE = PREF_HIDDEN_MODE.val
- SCALE_FACTOR = PREF_SCALE_FACTOR.val
- OUTPUT_DWG = PREF_DWG.val
-
- sce = Scene.GetCurrent()
- if ONLYSELECTED: sel_group = sce.objects.selected
- else: sel_group = sce.objects
- export_list = getObjectsAndDuplis(sel_group,MATRICES=True)
- if export_list: do_export(export_list, filepath)
- else:
- print "Abort: selection was empty, no object to export!"
- Draw.PupMenu('DXF Exporter: nothing exported!|empty selection!')
- # Timing the script is a good way to be aware on any speed hits when scripting
+def multi_import(DIR):
+ """Imports all DXF-files from directory DIR.
+
+ """
+ global SCENE
+ batchTIME = Blender.sys.time()
+ #if #DIR == "": DIR = os.path.curdir
+ if DIR == "": DIR = Blender.sys.dirname(Blender.Get('filename'))
+ print 'Multifiles Import from %s' %DIR
+ files = \
+ [Blender.sys.join(DIR, f) for f in os.listdir(DIR) if f.lower().endswith('.dxf')]
+ if not files:
+ print '...None DXF-files found. Abort!'
+ return
+
+ i = 0
+ for dxfFile in files:
+ i += 1
+ print '\nDXF-file', i, 'of', len(files) #,'\nImporting', dxfFile
+ if ONLYSELECTED:
+ _dxf_file = dxfFile.split('/')[-1].split('\\')[-1]
+ _dxf_file = _dxf_file[:-4] # cut last char:'.dxf'
+ _dxf_file = _dxf_file[:MAX_NAMELENGTH] #? [-MAX_NAMELENGTH:])
+ SCENE = Blender.Scene.New(_dxf_file)
+ SCENE.makeCurrent()
+ #or so? Blender.Scene.makeCurrent(_dxf_file)
+ #sce = bpy.data.scenes.new(_dxf_file)
+ #bpy.data.scenes.active = sce
+ else:
+ SCENE = Blender.Scene.GetCurrent()
+ SCENE.objects.selected = [] # deselect all
+ main(dxfFile)
+ #Blender.Redraw()
+
+ print 'TOTAL TIME: %.6f' % (Blender.sys.time() - batchTIME)
+ print '\a\r', # beep when done
#-----------------------------------------------------
if __name__=='__main__':
- #main()
- if copy and os and subprocess:
- Window.FileSelector(dxf_export_ui, 'EXPORT DXF', sys.makename(ext='.dxf'))
- else:
- Draw.PupMenu('Error%t|This script requires a full python install')
+
+ 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:
+ 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'))
+ # recall last used DXF-file and INI-file names
+ dxffilename = check_RegistryKey('dxfFileName')
+ #print 'deb:start dxffilename:', dxffilename #----------------
+ if dxffilename: dxfFileName.val = dxffilename
+ else:
+ dirname = Blender.sys.dirname(Blender.Get('filename'))
+ #print 'deb:start dirname:', dirname #----------------
+ dxfFileName.val = Blender.sys.join(dirname, '')
+ inifilename = check_RegistryKey('iniFileName')
+ if inifilename: iniFileName.val = inifilename
+
+ updateMenuCAMERA()
+ updateCAMERA()
+
+ Draw.Register(draw_UI, event, bevent)
+
+ \ No newline at end of file