def test_if_fast_load_handles_callback_group_codes(cls, subclass):
    data = Tags([
        DXFTag(0, "ENTITY"),  # First subclass tag should be ignored
        DXFTag(3, "X"),  # callback value
        DXFTag(3, "Y"),  # none callback value
    ])
    ns, unprocessed_tags = load_tags_fast(cls, subclass, data)
    assert ns.none_callback == "Y"
    assert ns.hasattr("callback") is False
Example #2
0
def test_append_xdata(xtags2):
    xdata = xtags2.get_xdata('MOZMAN')
    assert 4 == len(xdata)

    xdata.append(DXFTag(1000, "Extended Data String"))
    xdata = xtags2.get_xdata('MOZMAN')
    assert 5 == len(xdata)

    assert DXFTag(1000, "Extended Data String") == xdata[4]
Example #3
0
    def test_append_to_existing_reactors(self):
        self.tags.new_app_data(ACAD_REACTORS, [DXFTag(330, 'DEAD')])
        reactors = self.tags.get_app_data_content(ACAD_REACTORS)
        reactors.append(DXFTag(330, 'DEAD2'))
        self.tags.set_app_data_content(ACAD_REACTORS, reactors)

        reactors = self.tags.get_app_data_content(ACAD_REACTORS)
        self.assertEqual(DXFTag(330, 'DEAD'), reactors[0])
        self.assertEqual(DXFTag(330, 'DEAD2'), reactors[1])
def test_append_to_existing_reactors(xtags4):
    xtags4.new_app_data(ACAD_REACTORS, [DXFTag(330, 'DEAD')])
    reactors = xtags4.get_app_data_content(ACAD_REACTORS)
    reactors.append(DXFTag(330, 'DEAD2'))
    xtags4.set_app_data_content(ACAD_REACTORS, reactors)

    reactors = xtags4.get_app_data_content(ACAD_REACTORS)
    assert DXFTag(330, 'DEAD') == reactors[0]
    assert DXFTag(330, 'DEAD2') == reactors[1]
Example #5
0
    def test_append_xdata(self):
        xdata = self.tags.get_xdata('MOZMAN')
        self.assertEqual(4, len(xdata))

        xdata.append(DXFTag(1000, "Extended Data String"))
        xdata = self.tags.get_xdata('MOZMAN')
        self.assertEqual(5, len(xdata))

        self.assertEqual(DXFTag(1000, "Extended Data String"), xdata[4])
Example #6
0
 def set_text(self, text):
     tags = self.tags.get_subclass('AcDbMText')
     tags.remove_tags(codes=(1, 3))
     str_chunks = split_string_in_chunks(text, size=250)
     if len(str_chunks) == 0:
         str_chunks.append("")
     while len(str_chunks) > 1:
         tags.append(DXFTag(3, str_chunks.pop(0)))
     tags.append(DXFTag(1, str_chunks[0]))
     return self
Example #7
0
    def _setup_table(self, name):
        """
        Setup new empty table.

        Args:
            name: real table name like 'VPORT' for viewports

        """
        name = self.key(name)
        if self._drawing is not None:
            dxfversion = self._drawing.dxfversion
            handle = self._drawing.entitydb.get_unique_handle()
        else:  # test environment without Drawing() object
            dxfversion = 'AC1009'  # DXF R12
            handle = '0'

        if dxfversion <= 'AC1009':
            table_entities = [[
                DXFTag(0, 'TABLE'),
                DXFTag(2, name),
                DXFTag(70, 0)
            ]]
        else:
            table_entities = [[
                DXFTag(0, 'TABLE'),
                DXFTag(2, name),
                DXFTag(5, handle),
                DXFTag(330, '0'),
                DXFTag(100, 'AcDbSymbolTable'),
                DXFTag(70, 0)
            ]]
        self._new_table(name, table_entities)
