diff --git a/examples/stlib/PrefabScene_beginner.py b/examples/stlib/PrefabScene_beginner.py index ca59a63e..2c4552c5 100644 --- a/examples/stlib/PrefabScene_beginner.py +++ b/examples/stlib/PrefabScene_beginner.py @@ -1,7 +1,7 @@ -from stlib.entities.rigid import Rigid -from stlib.entities.deformable import Deformable -from stlib.geometry.cube import CubeParameters -from stlib.geometry.file import FileParameters +from stlib.materials.rigid import Rigid +from stlib.materials.deformable import Deformable +from stlib.geometries.cube import CubeParameters +from stlib.geometries.file import FileParameters from splib.simulation.headers import setupLagrangianCollision from splib.simulation.linear_solvers import addLinearSolver from splib.simulation.ode_solvers import addImplicitODE diff --git a/stlib/__init__.py b/stlib/__init__.py index 01c21a40..94db0b9c 100644 --- a/stlib/__init__.py +++ b/stlib/__init__.py @@ -1,4 +1,4 @@ -__all__ = ["core","entities","prefabs","shapes"] +__all__ = ["core","entities","geometries","materials","collision","visual"] import Sofa.Core def __genericAdd(self : Sofa.Core.Node, typeName, **kwargs): @@ -11,7 +11,7 @@ def findName(cname, names): rname = cname + str(i+1) return rname - # Check if a name is provided, if not, use the one of the class + # Check if a name is provided, if not, use the one of the class params = kwargs.copy() isNode = False if "name" not in params: @@ -31,7 +31,7 @@ def findName(cname, names): else: raise RuntimeError("Invalid argument ", typeName) - # Check if the name already exists, if this happens, create a new one. + # 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}) diff --git a/stlib/prefabs/collision.py b/stlib/collision.py similarity index 92% rename from stlib/prefabs/collision.py rename to stlib/collision.py index aba95d68..ebffd7b7 100644 --- a/stlib/prefabs/collision.py +++ b/stlib/collision.py @@ -1,7 +1,7 @@ from stlib.core.basePrefab import BasePrefab -from stlib.core.baseParameters import BaseParameters, Callable, Optional, dataclasses, Any -from stlib.geometry import Geometry, GeometryParameters -from stlib.geometry.file import FileParameters +from stlib.core.baseParameters import BaseParameters, Optional, dataclasses +from stlib.geometries import Geometry, GeometryParameters +from stlib.geometries.file import FileParameters from splib.core.enum_types import CollisionPrimitive from splib.core.utils import DEFAULT_VALUE from splib.mechanics.collision_model import addCollisionModels diff --git a/stlib/entities/__entity__.py b/stlib/entities/__entity__.py index d8d5d8ca..a60aa5a4 100644 --- a/stlib/entities/__entity__.py +++ b/stlib/entities/__entity__.py @@ -1,15 +1,12 @@ from stlib.core.baseParameters import BaseParameters -from stlib.core.basePrefab import BasePrefab -from stlib.prefabs.collision import CollisionParameters, Collision -from stlib.prefabs.visual import VisualParameters, Visual -from stlib.prefabs.material import Material, MaterialParameters -from stlib.geometry import Geometry -from stlib.geometry.extract import ExtractParameters +from stlib.collision import CollisionParameters, Collision +from stlib.visual import VisualParameters, Visual +from stlib.materials import Material, MaterialParameters +from stlib.geometries import Geometry import dataclasses -from typing import Callable, Optional, overload, Any -from stlib.geometry import GeometryParameters +from typing import Callable, Optional +from stlib.geometries import GeometryParameters from splib.core.enum_types import StateType -import Sofa from stlib.core.basePrefab import BasePrefab diff --git a/stlib/entities/deformable/__init__.py b/stlib/entities/deformable/__init__.py deleted file mode 100644 index d17dc4db..00000000 --- a/stlib/entities/deformable/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from .__deformable__ import * -from .__parameters__ import * \ No newline at end of file diff --git a/stlib/entities/rigid/__init__.py b/stlib/entities/rigid/__init__.py deleted file mode 100644 index 04efc302..00000000 --- a/stlib/entities/rigid/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .__rigid__ import * \ No newline at end of file diff --git a/stlib/entities/rigid/__parameters__.py b/stlib/entities/rigid/__parameters__.py deleted file mode 100644 index f7be03c7..00000000 --- a/stlib/entities/rigid/__parameters__.py +++ /dev/null @@ -1,11 +0,0 @@ -from stlib.core.baseParameters import BaseParameters, Callable, Optional, dataclasses -from stlib.geometry import GeometryParameters - -@dataclasses.dataclass -class RigidParameters(BaseParameters): - - geometry : GeometryParameters - mass : Optional[float] = None - - def toDict(self): - return dataclasses.asdict(self) diff --git a/stlib/entities/rigid/__rigid__.py b/stlib/entities/rigid/__rigid__.py deleted file mode 100644 index 69c68f6d..00000000 --- a/stlib/entities/rigid/__rigid__.py +++ /dev/null @@ -1,15 +0,0 @@ -from stlib.entities import Entity -from stlib.entities.rigid.__parameters__ import RigidParameters - -import dataclasses - - -class Rigid(Entity): - - @staticmethod - def getParameters(**kwargs) -> RigidParameters: - return RigidParameters(**kwargs) - - - def __init__(self, **kwargs): - Entity.__init__(self, **kwargs) diff --git a/stlib/geometry/__geometry__.py b/stlib/geometries/__geometry__.py similarity index 100% rename from stlib/geometry/__geometry__.py rename to stlib/geometries/__geometry__.py diff --git a/stlib/geometry/__init__.py b/stlib/geometries/__init__.py similarity index 100% rename from stlib/geometry/__init__.py rename to stlib/geometries/__init__.py diff --git a/stlib/geometry/cube.py b/stlib/geometries/cube.py similarity index 91% rename from stlib/geometry/cube.py rename to stlib/geometries/cube.py index 0c8ac761..4d5a52ca 100644 --- a/stlib/geometry/cube.py +++ b/stlib/geometries/cube.py @@ -1,4 +1,4 @@ -from stlib.geometry import GeometryParameters +from stlib.geometries import GeometryParameters class CubeParameters(GeometryParameters): def __init__(self, center, edgeLength, pointPerEdge, dynamicTopology = False): diff --git a/stlib/geometry/extract.py b/stlib/geometries/extract.py similarity index 97% rename from stlib/geometry/extract.py rename to stlib/geometries/extract.py index c2024966..7143fb07 100644 --- a/stlib/geometry/extract.py +++ b/stlib/geometries/extract.py @@ -1,4 +1,4 @@ -from stlib.geometry import GeometryParameters, InternalDataProvider, Geometry +from stlib.geometries import GeometryParameters, InternalDataProvider, Geometry from stlib.core.baseParameters import dataclasses from splib.topology.dynamic import addDynamicTopology from splib.topology.loader import loadMesh diff --git a/stlib/geometry/file.py b/stlib/geometries/file.py similarity index 93% rename from stlib/geometry/file.py rename to stlib/geometries/file.py index cc51c077..b057728c 100644 --- a/stlib/geometry/file.py +++ b/stlib/geometries/file.py @@ -1,4 +1,4 @@ -from stlib.geometry import GeometryParameters, InternalDataProvider, Geometry +from stlib.geometries import GeometryParameters, InternalDataProvider, Geometry from stlib.core.baseParameters import dataclasses from splib.topology.loader import loadMesh from splib.core.enum_types import ElementType diff --git a/stlib/geometry/sphere.py b/stlib/geometries/sphere.py similarity index 90% rename from stlib/geometry/sphere.py rename to stlib/geometries/sphere.py index 2c3a58ce..2cb64f6e 100644 --- a/stlib/geometry/sphere.py +++ b/stlib/geometries/sphere.py @@ -1,4 +1,4 @@ -from stlib.geometry import GeometryParameters +from stlib.geometries import GeometryParameters class SphereParameters(GeometryParameters): def __init__(self, center, radius, pointPerRad, dynamicTopology = False): diff --git a/stlib/materials/__init__.py b/stlib/materials/__init__.py new file mode 100644 index 00000000..6a748749 --- /dev/null +++ b/stlib/materials/__init__.py @@ -0,0 +1 @@ +from .__material__ import * \ No newline at end of file diff --git a/stlib/prefabs/material.py b/stlib/materials/__material__.py similarity index 98% rename from stlib/prefabs/material.py rename to stlib/materials/__material__.py index 070c7ac5..ff88dbd4 100644 --- a/stlib/prefabs/material.py +++ b/stlib/materials/__material__.py @@ -11,7 +11,7 @@ class MaterialParameters(BaseParameters): massDensity : float = DEFAULT_VALUE massLumping : bool = DEFAULT_VALUE - + stateType : StateType = StateType.VEC3 addMaterial : Optional[Callable] = lambda node : addMass(node, node.parameters.stateType, massDensity=node.parameters.massDensity, lumping=node.parameters.massLumping) @@ -24,7 +24,7 @@ class Material(BasePrefab): def __init__(self, parameters: MaterialParameters): BasePrefab.__init__(self, parameters) - + def init(self): self.addObject("MechanicalObject", name="States", template=str(self.parameters.stateType)) diff --git a/stlib/entities/deformable/__deformable__.py b/stlib/materials/deformable.py similarity index 88% rename from stlib/entities/deformable/__deformable__.py rename to stlib/materials/deformable.py index 4cbdf129..cb424ed4 100644 --- a/stlib/entities/deformable/__deformable__.py +++ b/stlib/materials/deformable.py @@ -1,5 +1,5 @@ -from stlib.prefabs.material import MaterialParameters -from splib.core.enum_types import ConstitutiveLaw, ElementType +from stlib.materials import MaterialParameters +from splib.core.enum_types import ConstitutiveLaw from stlib.core.baseParameters import Callable, Optional, dataclasses from splib.mechanics.linear_elasticity import * from splib.mechanics.hyperelasticity import * @@ -26,9 +26,8 @@ def __addDeformableMaterial(node): def createScene(root) : from stlib.entities import Entity, EntityParameters - from stlib.prefabs.visual import VisualParameters - from stlib.geometry.extract import ExtractParameters - from stlib.geometry.file import FileParameters + from stlib.visual import VisualParameters + from stlib.geometries.file import FileParameters root.addObject("VisualStyle", displayFlags=["showBehavior"]) diff --git a/stlib/materials/rigid.py b/stlib/materials/rigid.py new file mode 100644 index 00000000..5668b356 --- /dev/null +++ b/stlib/materials/rigid.py @@ -0,0 +1,13 @@ +from stlib.core.baseParameters import BaseParameters, Optional, dataclasses +from stlib.geometries import GeometryParameters + + + +@dataclasses.dataclass +class RigidParameters(BaseParameters): + + geometry : GeometryParameters + mass : Optional[float] = None + + def toDict(self): + return dataclasses.asdict(self) diff --git a/stlib/misc/entity.py b/stlib/misc/entity.py deleted file mode 100644 index a3549b08..00000000 --- a/stlib/misc/entity.py +++ /dev/null @@ -1,188 +0,0 @@ -from typing import Callable, Optional, overload - -import Sofa -import dataclasses - -def addBidule(self): - return self.addChild("Bidule") - -DEFAULT_VALUE = object() - -def NONE(*args, **kwargs): - pass - -def to_dict(o): - if isinstance(o, dict): - return o - if hasattr(o, "to_dict"): - return o.to_dict() - return {} - -@dataclasses.dataclass -class PrefabParameters(object): - name : str = "Prefab" - kwargs : dict = dataclasses.field(default_factory=dict) - - def __getattr__(self, name: str) : - if name == "__getstate__": - getattr(PrefabParameters, "__getstate__") - if name == "__setstate__": - getattr(PrefabParameters, "__setstate__") - - try: - a = self.__getattribute__(name) - except Exception as e: - return NONE - return a - - def to_dict(self): - return dataclasses.asdict(self) - -@dataclasses.dataclass -class VisualModelParameters(PrefabParameters): - name : str = "VisualModel" - - filename : str = "mesh/sphere_02.obj" - - renderer : dict = dataclasses.field(default_factory=dict) - mapping : dict = dataclasses.field(default_factory=dict) - -class VisualModel(Sofa.Core.Node): - - def __init__(self, parent=None, parameters : VisualModelParameters = VisualModelParameters()): - Sofa.Core.Node.__init__(self, name=parameters.name) - - if parent != None: - parent.addChild(self) - - self.addObject("MeshOBJLoader", name="loader", filename=parameters.filename) - self.addRenderer(**to_dict(parameters.renderer) | {"src" : "@loader"} ) - self.addMapping(**to_dict(parameters.mapping) ) - - def addRenderer(self, **kwargs): - self.addObject("OglModel", name="renderer", **kwargs) - - def addMapping(self, **kwargs): - self.addObject("RigidMapping", name="mapping", **kwargs) - -class CollisionModel(Sofa.Core.BasePrefab): - def __init__(self, parameters, **kwargs): - Sofa.Core.Node.__init__(self, **kwargs) - - class Parameters(object): - enabled : bool = False - -class MechanicalObject(Sofa.Core.Object): - positions : list[float] - - @dataclasses.dataclass - class Parameters(object): - name : str = "MechanicalObject" - - def to_dict(self): - return dataclasses.asdict(self) - - -@dataclasses.dataclass -class SimulationParameters(PrefabParameters): - name : str = "Simulation" - iterations : Optional[int] = None - template: Optional[str] = None - solver : dict = dataclasses.field(default_factory=dict) - integration : dict = dataclasses.field(default_factory=dict) - - def to_dict(self): - return self.asdict() - -class Simulation(Sofa.Core.Node): - solver : Sofa.Core.Object - integration : Sofa.Core.Object - iterations : int - - def __init__(self, parent : Sofa.Core.Node = None, parameters : SimulationParameters = SimulationParameters()): - Sofa.Core.Node.__init__(self, name=parameters.name) - if parent is not None: - parent.addChild(self) - - if parameters.iterations != NONE and "iterations" in parameters.solver: - raise Exception("Cannot set direct attribute and internal hack... ") - - self.addObject("EulerImplicitSolver", name = "integration", **to_dict(parameters.integration)) - self.addObject("CGLinearSolver", name = "solver", iterations=parameters.iterations, **to_dict(parameters.solver)) - - - -#@dataclasses.dataclass -#class Solver(object): -# integrationscheme : str -# numericalsolver : str - -@dataclasses.dataclass -class EntityParameters(PrefabParameters): - name : str = "Entity" - - addSimulation : Callable = Simulation - addCollisionModel : Callable = CollisionModel - addVisualModel : Callable = VisualModel - - #setConstitutiveLaw # : Callable = addBidule - #setBoundaryCondition #: Callable = addBidule - - mechanical : dict = dataclasses.field(default_factory=dict) - collision : CollisionModel.Parameters = CollisionModel.Parameters() - visual : VisualModelParameters = VisualModelParameters() - simulation : SimulationParameters = SimulationParameters() - -class Entity(Sofa.Core.Node): - # A simulated object - simulation : Simulation - visual : VisualModel - collision : CollisionModel - - parameters : EntityParameters - - def __init__(self, parent=None, parameters=EntityParameters(), **kwargs): - Sofa.Core.Node.__init__(self, name=parameters.name) - - if parent is not None: - parent.addChild(self) - - self.parameters = parameters - - self.addMechanicalModel(**parameters.mechanical) - self.addSimulation(parameters=parameters.simulation) - self.addVisualModel(parameters=parameters.visual) - self.addCollisionModel() - - def addMechanicalModel(self, **kwargs): - self.addObject("MechanicalObject", **kwargs) - - def addSimulation(self, **kwargs): - self.parameters.addSimulation(self, **kwargs) - - def addVisualModel(self, **kwargs): - self.parameters.addVisualModel(self, **kwargs) - - def addCollisionModel(self): - pass - -class Rigid(Entity): - def __init__(self, **kwargs): - Entity.__init__(self, **kwargs) - - -class Deformable(Entity): - def __init__(self, **kwargs): - Entity.__init__(self, **kwargs) - -@dataclasses.dataclass -class DeformableEntityParameters(EntityParameters): - addConstitutiveLaw : Callable = lambda x: x - - mass : Optional[float] = None - - def to_dict(self): - return dataclasses.asdict(self) - - - diff --git a/stlib/misc/softrobots.py b/stlib/misc/softrobots.py deleted file mode 100644 index aca8ab50..00000000 --- a/stlib/misc/softrobots.py +++ /dev/null @@ -1,23 +0,0 @@ -class SoftRobots: - class Cable(Sofa.Core.BasePrefab): - length : float - - def __init__(self,**kwargs): - pass - - def Parameters(object): - lenght : float - -class Trunk(Sofa.Core.BasePrefab): - body : Entity.Deformable - cables : list [SoftRobots.Cable] - - def __init__(self, parameters): - body = Entity.Deformable() - - for param in range(parameters.cables): - cables.append(SoftRobots.Cable(body, param)) - - class Parameters(object): - body : Entity.Deformable.Parameters - cables : list[SoftRobots.Cable.Parameters] diff --git a/stlib/misc/test-1.py b/stlib/misc/test-1.py deleted file mode 100644 index 2b898703..00000000 --- a/stlib/misc/test-1.py +++ /dev/null @@ -1,53 +0,0 @@ -from typing import Callable, Optional, overload -import Sofa.Core - - -import entity -import entity2 - -# Monkey patch for demonstration purpose -def newAdd(self, creator, **kwargs): - if callable(creator): - creator(parent=self, **kwargs) -Sofa.Core.Node.add = newAdd - -def createScene(root): - #root.add(entity.Deformable) - #root.addChild(entity2.Deformable(root)) - - parameters = entity.Deformable.Parameters() - parameters.name = "Deformable2" - root.add(entity.Deformable, parameters=auto_load) - - #def addCustomVisual(self, **kwargs): - # Rigid.addVisualModel( mapping={"toto":"in"} ) - - #parameters = Entity.Parameters() - #parameters.addVisualModel = addCustomVisual - #root.add(Entity, parameters) - - #  - #parameters = Rigid.new_parameters() - #parameters.mass = 4.5 - #root.add(Entity, parameters) - #root.add(Entity) - - #parameters.addVisualModelOverride = addCustomVisual - - ###  - #Entity._addVisualModel = addCustomVisual - #root.add(Entity, parameters) - - #root.add(Entity.Rigid) - #root.add(Entity.Deformable) - - #root.add(Entity) - #root.add(VisualModel, parameters) - - #root.add(VisualModel) - - #parameters = Entity.Deformable.Parameters() - #parameters.visual = None - #a = root.add(Entity.Deformable, parameters) - - return root \ No newline at end of file diff --git a/stlib/misc/test2.py b/stlib/misc/test2.py deleted file mode 100644 index cdebfad1..00000000 --- a/stlib/misc/test2.py +++ /dev/null @@ -1,65 +0,0 @@ -import Sofa.Core -import copy -import entity -from entity import PrefabParameters, EntityParameters, Entity, Simulation - - -oldAdd=Sofa.Core.Node.addObject -def myAddObject(self : Sofa.Core.Node, tname, **kwargs): - kwargs = copy.copy(kwargs) - previouslen = len(self.objects) - try: - oldAdd(self, tname, **kwargs) - except Exception as e: - target = self - if len(self.objects) != previouslen: - target = list(self.objects)[-1] - Sofa.msg_error(target, str(e)) - -Sofa.Core.Node.addObject = myAddObject - - -def myAdd(self : Sofa.Core.Node, c, parameters = PrefabParameters(), **kwargs): - def findName(cname, node): - """Compute a working unique name in the node""" - rname = cname - for i in range(0, len(node.children)): - if rname not in node.children: - return rname - rname = cname + str(i+1) - return rname - - for k,v in kwargs.items(): - if hasattr(parameters, k): - setattr(parameters, k, v) - - parameters = copy.copy(parameters) - if parameters.name in self.children: - parameters.name = findName(parameters.name, self) - - return c(parent = self, parameters=parameters) -Sofa.Core.Node.add = myAdd - -def createScene(root): - #@optionalkwargs - - #def eulalieAddOde(self, **kwargs): - # self.addObject("EulerExplicitSolver", name="numericalintegration") - # self.addObject("LinearSolver", name="numericalsolver", firstOrder=True) - - parameters = EntityParameters() - parameters.simulation.iterations = 10 - parameters.simulation.integration["rayleighStiffness"] = 2.0 - parameters.addSimulation = entity.NONE - - parameters.mechanical["template"] = "Rigid3" - - #parameters.simulation.integration["rayleightStiffnessXXX"] = 2.0 - - #parameters.solver.kwargs["numericalintegration"] = { "firstOrder" : True } - - root.add(Entity, parameters) - root.add(Entity, parameters) - root.add(Entity, parameters) - - #root.add(Simulation, name="mySimulation") diff --git a/stlib/prefabs/__init__.py b/stlib/prefabs/__init__.py deleted file mode 100644 index 2d2771cf..00000000 --- a/stlib/prefabs/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__all__ = ["behavior","collision","visual"] diff --git a/stlib/prefabs/visual.py b/stlib/visual.py similarity index 90% rename from stlib/prefabs/visual.py rename to stlib/visual.py index 2ced99a7..271aad3c 100644 --- a/stlib/prefabs/visual.py +++ b/stlib/visual.py @@ -1,7 +1,7 @@ from stlib.core.basePrefab import BasePrefab -from stlib.core.baseParameters import BaseParameters, Optional, dataclasses, Any -from stlib.geometry import Geometry, GeometryParameters -from stlib.geometry.file import FileParameters +from stlib.core.baseParameters import BaseParameters, Optional, dataclasses +from stlib.geometries import Geometry, GeometryParameters +from stlib.geometries.file import FileParameters from splib.core.utils import DEFAULT_VALUE from Sofa.Core import Object