Skip to content

Commit b39518c

Browse files
committed
changes, new rpc : picked_ids formerly get_mouse
1 parent 1d9fe8b commit b39518c

File tree

3 files changed

+60
-18
lines changed

3 files changed

+60
-18
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"rpc": "get_mouse",
2+
"rpc": "picked_ids",
33
"schema": {
44
"type": "object",
55
"properties": {
@@ -8,11 +8,18 @@
88
},
99
"y": {
1010
"type": "number"
11+
},
12+
"ids": {
13+
"type": "array",
14+
"items": {
15+
"type": "string"
16+
}
1117
}
1218
},
1319
"required": [
1420
"x",
15-
"y"
21+
"y",
22+
"ids"
1623
]
1724
}
1825
}

src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# Standard library imports
22
import json
3+
import math
34
import os
45
from pathlib import Path
56

@@ -147,12 +148,43 @@ def reset(self, params):
147148
renderWindow = self.getView("-1")
148149
renderWindow.GetRenderers().GetFirstRenderer().RemoveAllViewProps()
149150

150-
@exportRpc(prefix + schemas_dict["get_mouse"]["rpc"])
151-
def getMouse(self, params):
152-
print(self.schemas_dict["get_mouse"]["rpc"], f"{params=}", flush=True)
153-
validate_schema(params, self.schemas_dict["get_mouse"])
151+
def computeEpsilon(self, renderer, z):
152+
renderer.SetDisplayPoint(0, 0, z)
153+
renderer.DisplayToWorld()
154+
windowLowerLeft = renderer.GetWorldPoint()
155+
size = renderer.GetRenderWindow().GetSize()
156+
renderer.SetDisplayPoint(size[0], size[1], z)
157+
renderer.DisplayToWorld()
158+
windowUpperRight = renderer.GetWorldPoint()
159+
epsilon = 0
160+
for i in range(3):
161+
epsilon += (windowUpperRight[i] - windowLowerLeft[i]) * (
162+
windowUpperRight[i] - windowLowerLeft[i]
163+
)
164+
return math.sqrt(epsilon) * 0.0125
165+
166+
@exportRpc(prefix + schemas_dict["picked_ids"]["rpc"])
167+
def pickedIds(self, params):
168+
print(self.schemas_dict["picked_ids"]["rpc"], f"{params=}", flush=True)
169+
validate_schema(params, self.schemas_dict["picked_ids"])
154170
x = params["x"]
155171
y = params["y"]
156-
mouse_ids = ["id1", "id2", "id3"]
172+
ids = params["ids"]
157173

158-
return {"mouse_ids": mouse_ids}
174+
renderWindow = self.getView("-1")
175+
renderer = renderWindow.GetRenderers().GetFirstRenderer()
176+
picker = vtk.vtkWorldPointPicker()
177+
picker.Pick([x, y, 0], renderer)
178+
point = picker.GetPickPosition()
179+
epsilon = self.computeEpsilon(renderer, point[2])
180+
bbox = vtk.vtkBoundingBox()
181+
bbox.AddPoint(point[0] + epsilon, point[1] + epsilon, point[2] + epsilon)
182+
bbox.AddPoint(point[0] - epsilon, point[1] - epsilon, point[2] - epsilon)
183+
184+
array_ids = []
185+
for id in ids:
186+
bounds = self.get_object(id)["actor"].GetBounds()
187+
if bbox.Intersects(bounds):
188+
array_ids.append(id)
189+
190+
return {"array_ids": array_ids}

src/tests/test_viewer_protocols.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -137,22 +137,25 @@ def test_take_screenshot(server):
137137
assert server.images_diff(first_image_path, second_image_path) == 0.0
138138

139139

140-
def test_get_mouse(server):
140+
def test_picked_ids(server):
141+
142+
test_register_mesh(server)
143+
141144
server.call(
142-
VtkViewerView.prefix + VtkViewerView.schemas_dict["get_mouse"]["rpc"],
143-
[{"x": 100, "y": 200}],
145+
VtkViewerView.prefix + VtkViewerView.schemas_dict["picked_ids"]["rpc"],
146+
[{"x": 100, "y": 200, "ids": ["123456789"]}],
144147
)
145148
response = server.get_response()
146149

147-
print(f"Response: {response}")
150+
print(f"Response: {response}", flush=True)
148151

149152
assert "result" in response, f"Key 'result' not found in response: {response}"
150153

151154
assert (
152-
"mouse_ids" in response["result"]
153-
), f"Key 'mouse_ids' not found in response['result']: {response['result']}"
155+
"array_ids" in response["result"]
156+
), f"Key 'array_ids' not found in response['result']: {response['result']}"
154157

155-
mouse_ids = response["result"]["mouse_ids"]
156-
assert isinstance(mouse_ids, list), f"Expected a list, but got {type(mouse_ids)}"
157-
assert all(isinstance(id, str) for id in mouse_ids), "All IDs should be strings"
158-
assert len(mouse_ids) > 0, "The list of mouse_ids should not be empty"
158+
array_ids = response["result"]["array_ids"]
159+
assert isinstance(array_ids, list), f"Expected a list, but got {type(array_ids)}"
160+
assert all(isinstance(id, str) for id in array_ids), "All IDs should be strings"
161+
assert len(array_ids) > 0, "The list of array_ids should not be empty"

0 commit comments

Comments
 (0)