[PortList.measure_travel] add a convenience wrapper for measuring internal travel

This commit is contained in:
Jan Petykiewicz 2026-04-09 11:41:21 -07:00
commit 6cf9600193
2 changed files with 29 additions and 0 deletions

View file

@ -273,6 +273,12 @@ class PortList(metaclass=ABCMeta):
else: # noqa: RET505
return {k: self.ports[k] for k in key}
def measure_travel(self, src: str, dst: str) -> tuple[NDArray[numpy.float64], float | None]:
"""
Convenience wrapper for measuring travel between two named ports.
"""
return self[src].measure_travel(self[dst])
def __contains__(self, key: str) -> NoReturn:
raise NotImplementedError('PortsList.__contains__ is left unimplemented. Use `key in container.ports` instead.')

View file

@ -47,6 +47,29 @@ def test_port_measure_travel() -> None:
assert rotation == pi
def test_port_list_measure_travel() -> None:
class MyPorts(PortList):
def __init__(self) -> None:
self._ports = {
"A": Port((0, 0), 0),
"B": Port((10, 5), pi),
}
@property
def ports(self) -> dict[str, Port]:
return self._ports
@ports.setter
def ports(self, val: dict[str, Port]) -> None:
self._ports = val
pl = MyPorts()
(travel, jog), rotation = pl.measure_travel("A", "B")
assert travel == 10
assert jog == 5
assert rotation == pi
def test_port_describe_any_rotation() -> None:
p = Port((0, 0), None)
assert p.describe() == "pos=(0, 0), rot=any"