From 330efd46fa4f2d3d5d70ebcd44d85c2c661dbbe2 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 5 Jan 2007 03:49:54 +0000 Subject: [PATCH] standard set of minor improvements, tho this is a good script and not much to change. faster dict/list operations. use layer flags ratehr then lists. --- .../scripts/bpymodules/dxfImportObjects.py | 58 +++++++-------- release/scripts/bpymodules/dxfReader.py | 15 ++-- release/scripts/import_dxf.py | 72 ++++++++++++++----- 3 files changed, 93 insertions(+), 52 deletions(-) diff --git a/release/scripts/bpymodules/dxfImportObjects.py b/release/scripts/bpymodules/dxfImportObjects.py index b78e91e8428..960c4c1ac15 100644 --- a/release/scripts/bpymodules/dxfImportObjects.py +++ b/release/scripts/bpymodules/dxfImportObjects.py @@ -162,8 +162,9 @@ class Line: else: self.color_index = BYLAYER - discard, self.layer = get_layer(obj.data) - obj.data.remove(discard) + discard, self.layer, discard_index = get_layer(obj.data) + del obj.data[discard_index] + self.points = self.get_points(obj.data) @@ -238,8 +239,8 @@ class LWpolyline: self.flags = 0 self.closed = self.flags&1 # byte coded, 1 = closed, 128 = plinegen - discard, self.layer = get_layer(obj.data) - obj.data.remove(discard) + discard, self.layer, discard_index = get_layer(obj.data) + del obj.data[discard_index] self.points = self.get_points(obj.data) self.extrusion = self.get_extrusion(obj.data) @@ -341,8 +342,8 @@ class Polyline: self.closed = self.flags&1 # byte coded, 1 = closed, 128 = plinegen - discard, self.layer = get_layer(obj.data) - obj.data.remove(discard) + discard, self.layer, discard_index = get_layer(obj.data) + del obj.data[discard_index] self.extrusion = self.get_extrusion(obj.data) @@ -531,8 +532,8 @@ class Text: else: self.valignment = self.valignment[0] - discard, self.layer = get_layer(obj.data) - obj.data.remove(discard) + discard, self.layer, discard_index = get_layer(obj.data) + del obj.data[discard_index] self.loc = self.get_loc(obj.data, self.halignment, self.valignment) self.extrusion = self.get_extrusion(obj.data) @@ -638,8 +639,8 @@ class Mtext: else: self.line_space = self.line_space[0] - discard, self.layer = get_layer(obj.data) - obj.data.remove(discard) + discard, self.layer, discard_index = get_layer(obj.data) + del obj.data[discard_index] self.loc = self.get_loc(obj.data) self.extrusion = self.get_extrusion(obj.data) @@ -730,8 +731,8 @@ class Circle: else: self.color_index = BYLAYER - discard, self.layer = get_layer(obj.data) - obj.data.remove(discard) + discard, self.layer, discard_index = get_layer(obj.data) + del obj.data[discard_index] self.loc = self.get_loc(obj.data) self.extrusion = self.get_extrusion(obj.data) @@ -805,8 +806,8 @@ class Arc: else: self.color_index = BYLAYER - discard, self.layer = get_layer(obj.data) - obj.data.remove(discard) + discard, self.layer, discard_index = get_layer(obj.data) + del obj.data[discard_index] self.loc = self.get_loc(obj.data) self.extrusion = self.get_extrusion(obj.data) @@ -923,8 +924,8 @@ class Block: else: self.discription = '' - discard, self.layer = get_layer(obj.data) - obj.data.remove(discard) + discard, self.layer, discard_index = get_layer(obj.data) + del obj.data[discard_index] self.loc = self.get_loc(obj.data) @@ -984,9 +985,9 @@ class Insert: self.color_index = self.color_index[0] else: self.color_index = BYLAYER - - discard, self.layer = get_layer(obj.data) - obj.data.remove(discard) + + discard, self.layer, discard_index = get_layer(obj.data) + del obj.data[discard_index] self.loc = self.get_loc(obj.data) self.scale = self.get_scale(obj.data) self.rows, self.columns = self.get_array(obj.data) @@ -1097,8 +1098,8 @@ class Ellipse: else: self.color_index = BYLAYER - discard, self.layer = get_layer(obj.data) - obj.data.remove(discard) + discard, self.layer, discard_index = get_layer(obj.data) + del obj.data[discard_index] self.loc = self.get_loc(obj.data) self.major = self.get_major(obj.data) self.extrusion = self.get_extrusion(obj.data) @@ -1185,8 +1186,8 @@ class Face: else: self.color_index = BYLAYER - discard, self.layer = get_layer(obj.data) - obj.data.remove(discard) + discard, self.layer, discard_index = get_layer(obj.data) + del obj.data[discard_index] self.points = self.get_points(obj.data) @@ -1242,7 +1243,6 @@ class Face: return "%s: layer - %s, points - %s" %(self.__class__.__name__, self.layer, self.points) - def get_name(data): """Get the name of an object from its object data. @@ -1251,23 +1251,23 @@ def get_name(data): name not None before using the returned values! """ value = None - for item in data: + for i, item in enumerate(data): if item[0] == 2: value = item[1] break - return item, value + return item, value, i def get_layer(data): """Expects object data as input. - Returns (entry, layer_name) where entry is the data item that provided the layer name. + Returns (entry, layer_name, entry_index) where entry is the data item that provided the layer name. """ value = None - for item in data: + for i, item in enumerate(data): if item[0] == 8: value = item[1] break - return item, value + return item, value, i # type to object map diff --git a/release/scripts/bpymodules/dxfReader.py b/release/scripts/bpymodules/dxfReader.py index 8d122173b82..f0635e00613 100644 --- a/release/scripts/bpymodules/dxfReader.py +++ b/release/scripts/bpymodules/dxfReader.py @@ -26,6 +26,9 @@ # ***** END GPL LICENCE BLOCK ***** # -------------------------------------------------------------------------- +# development +#import dxfImportObjects +#reload(dxfImportObjects) from dxfImportObjects import * @@ -141,9 +144,9 @@ def handleObject(infile): def handleTable(table, infile): """Special handler for dealing with nested table objects.""" - item, name = get_name(table.data) + item, name, item_index = get_name(table.data) if name: # We should always find a name - table.data.remove(item) + del table.data[item_index] table.name = name.lower() # This next bit is from handleObject # handleObject should be generalized to work with any section like object @@ -162,9 +165,9 @@ def handleTable(table, infile): def handleBlock(block, infile): """Special handler for dealing with nested table objects.""" - item, name = get_name(block.data) + item, name, item_index = get_name(block.data) if name: # We should always find a name - block.data.remove(item) + del block.data[item_index] block.name = name.lower() # This next bit is from handleObject # handleObject should be generalized to work with any section like object @@ -302,9 +305,9 @@ def readDXF(filename): if drawing: drawing.name = filename for obj in drawing.data: - item, name = get_name(obj.data) + item, name, item_index = get_name(obj.data) if name: - obj.data.remove(item) + del obj.data[item_index] obj.name = name.lower() setattr(drawing, name.lower(), obj) # Call the objectify function from dxfImportObjects to cast diff --git a/release/scripts/import_dxf.py b/release/scripts/import_dxf.py index 15bee5b3905..535d762ffaa 100644 --- a/release/scripts/import_dxf.py +++ b/release/scripts/import_dxf.py @@ -78,10 +78,17 @@ except ImportError: import sys curdir = Sys.dirname(Blender.Get('filename')) sys.path.append(curdir) + +# development +#import dxfReader +#reload(dxfReader) + from dxfReader import readDXF from dxfColorMap import color_map from math import * + + try: import os if os.name:# != 'mac': @@ -137,7 +144,7 @@ class MatColors: self.map[color] = layer color = 0 color = abs(color) - if color not in self.colors.keys(): + if color not in self.colors: # .keys() self.add(color) return self.colors[color] @@ -179,7 +186,7 @@ class Blocks: """ if not name: return self.blocks - if name not in self.blocks.keys(): + if name not in self.blocks: # .keys(): self.add(name) return self.blocks[name] @@ -223,17 +230,17 @@ class Settings: # The header section may be omited if self.optimization <= self.MID: - if 'header' in sections.keys(): + if 'header' in sections: #.keys(): print "Found header!" else: print "File contains no header!" # The tables section may be partialy or completely missing. - if 'tables' in sections.keys(): + if 'tables' in sections: # .keys(): if self.optimization <= self.MID: print "Found tables!" tables = dict([(item.name, item) for item in sections["tables"].data]) - if 'layer' in tables.keys(): + if 'layer' in tables: # .keys(): if self.optimization <= self.MID: print "Found layers!" # Read the layers table and get the layer colors @@ -251,7 +258,7 @@ class Settings: self.colors = MatColors({}) # The blocks section may be omited - if 'blocks' in sections.keys(): + if 'blocks' in sections: #.keys(): if self.optimization <= self.MID: print "Found blocks!" # Read the block definitions and build our block object @@ -347,11 +354,11 @@ class Drawer: # Set the visability if settings.isOff(entity.layer): - ob.layers = [20] + ob.Layers = 1<<19 # [20] elif block_def: - ob.layers = [19] + ob.Layers = (1<<18) # [19] else: - ob.layers = [i+1 for i in range(20)] + ob.Layers = (1<<20)-1 # [i+1 for i in xrange(20)] # all layers # # Set the visability # if settings.isOff(entity.layer) or block_def: @@ -500,7 +507,7 @@ def drawDrawing(drawing): drawEntities(drawing.entities, settings) # Set the visable layers - SCENE.setLayers([i+1 for i in range(18)]) + SCENE.setLayers([i+1 for i in xrange(18)]) # SCENE.Layers = 262143 or (1<<18) Blender.Redraw(-1) if settings.optimization <= settings.MID: print "Done!" @@ -509,7 +516,7 @@ def drawEntities(entities, settings, group=None): If provided 'group' is the Blender group new entities are to be added to. """ - for _type, drawer in type_map.items(): + for _type, drawer in type_map.iteritems(): # for each known type get a list of that type and call the associated draw function drawer(entities.get_type(_type), settings, group) @@ -539,7 +546,7 @@ def drawLWpolyline(pline, curves=False): """Do all the specific things needed to import plines into Blender.""" # Generate the geometery points = [] - for i in range(len(pline.points)): + for i in xrange(len(pline.points)): point = pline.points[i] if not point.bulge: points.append(point.loc) @@ -552,7 +559,7 @@ def drawLWpolyline(pline, curves=False): if point.bulge >= 0: verts.reverse() points.extend(verts) - edges = [[num, num+1] for num in range(len(points)-1)] + edges = [[num, num+1] for num in xrange(len(points)-1)] if pline.closed: edges.append([len(pline.points)-1, 0]) @@ -575,7 +582,7 @@ def drawPolyline(pline, curves=False): """Do all the specific things needed to import plines into Blender.""" # Generate the geometery points = [] - for i in range(len(pline.points)): + for i in xrange(len(pline.points)): point = pline.points[i] if not point.bulge: points.append(point.loc) @@ -588,7 +595,7 @@ def drawPolyline(pline, curves=False): if point.bulge >= 0: verts.reverse() points.extend(verts) - edges = [[num, num+1] for num in range(len(points)-1)] + edges = [[num, num+1] for num in xrange(len(points)-1)] if pline.closed: edges.append([len(pline.points)-1, 0]) @@ -817,14 +824,14 @@ def drawArc(center, radius, start, end, step=0.5): stepmatrix = Mathutils.RotationMatrix(step, 3, "Z") point = Mathutils.Vector(startpoint) - for i in range(int(pieces)): + for i in xrange(int(pieces)): point = stepmatrix * point points.append(point) points.append(endpoint) if center: points = [[point[0]+center[0], point[1]+center[1], point[2]+center[2]] for point in points] - edges = [[num, num+1] for num in range(len(points)-1)] + edges = [[num, num+1] for num in xrange(len(points)-1)] return points, edges drawEllipses = Drawer() @@ -1003,3 +1010,34 @@ type_map = { if __name__ == "__main__": Window.FileSelector(main, 'Import a DXF file', '*.dxf') + + +""" +# For testing compatibility +if 1: + # DEBUG ONLY + TIME= Blender.sys.time() + import os + print 'Searching for files' + os.system('find /metavr/ -iname "*.dxf" > /tmp/tempdxf_list') + print '...Done' + file= open('/tmp/tempdxf_list', 'r') + lines= file.readlines() + file.close() + + def between(v,a,b): + if v <= max(a,b) and v >= min(a,b): + return True + return False + + for i, _file in enumerate(lines): + if between(i, 50,60): + _file= _file[:-1] + print 'Importing', _file, '\nNUMBER', i, 'of', len(lines) + _file_name= _file.split('/')[-1].split('\\')[-1] + newScn= Scene.New(_file_name) + newScn.makeCurrent() + main(_file) + + print 'TOTAL TIME: %.6f' % (Blender.sys.time() - TIME) +""" \ No newline at end of file