From 26cc0290b975e6d782bc98faa51c447fa15d1ebb Mon Sep 17 00:00:00 2001 From: Jan Petykiewicz Date: Mon, 30 Mar 2026 21:06:51 -0700 Subject: [PATCH] [Abstract] respect ref scale --- masque/abstract.py | 4 ++++ masque/test/test_abstract.py | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/masque/abstract.py b/masque/abstract.py index 501e394..d23d7c7 100644 --- a/masque/abstract.py +++ b/masque/abstract.py @@ -157,6 +157,8 @@ class Abstract(PortList, Mirrorable): self.mirror() self.rotate_ports(ref.rotation) self.rotate_port_offsets(ref.rotation) + if ref.scale != 1: + self.scale_by(ref.scale) self.translate_ports(ref.offset) return self @@ -174,6 +176,8 @@ class Abstract(PortList, Mirrorable): # TODO test undo_ref_transform """ self.translate_ports(-ref.offset) + if ref.scale != 1: + self.scale_by(1 / ref.scale) self.rotate_port_offsets(-ref.rotation) self.rotate_ports(-ref.rotation) if ref.mirrored: diff --git a/masque/test/test_abstract.py b/masque/test/test_abstract.py index 7c2dbbb..d2f54ed 100644 --- a/masque/test/test_abstract.py +++ b/masque/test/test_abstract.py @@ -54,6 +54,17 @@ def test_abstract_ref_transform() -> None: assert_allclose(abs_obj.ports["A"].rotation, pi / 2, atol=1e-10) +def test_abstract_ref_transform_scales_offsets() -> None: + abs_obj = Abstract("test", {"A": Port((10, 0), 0)}) + ref = Ref(offset=(100, 100), rotation=pi / 2, mirrored=True, scale=2) + + abs_obj.apply_ref_transform(ref) + + assert_allclose(abs_obj.ports["A"].offset, [100, 120], atol=1e-10) + assert abs_obj.ports["A"].rotation is not None + assert_allclose(abs_obj.ports["A"].rotation, pi / 2, atol=1e-10) + + def test_abstract_undo_transform() -> None: abs_obj = Abstract("test", {"A": Port((100, 110), pi / 2)}) ref = Ref(offset=(100, 100), rotation=pi / 2, mirrored=True) @@ -62,3 +73,13 @@ def test_abstract_undo_transform() -> None: assert_allclose(abs_obj.ports["A"].offset, [10, 0], atol=1e-10) assert abs_obj.ports["A"].rotation is not None assert_allclose(abs_obj.ports["A"].rotation, 0, atol=1e-10) + + +def test_abstract_undo_transform_scales_offsets() -> None: + abs_obj = Abstract("test", {"A": Port((100, 120), pi / 2)}) + ref = Ref(offset=(100, 100), rotation=pi / 2, mirrored=True, scale=2) + + abs_obj.undo_ref_transform(ref) + assert_allclose(abs_obj.ports["A"].offset, [10, 0], atol=1e-10) + assert abs_obj.ports["A"].rotation is not None + assert_allclose(abs_obj.ports["A"].rotation, 0, atol=1e-10)