Skip to content

Commit ddf7626

Browse files
committed
surface and volumetric mesh
1 parent b477ec1 commit ddf7626

File tree

1 file changed

+26
-40
lines changed

1 file changed

+26
-40
lines changed

src/compas_model/elements/element.py

Lines changed: 26 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@
1010

1111
from compas.data import Data
1212
from compas.datastructures import Mesh
13+
from compas.datastructures import VolMesh
1314
from compas.geometry import Box
1415
from compas.geometry import Brep
1516
from compas.geometry import Frame
1617
from compas.geometry import Point
17-
from compas.geometry import Polyhedron
1818
from compas.geometry import Transformation
1919
from compas_model.algorithms import brep_brep_contacts
2020
from compas_model.algorithms import mesh_mesh_contacts
@@ -38,8 +38,8 @@ def wrapper(*args, **kwargs):
3838
self._modelgeometry = None
3939
self._modeltransformation = None
4040
self._point = None
41-
self._femesh2 = None
42-
self._femesh3 = None
41+
self._surface_mesh = None
42+
self._volumetric_mesh = None
4343
return f(*args, **kwargs)
4444

4545
return wrapper
@@ -145,8 +145,8 @@ def __init__(
145145
self._aabb = None
146146
self._obb = None
147147
self._collision_mesh = None
148-
self._femesh2 = None
149-
self._femesh3 = None
148+
self._surface_mesh = None
149+
self._volumetric_mesh = None
150150

151151
self._is_dirty = True
152152

@@ -212,35 +212,6 @@ def children(self) -> list["Element"]:
212212
def features(self) -> list[Feature]:
213213
return self._features
214214

215-
@property
216-
def femesh2(self) -> Mesh:
217-
if not self._femesh2:
218-
self._femesh2 = self.compute_femesh2()
219-
return self._femesh2
220-
221-
@property
222-
def femesh3(self) -> Polyhedron:
223-
if not self._femesh3:
224-
self._femesh3 = self.compute_femesh3()
225-
return self._femesh3
226-
227-
# @property
228-
# def is_dirty(self) -> bool:
229-
# return self._is_dirty
230-
231-
# @is_dirty.setter
232-
# def is_dirty(self, value: bool):
233-
# self._is_dirty = value
234-
235-
# if value:
236-
# # this is potentially expensive and wasteful
237-
# # perhaps this mapping needs to be managed on the model level
238-
# elements: dict[int, Element] = {
239-
# element.graphnode: element for element in self.model.elements
240-
# }
241-
# for neighbor in self.model.graph.neighbors_out(self.graphnode):
242-
# elements[neighbor].is_dirty = value
243-
244215
# ==========================================================================
245216
# Computed attributes
246217
# ==========================================================================
@@ -291,6 +262,18 @@ def point(self) -> Point:
291262
self._point = self.compute_point()
292263
return self._point
293264

265+
@property
266+
def surface_mesh(self) -> Mesh:
267+
if not self._surface_mesh:
268+
self._surface_mesh = self.compute_surface_mesh()
269+
return self._surface_mesh
270+
271+
@property
272+
def volumetric_mesh(self) -> VolMesh:
273+
if not self._volumetric_mesh:
274+
self._volumetric_mesh = self.compute_volumetric_mesh()
275+
return self._volumetric_mesh
276+
294277
# ==========================================================================
295278
# Abstract methods
296279
# ==========================================================================
@@ -422,8 +405,8 @@ def compute_point(self) -> Point:
422405
"""
423406
raise NotImplementedError
424407

425-
def compute_femesh2(self, meshsize_min: Optional[float] = None, meshsize_max: Optional[float] = None) -> Mesh:
426-
"""Computes the 2D FE analysis mesh of the element's model geometry.
408+
def compute_surface_mesh(self, meshsize_min: Optional[float] = None, meshsize_max: Optional[float] = None) -> Mesh:
409+
"""Computes the triangulated surface mesh of the element's model geometry.
427410
428411
Parameters
429412
----------
@@ -440,8 +423,8 @@ def compute_femesh2(self, meshsize_min: Optional[float] = None, meshsize_max: Op
440423
"""
441424
raise NotImplementedError
442425

443-
def compute_femesh3(self, meshsize_min: Optional[float] = None, meshsize_max: Optional[float] = None) -> Polyhedron:
444-
"""Computes the 3D FE mesh of the element's model geometry.
426+
def compute_volumetric_mesh(self, meshsize_min: Optional[float] = None, meshsize_max: Optional[float] = None) -> VolMesh:
427+
"""Computes the tetrahedral volumetric mesh of the element's model geometry.
445428
446429
Parameters
447430
----------
@@ -452,7 +435,7 @@ def compute_femesh3(self, meshsize_min: Optional[float] = None, meshsize_max: Op
452435
453436
Returns
454437
-------
455-
:class:`compas.geometry.Polyhedron`
438+
:class:`compas.geometry.VolMesh`
456439
The polyhedral mesh.
457440
458441
"""
@@ -526,7 +509,10 @@ def transform(self, transformation: Transformation) -> None:
526509
None
527510
528511
"""
529-
self.transformation = transformation
512+
if self.transformation:
513+
self.transformation = transformation * self.transformation
514+
else:
515+
self.transformation = transformation
530516

531517
def transformed(self, transformation: Transformation) -> "Element":
532518
"""Creates a transformed copy of the element.

0 commit comments

Comments
 (0)