11__all__ = ["core" ,"entities" ,"geometries" ,"materials" ,"collision" ,"visual" ]
22
33import Sofa .Core
4+ from stlib .core .basePrefab import BasePrefab
45
56def __genericAdd (self : Sofa .Core .Node , typeName , ** kwargs ):
67 def findName (cname , names ):
@@ -12,30 +13,42 @@ def findName(cname, names):
1213 rname = cname + str (i + 1 )
1314 return rname
1415
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+
1526 # Check if a name is provided, if not, use the one of the class
1627 params = kwargs .copy ()
17- # if "name" not in params:
18- # if isinstance(typeName, str):
19- # params["name"] = typeName
20- # elif isinstance(typeName, type) and issubclass(typeName, Sofa.Core.Node):
21- # params["name"] = typeName.__name__
22- # elif isinstance(typeName, Sofa.Core.Node):
23- # params["name"] = "Node"
24- # elif isinstance(typeName, type) and issubclass(typeName, Sofa.Core.Object):
25- # params["name"] = typeName.name.value
26- # elif isinstance(typeName, type) and issubclass(typeName, Sofa.Core.ObjectDeclaration):
27- # params["name"] = typeName.__name__
28- # else:
29- # raise RuntimeError("Invalid argument ", typeName)
30-
31- # # Check if the name already exists, if this happens, create a new one.
32- # if params["name"] in self.children or params["name"] in self.objects:
33- # names = {node.name.value for node in self.children}
34- # names = names.union({object.name.value for object in self.objects})
35- # params["name"] = findName(params["name"], names)
28+ if isinstance (typeName , type ) and issubclass (typeName , BasePrefab ): #Only for prefabs
29+ if "parameters" not in params or len (params .keys ()) > 1 :
30+ raise RuntimeError ("Invalid argument, a prefab takes only the \" parameters\" kwargs as input" )
31+ elif "name" not in params : #This doesn't apply to prefab
32+ if isinstance (typeName , str ):
33+ params ["name" ] = typeName
34+ elif isinstance (typeName , type ) and issubclass (typeName , Sofa .Core .Node ):
35+ params ["name" ] = typeName .__name__
36+ elif isinstance (typeName , Sofa .Core .Node ):
37+ params ["name" ] = "Node"
38+ elif isinstance (typeName , type ) and issubclass (typeName , Sofa .Core .Object ):
39+ params ["name" ] = typeName .name .value
40+ elif isinstance (typeName , type ) and issubclass (typeName , Sofa .Core .ObjectDeclaration ):
41+ params ["name" ] = typeName .__name__
42+ else :
43+ raise RuntimeError ("Invalid argument " , typeName )
44+
45+ if isinstance (typeName , type ) and issubclass (typeName , BasePrefab ):
46+ params ["parameters" ].name = checkName (self , params ["parameters" ].name )
47+ else :
48+ params ["name" ] = checkName (self , params ["name" ])
3649
3750 # Dispatch the creation to either addObject or addChild
38- if isinstance (typeName , type ) and issubclass (typeName , core . basePrefab . BasePrefab ):
51+ if isinstance (typeName , type ) and issubclass (typeName , BasePrefab ):
3952 pref = self .addChild (typeName (** params ))
4053 pref .init ()
4154 elif isinstance (typeName , Sofa .Core .Node ):
0 commit comments