Example #8
0
def test_recover_acdb_entity_tags_does_not_replace_existing_attribs():
    entity = DXFGraphic()
    entity.dxf.color = 7
    entity.dxf.layer = 'HasLayer'
    entity.dxf.linetype = 'HasLinetype'
    tags = Tags([DXFTag(62, 1), DXFTag(8, 'Layer'), DXFTag(6, 'Linetype')])

    recover_graphic_attributes(tags, entity.dxf)
    assert entity.dxf.color == 7
    assert entity.dxf.layer == 'HasLayer'
    assert entity.dxf.linetype == 'HasLinetype'
Example #9
0
def test_recover_acdb_entity_tags_does_not_replace_existing_attribs():
    entity = DXFGraphic()
    entity.dxf.color = 7
    entity.dxf.layer = "HasLayer"
    entity.dxf.linetype = "HasLinetype"
    tags = Tags([DXFTag(62, 1), DXFTag(8, "Layer"), DXFTag(6, "Linetype")])

    recover_graphic_attributes(tags, entity.dxf)
    assert entity.dxf.color == 7
    assert entity.dxf.layer == "HasLayer"
    assert entity.dxf.linetype == "HasLinetype"
Example #10
0
def textlines2tags(lines: Iterable[str]) -> Iterable[DXFTag]:
    """ Yields text lines as DXFTags, splitting long lines (>255) int code 1 and code 3 tags.
    """
    for line in lines:
        text = line[:255]
        tail = line[255:]
        yield DXFTag(1, text)
        while len(tail):
            text = tail[:255]
            tail = tail[255:]
            yield DXFTag(3, text)
Example #11
0
def test_if_fast_load_handles_unprocessed_duplicate_group_codes(cls, subclass):
    data = Tags([
        DXFTag(0, 'ENTITY'),  # First subclass tag should be ignored
        DXFTag(1, '1'),  # duplicate group code
        DXFTag(1, '3'),  # duplicate group code
        DXFTag(1, '5'),  # duplicate group code, but without an attribute definition
    ])
    ns, unprocessed_tags = load_tags_fast(cls, subclass, data)
    assert ns.test1 == '1'
    assert ns.test3 == '3'
    # only two group code 1 attributes are defined:
    assert len(unprocessed_tags) == 1
    assert unprocessed_tags[0] == (1, '5')
def test_if_fast_load_handles_duplicate_group_codes(cls, subclass):
    data = Tags([
        DXFTag(0, "ENTITY"),  # First subclass tag should be ignored
        DXFTag(1, "1"),  # duplicate group code
        DXFTag(2, "2"),
        DXFTag(1, "3"),  # duplicate group code
        DXFTag(7, "unprocessed tag"),
    ])
    ns, unprocessed_tags = load_tags_fast(cls, subclass, data)
    assert ns.test1 == "1"
    assert ns.test2 == "2"
    assert ns.test3 == "3"
    assert len(unprocessed_tags) == 1
    assert unprocessed_tags[0] == (7, "unprocessed tag")
Example #13
0
def compile_complex_defnition(tokens: Sequence) -> ComplexLineTypePart:
    part = ComplexLineTypePart(tokens[0], tokens[1], tokens[2])
    commands = list(reversed(tokens[3:]))
    params = {}
    while len(commands):
        cmd = commands.pop()
        value = commands.pop()
        code = CMD_CODES.get(cmd, 0)
        params[code] = DXFTag(code, value)

    for code in (46, 50, 44, 45):
        tag = params.get(code, DXFTag(code, 0.))
        part.tags.append(tag)
    return part
Example #14
0
def test_if_fast_load_handles_duplicate_group_codes(cls, subclass):
    data = Tags([
        DXFTag(0, 'ENTITY'),  # First subclass tag should be ignored
        DXFTag(1, '1'),  # duplicate group code
        DXFTag(2, '2'),
        DXFTag(1, '3'),  # duplicate group code
        DXFTag(7, 'unprocessed tag'),
    ])
    ns, unprocessed_tags = load_tags_fast(cls, subclass, data)
    assert ns.test1 == '1'
    assert ns.test2 == '2'
    assert ns.test3 == '3'
    assert len(unprocessed_tags) == 1
    assert unprocessed_tags[0] == (7, 'unprocessed tag')
 def index(self):
     data = {
         "ENTITIES": [
             Tags([DXFTag(0, "ENTITY1"),
                   DXFTag(5, "F001")]),
             Tags([DXFTag(0, "ENTITY2"),
                   DXFTag(5, "F002")]),
             Tags([DXFTag(0, "ENTITY3"),
                   DXFTag(5, "F003")]),
             Tags([DXFTag(0, "ENTITY4"),
                   DXFTag(5, "F004")]),
             # last entity without handle, has dummy handle "*1"
             Tags([DXFTag(0, "ENTITY5"),
                   DXFTag(1, "DATA")]),
         ]
     }
     return EntityIndex(data)
