123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- # Created: 13.03.2011
- # Copyright (c) 2011-2018, Manfred Moitzi
- # License: MIT License
- from typing import TYPE_CHECKING, Iterator, Iterable, Union
- from collections import Counter, OrderedDict
- from ezdxf.lldxf.types import DXFTag
- from ezdxf.lldxf.extendedtags import ExtendedTags
- from ezdxf.lldxf.const import DXFStructureError
- from ezdxf.modern.dxfobjects import DXFClass
- if TYPE_CHECKING: # import forward declarations
- from ezdxf.eztypes import Drawing, TagWriter
- class ClassesSection:
- name = 'CLASSES'
- def __init__(self, entities: Iterable[DXFTag] = None, drawing: 'Drawing' = None):
- self.classes = OrderedDict() # DXFClasses are not stored in the entities database, because CLASS has no handle
- self.drawing = drawing
- if entities is not None:
- self._build(iter(entities))
- def __iter__(self) -> Iterable[DXFClass]:
- return (cls for cls in self.classes.values())
- def _build(self, entities: Iterator[DXFTag]) -> None:
- section_head = next(entities)
- if section_head[0] != (0, 'SECTION') or section_head[1] != (2, 'CLASSES'):
- raise DXFStructureError("Critical structure error in CLASSES section.")
- for class_tags in entities:
- self.register(ExtendedTags(class_tags))
- def register(self, classes: Union[ExtendedTags, Iterable[ExtendedTags]]):
- if classes is None:
- return
- if isinstance(classes, ExtendedTags):
- classes = (classes,)
- for class_tags in classes:
- dxftype = class_tags.noclass.get_first_value(1)
- if dxftype not in self.classes:
- self.classes[dxftype] = DXFClass(class_tags, self.drawing)
- def write(self, tagwriter: 'TagWriter') -> None:
- tagwriter.write_str(" 0\nSECTION\n 2\nCLASSES\n")
- for dxfclass in self.classes.values():
- tagwriter.write_tags(dxfclass.tags)
- tagwriter.write_str(" 0\nENDSEC\n")
- def update_instance_counters(self) -> None:
- if self.drawing.dxfversion < 'AC1018':
- return # instance counter not supported
- counter = Counter()
- # count all entities in the entity database
- for xtags in self.drawing.entitydb.values():
- counter[xtags.dxftype()] += 1
- for dxfclass in self.classes.values():
- dxfclass.dxf.instance_count = counter[dxfclass.dxf.name]
|