From 49e56dadbd9b3f17bf2dea46695b9960b9e51c74 Mon Sep 17 00:00:00 2001 From: Paul Baksic Date: Tue, 28 Oct 2025 11:41:26 +0100 Subject: [PATCH 1/4] Reorder files to match concepts --- examples/stlib/PrefabScene_beginner.py | 8 ++++---- stlib/__init__.py | 4 ++-- stlib/entities/__entity__.py | 7 ++----- stlib/entities/deformable/__init__.py | 2 -- stlib/entities/rigid/__init__.py | 1 - stlib/entities/rigid/__rigid__.py | 15 --------------- stlib/prefabs/__init__.py | 2 +- stlib/prefabs/collision.py | 6 +++--- .../geometries}/__geometry__.py | 0 .../{geometry => prefabs/geometries}/__init__.py | 0 stlib/{geometry => prefabs/geometries}/cube.py | 2 +- stlib/{geometry => prefabs/geometries}/extract.py | 2 +- stlib/{geometry => prefabs/geometries}/file.py | 2 +- stlib/{geometry => prefabs/geometries}/sphere.py | 2 +- stlib/prefabs/materials/__init__.py | 1 + .../{material.py => materials/__material__.py} | 4 ++-- .../materials/deformable.py} | 7 +++---- .../materials/rigid.py} | 8 +++++--- stlib/prefabs/visual.py | 6 +++--- 19 files changed, 30 insertions(+), 49 deletions(-) delete mode 100644 stlib/entities/deformable/__init__.py delete mode 100644 stlib/entities/rigid/__init__.py delete mode 100644 stlib/entities/rigid/__rigid__.py rename stlib/{geometry => prefabs/geometries}/__geometry__.py (100%) rename stlib/{geometry => prefabs/geometries}/__init__.py (100%) rename stlib/{geometry => prefabs/geometries}/cube.py (89%) rename stlib/{geometry => prefabs/geometries}/extract.py (97%) rename stlib/{geometry => prefabs/geometries}/file.py (93%) rename stlib/{geometry => prefabs/geometries}/sphere.py (89%) create mode 100644 stlib/prefabs/materials/__init__.py rename stlib/prefabs/{material.py => materials/__material__.py} (98%) rename stlib/{entities/deformable/__deformable__.py => prefabs/materials/deformable.py} (90%) rename stlib/{entities/rigid/__parameters__.py => prefabs/materials/rigid.py} (50%) diff --git a/examples/stlib/PrefabScene_beginner.py b/examples/stlib/PrefabScene_beginner.py index ca59a63e5..0d13e7dfc 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.prefabs.materials.rigid import Rigid +from stlib.prefabs.materials.deformable import Deformable +from stlib.prefabs.geometries.cube import CubeParameters +from stlib.prefabs.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 01c21a403..aa75d376d 100644 --- a/stlib/__init__.py +++ b/stlib/__init__.py @@ -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/entities/__entity__.py b/stlib/entities/__entity__.py index d8d5d8ca6..5f5a667bc 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 import dataclasses -from typing import Callable, Optional, overload, Any -from stlib.geometry import GeometryParameters +from typing import Callable, Optional +from stlib.prefabs.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 d17dc4db2..000000000 --- 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 04efc302b..000000000 --- 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/__rigid__.py b/stlib/entities/rigid/__rigid__.py deleted file mode 100644 index 69c68f6d0..000000000 --- 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/prefabs/__init__.py b/stlib/prefabs/__init__.py index 2d2771cfc..78a6f13b4 100644 --- a/stlib/prefabs/__init__.py +++ b/stlib/prefabs/__init__.py @@ -1 +1 @@ -__all__ = ["behavior","collision","visual"] +__all__ = ["geometries","materials","collision","visual"] diff --git a/stlib/prefabs/collision.py b/stlib/prefabs/collision.py index aba95d68b..128aa943d 100644 --- a/stlib/prefabs/collision.py +++ b/stlib/prefabs/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.prefabs.geometries import Geometry, GeometryParameters +from stlib.prefabs.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/geometry/__geometry__.py b/stlib/prefabs/geometries/__geometry__.py similarity index 100% rename from stlib/geometry/__geometry__.py rename to stlib/prefabs/geometries/__geometry__.py diff --git a/stlib/geometry/__init__.py b/stlib/prefabs/geometries/__init__.py similarity index 100% rename from stlib/geometry/__init__.py rename to stlib/prefabs/geometries/__init__.py diff --git a/stlib/geometry/cube.py b/stlib/prefabs/geometries/cube.py similarity index 89% rename from stlib/geometry/cube.py rename to stlib/prefabs/geometries/cube.py index 0c8ac7615..4f97fad10 100644 --- a/stlib/geometry/cube.py +++ b/stlib/prefabs/geometries/cube.py @@ -1,4 +1,4 @@ -from stlib.geometry import GeometryParameters +from stlib.prefabs.geometries import GeometryParameters class CubeParameters(GeometryParameters): def __init__(self, center, edgeLength, pointPerEdge, dynamicTopology = False): diff --git a/stlib/geometry/extract.py b/stlib/prefabs/geometries/extract.py similarity index 97% rename from stlib/geometry/extract.py rename to stlib/prefabs/geometries/extract.py index c20249666..eb2954821 100644 --- a/stlib/geometry/extract.py +++ b/stlib/prefabs/geometries/extract.py @@ -1,4 +1,4 @@ -from stlib.geometry import GeometryParameters, InternalDataProvider, Geometry +from stlib.prefabs.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/prefabs/geometries/file.py similarity index 93% rename from stlib/geometry/file.py rename to stlib/prefabs/geometries/file.py index cc51c077d..3bf8e9964 100644 --- a/stlib/geometry/file.py +++ b/stlib/prefabs/geometries/file.py @@ -1,4 +1,4 @@ -from stlib.geometry import GeometryParameters, InternalDataProvider, Geometry +from stlib.prefabs.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/prefabs/geometries/sphere.py similarity index 89% rename from stlib/geometry/sphere.py rename to stlib/prefabs/geometries/sphere.py index 2c3a58ce6..540c345ab 100644 --- a/stlib/geometry/sphere.py +++ b/stlib/prefabs/geometries/sphere.py @@ -1,4 +1,4 @@ -from stlib.geometry import GeometryParameters +from stlib.prefabs.geometries import GeometryParameters class SphereParameters(GeometryParameters): def __init__(self, center, radius, pointPerRad, dynamicTopology = False): diff --git a/stlib/prefabs/materials/__init__.py b/stlib/prefabs/materials/__init__.py new file mode 100644 index 000000000..6a748749a --- /dev/null +++ b/stlib/prefabs/materials/__init__.py @@ -0,0 +1 @@ +from .__material__ import * \ No newline at end of file diff --git a/stlib/prefabs/material.py b/stlib/prefabs/materials/__material__.py similarity index 98% rename from stlib/prefabs/material.py rename to stlib/prefabs/materials/__material__.py index 070c7ac55..ff88dbd43 100644 --- a/stlib/prefabs/material.py +++ b/stlib/prefabs/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/prefabs/materials/deformable.py similarity index 90% rename from stlib/entities/deformable/__deformable__.py rename to stlib/prefabs/materials/deformable.py index 4cbdf1296..2a971096d 100644 --- a/stlib/entities/deformable/__deformable__.py +++ b/stlib/prefabs/materials/deformable.py @@ -1,5 +1,5 @@ -from stlib.prefabs.material import MaterialParameters -from splib.core.enum_types import ConstitutiveLaw, ElementType +from stlib.prefabs.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 * @@ -27,8 +27,7 @@ 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.geometry import FileParameters root.addObject("VisualStyle", displayFlags=["showBehavior"]) diff --git a/stlib/entities/rigid/__parameters__.py b/stlib/prefabs/materials/rigid.py similarity index 50% rename from stlib/entities/rigid/__parameters__.py rename to stlib/prefabs/materials/rigid.py index f7be03c77..6b7d6173e 100644 --- a/stlib/entities/rigid/__parameters__.py +++ b/stlib/prefabs/materials/rigid.py @@ -1,11 +1,13 @@ -from stlib.core.baseParameters import BaseParameters, Callable, Optional, dataclasses +from stlib.core.baseParameters import BaseParameters, Optional, dataclasses from stlib.geometry import GeometryParameters + + @dataclasses.dataclass -class RigidParameters(BaseParameters): +class RigidParameters(BaseParameters): geometry : GeometryParameters - mass : Optional[float] = None + mass : Optional[float] = None def toDict(self): return dataclasses.asdict(self) diff --git a/stlib/prefabs/visual.py b/stlib/prefabs/visual.py index 2ced99a7f..7a943805d 100644 --- a/stlib/prefabs/visual.py +++ b/stlib/prefabs/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.prefabs.geometries import Geometry, GeometryParameters +from stlib.prefabs.geometries.file import FileParameters from splib.core.utils import DEFAULT_VALUE from Sofa.Core import Object From 634e7109132257a917ba88fb820c7898574e1670 Mon Sep 17 00:00:00 2001 From: Paul Baksic Date: Tue, 28 Oct 2025 11:56:07 +0100 Subject: [PATCH 2/4] Put every prefab in root to avoid having a useless prefix --- stlib/__init__.py | 2 +- stlib/{prefabs => }/collision.py | 4 +- stlib/entities/__entity__.py | 10 +- .../{prefabs => }/geometries/__geometry__.py | 0 stlib/{prefabs => }/geometries/__init__.py | 0 stlib/{prefabs => }/geometries/cube.py | 2 +- stlib/{prefabs => }/geometries/extract.py | 2 +- stlib/{prefabs => }/geometries/file.py | 2 +- stlib/{prefabs => }/geometries/sphere.py | 2 +- stlib/{prefabs => }/materials/__init__.py | 0 stlib/{prefabs => }/materials/__material__.py | 0 stlib/{prefabs => }/materials/deformable.py | 4 +- stlib/{prefabs => }/materials/rigid.py | 2 +- stlib/misc/entity.py | 188 ------------------ stlib/misc/softrobots.py | 23 --- stlib/misc/test-1.py | 53 ----- stlib/misc/test2.py | 65 ------ stlib/prefabs/__init__.py | 1 - stlib/{prefabs => }/visual.py | 4 +- 19 files changed, 17 insertions(+), 347 deletions(-) rename stlib/{prefabs => }/collision.py (95%) rename stlib/{prefabs => }/geometries/__geometry__.py (100%) rename stlib/{prefabs => }/geometries/__init__.py (100%) rename stlib/{prefabs => }/geometries/cube.py (89%) rename stlib/{prefabs => }/geometries/extract.py (97%) rename stlib/{prefabs => }/geometries/file.py (93%) rename stlib/{prefabs => }/geometries/sphere.py (89%) rename stlib/{prefabs => }/materials/__init__.py (100%) rename stlib/{prefabs => }/materials/__material__.py (100%) rename stlib/{prefabs => }/materials/deformable.py (95%) rename stlib/{prefabs => }/materials/rigid.py (85%) delete mode 100644 stlib/misc/entity.py delete mode 100644 stlib/misc/softrobots.py delete mode 100644 stlib/misc/test-1.py delete mode 100644 stlib/misc/test2.py delete mode 100644 stlib/prefabs/__init__.py rename stlib/{prefabs => }/visual.py (90%) diff --git a/stlib/__init__.py b/stlib/__init__.py index aa75d376d..94db0b9c1 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): diff --git a/stlib/prefabs/collision.py b/stlib/collision.py similarity index 95% rename from stlib/prefabs/collision.py rename to stlib/collision.py index 128aa943d..ebffd7b75 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, Optional, dataclasses -from stlib.prefabs.geometries import Geometry, GeometryParameters -from stlib.prefabs.geometries.file import FileParameters +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 5f5a667bc..a60aa5a41 100644 --- a/stlib/entities/__entity__.py +++ b/stlib/entities/__entity__.py @@ -1,11 +1,11 @@ from stlib.core.baseParameters import BaseParameters -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.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 -from stlib.prefabs.geometries import GeometryParameters +from stlib.geometries import GeometryParameters from splib.core.enum_types import StateType from stlib.core.basePrefab import BasePrefab diff --git a/stlib/prefabs/geometries/__geometry__.py b/stlib/geometries/__geometry__.py similarity index 100% rename from stlib/prefabs/geometries/__geometry__.py rename to stlib/geometries/__geometry__.py diff --git a/stlib/prefabs/geometries/__init__.py b/stlib/geometries/__init__.py similarity index 100% rename from stlib/prefabs/geometries/__init__.py rename to stlib/geometries/__init__.py diff --git a/stlib/prefabs/geometries/cube.py b/stlib/geometries/cube.py similarity index 89% rename from stlib/prefabs/geometries/cube.py rename to stlib/geometries/cube.py index 4f97fad10..4d5a52ca3 100644 --- a/stlib/prefabs/geometries/cube.py +++ b/stlib/geometries/cube.py @@ -1,4 +1,4 @@ -from stlib.prefabs.geometries import GeometryParameters +from stlib.geometries import GeometryParameters class CubeParameters(GeometryParameters): def __init__(self, center, edgeLength, pointPerEdge, dynamicTopology = False): diff --git a/stlib/prefabs/geometries/extract.py b/stlib/geometries/extract.py similarity index 97% rename from stlib/prefabs/geometries/extract.py rename to stlib/geometries/extract.py index eb2954821..7143fb07d 100644 --- a/stlib/prefabs/geometries/extract.py +++ b/stlib/geometries/extract.py @@ -1,4 +1,4 @@ -from stlib.prefabs.geometries 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/prefabs/geometries/file.py b/stlib/geometries/file.py similarity index 93% rename from stlib/prefabs/geometries/file.py rename to stlib/geometries/file.py index 3bf8e9964..b057728c1 100644 --- a/stlib/prefabs/geometries/file.py +++ b/stlib/geometries/file.py @@ -1,4 +1,4 @@ -from stlib.prefabs.geometries 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/prefabs/geometries/sphere.py b/stlib/geometries/sphere.py similarity index 89% rename from stlib/prefabs/geometries/sphere.py rename to stlib/geometries/sphere.py index 540c345ab..2cb64f6ee 100644 --- a/stlib/prefabs/geometries/sphere.py +++ b/stlib/geometries/sphere.py @@ -1,4 +1,4 @@ -from stlib.prefabs.geometries import GeometryParameters +from stlib.geometries import GeometryParameters class SphereParameters(GeometryParameters): def __init__(self, center, radius, pointPerRad, dynamicTopology = False): diff --git a/stlib/prefabs/materials/__init__.py b/stlib/materials/__init__.py similarity index 100% rename from stlib/prefabs/materials/__init__.py rename to stlib/materials/__init__.py diff --git a/stlib/prefabs/materials/__material__.py b/stlib/materials/__material__.py similarity index 100% rename from stlib/prefabs/materials/__material__.py rename to stlib/materials/__material__.py diff --git a/stlib/prefabs/materials/deformable.py b/stlib/materials/deformable.py similarity index 95% rename from stlib/prefabs/materials/deformable.py rename to stlib/materials/deformable.py index 2a971096d..30bf60a23 100644 --- a/stlib/prefabs/materials/deformable.py +++ b/stlib/materials/deformable.py @@ -1,4 +1,4 @@ -from stlib.prefabs.materials import MaterialParameters +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 * @@ -26,7 +26,7 @@ def __addDeformableMaterial(node): def createScene(root) : from stlib.entities import Entity, EntityParameters - from stlib.prefabs.visual import VisualParameters + from stlib.visual import VisualParameters from stlib.geometry import FileParameters root.addObject("VisualStyle", displayFlags=["showBehavior"]) diff --git a/stlib/prefabs/materials/rigid.py b/stlib/materials/rigid.py similarity index 85% rename from stlib/prefabs/materials/rigid.py rename to stlib/materials/rigid.py index 6b7d6173e..5668b3562 100644 --- a/stlib/prefabs/materials/rigid.py +++ b/stlib/materials/rigid.py @@ -1,5 +1,5 @@ from stlib.core.baseParameters import BaseParameters, Optional, dataclasses -from stlib.geometry import GeometryParameters +from stlib.geometries import GeometryParameters diff --git a/stlib/misc/entity.py b/stlib/misc/entity.py deleted file mode 100644 index a3549b083..000000000 --- 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 aca8ab50e..000000000 --- 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 2b8987031..000000000 --- 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 cdebfad1c..000000000 --- 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 78a6f13b4..000000000 --- a/stlib/prefabs/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__all__ = ["geometries","materials","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 7a943805d..271aad3c7 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 -from stlib.prefabs.geometries import Geometry, GeometryParameters -from stlib.prefabs.geometries.file import FileParameters +from stlib.geometries import Geometry, GeometryParameters +from stlib.geometries.file import FileParameters from splib.core.utils import DEFAULT_VALUE from Sofa.Core import Object From b0e6cd26488304e93a9ac3f9b443168808154cd3 Mon Sep 17 00:00:00 2001 From: Paul Baksic Date: Tue, 28 Oct 2025 13:22:18 +0100 Subject: [PATCH 3/4] Fix bad import in bunny example --- stlib/materials/deformable.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stlib/materials/deformable.py b/stlib/materials/deformable.py index 30bf60a23..cb424ed43 100644 --- a/stlib/materials/deformable.py +++ b/stlib/materials/deformable.py @@ -27,7 +27,7 @@ def __addDeformableMaterial(node): def createScene(root) : from stlib.entities import Entity, EntityParameters from stlib.visual import VisualParameters - from stlib.geometry import FileParameters + from stlib.geometries.file import FileParameters root.addObject("VisualStyle", displayFlags=["showBehavior"]) From 15e714b79369161580584820d7607d8f1061b686 Mon Sep 17 00:00:00 2001 From: Paul Baksic <30337881+bakpaul@users.noreply.github.com> Date: Tue, 28 Oct 2025 14:11:17 +0100 Subject: [PATCH 4/4] Update examples/stlib/PrefabScene_beginner.py Co-authored-by: EulalieCoevoet --- examples/stlib/PrefabScene_beginner.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/stlib/PrefabScene_beginner.py b/examples/stlib/PrefabScene_beginner.py index 0d13e7dfc..2c4552c59 100644 --- a/examples/stlib/PrefabScene_beginner.py +++ b/examples/stlib/PrefabScene_beginner.py @@ -1,7 +1,7 @@ -from stlib.prefabs.materials.rigid import Rigid -from stlib.prefabs.materials.deformable import Deformable -from stlib.prefabs.geometries.cube import CubeParameters -from stlib.prefabs.geometries.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