Skip to content

Commit 7cf99ba

Browse files
authored
Merge pull request #30 from Geode-solutions/get_mouse
Get_mouse
2 parents b38eb62 + b39518c commit 7cf99ba

File tree

4 files changed

+150
-17
lines changed

4 files changed

+150
-17
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{
2+
"rpc": "picked_ids",
3+
"schema": {
4+
"type": "object",
5+
"properties": {
6+
"x": {
7+
"type": "number"
8+
},
9+
"y": {
10+
"type": "number"
11+
},
12+
"ids": {
13+
"type": "array",
14+
"items": {
15+
"type": "string"
16+
}
17+
}
18+
},
19+
"required": [
20+
"x",
21+
"y",
22+
"ids"
23+
]
24+
}
25+
}

src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py

Lines changed: 50 additions & 4 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

@@ -14,6 +15,7 @@
1415
from opengeodeweb_viewer.utils_functions import get_schemas_dict, validate_schema
1516
from opengeodeweb_viewer.vtk_protocol import VtkView
1617

18+
1719
class VtkViewerView(VtkView):
1820
prefix = "opengeodeweb_viewer.viewer."
1921
schemas_dict = get_schemas_dict(os.path.join(os.path.dirname(__file__), "schemas"))
@@ -23,7 +25,9 @@ def __init__(self):
2325

2426
@exportRpc(prefix + schemas_dict["create_visualization"]["rpc"])
2527
def createVisualization(self, params):
26-
print(self.schemas_dict["create_visualization"]["rpc"], f"{params=}", flush=True)
28+
print(
29+
self.schemas_dict["create_visualization"]["rpc"], f"{params=}", flush=True
30+
)
2731
validate_schema(params, self.schemas_dict["create_visualization"])
2832
renderWindow = self.getView("-1")
2933
renderer = renderWindow.GetRenderers().GetFirstRenderer()
@@ -34,7 +38,9 @@ def createVisualization(self, params):
3438

3539
@exportRpc(prefix + schemas_dict["set_background_color"]["rpc"])
3640
def setBackgroundColor(self, params):
37-
print(self.schemas_dict["set_background_color"]["rpc"], f"{params=}", flush=True)
41+
print(
42+
self.schemas_dict["set_background_color"]["rpc"], f"{params=}", flush=True
43+
)
3844
validate_schema(params, self.schemas_dict["set_background_color"])
3945
renderWindow = self.getView("-1")
4046
renderer = renderWindow.GetRenderers().GetFirstRenderer()
@@ -90,7 +96,7 @@ def takeScreenshot(self, params):
9096
else:
9197
raise Exception("output_extension not supported")
9298

93-
new_filename = filename + '.' + output_extension
99+
new_filename = filename + "." + output_extension
94100
file_path = os.path.join(self.DATA_FOLDER_PATH, new_filename)
95101
writer.SetFileName(file_path)
96102
writer.SetInputConnection(w2if.GetOutputPort())
@@ -101,7 +107,6 @@ def takeScreenshot(self, params):
101107

102108
return {"blob": self.addAttachment(file_content)}
103109

104-
105110
@exportRpc(prefix + schemas_dict["update_data"]["rpc"])
106111
def updateData(self, params):
107112
print(self.schemas_dict["update_data"]["rpc"], f"{params=}", flush=True)
@@ -142,3 +147,44 @@ def reset(self, params):
142147
validate_schema(params, self.schemas_dict["reset"])
143148
renderWindow = self.getView("-1")
144149
renderWindow.GetRenderers().GetFirstRenderer().RemoveAllViewProps()
150+
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"])
170+
x = params["x"]
171+
y = params["y"]
172+
ids = params["ids"]
173+
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: 75 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,37 @@
77
# Local application imports
88
from .test_mesh_protocols import test_register_mesh
99

10+
1011
def test_create_visualization(server):
11-
server.call(VtkViewerView.prefix + VtkViewerView.schemas_dict["create_visualization"]["rpc"])
12+
server.call(
13+
VtkViewerView.prefix + VtkViewerView.schemas_dict["create_visualization"]["rpc"]
14+
)
1215
assert server.compare_image(3, "viewer/create_visualization.jpeg") == True
1316

17+
1418
def test_reset_camera(server):
15-
server.call(VtkViewerView.prefix + VtkViewerView.schemas_dict["reset_camera"]["rpc"])
19+
server.call(
20+
VtkViewerView.prefix + VtkViewerView.schemas_dict["reset_camera"]["rpc"]
21+
)
1622
assert server.compare_image(3, "viewer/reset_camera.jpeg") == True
1723

24+
1825
def test_set_viewer_background_color(server):
19-
server.call(VtkViewerView.prefix + VtkViewerView.schemas_dict["set_background_color"]["rpc"], [{"red": 0, "green": 0, "blue": 255}])
26+
server.call(
27+
VtkViewerView.prefix
28+
+ VtkViewerView.schemas_dict["set_background_color"]["rpc"],
29+
[{"red": 0, "green": 0, "blue": 255}],
30+
)
2031
assert server.compare_image(3, "viewer/set_background_color.jpeg") == True
2132

