Source code for across.tools.visibility.constraints.polygon

from pydantic import field_serializer, field_validator
from shapely import Polygon

from .base import ConstraintABC


[docs] class PolygonConstraint(ConstraintABC): """ Mixin class for constraints that are defined by a polygon. Mostly provides serialization and validation for the polygon. """
[docs] polygon: Polygon | None = None
@field_serializer("polygon")
[docs] def serialize_polygon(self, polygon: Polygon | None) -> list[tuple[float, ...]] | None: """Serialize the polygon to a list of tuples""" if polygon: return [co for co in polygon.exterior.coords] return None
@field_validator("polygon", mode="before") @classmethod
[docs] def validate_polygon( cls, v: Polygon | list[tuple[float, ...]] | tuple[tuple[float, ...], ...] | None ) -> Polygon | None: """Validate and convert polygon input""" if v is None: return v if isinstance(v, Polygon): return v if isinstance(v, (list, tuple)): return Polygon(v) raise ValueError(f"Cannot convert {type(v)} to Polygon")