Skip to content

Commit 33fbc73

Browse files
committed
Add extracted geometry
1 parent 266e54b commit 33fbc73

3 files changed

Lines changed: 99 additions & 35 deletions

File tree

stlib/geometry/__geometry__.py

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,38 +3,52 @@
33
from splib.topology.dynamic import addDynamicTopology
44
from splib.topology.static import addStaticTopology
55
from splib.core.enum_types import ElementType
6+
from splib.core.utils import DEFAULT_VALUE
67
from Sofa.Core import Object
78

9+
10+
class Geometry(BasePrefab):...
11+
812
@dataclasses.dataclass
9-
class GeometryParameters(BaseParameters):
10-
@dataclasses.dataclass
11-
class Data(object):
12-
# Initial positions
13-
positions : Any
13+
class InternalDataProvider(object):
14+
positions : Any
15+
# Topology information
16+
edges : Any = DEFAULT_VALUE
17+
triangles : Any = DEFAULT_VALUE
18+
quads : Any = DEFAULT_VALUE
19+
tetrahedra : Any = DEFAULT_VALUE
20+
hexahedra : Any = DEFAULT_VALUE
21+
22+
def generateAttribute(self, parent : Geometry):
23+
pass
24+
1425

15-
# Type of the highest degree element
16-
elementType : Optional[ElementType]
26+
@dataclasses.dataclass
27+
class GeometryParameters(BaseParameters):
1728

18-
# Topology information
19-
edges : Optional[Any]
20-
triangles : Optional[Any]
21-
quads : Optional[Any]
22-
tetrahedra : Optional[Any]
23-
hexahedra : Optional[Any]
29+
# Type of the highest degree element
30+
elementType : Optional[ElementType]
2431

2532
dynamicTopology : bool = False
26-
data : Data
33+
data : Optional[InternalDataProvider]
34+
35+
2736

2837
class Geometry(BasePrefab):
2938
container : Object # This should be more specialized into the right SOFA type
3039
modifier : Optional[Object]
3140

41+
params : GeometryParameters
42+
3243
def __init__(self, params: GeometryParameters):
3344
BasePrefab.__init__(self, params)
45+
self.params = params
46+
if params.data is not None :
47+
params.data.generateAttribute(self)
3448
if(params.dynamicTopology):
3549
if(params.elementType is not None):
36-
addDynamicTopology(self, **dataclasses.asdict(params.data), **params.kargs)
50+
addDynamicTopology(self, container = {dataclasses.asdict(params.data)})
3751
else:
3852
raise ValueError
3953
else:
40-
addStaticTopology(self, **dataclasses.asdict(params.data), **params.kargs)
54+
addStaticTopology(self, container = {dataclasses.asdict(params.data)})

stlib/geometry/extract.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
from stlib.geometry import GeometryParameters, InternalDataProvider, Geometry
2+
from stlib.core.baseParameters import dataclasses
3+
from splib.topology.dynamic import addDynamicTopology
4+
from splib.topology.loader import loadMesh
5+
from splib.core.enum_types import ElementType
6+
7+
from Sofa.Core import Node
8+
9+
10+
class ExtractInternalDataProvider(InternalDataProvider):
11+
destElemType : ElementType
12+
fromElemType : ElementType
13+
fromNodeName : str
14+
15+
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'")
19+
20+
InternalDataProvider.__init__(self)
21+
22+
23+
def generateAttribute(self, parent : Geometry):
24+
tmn = parent.addChild("topologicalMappingNode")
25+
26+
#TODO: Specify somewhere in the doc that this should only be used for mapped topologies that extract parent topology surface
27+
fromLink = parent.parents[0].parents[0].getChild(self.fromNodeName).container.linkpath
28+
addDynamicTopology(tmn, type=self.destElemType)
29+
if self.fromElemType == ElementType.TETRA:
30+
tmn.addObject("Tetra2TriangleTopologicalMapping", input=fromLink, output=tmn.container.linkpath)
31+
elif self.fromElemType == ElementType.HEXA:
32+
tmn.addObject("Hexa2QuadTopologicalMapping", input=fromLink, output=tmn.container.linkpath)
33+
34+
self.positions = tmn.container.position.linkpath
35+
self.edges = tmn.container.edges.linkpath
36+
self.triangles = tmn.container.triangles.linkpath
37+
self.quads = tmn.container.quads.linkpath
38+
self.hexaedra = tmn.container.hexaedra.linkpath
39+
self.tetrahedra = tmn.container.tetras.linkpath
40+
41+
42+
43+
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)
46+

stlib/geometry/file.py

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,31 @@
1-
from stlib.geometry import GeometryParameters
1+
from stlib.geometry import GeometryParameters, InternalDataProvider, Geometry
2+
from stlib.core.baseParameters import dataclasses
23
from splib.topology.loader import loadMesh
4+
from splib.core.enum_types import ElementType
5+
36
from Sofa.Core import Node
47

5-
class FileParameters(GeometryParameters):
6-
def __init__(self, filename, dynamicTopology = False):
8+
@dataclasses.dataclass
9+
class FileInternalDataProvider(InternalDataProvider):
10+
filename : str
711

8-
customGeom = FileParameters.createData(filename)
9-
GeometryParameters.__init__(data = customGeom, dynamicTopology = dynamicTopology)
12+
def __post_init__(self, **kwargs):
13+
InternalDataProvider.__init__(self,**kwargs)
1014

11-
@staticmethod
12-
def createData(filename) -> GeometryParameters.Data :
13-
data = GeometryParameters.Data()
14-
15-
node = Sofa.Core.Node()
16-
loadMesh(node, filename)
17-
node.init()
15+
def generateAttribute(self, parent : Geometry):
16+
17+
loadMesh(parent, self.filename)
1818

19-
data.positions = node.loader.position.value
20-
data.edges = node.loader.edges.value
21-
data.triangles = node.loader.triangles.value
22-
data.tetrahedra = node.loader.tetras.value
19+
self.positions = parent.loader.position.linkpath
20+
self.edges = parent.loader.edges.linkpath
21+
self.triangles = parent.loader.triangles.linkpath
22+
self.quads = parent.loader.quads.linkpath
23+
self.hexaedra = parent.loader.hexaedra.linkpath
24+
self.tetrahedra = parent.loader.tetras.linkpath
2325

24-
node.cleanUp()
2526

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

0 commit comments

Comments
 (0)