def import_table(self, name, query="*", conflict="discard"): """ Import specific entries from a table. :param str name: valid table names are 'layers', 'linetypes', 'appids', 'dimstyles', 'styles', 'ucs', 'views', 'viewports' except 'block_records' as defined in ezdxf.table.TABLENAMES :param str conflict: discard|replace """ if conflict not in ('replace', 'discard'): raise ValueError("Unknown value '{}' for parameter 'conflict'.".format(conflict)) if name == 'block_records': raise ValueError("Can not import whole block_records table, block_records will be imported as required.") try: source_table = self.source.sections.tables[name] except KeyError: raise ValueError("Source drawing has no table '{}'.".format(name)) try: target_table = self.target.sections.tables[name] except KeyError: raise ValueError("Table '{}' does not exists in the target drawing. " "Table creation in the target drawing not implemented yet!".format(name)) source_entry_names = (entry.dxf.name for entry in source_table) for entry_name in name_query(source_entry_names, query): table_entry = source_table.get(entry_name) if table_entry.dxf.name in target_table: if conflict == 'discard': continue else: # replace existing entry target_table.remove(table_entry.dxf.name) new_handle = self.import_tags(table_entry.dxf.handle) target_table._append_entry_handle(new_handle)
def import_table(self, name: str, query: str = "*", conflict: str = "discard") -> None: """ Import specific entries from a table. Args: name: valid table names are 'layers', 'linetypes', 'appids', 'dimstyles', 'styles', 'ucs', 'views', 'viewports' except 'block_records' as defined in ezdxf.table.TABLENAMES query: table name query, "*" for all conflict: discard|replace """ if conflict not in ('replace', 'discard'): raise ValueError("Unknown value '{}' for parameter 'conflict'.".format(conflict)) if name == 'block_records': raise ValueError("Can not import whole block_records table, block_records will be imported as required.") try: source_table = self.source.sections.tables[name] except KeyError: raise ValueError("Source drawing has no table '{}'.".format(name)) try: target_table = self.target.sections.tables[name] except KeyError: raise ValueError("Table '{}' does not exists in the target drawing. " "Table creation in the target drawing not implemented yet!".format(name)) source_entry_names = (entry.dxf.name for entry in source_table) for entry_name in name_query(source_entry_names, query): table_entry = source_table.get(entry_name) if table_entry.dxf.name in target_table: if conflict == 'discard': continue else: # replace existing entry target_table.remove(table_entry.dxf.name) new_handle = self.import_tags(table_entry.dxf.handle) target_table._append_entry_handle(new_handle)
def import_tables(self, query="*", conflict="discard"): """ Import table entries. :param str conflict: discard|replace """ table_names = [table.name for table in self.source.sections.tables if table.name != 'block_records'] for table_name in name_query(table_names, query): self.import_table(table_name, query="*", conflict=conflict)
def import_tables(self, query: str = "*", conflict: str = "discard") -> None: """ Import table entries. Args: query: names of tables to import, "*" for all conflict: discard|replace """ table_names = [table.name for table in self.source.sections.tables if table.name != 'block_records'] for table_name in name_query(table_names, query): self.import_table(table_name, query="*", conflict=conflict)
def import_tables(self, query="*", conflict="discard"): """ Import table entries. :param str conflict: discard|replace """ table_names = [ table.name for table in self.source.sections.tables if table.name != 'block_records' ] for table_name in name_query(table_names, query): self.import_table(table_name, query="*", conflict=conflict)
def import_blocks(self, query: str = "*", conflict: str = "discard") -> None: """ Import block definitions. Args: query: names of blocks to import, "*" for all conflict: discard|replace|rename """ has_block_records = self.target.dxfversion > 'AC1009' def import_block_record(block_layout): if not has_block_records: return block_record_handle = block_layout.block_record_handle if block_record_handle != '0': block_record_handle = self.import_tags(block_record_handle) self.target.sections.tables.block_records._append_entry_handle( block_record_handle) block_layout.set_block_record_handle(block_record_handle) block_record = self.target.dxffactory.wrap_handle( block_record_handle) _cleanup_block_record(block_record) def rename(block): counter = 1 old_name = block.name while True: new_name = old_name + "_%d" % counter if new_name in existing_block_names: counter += 1 else: block.name = new_name break rename_block_record(block) existing_block_names.add(new_name) self._renamed_blocks[old_name] = new_name def rename_block_record(block_layout): if not has_block_records: return block_record_handle = block_layout.block_record_handle if block_record_handle != '0': block_record = self.target.dxffactory.wrap_handle( block_record_handle) block_record.dxf.name = block_layout.name def import_block_layout(source_block_layout): head_handle = self.import_tags(source_block_layout._block_handle) tail_handle = self.import_tags(source_block_layout._endblk_handle) target_block_layout = self.target.dxffactory.new_block_layout( head_handle, tail_handle) import_block_record(target_block_layout) import_block_entities(source_block_layout, target_block_layout) return target_block_layout def import_block_entities(source_block_layout, target_block_layout): for entity in source_block_layout: target_handle = self.import_tags(entity.dxf.handle) new_entity = self.target.dxffactory.wrap_handle(target_handle) target_block_layout.add_entity(new_entity) dxftype = new_entity.dxftype() if dxftype == 'INSERT': # maybe a reference to a renamed block resolve_block_references.append(new_entity) elif dxftype == 'IMAGE': self._requires_data_from_objects_section.append(new_entity) resolve_block_references = [] existing_block_names = set(block.name for block in self.target.blocks) # Do not import blocks associated to layouts and model space layout_block_names = frozenset(_get_layout_block_names(self.source)) block_names_without_layouts = frozenset( block.name for block in self.source.blocks) - layout_block_names import_block_names = frozenset( name_query(block_names_without_layouts, query)) for block in self.source.blocks: # blocks is a list, access by blocks[name] is slow block_name = block.name if block_name not in import_block_names: continue if block_name not in existing_block_names: target_block_layout = import_block_layout(block) self.target.blocks.add(target_block_layout) else: # we have a name conflict if conflict == 'discard': continue elif conflict == 'rename': target_block_layout = import_block_layout(block) rename(target_block_layout) self.target.blocks.add(target_block_layout) elif conflict == 'replace': target_block_layout = import_block_layout(block) self.target.blocks.add(target_block_layout) else: raise ValueError( "'{}' is an invalid value for parameter conflict.". format(conflict)) # update renamed block names for block_ref in resolve_block_references: self.resolve_block_ref(block_ref)
def test_exclude_some_names(self, entities): result = list(name_query(entities, '* !SOLID')) assert 'SOLID' not in result
def test_match_full_string(): names = "ONEONE TWO THREE" result = list(name_query(names.split(), 'ONE')) assert len(result) == 0
def test_match_one_string(): names = "ONE TWO THREE" result = list(name_query(names.split(), 'ONE')) assert "ONE" == result[0]
def test_some_names(self, entities): result = list(name_query(entities, 'LINE SOLID')) assert result == ['LINE', 'SOLID']
def test_exclude_some_names(self, entities): result = list(name_query(entities, "* !SOLID")) assert "SOLID" not in result
def test_match_full_string(self): names = "ONEONE TWO THREE" result = list(name_query(names.split(), 'ONE')) self.assertFalse(result)
def import_blocks(self, query="*", conflict="discard"): """ Import block definitions. :param str query: names of blocks to import, "*" for all :param str conflict: discard|replace|rename """ has_block_records = self.target.dxfversion > 'AC1009' def import_block_record(block_layout): if not has_block_records: return block_record_handle = block_layout.block_record_handle if block_record_handle != '0': block_record_handle = self.import_tags(block_record_handle) self.target.sections.tables.block_records._append_entry_handle(block_record_handle) block_layout.set_block_record_handle(block_record_handle) block_record = self.target.dxffactory.wrap_handle(block_record_handle) _cleanup_block_record(block_record) def rename(block): counter = 1 old_name = block.name while True: new_name = old_name + "_%d" % counter if new_name in existing_block_names: counter += 1 else: block.name = new_name break rename_block_record(block) existing_block_names.add(new_name) self._renamed_blocks[old_name] = new_name def rename_block_record(block_layout): if not has_block_records: return block_record_handle = block_layout.block_record_handle if block_record_handle != '0': block_record = self.target.dxffactory.wrap_handle(block_record_handle) block_record.dxf.name = block_layout.name def import_block_layout(source_block_layout): head_handle = self.import_tags(source_block_layout._block_handle) tail_handle = self.import_tags(source_block_layout._endblk_handle) target_block_layout = self.target.dxffactory.new_block_layout(head_handle, tail_handle) import_block_record(target_block_layout) import_block_entities(source_block_layout, target_block_layout) return target_block_layout def import_block_entities(source_block_layout, target_block_layout): for entity in source_block_layout: target_handle = self.import_tags(entity.dxf.handle) new_entity = self.target.dxffactory.wrap_handle(target_handle) target_block_layout.add_entity(new_entity) dxftype = new_entity.dxftype() if dxftype == 'INSERT': # maybe a reference to a renamed block resolve_block_references.append(new_entity) elif dxftype == 'IMAGE': self._requires_data_from_objects_section.append(new_entity) resolve_block_references = [] existing_block_names = set(block.name for block in self.target.blocks) # Do not import blocks associated to layouts and model space layout_block_names = frozenset(_get_layout_block_names(self.source)) block_names_without_layouts = frozenset(block.name for block in self.source.blocks) - layout_block_names import_block_names = frozenset(name_query(block_names_without_layouts, query)) for block in self.source.blocks: # blocks is a list, access by blocks[name] is slow block_name = block.name if block_name not in import_block_names: continue if block_name not in existing_block_names: target_block_layout = import_block_layout(block) self.target.blocks.add(target_block_layout) else: # we have a name conflict if conflict == 'discard': continue elif conflict == 'rename': target_block_layout = import_block_layout(block) rename(target_block_layout) self.target.blocks.add(target_block_layout) elif conflict == 'replace': target_block_layout = import_block_layout(block) self.target.blocks.add(target_block_layout) else: raise ValueError("'{}' is an invalid value for parameter conflict.".format(conflict)) # update renamed block names for block_ref in resolve_block_references: self.resolve_block_ref(block_ref)
def test_all_names(self): names = "ONE TWO THREE" result = " ".join(name_query(names.split(), '*')) self.assertEqual(names, result)
def test_all_names(self, entities): result = list(name_query(entities, '*')) assert result == entities
def test_match_one_string(self): names = "ONE TWO THREE" result = list(name_query(names.split(), 'ONE')) self.assertEqual("ONE", result[0])
def test_all_names(): names = "ONE TWO THREE" result = " ".join(name_query(names.split(), '*')) assert names == result
def test_match_more_strings(self): names = "ONE_1 ONE_2 THREE" result = list(name_query(names.split(), 'ONE_.*')) self.assertEqual("ONE_1", result[0]) self.assertEqual("ONE_2", result[1]) self.assertEqual(2, len(result))
def test_some_names(self, entities): result = list(name_query(entities, "LINE SOLID")) assert result == ["LINE", "SOLID"]