Skip to content

Commit 72763bf

Browse files
committed
feat(New RPCs): Added update_camera & render_now
1 parent 989bff9 commit 72763bf

File tree

6 files changed

+193
-0
lines changed

6 files changed

+193
-0
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"rpc": "render_now",
3+
"type": "object",
4+
"properties": {
5+
"view": {
6+
"type": "integer",
7+
"default": -1
8+
}
9+
},
10+
"required": []
11+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
{
2+
"rpc": "update_camera",
3+
"type": "object",
4+
"properties": {
5+
"camera_options": {
6+
"focal_point": {
7+
"type": "array",
8+
"items": {
9+
"type": "number"
10+
},
11+
"minItems": 3,
12+
"maxItems": 3
13+
},
14+
"view_up": {
15+
"type": "array",
16+
"items": {
17+
"type": "number"
18+
},
19+
"minItems": 3,
20+
"maxItems": 3
21+
},
22+
"position": {
23+
"type": "array",
24+
"items": {
25+
"type": "number"
26+
},
27+
"minItems": 3,
28+
"maxItems": 3
29+
},
30+
"view_angle": {
31+
"type": "number"
32+
},
33+
"clipping_range": {
34+
"type": "array",
35+
"items": {
36+
"type": "number"
37+
},
38+
"minItems": 2,
39+
"maxItems": 2
40+
},
41+
"required": [
42+
"focal_point",
43+
"view_up",
44+
"position",
45+
"view_angle",
46+
"clipping_range"
47+
]
48+
},
49+
"bool_render": {
50+
"type": "boolean",
51+
"default": true
52+
}
53+
},
54+
"required": [
55+
"camera_options",
56+
"bool_render"
57+
]
58+
}

src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,3 +224,55 @@ def updateData(self, params):
224224
actor = self.get_object(id)["actor"]
225225
actor.SetVisibility(visibility)
226226
self.render()
227+
228+
@exportRpc(viewer_prefix + viewer_schemas_dict["update_camera"]["rpc"])
229+
def updateCamera(self, params):
230+
validate_schema(
231+
params, self.viewer_schemas_dict["update_camera"], self.viewer_prefix
232+
)
233+
234+
print(f"params: {params}", flush=True)
235+
236+
camera_options = params["camera_options"]
237+
focal_point = camera_options["focal_point"]
238+
view_up = camera_options["view_up"]
239+
position = camera_options["position"]
240+
view_angle = camera_options["view_angle"]
241+
clipping_range = camera_options["clipping_range"]
242+
bool_render = params["bool_render"]
243+
244+
renderWindow = self.getView("-1")
245+
camera = renderWindow.GetRenderers().GetFirstRenderer().GetActiveCamera()
246+
247+
camera.SetFocalPoint(*focal_point)
248+
camera.SetViewUp(*view_up)
249+
camera.SetPosition(*position)
250+
camera.SetViewAngle(view_angle)
251+
camera.SetClippingRange(*clipping_range)
252+
253+
print(f"bool_render: {bool_render}", flush=True)
254+
if bool_render == True:
255+
print("render", flush=True)
256+
renderWindow.Render()
257+
self.render()
258+
return
259+
260+
@exportRpc(viewer_prefix + viewer_schemas_dict["render_now"]["rpc"])
261+
def renderNow(self, params):
262+
validate_schema(
263+
params, self.viewer_schemas_dict["render_now"], self.viewer_prefix
264+
)
265+
266+
view = params.get("view", -1)
267+
268+
if "grid_scale" in self.get_data_base():
269+
renderer = self.get_renderer()
270+
renderer_bounds = renderer.ComputeVisiblePropBounds()
271+
grid_scale = self.get_object("grid_scale")["actor"]
272+
grid_scale.SetBounds(renderer_bounds)
273+
274+
self.get_protocol("vtkWebPublishImageDelivery").imagePush({"view": view})
275+
276+
return {"status": "success"}
277+
278+
15.3 KB
Loading
15.3 KB
Loading

src/tests/test_viewer_protocols.py

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,3 +192,75 @@ def test_grid_scale(server):
192192
)
193193

194194
assert server.compare_image(3, "viewer/grid_scale_on.jpeg") == True
195+
196+
197+
def test_update_camera(server):
198+
test_register_mesh(server)
199+
200+
201+
camera_options = {
202+
"focal_point": [-0.034399999999999986, 2.4513515, -0.10266900000000012],
203+
"view_up": [0.48981180389508683, 0.8647097694977263, -0.11118188386706776],
204+
"position": [-17.277630202755162, 13.419047188880267, 9.232808007244259],
205+
"view_angle": 30.0,
206+
"clipping_range": [11.403438348232822, 36.44815678922037],
207+
}
208+
209+
server.call(
210+
VtkViewerView.viewer_prefix
211+
+ VtkViewerView.viewer_schemas_dict["update_camera"]["rpc"],
212+
[
213+
{
214+
"camera_options": camera_options,
215+
"bool_render": False
216+
}
217+
],
218+
)
219+
server.compare_image(1, "mesh/register.jpeg")
220+
221+
222+
server.call(
223+
VtkViewerView.viewer_prefix
224+
+ VtkViewerView.viewer_schemas_dict["update_camera"]["rpc"],
225+
[
226+
{
227+
"camera_options": camera_options,
228+
"bool_render": True
229+
}
230+
],
231+
)
232+
assert server.compare_image(3, "viewer/update_camera.jpeg") == True
233+
assert False
234+
235+
236+
def test_render_now(server):
237+
test_register_mesh(server)
238+
239+
240+
camera_options = {
241+
"focal_point": [-0.034399999999999986, 2.4513515, -0.10266900000000012],
242+
"view_up": [0.48981180389508683, 0.8647097694977263, -0.11118188386706776],
243+
"position": [-17.277630202755162, 13.419047188880267, 9.232808007244259],
244+
"view_angle": 30.0,
245+
"clipping_range": [11.403438348232822, 36.44815678922037],
246+
}
247+
248+
server.call(
249+
VtkViewerView.viewer_prefix
250+
+ VtkViewerView.viewer_schemas_dict["update_camera"]["rpc"],
251+
[
252+
{
253+
"camera_options": camera_options,
254+
"bool_render": False
255+
}
256+
],
257+
)
258+
server.compare_image(1, "mesh/register.jpeg")
259+
260+
server.call(
261+
VtkViewerView.viewer_prefix
262+
+ VtkViewerView.viewer_schemas_dict["render_now"]["rpc"],
263+
[{"view": -1}]
264+
)
265+
266+
assert server.compare_image(3, "viewer/render_now.jpeg") == True

0 commit comments

Comments
 (0)