Skip to content

Commit 130bf39

Browse files
authored
Merge pull request #157 from Geode-solutions/fix/highlight-visibility
Fix/highlight visibility
2 parents 516c3a1 + c6fee26 commit 130bf39

4 files changed

Lines changed: 70 additions & 4 deletions

File tree

requirements.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,4 +63,3 @@ wslink==1.12.4
6363
yarl>=1
6464
# via aiohttp
6565

66-
opengeodeweb-microservice==1.*,>=1.1.3

src/opengeodeweb_viewer/object/object_methods.py

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
)
1515
from vtkmodules.vtkCommonDataModel import (
1616
vtkDataSet,
17+
vtkMultiBlockDataSet,
1718
)
1819
from vtkmodules.vtkFiltersExtraction import vtkExtractSelection
1920

@@ -132,6 +133,27 @@ def SetPointsColor(
132133
actor = self.get_vtk_pipeline(data_id).actor
133134
actor.GetProperty().SetVertexColor([red / 255, green / 255, blue / 255])
134135

136+
def _prune_hidden_blocks(
137+
self,
138+
dataset: vtkMultiBlockDataSet,
139+
visibility_attributes: vtkCompositeDataDisplayAttributes,
140+
) -> vtkMultiBlockDataSet:
141+
pruned = vtkMultiBlockDataSet()
142+
pruned.SetNumberOfBlocks(dataset.GetNumberOfBlocks())
143+
for index in range(dataset.GetNumberOfBlocks()):
144+
block = dataset.GetBlock(index)
145+
if block is None:
146+
continue
147+
if not visibility_attributes.GetBlockVisibility(block):
148+
continue
149+
if isinstance(block, vtkMultiBlockDataSet):
150+
pruned.SetBlock(
151+
index, self._prune_hidden_blocks(block, visibility_attributes)
152+
)
153+
else:
154+
pruned.SetBlock(index, block)
155+
return pruned
156+
135157
def SetBlocksVisibility(
136158
self, data_id: str, block_ids: list[int], visibility: bool
137159
) -> None:
@@ -140,9 +162,21 @@ def SetBlocksVisibility(
140162
if not isinstance(mapper, vtkCompositePolyDataMapper):
141163
raise Exception("Mapper is not a vtkCompositePolyDataMapper")
142164
blocks = pipeline.blockDataSets
143-
attributes = mapper.GetCompositeDataDisplayAttributes()
165+
visibility_attributes = mapper.GetCompositeDataDisplayAttributes()
144166
for block_id in block_ids:
145-
attributes.SetBlockVisibility(blocks[block_id], visibility)
167+
visibility_attributes.SetBlockVisibility(blocks[block_id], visibility)
168+
dataset = (
169+
pipeline.filter.GetOutputDataObject(0)
170+
if pipeline.filter
171+
else pipeline.reader.GetOutputDataObject(0)
172+
)
173+
if not isinstance(dataset, vtkMultiBlockDataSet):
174+
return
175+
if pipeline.pick_mapper is None:
176+
pipeline.pick_mapper = vtkCompositePolyDataMapper()
177+
pipeline.pick_mapper.SetInputDataObject(
178+
self._prune_hidden_blocks(dataset, visibility_attributes)
179+
)
146180

147181
def SetBlocksColor(
148182
self,

src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,16 @@ def pickedIds(self, rpc_params: RpcParams) -> dict[str, list[str] | int | None]:
264264
params = schemas.PickedIDS.from_dict(rpc_params)
265265
renderer = self.getView("-1").GetRenderers().GetFirstRenderer()
266266

267+
pipelines_to_restore = [
268+
pipeline
269+
for pipeline_id in params.ids
270+
if (pipeline := self.get_vtk_pipeline(pipeline_id)).pick_mapper is not None
271+
]
272+
for pipeline in pipelines_to_restore:
273+
pick_mapper = pipeline.pick_mapper
274+
if pick_mapper is not None:
275+
pipeline.actor.SetMapper(pick_mapper)
276+
267277
actors = []
268278
picker = vtkCellPicker(tolerance=0.005)
269279
picker.Pick(params.x, params.y, 0, renderer)
@@ -278,6 +288,8 @@ def pickedIds(self, rpc_params: RpcParams) -> dict[str, list[str] | int | None]:
278288

279289
for actor in actors:
280290
actor.SetPickable(True)
291+
for pipeline in pipelines_to_restore:
292+
pipeline.actor.SetMapper(pipeline.mapper)
281293

282294
array_ids = [
283295
id for id in params.ids if self.get_vtk_pipeline(id).actor in actors
@@ -351,7 +363,22 @@ def setHighlight(
351363
)
352364
params = schemas.Highlight.from_dict(rpc_params)
353365
picker = vtkCellPicker(tolerance=0.005)
354-
picker.Pick(params.x, params.y, 0, self.get_renderer())
366+
367+
pipelines_to_restore = [
368+
pipeline
369+
for pipeline_id in params.ids
370+
if (pipeline := self.get_vtk_pipeline(pipeline_id)).pick_mapper is not None
371+
]
372+
for pipeline in pipelines_to_restore:
373+
pick_mapper = pipeline.pick_mapper
374+
if pick_mapper is not None:
375+
pipeline.actor.SetMapper(pick_mapper)
376+
try:
377+
picker.Pick(params.x, params.y, 0, self.get_renderer())
378+
finally:
379+
for pipeline in pipelines_to_restore:
380+
pipeline.actor.SetMapper(pipeline.mapper)
381+
355382
self.clear_highlights(params.ids)
356383
actor = picker.GetActor()
357384
pipeline_id = next(
@@ -377,6 +404,11 @@ def setHighlight(
377404
if 0 <= flat_index < len(pipeline.blockDataSets)
378405
else None
379406
)
407+
if dataset:
408+
attr = pipeline.mapper.GetCompositeDataDisplayAttributes()
409+
if attr and not attr.GetBlockVisibility(dataset):
410+
self.render(-1)
411+
return {}
380412
geode_id = (
381413
pipeline.blockGeodeIds[flat_index]
382414
if 0 <= flat_index < len(pipeline.blockGeodeIds)

src/opengeodeweb_viewer/vtk_protocol.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ class VtkPipeline:
7777
blockGeodeIds: list[str] = field(default_factory=list)
7878
scalarBar: vtkScalarBarActor = field(default_factory=vtkScalarBarActor)
7979
block_styles: dict[int, BlockStyle] = field(default_factory=dict)
80+
pick_mapper: vtkMapper | None = None
8081

8182

8283
class VtkTypingMixin:

0 commit comments

Comments
 (0)