Example #16
0
    def add_tags(self, tags: ExtendedTags) -> str:
        try:
            handle = tags.get_handle()
        except DXFValueError:  # create new handle
            handle = self.get_unique_handle()
            handle_code = 105 if tags.dxftype() == 'DIMSTYLE' else 5  # legacy shit!!!
            tags.noclass.insert(1, DXFTag(handle_code, handle))  # handle should be the 2. tag

        self.__setitem__(handle, tags)
        return handle
Example #17
0
    def complex_ltype_tags(self, drawing: 'Drawing') -> Sequence[DXFTag]:
        def get_font_handle() -> str:
            if self.type == 'SHAPE':
                font = drawing.styles.get_shx(
                    self.font)  # creates new shx or returns existing entry
            else:
                try:
                    font = drawing.styles.get(
                        self.font)  # case insensitive search for text style
                except DXFTableEntryError:
                    font = drawing.styles.new(self.font)
            return font.dxf.handle

        if drawing is not None:
            handle = get_font_handle()
        else:
            handle = 0
        tags = []
        if self.type == 'TEXT':
            tags.append(DXFTag(74, 2))
            tags.append(DXFTag(75, 0))
        else:  # SHAPE
            tags.append(DXFTag(74, 4))
            tags.append(DXFTag(75, self.value))
        tags.append(DXFTag(340, handle))
        tags.extend(self.tags)
        if self.type == 'TEXT':
            tags.append(DXFTag(9, self.value))
        return tags
Example #18
0
    def complex_ltype_tags(self, doc: 'Drawing') -> Sequence[DXFTag]:
        def get_font_handle() -> str:
            if self.type == 'SHAPE':
                # Create new shx or returns existing entry:
                font = doc.styles.get_shx(self.font)
            else:
                try:
                    # Case insensitive search for text style:
                    font = doc.styles.get(self.font)
                except DXFTableEntryError:
                    font = doc.styles.new(self.font)
            return font.dxf.handle

        # Note: AutoCAD/BricsCAD do NOT report an error or even crash, if the
        # text style handle is invalid!
        if doc is not None:
            handle = get_font_handle()
        else:
            handle = '0'
        tags = []
        if self.type == 'TEXT':
            tags.append(DXFTag(74, 2))
            tags.append(DXFTag(75, 0))
        else:  # SHAPE
            tags.append(DXFTag(74, 4))
            tags.append(DXFTag(75, self.value))
        tags.append(DXFTag(340, handle))
        tags.extend(self.tags)
        if self.type == 'TEXT':
            tags.append(DXFTag(9, self.value))
        return tags
Example #19
0
def test_load_doublettes():
    from ezdxf.lldxf.attributes import DefSubclass, DXFAttr
    from ezdxf.lldxf.tags import Tags, DXFTag
    subclass = DefSubclass('AcDbTest', {
        'test1': DXFAttr(1),
        'test2': DXFAttr(2),
        'test3': DXFAttr(1),  # same group code for different attribute
    })

    class TestEntity(DXFEntity):
        DXFATTRIBS = DXFAttributes(subclass)

    data = Tags([
        DXFTag(1, '1'),
        DXFTag(2, '2'),
        DXFTag(1, '3'),
    ])
    ns = DXFNamespace(entity=TestEntity())
    SubclassProcessor.load_tags_into_namespace(ns, data, subclass)
    assert ns.test1 == '1'
    assert ns.test2 == '2'
    assert ns.test3 == '3'
    def test_append_should_add_time_travel_history(self, history2):
        first, second = history2.content()
        assert history2.back() is first  # 1st time travel
        assert history2.index == 0

        assert history2.forward() is second  # 2nd time travel
        assert history2.index == 1

        third = Tags([DXFTag(3, "third")])
        history2.append(third)
        assert history2.index == 4

        # complete travel history
        content = history2.content()
        assert len(content) == 5
        #                                 time wraps ->  append
        assert content == [first, second, first, second, third]
