Skip to content

Commit 424b77a

Browse files
committed
Fix extract geometry
1 parent d42199e commit 424b77a

3 files changed

Lines changed: 41 additions & 51 deletions

File tree

examples/stlib/node_modifier.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
def createScene(root):
2121
root.gravity=[0,0,9.81]
22-
22+
root.dt=0.01
2323

2424
##Environement
2525
planes_lengthNormal = np.array([0, 1, 0])
@@ -75,7 +75,8 @@ def createScene(root):
7575
SParams.collision = CollisionParameters()
7676
SParams.collision.primitives = [CollisionPrimitive.TRIANGLES]
7777
# # #TODO: to fix link issues for extracted geometry, it might be better to give source geometry relative link + parameters
78-
SParams.collision.geometry = ExtractParameters(destinationType=ElementType.TRIANGLES, sourceParameters=SParams.geometry )
78+
## TODO: not working with static container because the init order is always wrong so that the triangle vector is always empty when initializing the container
79+
SParams.collision.geometry = ExtractParameters(destinationType=ElementType.TRIANGLES, sourceParameters=SParams.geometry,dynamicTopology=True)
7980
SParams.visual = VisualParameters()
8081
SParams.visual.geometry = FileParameters(filename="mesh/SofaScene/SVisu.obj")
8182
SParams.visual.color = [0.7, .7, 0.7, 0.8]
@@ -91,7 +92,7 @@ def createScene(root):
9192
displayFlags = ["showVisualModels", "showInteractionForceFields"],
9293
enableCollisionDetection = True,
9394
useLagrangian = True,
94-
parallelComputing = True,
95+
parallelComputing = False,
9596
alarmDistance=0.3, contactDistance=0.02,
9697
frictionCoef=0.5, tolerance=1.0e-4, maxIterations=20))
9798

stlib/geometries/__geometry__.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from stlib.core.basePrefab import BasePrefab
2-
from stlib.core.baseParameters import BaseParameters, Optional, dataclasses, Any
2+
from stlib.core.baseParameters import BaseParameters, Optional, dataclasses, Any, Callable
33
from splib.topology.dynamic import addDynamicTopology
44
from splib.topology.static import addStaticTopology
55
from splib.core.enum_types import ElementType
@@ -35,6 +35,10 @@ class GeometryParameters(BaseParameters):
3535

3636
dynamicTopology : bool = False
3737

38+
39+
def postInitExec(self, node):
40+
pass
41+
3842
def Data(self):
3943
return InternalDataProvider()
4044

@@ -79,4 +83,6 @@ def init(self):
7983
"quads": self.parameters.data.quads,
8084
"tetrahedra": self.parameters.data.tetrahedra,
8185
"hexahedra": self.parameters.data.hexahedra
82-
})
86+
})
87+
88+
self.parameters.postInitExec(self)

stlib/geometries/extract.py

Lines changed: 29 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -6,66 +6,49 @@
66

77
import Sofa
88
from Sofa.Core import Node
9+
from functools import partial
910

1011

1112
class ExtractInternalDataProvider(InternalDataProvider):
12-
destinationType : ElementType
13-
sourceType : ElementType
14-
sourceName : str
1513

16-
def __init__(self, destinationType : ElementType, sourceType : ElementType, sourceName : str):
17-
self.destinationType = destinationType
18-
self.sourceType = sourceType
19-
self.sourceName = sourceName
20-
21-
def __post_init__(self):
22-
if(not (self.sourceType == ElementType.TETRAHEDRA and self.destinationType == ElementType.TRIANGLES)
23-
and not (self.sourceType == ElementType.HEXAHEDRA and self.destinationType == ElementType.QUADS) ):
24-
raise ValueError("Only configuration possible are 'Tetrahedra to Triangles' and 'Hexahedra to Quads'")
25-
26-
InternalDataProvider.__init__(self)
14+
def __init__(self):
15+
super().__init__()
2716

2817
def generateAttribute(self, parent : Geometry):
29-
node = parent.addChild("ExtractedGeometry")
18+
self.position = parent.parents[0].parents[0].getChild("Geometry").container.position.linkpath
19+
3020

