@@ -434,15 +434,44 @@ def _addConnection(self, cref1: CRef, cref2: CRef) -> None:
434434 # Add the connections to top level system
435435 self .addConnection (start_element , start_connector , end_element , end_connector )
436436
437- def addConnection (self , startElement : str , startConnector : str , endElement : str , endConnector : str ):
438- #TODO: Fix this check for Connection class
439- #if (startElement, startConnector, endElement, endConnector) in self.connections:
440- # raise ValueError(f"Connection '{startElement}.{startConnector}' to '{endElement}.{endConnector}' already exists")
437+ def isConnectorAlreadyConnected (self , startElement : str , startConnector : str , endElement : str , endConnector : str ):
438+ """Check if a connection is valid in the system."""
439+ for conn in self .connections :
440+ if (conn .startElement == startElement and conn .startConnector == startConnector and
441+ conn .endElement == endElement and conn .endConnector == endConnector ):
442+ raise ValueError (f"Connection from '{ startElement } .{ startConnector } ' to '{ endElement } .{ endConnector } ' already exists" )
443+
444+ def _findConnector (self , element_name , connector_name ):
445+ """Returns (owner_string, causality) or (None, None) if not found."""
446+ connectors = (
447+ self .connectors # System level
448+ if not element_name else
449+ self .elements [CRef (element_name )].connectors # Element level
450+ )
451+ for con in connectors :
452+ if str (con .name ) == str (connector_name ):
453+ owner_str = "System" if not element_name else "Element"
454+ return (owner_str , con .causality )
455+
456+ raise ValueError (f"Connector '{ connector_name } ' not found in element '{ element_name or self .name } '" )
441457
442- #if (endElement, endConnector, startElement, startConnector) in self.connections:
443- # raise ValueError(f"Connection '{startElement}.{startConnector}' to '{endElement}.{endConnector}' already exists")
458+ def addConnection (self , startElement : str , startConnector : str , endElement : str , endConnector : str ):
459+ """Adds a connection to the system."""
460+ # Resolve source connector owner and causality
461+ (source_owner , source_kind ) = self ._findConnector (startElement , startConnector )
462+ # Resolve destination connector owner and causality
463+ (dest_owner , dest_kind ) = self ._findConnector (endElement , endConnector )
464+
465+ if Connection .is_validConnection (source_owner , source_kind , dest_owner , dest_kind ):
466+ self .isConnectorAlreadyConnected (startElement , startConnector , endElement , endConnector )
467+ self .connections .append (Connection (startElement , startConnector , endElement , endConnector ))
468+ # flipped connection
469+ elif Connection .is_validConnection (dest_owner , dest_kind , source_owner , source_kind ):
470+ self .isConnectorAlreadyConnected (endElement , endConnector , startElement , startConnector )
471+ self .connections .append (Connection (endElement , endConnector , startElement , startConnector ))
472+ else :
473+ raise ValueError (f"info: Invalid connection from '{ startElement } .{ startConnector } '->'{ endElement } .{ endConnector } ' as causality are violated with '{ source_owner } .{ source_kind .name } ' -> '{ dest_owner } .{ dest_kind .name } '" )
444474
445- self .connections .append (Connection (startElement , startConnector , endElement , endConnector ))
446475
447476 def _connectorExists (self , cref : CRef , delete = False ) -> bool :
448477 """Check if a connector exists in the system."""
0 commit comments