Files
stepanalyser/.venv/lib/python3.12/site-packages/ezdxf/entities/idbuffer.py
Christian Anetzberger a197de9456 initial
2026-01-22 20:23:51 +01:00

140 lines
4.6 KiB
Python

# Copyright (c) 2019-2023, Manfred Moitzi
# License: MIT-License
from __future__ import annotations
from typing import TYPE_CHECKING, Optional
from typing_extensions import Self
from ezdxf.lldxf.const import SUBCLASS_MARKER, DXFStructureError
from ezdxf.lldxf.attributes import (
DXFAttributes,
DefSubclass,
DXFAttr,
group_code_mapping,
)
from .dxfentity import base_class, SubclassProcessor
from .dxfobj import DXFObject
from .factory import register_entity
from .copy import default_copy
if TYPE_CHECKING:
from ezdxf.entities import DXFNamespace, DXFEntity
from ezdxf.lldxf.tagwriter import AbstractTagWriter
from ezdxf.lldxf.tags import Tags
__all__ = ["IDBuffer", "FieldList", "LayerFilter"]
acdb_id_buffer = DefSubclass("AcDbIdBuffer", {})
@register_entity
class IDBuffer(DXFObject):
"""DXF IDBUFFER entity"""
DXFTYPE = "IDBUFFER"
DXFATTRIBS = DXFAttributes(base_class, acdb_id_buffer)
def __init__(self) -> None:
super().__init__()
self.handles: list[str] = []
def copy_data(self, entity: Self, copy_strategy=default_copy) -> None:
"""Copy handles"""
assert isinstance(entity, IDBuffer)
entity.handles = list(self.handles)
def load_dxf_attribs(
self, processor: Optional[SubclassProcessor] = None
) -> DXFNamespace:
dxf = super().load_dxf_attribs(processor)
if processor:
if len(processor.subclasses) < 2:
raise DXFStructureError(
f"Missing required subclass in IDBUFFER(#{dxf.handle})"
)
self.load_handles(processor.subclasses[1])
return dxf
def load_handles(self, tags: Tags):
self.handles = [value for code, value in tags if code == 330]
def export_entity(self, tagwriter: AbstractTagWriter) -> None:
"""Export entity specific data as DXF tags."""
super().export_entity(tagwriter)
tagwriter.write_tag2(SUBCLASS_MARKER, acdb_id_buffer.name)
self.export_handles(tagwriter)
def export_handles(self, tagwriter: AbstractTagWriter):
for handle in self.handles:
tagwriter.write_tag2(330, handle)
acdb_id_set = DefSubclass(
"AcDbIdSet",
{
"flags": DXFAttr(90, default=0), # not documented by Autodesk
},
)
acdb_id_set_group_codes = group_code_mapping(acdb_id_set)
acdb_field_list = DefSubclass("AcDbFieldList", {})
@register_entity
class FieldList(IDBuffer):
"""DXF FIELDLIST entity"""
DXFTYPE = "FIELDLIST"
DXFATTRIBS = DXFAttributes(base_class, acdb_id_set, acdb_field_list)
def load_dxf_attribs(
self, processor: Optional[SubclassProcessor] = None
) -> DXFNamespace:
dxf = super(DXFObject, self).load_dxf_attribs(processor)
if processor:
if len(processor.subclasses) < 3:
raise DXFStructureError(
f"Missing required subclass in FIELDLIST(#{dxf.handle})"
)
processor.fast_load_dxfattribs(dxf, acdb_id_set_group_codes, 1)
# Load field list:
self.load_handles(processor.subclasses[2])
return dxf
def export_entity(self, tagwriter: AbstractTagWriter) -> None:
"""Export entity specific data as DXF tags."""
super(DXFObject, self).export_entity(tagwriter)
tagwriter.write_tag2(SUBCLASS_MARKER, acdb_id_set.name)
self.dxf.export_dxf_attribs(tagwriter, "flags")
tagwriter.write_tag2(SUBCLASS_MARKER, acdb_field_list.name)
self.export_handles(tagwriter)
acdb_filter = DefSubclass("AcDbFilter", {})
acdb_layer_filter = DefSubclass("AcDbLayerFilter", {})
@register_entity
class LayerFilter(IDBuffer):
"""DXF LAYER_FILTER entity"""
DXFTYPE = "LAYER_FILTER"
DXFATTRIBS = DXFAttributes(base_class, acdb_filter, acdb_layer_filter)
def load_dxf_attribs(
self, processor: Optional[SubclassProcessor] = None
) -> DXFNamespace:
dxf = super(DXFObject, self).load_dxf_attribs(processor)
if processor:
if len(processor.subclasses) < 3:
raise DXFStructureError(
f"Missing required subclass in LAYER_FILTER(#{dxf.handle})"
)
# Load layer filter:
self.load_handles(processor.subclasses[2])
return dxf
def export_entity(self, tagwriter: AbstractTagWriter) -> None:
"""Export entity specific data as DXF tags."""
super(DXFObject, self).export_entity(tagwriter)
tagwriter.write_tag2(SUBCLASS_MARKER, acdb_filter.name)
tagwriter.write_tag2(SUBCLASS_MARKER, acdb_layer_filter.name)
self.export_handles(tagwriter)