76 lines
2.3 KiB
Python
76 lines
2.3 KiB
Python
import numpy
|
|
from numpy.testing import assert_allclose
|
|
|
|
from ..utils.ports2data import ports_to_data, data_to_ports
|
|
from ..pattern import Pattern
|
|
from ..ports import Port
|
|
from ..library import Library
|
|
|
|
|
|
def test_ports2data_roundtrip() -> None:
|
|
pat = Pattern()
|
|
pat.ports["P1"] = Port((10, 20), numpy.pi / 2, ptype="test")
|
|
|
|
layer = (10, 0)
|
|
ports_to_data(pat, layer)
|
|
|
|
assert len(pat.labels[layer]) == 1
|
|
assert pat.labels[layer][0].string == "P1:test 90"
|
|
assert tuple(pat.labels[layer][0].offset) == (10.0, 20.0)
|
|
|
|
# New pattern, read ports back
|
|
pat2 = Pattern()
|
|
pat2.labels[layer] = pat.labels[layer]
|
|
data_to_ports([layer], {}, pat2)
|
|
|
|
assert "P1" in pat2.ports
|
|
assert_allclose(pat2.ports["P1"].offset, [10, 20], atol=1e-10)
|
|
assert pat2.ports["P1"].rotation is not None
|
|
assert_allclose(pat2.ports["P1"].rotation, numpy.pi / 2, atol=1e-10)
|
|
assert pat2.ports["P1"].ptype == "test"
|
|
|
|
|
|
def test_data_to_ports_hierarchical() -> None:
|
|
lib = Library()
|
|
|
|
# Child has port data in labels
|
|
child = Pattern()
|
|
layer = (10, 0)
|
|
child.label(layer=layer, string="A:type1 0", offset=(5, 0))
|
|
lib["child"] = child
|
|
|
|
# Parent references child
|
|
parent = Pattern()
|
|
parent.ref("child", offset=(100, 100), rotation=numpy.pi / 2)
|
|
|
|
# Read ports hierarchically (max_depth > 0)
|
|
data_to_ports([layer], lib, parent, max_depth=1)
|
|
|
|
# child port A (5,0) rot 0
|
|
# transformed by parent ref: rot pi/2, trans (100, 100)
|
|
# (5,0) rot pi/2 -> (0, 5)
|
|
# (0, 5) + (100, 100) = (100, 105)
|
|
# rot 0 + pi/2 = pi/2
|
|
assert "A" in parent.ports
|
|
assert_allclose(parent.ports["A"].offset, [100, 105], atol=1e-10)
|
|
assert parent.ports["A"].rotation is not None
|
|
assert_allclose(parent.ports["A"].rotation, numpy.pi / 2, atol=1e-10)
|
|
|
|
|
|
def test_data_to_ports_hierarchical_scaled_ref() -> None:
|
|
lib = Library()
|
|
|
|
child = Pattern()
|
|
layer = (10, 0)
|
|
child.label(layer=layer, string="A:type1 0", offset=(5, 0))
|
|
lib["child"] = child
|
|
|
|
parent = Pattern()
|
|
parent.ref("child", offset=(100, 100), rotation=numpy.pi / 2, scale=2)
|
|
|
|
data_to_ports([layer], lib, parent, max_depth=1)
|
|
|
|
assert "A" in parent.ports
|
|
assert_allclose(parent.ports["A"].offset, [100, 110], atol=1e-10)
|
|
assert parent.ports["A"].rotation is not None
|
|
assert_allclose(parent.ports["A"].rotation, numpy.pi / 2, atol=1e-10)
|