Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions splib/mechanics/mass.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@ def addMass(node, elem:ElementType, totalMass=DEFAULT_VALUE, massDensity=DEFAULT
print("[warning] You defined the totalMass and the massDensity in the same time, only taking massDensity into account")
del kwargs["massDensity"]

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

node.addObject("UniformMass",name="mass", totalMass=totalMass, **kwargs)
node.addObject("UniformMass",name="mass", totalMass=totalMass, **kwargs)

40 changes: 26 additions & 14 deletions stlib/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
__all__ = ["core","entities","geometries","materials","collision","visual"]

import Sofa.Core
from stlib.core.basePrefab import BasePrefab

def __genericAdd(self : Sofa.Core.Node, typeName, **kwargs):
def findName(cname, names):
"""Compute a working unique name in the node"""
Expand All @@ -11,37 +13,47 @@ def findName(cname, names):
rname = cname + str(i+1)
return rname


def checkName(context : Sofa.Core.Node, name):
# Check if the name already exists, if this happens, create a new one.
if name in context.children or name in context.objects:
names = {node.name.value for node in context.children}
names = names.union({object.name.value for object in context.objects})
name = findName(name, names)
return name


# Check if a name is provided, if not, use the one of the class
params = kwargs.copy()
isNode = False
if "name" not in params:
if isinstance(typeName, type) and issubclass(typeName, BasePrefab): #Only for prefabs
if len(params.keys()) > 1 or (len(params.keys()) == 1 and "parameters" not in params):
raise RuntimeError("Invalid argument, a prefab takes only the \"parameters\" kwargs as input")

elif "name" not in params : #This doesn't apply to prefab
if isinstance(typeName, str):
params["name"] = typeName
isNode=True
elif isinstance(typeName, type) and issubclass(typeName, Sofa.Core.Node):
params["name"] = "Node"
isNode=True
params["name"] = typeName.__name__
elif isinstance(typeName, Sofa.Core.Node):
params["name"] = "Node"
isNode=True
elif isinstance(typeName, type) and issubclass(typeName, Sofa.Core.Object):
params["name"] = typeName.name.value
elif isinstance(typeName, type) and issubclass(typeName, Sofa.Core.ObjectDeclaration):
params["name"] = typeName.__name__
else:
raise RuntimeError("Invalid argument ", typeName)

# Check if the name already exists, if this happens, create a new one.
if params["name"] in self.children or params["name"] in self.objects:
names = {node.name.value for node in self.children}
names = names.union({object.name.value for object in self.objects})
params["name"] = findName(params["name"], names)
if isinstance(typeName, type) and issubclass(typeName, BasePrefab) and len(params.keys()) == 1:
params["parameters"].name = checkName(self, params["parameters"].name)
else:
params["name"] = checkName(self, params["name"])

# Dispatch the creation to either addObject or addChild
if isinstance(typeName, type) and issubclass(typeName, Sofa.Core.Node):
pref = self.addChild(typeName(params["name"]))
if isinstance(typeName, type) and issubclass(typeName, BasePrefab):
pref = self.addChild(typeName(**params))
pref.init()
elif isinstance(typeName, Sofa.Core.Node):
pref = self.addChild(typeName)
pref = self.addChild(typeName(**params))
elif isinstance(typeName, type) and issubclass(typeName, Sofa.Core.Object):
pref = self.addObject(typeName(**params))
elif isinstance(typeName, type) and issubclass(typeName, Sofa.Core.ObjectDeclaration):
Expand Down
6 changes: 3 additions & 3 deletions stlib/core/basePrefab.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ class BasePrefab(Sofa.Core.Node):
A Prefab is a Sofa.Node that assembles a set of components and nodes
"""

def __init__(self, params: BasePrefabParameters):
Sofa.Core.Node.__init__(self, name=params.name)
self.parameters = params
def __init__(self, parameters: BasePrefabParameters):
Sofa.Core.Node.__init__(self, name=parameters.name)
self.parameters = parameters

def init(self):
raise NotImplemented("To be overridden by child class")
Expand Down
8 changes: 4 additions & 4 deletions stlib/entities/__entity__.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,22 +43,22 @@ def __init__(self, parameters=EntityParameters(), **kwargs):


def init(self):
self.geometry = self.add(Geometry, self.parameters.geometry)
self.geometry = self.add(Geometry, parameters=self.parameters.geometry)

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

self.material = self.add(Material, self.parameters.material)
self.material = self.add(Material, parameters=self.parameters.material)
self.material.States.position.parent = self.geometry.container.position.linkpath

if self.parameters.collision is not None:
self.collision = self.add(Collision, self.parameters.collision)
self.collision = self.add(Collision, parameters=self.parameters.collision)
self.addMapping(self.collision)

if self.parameters.visual is not None:
self.visual = self.add(Visual, self.parameters.visual)
self.visual = self.add(Visual, parameters=self.parameters.visual)
self.addMapping(self.visual)


Expand Down
4 changes: 3 additions & 1 deletion stlib/materials/deformable.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ def createScene(root) :
from stlib.visual import VisualParameters
from stlib.geometries.file import FileParameters

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

bunnyParameters = EntityParameters()
Expand All @@ -42,4 +43,5 @@ def createScene(root) :
# destinationType=ElementType.TRIANGLES)
bunnyParameters.visual.geometry = FileParameters(filename="mesh/Bunny.stl")
bunnyParameters.visual.color = [1, 1, 1, 0.5]
bunny = root.add(Entity, bunnyParameters)
bunny = root.add(Entity, parameters=bunnyParameters)
# bunny.init()
2 changes: 1 addition & 1 deletion stlib/visual.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def __init__(self, parameters: VisualParameters):
BasePrefab.__init__(self, parameters)

def init(self):
self.geometry = self.add(Geometry, self.parameters.geometry)
self.geometry = self.add(Geometry, parameters=self.parameters.geometry)
self.addObject("OglModel", color=self.parameters.color, src=self.geometry.container.linkpath)


Expand Down
Loading