Source code for fibomat.layout.lattices.dim_lattice_builder

from typing import Optional

from fibomat.layout.lattices.lattice_builder_base import LatticeBuilderBase
from fibomat.layout.lattices.dim_lattice import DimLattice
from fibomat.linalg import VectorLike, DimVector, DimVectorLike
from fibomat.units import LengthQuantity, U_, Q_, has_length_dim


[docs]class DimLatticeBuilder(LatticeBuilderBase): _VectorClass = DimVector
[docs] def __init__(self, nu: int, nv: int, u: DimVectorLike, v: DimVectorLike, center: Optional[DimVectorLike] = None): super().__init__(nu, nv, u, v, center)
[docs] @classmethod def generate_rect(cls, nu: int, nv: int, du: LengthQuantity, dv: LengthQuantity, center: Optional[VectorLike] = None): if not isinstance(dv, Q_) or not has_length_dim(dv) or not isinstance(dv.m, (int, float)): raise TypeError('dv must be scalar with dimension [length]') if not isinstance(du, Q_) or not has_length_dim(du) or not isinstance(du.m, (int, float)): raise TypeError('du must be scalar with dimension [length]') return cls(nu, nv, DimVector(du, 0*U_('µm')), DimVector(0*U_('µm'), -dv), center)
[docs] def to_lattice(self, sort_by: str = 'added') -> DimLattice: if sort_by == 'added': return DimLattice(self._elements, None) if sort_by == 'row_col': return DimLattice(sorted( sorted(self._elements, key=lambda elem: elem.center.x), key=lambda elem:elem.center.y, reverse=True ), None) if sort_by == 'col_row': return DimLattice(sorted( sorted(self._elements, key=lambda elem: elem.center.y, reverse=True), key=lambda elem: elem.center.x ), None) else: raise ValueError(f'Unknown sort type "{sort_by}"')