31-
#TODO: Specify somewhere in the doc that this should only be used for mapped topologies that extract parent topology surface
32-
# fromLink = parent.parents[0].parents[0].getChild(self.SourceName).container.linkpath
33-
# TODO: the line above cannot work if the nodes and objects are not added to the graph prior the end of __init__() call
34-
# !!! also, on a fail, nothing is added to the graph, which makes things harder to debug
35-
# !!! also, does not work because of the function canCreate(), which checks the input (not yet created?)
36-
# this is all related
37-
fromLink = "@../../../Geometry/container" # TODO: can we do better than this?
38-
addDynamicTopology(node, elementType=self.destinationType, container={"position" : fromLink + ".position"})
39-
if self.sourceType == ElementType.TETRAHEDRA:
40-
node.addObject("Tetra2TriangleTopologicalMapping", input=fromLink, output=node.container.linkpath)
41-
elif self.sourceType == ElementType.HEXAHEDRA:
42-
node.addObject("Hexa2QuadTopologicalMapping", input=fromLink, output=node.container.linkpath)
43-
else:
44-
Sofa.msg_error("[stlib/geometry/exctrat.py]", "Element type: " + str(self.sourceType) + " not supported.")
21+
def extractGeometry(sourceType : ElementType, parent : Geometry):
22+
#TODO: Specify somewhere in the doc that this should only be used for mapped topologies that extract parent topology surface
23+
# fromLink = parent.parents[0].parents[0].getChild(self.SourceName).container.linkpath
24+
# TODO: the line above cannot work if the nodes and objects are not added to the graph prior the end of __init__() call
25+
# !!! also, on a fail, nothing is added to the graph, which makes things harder to debug
26+
# !!! also, does not work because of the function canCreate(), which checks the input (not yet created?)
27+
# this is all related
28+
fromLink = parent.parents[0].parents[0].getChild("Geometry").container.linkpath # TODO: can we do better than this?
29+
if sourceType == ElementType.TETRAHEDRA:
30+
parent.addObject("Tetra2TriangleTopologicalMapping", input=fromLink, output=parent.container.linkpath)
31+
elif sourceType == ElementType.HEXAHEDRA:
32+
parent.addObject("Hexa2QuadTopologicalMapping", input=fromLink, output=parent.container.linkpath)
33+
else:
34+
Sofa.msg_error("[stlib/geometry/exctrat.py]", "Element type: " + str(sourceType) + " not supported.")
4535

46-
self.position = node.container.position.linkpath
47-
if node.container.findData("edges") is not None:
48-
self.edges = node.container.edges.linkpath
49-
if node.container.findData("triangles") is not None:
50-
self.triangles = node.container.triangles.linkpath
51-
if node.container.findData("quads") is not None:
52-
self.quads = node.container.quads.linkpath
53-
if node.container.findData("hexahedra") is not None:
54-
self.hexahedra = node.container.hexahedra.linkpath
55-
if node.container.findData("tetras") is not None:
56-
self.tetrahedra = node.container.tetras.linkpath
5736

5837

5938

6039
class ExtractParameters(GeometryParameters):
61-
def __init__(self,
62-
sourceParameters : GeometryParameters,
40+
def __init__(self,
41+
sourceParameters : GeometryParameters,
6342
destinationType : ElementType,
6443
dynamicTopology : bool = False):
6544
GeometryParameters.__init__(self,
66-
data = ExtractInternalDataProvider(destinationType = destinationType,
67-
sourceType = sourceParameters.elementType,
68-
sourceName = sourceParameters.name),
45+
data = ExtractInternalDataProvider(),
6946
dynamicTopology = dynamicTopology,
7047
elementType = destinationType)
71-
48+
49+
self.postInitExec = partial(extractGeometry, sourceParameters.elementType)
50+
51+
if(not (sourceParameters.elementType == ElementType.TETRAHEDRA and destinationType == ElementType.TRIANGLES)
52+
and not (sourceParameters.elementType == ElementType.HEXAHEDRA and destinationType == ElementType.QUADS) ):
53+
raise ValueError("Only configuration possible are 'Tetrahedra to Triangles' and 'Hexahedra to Quads'")
54+

0 commit comments

Comments
 (0)