Skip to content

Commit e9f194a

Browse files
committed
viewer: remove Plotter dependency to the box engine
1 parent bc02025 commit e9f194a

File tree

3 files changed

+58
-38
lines changed

3 files changed

+58
-38
lines changed

geos-trame/src/geos/trame/app/ui/viewer/boxViewer.py

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -22,32 +22,35 @@ def __init__( self, mesh: pv.UnstructuredGrid, box: Box ) -> None:
2222
self._box_polydata: pv.PolyData = None
2323
self._box_polydata_actor: pv.Actor = None
2424

25-
self._extracted_cell: pv.UnstructuredGrid = None
26-
self._extracted_cell_actor: pv.Actor = None
25+
self._extracted_cells: pv.UnstructuredGrid = None
26+
self._extracted_cells_actor: pv.Actor = None
2727

2828
self._compute_box_as_polydata()
2929
self._compute_intersected_cell()
3030

31-
def append_to_plotter( self, plotter: pv.Plotter ) -> None:
32-
"""Append the box and the intersected cell to the plotter.
31+
def get_box_polydata( self ) -> pv.PolyData | None:
32+
"""Get the box polydata."""
33+
return self._box_polydata
3334

34-
The box is represented as a polydata with a low opacity.
35-
"""
36-
self._box_polydata_actor = plotter.add_mesh( self._box_polydata, opacity=0.2 )
35+
def get_box_polydata_actor( self ) -> pv.Actor:
36+
"""Get the actor generated by a pv.Plotter for the box polydata."""
37+
return self._box_polydata_actor
3738

38-
if self._extracted_cell is not None:
39-
self._extracted_cell_actor = plotter.add_mesh( self._extracted_cell, show_edges=True )
39+
def get_extracted_cells( self ) -> pv.UnstructuredGrid | None:
40+
"""Get the extracted cell polydata."""
41+
return self._extracted_cells
4042

41-
def reset( self, plotter: pv.Plotter ) -> None:
42-
"""Reset the box viewer by removing the box and the intersected cell from the plotter."""
43-
if self._box_polydata_actor is not None:
44-
plotter.remove_actor( self._box_polydata_actor )
43+
def get_extracted_cells_actor( self ) -> pv.Actor | None:
44+
"""Get the extracted cell polydata actor."""
45+
return self._extracted_cells_actor
4546

46-
if self._extracted_cell_actor is not None:
47-
plotter.remove_actor( self._extracted_cell_actor )
47+
def set_box_polydata_actor( self, box_actor: pv.Actor ) -> None:
48+
"""Set the actor generated by a pv.Plotter for the box polydata."""
49+
self._box_polydata_actor = box_actor
4850

49-
self._box_polydata = None
50-
self._extracted_cell = None
51+
def set_extracted_cells_actor( self, extracted_cell: pv.Actor ) -> None:
52+
"""Set the actor generated by a pv.Plotter for the extracted cell."""
53+
self._extracted_cells_actor = extracted_cell
5154

5255
def _compute_box_as_polydata( self ) -> None:
5356
"""Create a polydata reresenting a BBox using pyvista and coordinates from the Geos Box."""
@@ -95,7 +98,7 @@ def _compute_intersected_cell( self ) -> None:
9598
saved_ids.append( id )
9699

97100
if len( saved_ids ) > 0:
98-
self._extracted_cell = self._mesh.extract_cells( saved_ids )
101+
self._extracted_cells = self._mesh.extract_cells( saved_ids )
99102

