[Bf-extensions-cvs] [c6af879] master: related to the latest file in T48806 I found a small bug, which is fixed now. Also dxfgrabber seemed to be incomplete in the last commit.
Lukas Treyer
noreply at git.blender.org
Sat Aug 20 15:11:39 CEST 2016
Commit: c6af87952d78261c7bc87f730f1ad395145a0610
Author: Lukas Treyer
Date: Thu Aug 18 00:13:05 2016 +0200
Branches: master
https://developer.blender.org/rBAc6af87952d78261c7bc87f730f1ad395145a0610
related to the latest file in T48806 I found a small bug, which is fixed now. Also dxfgrabber seemed to be incomplete in the last commit.
===================================================================
A io_import_dxf/dxfgrabber/dxfentities.py
A io_import_dxf/dxfgrabber/dxfobjects.py
M io_import_dxf/dxfimport/is_.py
===================================================================
diff --git a/io_import_dxf/dxfgrabber/dxfentities.py b/io_import_dxf/dxfgrabber/dxfentities.py
new file mode 100644
index 0000000..5c83a88
--- /dev/null
+++ b/io_import_dxf/dxfgrabber/dxfentities.py
@@ -0,0 +1,1264 @@
+# encoding: utf-8
+# Purpose: entity classes, new implementation without dxf12/dxf13 layer
+# Created: 17.04.2016
+# Copyright (C) 2016, Manfred Moitzi
+# License: MIT License
+from __future__ import unicode_literals
+__author__ = "mozman <mozman at gmx.at>"
+
+import math
+
+from . import const
+from .color import TrueColor
+from .styles import default_text_style
+from .decode import decode
+
+SPECIAL_CHARS = {
+ 'd': '°'
+}
+
+
+basic_attribs = {
+ 5: 'handle',
+ 6: 'linetype',
+ 8: 'layer',
+ 39: 'thickness',
+ 48: 'ltscale',
+ 62: 'color',
+ 67: 'paperspace',
+ 210: 'extrusion',
+ 284: 'shadow_mode',
+ 330: 'owner',
+ 370: 'line_weight',
+ 410: 'layout_tab_name',
+}
+
+
+class DXFEntity(object):
+ def __init__(self):
+ self.dxftype = 'ENTITY'
+ self.handle = None
+ self.owner = None
+ self.paperspace = None
+ self.layer = '0'
+ self.linetype = None
+ self.thickness = 0.0
+ self.extrusion = None
+ self.ltscale = 1.0
+ self.line_weight = 0
+ self.invisible = 0
+ self.color = const.BYLAYER
+ self.true_color = None
+ self.transparency = None
+ self.shadow_mode = None
+ self.layout_tab_name = None
+
+ def setup_attributes(self, tags):
+ self.dxftype = tags.get_type()
+ for code, value in tags.plain_tags():
+ if code in basic_attribs:
+ self.__setattr__(basic_attribs[code], value)
+ elif code == 420:
+ self.true_color = TrueColor(value)
+ elif code == 440:
+ self.transparency = 1. - float(value & 0xFF) / 255.
+ else:
+ yield code, value # chain of generators
+
+ def set_default_extrusion(self): # call only for 2d entities with extrusion vector
+ if self.extrusion is None:
+ self.extrusion = (0., 0., 1.)
+
+ def __str__(self):
+ return "{} [{}]".format(self.dxftype, self.handle)
+
+
+class Point(DXFEntity):
+ def __init__(self):
+ super(Point, self).__init__()
+ self.point = (0, 0, 0)
+
+ def setup_attributes(self, tags):
+ for code, value in super(Point, self).setup_attributes(tags):
+ if code == 10:
+ self.point = value
+ else:
+ yield code, value # chain of generators
+ self.set_default_extrusion()
+
+
+class Line(DXFEntity):
+ def __init__(self):
+ super(Line, self).__init__()
+ self.start = (0, 0, 0)
+ self.end = (0, 0, 0)
+
+ def setup_attributes(self, tags):
+ for code, value in super(Line, self).setup_attributes(tags):
+ if code == 10:
+ self.start = value
+ elif code == 11:
+ self.end = value
+ else:
+ yield code, value # chain of generators
+
+
+class Circle(DXFEntity):
+ def __init__(self):
+ super(Circle, self).__init__()
+ self.center = (0, 0, 0)
+ self.radius = 1.0
+
+ def setup_attributes(self, tags):
+ for code, value in super(Circle, self).setup_attributes(tags):
+ if code == 10:
+ self.center = value
+ elif code == 40:
+ self.radius = value
+ else:
+ yield code, value # chain of generators
+ self.set_default_extrusion()
+
+
+class Arc(Circle):
+ def __init__(self):
+ super(Arc, self).__init__()
+ self.start_angle = 0.
+ self.end_angle = 360.
+
+ def setup_attributes(self, tags):
+ for code, value in super(Arc, self).setup_attributes(tags):
+ if code == 50:
+ self.start_angle = value
+ elif code == 51:
+ self.end_angle = value
+ else:
+ yield code, value # chain of generators
+ self.set_default_extrusion()
+
+TRACE_CODES = frozenset((10, 11, 12, 13))
+
+
+class Trace(DXFEntity):
+ def __init__(self):
+ super(Trace, self).__init__()
+ self.points = []
+
+ def setup_attributes(self, tags):
+ for code, value in super(Trace, self).setup_attributes(tags):
+ if code in TRACE_CODES:
+ self.points.append(value)
+ else:
+ yield code, value # chain of generators
+ self.set_default_extrusion()
+
+
+Solid = Trace
+
+
+class Face(Trace):
+ def __init__(self):
+ super(Face, self).__init__()
+ self.points = []
+ self.invisible_edge = 0
+
+ def setup_attributes(self, tags):
+ for code, value in super(Face, self).setup_attributes(tags):
+ if code == 70:
+ self.invisible_edge = value
+ else:
+ yield code, value # chain of generators
+ self.set_default_extrusion()
+
+ def is_edge_invisible(self, edge):
+ # edges 0 .. 3
+ return bool(self.invisible_edge & (1 << edge))
+
+
+class Text(DXFEntity):
+ def __init__(self):
+ super(Text, self).__init__()
+ self.insert = (0., 0.)
+ self.height = 1.0
+ self.text = ""
+ self.rotation = 0.
+ self.oblique = 0.
+ self.style = "STANDARD"
+ self.width = 1.
+ self.is_backwards = False
+ self.is_upside_down = False
+ self.halign = 0
+ self.valign = 0
+ self.align_point = None
+ self.font = ""
+ self.big_font = ""
+
+ def setup_attributes(self, tags):
+ for code, value in super(Text, self).setup_attributes(tags):
+ if code == 10:
+ self.insert = value
+ elif code == 11:
+ self.align_point = value
+ elif code == 1:
+ self.text = value
+ elif code == 7:
+ self.style = value
+ elif code == 40:
+ self.height = value
+ elif code == 41:
+ self.width = value
+ elif code == 50:
+ self.rotation = value
+ elif code == 51:
+ self.oblique = value
+ elif code == 71:
+ self.is_backwards = bool(value & 2)
+ self.is_upside_down = bool(value & 4)
+ elif code == 72:
+ self.halign = value
+ elif code == 73:
+ self.valign = value
+ else:
+ yield code, value # chain of generators
+ self.set_default_extrusion()
+
+ def resolve_text_style(self, text_styles):
+ style = text_styles.get(self.style, None)
+ if style is None:
+ style = default_text_style
+ if self.height == 0:
+ self.height = style.height
+ if self.width == 0:
+ self.width = style.width
+ if self.oblique is None:
+ self.oblique = style.oblique
+ if self.is_backwards is None:
+ self.is_backwards = style.is_backwards
+ if self.is_upside_down is None:
+ self.is_upside_down = style.is_upside_down
+ if self.font is None:
+ self.font = style.font
+ if self.big_font is None:
+ self.big_font = style.big_font
+
+ def plain_text(self):
+ chars = []
+ raw_chars = list(reversed(self.text)) # text splitted into chars, in reversed order for efficient pop()
+ while len(raw_chars):
+ char = raw_chars.pop()
+ if char == '%': # formatting codes and special characters
+ if len(raw_chars) and raw_chars[-1] == '%':
+ raw_chars.pop() # '%'
+ if len(raw_chars):
+ special_char = raw_chars.pop() # command char
+ chars.append(SPECIAL_CHARS.get(special_char, ""))
+ else: # char is just a single '%'
+ chars.append(char)
+ else: # char is what it is, a character
+ chars.append(char)
+ return "".join(chars)
+
+
+class Attrib(Text):
+ def __init__(self):
+ super(Attrib, self).__init__()
+ self.field_length = 0
+ self.tag = ""
+
+ def setup_attributes(self, tags):
+ for code, value in super(Attrib, self).setup_attributes(tags):
+ if code == 2:
+ self.tag = value
+ elif code == 73:
+ self.field_length = value
+ else:
+ yield code, value
+
+
+class Insert(DXFEntity):
+ def __init__(self):
+ super(Insert, self).__init__()
+ self.name = ""
+ self.insert = (0., 0., 0.)
+ self.rotation = 0.
+ self.scale = (1., 1., 1.)
+ self.row_count = 1
+ self.row_spacing = 0.
+ self.col_count = 1
+ self.col_spacing = 0.
+ self.attribsfollow = False
+ self.attribs = []
+
+ def setup_attributes(self, tags):
+ xscale = 1.
+ yscale = 1.
+ zscale = 1.
+ for code, value in super(Insert, self).setup_attributes(tags):
+ if code == 2:
+ self.name = value
+ elif code == 10:
+ self.insert = value
+ elif code == 41:
+ xscale = value
+ elif code == 42:
+ yscale = value
+ elif code == 43:
+ zscale = value
+ elif code == 44:
+ self.col_spacing = value
+ elif code == 45:
+ self.row_spacing = value
+ elif code == 50:
+ self.rotation = value
+ elif code == 66:
+ self.attribsfollow = bool(value)
+ elif code == 70:
+ self.col_count = value
+ elif code == 71:
+ self.row_count = value
+ else:
+ yield code, value # chain of generators
+ self.scale = (xscale, yscale, zscale)
+ self.set_default_extrusion()
+
+ def find_attrib(self, attrib_tag):
+ for attri
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-extensions-cvs
mailing list