1010
1111from compas .data import Data
1212from compas .datastructures import Mesh
13+ from compas .datastructures import VolMesh
1314from compas .geometry import Box
1415from compas .geometry import Brep
1516from compas .geometry import Frame
1617from compas .geometry import Point
17- from compas .geometry import Polyhedron
1818from compas .geometry import Transformation
1919from compas_model .algorithms import brep_brep_contacts
2020from 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