From 0189756df4b6bc444419d06d2cb3ce8892ea9f1c Mon Sep 17 00:00:00 2001 From: jan Date: Sat, 7 Mar 2026 00:03:07 -0800 Subject: [PATCH] [Pather/RenderPather] Add U-bend to trace_into --- masque/builder/pather_mixin.py | 4 +++- masque/test/test_pather_api.py | 12 ++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/masque/builder/pather_mixin.py b/masque/builder/pather_mixin.py index cb957b1..239f5a9 100644 --- a/masque/builder/pather_mixin.py +++ b/masque/builder/pather_mixin.py @@ -322,7 +322,9 @@ class PatherMixin(PortList, metaclass=ABCMeta): (travel, jog), _ = port_src.measure_travel(port_dst) self.jog(portspec_src, -jog, -travel, **dst_args) elif numpy.isclose(angle, 0): - raise BuildError("Don't know how to route a U-bend yet (TODO)!") + # U-bend + (travel, jog), _ = port_src.measure_travel(port_dst) + self.uturn(portspec_src, -jog, length=-travel, **dst_args) else: raise BuildError(f"Don't know how to route ports with relative angle {angle}") diff --git a/masque/test/test_pather_api.py b/masque/test/test_pather_api.py index 5937ea1..9ac1b78 100644 --- a/masque/test/test_pather_api.py +++ b/masque/test/test_pather_api.py @@ -228,3 +228,15 @@ def test_pather_trace_into() -> None: assert 'F' in p.pattern.ports assert 'E' in p.pattern.ports assert numpy.allclose(p.pattern.ports['E'].offset, (-10000, 2000)) + + # 4. U-bend (0 deg angle) + p.pattern.ports['G'] = Port((0, 0), rotation=0) + p.pattern.ports['H'] = Port((-10000, 2000), rotation=0) + p.at('G').trace_into('H', plug_destination=False) + assert 'H' in p.pattern.ports + assert 'G' in p.pattern.ports + # A U-bend with length=-travel=10000 and jog=-2000 from (0,0) rot 0 + # ends up at (-10000, 2000) rot pi. + assert numpy.allclose(p.pattern.ports['G'].offset, (-10000, 2000)) + assert p.pattern.ports['G'].rotation is not None + assert numpy.isclose(p.pattern.ports['G'].rotation, pi)