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

97 lines
2.9 KiB
Python

# Copyright (c) 2021-2024, Manfred Moitzi
# License: MIT License
from __future__ import annotations
from typing import TYPE_CHECKING, Iterator, Iterable, Any
from typing_extensions import Protocol, runtime_checkable
from ezdxf.query import EntityQuery
if TYPE_CHECKING:
from ezdxf.entities import DXFGraphic, DXFEntity
from ezdxf.entities.temporary_transform import TemporaryTransformation
from ezdxf.math import Matrix44, AbstractBoundingBox
# Protocol implemented for:
# - DXFTagStorage
# - ACAD_PROXY_ENTITY
# - INSERT
# - DIMENSION
# - LEADER
# - MLEADER
# - MLINE
# - ProxyGraphic
# - DXFGraphicProxy (drawing add-on)
# - DXFTagStorage
# - ACAD_TABLE (table content loader)
@runtime_checkable
class SupportsVirtualEntities(Protocol):
"""The virtual entities protocol is used to disassemble complex entities
into DXF primitives like LINE, ARC, ... as REQUIREMENT to render these
entities. Which means the entity does not have :func:`ezdxf.path.make_path`
support, except the text entities TEXT, ATTRIB and MTEXT.
Optional DECONSTRUCTION of entities into DXF primitives like LWPOLYLINE
into LINE and ARC entities is NOT the intended usage of this protocol!
This protocol is for consistent internal usage and does not replace
the :meth:`virtual_entities` methods!
"""
def __virtual_entities__(self) -> Iterator[DXFGraphic]: ...
def virtual_entities(entity: SupportsVirtualEntities) -> Iterator[DXFGraphic]:
if isinstance(entity, SupportsVirtualEntities):
return entity.__virtual_entities__()
else:
raise TypeError(
f"{type(entity)!r} does not support the __virtual_entities__ protocol"
)
def query_virtual_entities(entity: SupportsVirtualEntities) -> EntityQuery:
return EntityQuery(virtual_entities(entity))
@runtime_checkable
class ReferencedBlocks(Protocol):
def __referenced_blocks__(self) -> Iterable[str]:
"""Returns the handles to the BLOCK_RECORD entities for all BLOCK
definitions used by an entity.
"""
class SupportsTransform(Protocol):
def transform(self, m: Matrix44) -> DXFGraphic:
"""Raises NotImplementedError() if transformation is not supported."""
_EMPTY_TUPLE: tuple = tuple()
def referenced_blocks(entity: DXFEntity) -> Iterable[str]:
"""Returns the handles to the BLOCK_RECORD entities for all BLOCK
definitions used by an entity.
"""
if isinstance(entity, ReferencedBlocks):
return entity.__referenced_blocks__()
else:
return _EMPTY_TUPLE
class SupportsBoundingBox(Protocol):
def bbox(self) -> AbstractBoundingBox: ...
@runtime_checkable
class SupportsTemporaryTransformation(Protocol):
def temporary_transformation(self) -> TemporaryTransformation: ...
class SupportsMessages(Protocol):
def notify(self, message_type: int, data: Any = None) -> None:
"""Internal messaging system."""