From 214279c3ddac6be1e2ff7dd98cb5d8d93a8d5364 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Wed, 13 May 2026 12:07:11 +0200 Subject: [PATCH 1/5] feat(centerObject): new RPC to get blocks by bounds --- opengeodeweb_viewer_schemas.json | 22 +++++++++++++++++++ .../rpc/model/model_protocols.py | 17 ++++++++++++++ .../rpc/model/schemas/__init__.py | 1 + .../rpc/model/schemas/get_blocks_bounds.json | 16 ++++++++++++++ .../rpc/model/schemas/get_blocks_bounds.py | 12 ++++++++++ 5 files changed, 68 insertions(+) create mode 100644 src/opengeodeweb_viewer/rpc/model/schemas/get_blocks_bounds.json create mode 100644 src/opengeodeweb_viewer/rpc/model/schemas/get_blocks_bounds.py diff --git a/opengeodeweb_viewer_schemas.json b/opengeodeweb_viewer_schemas.json index 3a3aef75..47126516 100644 --- a/opengeodeweb_viewer_schemas.json +++ b/opengeodeweb_viewer_schemas.json @@ -1540,6 +1540,28 @@ ], "additionalProperties": false }, + "get_blocks_bounds": { + "$id": "opengeodeweb_viewer.model.get_blocks_bounds", + "rpc": "get_blocks_bounds", + "type": "object", + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "block_ids": { + "type": "array", + "items": { + "type": "integer" + } + } + }, + "required": [ + "id", + "block_ids" + ], + "additionalProperties": false + }, "deregister": { "$id": "opengeodeweb_viewer.model.deregister", "rpc": "deregister", diff --git a/src/opengeodeweb_viewer/rpc/model/model_protocols.py b/src/opengeodeweb_viewer/rpc/model/model_protocols.py index d7d9d504..b5fd537b 100644 --- a/src/opengeodeweb_viewer/rpc/model/model_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/model_protocols.py @@ -4,6 +4,7 @@ # Third party imports from vtkmodules.vtkCommonDataModel import ( vtkCompositeDataSet, + vtkBoundingBox, ) from vtkmodules.vtkRenderingCore import ( vtkCompositeDataDisplayAttributes, @@ -187,3 +188,19 @@ def setModelhighlight(self, rpc_params: RpcParams) -> None: mapper.Modified() self.render(-1) + + @exportRpc(model_prefix + model_schemas_dict["get_blocks_bounds"]["rpc"]) + def getBlocksBounds(self, rpc_params: RpcParams) -> list[float]: + validate_schema( + rpc_params, self.model_schemas_dict["get_blocks_bounds"], self.model_prefix + ) + params = schemas.GetBlocksBounds.from_dict(rpc_params) + pipeline = self.get_vtk_pipeline(params.id) + bbox = vtkBoundingBox() + for i in params.block_ids: + if i < len(pipeline.blockDataSets) and pipeline.blockDataSets[i]: + bbox.AddBounds(pipeline.blockDataSets[i].GetBounds()) + + bounds = [0.0] * 6 + bbox.GetBounds(bounds) + return bounds diff --git a/src/opengeodeweb_viewer/rpc/model/schemas/__init__.py b/src/opengeodeweb_viewer/rpc/model/schemas/__init__.py index 556d41c7..2901dcdc 100644 --- a/src/opengeodeweb_viewer/rpc/model/schemas/__init__.py +++ b/src/opengeodeweb_viewer/rpc/model/schemas/__init__.py @@ -1,4 +1,5 @@ from .visibility import * from .register import * from .highlight import * +from .get_blocks_bounds import * from .deregister import * diff --git a/src/opengeodeweb_viewer/rpc/model/schemas/get_blocks_bounds.json b/src/opengeodeweb_viewer/rpc/model/schemas/get_blocks_bounds.json new file mode 100644 index 00000000..a7fb4ce5 --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/model/schemas/get_blocks_bounds.json @@ -0,0 +1,16 @@ +{ + "rpc": "get_blocks_bounds", + "type": "object", + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "block_ids": { + "type": "array", + "items": { "type": "integer" } + } + }, + "required": ["id", "block_ids"], + "additionalProperties": false +} diff --git a/src/opengeodeweb_viewer/rpc/model/schemas/get_blocks_bounds.py b/src/opengeodeweb_viewer/rpc/model/schemas/get_blocks_bounds.py new file mode 100644 index 00000000..d49b215f --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/model/schemas/get_blocks_bounds.py @@ -0,0 +1,12 @@ +from dataclasses_json import DataClassJsonMixin +from dataclasses import dataclass +from typing import List + + +@dataclass +class GetBlocksBounds(DataClassJsonMixin): + def __post_init__(self) -> None: + print(self, flush=True) + + block_ids: List[int] + id: str From 3ff92edeac0422cdd7cbff38f9f4a01b25dba64e Mon Sep 17 00:00:00 2001 From: MaxNumerique <144453705+MaxNumerique@users.noreply.github.com> Date: Wed, 13 May 2026 10:16:40 +0000 Subject: [PATCH 2/5] Apply prepare changes --- requirements.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index e9b9ed49..7819587c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -22,7 +22,7 @@ frozenlist>=1 # via # aiohttp # aiosignal -idna==3.14 +idna==3.15 # via yarl kiwisolver>=1 # via matplotlib @@ -61,4 +61,3 @@ wslink==1.12.4 yarl>=1 # via aiohttp -opengeodeweb-microservice==1.*,>=1.1.3 From ed8d8289751920f5fe049aedcfa85f70751c58e8 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Wed, 13 May 2026 13:58:03 +0200 Subject: [PATCH 3/5] mypy --- src/opengeodeweb_viewer/rpc/model/model_protocols.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/opengeodeweb_viewer/rpc/model/model_protocols.py b/src/opengeodeweb_viewer/rpc/model/model_protocols.py index b5fd537b..e3666303 100644 --- a/src/opengeodeweb_viewer/rpc/model/model_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/model_protocols.py @@ -5,6 +5,7 @@ from vtkmodules.vtkCommonDataModel import ( vtkCompositeDataSet, vtkBoundingBox, + vtkDataSet, ) from vtkmodules.vtkRenderingCore import ( vtkCompositeDataDisplayAttributes, @@ -198,8 +199,9 @@ def getBlocksBounds(self, rpc_params: RpcParams) -> list[float]: pipeline = self.get_vtk_pipeline(params.id) bbox = vtkBoundingBox() for i in params.block_ids: - if i < len(pipeline.blockDataSets) and pipeline.blockDataSets[i]: - bbox.AddBounds(pipeline.blockDataSets[i].GetBounds()) + block = pipeline.blockDataSets[i] + if isinstance(block, vtkDataSet): + bbox.AddBounds(block.GetBounds()) bounds = [0.0] * 6 bbox.GetBounds(bounds) From 9e2a0646ad2dea4d78e3a75e021feb24c27dd4fb Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Wed, 13 May 2026 14:20:35 +0200 Subject: [PATCH 4/5] test added --- .../rpc/model/model_protocols.py | 3 +-- tests/model/test_model_protocols.py | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/opengeodeweb_viewer/rpc/model/model_protocols.py b/src/opengeodeweb_viewer/rpc/model/model_protocols.py index e3666303..234af88b 100644 --- a/src/opengeodeweb_viewer/rpc/model/model_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/model_protocols.py @@ -199,8 +199,7 @@ def getBlocksBounds(self, rpc_params: RpcParams) -> list[float]: pipeline = self.get_vtk_pipeline(params.id) bbox = vtkBoundingBox() for i in params.block_ids: - block = pipeline.blockDataSets[i] - if isinstance(block, vtkDataSet): + if isinstance(block := pipeline.blockDataSets[i], vtkDataSet): bbox.AddBounds(block.GetBounds()) bounds = [0.0] * 6 diff --git a/tests/model/test_model_protocols.py b/tests/model/test_model_protocols.py index 4f363f28..3b9d76ed 100644 --- a/tests/model/test_model_protocols.py +++ b/tests/model/test_model_protocols.py @@ -53,3 +53,19 @@ def test_deregister_model( [{"id": "123456789"}], ) assert server.compare_image("model/deregister.jpeg") == True + + +def test_get_blocks_bounds( + server: ServerMonitor, dataset_factory: Callable[..., str] +) -> None: + + test_register_model(server, dataset_factory) + + rpc = VtkModelView.model_prefix + "get_blocks_bounds" + server.call(rpc, [{"id": "123456789", "block_ids": [2]}]) + + response = server.get_response() + while isinstance(response, bytes) or response.get("id") != f"rpc:{rpc}": + response = server.get_response() + + assert response.get("result") == [4.9, 4.9, 3.1, 3.1, 0.0, 0.0] From 4f8a4042e45b82475381721d3f309acd32e98b25 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Wed, 13 May 2026 15:02:54 +0200 Subject: [PATCH 5/5] block_id --- src/opengeodeweb_viewer/rpc/model/model_protocols.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/opengeodeweb_viewer/rpc/model/model_protocols.py b/src/opengeodeweb_viewer/rpc/model/model_protocols.py index 234af88b..29e41c8f 100644 --- a/src/opengeodeweb_viewer/rpc/model/model_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/model_protocols.py @@ -198,8 +198,8 @@ def getBlocksBounds(self, rpc_params: RpcParams) -> list[float]: params = schemas.GetBlocksBounds.from_dict(rpc_params) pipeline = self.get_vtk_pipeline(params.id) bbox = vtkBoundingBox() - for i in params.block_ids: - if isinstance(block := pipeline.blockDataSets[i], vtkDataSet): + for block_id in params.block_ids: + if isinstance(block := pipeline.blockDataSets[block_id], vtkDataSet): bbox.AddBounds(block.GetBounds()) bounds = [0.0] * 6