Breaking change: Use string-valued ptypes, with default value 'unk'
This commit is contained in:
parent
44b08a8dae
commit
0d733bdc6f
@ -35,7 +35,7 @@ class Port(PositionableImpl, Rotatable, PivotableImpl, Copyable, Mirrorable, met
|
|||||||
The rotation may be set to `None`, indicating that any orientation is
|
The rotation may be set to `None`, indicating that any orientation is
|
||||||
allowed (e.g. for a DC electrical port). It is stored modulo 2pi.
|
allowed (e.g. for a DC electrical port). It is stored modulo 2pi.
|
||||||
|
|
||||||
The `ptype` is an arbitrary integer, default of `0`.
|
The `ptype` is an arbitrary string, default of `unk` (unknown).
|
||||||
"""
|
"""
|
||||||
__slots__ = ('ptype', '_rotation')
|
__slots__ = ('ptype', '_rotation')
|
||||||
|
|
||||||
@ -43,13 +43,13 @@ class Port(PositionableImpl, Rotatable, PivotableImpl, Copyable, Mirrorable, met
|
|||||||
""" radians counterclockwise from +x, pointing into device body.
|
""" radians counterclockwise from +x, pointing into device body.
|
||||||
Can be `None` to signify undirected port """
|
Can be `None` to signify undirected port """
|
||||||
|
|
||||||
ptype: int
|
ptype: str
|
||||||
""" Port types must match to be plugged together if both are non-zero """
|
""" Port types must match to be plugged together if both are non-zero """
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(self,
|
||||||
offset: numpy.ndarray,
|
offset: numpy.ndarray,
|
||||||
rotation: Optional[float],
|
rotation: Optional[float],
|
||||||
ptype: int = 0,
|
ptype: str = 'unk',
|
||||||
) -> None:
|
) -> None:
|
||||||
self.offset = offset
|
self.offset = offset
|
||||||
self.rotation = rotation
|
self.rotation = rotation
|
||||||
@ -72,7 +72,7 @@ class Port(PositionableImpl, Rotatable, PivotableImpl, Copyable, Mirrorable, met
|
|||||||
def get_bounds(self):
|
def get_bounds(self):
|
||||||
return numpy.vstack((self.offset, self.offset))
|
return numpy.vstack((self.offset, self.offset))
|
||||||
|
|
||||||
def set_ptype(self: P, ptype: int) -> P:
|
def set_ptype(self: P, ptype: str) -> P:
|
||||||
""" Chainable setter for `ptype` """
|
""" Chainable setter for `ptype` """
|
||||||
self.ptype = ptype
|
self.ptype = ptype
|
||||||
return self
|
return self
|
||||||
@ -173,7 +173,7 @@ class Device(Copyable, Mirrorable):
|
|||||||
) -> None:
|
) -> None:
|
||||||
"""
|
"""
|
||||||
If `ports` is `None`, two default ports ('A' and 'B') are created.
|
If `ports` is `None`, two default ports ('A' and 'B') are created.
|
||||||
Both are placed at (0, 0) and have `ptype=0`, but 'A' has rotation 0
|
Both are placed at (0, 0) and have default `ptype`, but 'A' has rotation 0
|
||||||
(attached devices will be placed to the left) and 'B' has rotation
|
(attached devices will be placed to the left) and 'B' has rotation
|
||||||
pi (attached devices will be placed to the right).
|
pi (attached devices will be placed to the right).
|
||||||
"""
|
"""
|
||||||
@ -188,8 +188,8 @@ class Device(Copyable, Mirrorable):
|
|||||||
|
|
||||||
if ports is None:
|
if ports is None:
|
||||||
self.ports = {
|
self.ports = {
|
||||||
'A': Port([0, 0], rotation=0, ptype=0),
|
'A': Port([0, 0], rotation=0),
|
||||||
'B': Port([0, 0], rotation=pi, ptype=0),
|
'B': Port([0, 0], rotation=pi),
|
||||||
}
|
}
|
||||||
else:
|
else:
|
||||||
self.ports = copy.deepcopy(ports)
|
self.ports = copy.deepcopy(ports)
|
||||||
@ -597,8 +597,8 @@ class Device(Copyable, Mirrorable):
|
|||||||
|
|
||||||
s_offsets = numpy.array([p.offset for p in s_ports.values()])
|
s_offsets = numpy.array([p.offset for p in s_ports.values()])
|
||||||
o_offsets = numpy.array([p.offset for p in o_ports.values()])
|
o_offsets = numpy.array([p.offset for p in o_ports.values()])
|
||||||
s_types = numpy.array([p.ptype for p in s_ports.values()], dtype=int)
|
s_types = [p.ptype for p in s_ports.values()]
|
||||||
o_types = numpy.array([p.ptype for p in o_ports.values()], dtype=int)
|
o_types = [p.ptype for p in o_ports.values()]
|
||||||
|
|
||||||
s_rotations = numpy.array([p.rotation if p.rotation is not None else 0 for p in s_ports.values()])
|
s_rotations = numpy.array([p.rotation if p.rotation is not None else 0 for p in s_ports.values()])
|
||||||
o_rotations = numpy.array([p.rotation if p.rotation is not None else 0 for p in o_ports.values()])
|
o_rotations = numpy.array([p.rotation if p.rotation is not None else 0 for p in o_ports.values()])
|
||||||
@ -614,7 +614,7 @@ class Device(Copyable, Mirrorable):
|
|||||||
o_rotations *= -1
|
o_rotations *= -1
|
||||||
o_rotations += pi
|
o_rotations += pi
|
||||||
|
|
||||||
type_conflicts = (s_types != o_types) & (s_types != 0) & (o_types != 0)
|
type_conflicts = numpy.array([st != ot and st != 'unk' and ot != 'unk' for st, ot in (s_types, o_types)])
|
||||||
if type_conflicts.any():
|
if type_conflicts.any():
|
||||||
ports = numpy.where(type_conflicts)
|
ports = numpy.where(type_conflicts)
|
||||||
msg = 'Ports have conflicting types:\n'
|
msg = 'Ports have conflicting types:\n'
|
||||||
|
Loading…
Reference in New Issue
Block a user