renderpather, get_bounds includes repetitions, Boundable
This commit is contained in:
parent
22e1c6ae1d
commit
9a28e1617c
17 changed files with 366 additions and 161 deletions
|
|
@ -1,7 +1,11 @@
|
|||
from typing import Self, TYPE_CHECKING
|
||||
from abc import ABCMeta, abstractmethod
|
||||
|
||||
import numpy
|
||||
from numpy.typing import NDArray
|
||||
|
||||
from ..error import MasqueError
|
||||
from .positionable import Bounded
|
||||
|
||||
|
||||
_empty_slots = () # Workaround to get mypy to ignore intentionally empty slots for superclass
|
||||
|
|
@ -50,15 +54,19 @@ class Repeatable(metaclass=ABCMeta):
|
|||
pass
|
||||
|
||||
|
||||
class RepeatableImpl(Repeatable, metaclass=ABCMeta):
|
||||
class RepeatableImpl(Repeatable, Bounded, metaclass=ABCMeta):
|
||||
"""
|
||||
Simple implementation of `Repeatable`
|
||||
Simple implementation of `Repeatable` and extension of `Bounded` to include repetition bounds.
|
||||
"""
|
||||
__slots__ = _empty_slots
|
||||
|
||||
_repetition: 'Repetition | None'
|
||||
""" Repetition object, or None (single instance only) """
|
||||
|
||||
@abstractmethod
|
||||
def get_bounds_single(self, *args, **kwargs) -> NDArray[numpy.float64] | None:
|
||||
pass
|
||||
|
||||
#
|
||||
# Non-abstract properties
|
||||
#
|
||||
|
|
@ -79,3 +87,24 @@ class RepeatableImpl(Repeatable, metaclass=ABCMeta):
|
|||
def set_repetition(self, repetition: 'Repetition | None') -> Self:
|
||||
self.repetition = repetition
|
||||
return self
|
||||
|
||||
def get_bounds_single_nonempty(self, *args, **kwargs) -> NDArray[numpy.float64]:
|
||||
"""
|
||||
Returns `[[x_min, y_min], [x_max, y_max]]` which specify a minimal bounding box for the entity.
|
||||
Asserts that the entity is non-empty (i.e., `get_bounds()` does not return None).
|
||||
|
||||
This is handy for destructuring like `xy_min, xy_max = entity.get_bounds_nonempty()`
|
||||
"""
|
||||
bounds = self.get_bounds_single(*args, **kwargs)
|
||||
assert bounds is not None
|
||||
return bounds
|
||||
|
||||
def get_bounds(self, *args, **kwargs) -> NDArray[numpy.float64] | None:
|
||||
bounds = self.get_bounds_single(*args, **kwargs)
|
||||
|
||||
if bounds is not None and self.repetition is not None:
|
||||
rep_bounds = self.repetition.get_bounds()
|
||||
if rep_bounds is None:
|
||||
return None
|
||||
bounds += rep_bounds
|
||||
return bounds
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue