Skip to content

Commit c97bfa3

Browse files
EulalieCoevoetbakpaul
authored andcommitted
[stlib-splib] work on prefabs: cleaning (#501)
* [stlib-splib] cleaning * revert collisionModel
1 parent 423a484 commit c97bfa3

File tree

10 files changed

+96
-68
lines changed

10 files changed

+96
-68
lines changed

splib/core/enum_types.py

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,34 +5,33 @@ class ConstitutiveLaw(Enum):
55
HYPERELASTIC = 2
66

77
class ODEType(Enum):
8-
EXPLICIT = 1
9-
IMPLICIT = 2
8+
EXPLICIT = 1
9+
IMPLICIT = 2
1010

1111
class SolverType(Enum):
12-
DIRECT = 1
13-
ITERATIVE = 2
12+
DIRECT = 1
13+
ITERATIVE = 2
1414

1515
class MappingType(Enum):
16-
BARYCENTRIC = 1
17-
IDENTITY = 2
18-
RIGID = 3
19-
16+
BARYCENTRIC = 1
17+
IDENTITY = 2
18+
RIGID = 3
2019

2120
class ConstraintType(Enum):
22-
PROJECTIVE = 1
23-
WEAK = 2
24-
LAGRANGIAN = 3
21+
PROJECTIVE = 1
22+
WEAK = 2
23+
LAGRANGIAN = 3
2524

2625
class CollisionPrimitive(Enum):
27-
POINTS = 1
28-
LINES = 2
29-
TRIANGLES = 3
30-
SPHERES = 4
26+
POINTS = 1
27+
LINES = 2
28+
TRIANGLES = 3
29+
SPHERES = 4
3130

3231
class ElementType(Enum):
33-
POINTS = 1
34-
EDGES = 2
35-
TRIANGLES = 3
36-
QUAD = 4
37-
TETRA = 5
38-
HEXA = 6
32+
POINTS = 1
33+
EDGES = 2
34+
TRIANGLES = 3
35+
QUADS = 4
36+
TETRAHEDRONS = 5
37+
HEXAHEDRONS = 6

splib/mechanics/collision_model.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,28 @@
33
from splib.core.enum_types import CollisionPrimitive
44

55

6-
76
@ReusableMethod
8-
def addCollisionModels(node, primitive : CollisionPrimitive, topology=DEFAULT_VALUE, selfCollision=DEFAULT_VALUE, proximity=DEFAULT_VALUE, group=DEFAULT_VALUE, contactStiffness=DEFAULT_VALUE, contactFriction=DEFAULT_VALUE,spheresRadius=DEFAULT_VALUE,**kwargs):
7+
def addCollisionModels(node, primitive : CollisionPrimitive,
8+
topology=DEFAULT_VALUE,
9+
selfCollision=DEFAULT_VALUE,
10+
proximity=DEFAULT_VALUE,
11+
group=DEFAULT_VALUE,
12+
contactStiffness=DEFAULT_VALUE,
13+
contactFriction=DEFAULT_VALUE,
14+
spheresRadius=DEFAULT_VALUE,
15+
**kwargs):
916
match primitive:
1017
case CollisionPrimitive.POINTS:
11-
node.addObject("PointCollisionModel",name="PointCollision", topology=topology, selfCollision=selfCollision, proximity=proximity, contactStiffness=contactStiffness, contactFriction=contactFriction, group=group, **kwargs)
18+
node.addObject("PointCollisionModel", name="PointCollision", topology=topology, selfCollision=selfCollision, proximity=proximity, contactStiffness=contactStiffness, contactFriction=contactFriction, group=group, **kwargs)
1219
return
13-
case CollisionPrimitive.LINES:
14-
node.addObject("LineCollisionModel",name="EdgeCollision", topology=topology, selfCollision=selfCollision, proximity=proximity, contactStiffness=contactStiffness, contactFriction=contactFriction, group=group,**kwargs)
20+
case CollisionPrimitive.LINES:
21+
node.addObject("LineCollisionModel", name="EdgeCollision", topology=topology, selfCollision=selfCollision, proximity=proximity, contactStiffness=contactStiffness, contactFriction=contactFriction, group=group, **kwargs)
1522
return
1623
case CollisionPrimitive.TRIANGLES:
17-
node.addObject("TriangleCollisionModel",name="TriangleCollision", topology=topology, selfCollision=selfCollision, proximity=proximity, contactStiffness=contactStiffness, contactFriction=contactFriction, group=group,**kwargs)
24+
node.addObject("TriangleCollisionModel", name="TriangleCollision", topology=topology, selfCollision=selfCollision, proximity=proximity, contactStiffness=contactStiffness, contactFriction=contactFriction, group=group,**kwargs)
1825
return
1926
case CollisionPrimitive.SPHERES:
20-
node.addObject("SphereCollisionModel",name="SphereCollision", topology=topology, selfCollision=selfCollision, proximity=proximity, contactStiffness=contactStiffness, contactFriction=contactFriction, group=group, radius=spheresRadius, **kwargs)
27+
node.addObject("SphereCollisionModel", name="SphereCollision", topology=topology, selfCollision=selfCollision, proximity=proximity, contactStiffness=contactStiffness, contactFriction=contactFriction, group=group, radius=spheresRadius, **kwargs)
2128
return
2229
case _:
2330
return

splib/mechanics/hyperelasticity.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
@ReusableMethod
77
def addHyperelasticity(node,elem:ElementType,materialName=DEFAULT_VALUE, parameterSet=DEFAULT_VALUE, matrixRegularization=DEFAULT_VALUE,**kwargs):
88
match elem:
9-
case ElementType.TETRA:
9+
case ElementType.TETRAHEDRONS:
1010
node.addObject("TetrahedronHyperelasticityFEMForceField",name="constitutiveLaw", materialName=materialName, parameterSet=parameterSet, matrixRegularization=matrixRegularization, **kwargs)
1111
return
1212
case _:

splib/mechanics/linear_elasticity.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ def addLinearElasticity(node,elem:ElementType,youngModulus=DEFAULT_VALUE, poisso
1212
case ElementType.TRIANGLES:
1313
node.addObject("TriangleFEMForceField",name="constitutiveLaw", youngModulus=youngModulus, poissonRatio=poissonRatio, method=method,**kwargs)
1414
return
15-
case ElementType.QUAD:
15+
case ElementType.QUADS:
1616
node.addObject("QuadBendingFEMForceField",name="constitutiveLaw", youngModulus=youngModulus, poissonRatio=poissonRatio, method=method,**kwargs)
1717
return
18-
case ElementType.TETRA:
18+
case ElementType.TETRAHEDRONS:
1919
node.addObject("TetrahedronFEMForceField",name="constitutiveLaw", youngModulus=youngModulus, poissonRatio=poissonRatio, method=method,**kwargs)
2020
return
21-
case ElementType.HEXA:
21+
case ElementType.HEXAHEDRONS:
2222
node.addObject("HexahedronFEMForceField",name="constitutiveLaw", youngModulus=youngModulus, poissonRatio=poissonRatio, method=method,**kwargs)
2323
return
2424
case _:

splib/topology/dynamic.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,15 @@ def addDynamicTopology(node,type:ElementType,**kwargs):
5353
case ElementType.TRIANGLES:
5454
addTriangleTopology(node,**kwargs)
5555
return
56-
case ElementType.QUAD:
56+
case ElementType.QUADS:
5757
addQuadTopology(node,**kwargs)
5858
return
59-
case ElementType.TETRA:
59+
case ElementType.TETRAHEDRONS:
6060
addTetrahedronTopology(node,**kwargs)
6161
return
62-
case ElementType.HEXA:
62+
case ElementType.HEXAHEDRONS:
6363
addHexahedronTopology(node,**kwargs)
6464
return
6565
case _:
66-
print('Topology type should be one of the following : "ElementType.POINTS, ElementType.EDGES, ElementType.TRIANGLES, ElementType.QUAD, ElementType.TETRA, ElementType.HEXA" ')
66+
print('Topology type should be one of the following : "ElementType.POINTS, ElementType.EDGES, ElementType.TRIANGLES, ElementType.QUADS, ElementType.TETRAHEDRONS, ElementType.HEXAHEDRONS" ')
6767
return

stlib/geometry/__geometry__.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,8 @@ class GeometryParameters(BaseParameters):
3333
dynamicTopology : bool = False
3434

3535

36-
37-
38-
3936
class Geometry(BasePrefab):
40-
container : Object # This should be more specialized into the right SOFA type
37+
container : Object # This should be more specialized into the right SOFA type
4138
modifier : Optional[Object]
4239

4340
params : GeometryParameters

stlib/geometry/extract.py

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,27 +8,32 @@
88

99

1010
class ExtractInternalDataProvider(InternalDataProvider):
11-
destElemType : ElementType
12-
fromElemType : ElementType
11+
destElementType : ElementType
12+
fromElemenType : ElementType
1313
fromNodeName : str
1414

15+
def __init__(self, destElementType : ElementType, fromElementType : ElementType, fromNodeName : str):
16+
self.destElementType = destElementType,
17+
self.fromElementType = fromElementType,
18+
self.fromNodeName = fromNodeName
19+
1520
def __post_init__(self):
16-
if(not (self.fromElemType == ElementType.TETRA and self.destElemType == ElementType.TRIANGLES)
17-
and not (self.fromElemType == ElementType.HEXA and self.destElemType == ElementType.QUAD) ):
18-
raise ValueError("Only configuration possible are 'Tetra to Triangle' and 'Hexa to quad'")
21+
if(not (self.fromElementType == ElementType.TETRAHEDRONS and self.destElementType == ElementType.TRIANGLES)
22+
and not (self.fromElementType == ElementType.HEXAHEDRONS and self.destElementType == ElementType.QUADS) ):
23+
raise ValueError("Only configuration possible are 'Tetrahedrons to Triangles' and 'Hexahedrons to Quads'")
1924

2025
InternalDataProvider.__init__(self)
2126

2227

2328
def generateAttribute(self, parent : Geometry):
24-
tmn = parent.addChild("topologicalMappingNode")
29+
tmn = parent.addChild("TopologicalMappingNode")
2530

2631
#TODO: Specify somewhere in the doc that this should only be used for mapped topologies that extract parent topology surface
2732
fromLink = parent.parents[0].parents[0].getChild(self.fromNodeName).container.linkpath
28-
addDynamicTopology(tmn, type=self.destElemType)
29-
if self.fromElemType == ElementType.TETRA:
33+
addDynamicTopology(tmn, type=self.destElementType)
34+
if self.fromElementType == ElementType.TETRAHEDRONS:
3035
tmn.addObject("Tetra2TriangleTopologicalMapping", input=fromLink, output=tmn.container.linkpath)
31-
elif self.fromElemType == ElementType.HEXA:
36+
elif self.fromElementType == ElementType.HEXAHEDRONS:
3237
tmn.addObject("Hexa2QuadTopologicalMapping", input=fromLink, output=tmn.container.linkpath)
3338

3439
self.position = tmn.container.position.linkpath
@@ -41,6 +46,14 @@ def generateAttribute(self, parent : Geometry):
4146

4247

4348
class ExtractParameters(GeometryParameters):
44-
def __init__(self, fromGeometry : GeometryParameters, destElementType : ElementType, dynamicTopology = False, ):
45-
GeometryParameters.__init__(data = ExtractInternalDataProvider(destElemType = destElementType, fromElemType = fromGeometry.elementType,fromNodeName = fromGeometry.name), dynamicTopology = dynamicTopology, elementType = destElementType)
49+
def __init__(self,
50+
fromGeometry : GeometryParameters,
51+
destElementType : ElementType,
52+
dynamicTopology = False, ):
53+
GeometryParameters.__init__(self,
54+
data = ExtractInternalDataProvider(destElementType = destElementType,
55+
fromElementType = fromGeometry.elementType,
56+
fromNodeName = fromGeometry.name),
57+
dynamicTopology = dynamicTopology,
58+
elementType = destElementType)
4659

stlib/geometry/file.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,8 @@ class FileInternalDataProvider(InternalDataProvider):
1212
def __post_init__(self, **kwargs):
1313
InternalDataProvider.__init__(self,**kwargs)
1414

15-
def generateAttribute(self, parent : Geometry):
16-
17-
loadMesh(parent, self.filename)
15+
def generateAttribute(self, parent : Geometry):
16+
loadMesh(parent, self.filename)
1817

1918
self.position = str(parent.loader.position.linkpath)
2019
self.edges = str(parent.loader.edges.linkpath)
@@ -26,6 +25,9 @@ def generateAttribute(self, parent : Geometry):
2625

2726

2827
class FileParameters(GeometryParameters):
29-
def __init__(self, filename, dynamicTopology = False, elementType : ElementType = None ):
30-
GeometryParameters.__init__(self,data = FileInternalDataProvider(filename), dynamicTopology = dynamicTopology, elementType = elementType)
28+
def __init__(self, filename, dynamicTopology = False, elementType : ElementType = None ):
29+
GeometryParameters.__init__(self,
30+
data = FileInternalDataProvider(filename),
31+
dynamicTopology = dynamicTopology,
32+
elementType = elementType)
3133

stlib/prefabs/collision.py

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,10 @@
99

1010
@dataclasses.dataclass
1111
class CollisionParameters(BaseParameters):
12-
primitives : list[CollisionPrimitive] = dataclasses.field(default_factory = lambda :[CollisionPrimitive.POINTS])
12+
primitives : list[CollisionPrimitive] = dataclasses.field(default_factory = lambda :[CollisionPrimitive.TRIANGLES])
1313

1414
selfCollision : Optional[bool] = DEFAULT_VALUE
15-
proximity : Optional[float] = DEFAULT_VALUE
1615
group : Optional[int] = DEFAULT_VALUE
17-
contactStiffness : Optional[float] = DEFAULT_VALUE
18-
contactFriction : Optional[float] = DEFAULT_VALUE
19-
spheresRadius : Optional[float] = DEFAULT_VALUE
2016

2117
geometry : GeometryParameters = dataclasses.field(default_factory = lambda : GeometryParameters())
2218
addMapping : Optional[Callable] = None
@@ -28,16 +24,12 @@ def __init__(self, params: CollisionParameters):
2824

2925
geom = self.add(Geometry, params.geometry)
3026

31-
self.addObject("MechanicalObject",template="Vec3", position=f"@{params.geometry.name}/container.position")
27+
self.addObject("MechanicalObject", template="Vec3", position=f"@{params.geometry.name}/container.position")
3228
for primitive in params.primitives:
33-
addCollisionModels(self,primitive,
29+
addCollisionModels(self, primitive,
3430
topology=f"@{params.geometry.name}/container",
3531
selfCollision=params.selfCollision,
36-
proximity=params.proximity,
3732
group=params.group,
38-
contactStiffness=params.contactStiffness,
39-
contactFriction=params.contactFriction,
40-
spheresRadius=params.spheresRadius,
4133
**params.kwargs)
4234

4335
if params.addMapping is not None:
@@ -50,7 +42,14 @@ def getParameters(**kwargs) -> CollisionParameters:
5042

5143
def createScene(root):
5244

45+
root.addObject("VisualStyle", displayFlags="showCollisionModels")
46+
5347
# Create a visual from a mesh file
5448
params = Collision.getParameters()
5549
params.geometry = FileParameters(filename="mesh/cube.obj")
50+
# Expert parameters
51+
params.kwargs = {
52+
"contactStiffness": 100.0,
53+
"contactFriction": 0.5
54+
}
5655
root.add(Collision, params)

stlib/prefabs/visual.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
from stlib.core.basePrefab import BasePrefab
22
from stlib.core.baseParameters import BaseParameters, Callable, Optional, dataclasses, Any
33
from stlib.geometry import Geometry, GeometryParameters
4+
from stlib.geometry.extract import ExtractParameters
45
from stlib.geometry.file import FileParameters
6+
from splib.core.enum_types import ElementType
57
from Sofa.Core import Object
68

79
@dataclasses.dataclass
@@ -32,6 +34,15 @@ def getParameters(**kwargs) -> VisualParameters:
3234
def createScene(root):
3335

3436
# Create a visual from a mesh file
35-
params = Visual.getParameters()
37+
params = Visual.getParameters()
38+
params.name = "VisualFromFile"
3639
params.geometry = FileParameters(filename="mesh/cube.obj")
3740
root.add(Visual, params)
41+
42+
43+
# Create a visual from a mesh file
44+
# params = Visual.getParameters()
45+
# params.name = "ExtractedVisual"
46+
# params.geometry = ExtractParameters(fromGeometry=FileParameters(filename="mesh/cube.vtk"),
47+
# destElementType=ElementType.TRIANGLES)
48+
# root.add(Visual, params)

0 commit comments

Comments
 (0)