22-
def test_get_point_position(server):
2333

34+
def test_get_point_position(server):
2435
test_register_mesh(server)
2536

26-
server.call(VtkViewerView.prefix + VtkViewerView.schemas_dict["get_point_position"]["rpc"], [{"x": 0, "y": 0}])
37+
server.call(
38+
VtkViewerView.prefix + VtkViewerView.schemas_dict["get_point_position"]["rpc"],
39+
[{"x": 0, "y": 0}],
40+
)
2741
response = server.get_response()
2842
assert "x" in response["result"]
2943
assert "y" in response["result"]
@@ -43,7 +57,13 @@ def test_take_screenshot(server):
4357
# Take a screenshot with background jpg
4458
server.call(
4559
VtkViewerView.prefix + VtkViewerView.schemas_dict["take_screenshot"]["rpc"],
46-
[{"filename": "take_screenshot_with_background", "output_extension": "jpg", "include_background": True}],
60+
[
61+
{
62+
"filename": "take_screenshot_with_background",
63+
"output_extension": "jpg",
64+
"include_background": True,
65+
}
66+
],
4767
)
4868

4969
response = server.get_response()
@@ -54,16 +74,24 @@ def test_take_screenshot(server):
5474
f.write(blob)
5575
f.close()
5676
first_image_path = os.path.join(server.test_output_dir, "test.jpg")
57-
second_image_path = os.path.join(server.images_dir_path, "viewer/take_screenshot_with_background.jpg")
77+
second_image_path = os.path.join(
78+
server.images_dir_path, "viewer/take_screenshot_with_background.jpg"
79+
)
5880

5981
assert server.images_diff(first_image_path, second_image_path) == 0.0
6082

6183
# Take a screenshot without background png
6284
server.call(
6385
VtkViewerView.prefix + VtkViewerView.schemas_dict["take_screenshot"]["rpc"],
64-
[{"filename": "take_screenshot_without_background", "output_extension": "png", "include_background": True}],
86+
[
87+
{
88+
"filename": "take_screenshot_without_background",
89+
"output_extension": "png",
90+
"include_background": True,
91+
}
92+
],
6593
)
66-
94+
6795
response = server.get_response()
6896
response = server.get_response()
6997
blob = server.get_response()
@@ -74,16 +102,24 @@ def test_take_screenshot(server):
74102
f.write(blob)
75103
f.close()
76104
first_image_path = os.path.join(server.test_output_dir, "test.png")
77-
second_image_path = os.path.join(server.images_dir_path, "viewer/take_screenshot_without_background.png")
105+
second_image_path = os.path.join(
106+
server.images_dir_path, "viewer/take_screenshot_without_background.png"
107+
)
78108

79109
assert server.images_diff(first_image_path, second_image_path) == 0.0
80110

81111
# Take a screenshot with background png
82112
server.call(
83113
VtkViewerView.prefix + VtkViewerView.schemas_dict["take_screenshot"]["rpc"],
84-
[{"filename": "take_screenshot_with_background", "output_extension": "png", "include_background": True}],
114+
[
115+
{
116+
"filename": "take_screenshot_with_background",
117+
"output_extension": "png",
118+
"include_background": True,
119+
}
120+
],
85121
)
86-
122+
87123
response = server.get_response()
88124
response = server.get_response()
89125
blob = server.get_response()
@@ -94,6 +130,32 @@ def test_take_screenshot(server):
94130
f.write(blob)
95131
f.close()
96132
first_image_path = os.path.join(server.test_output_dir, "test.png")
97-
second_image_path = os.path.join(server.images_dir_path, "viewer/take_screenshot_with_background.png")
133+
second_image_path = os.path.join(
134+
server.images_dir_path, "viewer/take_screenshot_with_background.png"
135+
)
98136

99137
assert server.images_diff(first_image_path, second_image_path) == 0.0
138+
139+
140+
def test_picked_ids(server):
141+
142+
test_register_mesh(server)
143+
144+
server.call(
145+
VtkViewerView.prefix + VtkViewerView.schemas_dict["picked_ids"]["rpc"],
146+
[{"x": 100, "y": 200, "ids": ["123456789"]}],
147+
)
148+
response = server.get_response()
149+
150+
print(f"Response: {response}", flush=True)
151+
152+
assert "result" in response, f"Key 'result' not found in response: {response}"
153+
154+
assert (
155+
"array_ids" in response["result"]
156+
), f"Key 'array_ids' not found in response['result']: {response['result']}"
157+
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"

src/tests/tests_output/test.jpeg

77 Bytes
Loading

0 commit comments

Comments
 (0)