diff --git a/opengeodeweb_viewer_schemas.json b/opengeodeweb_viewer_schemas.json index 47ffb9db..5ee65fe2 100644 --- a/opengeodeweb_viewer_schemas.json +++ b/opengeodeweb_viewer_schemas.json @@ -1504,6 +1504,89 @@ ], "additionalProperties": false }, + "components_visibility": { + "$id": "opengeodeweb_viewer.model.components_visibility", + "rpc": "components_visibility", + "type": "object", + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "block_ids": { + "type": "array", + "items": { + "type": "integer" + }, + "minItems": 1 + }, + "visibility": { + "type": "boolean" + } + }, + "required": [ + "id", + "block_ids", + "visibility" + ], + "additionalProperties": false + }, + "components_color": { + "$id": "opengeodeweb_viewer.model.components_color", + "rpc": "components_color", + "type": "object", + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "block_ids": { + "type": "array", + "items": { + "type": "integer" + }, + "minItems": 1 + }, + "color": { + "type": "object", + "properties": { + "r": { + "type": "integer", + "minimum": 0, + "maximum": 255 + }, + "g": { + "type": "integer", + "minimum": 0, + "maximum": 255 + }, + "b": { + "type": "integer", + "minimum": 0, + "maximum": 255 + }, + "a": { + "type": "number", + "minimum": 0, + "maximum": 1, + "default": 1 + } + }, + "required": [ + "r", + "g", + "b" + ], + "additionalProperties": false + } + }, + "required": [ + "id", + "block_ids", + "color" + ], + "additionalProperties": false + }, "surfaces": { "visibility": { "$id": "opengeodeweb_viewer.model.surfaces.visibility", diff --git a/requirements.txt b/requirements.txt index 5750c624..13efd779 100644 --- a/requirements.txt +++ b/requirements.txt @@ -61,4 +61,3 @@ wslink==1.12.4 yarl>=1 # via aiohttp -opengeodeweb-microservice==1.*,>=1.1.1 diff --git a/src/opengeodeweb_viewer/rpc/model/model_protocols.py b/src/opengeodeweb_viewer/rpc/model/model_protocols.py index 6ca47947..564e4ff5 100644 --- a/src/opengeodeweb_viewer/rpc/model/model_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/model_protocols.py @@ -81,3 +81,22 @@ def setModelVisibility(self, rpc_params: RpcParams) -> None: ) params = schemas.Visibility.from_dict(rpc_params) self.SetVisibility(params.id, params.visibility) + + @exportRpc(model_prefix + model_schemas_dict["components_color"]["rpc"]) + def setModelComponentsColor(self, rpc_params: RpcParams) -> None: + validate_schema( + rpc_params, self.model_schemas_dict["components_color"], self.model_prefix + ) + params = schemas.ComponentsColor.from_dict(rpc_params) + color = params.color + self.SetBlocksColor(params.id, params.block_ids, color.r, color.g, color.b) + + @exportRpc(model_prefix + model_schemas_dict["components_visibility"]["rpc"]) + def setModelComponentsVisibility(self, rpc_params: RpcParams) -> None: + validate_schema( + rpc_params, + self.model_schemas_dict["components_visibility"], + self.model_prefix, + ) + params = schemas.ComponentsVisibility.from_dict(rpc_params) + self.SetBlocksVisibility(params.id, params.block_ids, params.visibility) diff --git a/src/opengeodeweb_viewer/rpc/model/schemas/__init__.py b/src/opengeodeweb_viewer/rpc/model/schemas/__init__.py index a974c1d6..4316d90e 100644 --- a/src/opengeodeweb_viewer/rpc/model/schemas/__init__.py +++ b/src/opengeodeweb_viewer/rpc/model/schemas/__init__.py @@ -1,3 +1,5 @@ from .visibility import * from .register import * from .deregister import * +from .components_visibility import * +from .components_color import * diff --git a/src/opengeodeweb_viewer/rpc/model/schemas/components_color.json b/src/opengeodeweb_viewer/rpc/model/schemas/components_color.json new file mode 100644 index 00000000..08afcb6f --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/model/schemas/components_color.json @@ -0,0 +1,55 @@ +{ + "rpc": "components_color", + "type": "object", + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "block_ids": { + "type": "array", + "items": { + "type": "integer" + }, + "minItems": 1 + }, + "color": { + "type": "object", + "properties": { + "r": { + "type": "integer", + "minimum": 0, + "maximum": 255 + }, + "g": { + "type": "integer", + "minimum": 0, + "maximum": 255 + }, + "b": { + "type": "integer", + "minimum": 0, + "maximum": 255 + }, + "a": { + "type": "number", + "minimum": 0, + "maximum": 1, + "default": 1 + } + }, + "required": [ + "r", + "g", + "b" + ], + "additionalProperties": false + } + }, + "required": [ + "id", + "block_ids", + "color" + ], + "additionalProperties": false +} diff --git a/src/opengeodeweb_viewer/rpc/model/schemas/components_color.py b/src/opengeodeweb_viewer/rpc/model/schemas/components_color.py new file mode 100644 index 00000000..71474acb --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/model/schemas/components_color.py @@ -0,0 +1,24 @@ +from dataclasses_json import DataClassJsonMixin +from dataclasses import dataclass +from typing import Optional, List + + +@dataclass +class Color(DataClassJsonMixin): + def __post_init__(self) -> None: + print(self, flush=True) + + b: int + g: int + r: int + a: Optional[float] = None + + +@dataclass +class ComponentsColor(DataClassJsonMixin): + def __post_init__(self) -> None: + print(self, flush=True) + + block_ids: List[int] + color: Color + id: str diff --git a/src/opengeodeweb_viewer/rpc/model/schemas/components_visibility.json b/src/opengeodeweb_viewer/rpc/model/schemas/components_visibility.json new file mode 100644 index 00000000..548f1d2e --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/model/schemas/components_visibility.json @@ -0,0 +1,26 @@ +{ + "rpc": "components_visibility", + "type": "object", + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "block_ids": { + "type": "array", + "items": { + "type": "integer" + }, + "minItems": 1 + }, + "visibility": { + "type": "boolean" + } + }, + "required": [ + "id", + "block_ids", + "visibility" + ], + "additionalProperties": false +} diff --git a/src/opengeodeweb_viewer/rpc/model/schemas/components_visibility.py b/src/opengeodeweb_viewer/rpc/model/schemas/components_visibility.py new file mode 100644 index 00000000..db72d3ff --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/model/schemas/components_visibility.py @@ -0,0 +1,13 @@ +from dataclasses_json import DataClassJsonMixin +from dataclasses import dataclass +from typing import List + + +@dataclass +class ComponentsVisibility(DataClassJsonMixin): + def __post_init__(self) -> None: + print(self, flush=True) + + block_ids: List[int] + id: str + visibility: bool diff --git a/src/opengeodeweb_viewer/rpc/model/surfaces/model_surfaces_protocols.py b/src/opengeodeweb_viewer/rpc/model/surfaces/model_surfaces_protocols.py index aaa3a818..12b0c9af 100644 --- a/src/opengeodeweb_viewer/rpc/model/surfaces/model_surfaces_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/surfaces/model_surfaces_protocols.py @@ -34,7 +34,7 @@ def setModelSurfacesPolygonsVisibility(self, rpc_params: RpcParams) -> None: self.SetBlocksVisibility(params.id, params.block_ids, params.visibility) @exportRpc(model_surfaces_prefix + model_surfaces_schemas_dict["color"]["rpc"]) - def setModelSurfacesPolygonsCOlor(self, rpc_params: RpcParams) -> None: + def setModelSurfacesPolygonsColor(self, rpc_params: RpcParams) -> None: validate_schema( rpc_params, self.model_surfaces_schemas_dict["color"], diff --git a/tests/data/images/model/components_color.jpeg b/tests/data/images/model/components_color.jpeg new file mode 100644 index 00000000..24d6342b Binary files /dev/null and b/tests/data/images/model/components_color.jpeg differ diff --git a/tests/data/images/model/components_visibility_color.jpeg b/tests/data/images/model/components_visibility_color.jpeg new file mode 100644 index 00000000..5736698e Binary files /dev/null and b/tests/data/images/model/components_visibility_color.jpeg differ diff --git a/tests/model/test_model_protocols.py b/tests/model/test_model_protocols.py index 4f363f28..9a0d5980 100644 --- a/tests/model/test_model_protocols.py +++ b/tests/model/test_model_protocols.py @@ -53,3 +53,46 @@ def test_deregister_model( [{"id": "123456789"}], ) assert server.compare_image("model/deregister.jpeg") == True + + +def test_components_color_model( + server: ServerMonitor, dataset_factory: Callable[..., str] +) -> None: + + test_register_model_cube(server, dataset_factory) + + server.call( + VtkModelView.model_prefix + + VtkModelView.model_schemas_dict["components_color"]["rpc"], + [ + { + "id": "123456789", + "block_ids": [48, 49], + "color": {"r": 255, "g": 0, "b": 0}, + } + ], + ) + assert server.compare_image("model/components_color.jpeg") == True + + +def test_components_visibility_color_model( + server: ServerMonitor, dataset_factory: Callable[..., str] +) -> None: + test_register_model_cube(server, dataset_factory) + + server.call( + VtkModelView.model_prefix + "components_visibility", + [{"id": "123456789", "block_ids": [48, 49], "visibility": False}], + ) + + server.call( + VtkModelView.model_prefix + "components_color", + [ + { + "id": "123456789", + "block_ids": list(range(36, 47)), + "color": {"r": 0, "g": 255, "b": 0}, + } + ], + ) + assert server.compare_image("model/components_visibility_color.jpeg") == True