Skip to content

Commit 8110f3f

Browse files
committed
vtkHardwarePicker instead of vtkCellPicker
1 parent f3052f4 commit 8110f3f

3 files changed

Lines changed: 16 additions & 77 deletions

File tree

src/opengeodeweb_viewer/object/object_methods.py

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,11 @@
99
vtkActor,
1010
vtkTexture,
1111
vtkCompositePolyDataMapper,
12-
vtkCompositeDataDisplayAttributes,
1312
vtkDataSetMapper,
1413
)
1514
from vtkmodules.vtkCommonDataModel import (
1615
vtkDataSet,
17-
vtkMultiBlockDataSet,
1816
)
19-
from vtkmodules.vtkFiltersExtraction import vtkExtractSelection
2017

2118
# Local application imports
2219
from opengeodeweb_viewer.vtk_protocol import VtkView, VtkPipeline
@@ -133,27 +130,6 @@ def SetPointsColor(
133130
actor = self.get_vtk_pipeline(data_id).actor
134131
actor.GetProperty().SetVertexColor([red / 255, green / 255, blue / 255])
135132

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-
157133
def SetBlocksVisibility(
158134
self, data_id: str, block_ids: list[int], visibility: bool
159135
) -> None:
@@ -165,18 +141,6 @@ def SetBlocksVisibility(
165141
visibility_attributes = mapper.GetCompositeDataDisplayAttributes()
166142
for block_id in block_ids:
167143
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-
)
180144

181145
def SetBlocksColor(
182146
self,

src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
vtkRenderWindowInteractor,
1414
vtkAbstractMapper,
1515
vtkWorldPointPicker,
16-
vtkCellPicker,
16+
vtkHardwarePicker,
1717
vtkPropPicker,
1818
vtkDataSetMapper,
1919
vtkActor,
@@ -261,7 +261,8 @@ def pickedIds(self, rpc_params: RpcParams) -> dict[str, list[str] | int | None]:
261261
rpc_params, self.viewer_schemas_dict["picked_ids"], self.viewer_prefix
262262
)
263263
params = schemas.PickedIDS.from_dict(rpc_params)
264-
picker = vtkCellPicker(tolerance=0.005)
264+
picker = vtkHardwarePicker()
265+
picker.SetPixelTolerance(15)
265266
actors, flat_index = self.pick_actors_under_coordinate(
266267
params.ids, params.x, params.y, picker
267268
)
@@ -273,13 +274,6 @@ def pickedIds(self, rpc_params: RpcParams) -> dict[str, list[str] | int | None]:
273274
if not array_ids:
274275
return {"array_ids": [], "viewer_id": None}
275276
viewer_id = flat_index if flat_index != -1 else None
276-
if viewer_id is not None:
277-
pipeline = self.get_vtk_pipeline(array_ids[0])
278-
dataset, geode_id, is_visible = self.get_composite_block_info(
279-
pipeline, picker
280-
)
281-
if not is_visible:
282-
return {"array_ids": [], "viewer_id": None}
283277
return {
284278
"array_ids": array_ids,
285279
"viewer_id": viewer_id,
@@ -338,18 +332,16 @@ def setHighlight(
338332
)
339333
params = schemas.Highlight.from_dict(rpc_params)
340334
self.clear_highlights(params.ids)
341-
picker = vtkCellPicker(tolerance=0.005)
335+
picker = vtkHardwarePicker()
336+
picker.SetPixelTolerance(15)
342337
data_id, id_to_select = self.pick_cell_or_point(
343338
params.ids, params.x, params.y, params.field_type.value, picker
344339
)
345340
if not data_id or id_to_select == -1:
346341
self.render(-1)
347342
return {}
348343
pipeline = self.get_vtk_pipeline(data_id)
349-
dataset, geode_id, is_visible = self.get_composite_block_info(pipeline, picker)
350-
if not is_visible:
351-
self.render(-1)
352-
return {}
344+
dataset, geode_id = self.get_composite_block_info(pipeline, picker)
353345
self.update_highlight(pipeline, id_to_select, params.field_type.value, dataset)
354346
self.render(-1)
355347
data_attributes = self.extract_picked_attributes(

src/opengeodeweb_viewer/vtk_protocol.py

Lines changed: 10 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
vtkRenderWindow,
2020
vtkDataSetMapper,
2121
vtkCompositePolyDataMapper,
22-
vtkCellPicker,
22+
vtkHardwarePicker,
2323
)
2424
from vtkmodules.vtkCommonDataModel import (
2525
vtkDataObject,
@@ -79,7 +79,6 @@ class VtkPipeline:
7979
blockGeodeIds: list[str] = field(default_factory=list)
8080
scalarBar: vtkScalarBarActor = field(default_factory=vtkScalarBarActor)
8181
block_styles: dict[int, BlockStyle] = field(default_factory=dict)
82-
pick_mapper: vtkMapper | None = None
8382

8483

8584
class VtkTypingMixin:
@@ -196,26 +195,16 @@ def clear_highlights(self, data_ids: list[str]) -> None:
196195
pipeline = self.get_vtk_pipeline(data_id)
197196
pipeline.highlight.actor.VisibilityOff()
198197

199-
def swap_pick_mappers(self, data_ids: list[str], use_pick_mapper: bool) -> None:
200-
for data_id in data_ids:
201-
pipeline = self.get_vtk_pipeline(data_id)
202-
if pipeline.pick_mapper:
203-
mapper = pipeline.pick_mapper if use_pick_mapper else pipeline.mapper
204-
pipeline.actor.SetMapper(mapper)
205-
206198
def pick_cell_or_point(
207199
self,
208200
data_ids: list[str],
209201
x: float,
210202
y: float,
211203
field_type: str,
212-
picker: vtkCellPicker,
204+
picker: vtkHardwarePicker,
213205
) -> tuple[str | None, int]:
214-
self.swap_pick_mappers(data_ids, use_pick_mapper=True)
215-
try:
216-
picker.Pick(x, y, 0, self.get_renderer())
217-
finally:
218-
self.swap_pick_mappers(data_ids, use_pick_mapper=False)
206+
picker.SetSnapToMeshPoint(field_type == "POINT")
207+
picker.Pick(x, y, 0, self.get_renderer())
219208
actor = picker.GetActor()
220209
data_id = next(
221210
(
@@ -231,10 +220,9 @@ def pick_cell_or_point(
231220
return data_id, id_to_select
232221

233222
def pick_actors_under_coordinate(
234-
self, data_ids: list[str], x: float, y: float, picker: vtkCellPicker
223+
self, data_ids: list[str], x: float, y: float, picker: vtkHardwarePicker
235224
) -> tuple[list[vtkActor], int]:
236225
renderer = self.get_renderer()
237-
self.swap_pick_mappers(data_ids, use_pick_mapper=True)
238226
actors = []
239227
viewer_id = -1
240228
try:
@@ -247,28 +235,23 @@ def pick_actors_under_coordinate(
247235
finally:
248236
for actor in actors:
249237
actor.SetPickable(True)
250-
self.swap_pick_mappers(data_ids, use_pick_mapper=False)
251238
return actors, viewer_id
252239

253240
def get_composite_block_info(
254-
self, pipeline: VtkPipeline, picker: vtkCellPicker
255-
) -> tuple[vtkDataObject | None, str | None, bool]:
241+
self, pipeline: VtkPipeline, picker: vtkHardwarePicker
242+
) -> tuple[vtkDataObject | None, str | None]:
256243
if not isinstance(pipeline.mapper, vtkCompositePolyDataMapper):
257-
return None, None, True
244+
return None, None
258245
flat_index = picker.GetFlatBlockIndex()
259246
if not (0 <= flat_index < len(pipeline.blockDataSets)):
260-
return None, None, True
247+
return None, None
261248
dataset = pipeline.blockDataSets[flat_index]
262-
if dataset:
263-
attr = pipeline.mapper.GetCompositeDataDisplayAttributes()
264-
if attr and not attr.GetBlockVisibility(dataset):
265-
return None, None, False
266249
geode_id = (
267250
pipeline.blockGeodeIds[flat_index]
268251
if flat_index < len(pipeline.blockGeodeIds)
269252
else None
270253
)
271-
return dataset, geode_id, True
254+
return dataset, geode_id
272255

273256
def get_array_values(self, array: Any, id_to_select: int) -> list[float] | float:
274257
components = array.GetNumberOfComponents()

0 commit comments

Comments
 (0)