Skip to content

Commit ae1d496

Browse files
[Prefabs] cleaning to fix deformable example (#549)
* cleaning to fix deformable example * Restore checks on name and add check on the presence of parameters * Allow to use default parameters (passing nothing to the add method except the class name --------- Co-authored-by: Paul Baksic <[email protected]>
1 parent 75fa28f commit ae1d496

File tree

6 files changed

+45
-31
lines changed

6 files changed

+45
-31
lines changed

splib/mechanics/mass.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@ def addMass(node, elem:ElementType, totalMass=DEFAULT_VALUE, massDensity=DEFAULT
1111
print("[warning] You defined the totalMass and the massDensity in the same time, only taking massDensity into account")
1212
del kwargs["massDensity"]
1313

14-
if(elem !=ElementType.POINTS and elem !=ElementType.EDGES):
15-
node.addObject("MeshMatrixMass",name="mass", totalMass=totalMass, massDensity=massDensity, lumping=lumping, **kwargs)
16-
else:
17-
if (not isDefault(massDensity)) :
18-
print("[warning] mass density can only be used on a surface or volumetric topology. Please use totalMass instead")
19-
if (not isDefault(lumping)) :
20-
print("[warning] lumping can only be set for surface or volumetric topology")
14+
# if(elem !=ElementType.POINTS and elem !=ElementType.EDGES):
15+
# node.addObject("MeshMatrixMass",name="mass", totalMass=totalMass, massDensity=massDensity, lumping=lumping, **kwargs)
16+
# else:
17+
# if (not isDefault(massDensity)) :
18+
# print("[warning] mass density can only be used on a surface or volumetric topology. Please use totalMass instead")
19+
# if (not isDefault(lumping)) :
20+
# print("[warning] lumping can only be set for surface or volumetric topology")
2121

22-
node.addObject("UniformMass",name="mass", totalMass=totalMass, **kwargs)
22+
node.addObject("UniformMass",name="mass", totalMass=totalMass, **kwargs)
2323

stlib/__init__.py

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
__all__ = ["core","entities","geometries","materials","collision","visual"]
22

33
import Sofa.Core
4+
from stlib.core.basePrefab import BasePrefab
5+
46
def __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):

stlib/core/basePrefab.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ class BasePrefab(Sofa.Core.Node):
88
A Prefab is a Sofa.Node that assembles a set of components and nodes
99
"""
1010

11-
def __init__(self, params: BasePrefabParameters):
12-
Sofa.Core.Node.__init__(self, name=params.name)
13-
self.parameters = params
11+
def __init__(self, parameters: BasePrefabParameters):
12+
Sofa.Core.Node.__init__(self, name=parameters.name)
13+
self.parameters = parameters
1414

1515
def init(self):
1616
raise NotImplemented("To be overridden by child class")

stlib/entities/__entity__.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,22 +43,22 @@ def __init__(self, parameters=EntityParameters(), **kwargs):
4343

4444

4545
def init(self):
46-
self.geometry = self.add(Geometry, self.parameters.geometry)
46+
self.geometry = self.add(Geometry, parameters=self.parameters.geometry)
4747

4848
### Check compatilibility of Material
4949
if self.parameters.material.stateType != self.parameters.stateType:
5050
print("WARNING: imcompatibility between templates of both the entity and the material")
5151
self.parameters.material.stateType = self.parameters.stateType
5252

53-
self.material = self.add(Material, self.parameters.material)
53+
self.material = self.add(Material, parameters=self.parameters.material)
5454
self.material.States.position.parent = self.geometry.container.position.linkpath
5555

5656
if self.parameters.collision is not None:
57-
self.collision = self.add(Collision, self.parameters.collision)
57+
self.collision = self.add(Collision, parameters=self.parameters.collision)
5858
self.addMapping(self.collision)
5959

6060
if self.parameters.visual is not None:
61-
self.visual = self.add(Visual, self.parameters.visual)
61+
self.visual = self.add(Visual, parameters=self.parameters.visual)
6262
self.addMapping(self.visual)
6363

6464

stlib/materials/deformable.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ def createScene(root) :
2929
from stlib.visual import VisualParameters
3030
from stlib.geometries.file import FileParameters
3131

32+
root.addObject('RequiredPlugin', name='Sofa.Component.Visual') # Needed to use components [VisualStyle]
3233
root.addObject("VisualStyle", displayFlags=["showBehavior"])
3334

3435
bunnyParameters = EntityParameters()
@@ -42,4 +43,5 @@ def createScene(root) :
4243
# destinationType=ElementType.TRIANGLES)
4344
bunnyParameters.visual.geometry = FileParameters(filename="mesh/Bunny.stl")
4445
bunnyParameters.visual.color = [1, 1, 1, 0.5]
45-
bunny = root.add(Entity, bunnyParameters)
46+
bunny = root.add(Entity, parameters=bunnyParameters)
47+
# bunny.init()

stlib/visual.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def __init__(self, parameters: VisualParameters):
2121
BasePrefab.__init__(self, parameters)
2222

2323
def init(self):
24-
self.geometry = self.add(Geometry, self.parameters.geometry)
24+
self.geometry = self.add(Geometry, parameters=self.parameters.geometry)
2525
self.addObject("OglModel", color=self.parameters.color, src=self.geometry.container.linkpath)
2626

2727

0 commit comments

Comments
 (0)