Example #21
0
    def test_pop_tags(self):
        tags = Tags([
            DXFTag(1, 'name1'),
            DXFTag(40, 1),
            DXFTag(40, 2),
            DXFTag(1, 'name2'),
            DXFTag(40, 3),
            DXFTag(1, 'name3'),
            DXFTag(40, 4),
            DXFTag(1, 'name4'),
        ])
        result = list(tags.pop_tags(codes=(40, )))
        assert len(result) == 4
        assert result[0] == (40, 1)
        assert result[-1] == (40, 4)

        assert len(tags) == 4
        assert tags[0] == (1, 'name1')
        assert tags[-1] == (1, 'name4')
Example #22
0
def lin_compiler(definition: str) -> Sequence[DXFTag]:
    """
    Compiles line type definitions like 'A,.5,-.25,.5,-.25,0,-.25' or 'A,.5,-.2,["GAS",STANDARD,S=.1,U=0.0,X=-0.1,Y=-.05],-.25'
    into DXFTags().

    Args:
        definition: definition string

    Returns:
        list of DXFTag()
    """
    # 'A,.5,-.2,["GAS",STANDARD,S=.1,U=0.0,X=-0.1,Y=-.05],-.25'
    # ['A', .5, -.2, ['TEXT', 'GAS', 'STANDARD', 's', .1, 'u', 0.0, 'x', -.1, 'y', -.05], -.25]
    tags = []
    for token in lin_parser(definition):
        if token == 'A':
            continue
        elif isinstance(token, float):
            tags.append(DXFTag(
                49,
                token))  # Dash, dot or space length (one entry per element)
        elif isinstance(token, list):  # yield from
            tags.append(compile_complex_defnition(token))
    return tags
Example #23
0
def test_int_2d_coords():
    tags = list(internal_tag_compiler(TAGS_2D_COORDS))
    assert 2 == len(tags)
    assert DXFTag(10, (100, 200)) == tags[1]
 def history2(self):
     history = EntityHistory()
     history.append(Tags([DXFTag(1, "first")]))
     history.append(Tags([DXFTag(2, "second")]))
     return history
Example #25
0
def test_write_point_tag():
    s, t = setup_stream()
    t.write_tag(DXFTag(10, (7., 8., 9.)))
    result = s.getvalue()
    assert result == ' 10\n7.0\n 20\n8.0\n 30\n9.0\n'
Example #26
0
def test_write_tag():
    s, t = setup_stream()
    t.write_tag(DXFTag(0, 'SECTION'))
    result = s.getvalue()
    assert result == '  0\nSECTION\n'
def test_append_not_existing_reactors(xtags4):
    xtags4.new_app_data(ACAD_REACTORS, [DXFTag(330, "DEAD")])
    reactors = xtags4.get_app_data_content(ACAD_REACTORS)
    assert 1 == len(reactors)
    assert DXFTag(330, "DEAD") == reactors[0]
def test_init_one_tag():
    xtags = ExtendedTags([DXFTag(0, "SECTION")])
    assert xtags.noclass[0] == (0, "SECTION")
Example #29
0
def test_int_multiple_2d_coords():
    tags = list(internal_tag_compiler(TAGS_2D_COORDS2))
    assert 3 == len(tags)
    assert DXFTag(10, (100, 200)) == tags[1]
    assert DXFTag(11, (1000, 2000)) == tags[2]
Example #30
0
def test_int_no_line_break_at_eof():
    tags = list(internal_tag_compiler(TAGS_NO_LINE_BREAK_AT_EOF))
    assert 3 == len(tags)
    assert DXFTag(10, (100, 200)) == tags[1]
    assert DXFTag(11, (1000, 2000)) == tags[2]