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)
Example #2
0
    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)
Example #4
0
    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)
Example #5
0
    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)
Example #6
0
    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)
Example #7
0
 def test_exclude_some_names(self, entities):
     result = list(name_query(entities, '* !SOLID'))
     assert 'SOLID' not in result
Example #8
0
def test_match_full_string():
    names = "ONEONE TWO THREE"
    result = list(name_query(names.split(), 'ONE'))
    assert len(result) == 0
Example #9
0
def test_match_one_string():
    names = "ONE TWO THREE"
    result = list(name_query(names.split(), 'ONE'))
    assert "ONE" == result[0]
Example #10
0
 def test_some_names(self, entities):
     result = list(name_query(entities, 'LINE SOLID'))
     assert result == ['LINE', 'SOLID']
Example #11
0
 def test_exclude_some_names(self, entities):
     result = list(name_query(entities, "* !SOLID"))
     assert "SOLID" not in result
Example #12
0
 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)
Example #14
0
 def test_all_names(self):
     names = "ONE TWO THREE"
     result = " ".join(name_query(names.split(), '*'))
     self.assertEqual(names, result)
Example #15
0
 def test_all_names(self, entities):
     result = list(name_query(entities, '*'))
     assert result == entities
Example #16
0
 def test_match_one_string(self):
     names = "ONE TWO THREE"
     result = list(name_query(names.split(), 'ONE'))
     self.assertEqual("ONE", result[0])
Example #17
0
def test_all_names():
    names = "ONE TWO THREE"
    result = " ".join(name_query(names.split(), '*'))
    assert names == result
Example #18
0
 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))
Example #19
0
 def test_some_names(self, entities):
     result = list(name_query(entities, "LINE SOLID"))
     assert result == ["LINE", "SOLID"]