@@ -750,6 +750,99 @@ def _combine_property(self, other, name, allow_duplicates=True):
750750            new_prop .update (getattr (other , name ))
751751            return  new_prop 
752752
753+     def  _combine_property_2 (self , other , name , allow_duplicates = True ):
754+         """ 
755+         Combine a property from two components during component addition. 
756+ 
757+         This method handles the merging of component properties when two structural 
758+         components are combined using the `+` operator. It handles different data types 
759+         appropriately and provides control over duplicate handling for list properties. 
760+ 
761+         Parameters 
762+         ---------- 
763+         other : Component 
764+             The other component whose property is being combined with this one. 
765+         name : str 
766+             The name of the property to combine (e.g., 'state_names', 'param_names'). 
767+         allow_duplicates : bool, default True 
768+             Controls duplicate handling for list properties: 
769+             - True: Concatenates lists directly, preserving duplicates 
770+             - False: Adds only items from `other` that aren't already in `self` 
771+ 
772+         Returns 
773+         ------- 
774+         Any 
775+             Combined property value with type depending on the property type: 
776+             - list: Concatenated lists (with or without deduplication) 
777+             - dict: Merged dictionaries (other overwrites self for same keys) 
778+             - scalar/array: Single value (if identical) or error (if different) 
779+ 
780+         Raises 
781+         ------ 
782+         ValueError 
783+             When scalar properties have different non-None values that cannot be 
784+             automatically combined, indicating unclear user intent. 
785+         """ 
786+         self_prop  =  getattr (self , name )
787+         other_prop  =  getattr (other , name )
788+ 
789+         if  isinstance (self_prop , list ) and  allow_duplicates :
790+             return  self_prop  +  other_prop 
791+         elif  isinstance (self_prop , list ) and  not  allow_duplicates :
792+             return  self_prop  +  [x  for  x  in  other_prop  if  x  not  in   self_prop ]
793+         elif  isinstance (self_prop , dict ):
794+             new_prop  =  self_prop .copy ()
795+             new_prop .update (other_prop )
796+             return  new_prop 
797+         else :
798+             # NEW: Handle cases where self_prop is not a list or dict 
799+             import  numpy  as  np 
800+ 
801+             # Handle numpy arrays specially 
802+             if  isinstance (self_prop , np .ndarray ) and  isinstance (other_prop , np .ndarray ):
803+                 if  np .array_equal (self_prop , other_prop ):
804+                     return  self_prop 
805+                 else :
806+                     # Convert to list for combination when arrays are different 
807+                     return  (
808+                         list (self_prop ) +  [x  for  x  in  other_prop  if  x  not  in   self_prop ]
809+                         if  not  allow_duplicates 
810+                         else  list (self_prop ) +  list (other_prop )
811+                     )
812+             elif  isinstance (self_prop , np .ndarray ) or  isinstance (other_prop , np .ndarray ):
813+                 # One is array, one is not - convert to list 
814+                 self_list  =  (
815+                     list (self_prop )
816+                     if  isinstance (self_prop , np .ndarray )
817+                     else  [self_prop ]
818+                     if  self_prop  is  not   None 
819+                     else  []
820+                 )
821+                 other_list  =  (
822+                     list (other_prop )
823+                     if  isinstance (other_prop , np .ndarray )
824+                     else  [other_prop ]
825+                     if  other_prop  is  not   None 
826+                     else  []
827+                 )
828+                 return  (
829+                     self_list  +  [x  for  x  in  other_list  if  x  not  in   self_list ]
830+                     if  not  allow_duplicates 
831+                     else  self_list  +  other_list 
832+                 )
833+             elif  self_prop  ==  other_prop :
834+                 return  self_prop 
835+             elif  self_prop  is  None  and  other_prop  is  not   None :
836+                 return  other_prop 
837+             elif  self_prop  is  not   None  and  other_prop  is  None :
838+                 return  self_prop 
839+             else :
840+                 # Different non-None values - this might indicate a problem 
841+                 raise  ValueError (
842+                     f"Cannot combine property '{ name }  ': component values are different " 
843+                     f"({ self_prop }   vs { other_prop }  ) and cannot be automatically combined" 
844+                 )
845+ 
753846    def  _combine_component_info (self , other ):
754847        combined_info  =  {}
755848        for  key , value  in  self ._component_info .items ():
0 commit comments