@@ -210,12 +210,32 @@ def __post_init__(self):
210210
211211 self .designator = remove_links (self .designator )
212212
213+ @dataclass
214+ class Loop ():
215+ first : PinClass = None
216+ second : PinClass = None
217+ side : Side = None
218+ show_label : bool = True
219+
220+ def __post_init__ (self ):
221+ if self .side .upper () == 'LEFT' :
222+ self .side = Side .LEFT
223+ elif self .side .upper () == 'RIGHT' :
224+ self .side = Side .RIGHT
225+
226+ @property
227+ def label (self ):
228+ if self .show_label :
229+ return f'{ self .first } <->{ self .second } '
230+ else :
231+ return ''
232+
213233
214234@dataclass
215235class Connector (GraphicalComponent ):
216236 # connector-specific properties
217237 style : Optional [str ] = None
218- loops : List [List [ Pin ] ] = field (default_factory = list )
238+ loops : List [Loop ] = field (default_factory = list )
219239 # pin information in particular
220240 pincount : Optional [int ] = None
221241 pins : List [Pin ] = field (default_factory = list ) # legacy
@@ -308,6 +328,7 @@ def to_int_pin(pin):
308328 return pin
309329 self .pins = [to_int_pin (p ) for p in self .pins ]
310330
331+
311332 # all checks have passed
312333 pin_tuples = zip_longest (
313334 self .pins ,
@@ -332,17 +353,41 @@ def to_int_pin(pin):
332353 # hide pincount for simple (1 pin) connectors by default
333354 self .show_pincount = self .style != "simple"
334355
335- self .loops = [[to_int_pin (p ) for p in loop ] for loop in self .loops ]
356+ def get_pin_object (value ):
357+ pin_id = None
358+ if value in self .pinlabels :
359+ pin_id = self .pins [self .pinlabels .index (value )]
360+ else :
361+ err = f'{ value } not found in { self .pinlabels } '
362+ try :
363+ value = int (value )
364+ except ValueError as exc :
365+ raise ValueError (f'{ err } and is not an int' )
366+
367+ if value in self .pins :
368+ pin_id = value
369+
370+ if pin_id is not None :
371+ return self .pin_objects [pin_id ]
372+
373+ raise ValueError (f'{ err } and is not one of the pins { self .pins } ' )
374+
375+ self .loops = [Loop (
376+ first = get_pin_object (loop ['first' ]),
377+ second = get_pin_object (loop ['second' ]),
378+ side = loop .get ('side' ),
379+ show_label = loop .get ('show_label' , True ),
380+ ) for loop in self .loops ]
381+
382+
383+ #self.loops = [[to_int_pin(p) for p in loop] for loop in self.loops]
336384 for loop in self .loops :
337385 # TODO: check that pins to connect actually exist
338386 # TODO: allow using pin labels in addition to pin numbers,
339387 # just like when defining regular connections
340388 # TODO: include properties of wire used to create the loop
341- if len (loop ) != 2 :
342- raise Exception ("Loops must be between exactly two pins!" )
343- # side=None, determine side to show loops during rendering
344- self .activate_pin (loop [0 ], side = None , is_connection = True )
345- self .activate_pin (loop [1 ], side = None , is_connection = True )
389+ self .activate_pin (loop .first .id , side = loop .side , is_connection = True )
390+ self .activate_pin (loop .second .id , side = loop .side , is_connection = True )
346391
347392 def activate_pin (self , pin_id , side : Side = None , is_connection = True ) -> None :
348393 if is_connection :
0 commit comments