11__all__ = ["core" ,"entities" ,"geometries" ,"materials" ,"collision" ,"visual" ]
22
33import Sofa .Core
4+ from stlib .core .basePrefab import BasePrefab
5+
46def __genericAdd (self : Sofa .Core .Node , typeName , ** kwargs ):
57 def findName (cname , names ):
68 """Compute a working unique name in the node"""
@@ -11,37 +13,47 @@ def findName(cname, names):
1113 rname = cname + str (i + 1 )
1214 return rname
1315
16+
17+ def checkName (context : Sofa .Core .Node , name ):
18+ # Check if the name already exists, if this happens, create a new one.
19+ if name in context .children or name in context .objects :
20+ names = {node .name .value for node in context .children }
21+ names = names .union ({object .name .value for object in context .objects })
22+ name = findName (name , names )
23+ return name
24+
25+
1426 # Check if a name is provided, if not, use the one of the class
1527 params = kwargs .copy ()
16- isNode = False
17- if "name" not in params :
28+ if isinstance (typeName , type ) and issubclass (typeName , BasePrefab ): #Only for prefabs
29+ if len (params .keys ()) > 1 or (len (params .keys ()) == 1 and "parameters" not in params ):
30+ raise RuntimeError ("Invalid argument, a prefab takes only the \" parameters\" kwargs as input" )
31+
32+ elif "name" not in params : #This doesn't apply to prefab
1833 if isinstance (typeName , str ):
1934 params ["name" ] = typeName
20- isNode = True
2135 elif isinstance (typeName , type ) and issubclass (typeName , Sofa .Core .Node ):
22- params ["name" ] = "Node"
23- isNode = True
36+ params ["name" ] = typeName .__name__
2437 elif isinstance (typeName , Sofa .Core .Node ):
2538 params ["name" ] = "Node"
26- isNode = True
2739 elif isinstance (typeName , type ) and issubclass (typeName , Sofa .Core .Object ):
2840 params ["name" ] = typeName .name .value
2941 elif isinstance (typeName , type ) and issubclass (typeName , Sofa .Core .ObjectDeclaration ):
3042 params ["name" ] = typeName .__name__
3143 else :
3244 raise RuntimeError ("Invalid argument " , typeName )
3345
34- # Check if the name already exists, if this happens, create a new one.
35- if params ["name" ] in self .children or params ["name" ] in self .objects :
36- names = {node .name .value for node in self .children }
37- names = names .union ({object .name .value for object in self .objects })
38- params ["name" ] = findName (params ["name" ], names )
46+ if isinstance (typeName , type ) and issubclass (typeName , BasePrefab ) and len (params .keys ()) == 1 :
47+ params ["parameters" ].name = checkName (self , params ["parameters" ].name )
48+ else :
49+ params ["name" ] = checkName (self , params ["name" ])
3950
4051 # Dispatch the creation to either addObject or addChild
41- if isinstance (typeName , type ) and issubclass (typeName , Sofa .Core .Node ):
42- pref = self .addChild (typeName (params ["name" ]))
52+ if isinstance (typeName , type ) and issubclass (typeName , BasePrefab ):
53+ pref = self .addChild (typeName (** params ))
54+ pref .init ()
4355 elif isinstance (typeName , Sofa .Core .Node ):
44- pref = self .addChild (typeName )
56+ pref = self .addChild (typeName ( ** params ) )
4557 elif isinstance (typeName , type ) and issubclass (typeName , Sofa .Core .Object ):
4658 pref = self .addObject (typeName (** params ))
4759 elif isinstance (typeName , type ) and issubclass (typeName , Sofa .Core .ObjectDeclaration ):
0 commit comments