100103
def _check_cell_inside_box( self, cell: pv.Cell, box_bounds: list[ float ] ) -> bool:
101104
"""Check if the cell is inside the box bounds.

geos-trame/src/geos/trame/app/ui/viewer/viewer.py

Lines changed: 36 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ def __init__(
3636
- Vtkwell,
3737
- Perforation,
3838
- InternalWell
39+
- Box
3940
4041
Everything is handle in the method 'update_viewer()' which is trigger when the
4142
'state.object_state' changed (see DeckTree).
@@ -124,7 +125,7 @@ def rendering_menu_extra_items( self ) -> None:
124125
def update_viewer( self, active_block: BaseModel, path: str, show_obj: bool ) -> None:
125126
"""Add from path the dataset given by the user.
126127
127-
Supported data type is: Vtkwell, Vtkmesh, InternalWell, Perforation.
128+
Supported data type is: Vtkwell, Vtkmesh, InternalWell, Perforation, Box.
128129
129130
object_state : array used to store path to the data and if we want to show it or not.
130131
"""
@@ -141,24 +142,10 @@ def update_viewer( self, active_block: BaseModel, path: str, show_obj: bool ) ->
141142
self._update_perforation( active_block, show_obj, path )
142143

143144
if isinstance( active_block, Box ):
144-
if self.region_engine.input.number_of_cells == 0 and show_obj:
145-
self.ctrl.on_add_warning(
146-
"Can't display " + active_block.name,
147-
"Please display the mesh before creating a well",
148-
)
149-
return
145+
self._update_box( active_block, show_obj )
150146

151-
if self.box_engine is not None:
152-
self.box_engine.reset( self.plotter )
153-
154-
if not show_obj:
155-
return
156-
157-
box: Box = active_block
158-
self.box_engine = BoxViewer( self.region_engine.input, box )
159-
self.box_engine.append_to_plotter( self.plotter )
160-
161-
# make sure that added data in the plot will be rendered with the correct scalar array/lut
147+
# when data is added in the pv.Plotter, we need to refresh the scene to update
148+
# the actor to avoid LUT issue.
162149
self.plotter.update()
163150

164151
def _on_clip_visibility_change( self, **kwargs: Any ) -> None:
@@ -353,6 +340,36 @@ def _add_perforation( self, distance_from_head: float, path: str ) -> None:
353340
cell_id = self.region_engine.input.find_closest_cell( point_offsetted )
354341
cell = self.region_engine.input.extract_cells( [ cell_id ] )
355342
cell_actor = self.plotter.add_mesh( cell )
356-
saved_perforation.add_extracted_cell( cell_actor )
343+
saved_perforation.add_extracted_cells( cell_actor )
357344

358345
self._perforations[ path ] = saved_perforation
346+
347+
def _update_box( self, active_block: Box, show_obj: bool ) -> None:
348+
"""Generate and display a Box and inner cell(s) from the mesh."""
349+
if self.region_engine.input.number_of_cells == 0 and show_obj:
350+
self.ctrl.on_add_warning(
351+
"Can't display " + active_block.name,
352+
"Please display the mesh before creating a well",
353+
)
354+
return
355+
356+
if self.box_engine is not None:
357+
box_polydata_actor: pv.Actor = self.box_engine.get_box_polydata_actor()
358+
extracted_cell_actor: pv.Actor = self.box_engine.get_extracted_cells_actor()
359+
self.plotter.remove_actor( box_polydata_actor )
360+
self.plotter.remove_actor( extracted_cell_actor )
361+
362+
if not show_obj:
363+
return
364+
365+
box: Box = active_block
366+
self.box_engine = BoxViewer( self.region_engine.input, box )
367+
368+
box_polydata: pv.PolyData = self.box_engine.get_box_polydata()
369+
extracted_cell: pv.UnstructuredGrid = self.box_engine.get_extracted_cells()
370+
371+
if box_polydata is not None and extracted_cell is not None:
372+
_box_polydata_actor = self.plotter.add_mesh( box_polydata, opacity=0.2 )
373+
_extracted_cells_actor = self.plotter.add_mesh( extracted_cell, show_edges=True )
374+
self.box_engine.set_box_polydata_actor( _box_polydata_actor )
375+
self.box_engine.set_extracted_cells_actor( _extracted_cells_actor )

geos-trame/tests/test_box_intersection.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def test_box_intersection( trame_server_layout: tuple[ Server, VAppLayout ] ) ->
2727
app.deckInspector.state.flush()
2828

2929
box = app.deckViewer.box_engine._box
30-
cells = app.deckViewer.box_engine._extracted_cell
30+
cells = app.deckViewer.box_engine._extracted_cells
3131

3232
assert box is not None
3333
assert box.x_min == '{ 3509, 4117, -596 }'

0 commit comments

Comments
 (0)