[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