update for DXF-Importer v1.12, DXF-Exporter v1.29 - 2009.04.11 by migius

- added DWG support, adapted Stani Michiels idea for binding an extern DXF-DWG-converter

The external DXF-DWG converter "dconvertcon.exe" 355kb comes from openDesignAlliance www.opendwg.org, is free, but not opensource, not GPL-compatible (can not be bundled with commercial programs), so must be downloaded and installed in Blender script folder by user. It is a DOS console application, can be started in background mode, works on Windows, and in Wine on Linux and OSX. Version 1.0 (2002) supports conversion between DXF<->DWG for autocad release: 2.5, 2.6, 9, 10, 11, 12, 13, 14, 2000, 2002.
This commit is contained in:
Remigiusz Fiedler 2009-04-15 01:37:50 +00:00
parent a277b979f2
commit 4fe917ba26
2 changed files with 320 additions and 120 deletions

@ -1,14 +1,14 @@
#!BPY #!BPY
""" """
Name: 'Autodesk DXF (.dxf)' Name: 'Autodesk (.dxf .dwg)'
Blender: 247 Blender: 247
Group: 'Export' Group: 'Export'
Tooltip: 'Export geometry to DXF-r12 (Drawing eXchange Format).' Tooltip: 'Export geometry to Autocad DXF/DWG-r12 (Drawing eXchange Format).'
""" """
__version__ = "v1.27beta - 2008.10.07" __version__ = "v1.29 - 2009.04.11"
__author__ = "Remigiusz Fiedler (AKA migius)" __author__ = "Remigiusz Fiedler (AKA migius), Alexandros Sigalas (AKA alxarch), Stani Michiels"
__license__ = "GPL" __license__ = "GPL"
__url__ = "http://wiki.blender.org/index.php/Scripts/Manual/Export/autodesk_dxf" __url__ = "http://wiki.blender.org/index.php/Scripts/Manual/Export/autodesk_dxf"
__bpydoc__ ="""The script exports Blender geometry to DXF format r12 version. __bpydoc__ ="""The script exports Blender geometry to DXF format r12 version.
@ -27,6 +27,7 @@ IDEAs:
- HPGL output for 2d and flattened 3d content - HPGL output for 2d and flattened 3d content
TODO: TODO:
- export dupligroups and dupliverts as blocks ( option for the user to decide )
- optimize back-faces removal (probably needs matrix transform) - optimize back-faces removal (probably needs matrix transform)
- optimize POLYFACE routine: remove double-vertices - optimize POLYFACE routine: remove double-vertices
- optimize POLYFACE routine: remove unused vertices - optimize POLYFACE routine: remove unused vertices
@ -36,6 +37,11 @@ TODO:
- write drawing extends for automatic view positioning in CAD - write drawing extends for automatic view positioning in CAD
History History
v1.29 - 2009.04.11 by migius
- added DWG support, Stani Michiels idea for binding an extern DXF-DWG-converter
v1.28 - 2009.02.05 by alxarch
- added option to apply modifiers on exported meshes
- added option to also export duplicates (from dupliverts etc)
v1.27 - 2008.10.07 by migius v1.27 - 2008.10.07 by migius
- exclude Stani's DXF-Library to extern module - exclude Stani's DXF-Library to extern module
v1.26 - 2008.10.05 by migius v1.26 - 2008.10.05 by migius
@ -86,14 +92,95 @@ ______________________________________________________________
import Blender import Blender
from Blender import Mathutils, Window, Scene, sys, Draw from Blender import Mathutils, Window, Scene, sys, Draw, Mesh
import BPyMessages import BPyMessages
import os
import subprocess
#print os.sys.platform
#print dir(os.sys.version)
#import dxfLibrary #import dxfLibrary
#reload(dxfLibrary) #reload(dxfLibrary)
from dxfLibrary import * 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
#-----------------------------------------------------
def dupTest(object):
"""
Checks objects for duplicates enabled (any type)
object: Blender Object.
Returns: Boolean - True if object has any kind of duplicates enabled.
"""
if (object.enableDupFrames or \
object.enableDupGroup or \
object.enableDupVerts):
return True
else:
return False
def getObjectsAndDuplis(oblist,MATRICES=False,HACK=False):
"""
Return a list of real objects and duplicates and optionally their matrices
oblist: List of Blender Objects
MATRICES: Boolean - Check to also get the objects matrices default=False
HACK: Boolean - See note default=False
Returns: List of objects or
List of tuples of the form:(ob,matrix) if MATRICES is set to True
NOTE: There is an ugly hack here that excludes all objects whose name
starts with "dpl_" to exclude objects that are parented to a duplicating
object, User must name objects properly if hack is used.
"""
result = []
for ob in oblist:
if dupTest(ob):
dup_obs=ob.DupObjects
if len(dup_obs):
for dup_ob, dup_mx in dup_obs:
if MATRICES:
result.append((dup_ob,dup_mx))
else:
result.append(dup_ob)
else:
if HACK:
if ob.getName()[0:4] != "dpl_":
if MATRICES:
mx = ob.mat
result.append((ob,mx))
else:
result.append(ob)
else:
if MATRICES:
mx = ob.mat
result.append((ob,mx))
else:
result.append(ob)
return result
#----------------------------------------------------- #-----------------------------------------------------
def hidden_status(faces, mx_n): def hidden_status(faces, mx_n):
#print 'HIDDEN_MODE: caution! not full implemented yet' #print 'HIDDEN_MODE: caution! not full implemented yet'
@ -146,9 +233,13 @@ def flatten(points, mw):
return points return points
#----------------------------------------------------- #-----------------------------------------------------
def exportMesh(ob, mx, mx_n): def exportMesh(ob, mx, mx_n,me=None):
entities = [] entities = []
me = ob.getData(mesh=1) global APPLY_MODIFIERS
if me is None:
me = ob.getData(mesh=1)
else:
me.getFromObject(ob)
#me.transform(mx) #me.transform(mx)
# above is eventualy faster, but bad, cause # above is eventualy faster, but bad, cause
# directly transforms origin geometry and write back rounding errors # directly transforms origin geometry and write back rounding errors
@ -257,7 +348,7 @@ def exportCurve(ob, mx):
return entities return entities
#----------------------------------------------------- #-----------------------------------------------------
def do_export(sel_group, filepath): def do_export(export_list, filepath):
Window.WaitCursor(1) Window.WaitCursor(1)
t = sys.time() t = sys.time()
@ -281,9 +372,14 @@ def do_export(sel_group, filepath):
m0[2][2]=0.0 m0[2][2]=0.0
mw *= m0 #flatten ViewMatrix mw *= m0 #flatten ViewMatrix
for ob in sel_group: if APPLY_MODIFIERS:
tmp_me = Mesh.New('tmp')
else:
tmp_me = None
for ob,mx in export_list:
entities = [] entities = []
mx = ob.matrix.copy() #mx = ob.matrix.copy()
mb = mx.copy() mb = mx.copy()
#print 'deb: mb =\n', mb #--------- #print 'deb: mb =\n', mb #---------
#print 'deb: mw0 =\n', mw0 #--------- #print 'deb: mw0 =\n', mw0 #---------
@ -296,7 +392,7 @@ def do_export(sel_group, filepath):
#print 'deb: mx_inv=\n', mx_inv #--------- #print 'deb: mx_inv=\n', mx_inv #---------
if (ob.type == 'Mesh'): if (ob.type == 'Mesh'):
entities = exportMesh(ob, mx, mx_n) entities = exportMesh(ob, mx, mx_n,tmp_me)
elif (ob.type == 'Curve'): elif (ob.type == 'Curve'):
entities = exportCurve(ob, mx) entities = exportCurve(ob, mx)
@ -305,11 +401,30 @@ def do_export(sel_group, filepath):
something_ready = True something_ready = True
if something_ready: if something_ready:
d.saveas(filepath) if not OUTPUT_DWG:
Window.WaitCursor(0) print 'exporting to %s' % filepath
#Draw.PupMenu('DXF Exporter: job finished') d.saveas(filepath)
print 'exported to %s' % filepath Window.WaitCursor(0)
print 'finished in %.2f seconds' % (sys.time()-t) #Draw.PupMenu('DXF Exporter: job finished')
print ' finished in %.2f seconds. -----DONE-----' % (sys.time()-t)
else:
if not extCONV_OK:
Draw.PupMenu(extCONV_TEXT)
Window.WaitCursor(False)
else:
print 'temp. exporting to %s' % filepath
d.saveas(filepath)
#Draw.PupMenu('DXF Exporter: job finished')
#print 'exported to %s' % filepath
#print 'finished in %.2f seconds' % (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)
else: else:
Window.WaitCursor(0) Window.WaitCursor(0)
print "Abort: selected objects dont mach choosen export option, nothing exported!" print "Abort: selected objects dont mach choosen export option, nothing exported!"
@ -323,8 +438,9 @@ POLYFACES = 1
FLATTEN = 0 FLATTEN = 0
HIDDEN_MODE = False #filter out hidden lines HIDDEN_MODE = False #filter out hidden lines
SCALE_FACTOR = 1.0 #optional, can be done later in CAD too 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): def dxf_export_ui(filepath):
@ -334,9 +450,12 @@ def dxf_export_ui(filepath):
POLYFACES,\ POLYFACES,\
FLATTEN,\ FLATTEN,\
HIDDEN_MODE,\ HIDDEN_MODE,\
SCALE_FACTOR SCALE_FACTOR,\
APPLY_MODIFIERS,\
OUTPUT_DWG,\
INCLUDE_DUPLIS
print '\n\nDXF-Export %s -----------------------' %__version__ print '\n\nDXF-Export %s -----------START-----------' %__version__
#filepath = 'blend_test.dxf' #filepath = 'blend_test.dxf'
# Dont overwrite # Dont overwrite
if not BPyMessages.Warning_SaveOver(filepath): if not BPyMessages.Warning_SaveOver(filepath):
@ -352,17 +471,24 @@ def dxf_export_ui(filepath):
PREF_FLATTEN= Draw.Create(FLATTEN) PREF_FLATTEN= Draw.Create(FLATTEN)
PREF_HIDDEN_MODE= Draw.Create(HIDDEN_MODE) PREF_HIDDEN_MODE= Draw.Create(HIDDEN_MODE)
PREF_SCALE_FACTOR= Draw.Create(SCALE_FACTOR) 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_HELP= Draw.Create(0)
PREF_DWG= Draw.Create(OUTPUT_DWG)
block = [\ block = [\
("only selected", PREF_ONLYSELECTED, "export only selected geometry"),\ ("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"),\ ("global Scale:", PREF_SCALE_FACTOR, 0.001, 1000, "set global Scale factor for exporting geometry"),\
("only faces", PREF_ONLYFACES, "from mesh-objects export only faces, otherwise only edges"),\ (''),\
("write POLYFACE", PREF_POLYFACES, "export mesh to POLYFACE, otherwise to 3DFACEs"),\ ("export to 3DFaces", PREF_ONLYFACES, "from mesh-objects export only faces, otherwise only edges"),\
("write POLYLINEs", PREF_POLYLINES, "export curve to POLYLINE, otherwise to LINEs"),\ ("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"),\ ("3D-View to Flat", PREF_FLATTEN, "flatten geometry according current 3d-View"),\
("Hidden Mode", PREF_HIDDEN_MODE, "filter out hidden lines"),\ ("Hidden Mode", PREF_HIDDEN_MODE, "filter out hidden lines"),\
#(''),\
("online Help", PREF_HELP, "calls DXF-Exporter Manual Page on Wiki.Blender.org"),\ ("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 not Draw.PupBlock("DXF-Exporter %s" %__version__[:10], block): return
@ -372,7 +498,7 @@ def dxf_export_ui(filepath):
import webbrowser import webbrowser
webbrowser.open('http://wiki.blender.org/index.php?title=Scripts/Manual/Export/autodesk_dxf') webbrowser.open('http://wiki.blender.org/index.php?title=Scripts/Manual/Export/autodesk_dxf')
except: except:
Draw.PupMenu('DXF Exporter: %t|no connection to manual-page on Blender-Wiki! try:|\ Draw.PupMenu('DXF Exporter: %t|no connection to manual-page on Blender-Wiki! try:|\
http://wiki.blender.org/index.php?title=Scripts/Manual/Export/autodesk_dxf') http://wiki.blender.org/index.php?title=Scripts/Manual/Export/autodesk_dxf')
return return
@ -383,12 +509,14 @@ http://wiki.blender.org/index.php?title=Scripts/Manual/Export/autodesk_dxf')
FLATTEN = PREF_FLATTEN.val FLATTEN = PREF_FLATTEN.val
HIDDEN_MODE = PREF_HIDDEN_MODE.val HIDDEN_MODE = PREF_HIDDEN_MODE.val
SCALE_FACTOR = PREF_SCALE_FACTOR.val SCALE_FACTOR = PREF_SCALE_FACTOR.val
OUTPUT_DWG = PREF_DWG.val
sce = Scene.GetCurrent() sce = Scene.GetCurrent()
if ONLYSELECTED: sel_group = sce.objects.selected if ONLYSELECTED: sel_group = sce.objects.selected
else: sel_group = sce.objects else: sel_group = sce.objects
export_list = getObjectsAndDuplis(sel_group,MATRICES=True)
if sel_group: do_export(sel_group, filepath) if export_list: do_export(export_list, filepath)
else: else:
print "Abort: selection was empty, no object to export!" print "Abort: selection was empty, no object to export!"
Draw.PupMenu('DXF Exporter: nothing exported!|empty selection!') Draw.PupMenu('DXF Exporter: nothing exported!|empty selection!')
@ -401,7 +529,4 @@ if __name__=='__main__':
#main() #main()
if not copy: if not copy:
Draw.PupMenu('Error%t|This script requires a full python install') Draw.PupMenu('Error%t|This script requires a full python install')
Window.FileSelector(dxf_export_ui, 'EXPORT DXF', sys.makename(ext='.dxf')) else: Window.FileSelector(dxf_export_ui, 'EXPORT DXF', sys.makename(ext='.dxf'))

@ -1,20 +1,21 @@
#!BPY #!BPY
""" """
Name: 'Autodesk DXF (.dxf)' Name: 'Autodesk DXF (.dxf .dwg)'
Blender: 246 Blender: 246
Group: 'Import' Group: 'Import'
Tooltip: 'Import for DXF geometry data (Drawing eXchange Format).' Tooltip: 'Import for DWG/DXF geometry data.'
""" """
__author__ = 'Kitsu(Ed Blake) & migius(Remigiusz Fiedler)' __author__ = 'Kitsu(Ed Blake) & migius(Remigiusz Fiedler)'
__version__ = '1.12 - 2009.03.14 by migius' __version__ = '1.12 - 2009.04.11 by migius'
__url__ = ["http://blenderartists.org/forum/showthread.php?t=84319", __url__ = ["http://blenderartists.org/forum/showthread.php?t=84319",
"http://wiki.blender.org/index.php/Scripts/Manual/Import/DXF-3D"] "http://wiki.blender.org/index.php/Scripts/Manual/Import/DXF-3D"]
__email__ = ["migius(at)4d-vectors.de","Kitsune_e(at)yahoo.com"] __email__ = ["migius(at)4d-vectors.de","Kitsune_e(at)yahoo.com"]
__bpydoc__ = """\ __bpydoc__ = """\
This script imports objects from DXF (2d/3d) into Blender. This script imports objects from DWG/DXF (2d/3d) into Blender.
This script imports 2d and 3d geometery from DXF files. This script imports 2d and 3d geometery from DXF files.
It supports DWG format too, with help of an external converter.
Supported DXF format versions: from (r2.5) r12 up to r2008. Supported DXF format versions: from (r2.5) r12 up to r2008.
Enhanced features are: Enhanced features are:
- configurable object filtering and geometry manipulation, - configurable object filtering and geometry manipulation,
@ -111,6 +112,8 @@ History:
-- support ortho mode for VIEWs and VPORTs as cameras -- support ortho mode for VIEWs and VPORTs as cameras
v1.12 - 2009.04.11 by migius
d4 added DWG support, Stani Michiels idea for binding an extern DXF-DWG-converter
v1.12 - 2009.03.14 by migius v1.12 - 2009.03.14 by migius
d3 removed all set()functions (problem with osx/python<2.4 reported by Blinkozo) d3 removed all set()functions (problem with osx/python<2.4 reported by Blinkozo)
d3 code-cleaning d3 code-cleaning
@ -305,7 +308,8 @@ History:
# -------------------------------------------------------------------------- # --------------------------------------------------------------------------
import Blender import Blender
from Blender import * from Blender import Mathutils, BezTriple, Draw, Registry, sys,\
Text3d, Window, Mesh, Material, Group
#from Blender.Mathutils import Vector, Matrix #from Blender.Mathutils import Vector, Matrix
#import bpy #not used yet #import bpy #not used yet
#import BPyMessages #import BPyMessages
@ -314,7 +318,7 @@ from dxfReader import readDXF
#from dxfReader import get_name, get_layer #from dxfReader import get_name, get_layer
from dxfReader import Object as dxfObject from dxfReader import Object as dxfObject
from dxfColorMap import color_map from dxfColorMap import color_map
from math import * from math import log10, sqrt, radians, degrees, atan, cos, sin
# osx-patch by Blinkozo # osx-patch by Blinkozo
#todo: avoid additional modules, prefer Blender-build-in test routines #todo: avoid additional modules, prefer Blender-build-in test routines
@ -325,9 +329,10 @@ from math import *
#ver = '%s.%s' % version_info[0:2] #ver = '%s.%s' % version_info[0:2]
# end osx-patch # end osx-patch
try: import subprocess
import os import os
if os.name != 'mac': if os.name != 'mac':
try:
import psyco import psyco
psyco.log(Blender.Get('tempdir')+"/blender.log-psyco") psyco.log(Blender.Get('tempdir')+"/blender.log-psyco")
#psyco.log() #psyco.log()
@ -335,14 +340,13 @@ try:
psyco.profile(0.05, memory=100) psyco.profile(0.05, memory=100)
psyco.profile(0.2) psyco.profile(0.2)
#print 'psyco imported' #print 'psyco imported'
except ImportError: except ImportError:
print 'psyco not imported' print 'psyco not imported'
pass
#try: Curve.orderU #try: Curve.orderU
print '\n\n\n' print '\n\n\n'
print 'DXF-Importer v%s *** start ***' %(__version__) #--------------------- print 'DXF/DWG-Importer v%s *** start ***' %(__version__) #---------------------
SCENE = None SCENE = None
WORLDX = Mathutils.Vector((1,0,0)) WORLDX = Mathutils.Vector((1,0,0))
@ -386,6 +390,29 @@ FREE = BezTriple.HandleTypes.FREE
VECT = BezTriple.HandleTypes.VECT VECT = BezTriple.HandleTypes.VECT
ALIGN = BezTriple.HandleTypes.ALIGN ALIGN = BezTriple.HandleTypes.ALIGN
UI_MODE = True #activates UI-popup-print, if not multiple files imported
#-------- 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-Importer cant find external DWG-converter (%s) in 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 = 'The external DWG-converter (%s) needs Wine installed on your system.|\
More details in online Help.' %extCONV
#print 'extCONV_PATH = ', extCONV_PATH
class View: #----------------------------------------------------------------- class View: #-----------------------------------------------------------------
"""Class for objects representing dxf VIEWs. """Class for objects representing dxf VIEWs.
@ -754,7 +781,7 @@ class Solid: #-----------------------------------------------------------------
if settings.var['vGroup_on'] and not M_OBJ: if settings.var['vGroup_on'] and not M_OBJ:
# each MeshSide becomes vertexGroup for easier material assignment --------------------- # each MeshSide becomes vertexGroup for easier material assignment ---------------------
replace = Blender.Mesh.AssignModes.ADD #or .AssignModes.ADD/REPLACE replace = Mesh.AssignModes.ADD #or .AssignModes.ADD/REPLACE
if vg_left: me.addVertGroup('side.left') ; me.assignVertsToGroup('side.left', vg_left, 1.0, replace) if vg_left: me.addVertGroup('side.left') ; me.assignVertsToGroup('side.left', vg_left, 1.0, replace)
if vg_right:me.addVertGroup('side.right') ; me.assignVertsToGroup('side.right', vg_right, 1.0, replace) if vg_right:me.addVertGroup('side.right') ; me.assignVertsToGroup('side.right', vg_right, 1.0, replace)
if vg_top: me.addVertGroup('side.top') ; me.assignVertsToGroup('side.top', vg_top, 1.0, replace) if vg_top: me.addVertGroup('side.top') ; me.assignVertsToGroup('side.top', vg_top, 1.0, replace)
@ -899,7 +926,7 @@ class Line: #-----------------------------------------------------------------
ob.link(me) # link mesh to that object ob.link(me) # link mesh to that object
vG_name = 'color_%s' %self.color_index vG_name = 'color_%s' %self.color_index
if edges: faces = edges if edges: faces = edges
replace = Blender.Mesh.AssignModes.ADD #or .AssignModes.REPLACE or ADD replace = Mesh.AssignModes.ADD #or .AssignModes.REPLACE or ADD
try: try:
me.assignVertsToGroup(vG_name, faces[0], 1.0, replace) me.assignVertsToGroup(vG_name, faces[0], 1.0, replace)
#print 'deb: existed vGroup:', vG_name #--------------------- #print 'deb: existed vGroup:', vG_name #---------------------
@ -1792,7 +1819,7 @@ class Polyline: #--------------------------------------------------------------
# which may be linked to more than one object. # which may be linked to more than one object.
if settings.var['vGroup_on'] and not M_OBJ: if settings.var['vGroup_on'] and not M_OBJ:
# each MeshSide becomes vertexGroup for easier material assignment --------------------- # each MeshSide becomes vertexGroup for easier material assignment ---------------------
replace = Blender.Mesh.AssignModes.REPLACE #or .AssignModes.ADD replace = Mesh.AssignModes.REPLACE #or .AssignModes.ADD
vg_left, vg_right, vg_top, vg_bottom = [], [], [], [] vg_left, vg_right, vg_top, vg_bottom = [], [], [], []
for v in f_left: vg_left.extend(v) for v in f_left: vg_left.extend(v)
for v in f_right: vg_right.extend(v) for v in f_right: vg_right.extend(v)
@ -2640,7 +2667,7 @@ class Circle: #----------------------------------------------------------------
# each MeshSide becomes vertexGroup for easier material assignment --------------------- # each MeshSide becomes vertexGroup for easier material assignment ---------------------
if settings.var['vGroup_on'] and not M_OBJ: if settings.var['vGroup_on'] and not M_OBJ:
# each MeshSide becomes vertexGroup for easier material assignment --------------------- # each MeshSide becomes vertexGroup for easier material assignment ---------------------
replace = Blender.Mesh.AssignModes.REPLACE #or .AssignModes.ADD replace = Mesh.AssignModes.REPLACE #or .AssignModes.ADD
vg_band, vg_top, vg_bottom = [], [], [] vg_band, vg_top, vg_bottom = [], [], []
for v in f_band: vg_band.extend(v) for v in f_band: vg_band.extend(v)
me.addVertGroup('side.band') ; me.assignVertsToGroup('side.band', vg_band, 1.0, replace) me.addVertGroup('side.band') ; me.assignVertsToGroup('side.band', vg_band, 1.0, replace)
@ -2820,7 +2847,7 @@ class Arc: #-----------------------------------------------------------------
# each MeshSide becomes vertexGroup for easier material assignment --------------------- # each MeshSide becomes vertexGroup for easier material assignment ---------------------
if settings.var['vGroup_on'] and not M_OBJ: if settings.var['vGroup_on'] and not M_OBJ:
# each MeshSide becomes vertexGroup for easier material assignment --------------------- # each MeshSide becomes vertexGroup for easier material assignment ---------------------
replace = Blender.Mesh.AssignModes.REPLACE #or .AssignModes.ADD replace = Mesh.AssignModes.REPLACE #or .AssignModes.ADD
vg_left, vg_right, vg_top, vg_bottom = [], [], [], [] vg_left, vg_right, vg_top, vg_bottom = [], [], [], []
for v in f_left: vg_left.extend(v) for v in f_left: vg_left.extend(v)
for v in f_right: vg_right.extend(v) for v in f_right: vg_right.extend(v)
@ -3364,7 +3391,7 @@ class Ellipse: #---------------------------------------------------------------
me.faces[i].smooth = True me.faces[i].smooth = True
if settings.var['vGroup_on'] and not M_OBJ: if settings.var['vGroup_on'] and not M_OBJ:
# each MeshSide becomes vertexGroup for easier material assignment --------------------- # each MeshSide becomes vertexGroup for easier material assignment ---------------------
replace = Blender.Mesh.AssignModes.REPLACE #or .AssignModes.ADD replace = Mesh.AssignModes.REPLACE #or .AssignModes.ADD
vg_left, vg_right, vg_top, vg_bottom = [], [], [], [] vg_left, vg_right, vg_top, vg_bottom = [], [], [], []
for v in f_left: vg_left.extend(v) for v in f_left: vg_left.extend(v)
for v in f_right: vg_right.extend(v) for v in f_right: vg_right.extend(v)
@ -3517,7 +3544,7 @@ class Face: #-----------------------------------------------------------------
ob.link(me) # link mesh to that object ob.link(me) # link mesh to that object
vG_name = 'color_%s' %self.color_index vG_name = 'color_%s' %self.color_index
if edges: faces = edges if edges: faces = edges
replace = Blender.Mesh.AssignModes.ADD #or .AssignModes.REPLACE or ADD replace = Mesh.AssignModes.ADD #or .AssignModes.REPLACE or ADD
try: try:
me.assignVertsToGroup(vG_name, faces[0], 1.0, replace) me.assignVertsToGroup(vG_name, faces[0], 1.0, replace)
#print 'deb: existed vGroup:', vG_name #--------------------- #print 'deb: existed vGroup:', vG_name #---------------------
@ -4022,10 +4049,8 @@ class Settings: #--------------------------------------------------------------
"""Wraps the built-in print command in a optimization check. """Wraps the built-in print command in a optimization check.
""" """
if self.var['optimization'] <= self.MID: if self.var['optimization'] <= self.MID:
if newline: if newline: print text
print text else: print text,
else:
print text,
def redraw(self): def redraw(self):
@ -4067,9 +4092,9 @@ def analyzeDXF(dxfFile): #---------------------------------------
""" """
Window.WaitCursor(True) # Let the user know we are thinking Window.WaitCursor(True) # Let the user know we are thinking
print 'reading DXF file: %s.' % dxfFile print 'reading DXF file: %s.' % dxfFile
time1 = Blender.sys.time() #time marker1 time1 = sys.time() #time marker1
drawing = readDXF(dxfFile, objectify) drawing = readDXF(dxfFile, objectify)
print 'finish reading in %.4f sec.' % (Blender.sys.time()-time1) print 'finish reading in %.4f sec.' % (sys.time()-time1)
# First sort out all the section_items # First sort out all the section_items
sections = dict([(item.name, item) for item in drawing.data]) sections = dict([(item.name, item) for item in drawing.data])
@ -4282,10 +4307,45 @@ def main(dxfFile): #---------------#############################-----------
if dxfFile.lower().endswith('.dxf') and sys.exists(dxfFile): if dxfFile.lower().endswith('.dxf') and sys.exists(dxfFile):
Window.WaitCursor(True) # Let the user know we are thinking Window.WaitCursor(True) # Let the user know we are thinking
print 'reading file: %s.' % dxfFile print 'reading file: %s.' % dxfFile
time1 = Blender.sys.time() #time marker1 time1 = sys.time() #time marker1
drawing = readDXF(dxfFile, objectify) drawing = readDXF(dxfFile, objectify)
print 'reading finished in %.4f sec.' % (Blender.sys.time()-time1) print 'reading finished in %.4f sec.' % (sys.time()-time1)
Window.WaitCursor(False) Window.WaitCursor(False)
elif dxfFile.lower().endswith('.dwg') and sys.exists(dxfFile):
if not extCONV_OK:
Draw.PupMenu(extCONV_TEXT)
Window.WaitCursor(False)
if editmode: Window.EditMode(1) # and put things back how we fond them
return None
else:
Window.WaitCursor(True) # Let the user know we are thinking
#todo: issue: in DConvertCon.exe the output filename is fixed to dwg_name.dxf
if 0: # works only for Windows
dwgTemp = 'temp_01.dwg'
dxfTemp = 'temp_01.dxf'
os.system('copy %s %s' %(dxfFile,dwgTemp))
else:
dwgTemp = dxfFile
dxfTemp = dxfFile[:-3]+'dxf'
#print 'temp. converting: %s\n to: %s' %(dxfFile, dxfTemp)
#os.system('%s %s -acad11 -dxf' %(extCONV_PATH, dxfFile))
os.system('%s %s -dxf' %(extCONV_PATH, dwgTemp))
#os.system('%s %s -dxf' %(extCONV_PATH, dxfFile_temp))
if sys.exists(dxfTemp):
print 'reading file: %s.' % dxfTemp
time1 = sys.time() #time marker1
drawing = readDXF(dxfTemp, objectify)
#os.remove(dwgTemp)
os.remove(dxfTemp) # clean up
print 'reading finished in %.4f sec.' % (sys.time()-time1)
Window.WaitCursor(False)
else:
if UI_MODE: Draw.PupMenu('DWG importer: nothing imported!%t|No valid DXF-representation found!')
print 'DWG importer: nothing imported. No valid DXF-representation found.'
Window.WaitCursor(False)
if editmode: Window.EditMode(1) # and put things back how we fond them
return None
else: else:
if UI_MODE: Draw.PupMenu('DXF importer: Alert!%t| no valid DXF-file selected!') if UI_MODE: Draw.PupMenu('DXF importer: Alert!%t| no valid DXF-file selected!')
print "DXF importer: Alert! - no valid DXF-file selected." print "DXF importer: Alert! - no valid DXF-file selected."
@ -4295,7 +4355,7 @@ def main(dxfFile): #---------------#############################-----------
# Draw all the know entity types in the current scene # Draw all the know entity types in the current scene
oblist = [] # a list of all created AND linked objects for final f_globalScale oblist = [] # a list of all created AND linked objects for final f_globalScale
time2 = Blender.sys.time() #time marker2 time2 = sys.time() #time marker2
Window.WaitCursor(True) # Let the user know we are thinking Window.WaitCursor(True) # Let the user know we are thinking
settings.write("\n\nDrawing entities...") settings.write("\n\nDrawing entities...")
@ -4322,7 +4382,7 @@ def main(dxfFile): #---------------#############################-----------
#SCENE.objects.selected = SCENE.objects #select all objects in current scene #SCENE.objects.selected = SCENE.objects #select all objects in current scene
Blender.Redraw() Blender.Redraw()
time_text = Blender.sys.time() - time2 time_text = sys.time() - time2
Window.WaitCursor(False) Window.WaitCursor(False)
if settings.var['paper_space_on']: space = 'from paper space' if settings.var['paper_space_on']: space = 'from paper space'
else: space = 'from model space' else: space = 'from model space'
@ -4571,7 +4631,7 @@ def drawer(_type, entities, settings, block_def): #----------------------------
activObjectLayer = '' activObjectLayer = ''
activObjectName = '' activObjectName = ''
message = "Drawing dxf\'%ss\'..." %_type message = "Drawing dxf \'%ss\'..." %_type
cur_COUNTER += len_temp - len(entities) cur_COUNTER += len_temp - len(entities)
settings.write(message, False) settings.write(message, False)
settings.progress(cur_COUNTER, message) settings.progress(cur_COUNTER, message)
@ -5078,7 +5138,7 @@ def drawCurveArc(self): #---- only for ELLIPSE --------------------------------
# GUI STUFF -----#################################################----------------- # GUI STUFF -----#################################################-----------------
from Blender.BGL import * from Blender.BGL import glColor3f, glRecti, glClear, glRasterPos2d
EVENT_NONE = 1 EVENT_NONE = 1
EVENT_START = 2 EVENT_START = 2
@ -5577,7 +5637,7 @@ def draw_UI(): #---------------------------------------------------------------
y += 30 y += 30
colorbox(x, y+20, x+menu_w+menu_margin*2, menu_margin) colorbox(x, y+20, x+menu_w+menu_margin*2, menu_margin)
Draw.Label("DXF-Importer v" + __version__, but0c, y, menu_w, 20) Draw.Label("DXF/DWG-Importer v" + __version__, but0c, y, menu_w, 20)
if config_UI.val: if config_UI.val:
b0, b0_ = but0c, but_0c + butt_margin b0, b0_ = but0c, but_0c + butt_margin
@ -5853,9 +5913,9 @@ def draw_UI(): #---------------------------------------------------------------
#y -= 10 #y -= 10
Draw.BeginAlign() Draw.BeginAlign()
Draw.PushButton('DXFfile >', EVENT_CHOOSE_DXF, but0c, y, but_0c, 20, 'Select DXF-file from project directory') Draw.PushButton('DXFfile >', EVENT_CHOOSE_DXF, but0c, y, but_0c, 20, 'Select DXF/DWG-file for import')
dxfFileName = Draw.String(' :', EVENT_NONE, but1c, y, but_1c+but_2c+but_3c-20, 20, dxfFileName.val, FILENAME_MAX, "type the name of DXF-file or type *.dxf for multi-import") dxfFileName = Draw.String(' :', EVENT_NONE, but1c, y, but_1c+but_2c+but_3c-20, 20, dxfFileName.val, FILENAME_MAX, "type the name of DXF/DWG-file or type *.dxf/*.dwg for multiple files")
Draw.PushButton('*.*', EVENT_DXF_DIR, but3c+but_3c-20, y, 20, 20, 'import all dxf files from this directory') Draw.PushButton('*.*', EVENT_DXF_DIR, but3c+but_3c-20, y, 20, 20, 'set filter for import all files from this directory')
Draw.EndAlign() Draw.EndAlign()
y -= 30 y -= 30
@ -5902,8 +5962,9 @@ def colorbox(x,y,xright,bottom):
def dxf_callback(input_filename): def dxf_callback(input_filename):
global dxfFileName global dxfFileName
dxfFileName.val=input_filename if input_filename.lower()[-3:] in ('dwg','dxf'):
# dirname == Blender.sys.dirname(Blender.Get('filename')) dxfFileName.val=input_filename
# dirname == sys.dirname(Blender.Get('filename'))
# update_RegistryKey('DirName', dirname) # update_RegistryKey('DirName', dirname)
# update_RegistryKey('dxfFileName', input_filename) # update_RegistryKey('dxfFileName', input_filename)
@ -5913,17 +5974,17 @@ def ini_callback(input_filename):
def event(evt, val): def event(evt, val):
if evt in (Draw.QKEY, Draw.ESCKEY) and not val: if evt in (Draw.QKEY, Draw.ESCKEY) and not val:
Blender.Draw.Exit() Draw.Exit()
def bevent(evt): def bevent(evt):
# global EVENT_NONE,EVENT_LOAD_DXF,EVENT_LOAD_INI,EVENT_SAVE_INI,EVENT_EXIT # global EVENT_NONE,EVENT_LOAD_DXF,EVENT_LOAD_INI,EVENT_SAVE_INI,EVENT_EXIT
global config_UI, user_preset global config_UI, user_preset
global GUI_A global GUI_A, UI_MODE
######### Manages GUI events ######### Manages GUI events
if (evt==EVENT_EXIT): if (evt==EVENT_EXIT):
Blender.Draw.Exit() Draw.Exit()
print 'DXF-Importer *** exit ***' #--------------------- print 'DXF/DWG-Importer *** exit ***' #---------------------
elif (evt==EVENT_CHOOSE_INI): elif (evt==EVENT_CHOOSE_INI):
Window.FileSelector(ini_callback, "INI-file Selection", '*.ini') Window.FileSelector(ini_callback, "INI-file Selection", '*.ini')
elif (evt==EVENT_REDRAW): elif (evt==EVENT_REDRAW):
@ -5980,13 +6041,14 @@ http://wiki.blender.org/index.php?title=Scripts/Manual/Import/DXF-3D')
Draw.Redraw() Draw.Redraw()
elif (evt==EVENT_DXF_DIR): elif (evt==EVENT_DXF_DIR):
dxfFile = dxfFileName.val dxfFile = dxfFileName.val
dxfFileExt = '*'+dxfFile.lower()[-4:] #can be .dxf or .dwg
dxfPathName = '' dxfPathName = ''
if '/' in dxfFile: if '/' in dxfFile:
dxfPathName = '/'.join(dxfFile.split('/')[:-1]) + '/' dxfPathName = '/'.join(dxfFile.split('/')[:-1]) + '/'
elif '\\' in dxfFile: elif '\\' in dxfFile:
dxfPathName = '\\'.join(dxfFile.split('\\')[:-1]) + '\\' dxfPathName = '\\'.join(dxfFile.split('\\')[:-1]) + '\\'
dxfFileName.val = dxfPathName + '*.dxf' dxfFileName.val = dxfPathName + dxfFileExt
# dirname == Blender.sys.dirname(Blender.Get('filename')) # dirname == sys.dirname(Blender.Get('filename'))
# update_RegistryKey('DirName', dirname) # update_RegistryKey('DirName', dirname)
# update_RegistryKey('dxfFileName', dxfFileName.val) # update_RegistryKey('dxfFileName', dxfFileName.val)
GUI_A['newScene_on'].val = 1 GUI_A['newScene_on'].val = 1
@ -5994,45 +6056,55 @@ http://wiki.blender.org/index.php?title=Scripts/Manual/Import/DXF-3D')
elif (evt==EVENT_CHOOSE_DXF): elif (evt==EVENT_CHOOSE_DXF):
filename = '' # '*.dxf' filename = '' # '*.dxf'
if dxfFileName.val: filename = dxfFileName.val if dxfFileName.val: filename = dxfFileName.val
Window.FileSelector(dxf_callback, "DXF-file Selection", filename) Window.FileSelector(dxf_callback, "DXF/DWG-file Selection", filename)
elif (evt==EVENT_START): elif (evt==EVENT_START):
dxfFile = dxfFileName.val dxfFile = dxfFileName.val
#print 'deb: dxfFile file: ', dxfFile #---------------------- #print 'deb: dxfFile file: ', dxfFile #----------------------
if E_M: dxfFileName.val, dxfFile = e_mode(dxfFile) #evaluation mode if E_M: dxfFileName.val, dxfFile = e_mode(dxfFile) #evaluation mode
update_RegistryKey('dxfFileName', dxfFileName.val) update_RegistryKey('dxfFileName', dxfFileName.val)
if dxfFile.lower().endswith('*.dxf'): if dxfFile.lower().endswith('*.dxf'):
if Draw.PupMenu('DXF importer: OK?|will import all DXF-files from:|%s' % dxfFile) == 1: if Draw.PupMenu('DXF importer will import all DXF-files from:|%s|OK?' % dxfFile) != -1:
global UI_MODE
UI_MODE = False UI_MODE = False
multi_import(dxfFile[:-5]) # cut last 5 characters '*.dxf' multi_import(dxfFile)
UI_MODE = True
Draw.Redraw() Draw.Redraw()
#Draw.Exit()
else: elif dxfFile.lower().endswith('*.dwg'):
if not extCONV_OK: Draw.PupMenu(extCONV_TEXT)
elif Draw.PupMenu('DWG importer will import all DWG-files from:|%s|OK?' % dxfFile) != -1:
#elif Draw.PupMenu('DWG importer will import all DWG-files from:|%s|Caution! overwrites existing DXF-files!| OK?' % dxfFile) != -1:
UI_MODE = False
multi_import(dxfFile)
UI_MODE = True
Draw.Redraw() Draw.Redraw()
elif dxfFile.lower().endswith('.dxf') and sys.exists(dxfFile):
print '\nStandard Mode: active' elif sys.exists(dxfFile) and dxfFile.lower()[-4:] in ('.dxf','.dwg'):
if GUI_A['newScene_on'].val: if dxfFile.lower().endswith('.dwg') and (not extCONV_OK):
_dxf_file = dxfFile.split('/')[-1].split('\\')[-1] Draw.PupMenu(extCONV_TEXT)
_dxf_file = _dxf_file[:-4] # cut last char:'.dxf'
_dxf_file = _dxf_file[:MAX_NAMELENGTH] #? [-MAX_NAMELENGTH:])
global SCENE
SCENE = Blender.Scene.New(_dxf_file)
SCENE.makeCurrent()
Blender.Redraw()
#or so? Blender.Scene.makeCurrent(_dxf_file)
#sce = bpy.data.scenes.new(_dxf_file)
#bpy.data.scenes.active = sce
else: else:
SCENE = Blender.Scene.GetCurrent() #print '\nStandard Mode: active'
SCENE.objects.selected = [] # deselect all if GUI_A['newScene_on'].val:
main(dxfFile) _dxf_file = dxfFile.split('/')[-1].split('\\')[-1]
#SCENE.objects.selected = SCENE.objects _dxf_file = _dxf_file[:-4] # cut last char:'.dxf'
#Window.RedrawAll() _dxf_file = _dxf_file[:MAX_NAMELENGTH] #? [-MAX_NAMELENGTH:])
#Blender.Redraw() global SCENE
#Draw.Redraw() SCENE = Blender.Scene.New(_dxf_file)
SCENE.makeCurrent()
Blender.Redraw()
#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)
#SCENE.objects.selected = SCENE.objects
#Window.RedrawAll()
#Blender.Redraw()
#Draw.Redraw()
else: else:
Draw.PupMenu('DXF importer: Alert!%t|no valid DXF-file selected!') Draw.PupMenu('DXF importer: nothing imported!%t|no valid DXF-file selected!')
print "DXF importer: error, no valid DXF-file selected! try again" print "DXF importer: nothing imported, no valid DXF-file selected! try again"
Draw.Redraw() Draw.Redraw()
@ -6043,20 +6115,25 @@ def multi_import(DIR):
""" """
global SCENE global SCENE
batchTIME = Blender.sys.time() batchTIME = sys.time()
#if #DIR == "": DIR = os.path.curdir #if #DIR == "": DIR = os.path.curdir
if DIR == "": DIR = Blender.sys.dirname(Blender.Get('filename')) if DIR == "":
print 'Multifiles Import from %s' %DIR DIR = sys.dirname(Blender.Get('filename'))
EXT = '.dxf'
else:
EXT = DIR[-4:] # get last 4 characters '.dxf'
DIR = DIR[:-5] # cut last 5 characters '*.dxf'
print 'importing multiple %s files from %s' %(EXT,DIR)
files = \ files = \
[sys.join(DIR, f) for f in os.listdir(DIR) if f.lower().endswith('.dxf')] [sys.join(DIR, f) for f in os.listdir(DIR) if f.lower().endswith(EXT)]
if not files: if not files:
print '...None DXF-files found. Abort!' print '...None %s-files found. Abort!' %EXT
return return
i = 0 i = 0
for dxfFile in files: for dxfFile in files:
i += 1 i += 1
print '\nDXF-file', i, 'of', len(files) #,'\nImporting', dxfFile print '\n%s-file' %EXT, i, 'of', len(files) #,'\nImporting', dxfFile
if GUI_A['newScene_on'].val: if GUI_A['newScene_on'].val:
_dxf_file = dxfFile.split('/')[-1].split('\\')[-1] _dxf_file = dxfFile.split('/')[-1].split('\\')[-1]
_dxf_file = _dxf_file[:-4] # cut last char:'.dxf' _dxf_file = _dxf_file[:-4] # cut last char:'.dxf'
@ -6072,13 +6149,11 @@ def multi_import(DIR):
main(dxfFile) main(dxfFile)
#Blender.Redraw() #Blender.Redraw()
print 'TOTAL TIME: %.6f' % (Blender.sys.time() - batchTIME) print 'TOTAL TIME: %.6f' % (sys.time() - batchTIME)
print '\a\r', # beep when done print '\a\r', # beep when done
Draw.PupMenu('DXF importer: Done!|finished in %.4f sec.' % (sys.time() - batchTIME))
UI_MODE = True
if __name__ == "__main__": if __name__ == "__main__":
UI_MODE = True UI_MODE = True
# recall last used DXF-file and INI-file names # recall last used DXF-file and INI-file names
@ -6086,7 +6161,7 @@ if __name__ == "__main__":
#print 'deb:start dxffilename:', dxffilename #---------------- #print 'deb:start dxffilename:', dxffilename #----------------
if dxffilename: dxfFileName.val = dxffilename if dxffilename: dxfFileName.val = dxffilename
else: else:
dirname = Blender.sys.dirname(Blender.Get('filename')) dirname = sys.dirname(Blender.Get('filename'))
#print 'deb:start dirname:', dirname #---------------- #print 'deb:start dirname:', dirname #----------------
dxfFileName.val = sys.join(dirname, '') dxfFileName.val = sys.join(dirname, '')
inifilename = check_RegistryKey('iniFileName') inifilename = check_RegistryKey('iniFileName')
@ -6099,7 +6174,7 @@ if __name__ == "__main__":
if 1: if 1:
# DEBUG ONLY # DEBUG ONLY
UI_MODE = False UI_MODE = False
TIME= Blender.sys.time() TIME= sys.time()
#DIR = '/dxf_r12_testfiles/' #DIR = '/dxf_r12_testfiles/'
DIR = '/metavr/' DIR = '/metavr/'
import os import os
@ -6128,5 +6203,5 @@ if 1:
dxfFileName.val = _dxf dxfFileName.val = _dxf
main(_dxf) main(_dxf)
print 'TOTAL TIME: %.6f' % (Blender.sys.time() - TIME) print 'TOTAL TIME: %.6f' % (sys.time() - TIME)
""" """