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/requirements.txt b/requirements.txt index 74d61ff7..7819587c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -61,4 +61,3 @@ wslink==1.12.4 yarl>=1 # via aiohttp -opengeodeweb-microservice==1.*,>=1.1.3 diff --git a/src/opengeodeweb_viewer/rpc/model/model_protocols.py b/src/opengeodeweb_viewer/rpc/model/model_protocols.py index d7d9d504..29e41c8f 100644 --- a/src/opengeodeweb_viewer/rpc/model/model_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/model_protocols.py @@ -4,6 +4,8 @@ # Third party imports from vtkmodules.vtkCommonDataModel import ( vtkCompositeDataSet, + vtkBoundingBox, + vtkDataSet, ) from vtkmodules.vtkRenderingCore import ( vtkCompositeDataDisplayAttributes, @@ -187,3 +189,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 block_id in params.block_ids: + if isinstance(block := pipeline.blockDataSets[block_id], vtkDataSet): + bbox.AddBounds(block.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 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]