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
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]
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]
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])
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
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)
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'
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"
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)
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")
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
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)
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
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
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
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]
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')
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
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
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'
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")
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]
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]