From da62c3fc9faa014ab77e26fc1c2bcc987778e3ae Mon Sep 17 00:00:00 2001 From: Arnaud Botella Date: Fri, 17 Oct 2025 16:56:44 +0200 Subject: [PATCH 1/9] fix(Render): no automatic rendering --- .../object/object_methods.py | 69 ++---------------- .../rpc/mesh/mesh_protocols.py | 3 - .../schemas/{render_now.json => render.json} | 2 +- .../rpc/viewer/viewer_protocols.py | 18 +---- tests/conftest.py | 35 ++++----- .../viewer/{render_now.jpeg => render.jpeg} | Bin tests/mesh/edges/test_mesh_edges_protocols.py | 10 +-- .../mesh/points/test_mesh_points_protocols.py | 14 ++-- .../polygons/test_mesh_polygons_protocols.py | 4 +- .../test_mesh_polyhedra_protocols.py | 10 +-- tests/mesh/test_mesh_protocols.py | 22 +++--- .../blocks/test_model_blocks_protocols.py | 6 +- .../corners/test_model_corners_protocols.py | 6 +- .../model/edges/test_model_edges_protocols.py | 2 +- .../model/lines/test_model_lines_protocols.py | 6 +- .../points/test_model_points_protocols.py | 4 +- .../surfaces/test_model_surfaces_protocols.py | 6 +- tests/model/test_model_protocols.py | 8 +- tests/test_generic_protocols.py | 8 +- tests/test_viewer_protocols.py | 38 +++++----- 20 files changed, 97 insertions(+), 174 deletions(-) rename src/opengeodeweb_viewer/rpc/viewer/schemas/{render_now.json => render.json} (80%) rename tests/data/images/viewer/{render_now.jpeg => render.jpeg} (100%) diff --git a/src/opengeodeweb_viewer/object/object_methods.py b/src/opengeodeweb_viewer/object/object_methods.py index faea2ad..b69ffd6 100644 --- a/src/opengeodeweb_viewer/object/object_methods.py +++ b/src/opengeodeweb_viewer/object/object_methods.py @@ -31,10 +31,13 @@ def registerObject( renderWindow = self.getView("-1") renderer = renderWindow.GetRenderers().GetFirstRenderer() + resetCamara = True + for registered_actor in renderer.GetActors(): + if registered_actor.visibility == True: + resetCamara = False renderer.AddActor(actor) - renderer.ResetCamera() - renderWindow.Render() - self.render() + if resetCamara: + renderer.ResetCamera() def deregisterObject(self, data_id: str) -> None: actor = self.get_object(data_id)["actor"] @@ -42,72 +45,20 @@ def deregisterObject(self, data_id: str) -> None: renderer = renderWindow.GetRenderers().GetFirstRenderer() renderer.RemoveActor(actor) self.deregister_object(data_id) - self.render() - - def applyTextures(self, data_id: str, textures: list[dict[str, str]]) -> None: - textures_array: list[vtk.vtkTexture] = [] - images_reader_array: list[vtk.vtkXMLImageDataReader] = [] - - data = self.get_object(data_id) - mapper = data["mapper"] - actor = data["actor"] - reader = data["reader"] - - polydata_mapper = mapper.GetPolyDataMapper() - poly_data = reader.GetPolyDataOutput() - - for index, value in enumerate(textures): - texture_name = value["texture_name"] - id_texture = value["id"] - print(f"{texture_name=} {id_texture=}", flush=True) - - new_texture = vtk.vtkTexture() - image_reader = vtk.vtkXMLImageDataReader() - texture_path = self.get_data_file_path(data_id, id_texture) - image_reader.SetFileName(texture_path) - - shader_texture_name = f"VTK_TEXTURE_UNIT_{index}" - polydata_mapper.MapDataArrayToMultiTextureAttribute( - shader_texture_name, - texture_name, - vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS, - ) - - if index == 0: - new_texture.SetBlendingMode( - vtk.vtkTexture.VTK_TEXTURE_BLENDING_MODE_REPLACE - ) - else: - new_texture.SetBlendingMode( - vtk.vtkTexture.VTK_TEXTURE_BLENDING_MODE_ADD - ) - - images_reader_array.append(image_reader) - new_texture.SetInputConnection(image_reader.GetOutputPort()) - - actor.GetProperty().SetTexture(shader_texture_name, new_texture) - - textures_array.append(new_texture) - images_reader_array.append(image_reader) - - self.render() def SetVisibility(self, data_id: str, visibility: bool) -> None: actor = self.get_object(data_id)["actor"] actor.SetVisibility(visibility) - self.render() def SetOpacity(self, data_id: str, opacity: float) -> None: actor = self.get_object(data_id)["actor"] actor.GetProperty().SetOpacity(opacity) - self.render() def SetColor(self, data_id: str, red: int, green: int, blue: int) -> None: mapper = self.get_object(data_id)["mapper"] mapper.ScalarVisibilityOff() actor = self.get_object(data_id)["actor"] actor.GetProperty().SetColor([red / 255, green / 255, blue / 255]) - self.render() def SetEdgesVisibility(self, data_id: str, visibility: bool) -> None: actor = self.get_object(data_id)["actor"] @@ -116,12 +67,10 @@ def SetEdgesVisibility(self, data_id: str, visibility: bool) -> None: self.SetVisibility(data_id, visibility) else: actor.GetProperty().SetEdgeVisibility(visibility) - self.render() def SetEdgesWidth(self, data_id: str, width: float) -> None: actor = self.get_object(data_id)["actor"] actor.GetProperty().SetEdgeWidth(width) - self.render() def SetEdgesColor(self, data_id: str, red: int, green: int, blue: int) -> None: actor = self.get_object(data_id)["actor"] @@ -130,7 +79,6 @@ def SetEdgesColor(self, data_id: str, red: int, green: int, blue: int) -> None: self.SetColor(data_id, red, green, blue) else: actor.GetProperty().SetEdgeColor([red / 255, green / 255, blue / 255]) - self.render() def SetPointsVisibility(self, data_id: str, visibility: bool) -> None: actor = self.get_object(data_id)["actor"] @@ -139,12 +87,10 @@ def SetPointsVisibility(self, data_id: str, visibility: bool) -> None: self.SetVisibility(data_id, visibility) else: actor.GetProperty().SetVertexVisibility(visibility) - self.render() def SetPointsSize(self, data_id: str, size: float) -> None: actor = self.get_object(data_id)["actor"] actor.GetProperty().SetPointSize(size) - self.render() def SetPointsColor(self, data_id: str, red: int, green: int, blue: int) -> None: actor = self.get_object(data_id)["actor"] @@ -153,7 +99,6 @@ def SetPointsColor(self, data_id: str, red: int, green: int, blue: int) -> None: self.SetColor(data_id, red, green, blue) else: actor.GetProperty().SetVertexColor([red / 255, green / 255, blue / 255]) - self.render() def SetBlocksVisibility( self, data_id: str, block_ids: list[int], visibility: bool @@ -161,7 +106,6 @@ def SetBlocksVisibility( mapper = self.get_object(data_id)["mapper"] for block_id in block_ids: mapper.SetBlockVisibility(block_id, visibility) - self.render() def SetBlocksColor( self, data_id: str, block_ids: list[int], red: int, green: int, blue: int @@ -169,7 +113,6 @@ def SetBlocksColor( mapper = self.get_object(data_id)["mapper"] for block_id in block_ids: mapper.SetBlockColor(block_id, [red / 255, green / 255, blue / 255]) - self.render() def clearColors(self, data_id: str) -> None: db = self.get_object(data_id) diff --git a/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py index 52f292f..7629abd 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py @@ -135,7 +135,6 @@ def applyTextures(self, mesh_id: str, textures_info: list[dict[str, str]]) -> No break actor = cast(vtk.vtkActor, self.get_object(mesh_id)["actor"]) actor.SetTexture(texture) - self.render() def displayAttributeOnVertices(self, data_id: str, name: str) -> None: reader = self.get_object(data_id)["reader"] @@ -145,7 +144,6 @@ def displayAttributeOnVertices(self, data_id: str, name: str) -> None: mapper.ScalarVisibilityOn() mapper.SetScalarModeToUsePointData() mapper.SetScalarRange(points.GetScalars().GetRange()) - self.render() def displayAttributeOnCells(self, data_id: str, name: str) -> None: reader = self.get_object(data_id)["reader"] @@ -155,4 +153,3 @@ def displayAttributeOnCells(self, data_id: str, name: str) -> None: mapper.ScalarVisibilityOn() mapper.SetScalarModeToUseCellData() mapper.SetScalarRange(cells.GetScalars().GetRange()) - self.render() diff --git a/src/opengeodeweb_viewer/rpc/viewer/schemas/render_now.json b/src/opengeodeweb_viewer/rpc/viewer/schemas/render.json similarity index 80% rename from src/opengeodeweb_viewer/rpc/viewer/schemas/render_now.json rename to src/opengeodeweb_viewer/rpc/viewer/schemas/render.json index ed6023d..50375ff 100644 --- a/src/opengeodeweb_viewer/rpc/viewer/schemas/render_now.json +++ b/src/opengeodeweb_viewer/rpc/viewer/schemas/render.json @@ -1,5 +1,5 @@ { - "rpc": "render_now", + "rpc": "render", "type": "object", "properties": {}, "required": [], diff --git a/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py b/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py index bd18e52..fbd94fd 100644 --- a/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py +++ b/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py @@ -82,8 +82,6 @@ def resetVisualization(self, params: RpcParams) -> None: renderer.SetBackground([180 / 255, 180 / 255, 180 / 255]) renderer.ResetCamera() - renderWindow.Render() - self.render() @exportRpc(viewer_prefix + viewer_schemas_dict["set_background_color"]["rpc"]) def setBackgroundColor(self, params: RpcParamsWithColor) -> None: @@ -99,9 +97,6 @@ def setBackgroundColor(self, params: RpcParamsWithColor) -> None: renderer = renderWindow.GetRenderers().GetFirstRenderer() renderer.SetBackground([red / 255, green / 255, blue / 255]) - renderer.ResetCamera() - renderWindow.Render() - self.render() @exportRpc(viewer_prefix + viewer_schemas_dict["reset_camera"]["rpc"]) def resetCamera(self, params: RpcParams) -> None: @@ -110,8 +105,6 @@ def resetCamera(self, params: RpcParams) -> None: ) renderWindow = self.getView("-1") renderWindow.GetRenderers().GetFirstRenderer().ResetCamera() - renderWindow.Render() - self.render() @exportRpc(viewer_prefix + viewer_schemas_dict["take_screenshot"]["rpc"]) def takeScreenshot(self, params: RpcParams) -> dict[str, str | bytes]: @@ -183,7 +176,6 @@ def updateData(self, params: RpcParams) -> None: tag, ) mapper.SetScalarRange(scalars.GetRange()) - self.render() @exportRpc(viewer_prefix + viewer_schemas_dict["get_point_position"]["rpc"]) def getPointPosition(self, params: RpcParams) -> dict[str, float]: @@ -247,7 +239,6 @@ def toggleGridScale(self, params: RpcParams) -> None: if "grid_scale" in self.get_data_base(): actor = self.get_object(id)["actor"] actor.SetVisibility(visibility) - self.render() @exportRpc(viewer_prefix + viewer_schemas_dict["axes"]["rpc"]) def toggleAxes(self, params: RpcParams) -> None: @@ -255,7 +246,6 @@ def toggleAxes(self, params: RpcParams) -> None: id, visibility = "axes", params["visibility"] actor = self.get_object(id)["actor"] actor.SetVisibility(visibility) - self.render() @exportRpc(viewer_prefix + viewer_schemas_dict["update_camera"]["rpc"]) def updateCamera(self, params: RpcParams) -> None: @@ -277,13 +267,10 @@ def updateCamera(self, params: RpcParams) -> None: camera.SetPosition(*position) camera.SetViewAngle(view_angle) camera.SetClippingRange(*clipping_range) - self.render() - @exportRpc(viewer_prefix + viewer_schemas_dict["render_now"]["rpc"]) + @exportRpc(viewer_prefix + viewer_schemas_dict["render"]["rpc"]) def renderNow(self, params: RpcParams) -> None: - validate_schema( - params, self.viewer_schemas_dict["render_now"], self.viewer_prefix - ) + validate_schema(params, self.viewer_schemas_dict["render"], self.viewer_prefix) self.render() @exportRpc(viewer_prefix + viewer_schemas_dict["set_z_scaling"]["rpc"]) @@ -302,4 +289,3 @@ def setZScaling(self, params: RpcParams) -> None: if "grid_scale" in self.get_data_base(): cube_axes_actor = self.get_object("grid_scale")["actor"] cube_axes_actor.SetUse2DMode(1) - self.render() diff --git a/tests/conftest.py b/tests/conftest.py index 0491dec..ac86ecb 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -11,6 +11,7 @@ from opengeodeweb_viewer import config from opengeodeweb_microservice.database.connection import get_session, init_database from opengeodeweb_microservice.database.data import Data +from opengeodeweb_viewer.rpc.viewer.viewer_protocols import VtkViewerView type RpcTestParams = list[ dict[str, str | int | float | bool | dict[str, int] | list[str]] | int @@ -38,7 +39,7 @@ def call(self, rpc: str, params: RpcTestParams = None) -> None: self.ws.send( json.dumps( { - "id": "rpc:test", + "id": "rpc:" + rpc, "method": rpc, "args": params, } @@ -98,29 +99,27 @@ def images_diff(self, first_image_path: str, second_image_path: str) -> float: print(f"{images_diff.GetThresholdedError()=}") return images_diff.GetThresholdedError() - def compare_image(self, nb_messages: int, filename: str) -> bool: - for message in range(nb_messages): - print(f"{message=}", flush=True) + def compare_image(self, filename: str) -> bool: + self.call( + VtkViewerView.viewer_prefix + + VtkViewerView.viewer_schemas_dict["render"]["rpc"] + ) + while True: image = self.ws.recv() if isinstance(image, bytes): + response = self.ws.recv() + print(f"{response=}", flush=True) + format = json.loads(response)["result"]["format"] test_file_path = os.path.abspath( - os.path.join(self.test_output_dir, "test.jpeg") + os.path.join(self.test_output_dir, f"test.{format}") ) with open(test_file_path, "wb") as f: f.write(image) f.close() - if isinstance(image, bytes): - response = self.ws.recv() - print(f"{response=}", flush=True) - format = json.loads(response)["result"]["format"] - test_file_path = os.path.abspath( - os.path.join(self.test_output_dir, f"test.{format}") - ) - with open(test_file_path, "wb") as f: - f.write(image) - f.close() - path_image = os.path.join(self.images_dir_path, filename) - return self.images_diff(test_file_path, path_image) == 0.0 + path_image = os.path.join(self.images_dir_path, filename) + return self.images_diff(test_file_path, path_image) == 0.0 + else: + print("response =", image, flush=True) return False def _init_ws(self) -> None: @@ -140,10 +139,8 @@ def _drain_initial_messages( ) -> None: self.ws.settimeout(timeout) for i in range(max_messages): - print(f"{i=}", flush=True) try: response = self.ws.recv() - print(f"{response=}", flush=True) except WebSocketTimeoutException: print( f"Timeout on message {i}, but continuing to try remaining messages...", diff --git a/tests/data/images/viewer/render_now.jpeg b/tests/data/images/viewer/render.jpeg similarity index 100% rename from tests/data/images/viewer/render_now.jpeg rename to tests/data/images/viewer/render.jpeg diff --git a/tests/mesh/edges/test_mesh_edges_protocols.py b/tests/mesh/edges/test_mesh_edges_protocols.py index ae620f3..71796bc 100644 --- a/tests/mesh/edges/test_mesh_edges_protocols.py +++ b/tests/mesh/edges/test_mesh_edges_protocols.py @@ -20,7 +20,7 @@ def test_edges_visibility( + VtkMeshEdgesView.mesh_edges_schemas_dict["visibility"]["rpc"], [{"id": "123456789", "visibility": True}], ) - assert server.compare_image(3, "mesh/edges/visibility.jpeg") == True + assert server.compare_image("mesh/edges/visibility.jpeg") == True def test_edges_color( @@ -33,7 +33,7 @@ def test_edges_color( + VtkMeshEdgesView.mesh_edges_schemas_dict["color"]["rpc"], [{"id": "123456789", "color": {"r": 255, "g": 0, "b": 0}}], ) - assert server.compare_image(3, "mesh/edges/color.jpeg") == True + assert server.compare_image("mesh/edges/color.jpeg") == True def test_edges_with_edged_curve( @@ -45,18 +45,18 @@ def test_edges_with_edged_curve( VtkMeshView.mesh_prefix + VtkMeshView.mesh_schemas_dict["register"]["rpc"], [{"id": "123456789"}], ) - assert server.compare_image(3, "mesh/edges/register_edged_curve.jpeg") == True + assert server.compare_image("mesh/edges/register_edged_curve.jpeg") == True server.call( VtkMeshEdgesView.mesh_edges_prefix + VtkMeshEdgesView.mesh_edges_schemas_dict["color"]["rpc"], [{"id": "123456789", "color": {"r": 255, "g": 0, "b": 0}}], ) - assert server.compare_image(3, "mesh/edges/edged_curve_color.jpeg") == True + assert server.compare_image("mesh/edges/edged_curve_color.jpeg") == True server.call( VtkMeshEdgesView.mesh_edges_prefix + VtkMeshEdgesView.mesh_edges_schemas_dict["visibility"]["rpc"], [{"id": "123456789", "visibility": False}], ) - assert server.compare_image(3, "mesh/edges/edged_curve_visibility.jpeg") == True + assert server.compare_image("mesh/edges/edged_curve_visibility.jpeg") == True diff --git a/tests/mesh/points/test_mesh_points_protocols.py b/tests/mesh/points/test_mesh_points_protocols.py index abc3724..1da8cff 100644 --- a/tests/mesh/points/test_mesh_points_protocols.py +++ b/tests/mesh/points/test_mesh_points_protocols.py @@ -23,7 +23,7 @@ def test_points_visibility( + cast(str, VtkMeshPointsView.mesh_points_schemas_dict["visibility"]["rpc"]), [{"id": mesh_id, "visibility": True}], ) - assert server.compare_image(3, "mesh/points/visibility.jpeg") == True + assert server.compare_image("mesh/points/visibility.jpeg") == True def test_points_size( @@ -37,7 +37,7 @@ def test_points_size( + cast(str, VtkMeshPointsView.mesh_points_schemas_dict["size"]["rpc"]), [{"id": mesh_id, "size": 15}], ) - assert server.compare_image(3, "mesh/points/size.jpeg") == True + assert server.compare_image("mesh/points/size.jpeg") == True def test_points_color( @@ -51,7 +51,7 @@ def test_points_color( + cast(str, VtkMeshPointsView.mesh_points_schemas_dict["color"]["rpc"]), [{"id": mesh_id, "color": {"r": 255, "g": 0, "b": 0}}], ) - assert server.compare_image(3, "mesh/points/color.jpeg") == True + assert server.compare_image("mesh/points/color.jpeg") == True def test_points_with_point_set( @@ -65,25 +65,25 @@ def test_points_with_point_set( + cast(str, VtkMeshView.mesh_schemas_dict["register"]["rpc"]), [{"id": mesh_id}], ) - assert server.compare_image(3, "mesh/points/register_point_set.jpeg") == True + assert server.compare_image("mesh/points/register_point_set.jpeg") == True server.call( VtkMeshPointsView.mesh_points_prefix + cast(str, VtkMeshPointsView.mesh_points_schemas_dict["size"]["rpc"]), [{"id": mesh_id, "size": 10}], ) - assert server.compare_image(3, "mesh/points/point_set_size.jpeg") == True + assert server.compare_image("mesh/points/point_set_size.jpeg") == True server.call( VtkMeshPointsView.mesh_points_prefix + cast(str, VtkMeshPointsView.mesh_points_schemas_dict["color"]["rpc"]), [{"id": mesh_id, "color": {"r": 255, "g": 0, "b": 0}}], ) - assert server.compare_image(3, "mesh/points/point_set_color.jpeg") == True + assert server.compare_image("mesh/points/point_set_color.jpeg") == True server.call( VtkMeshPointsView.mesh_points_prefix + cast(str, VtkMeshPointsView.mesh_points_schemas_dict["visibility"]["rpc"]), [{"id": mesh_id, "visibility": False}], ) - assert server.compare_image(3, "mesh/points/point_set_visibility.jpeg") == True + assert server.compare_image("mesh/points/point_set_visibility.jpeg") == True diff --git a/tests/mesh/polygons/test_mesh_polygons_protocols.py b/tests/mesh/polygons/test_mesh_polygons_protocols.py index 7f20fa6..9f5ccca 100644 --- a/tests/mesh/polygons/test_mesh_polygons_protocols.py +++ b/tests/mesh/polygons/test_mesh_polygons_protocols.py @@ -20,7 +20,7 @@ def test_polygons_color( + VtkMeshPolygonsView.mesh_polygons_schemas_dict["color"]["rpc"], [{"id": "123456789", "color": {"r": 255, "g": 0, "b": 0}}], ) - assert server.compare_image(3, "mesh/polygons/color.jpeg") == True + assert server.compare_image("mesh/polygons/color.jpeg") == True def test_polygons_visibility( @@ -34,4 +34,4 @@ def test_polygons_visibility( + VtkMeshPolygonsView.mesh_polygons_schemas_dict["visibility"]["rpc"], [{"id": "123456789", "visibility": False}], ) - assert server.compare_image(3, "mesh/polygons/visibility.jpeg") == True + assert server.compare_image("mesh/polygons/visibility.jpeg") == True diff --git a/tests/mesh/polyhedra/test_mesh_polyhedra_protocols.py b/tests/mesh/polyhedra/test_mesh_polyhedra_protocols.py index 84f9c5b..e17196e 100644 --- a/tests/mesh/polyhedra/test_mesh_polyhedra_protocols.py +++ b/tests/mesh/polyhedra/test_mesh_polyhedra_protocols.py @@ -20,7 +20,7 @@ def test_register_mesh( VtkMeshView.mesh_prefix + VtkMeshView.mesh_schemas_dict["register"]["rpc"], [{"id": "123456789"}], ) - assert server.compare_image(3, "mesh/polyhedra/register.jpeg") == True + assert server.compare_image("mesh/polyhedra/register.jpeg") == True def test_polyhedra_color( @@ -33,7 +33,7 @@ def test_polyhedra_color( + VtkMeshPolyhedraView.mesh_polyhedra_schemas_dict["color"]["rpc"], [{"id": "123456789", "color": {"r": 255, "g": 0, "b": 0}}], ) - assert server.compare_image(3, "mesh/polyhedra/color.jpeg") == True + assert server.compare_image("mesh/polyhedra/color.jpeg") == True def test_polyhedra_visibility( @@ -46,7 +46,7 @@ def test_polyhedra_visibility( + VtkMeshPolyhedraView.mesh_polyhedra_schemas_dict["visibility"]["rpc"], [{"id": "123456789", "visibility": False}], ) - assert server.compare_image(3, "mesh/polyhedra/visibility.jpeg") == True + assert server.compare_image("mesh/polyhedra/visibility.jpeg") == True def test_vertex_attribute( @@ -59,7 +59,7 @@ def test_vertex_attribute( + VtkMeshPolyhedraView.mesh_polyhedra_schemas_dict["vertex_attribute"]["rpc"], [{"id": "123456789", "name": "toto_on_vertices"}], ) - assert server.compare_image(3, "mesh/polyhedra/vertex_attribute.jpeg") == True + assert server.compare_image("mesh/polyhedra/vertex_attribute.jpeg") == True def test_polyhedron_attribute( @@ -74,4 +74,4 @@ def test_polyhedron_attribute( ], [{"id": "123456789", "name": "toto_on_polyhedra"}], ) - assert server.compare_image(3, "mesh/polyhedra/polyhedron_attribute.jpeg") == True + assert server.compare_image("mesh/polyhedra/polyhedron_attribute.jpeg") == True diff --git a/tests/mesh/test_mesh_protocols.py b/tests/mesh/test_mesh_protocols.py index dcb1e1b..05919b4 100644 --- a/tests/mesh/test_mesh_protocols.py +++ b/tests/mesh/test_mesh_protocols.py @@ -12,7 +12,7 @@ def test_register_mesh( VtkMeshView.mesh_prefix + VtkMeshView.mesh_schemas_dict["register"]["rpc"], [{"id": "123456789"}], ) - assert server.compare_image(3, "mesh/register.jpeg") == True + assert server.compare_image("mesh/register.jpeg") == True def test_deregister_mesh( @@ -25,7 +25,7 @@ def test_deregister_mesh( [{"id": "123456789"}], ) - assert server.compare_image(3, "mesh/deregister.jpeg") == True + assert server.compare_image("mesh/deregister.jpeg") == True def test_opacity(server: ServerMonitor, dataset_factory: Callable[..., str]) -> None: @@ -35,7 +35,7 @@ def test_opacity(server: ServerMonitor, dataset_factory: Callable[..., str]) -> VtkMeshView.mesh_prefix + VtkMeshView.mesh_schemas_dict["opacity"]["rpc"], [{"id": "123456789", "opacity": 0.1}], ) - assert server.compare_image(3, "mesh/opacity.jpeg") == True + assert server.compare_image("mesh/opacity.jpeg") == True def test_visibility(server: ServerMonitor, dataset_factory: Callable[..., str]) -> None: @@ -45,7 +45,7 @@ def test_visibility(server: ServerMonitor, dataset_factory: Callable[..., str]) VtkMeshView.mesh_prefix + VtkMeshView.mesh_schemas_dict["visibility"]["rpc"], [{"id": "123456789", "visibility": False}], ) - assert server.compare_image(3, "mesh/visibility.jpeg") == True + assert server.compare_image("mesh/visibility.jpeg") == True def test_color(server: ServerMonitor, dataset_factory: Callable[..., str]) -> None: @@ -55,7 +55,7 @@ def test_color(server: ServerMonitor, dataset_factory: Callable[..., str]) -> No VtkMeshView.mesh_prefix + VtkMeshView.mesh_schemas_dict["color"]["rpc"], [{"id": "123456789", "color": {"r": 50, "g": 2, "b": 250}}], ) - assert server.compare_image(3, "mesh/color.jpeg") == True + assert server.compare_image("mesh/color.jpeg") == True def test_apply_textures( @@ -81,32 +81,32 @@ def test_apply_textures( } ], ) - assert server.compare_image(3, "mesh/apply_textures.jpeg") == True + assert server.compare_image("mesh/apply_textures.jpeg") == True # def test_display_vertex_attribute(server): # server.call(VtkMeshView.mesh_prefix + VtkMeshView.mesh_schemas_dict["register"]["rpc"], [{"id": "123456789", "file_name": "vertex_attribute.vtp"}]) -# assert server.compare_image(3, "mesh/display_vertex_attribute_1.jpeg") == True +# assert server.compare_image("mesh/display_vertex_attribute_1.jpeg") == True # server.call( # VtkMeshView.mesh_prefix + VtkMeshView.mesh_schemas_dict["display_vertex_attribute"]["rpc"], # [{"id": "123456789", "name": "geode_implicit_attribute"}], # ) -# assert server.compare_image(3, "mesh/display_vertex_attribute_2.jpeg") == True +# assert server.compare_image("mesh/display_vertex_attribute_2.jpeg") == True # server.call( # VtkMeshView.mesh_prefix + VtkMeshView.mesh_schemas_dict["color"]["rpc"], # [{"id": "123456789", "red": 250, "green": 0, "blue": 0}], # ) -# assert server.compare_image(3, "mesh/display_vertex_attribute_3.jpeg") == True +# assert server.compare_image("mesh/display_vertex_attribute_3.jpeg") == True # def test_display_polygon_attribute(server): # server.call(VtkMeshView.mesh_prefix + VtkMeshView.mesh_schemas_dict["register"]["rpc"], [{"id": "123456789", "file_name": "polygon_attribute.vtp"}]) -# assert server.compare_image(3, "mesh/display_polygon_attribute_1.jpeg") == True +# assert server.compare_image("mesh/display_polygon_attribute_1.jpeg") == True # server.call( # VtkMeshView.mesh_prefix + VtkMeshView.mesh_schemas_dict["display_polygon_attribute"]["rpc"], # [{"id": "123456789", "name": "implicit_on_polygons"}], # ) -# assert server.compare_image(3, "mesh/display_polygon_attribute_2.jpeg") == True +# assert server.compare_image("mesh/display_polygon_attribute_2.jpeg") == True diff --git a/tests/model/blocks/test_model_blocks_protocols.py b/tests/model/blocks/test_model_blocks_protocols.py index a500a54..7dca4b4 100644 --- a/tests/model/blocks/test_model_blocks_protocols.py +++ b/tests/model/blocks/test_model_blocks_protocols.py @@ -29,7 +29,7 @@ def test_blocks_polyhedra_visibility( ], ) - assert server.compare_image(3, "model/cube_visibility_false.jpeg") == True + assert server.compare_image("model/cube_visibility_false.jpeg") == True server.call( VtkModelBlocksView.model_blocks_prefix @@ -43,7 +43,7 @@ def test_blocks_polyhedra_visibility( ], ) - assert server.compare_image(3, "model/blocks/visibility.jpeg") == True + assert server.compare_image("model/blocks/visibility.jpeg") == True def test_blocks_polyhedra_color( @@ -63,4 +63,4 @@ def test_blocks_polyhedra_color( } ], ) - assert server.compare_image(3, "model/blocks/color.jpeg") == True + assert server.compare_image("model/blocks/color.jpeg") == True diff --git a/tests/model/corners/test_model_corners_protocols.py b/tests/model/corners/test_model_corners_protocols.py index 702170b..44be5ef 100644 --- a/tests/model/corners/test_model_corners_protocols.py +++ b/tests/model/corners/test_model_corners_protocols.py @@ -28,7 +28,7 @@ def test_corners_points_visibility( } ], ) - assert server.compare_image(3, "model/cube_visibility_false.jpeg") == True + assert server.compare_image("model/cube_visibility_false.jpeg") == True server.call( VtkModelCornersView.model_corners_prefix @@ -41,7 +41,7 @@ def test_corners_points_visibility( } ], ) - assert server.compare_image(3, "model/corners/visibility.jpeg") == True + assert server.compare_image("model/corners/visibility.jpeg") == True def test_corners_points_color( @@ -61,4 +61,4 @@ def test_corners_points_color( } ], ) - assert server.compare_image(3, "model/corners/color.jpeg") == True + assert server.compare_image("model/corners/color.jpeg") == True diff --git a/tests/model/edges/test_model_edges_protocols.py b/tests/model/edges/test_model_edges_protocols.py index 8c44b09..f10dbc4 100644 --- a/tests/model/edges/test_model_edges_protocols.py +++ b/tests/model/edges/test_model_edges_protocols.py @@ -22,4 +22,4 @@ def test_edges_visibility( + VtkModelEdgesView.model_edges_schemas_dict["visibility"]["rpc"], [{"id": "123456789", "visibility": True}], ) - assert server.compare_image(3, "model/edges/visibility.jpeg") == True + assert server.compare_image("model/edges/visibility.jpeg") == True diff --git a/tests/model/lines/test_model_lines_protocols.py b/tests/model/lines/test_model_lines_protocols.py index 4f197fe..b063745 100644 --- a/tests/model/lines/test_model_lines_protocols.py +++ b/tests/model/lines/test_model_lines_protocols.py @@ -28,7 +28,7 @@ def test_lines_edges_visibility( } ], ) - assert server.compare_image(3, "model/cube_visibility_false.jpeg") == True + assert server.compare_image("model/cube_visibility_false.jpeg") == True server.call( VtkModelLinesView.model_lines_prefix @@ -41,7 +41,7 @@ def test_lines_edges_visibility( } ], ) - assert server.compare_image(3, "model/lines/visibility.jpeg") == True + assert server.compare_image("model/lines/visibility.jpeg") == True def test_lines_edges_color( @@ -61,4 +61,4 @@ def test_lines_edges_color( } ], ) - assert server.compare_image(3, "model/lines/color.jpeg") == True + assert server.compare_image("model/lines/color.jpeg") == True diff --git a/tests/model/points/test_model_points_protocols.py b/tests/model/points/test_model_points_protocols.py index d794ef1..95b7eac 100644 --- a/tests/model/points/test_model_points_protocols.py +++ b/tests/model/points/test_model_points_protocols.py @@ -22,7 +22,7 @@ def test_points_visibility( + VtkModelPointsView.model_points_schemas_dict["visibility"]["rpc"], [{"id": "123456789", "visibility": True}], ) - assert server.compare_image(3, "model/points/visibility.jpeg") == True + assert server.compare_image("model/points/visibility.jpeg") == True def test_points_size( @@ -36,4 +36,4 @@ def test_points_size( + VtkModelPointsView.model_points_schemas_dict["size"]["rpc"], [{"id": "123456789", "size": 20}], ) - assert server.compare_image(3, "model/points/size.jpeg") == True + assert server.compare_image("model/points/size.jpeg") == True diff --git a/tests/model/surfaces/test_model_surfaces_protocols.py b/tests/model/surfaces/test_model_surfaces_protocols.py index 298464f..02bc5d4 100644 --- a/tests/model/surfaces/test_model_surfaces_protocols.py +++ b/tests/model/surfaces/test_model_surfaces_protocols.py @@ -28,7 +28,7 @@ def test_surfaces_polygons_visibility( } ], ) - assert server.compare_image(3, "model/cube_visibility_false.jpeg") == True + assert server.compare_image("model/cube_visibility_false.jpeg") == True server.call( VtkModelSurfacesView.model_surfaces_prefix @@ -42,7 +42,7 @@ def test_surfaces_polygons_visibility( ], ) - assert server.compare_image(3, "model/surfaces/visibility.jpeg") == True + assert server.compare_image("model/surfaces/visibility.jpeg") == True def test_surfaces_polygons_color( @@ -62,4 +62,4 @@ def test_surfaces_polygons_color( } ], ) - assert server.compare_image(3, "model/surfaces/color.jpeg") == True + assert server.compare_image("model/surfaces/color.jpeg") == True diff --git a/tests/model/test_model_protocols.py b/tests/model/test_model_protocols.py index bd65a7a..1348318 100644 --- a/tests/model/test_model_protocols.py +++ b/tests/model/test_model_protocols.py @@ -12,7 +12,7 @@ def test_register_model( VtkModelView.model_prefix + VtkModelView.model_schemas_dict["register"]["rpc"], [{"id": "123456789"}], ) - assert server.compare_image(3, "model/register.jpeg") == True + assert server.compare_image("model/register.jpeg") == True def test_register_model_cube( @@ -24,7 +24,7 @@ def test_register_model_cube( VtkModelView.model_prefix + VtkModelView.model_schemas_dict["register"]["rpc"], [{"id": "123456789"}], ) - assert server.compare_image(3, "model/cube_register.jpeg") == True + assert server.compare_image("model/cube_register.jpeg") == True def test_visibility_model( @@ -38,7 +38,7 @@ def test_visibility_model( + VtkModelView.model_schemas_dict["visibility"]["rpc"], [{"id": "123456789", "visibility": False}], ) - assert server.compare_image(3, "model/visibility.jpeg") == True + assert server.compare_image("model/visibility.jpeg") == True def test_deregister_model( @@ -52,4 +52,4 @@ def test_deregister_model( + VtkModelView.model_schemas_dict["deregister"]["rpc"], [{"id": "123456789"}], ) - assert server.compare_image(3, "model/deregister.jpeg") == True + assert server.compare_image("model/deregister.jpeg") == True diff --git a/tests/test_generic_protocols.py b/tests/test_generic_protocols.py index a2af1e5..ef76642 100644 --- a/tests/test_generic_protocols.py +++ b/tests/test_generic_protocols.py @@ -14,7 +14,7 @@ def test_register_mesh( + VtkGenericView.generic_schemas_dict["register"]["rpc"], [{"id": data_id}], ) - assert server.compare_image(3, "mesh/register.jpeg") is True + assert server.compare_image("mesh/register.jpeg") is True def test_register_model( @@ -28,7 +28,7 @@ def test_register_model( + VtkGenericView.generic_schemas_dict["register"]["rpc"], [{"id": data_id}], ) - assert server.compare_image(3, "model/register.jpeg") is True + assert server.compare_image("model/register.jpeg") is True def test_deregister_mesh( @@ -41,7 +41,7 @@ def test_deregister_mesh( + VtkGenericView.generic_schemas_dict["deregister"]["rpc"], [{"id": "123456789"}], ) - assert server.compare_image(3, "mesh/deregister.jpeg") == True + assert server.compare_image("mesh/deregister.jpeg") == True def test_deregister_model( @@ -54,4 +54,4 @@ def test_deregister_model( + VtkGenericView.generic_schemas_dict["deregister"]["rpc"], [{"id": "123456789"}], ) - assert server.compare_image(3, "model/deregister.jpeg") == True + assert server.compare_image("model/deregister.jpeg") == True diff --git a/tests/test_viewer_protocols.py b/tests/test_viewer_protocols.py index 59a87e8..25d143c 100644 --- a/tests/test_viewer_protocols.py +++ b/tests/test_viewer_protocols.py @@ -18,7 +18,7 @@ def test_reset_visualization(server: ServerMonitor) -> None: VtkViewerView.viewer_prefix + VtkViewerView.viewer_schemas_dict["reset_visualization"]["rpc"] ) - assert server.compare_image(3, "viewer/reset_visualization.jpeg") == True + assert server.compare_image("viewer/reset_visualization.jpeg") == True def test_reset_camera(server: ServerMonitor) -> None: @@ -26,7 +26,7 @@ def test_reset_camera(server: ServerMonitor) -> None: VtkViewerView.viewer_prefix + VtkViewerView.viewer_schemas_dict["reset_camera"]["rpc"] ) - assert server.compare_image(3, "viewer/reset_camera.jpeg") == True + assert server.compare_image("viewer/reset_camera.jpeg") == True def test_set_viewer_background_color(server: ServerMonitor) -> None: @@ -35,7 +35,7 @@ def test_set_viewer_background_color(server: ServerMonitor) -> None: + VtkViewerView.viewer_schemas_dict["set_background_color"]["rpc"], [{"color": {"r": 0, "g": 0, "b": 255}}], ) - assert server.compare_image(3, "viewer/set_background_color.jpeg") == True + assert server.compare_image("viewer/set_background_color.jpeg") == True def test_get_point_position( @@ -198,19 +198,19 @@ def test_grid_scale(server: ServerMonitor, dataset_factory: Callable[..., str]) VtkViewerView.viewer_prefix + VtkViewerView.viewer_schemas_dict["reset_visualization"]["rpc"], ) - assert server.compare_image(3, "viewer/reset_visualization.jpeg") == True + assert server.compare_image("viewer/reset_visualization.jpeg") == True server.call( VtkMeshView.mesh_prefix + VtkMeshView.mesh_schemas_dict["register"]["rpc"], [{"id": data_id}], ) - assert server.compare_image(3, "viewer/register_hat.jpeg") == True + assert server.compare_image("viewer/register_hat.jpeg") == True server.call( VtkViewerView.viewer_prefix + VtkViewerView.viewer_schemas_dict["grid_scale"]["rpc"], [{"visibility": True}], ) - assert server.compare_image(3, "viewer/grid_scale_on.jpeg") == True + assert server.compare_image("viewer/grid_scale_on.jpeg") == True def test_axes(server: ServerMonitor, dataset_factory: Callable[..., str]) -> None: @@ -222,7 +222,7 @@ def test_axes(server: ServerMonitor, dataset_factory: Callable[..., str]) -> Non [{"visibility": False}], ) - assert server.compare_image(3, "viewer/axes_off.jpeg") == True + assert server.compare_image("viewer/axes_off.jpeg") == True def test_update_camera( @@ -247,10 +247,10 @@ def test_update_camera( } ], ) - assert server.compare_image(3, "viewer/update_camera.jpeg") == True + assert server.compare_image("viewer/update_camera.jpeg") == True -def test_render_now(server: ServerMonitor, dataset_factory: Callable[..., str]) -> None: +def test_render(server: ServerMonitor, dataset_factory: Callable[..., str]) -> None: test_register_mesh(server, dataset_factory) camera_options = { @@ -274,10 +274,10 @@ def test_render_now(server: ServerMonitor, dataset_factory: Callable[..., str]) server.call( VtkViewerView.viewer_prefix - + VtkViewerView.viewer_schemas_dict["render_now"]["rpc"], + + VtkViewerView.viewer_schemas_dict["render"]["rpc"], ) - assert server.compare_image(3, "viewer/render_now.jpeg") == True + assert server.compare_image("viewer/render.jpeg") == True def test_set_z_scaling( @@ -289,14 +289,14 @@ def test_set_z_scaling( VtkMeshView.mesh_prefix + VtkMeshView.mesh_schemas_dict["register"]["rpc"], [{"id": "123456789"}], ) - assert server.compare_image(3, "viewer/polygon_attribute.jpeg") == True + assert server.compare_image("viewer/polygon_attribute.jpeg") == True dataset_factory(id="987654321", viewable_file_name="vertex_attribute.vtp") server.call( VtkMeshView.mesh_prefix + VtkMeshView.mesh_schemas_dict["register"]["rpc"], [{"id": "987654321"}], ) - assert server.compare_image(3, "viewer/vertex_and_polygon_attribute.jpeg") == True + assert server.compare_image("viewer/vertex_and_polygon_attribute.jpeg") == True camera_options = { "focal_point": [6.05, 5.7, 1.5], @@ -315,14 +315,14 @@ def test_set_z_scaling( } ], ) - server.compare_image(3, "mesh/register.jpeg") + server.compare_image("mesh/register.jpeg") server.call( VtkViewerView.viewer_prefix + VtkViewerView.viewer_schemas_dict["set_z_scaling"]["rpc"], [{"z_scale": 2.5}], ) - assert server.compare_image(3, "viewer/set_z_scaling.jpeg") == True + assert server.compare_image("viewer/set_z_scaling.jpeg") == True def test_combined_scaling_and_grid( @@ -332,22 +332,22 @@ def test_combined_scaling_and_grid( VtkViewerView.viewer_prefix + VtkViewerView.viewer_schemas_dict["reset_visualization"]["rpc"], ) - assert server.compare_image(3, "viewer/reset_visualization.jpeg") == True + assert server.compare_image("viewer/reset_visualization.jpeg") == True dataset_factory(id="123456789", viewable_file_name="hat.vtp") server.call( VtkMeshView.mesh_prefix + VtkMeshView.mesh_schemas_dict["register"]["rpc"], [{"id": "123456789"}], ) - assert server.compare_image(3, "viewer/register_hat.jpeg") == True + assert server.compare_image("viewer/register_hat.jpeg") == True server.call( VtkViewerView.viewer_prefix + VtkViewerView.viewer_schemas_dict["grid_scale"]["rpc"], [{"visibility": True}], ) - assert server.compare_image(3, "viewer/grid_scale_on.jpeg") == True + assert server.compare_image("viewer/grid_scale_on.jpeg") == True server.call( VtkViewerView.viewer_prefix + VtkViewerView.viewer_schemas_dict["set_z_scaling"]["rpc"], [{"z_scale": 2.5}], ) - assert server.compare_image(3, "viewer/combined_scaling_and_grid.jpeg") == True + assert server.compare_image("viewer/combined_scaling_and_grid.jpeg") == True From ca84d21a7d7f2294d71c6fae28803cdcb6ad628f Mon Sep 17 00:00:00 2001 From: Arnaud Botella Date: Fri, 17 Oct 2025 18:29:24 +0200 Subject: [PATCH 2/9] Update test_viewer_protocols.py --- tests/test_viewer_protocols.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_viewer_protocols.py b/tests/test_viewer_protocols.py index 25d143c..76039d5 100644 --- a/tests/test_viewer_protocols.py +++ b/tests/test_viewer_protocols.py @@ -270,7 +270,7 @@ def test_render(server: ServerMonitor, dataset_factory: Callable[..., str]) -> N } ], ) - server.compare_image(1, "mesh/register.jpeg") + server.compare_image("mesh/register.jpeg") server.call( VtkViewerView.viewer_prefix From 13b34f48ffb83db66553f7c77b772f9e5844fa35 Mon Sep 17 00:00:00 2001 From: Arnaud Botella Date: Fri, 17 Oct 2025 21:46:10 +0200 Subject: [PATCH 3/9] fix --- .../viewer/vertex_and_polygon_attribute.jpeg | Bin 10392 -> 9251 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/data/images/viewer/vertex_and_polygon_attribute.jpeg b/tests/data/images/viewer/vertex_and_polygon_attribute.jpeg index 5ab696d57a8565f698f58e423bbdcf8f5cb053fb..6dbaab15d162c8c8d6a969c1fd6044b8767542f7 100644 GIT binary patch literal 9251 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 From 04535391e63a301552b2f7fe03a31a76a49b966e Mon Sep 17 00:00:00 2001 From: BotellaA <3213882+BotellaA@users.noreply.github.com> Date: Fri, 17 Oct 2025 19:47:38 +0000 Subject: [PATCH 4/9] Apply prepare changes --- requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 28124d6..065674a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -61,4 +61,3 @@ wslink==1.12.4 yarl>=1 # via aiohttp -opengeodeweb-microservice==1.*,>=1.0.5 From 83d5caa55939567e6e709b36135a051565f9038c Mon Sep 17 00:00:00 2001 From: BotellaA <3213882+BotellaA@users.noreply.github.com> Date: Wed, 22 Oct 2025 19:58:09 +0000 Subject: [PATCH 5/9] Apply prepare changes --- opengeodeweb_viewer_schemas.json | 6 +++--- requirements.txt | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/opengeodeweb_viewer_schemas.json b/opengeodeweb_viewer_schemas.json index c39d37d..8068a26 100644 --- a/opengeodeweb_viewer_schemas.json +++ b/opengeodeweb_viewer_schemas.json @@ -1312,9 +1312,9 @@ "required": [], "additionalProperties": false }, - "render_now": { - "$id": "opengeodeweb_viewer.viewer.render_now", - "rpc": "render_now", + "render": { + "$id": "opengeodeweb_viewer.viewer.render", + "rpc": "render", "type": "object", "properties": {}, "required": [], diff --git a/requirements.txt b/requirements.txt index 9e24baf..065674a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -61,4 +61,3 @@ wslink==1.12.4 yarl>=1 # via aiohttp -opengeodeweb-microservice==1.*,>=1.0.6rc1 From f7981ff3d343c2e88e41f6a59769741751906bb5 Mon Sep 17 00:00:00 2001 From: Arnaud Botella Date: Wed, 22 Oct 2025 22:02:42 +0200 Subject: [PATCH 6/9] render --- src/opengeodeweb_viewer/rpc/viewer/schemas/render_now.py | 7 ------- src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py | 4 ++-- 2 files changed, 2 insertions(+), 9 deletions(-) delete mode 100644 src/opengeodeweb_viewer/rpc/viewer/schemas/render_now.py diff --git a/src/opengeodeweb_viewer/rpc/viewer/schemas/render_now.py b/src/opengeodeweb_viewer/rpc/viewer/schemas/render_now.py deleted file mode 100644 index 2ff9060..0000000 --- a/src/opengeodeweb_viewer/rpc/viewer/schemas/render_now.py +++ /dev/null @@ -1,7 +0,0 @@ -from dataclasses_json import DataClassJsonMixin -from dataclasses import dataclass - - -@dataclass -class RenderNow(DataClassJsonMixin): - pass diff --git a/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py b/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py index 04209c6..5039632 100644 --- a/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py +++ b/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py @@ -271,10 +271,10 @@ def updateCamera(self, rpc_params: RpcParams) -> None: camera.SetViewAngle(camera_options.view_angle) camera.SetClippingRange(camera_options.clipping_range) - @exportRpc(viewer_prefix + viewer_schemas_dict["render_now"]["rpc"]) + @exportRpc(viewer_prefix + viewer_schemas_dict["render"]["rpc"]) def renderNow(self, rpc_params: RpcParams) -> None: validate_schema( - rpc_params, self.viewer_schemas_dict["render_now"], self.viewer_prefix + rpc_params, self.viewer_schemas_dict["render"], self.viewer_prefix ) self.render() From fcd17c2fb555ccbd92e9f5b2674c03f37db5ba8c Mon Sep 17 00:00:00 2001 From: Arnaud Botella Date: Wed, 22 Oct 2025 22:07:36 +0200 Subject: [PATCH 7/9] json --- src/opengeodeweb_viewer/rpc/viewer/schemas/__init__.py | 2 +- src/opengeodeweb_viewer/rpc/viewer/schemas/render.py | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 src/opengeodeweb_viewer/rpc/viewer/schemas/render.py diff --git a/src/opengeodeweb_viewer/rpc/viewer/schemas/__init__.py b/src/opengeodeweb_viewer/rpc/viewer/schemas/__init__.py index 1a68349..aa88dcf 100644 --- a/src/opengeodeweb_viewer/rpc/viewer/schemas/__init__.py +++ b/src/opengeodeweb_viewer/rpc/viewer/schemas/__init__.py @@ -5,7 +5,7 @@ from .set_background_color import * from .reset_visualization import * from .reset_camera import * -from .render_now import * +from .render import * from .picked_ids import * from .grid_scale import * from .get_point_position import * diff --git a/src/opengeodeweb_viewer/rpc/viewer/schemas/render.py b/src/opengeodeweb_viewer/rpc/viewer/schemas/render.py new file mode 100644 index 0000000..1cbad7d --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/viewer/schemas/render.py @@ -0,0 +1,7 @@ +from dataclasses_json import DataClassJsonMixin +from dataclasses import dataclass + + +@dataclass +class Render(DataClassJsonMixin): + pass From 363e56a6a7f83d56b77e3473116ab8d3778ea8c8 Mon Sep 17 00:00:00 2001 From: BotellaA <3213882+BotellaA@users.noreply.github.com> Date: Thu, 6 Nov 2025 13:26:49 +0000 Subject: [PATCH 8/9] Apply prepare changes --- requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 28b42b9..065674a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -61,4 +61,3 @@ wslink==1.12.4 yarl>=1 # via aiohttp -opengeodeweb-microservice==1.*,>=1.0.7 From 97597e04361e49cc623d5e966d41b732e85c492a Mon Sep 17 00:00:00 2001 From: BotellaA <3213882+BotellaA@users.noreply.github.com> Date: Fri, 7 Nov 2025 08:28:42 +0000 Subject: [PATCH 9/9] Apply prepare changes --- requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index a7f1090..065674a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -61,4 +61,3 @@ wslink==1.12.4 yarl>=1 # via aiohttp -opengeodeweb-microservice==1.*,>=1.0.8