= dxf update =

update by the script author - may have killed some changes cambo did to the previous version but the layout of the script is too significantly different to merge them.
This commit is contained in:
Tom Musgrove 2007-01-10 11:37:19 +00:00
parent 3625d23afa
commit 20413f17bb
2 changed files with 1837 additions and 560 deletions

@ -5,7 +5,7 @@
""" """
# -------------------------------------------------------------------------- # --------------------------------------------------------------------------
# DXF Reader v0.8 by Ed Blake (AKA Kitsu) # DXF Reader v0.9 by Ed Blake (AKA Kitsu)
# -------------------------------------------------------------------------- # --------------------------------------------------------------------------
# ***** BEGIN GPL LICENSE BLOCK ***** # ***** BEGIN GPL LICENSE BLOCK *****
# #
@ -26,11 +26,40 @@
# ***** END GPL LICENCE BLOCK ***** # ***** END GPL LICENCE BLOCK *****
# -------------------------------------------------------------------------- # --------------------------------------------------------------------------
# development
#import dxfImportObjects
#reload(dxfImportObjects)
from dxfImportObjects import * #from dxfImportObjects import *
class Object:
"""Empty container class for dxf objects"""
def __init__(self, _type='', block=False):
"""_type expects a string value."""
self.type = _type
self.name = ''
self.data = []
def __str__(self):
if self.name:
return self.name
else:
return self.type
def __repr__(self):
return str(self.data)
def get_type(self, kind=''):
"""Despite the name, this method actually returns all objects of type 'kind' from self.data."""
if type:
objects = []
for item in self.data:
if type(item) != list and item.type == kind:
# we want this type of object
objects.append(item)
elif type(item) == list and item[0] == kind:
# we want this type of data
objects.append(item[1])
return objects
class InitializationError(Exception): pass class InitializationError(Exception): pass
@ -72,6 +101,33 @@ class StateMachine:
else: else:
handler = newState handler = newState
def get_name(data):
"""Get the name of an object from its object data.
Returns a pair of (data_item, name) where data_item is the list entry where the name was found
(the data_item can be used to remove the entry from the object data). Be sure to check
name not None before using the returned values!
"""
value = None
for item in data:
if item[0] == 2:
value = item[1]
break
return item, value
def get_layer(data):
"""Expects object data as input.
Returns (entry, layer_name) where entry is the data item that provided the layer name.
"""
value = None
for item in data:
if item[0] == 8:
value = item[1]
break
return item, value
def convert(code, value): def convert(code, value):
"""Convert a string to the correct Python type based on its dxf code. """Convert a string to the correct Python type based on its dxf code.
code types: code types:
@ -144,9 +200,9 @@ def handleObject(infile):
def handleTable(table, infile): def handleTable(table, infile):
"""Special handler for dealing with nested table objects.""" """Special handler for dealing with nested table objects."""
item, name, item_index = get_name(table.data) item, name = get_name(table.data)
if name: # We should always find a name if name: # We should always find a name
del table.data[item_index] table.data.remove(item)
table.name = name.lower() table.name = name.lower()
# This next bit is from handleObject # This next bit is from handleObject
# handleObject should be generalized to work with any section like object # handleObject should be generalized to work with any section like object
@ -165,10 +221,10 @@ def handleTable(table, infile):
def handleBlock(block, infile): def handleBlock(block, infile):
"""Special handler for dealing with nested table objects.""" """Special handler for dealing with nested table objects."""
item, name, item_index = get_name(block.data) item, name = get_name(block.data)
if name: # We should always find a name if name: # We should always find a name
del block.data[item_index] block.data.remove(item)
block.name = name.lower() block.name = name
# This next bit is from handleObject # This next bit is from handleObject
# handleObject should be generalized to work with any section like object # handleObject should be generalized to work with any section like object
while 1: while 1:
@ -271,7 +327,7 @@ def error(cargo):
print err print err
return False return False
def readDXF(filename): def readDXF(filename, objectify):
"""Given a file name try to read it as a dxf file. """Given a file name try to read it as a dxf file.
Output is an object with the following structure Output is an object with the following structure
@ -305,12 +361,12 @@ def readDXF(filename):
if drawing: if drawing:
drawing.name = filename drawing.name = filename
for obj in drawing.data: for obj in drawing.data:
item, name, item_index = get_name(obj.data) item, name = get_name(obj.data)
if name: if name:
del obj.data[item_index] obj.data.remove(item)
obj.name = name.lower() obj.name = name.lower()
setattr(drawing, name.lower(), obj) setattr(drawing, name.lower(), obj)
# Call the objectify function from dxfImportObjects to cast # Call the objectify function to cast
# raw objects into the right types of object # raw objects into the right types of object
obj.data = objectify(obj.data) obj.data = objectify(obj.data)
#print obj.name #print obj.name

File diff suppressed because it is too large Load Diff