[Abstract] respect ref scale

This commit is contained in:
Jan Petykiewicz 2026-03-30 21:06:51 -07:00
commit 26cc0290b9
2 changed files with 25 additions and 0 deletions

View file

@ -157,6 +157,8 @@ class Abstract(PortList, Mirrorable):
self.mirror() self.mirror()
self.rotate_ports(ref.rotation) self.rotate_ports(ref.rotation)
self.rotate_port_offsets(ref.rotation) self.rotate_port_offsets(ref.rotation)
if ref.scale != 1:
self.scale_by(ref.scale)
self.translate_ports(ref.offset) self.translate_ports(ref.offset)
return self return self
@ -174,6 +176,8 @@ class Abstract(PortList, Mirrorable):
# TODO test undo_ref_transform # TODO test undo_ref_transform
""" """
self.translate_ports(-ref.offset) self.translate_ports(-ref.offset)
if ref.scale != 1:
self.scale_by(1 / ref.scale)
self.rotate_port_offsets(-ref.rotation) self.rotate_port_offsets(-ref.rotation)
self.rotate_ports(-ref.rotation) self.rotate_ports(-ref.rotation)
if ref.mirrored: if ref.mirrored:

View file

@ -54,6 +54,17 @@ def test_abstract_ref_transform() -> None:
assert_allclose(abs_obj.ports["A"].rotation, pi / 2, atol=1e-10) 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: def test_abstract_undo_transform() -> None:
abs_obj = Abstract("test", {"A": Port((100, 110), pi / 2)}) abs_obj = Abstract("test", {"A": Port((100, 110), pi / 2)})
ref = Ref(offset=(100, 100), rotation=pi / 2, mirrored=True) 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_allclose(abs_obj.ports["A"].offset, [10, 0], atol=1e-10)
assert abs_obj.ports["A"].rotation is not None assert abs_obj.ports["A"].rotation is not None
assert_allclose(abs_obj.ports["A"].rotation, 0, atol=1e-10) 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)