From 110b484021f003bfc60e5c361112256d768a4116 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Wed, 7 Jan 2026 16:44:41 +0100 Subject: [PATCH 1/7] feat(ScalarRange): Add Color Range RPCs, schemas to meshes --- .../object/object_methods.py | 4 +++ .../rpc/mesh/cells/cells_protocols.py | 22 +++++++++++++++ .../rpc/mesh/cells/schemas/__init__.py | 4 ++- .../mesh/cells/schemas/cell_scalar_range.json | 22 +++++++++++++++ .../mesh/cells/schemas/cell_scalar_range.py | 12 ++++++++ .../cells/schemas/vertex_scalar_range.json | 22 +++++++++++++++ .../mesh/cells/schemas/vertex_scalar_range.py | 12 ++++++++ .../rpc/mesh/mesh_protocols.py | 16 +++++++++++ .../rpc/mesh/polygons/polygons_protocols.py | 24 ++++++++++++++++ .../rpc/mesh/polygons/schemas/__init__.py | 2 ++ .../schemas/polygon_scalar_range.json | 22 +++++++++++++++ .../polygons/schemas/polygon_scalar_range.py | 12 ++++++++ .../polygons/schemas/vertex_scalar_range.json | 22 +++++++++++++++ .../polygons/schemas/vertex_scalar_range.py | 12 ++++++++ .../rpc/mesh/polyhedra/polyhedra_protocols.py | 26 ++++++++++++++++++ .../rpc/mesh/polyhedra/schemas/__init__.py | 2 ++ .../schemas/polyhedron_scalar_range.json | 22 +++++++++++++++ .../schemas/polyhedron_scalar_range.py | 12 ++++++++ .../schemas/vertex_scalar_range.json | 22 +++++++++++++++ .../polyhedra/schemas/vertex_scalar_range.py | 12 ++++++++ .../rpc/mesh/schemas/__init__.py | 2 ++ .../rpc/mesh/schemas/cell_scalar_range.json | 22 +++++++++++++++ .../rpc/mesh/schemas/cell_scalar_range.py | 12 ++++++++ .../rpc/mesh/schemas/vertex_scalar_range.json | 22 +++++++++++++++ .../rpc/mesh/schemas/vertex_scalar_range.py | 12 ++++++++ .../images/mesh/polygons/scalar_range.jpeg | Bin 0 -> 12319 bytes .../polygons/test_mesh_polygons_protocols.py | 25 +++++++++++++++++ 27 files changed, 398 insertions(+), 1 deletion(-) create mode 100644 src/opengeodeweb_viewer/rpc/mesh/cells/schemas/cell_scalar_range.json create mode 100644 src/opengeodeweb_viewer/rpc/mesh/cells/schemas/cell_scalar_range.py create mode 100644 src/opengeodeweb_viewer/rpc/mesh/cells/schemas/vertex_scalar_range.json create mode 100644 src/opengeodeweb_viewer/rpc/mesh/cells/schemas/vertex_scalar_range.py create mode 100644 src/opengeodeweb_viewer/rpc/mesh/polygons/schemas/polygon_scalar_range.json create mode 100644 src/opengeodeweb_viewer/rpc/mesh/polygons/schemas/polygon_scalar_range.py create mode 100644 src/opengeodeweb_viewer/rpc/mesh/polygons/schemas/vertex_scalar_range.json create mode 100644 src/opengeodeweb_viewer/rpc/mesh/polygons/schemas/vertex_scalar_range.py create mode 100644 src/opengeodeweb_viewer/rpc/mesh/polyhedra/schemas/polyhedron_scalar_range.json create mode 100644 src/opengeodeweb_viewer/rpc/mesh/polyhedra/schemas/polyhedron_scalar_range.py create mode 100644 src/opengeodeweb_viewer/rpc/mesh/polyhedra/schemas/vertex_scalar_range.json create mode 100644 src/opengeodeweb_viewer/rpc/mesh/polyhedra/schemas/vertex_scalar_range.py create mode 100644 src/opengeodeweb_viewer/rpc/mesh/schemas/cell_scalar_range.json create mode 100644 src/opengeodeweb_viewer/rpc/mesh/schemas/cell_scalar_range.py create mode 100644 src/opengeodeweb_viewer/rpc/mesh/schemas/vertex_scalar_range.json create mode 100644 src/opengeodeweb_viewer/rpc/mesh/schemas/vertex_scalar_range.py create mode 100644 tests/data/images/mesh/polygons/scalar_range.jpeg diff --git a/src/opengeodeweb_viewer/object/object_methods.py b/src/opengeodeweb_viewer/object/object_methods.py index dcc7768..77cd72d 100644 --- a/src/opengeodeweb_viewer/object/object_methods.py +++ b/src/opengeodeweb_viewer/object/object_methods.py @@ -134,3 +134,7 @@ def clearColors(self, data_id: str) -> None: output.GetPointData().SetActiveScalars("") output.GetCellData().SetActiveScalars("") mapper.ScalarVisibilityOff() + + def SetScalarRange(self, data_id: str, minimum: float, maximum: float) -> None: + mapper = self.get_object(data_id).mapper + mapper.SetScalarRange(minimum, maximum) diff --git a/src/opengeodeweb_viewer/rpc/mesh/cells/cells_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/cells/cells_protocols.py index 9e25c0b..bf8b7b5 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/cells/cells_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/cells/cells_protocols.py @@ -63,3 +63,25 @@ def setMeshCellsCellAttribute(self, rpc_params: RpcParams) -> None: ) params = schemas.CellAttribute.from_dict(rpc_params) self.displayAttributeOnCells(params.id, params.name) + + @exportRpc( + mesh_cells_prefix + mesh_cells_schemas_dict["vertex_scalar_range"]["rpc"] + ) + def setMeshCellsVertexScalarRange(self, rpc_params: RpcParams) -> None: + validate_schema( + rpc_params, + self.mesh_cells_schemas_dict["vertex_scalar_range"], + self.mesh_cells_prefix, + ) + params = schemas.VertexScalarRange.from_dict(rpc_params) + self.SetScalarRange(params.id, params.minimum, params.maximum) + + @exportRpc(mesh_cells_prefix + mesh_cells_schemas_dict["cell_scalar_range"]["rpc"]) + def setMeshCellsCellScalarRange(self, rpc_params: RpcParams) -> None: + validate_schema( + rpc_params, + self.mesh_cells_schemas_dict["cell_scalar_range"], + self.mesh_cells_prefix, + ) + params = schemas.CellScalarRange.from_dict(rpc_params) + self.SetScalarRange(params.id, params.minimum, params.maximum) diff --git a/src/opengeodeweb_viewer/rpc/mesh/cells/schemas/__init__.py b/src/opengeodeweb_viewer/rpc/mesh/cells/schemas/__init__.py index c77862a..48ca7db 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/cells/schemas/__init__.py +++ b/src/opengeodeweb_viewer/rpc/mesh/cells/schemas/__init__.py @@ -1,4 +1,6 @@ from .visibility import * from .vertex_attribute import * -from .color import * from .cell_attribute import * +from .color import * +from .vertex_scalar_range import * +from .cell_scalar_range import * diff --git a/src/opengeodeweb_viewer/rpc/mesh/cells/schemas/cell_scalar_range.json b/src/opengeodeweb_viewer/rpc/mesh/cells/schemas/cell_scalar_range.json new file mode 100644 index 0000000..9efd4c4 --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/mesh/cells/schemas/cell_scalar_range.json @@ -0,0 +1,22 @@ +{ + "rpc": "cell_scalar_range", + "type": "object", + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "minimum": { + "type": "number" + }, + "maximum": { + "type": "number" + } + }, + "required": [ + "id", + "minimum", + "maximum" + ], + "additionalProperties": false +} diff --git a/src/opengeodeweb_viewer/rpc/mesh/cells/schemas/cell_scalar_range.py b/src/opengeodeweb_viewer/rpc/mesh/cells/schemas/cell_scalar_range.py new file mode 100644 index 0000000..074f322 --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/mesh/cells/schemas/cell_scalar_range.py @@ -0,0 +1,12 @@ +from dataclasses_json import DataClassJsonMixin +from dataclasses import dataclass + + +@dataclass +class CellScalarRange(DataClassJsonMixin): + def __post_init__(self) -> None: + print(self, flush=True) + + id: str + minimum: float + maximum: float diff --git a/src/opengeodeweb_viewer/rpc/mesh/cells/schemas/vertex_scalar_range.json b/src/opengeodeweb_viewer/rpc/mesh/cells/schemas/vertex_scalar_range.json new file mode 100644 index 0000000..68a8cab --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/mesh/cells/schemas/vertex_scalar_range.json @@ -0,0 +1,22 @@ +{ + "rpc": "vertex_scalar_range", + "type": "object", + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "minimum": { + "type": "number" + }, + "maximum": { + "type": "number" + } + }, + "required": [ + "id", + "minimum", + "maximum" + ], + "additionalProperties": false +} diff --git a/src/opengeodeweb_viewer/rpc/mesh/cells/schemas/vertex_scalar_range.py b/src/opengeodeweb_viewer/rpc/mesh/cells/schemas/vertex_scalar_range.py new file mode 100644 index 0000000..ff23bc7 --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/mesh/cells/schemas/vertex_scalar_range.py @@ -0,0 +1,12 @@ +from dataclasses_json import DataClassJsonMixin +from dataclasses import dataclass + + +@dataclass +class VertexScalarRange(DataClassJsonMixin): + def __post_init__(self) -> None: + print(self, flush=True) + + id: str + minimum: float + maximum: float diff --git a/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py index 0b54166..5ea02f9 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py @@ -146,3 +146,19 @@ def displayAttributeOnCells(self, data_id: str, name: str) -> None: mapper.ScalarVisibilityOn() mapper.SetScalarModeToUseCellData() mapper.SetScalarRange(cells.GetScalars().GetRange()) + + @exportRpc(mesh_prefix + mesh_schemas_dict["vertex_scalar_range"]["rpc"]) + def setMeshVertexScalarRange(self, rpc_params: RpcParams) -> None: + validate_schema( + rpc_params, self.mesh_schemas_dict["vertex_scalar_range"], self.mesh_prefix + ) + params = schemas.VertexScalarRange.from_dict(rpc_params) + self.SetScalarRange(params.id, params.minimum, params.maximum) + + @exportRpc(mesh_prefix + mesh_schemas_dict["cell_scalar_range"]["rpc"]) + def setMeshCellScalarRange(self, rpc_params: RpcParams) -> None: + validate_schema( + rpc_params, self.mesh_schemas_dict["cell_scalar_range"], self.mesh_prefix + ) + params = schemas.CellScalarRange.from_dict(rpc_params) + self.SetScalarRange(params.id, params.minimum, params.maximum) diff --git a/src/opengeodeweb_viewer/rpc/mesh/polygons/polygons_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/polygons/polygons_protocols.py index 78c5660..65f0eae 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/polygons/polygons_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/polygons/polygons_protocols.py @@ -67,3 +67,27 @@ def setMeshPolygonsPolygonAttribute(self, rpc_params: RpcParams) -> None: ) params = schemas.PolygonAttribute.from_dict(rpc_params) self.displayAttributeOnCells(params.id, params.name) + + @exportRpc( + mesh_polygons_prefix + mesh_polygons_schemas_dict["vertex_scalar_range"]["rpc"] + ) + def setMeshPolygonsVertexScalarRange(self, rpc_params: RpcParams) -> None: + validate_schema( + rpc_params, + self.mesh_polygons_schemas_dict["vertex_scalar_range"], + self.mesh_polygons_prefix, + ) + params = schemas.VertexScalarRange.from_dict(rpc_params) + self.SetScalarRange(params.id, params.minimum, params.maximum) + + @exportRpc( + mesh_polygons_prefix + mesh_polygons_schemas_dict["polygon_scalar_range"]["rpc"] + ) + def setMeshPolygonsPolygonScalarRange(self, rpc_params: RpcParams) -> None: + validate_schema( + rpc_params, + self.mesh_polygons_schemas_dict["polygon_scalar_range"], + self.mesh_polygons_prefix, + ) + params = schemas.PolygonScalarRange.from_dict(rpc_params) + self.SetScalarRange(params.id, params.minimum, params.maximum) diff --git a/src/opengeodeweb_viewer/rpc/mesh/polygons/schemas/__init__.py b/src/opengeodeweb_viewer/rpc/mesh/polygons/schemas/__init__.py index 4085e8c..cade099 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/polygons/schemas/__init__.py +++ b/src/opengeodeweb_viewer/rpc/mesh/polygons/schemas/__init__.py @@ -2,3 +2,5 @@ from .vertex_attribute import * from .polygon_attribute import * from .color import * +from .vertex_scalar_range import * +from .polygon_scalar_range import * diff --git a/src/opengeodeweb_viewer/rpc/mesh/polygons/schemas/polygon_scalar_range.json b/src/opengeodeweb_viewer/rpc/mesh/polygons/schemas/polygon_scalar_range.json new file mode 100644 index 0000000..75c20f1 --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/mesh/polygons/schemas/polygon_scalar_range.json @@ -0,0 +1,22 @@ +{ + "rpc": "polygon_scalar_range", + "type": "object", + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "minimum": { + "type": "number" + }, + "maximum": { + "type": "number" + } + }, + "required": [ + "id", + "minimum", + "maximum" + ], + "additionalProperties": false +} diff --git a/src/opengeodeweb_viewer/rpc/mesh/polygons/schemas/polygon_scalar_range.py b/src/opengeodeweb_viewer/rpc/mesh/polygons/schemas/polygon_scalar_range.py new file mode 100644 index 0000000..be4ea98 --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/mesh/polygons/schemas/polygon_scalar_range.py @@ -0,0 +1,12 @@ +from dataclasses_json import DataClassJsonMixin +from dataclasses import dataclass + + +@dataclass +class PolygonScalarRange(DataClassJsonMixin): + def __post_init__(self) -> None: + print(self, flush=True) + + id: str + minimum: float + maximum: float diff --git a/src/opengeodeweb_viewer/rpc/mesh/polygons/schemas/vertex_scalar_range.json b/src/opengeodeweb_viewer/rpc/mesh/polygons/schemas/vertex_scalar_range.json new file mode 100644 index 0000000..68a8cab --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/mesh/polygons/schemas/vertex_scalar_range.json @@ -0,0 +1,22 @@ +{ + "rpc": "vertex_scalar_range", + "type": "object", + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "minimum": { + "type": "number" + }, + "maximum": { + "type": "number" + } + }, + "required": [ + "id", + "minimum", + "maximum" + ], + "additionalProperties": false +} diff --git a/src/opengeodeweb_viewer/rpc/mesh/polygons/schemas/vertex_scalar_range.py b/src/opengeodeweb_viewer/rpc/mesh/polygons/schemas/vertex_scalar_range.py new file mode 100644 index 0000000..ff23bc7 --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/mesh/polygons/schemas/vertex_scalar_range.py @@ -0,0 +1,12 @@ +from dataclasses_json import DataClassJsonMixin +from dataclasses import dataclass + + +@dataclass +class VertexScalarRange(DataClassJsonMixin): + def __post_init__(self) -> None: + print(self, flush=True) + + id: str + minimum: float + maximum: float diff --git a/src/opengeodeweb_viewer/rpc/mesh/polyhedra/polyhedra_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/polyhedra/polyhedra_protocols.py index 1d87bfd..1ae18e8 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/polyhedra/polyhedra_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/polyhedra/polyhedra_protocols.py @@ -68,3 +68,29 @@ def setMeshPolyhedraPolyhedronAttribute(self, rpc_params: RpcParams) -> None: ) params = schemas.PolyhedronAttribute.from_dict(rpc_params) self.displayAttributeOnCells(params.id, params.name) + + @exportRpc( + mesh_polyhedra_prefix + + mesh_polyhedra_schemas_dict["vertex_scalar_range"]["rpc"] + ) + def setMeshPolyhedraVertexScalarRange(self, rpc_params: RpcParams) -> None: + validate_schema( + rpc_params, + self.mesh_polyhedra_schemas_dict["vertex_scalar_range"], + self.mesh_polyhedra_prefix, + ) + params = schemas.VertexScalarRange.from_dict(rpc_params) + self.SetScalarRange(params.id, params.minimum, params.maximum) + + @exportRpc( + mesh_polyhedra_prefix + + mesh_polyhedra_schemas_dict["polyhedron_scalar_range"]["rpc"] + ) + def setMeshPolyhedraPolyhedronScalarRange(self, rpc_params: RpcParams) -> None: + validate_schema( + rpc_params, + self.mesh_polyhedra_schemas_dict["polyhedron_scalar_range"], + self.mesh_polyhedra_prefix, + ) + params = schemas.PolyhedronScalarRange.from_dict(rpc_params) + self.SetScalarRange(params.id, params.minimum, params.maximum) diff --git a/src/opengeodeweb_viewer/rpc/mesh/polyhedra/schemas/__init__.py b/src/opengeodeweb_viewer/rpc/mesh/polyhedra/schemas/__init__.py index 40aad4f..1bdf557 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/polyhedra/schemas/__init__.py +++ b/src/opengeodeweb_viewer/rpc/mesh/polyhedra/schemas/__init__.py @@ -2,3 +2,5 @@ from .vertex_attribute import * from .polyhedron_attribute import * from .color import * +from .vertex_scalar_range import * +from .polyhedron_scalar_range import * diff --git a/src/opengeodeweb_viewer/rpc/mesh/polyhedra/schemas/polyhedron_scalar_range.json b/src/opengeodeweb_viewer/rpc/mesh/polyhedra/schemas/polyhedron_scalar_range.json new file mode 100644 index 0000000..31d646d --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/mesh/polyhedra/schemas/polyhedron_scalar_range.json @@ -0,0 +1,22 @@ +{ + "rpc": "polyhedron_scalar_range", + "type": "object", + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "minimum": { + "type": "number" + }, + "maximum": { + "type": "number" + } + }, + "required": [ + "id", + "minimum", + "maximum" + ], + "additionalProperties": false +} diff --git a/src/opengeodeweb_viewer/rpc/mesh/polyhedra/schemas/polyhedron_scalar_range.py b/src/opengeodeweb_viewer/rpc/mesh/polyhedra/schemas/polyhedron_scalar_range.py new file mode 100644 index 0000000..08a5264 --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/mesh/polyhedra/schemas/polyhedron_scalar_range.py @@ -0,0 +1,12 @@ +from dataclasses_json import DataClassJsonMixin +from dataclasses import dataclass + + +@dataclass +class PolyhedronScalarRange(DataClassJsonMixin): + def __post_init__(self) -> None: + print(self, flush=True) + + id: str + minimum: float + maximum: float diff --git a/src/opengeodeweb_viewer/rpc/mesh/polyhedra/schemas/vertex_scalar_range.json b/src/opengeodeweb_viewer/rpc/mesh/polyhedra/schemas/vertex_scalar_range.json new file mode 100644 index 0000000..68a8cab --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/mesh/polyhedra/schemas/vertex_scalar_range.json @@ -0,0 +1,22 @@ +{ + "rpc": "vertex_scalar_range", + "type": "object", + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "minimum": { + "type": "number" + }, + "maximum": { + "type": "number" + } + }, + "required": [ + "id", + "minimum", + "maximum" + ], + "additionalProperties": false +} diff --git a/src/opengeodeweb_viewer/rpc/mesh/polyhedra/schemas/vertex_scalar_range.py b/src/opengeodeweb_viewer/rpc/mesh/polyhedra/schemas/vertex_scalar_range.py new file mode 100644 index 0000000..ff23bc7 --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/mesh/polyhedra/schemas/vertex_scalar_range.py @@ -0,0 +1,12 @@ +from dataclasses_json import DataClassJsonMixin +from dataclasses import dataclass + + +@dataclass +class VertexScalarRange(DataClassJsonMixin): + def __post_init__(self) -> None: + print(self, flush=True) + + id: str + minimum: float + maximum: float diff --git a/src/opengeodeweb_viewer/rpc/mesh/schemas/__init__.py b/src/opengeodeweb_viewer/rpc/mesh/schemas/__init__.py index e6b398e..6c83d49 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/schemas/__init__.py +++ b/src/opengeodeweb_viewer/rpc/mesh/schemas/__init__.py @@ -4,3 +4,5 @@ from .deregister import * from .color import * from .apply_textures import * +from .vertex_scalar_range import * +from .cell_scalar_range import * diff --git a/src/opengeodeweb_viewer/rpc/mesh/schemas/cell_scalar_range.json b/src/opengeodeweb_viewer/rpc/mesh/schemas/cell_scalar_range.json new file mode 100644 index 0000000..9efd4c4 --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/mesh/schemas/cell_scalar_range.json @@ -0,0 +1,22 @@ +{ + "rpc": "cell_scalar_range", + "type": "object", + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "minimum": { + "type": "number" + }, + "maximum": { + "type": "number" + } + }, + "required": [ + "id", + "minimum", + "maximum" + ], + "additionalProperties": false +} diff --git a/src/opengeodeweb_viewer/rpc/mesh/schemas/cell_scalar_range.py b/src/opengeodeweb_viewer/rpc/mesh/schemas/cell_scalar_range.py new file mode 100644 index 0000000..074f322 --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/mesh/schemas/cell_scalar_range.py @@ -0,0 +1,12 @@ +from dataclasses_json import DataClassJsonMixin +from dataclasses import dataclass + + +@dataclass +class CellScalarRange(DataClassJsonMixin): + def __post_init__(self) -> None: + print(self, flush=True) + + id: str + minimum: float + maximum: float diff --git a/src/opengeodeweb_viewer/rpc/mesh/schemas/vertex_scalar_range.json b/src/opengeodeweb_viewer/rpc/mesh/schemas/vertex_scalar_range.json new file mode 100644 index 0000000..68a8cab --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/mesh/schemas/vertex_scalar_range.json @@ -0,0 +1,22 @@ +{ + "rpc": "vertex_scalar_range", + "type": "object", + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "minimum": { + "type": "number" + }, + "maximum": { + "type": "number" + } + }, + "required": [ + "id", + "minimum", + "maximum" + ], + "additionalProperties": false +} diff --git a/src/opengeodeweb_viewer/rpc/mesh/schemas/vertex_scalar_range.py b/src/opengeodeweb_viewer/rpc/mesh/schemas/vertex_scalar_range.py new file mode 100644 index 0000000..ff23bc7 --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/mesh/schemas/vertex_scalar_range.py @@ -0,0 +1,12 @@ +from dataclasses_json import DataClassJsonMixin +from dataclasses import dataclass + + +@dataclass +class VertexScalarRange(DataClassJsonMixin): + def __post_init__(self) -> None: + print(self, flush=True) + + id: str + minimum: float + maximum: float diff --git a/tests/data/images/mesh/polygons/scalar_range.jpeg b/tests/data/images/mesh/polygons/scalar_range.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..6982377dc2d2ae1490cbeffb4aba09bfd3a38d21 GIT binary patch literal 12319 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 vxbS^pLKy3lC6bf None: + + dataset_factory(id="123456789", viewable_file="triangulated_surface2d.vtp") + + server.call( + VtkMeshView.mesh_prefix + VtkMeshView.mesh_schemas_dict["register"]["rpc"], + [{"id": "123456789"}], + ) + + server.call( + VtkMeshPolygonsView.mesh_polygons_prefix + + VtkMeshPolygonsView.mesh_polygons_schemas_dict["polygon_attribute"]["rpc"], + [{"id": "123456789", "name": "triangle_vertices"}], + ) + + server.call( + VtkMeshPolygonsView.mesh_polygons_prefix + + VtkMeshPolygonsView.mesh_polygons_schemas_dict["polygon_scalar_range"]["rpc"], + [{"id": "123456789", "minimum": 0, "maximum": 10}], + ) + assert server.compare_image("mesh/polygons/scalar_range.jpeg") == True From 7b6ae2d2bf50844d48e86be7f83c8ff160862245 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Wed, 7 Jan 2026 17:05:49 +0100 Subject: [PATCH 2/7] typed imports in conftest --- tests/conftest.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index b4f1373..16f4fb7 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -2,13 +2,13 @@ from pathlib import Path from websocket import create_connection, WebSocketTimeoutException import json -from xprocess import ProcessStarter, XProcess +from xprocess import ProcessStarter, XProcess # type: ignore[import-untyped] from vtkmodules.vtkIOImage import vtkImageReader2, vtkPNGReader, vtkJPEGReader from vtkmodules.vtkImagingCore import vtkImageDifference import os import shutil import xml.etree.ElementTree as ET -from typing import Callable, Generator, Any, cast +from typing import Callable, Generator, Any from opengeodeweb_viewer import config from opengeodeweb_microservice.database.connection import get_session, init_database from opengeodeweb_microservice.database.data import Data @@ -159,7 +159,7 @@ def __init__(self, root_path: Path) -> None: self.root_path = Path(root_path) def get_xprocess_args(self) -> tuple[str, type, type]: - class Starter(ProcessStarter): + class Starter(ProcessStarter): # type: ignore terminate_on_interrupt = True pattern = "wslink: Starting factory" timeout = 10 From 3a219dafb776f5a35794a4d2e2f63c4afe36d033 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Thu, 8 Jan 2026 09:22:07 +0100 Subject: [PATCH 3/7] harmonize with attribute & add missing schemas and RPcs for meshes --- .../object/object_methods.py | 6 ++-- .../rpc/mesh/cells/cells_protocols.py | 4 +-- .../rpc/mesh/edges/mesh_edges_protocols.py | 12 ++++++++ .../rpc/mesh/edges/schemas/__init__.py | 1 + .../schemas/vertex_scalar_range.json | 0 .../schemas/vertex_scalar_range.py | 0 .../rpc/mesh/mesh_protocols.py | 28 +++++++++---------- .../rpc/mesh/points/mesh_points_protocols.py | 12 ++++++++ .../rpc/mesh/points/schemas/__init__.py | 1 + .../schemas/vertex_scalar_range.json} | 2 +- .../schemas/vertex_scalar_range.py} | 2 +- .../rpc/mesh/polygons/polygons_protocols.py | 4 +-- .../rpc/mesh/polyhedra/polyhedra_protocols.py | 4 +-- .../rpc/mesh/schemas/__init__.py | 2 -- 14 files changed, 51 insertions(+), 27 deletions(-) rename src/opengeodeweb_viewer/rpc/mesh/{ => edges}/schemas/vertex_scalar_range.json (100%) rename src/opengeodeweb_viewer/rpc/mesh/{ => edges}/schemas/vertex_scalar_range.py (100%) rename src/opengeodeweb_viewer/rpc/mesh/{schemas/cell_scalar_range.json => points/schemas/vertex_scalar_range.json} (90%) rename src/opengeodeweb_viewer/rpc/mesh/{schemas/cell_scalar_range.py => points/schemas/vertex_scalar_range.py} (82%) diff --git a/src/opengeodeweb_viewer/object/object_methods.py b/src/opengeodeweb_viewer/object/object_methods.py index 77cd72d..0efce0e 100644 --- a/src/opengeodeweb_viewer/object/object_methods.py +++ b/src/opengeodeweb_viewer/object/object_methods.py @@ -135,6 +135,6 @@ def clearColors(self, data_id: str) -> None: output.GetCellData().SetActiveScalars("") mapper.ScalarVisibilityOff() - def SetScalarRange(self, data_id: str, minimum: float, maximum: float) -> None: - mapper = self.get_object(data_id).mapper - mapper.SetScalarRange(minimum, maximum) + # def SetScalarRange(self, data_id: str, minimum: float, maximum: float) -> None: + # mapper = self.get_object(data_id).mapper + # mapper.SetScalarRange(minimum, maximum) diff --git a/src/opengeodeweb_viewer/rpc/mesh/cells/cells_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/cells/cells_protocols.py index bf8b7b5..c402143 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/cells/cells_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/cells/cells_protocols.py @@ -74,7 +74,7 @@ def setMeshCellsVertexScalarRange(self, rpc_params: RpcParams) -> None: self.mesh_cells_prefix, ) params = schemas.VertexScalarRange.from_dict(rpc_params) - self.SetScalarRange(params.id, params.minimum, params.maximum) + self.displayScalarRangeOnVertices(params.id, params.minimum, params.maximum) @exportRpc(mesh_cells_prefix + mesh_cells_schemas_dict["cell_scalar_range"]["rpc"]) def setMeshCellsCellScalarRange(self, rpc_params: RpcParams) -> None: @@ -84,4 +84,4 @@ def setMeshCellsCellScalarRange(self, rpc_params: RpcParams) -> None: self.mesh_cells_prefix, ) params = schemas.CellScalarRange.from_dict(rpc_params) - self.SetScalarRange(params.id, params.minimum, params.maximum) + self.displayScalarRangeOnCells(params.id, params.minimum, params.maximum) diff --git a/src/opengeodeweb_viewer/rpc/mesh/edges/mesh_edges_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/edges/mesh_edges_protocols.py index 1f0f62c..b5e143d 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/edges/mesh_edges_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/edges/mesh_edges_protocols.py @@ -49,3 +49,15 @@ def setMeshEdgesWidth(self, rpc_params: RpcParams) -> None: ) params = schemas.Width.from_dict(rpc_params) self.SetEdgesWidth(params.id, params.width) + + @exportRpc( + mesh_edges_prefix + mesh_edges_schemas_dict["vertex_scalar_range"]["rpc"] + ) + def setMeshEdgesVertexScalarRange(self, rpc_params: RpcParams) -> None: + validate_schema( + rpc_params, + self.mesh_edges_schemas_dict["vertex_scalar_range"], + self.mesh_edges_prefix, + ) + params = schemas.VertexScalarRange.from_dict(rpc_params) + self.displayScalarRangeOnVertices(params.id, params.minimum, params.maximum) diff --git a/src/opengeodeweb_viewer/rpc/mesh/edges/schemas/__init__.py b/src/opengeodeweb_viewer/rpc/mesh/edges/schemas/__init__.py index 27cf1d7..8fad4a4 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/edges/schemas/__init__.py +++ b/src/opengeodeweb_viewer/rpc/mesh/edges/schemas/__init__.py @@ -3,3 +3,4 @@ from .vertex_attribute import * from .size import * from .color import * +from .vertex_scalar_range import * diff --git a/src/opengeodeweb_viewer/rpc/mesh/schemas/vertex_scalar_range.json b/src/opengeodeweb_viewer/rpc/mesh/edges/schemas/vertex_scalar_range.json similarity index 100% rename from src/opengeodeweb_viewer/rpc/mesh/schemas/vertex_scalar_range.json rename to src/opengeodeweb_viewer/rpc/mesh/edges/schemas/vertex_scalar_range.json diff --git a/src/opengeodeweb_viewer/rpc/mesh/schemas/vertex_scalar_range.py b/src/opengeodeweb_viewer/rpc/mesh/edges/schemas/vertex_scalar_range.py similarity index 100% rename from src/opengeodeweb_viewer/rpc/mesh/schemas/vertex_scalar_range.py rename to src/opengeodeweb_viewer/rpc/mesh/edges/schemas/vertex_scalar_range.py diff --git a/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py index 5ea02f9..e8110db 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py @@ -147,18 +147,18 @@ def displayAttributeOnCells(self, data_id: str, name: str) -> None: mapper.SetScalarModeToUseCellData() mapper.SetScalarRange(cells.GetScalars().GetRange()) - @exportRpc(mesh_prefix + mesh_schemas_dict["vertex_scalar_range"]["rpc"]) - def setMeshVertexScalarRange(self, rpc_params: RpcParams) -> None: - validate_schema( - rpc_params, self.mesh_schemas_dict["vertex_scalar_range"], self.mesh_prefix - ) - params = schemas.VertexScalarRange.from_dict(rpc_params) - self.SetScalarRange(params.id, params.minimum, params.maximum) + def displayScalarRangeOnVertices( + self, data_id: str, minimum: float, maximum: float + ) -> None: + mapper = self.get_object(data_id).mapper + mapper.ScalarVisibilityOn() + mapper.SetScalarModeToUsePointData() + mapper.SetScalarRange(minimum, maximum) - @exportRpc(mesh_prefix + mesh_schemas_dict["cell_scalar_range"]["rpc"]) - def setMeshCellScalarRange(self, rpc_params: RpcParams) -> None: - validate_schema( - rpc_params, self.mesh_schemas_dict["cell_scalar_range"], self.mesh_prefix - ) - params = schemas.CellScalarRange.from_dict(rpc_params) - self.SetScalarRange(params.id, params.minimum, params.maximum) + def displayScalarRangeOnCells( + self, data_id: str, minimum: float, maximum: float + ) -> None: + mapper = self.get_object(data_id).mapper + mapper.ScalarVisibilityOn() + mapper.SetScalarModeToUseCellData() + mapper.SetScalarRange(minimum, maximum) diff --git a/src/opengeodeweb_viewer/rpc/mesh/points/mesh_points_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/points/mesh_points_protocols.py index 81ed131..9ed8c45 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/points/mesh_points_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/points/mesh_points_protocols.py @@ -59,3 +59,15 @@ def setMeshPointsVertexAttribute(self, rpc_params: RpcParams) -> None: ) params = schemas.VertexAttribute.from_dict(rpc_params) self.displayAttributeOnVertices(params.id, params.name) + + @exportRpc( + mesh_points_prefix + mesh_points_schemas_dict["vertex_scalar_range"]["rpc"] + ) + def setMeshPointsVertexScalarRange(self, rpc_params: RpcParams) -> None: + validate_schema( + rpc_params, + self.mesh_points_schemas_dict["vertex_scalar_range"], + self.mesh_points_prefix, + ) + params = schemas.VertexScalarRange.from_dict(rpc_params) + self.displayScalarRangeOnVertices(params.id, params.minimum, params.maximum) diff --git a/src/opengeodeweb_viewer/rpc/mesh/points/schemas/__init__.py b/src/opengeodeweb_viewer/rpc/mesh/points/schemas/__init__.py index 67bb8fc..20a9131 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/points/schemas/__init__.py +++ b/src/opengeodeweb_viewer/rpc/mesh/points/schemas/__init__.py @@ -2,3 +2,4 @@ from .vertex_attribute import * from .size import * from .color import * +from .vertex_scalar_range import * diff --git a/src/opengeodeweb_viewer/rpc/mesh/schemas/cell_scalar_range.json b/src/opengeodeweb_viewer/rpc/mesh/points/schemas/vertex_scalar_range.json similarity index 90% rename from src/opengeodeweb_viewer/rpc/mesh/schemas/cell_scalar_range.json rename to src/opengeodeweb_viewer/rpc/mesh/points/schemas/vertex_scalar_range.json index 9efd4c4..68a8cab 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/schemas/cell_scalar_range.json +++ b/src/opengeodeweb_viewer/rpc/mesh/points/schemas/vertex_scalar_range.json @@ -1,5 +1,5 @@ { - "rpc": "cell_scalar_range", + "rpc": "vertex_scalar_range", "type": "object", "properties": { "id": { diff --git a/src/opengeodeweb_viewer/rpc/mesh/schemas/cell_scalar_range.py b/src/opengeodeweb_viewer/rpc/mesh/points/schemas/vertex_scalar_range.py similarity index 82% rename from src/opengeodeweb_viewer/rpc/mesh/schemas/cell_scalar_range.py rename to src/opengeodeweb_viewer/rpc/mesh/points/schemas/vertex_scalar_range.py index 074f322..ff23bc7 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/schemas/cell_scalar_range.py +++ b/src/opengeodeweb_viewer/rpc/mesh/points/schemas/vertex_scalar_range.py @@ -3,7 +3,7 @@ @dataclass -class CellScalarRange(DataClassJsonMixin): +class VertexScalarRange(DataClassJsonMixin): def __post_init__(self) -> None: print(self, flush=True) diff --git a/src/opengeodeweb_viewer/rpc/mesh/polygons/polygons_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/polygons/polygons_protocols.py index 65f0eae..3bfff46 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/polygons/polygons_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/polygons/polygons_protocols.py @@ -78,7 +78,7 @@ def setMeshPolygonsVertexScalarRange(self, rpc_params: RpcParams) -> None: self.mesh_polygons_prefix, ) params = schemas.VertexScalarRange.from_dict(rpc_params) - self.SetScalarRange(params.id, params.minimum, params.maximum) + self.displayScalarRangeOnVertices(params.id, params.minimum, params.maximum) @exportRpc( mesh_polygons_prefix + mesh_polygons_schemas_dict["polygon_scalar_range"]["rpc"] @@ -90,4 +90,4 @@ def setMeshPolygonsPolygonScalarRange(self, rpc_params: RpcParams) -> None: self.mesh_polygons_prefix, ) params = schemas.PolygonScalarRange.from_dict(rpc_params) - self.SetScalarRange(params.id, params.minimum, params.maximum) + self.displayScalarRangeOnCells(params.id, params.minimum, params.maximum) diff --git a/src/opengeodeweb_viewer/rpc/mesh/polyhedra/polyhedra_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/polyhedra/polyhedra_protocols.py index 1ae18e8..b121ca8 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/polyhedra/polyhedra_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/polyhedra/polyhedra_protocols.py @@ -80,7 +80,7 @@ def setMeshPolyhedraVertexScalarRange(self, rpc_params: RpcParams) -> None: self.mesh_polyhedra_prefix, ) params = schemas.VertexScalarRange.from_dict(rpc_params) - self.SetScalarRange(params.id, params.minimum, params.maximum) + self.displayScalarRangeOnVertices(params.id, params.minimum, params.maximum) @exportRpc( mesh_polyhedra_prefix @@ -93,4 +93,4 @@ def setMeshPolyhedraPolyhedronScalarRange(self, rpc_params: RpcParams) -> None: self.mesh_polyhedra_prefix, ) params = schemas.PolyhedronScalarRange.from_dict(rpc_params) - self.SetScalarRange(params.id, params.minimum, params.maximum) + self.displayScalarRangeOnCells(params.id, params.minimum, params.maximum) diff --git a/src/opengeodeweb_viewer/rpc/mesh/schemas/__init__.py b/src/opengeodeweb_viewer/rpc/mesh/schemas/__init__.py index 6c83d49..e6b398e 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/schemas/__init__.py +++ b/src/opengeodeweb_viewer/rpc/mesh/schemas/__init__.py @@ -4,5 +4,3 @@ from .deregister import * from .color import * from .apply_textures import * -from .vertex_scalar_range import * -from .cell_scalar_range import * From df94332525d3b5aa45128c8887920164483f9a4d Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Thu, 8 Jan 2026 09:23:33 +0100 Subject: [PATCH 4/7] rm comments --- src/opengeodeweb_viewer/object/object_methods.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/opengeodeweb_viewer/object/object_methods.py b/src/opengeodeweb_viewer/object/object_methods.py index 0efce0e..dcc7768 100644 --- a/src/opengeodeweb_viewer/object/object_methods.py +++ b/src/opengeodeweb_viewer/object/object_methods.py @@ -134,7 +134,3 @@ def clearColors(self, data_id: str) -> None: output.GetPointData().SetActiveScalars("") output.GetCellData().SetActiveScalars("") mapper.ScalarVisibilityOff() - - # def SetScalarRange(self, data_id: str, minimum: float, maximum: float) -> None: - # mapper = self.get_object(data_id).mapper - # mapper.SetScalarRange(minimum, maximum) From 1d47cb43e90bae75e61bb4c76a392b8e04bb7a2f Mon Sep 17 00:00:00 2001 From: MaxNumerique <144453705+MaxNumerique@users.noreply.github.com> Date: Thu, 8 Jan 2026 09:02:37 +0000 Subject: [PATCH 5/7] Apply prepare changes --- opengeodeweb_viewer_schemas.json | 184 ++++++++++++++++++ requirements.txt | 1 - .../rpc/mesh/cells/schemas/__init__.py | 4 +- .../mesh/cells/schemas/cell_scalar_range.py | 2 +- .../mesh/cells/schemas/vertex_scalar_range.py | 2 +- .../rpc/mesh/edges/schemas/__init__.py | 2 +- .../mesh/edges/schemas/vertex_scalar_range.py | 2 +- .../rpc/mesh/points/schemas/__init__.py | 2 +- .../points/schemas/vertex_scalar_range.py | 2 +- .../rpc/mesh/polygons/schemas/__init__.py | 4 +- .../polygons/schemas/polygon_scalar_range.py | 2 +- .../polygons/schemas/vertex_scalar_range.py | 2 +- .../rpc/mesh/polyhedra/schemas/__init__.py | 4 +- .../schemas/polyhedron_scalar_range.py | 2 +- .../polyhedra/schemas/vertex_scalar_range.py | 2 +- 15 files changed, 200 insertions(+), 17 deletions(-) diff --git a/opengeodeweb_viewer_schemas.json b/opengeodeweb_viewer_schemas.json index 7976533..13e12ff 100644 --- a/opengeodeweb_viewer_schemas.json +++ b/opengeodeweb_viewer_schemas.json @@ -53,6 +53,29 @@ ], "additionalProperties": false }, + "vertex_scalar_range": { + "$id": "opengeodeweb_viewer.mesh.cells.vertex_scalar_range", + "rpc": "vertex_scalar_range", + "type": "object", + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "minimum": { + "type": "number" + }, + "maximum": { + "type": "number" + } + }, + "required": [ + "id", + "minimum", + "maximum" + ], + "additionalProperties": false + }, "vertex_attribute": { "$id": "opengeodeweb_viewer.mesh.cells.vertex_attribute", "rpc": "vertex_attribute", @@ -121,6 +144,29 @@ ], "additionalProperties": false }, + "cell_scalar_range": { + "$id": "opengeodeweb_viewer.mesh.cells.cell_scalar_range", + "rpc": "cell_scalar_range", + "type": "object", + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "minimum": { + "type": "number" + }, + "maximum": { + "type": "number" + } + }, + "required": [ + "id", + "minimum", + "maximum" + ], + "additionalProperties": false + }, "cell_attribute": { "$id": "opengeodeweb_viewer.mesh.cells.cell_attribute", "rpc": "cell_attribute", @@ -181,6 +227,29 @@ ], "additionalProperties": false }, + "vertex_scalar_range": { + "$id": "opengeodeweb_viewer.mesh.edges.vertex_scalar_range", + "rpc": "vertex_scalar_range", + "type": "object", + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "minimum": { + "type": "number" + }, + "maximum": { + "type": "number" + } + }, + "required": [ + "id", + "minimum", + "maximum" + ], + "additionalProperties": false + }, "vertex_attribute": { "$id": "opengeodeweb_viewer.mesh.edges.vertex_attribute", "rpc": "vertex_attribute", @@ -289,6 +358,29 @@ ], "additionalProperties": false }, + "vertex_scalar_range": { + "$id": "opengeodeweb_viewer.mesh.points.vertex_scalar_range", + "rpc": "vertex_scalar_range", + "type": "object", + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "minimum": { + "type": "number" + }, + "maximum": { + "type": "number" + } + }, + "required": [ + "id", + "minimum", + "maximum" + ], + "additionalProperties": false + }, "vertex_attribute": { "$id": "opengeodeweb_viewer.mesh.points.vertex_attribute", "rpc": "vertex_attribute", @@ -397,6 +489,29 @@ ], "additionalProperties": false }, + "vertex_scalar_range": { + "$id": "opengeodeweb_viewer.mesh.polygons.vertex_scalar_range", + "rpc": "vertex_scalar_range", + "type": "object", + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "minimum": { + "type": "number" + }, + "maximum": { + "type": "number" + } + }, + "required": [ + "id", + "minimum", + "maximum" + ], + "additionalProperties": false + }, "vertex_attribute": { "$id": "opengeodeweb_viewer.mesh.polygons.vertex_attribute", "rpc": "vertex_attribute", @@ -417,6 +532,29 @@ ], "additionalProperties": false }, + "polygon_scalar_range": { + "$id": "opengeodeweb_viewer.mesh.polygons.polygon_scalar_range", + "rpc": "polygon_scalar_range", + "type": "object", + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "minimum": { + "type": "number" + }, + "maximum": { + "type": "number" + } + }, + "required": [ + "id", + "minimum", + "maximum" + ], + "additionalProperties": false + }, "polygon_attribute": { "$id": "opengeodeweb_viewer.mesh.polygons.polygon_attribute", "rpc": "polygon_attribute", @@ -506,6 +644,29 @@ ], "additionalProperties": false }, + "vertex_scalar_range": { + "$id": "opengeodeweb_viewer.mesh.polyhedra.vertex_scalar_range", + "rpc": "vertex_scalar_range", + "type": "object", + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "minimum": { + "type": "number" + }, + "maximum": { + "type": "number" + } + }, + "required": [ + "id", + "minimum", + "maximum" + ], + "additionalProperties": false + }, "vertex_attribute": { "$id": "opengeodeweb_viewer.mesh.polyhedra.vertex_attribute", "rpc": "vertex_attribute", @@ -526,6 +687,29 @@ ], "additionalProperties": false }, + "polyhedron_scalar_range": { + "$id": "opengeodeweb_viewer.mesh.polyhedra.polyhedron_scalar_range", + "rpc": "polyhedron_scalar_range", + "type": "object", + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "minimum": { + "type": "number" + }, + "maximum": { + "type": "number" + } + }, + "required": [ + "id", + "minimum", + "maximum" + ], + "additionalProperties": false + }, "polyhedron_attribute": { "$id": "opengeodeweb_viewer.mesh.polyhedra.polyhedron_attribute", "rpc": "polyhedron_attribute", diff --git a/requirements.txt b/requirements.txt index 229c58f..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.12rc1 diff --git a/src/opengeodeweb_viewer/rpc/mesh/cells/schemas/__init__.py b/src/opengeodeweb_viewer/rpc/mesh/cells/schemas/__init__.py index 48ca7db..20497c4 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/cells/schemas/__init__.py +++ b/src/opengeodeweb_viewer/rpc/mesh/cells/schemas/__init__.py @@ -1,6 +1,6 @@ from .visibility import * +from .vertex_scalar_range import * from .vertex_attribute import * -from .cell_attribute import * from .color import * -from .vertex_scalar_range import * from .cell_scalar_range import * +from .cell_attribute import * diff --git a/src/opengeodeweb_viewer/rpc/mesh/cells/schemas/cell_scalar_range.py b/src/opengeodeweb_viewer/rpc/mesh/cells/schemas/cell_scalar_range.py index 074f322..5013762 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/cells/schemas/cell_scalar_range.py +++ b/src/opengeodeweb_viewer/rpc/mesh/cells/schemas/cell_scalar_range.py @@ -8,5 +8,5 @@ def __post_init__(self) -> None: print(self, flush=True) id: str - minimum: float maximum: float + minimum: float diff --git a/src/opengeodeweb_viewer/rpc/mesh/cells/schemas/vertex_scalar_range.py b/src/opengeodeweb_viewer/rpc/mesh/cells/schemas/vertex_scalar_range.py index ff23bc7..735ba2a 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/cells/schemas/vertex_scalar_range.py +++ b/src/opengeodeweb_viewer/rpc/mesh/cells/schemas/vertex_scalar_range.py @@ -8,5 +8,5 @@ def __post_init__(self) -> None: print(self, flush=True) id: str - minimum: float maximum: float + minimum: float diff --git a/src/opengeodeweb_viewer/rpc/mesh/edges/schemas/__init__.py b/src/opengeodeweb_viewer/rpc/mesh/edges/schemas/__init__.py index 8fad4a4..1c778fe 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/edges/schemas/__init__.py +++ b/src/opengeodeweb_viewer/rpc/mesh/edges/schemas/__init__.py @@ -1,6 +1,6 @@ from .width import * from .visibility import * +from .vertex_scalar_range import * from .vertex_attribute import * from .size import * from .color import * -from .vertex_scalar_range import * diff --git a/src/opengeodeweb_viewer/rpc/mesh/edges/schemas/vertex_scalar_range.py b/src/opengeodeweb_viewer/rpc/mesh/edges/schemas/vertex_scalar_range.py index ff23bc7..735ba2a 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/edges/schemas/vertex_scalar_range.py +++ b/src/opengeodeweb_viewer/rpc/mesh/edges/schemas/vertex_scalar_range.py @@ -8,5 +8,5 @@ def __post_init__(self) -> None: print(self, flush=True) id: str - minimum: float maximum: float + minimum: float diff --git a/src/opengeodeweb_viewer/rpc/mesh/points/schemas/__init__.py b/src/opengeodeweb_viewer/rpc/mesh/points/schemas/__init__.py index 20a9131..e4c1430 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/points/schemas/__init__.py +++ b/src/opengeodeweb_viewer/rpc/mesh/points/schemas/__init__.py @@ -1,5 +1,5 @@ from .visibility import * +from .vertex_scalar_range import * from .vertex_attribute import * from .size import * from .color import * -from .vertex_scalar_range import * diff --git a/src/opengeodeweb_viewer/rpc/mesh/points/schemas/vertex_scalar_range.py b/src/opengeodeweb_viewer/rpc/mesh/points/schemas/vertex_scalar_range.py index ff23bc7..735ba2a 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/points/schemas/vertex_scalar_range.py +++ b/src/opengeodeweb_viewer/rpc/mesh/points/schemas/vertex_scalar_range.py @@ -8,5 +8,5 @@ def __post_init__(self) -> None: print(self, flush=True) id: str - minimum: float maximum: float + minimum: float diff --git a/src/opengeodeweb_viewer/rpc/mesh/polygons/schemas/__init__.py b/src/opengeodeweb_viewer/rpc/mesh/polygons/schemas/__init__.py index cade099..ea22f65 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/polygons/schemas/__init__.py +++ b/src/opengeodeweb_viewer/rpc/mesh/polygons/schemas/__init__.py @@ -1,6 +1,6 @@ from .visibility import * +from .vertex_scalar_range import * from .vertex_attribute import * +from .polygon_scalar_range import * from .polygon_attribute import * from .color import * -from .vertex_scalar_range import * -from .polygon_scalar_range import * diff --git a/src/opengeodeweb_viewer/rpc/mesh/polygons/schemas/polygon_scalar_range.py b/src/opengeodeweb_viewer/rpc/mesh/polygons/schemas/polygon_scalar_range.py index be4ea98..c90a148 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/polygons/schemas/polygon_scalar_range.py +++ b/src/opengeodeweb_viewer/rpc/mesh/polygons/schemas/polygon_scalar_range.py @@ -8,5 +8,5 @@ def __post_init__(self) -> None: print(self, flush=True) id: str - minimum: float maximum: float + minimum: float diff --git a/src/opengeodeweb_viewer/rpc/mesh/polygons/schemas/vertex_scalar_range.py b/src/opengeodeweb_viewer/rpc/mesh/polygons/schemas/vertex_scalar_range.py index ff23bc7..735ba2a 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/polygons/schemas/vertex_scalar_range.py +++ b/src/opengeodeweb_viewer/rpc/mesh/polygons/schemas/vertex_scalar_range.py @@ -8,5 +8,5 @@ def __post_init__(self) -> None: print(self, flush=True) id: str - minimum: float maximum: float + minimum: float diff --git a/src/opengeodeweb_viewer/rpc/mesh/polyhedra/schemas/__init__.py b/src/opengeodeweb_viewer/rpc/mesh/polyhedra/schemas/__init__.py index 1bdf557..1654103 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/polyhedra/schemas/__init__.py +++ b/src/opengeodeweb_viewer/rpc/mesh/polyhedra/schemas/__init__.py @@ -1,6 +1,6 @@ from .visibility import * +from .vertex_scalar_range import * from .vertex_attribute import * +from .polyhedron_scalar_range import * from .polyhedron_attribute import * from .color import * -from .vertex_scalar_range import * -from .polyhedron_scalar_range import * diff --git a/src/opengeodeweb_viewer/rpc/mesh/polyhedra/schemas/polyhedron_scalar_range.py b/src/opengeodeweb_viewer/rpc/mesh/polyhedra/schemas/polyhedron_scalar_range.py index 08a5264..16b8dae 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/polyhedra/schemas/polyhedron_scalar_range.py +++ b/src/opengeodeweb_viewer/rpc/mesh/polyhedra/schemas/polyhedron_scalar_range.py @@ -8,5 +8,5 @@ def __post_init__(self) -> None: print(self, flush=True) id: str - minimum: float maximum: float + minimum: float diff --git a/src/opengeodeweb_viewer/rpc/mesh/polyhedra/schemas/vertex_scalar_range.py b/src/opengeodeweb_viewer/rpc/mesh/polyhedra/schemas/vertex_scalar_range.py index ff23bc7..735ba2a 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/polyhedra/schemas/vertex_scalar_range.py +++ b/src/opengeodeweb_viewer/rpc/mesh/polyhedra/schemas/vertex_scalar_range.py @@ -8,5 +8,5 @@ def __post_init__(self) -> None: print(self, flush=True) id: str - minimum: float maximum: float + minimum: float From 509539ace4ac857355d82312f9cbae0007b15244 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Thu, 8 Jan 2026 11:27:54 +0100 Subject: [PATCH 6/7] adding scalar_range tests to attribute tests --- .../rpc/mesh/cells/cells_protocols.py | 4 +-- .../rpc/mesh/edges/mesh_edges_protocols.py | 12 ++++++++- .../rpc/mesh/mesh_protocols.py | 14 +--------- .../rpc/mesh/points/mesh_points_protocols.py | 2 +- .../rpc/mesh/polygons/polygons_protocols.py | 4 +-- .../rpc/mesh/polyhedra/polyhedra_protocols.py | 4 +-- .../images/mesh/cells/cell_scalar_range.jpeg | Bin 0 -> 27289 bytes .../mesh/cells/vertex_scalar_range.jpeg | Bin 0 -> 3951 bytes .../images/mesh/edges/vertex_attribute.jpeg | Bin 0 -> 13360 bytes .../mesh/edges/vertex_scalar_range.jpeg | Bin 0 -> 11166 bytes .../images/mesh/points/vertex_attribute.jpeg | Bin 0 -> 13360 bytes .../mesh/points/vertex_scalar_range.jpeg | Bin 0 -> 11166 bytes ...r_range.jpeg => polygon_scalar_range.jpeg} | Bin .../mesh/polygons/vertex_scalar_range.jpeg | Bin 0 -> 11166 bytes .../polyhedra/polyhedron_scalar_range.jpeg | Bin 0 -> 6134 bytes .../mesh/polyhedra/vertex_scalar_range.jpeg | Bin 0 -> 11079 bytes tests/mesh/cells/test_mesh_cells_protocols.py | 14 ++++++++++ tests/mesh/edges/test_mesh_edges_protocols.py | 21 +++++++++++++++ .../mesh/points/test_mesh_points_protocols.py | 21 +++++++++++++++ .../polygons/test_mesh_polygons_protocols.py | 25 +++++------------- .../test_mesh_polyhedra_protocols.py | 18 +++++++++++++ 21 files changed, 100 insertions(+), 39 deletions(-) create mode 100644 tests/data/images/mesh/cells/cell_scalar_range.jpeg create mode 100644 tests/data/images/mesh/cells/vertex_scalar_range.jpeg create mode 100644 tests/data/images/mesh/edges/vertex_attribute.jpeg create mode 100644 tests/data/images/mesh/edges/vertex_scalar_range.jpeg create mode 100644 tests/data/images/mesh/points/vertex_attribute.jpeg create mode 100644 tests/data/images/mesh/points/vertex_scalar_range.jpeg rename tests/data/images/mesh/polygons/{scalar_range.jpeg => polygon_scalar_range.jpeg} (100%) create mode 100644 tests/data/images/mesh/polygons/vertex_scalar_range.jpeg create mode 100644 tests/data/images/mesh/polyhedra/polyhedron_scalar_range.jpeg create mode 100644 tests/data/images/mesh/polyhedra/vertex_scalar_range.jpeg diff --git a/src/opengeodeweb_viewer/rpc/mesh/cells/cells_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/cells/cells_protocols.py index c402143..b2954c2 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/cells/cells_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/cells/cells_protocols.py @@ -74,7 +74,7 @@ def setMeshCellsVertexScalarRange(self, rpc_params: RpcParams) -> None: self.mesh_cells_prefix, ) params = schemas.VertexScalarRange.from_dict(rpc_params) - self.displayScalarRangeOnVertices(params.id, params.minimum, params.maximum) + self.displayScalarRange(params.id, params.minimum, params.maximum) @exportRpc(mesh_cells_prefix + mesh_cells_schemas_dict["cell_scalar_range"]["rpc"]) def setMeshCellsCellScalarRange(self, rpc_params: RpcParams) -> None: @@ -84,4 +84,4 @@ def setMeshCellsCellScalarRange(self, rpc_params: RpcParams) -> None: self.mesh_cells_prefix, ) params = schemas.CellScalarRange.from_dict(rpc_params) - self.displayScalarRangeOnCells(params.id, params.minimum, params.maximum) + self.displayScalarRange(params.id, params.minimum, params.maximum) diff --git a/src/opengeodeweb_viewer/rpc/mesh/edges/mesh_edges_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/edges/mesh_edges_protocols.py index b5e143d..7b23a9e 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/edges/mesh_edges_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/edges/mesh_edges_protocols.py @@ -50,6 +50,16 @@ def setMeshEdgesWidth(self, rpc_params: RpcParams) -> None: params = schemas.Width.from_dict(rpc_params) self.SetEdgesWidth(params.id, params.width) + @exportRpc(mesh_edges_prefix + mesh_edges_schemas_dict["vertex_attribute"]["rpc"]) + def setMeshEdgesVertexAttribute(self, rpc_params: RpcParams) -> None: + validate_schema( + rpc_params, + self.mesh_edges_schemas_dict["vertex_attribute"], + self.mesh_edges_prefix, + ) + params = schemas.VertexAttribute.from_dict(rpc_params) + self.displayAttributeOnVertices(params.id, params.name) + @exportRpc( mesh_edges_prefix + mesh_edges_schemas_dict["vertex_scalar_range"]["rpc"] ) @@ -60,4 +70,4 @@ def setMeshEdgesVertexScalarRange(self, rpc_params: RpcParams) -> None: self.mesh_edges_prefix, ) params = schemas.VertexScalarRange.from_dict(rpc_params) - self.displayScalarRangeOnVertices(params.id, params.minimum, params.maximum) + self.displayScalarRange(params.id, params.minimum, params.maximum) diff --git a/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py index e8110db..8e4a1c4 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py @@ -147,18 +147,6 @@ def displayAttributeOnCells(self, data_id: str, name: str) -> None: mapper.SetScalarModeToUseCellData() mapper.SetScalarRange(cells.GetScalars().GetRange()) - def displayScalarRangeOnVertices( - self, data_id: str, minimum: float, maximum: float - ) -> None: + def displayScalarRange(self, data_id: str, minimum: float, maximum: float) -> None: mapper = self.get_object(data_id).mapper - mapper.ScalarVisibilityOn() - mapper.SetScalarModeToUsePointData() - mapper.SetScalarRange(minimum, maximum) - - def displayScalarRangeOnCells( - self, data_id: str, minimum: float, maximum: float - ) -> None: - mapper = self.get_object(data_id).mapper - mapper.ScalarVisibilityOn() - mapper.SetScalarModeToUseCellData() mapper.SetScalarRange(minimum, maximum) diff --git a/src/opengeodeweb_viewer/rpc/mesh/points/mesh_points_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/points/mesh_points_protocols.py index 9ed8c45..bbd3f54 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/points/mesh_points_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/points/mesh_points_protocols.py @@ -70,4 +70,4 @@ def setMeshPointsVertexScalarRange(self, rpc_params: RpcParams) -> None: self.mesh_points_prefix, ) params = schemas.VertexScalarRange.from_dict(rpc_params) - self.displayScalarRangeOnVertices(params.id, params.minimum, params.maximum) + self.displayScalarRange(params.id, params.minimum, params.maximum) diff --git a/src/opengeodeweb_viewer/rpc/mesh/polygons/polygons_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/polygons/polygons_protocols.py index 3bfff46..77128a9 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/polygons/polygons_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/polygons/polygons_protocols.py @@ -78,7 +78,7 @@ def setMeshPolygonsVertexScalarRange(self, rpc_params: RpcParams) -> None: self.mesh_polygons_prefix, ) params = schemas.VertexScalarRange.from_dict(rpc_params) - self.displayScalarRangeOnVertices(params.id, params.minimum, params.maximum) + self.displayScalarRange(params.id, params.minimum, params.maximum) @exportRpc( mesh_polygons_prefix + mesh_polygons_schemas_dict["polygon_scalar_range"]["rpc"] @@ -90,4 +90,4 @@ def setMeshPolygonsPolygonScalarRange(self, rpc_params: RpcParams) -> None: self.mesh_polygons_prefix, ) params = schemas.PolygonScalarRange.from_dict(rpc_params) - self.displayScalarRangeOnCells(params.id, params.minimum, params.maximum) + self.displayScalarRange(params.id, params.minimum, params.maximum) diff --git a/src/opengeodeweb_viewer/rpc/mesh/polyhedra/polyhedra_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/polyhedra/polyhedra_protocols.py index b121ca8..88456db 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/polyhedra/polyhedra_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/polyhedra/polyhedra_protocols.py @@ -80,7 +80,7 @@ def setMeshPolyhedraVertexScalarRange(self, rpc_params: RpcParams) -> None: self.mesh_polyhedra_prefix, ) params = schemas.VertexScalarRange.from_dict(rpc_params) - self.displayScalarRangeOnVertices(params.id, params.minimum, params.maximum) + self.displayScalarRange(params.id, params.minimum, params.maximum) @exportRpc( mesh_polyhedra_prefix @@ -93,4 +93,4 @@ def setMeshPolyhedraPolyhedronScalarRange(self, rpc_params: RpcParams) -> None: self.mesh_polyhedra_prefix, ) params = schemas.PolyhedronScalarRange.from_dict(rpc_params) - self.displayScalarRangeOnCells(params.id, params.minimum, params.maximum) + self.displayScalarRange(params.id, params.minimum, params.maximum) diff --git a/tests/data/images/mesh/cells/cell_scalar_range.jpeg b/tests/data/images/mesh/cells/cell_scalar_range.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..d8107c964e05321e29417a3973c3be27876e922d GIT binary patch literal 27289 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 literal 0 HcmV?d00001 diff --git a/tests/data/images/mesh/cells/vertex_scalar_range.jpeg b/tests/data/images/mesh/cells/vertex_scalar_range.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..f041a04b0a7ed7afc71f8999d3a39f8dbc65c5c6 GIT binary patch literal 3951 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 U&*yR3g05Bm;QRqN+Wc7gf2Xy?^#A|> literal 0 HcmV?d00001 diff --git a/tests/data/images/mesh/edges/vertex_scalar_range.jpeg b/tests/data/images/mesh/edges/vertex_scalar_range.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..7d33fd37806b6c3d70ee875e8a4493cd5d11129c GIT binary patch literal 11166 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 YFOX+JePMJnTBuRhq1*Yu^Ro2+0A+@TRsaA1 literal 0 HcmV?d00001 diff --git a/tests/data/images/mesh/points/vertex_attribute.jpeg b/tests/data/images/mesh/points/vertex_attribute.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..7ffedaa875ab563b62ed77470926f04cf6d1a143 GIT binary patch literal 13360 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 U&*yR3g05Bm;QRqN+Wc7gf2Xy?^#A|> literal 0 HcmV?d00001 diff --git a/tests/data/images/mesh/points/vertex_scalar_range.jpeg b/tests/data/images/mesh/points/vertex_scalar_range.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..7d33fd37806b6c3d70ee875e8a4493cd5d11129c GIT binary patch literal 11166 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 YFOX+JePMJnTBuRhq1*Yu^Ro2+0A+@TRsaA1 literal 0 HcmV?d00001 diff --git a/tests/data/images/mesh/polygons/scalar_range.jpeg b/tests/data/images/mesh/polygons/polygon_scalar_range.jpeg similarity index 100% rename from tests/data/images/mesh/polygons/scalar_range.jpeg rename to tests/data/images/mesh/polygons/polygon_scalar_range.jpeg diff --git a/tests/data/images/mesh/polygons/vertex_scalar_range.jpeg b/tests/data/images/mesh/polygons/vertex_scalar_range.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..7d33fd37806b6c3d70ee875e8a4493cd5d11129c GIT binary patch literal 11166 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 YFOX+JePMJnTBuRhq1*Yu^Ro2+0A+@TRsaA1 literal 0 HcmV?d00001 diff --git a/tests/data/images/mesh/polyhedra/polyhedron_scalar_range.jpeg b/tests/data/images/mesh/polyhedra/polyhedron_scalar_range.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..429eee81cb596f7c0cfd48a21952424d9e86ef3c GIT binary patch literal 6134 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 BoY(*W literal 0 HcmV?d00001 diff --git a/tests/data/images/mesh/polyhedra/vertex_scalar_range.jpeg b/tests/data/images/mesh/polyhedra/vertex_scalar_range.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..e723ec0f5710bfbcbd8d0ccfae70cfe9d6bafdd8 GIT binary patch literal 11079 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 literal 0 HcmV?d00001 diff --git a/tests/mesh/cells/test_mesh_cells_protocols.py b/tests/mesh/cells/test_mesh_cells_protocols.py index d38bbd3..8782ecc 100644 --- a/tests/mesh/cells/test_mesh_cells_protocols.py +++ b/tests/mesh/cells/test_mesh_cells_protocols.py @@ -65,6 +65,13 @@ def test_cells_vertex_attribute( ) assert server.compare_image("mesh/cells/vertex_attribute.jpeg") == True + server.call( + VtkMeshCellsView.mesh_cells_prefix + + VtkMeshCellsView.mesh_cells_schemas_dict["vertex_scalar_range"]["rpc"], + [{"id": id, "minimum": 0, "maximum": 10}], + ) + assert server.compare_image("mesh/cells/vertex_scalar_range.jpeg") == True + def test_cells_cell_attribute( server: ServerMonitor, dataset_factory: Callable[..., str] @@ -78,3 +85,10 @@ def test_cells_cell_attribute( [{"id": id, "name": "RGB_data"}], ) assert server.compare_image("mesh/cells/cell_attribute.jpeg") == True + + server.call( + VtkMeshCellsView.mesh_cells_prefix + + VtkMeshCellsView.mesh_cells_schemas_dict["cell_scalar_range"]["rpc"], + [{"id": id, "minimum": 0, "maximum": 10}], + ) + assert server.compare_image("mesh/cells/cell_scalar_range.jpeg") == True diff --git a/tests/mesh/edges/test_mesh_edges_protocols.py b/tests/mesh/edges/test_mesh_edges_protocols.py index 114c992..abd2aa5 100644 --- a/tests/mesh/edges/test_mesh_edges_protocols.py +++ b/tests/mesh/edges/test_mesh_edges_protocols.py @@ -60,3 +60,24 @@ def test_edges_with_edged_curve( [{"id": "123456789", "visibility": False}], ) assert server.compare_image("mesh/edges/edged_curve_visibility.jpeg") == True + + +def test_edges_vertex_attribute( + server: ServerMonitor, dataset_factory: Callable[..., str] +) -> None: + mesh_id = "123456789" + test_register_mesh(server, dataset_factory) + + server.call( + VtkMeshEdgesView.mesh_edges_prefix + + VtkMeshEdgesView.mesh_edges_schemas_dict["vertex_attribute"]["rpc"], + [{"id": mesh_id, "name": "lambert2SG"}], + ) + assert server.compare_image("mesh/edges/vertex_attribute.jpeg") == True + + server.call( + VtkMeshEdgesView.mesh_edges_prefix + + VtkMeshEdgesView.mesh_edges_schemas_dict["vertex_scalar_range"]["rpc"], + [{"id": mesh_id, "minimum": 0, "maximum": 10}], + ) + assert server.compare_image("mesh/edges/vertex_scalar_range.jpeg") == True diff --git a/tests/mesh/points/test_mesh_points_protocols.py b/tests/mesh/points/test_mesh_points_protocols.py index 8cca6ec..cad06de 100644 --- a/tests/mesh/points/test_mesh_points_protocols.py +++ b/tests/mesh/points/test_mesh_points_protocols.py @@ -86,3 +86,24 @@ def test_points_with_point_set( [{"id": mesh_id, "visibility": False}], ) assert server.compare_image("mesh/points/point_set_visibility.jpeg") == True + + +def test_points_vertex_attribute( + server: ServerMonitor, dataset_factory: Callable[..., str] +) -> None: + mesh_id = "123456789" + test_register_mesh(server, dataset_factory) + + server.call( + VtkMeshPointsView.mesh_points_prefix + + VtkMeshPointsView.mesh_points_schemas_dict["vertex_attribute"]["rpc"], + [{"id": mesh_id, "name": "lambert2SG"}], + ) + assert server.compare_image("mesh/points/vertex_attribute.jpeg") == True + + server.call( + VtkMeshPointsView.mesh_points_prefix + + VtkMeshPointsView.mesh_points_schemas_dict["vertex_scalar_range"]["rpc"], + [{"id": mesh_id, "minimum": 0, "maximum": 10}], + ) + assert server.compare_image("mesh/points/vertex_scalar_range.jpeg") == True diff --git a/tests/mesh/polygons/test_mesh_polygons_protocols.py b/tests/mesh/polygons/test_mesh_polygons_protocols.py index d9ac6d7..85e807e 100644 --- a/tests/mesh/polygons/test_mesh_polygons_protocols.py +++ b/tests/mesh/polygons/test_mesh_polygons_protocols.py @@ -51,28 +51,15 @@ def test_polygons_vertex_attribute( ) assert server.compare_image("mesh/polygons/vertex_attribute.jpeg") == True - -def test_polygons_polygon_attribute( - server: ServerMonitor, dataset_factory: Callable[..., str] -) -> None: - - dataset_factory(id="123456789", viewable_file="triangulated_surface2d.vtp") - - server.call( - VtkMeshView.mesh_prefix + VtkMeshView.mesh_schemas_dict["register"]["rpc"], - [{"id": "123456789"}], - ) - assert server.compare_image("mesh/polygons/register.jpeg") == True - server.call( VtkMeshPolygonsView.mesh_polygons_prefix - + VtkMeshPolygonsView.mesh_polygons_schemas_dict["polygon_attribute"]["rpc"], - [{"id": "123456789", "name": "triangle_vertices"}], + + VtkMeshPolygonsView.mesh_polygons_schemas_dict["vertex_scalar_range"]["rpc"], + [{"id": "123456789", "minimum": 0, "maximum": 10}], ) - assert server.compare_image("mesh/polygons/polygon_attribute.jpeg") == True + assert server.compare_image("mesh/polygons/vertex_scalar_range.jpeg") == True -def test_polygons_scalar_range( +def test_polygons_polygon_attribute( server: ServerMonitor, dataset_factory: Callable[..., str] ) -> None: @@ -82,16 +69,18 @@ def test_polygons_scalar_range( VtkMeshView.mesh_prefix + VtkMeshView.mesh_schemas_dict["register"]["rpc"], [{"id": "123456789"}], ) + assert server.compare_image("mesh/polygons/register.jpeg") == True server.call( VtkMeshPolygonsView.mesh_polygons_prefix + VtkMeshPolygonsView.mesh_polygons_schemas_dict["polygon_attribute"]["rpc"], [{"id": "123456789", "name": "triangle_vertices"}], ) + assert server.compare_image("mesh/polygons/polygon_attribute.jpeg") == True server.call( VtkMeshPolygonsView.mesh_polygons_prefix + VtkMeshPolygonsView.mesh_polygons_schemas_dict["polygon_scalar_range"]["rpc"], [{"id": "123456789", "minimum": 0, "maximum": 10}], ) - assert server.compare_image("mesh/polygons/scalar_range.jpeg") == True + assert server.compare_image("mesh/polygons/polygon_scalar_range.jpeg") == True diff --git a/tests/mesh/polyhedra/test_mesh_polyhedra_protocols.py b/tests/mesh/polyhedra/test_mesh_polyhedra_protocols.py index f1cff2c..2245395 100644 --- a/tests/mesh/polyhedra/test_mesh_polyhedra_protocols.py +++ b/tests/mesh/polyhedra/test_mesh_polyhedra_protocols.py @@ -61,6 +61,15 @@ def test_vertex_attribute( ) assert server.compare_image("mesh/polyhedra/vertex_attribute.jpeg") == True + server.call( + VtkMeshPolyhedraView.mesh_polyhedra_prefix + + VtkMeshPolyhedraView.mesh_polyhedra_schemas_dict["vertex_scalar_range"][ + "rpc" + ], + [{"id": "123456789", "minimum": 0, "maximum": 10}], + ) + assert server.compare_image("mesh/polyhedra/vertex_scalar_range.jpeg") == True + def test_polyhedron_attribute( server: ServerMonitor, dataset_factory: Callable[..., str] @@ -75,3 +84,12 @@ def test_polyhedron_attribute( [{"id": "123456789", "name": "toto_on_polyhedra"}], ) assert server.compare_image("mesh/polyhedra/polyhedron_attribute.jpeg") == True + + server.call( + VtkMeshPolyhedraView.mesh_polyhedra_prefix + + VtkMeshPolyhedraView.mesh_polyhedra_schemas_dict["polyhedron_scalar_range"][ + "rpc" + ], + [{"id": "123456789", "minimum": 0, "maximum": 10}], + ) + assert server.compare_image("mesh/polyhedra/polyhedron_scalar_range.jpeg") == True From b97834b8c7e1cbe8c96f237a060e2ec9eb49d088 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Thu, 8 Jan 2026 12:05:25 +0100 Subject: [PATCH 7/7] adding attributed_edged_curve data and adapt tests --- tests/data/attributed_edged_curve.vtp | 22 ++++++++++++++++++ .../images/mesh/edges/vertex_attribute.jpeg | Bin 13360 -> 11571 bytes .../mesh/edges/vertex_scalar_range.jpeg | Bin 11166 -> 10489 bytes tests/mesh/edges/test_mesh_edges_protocols.py | 9 +++++-- 4 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 tests/data/attributed_edged_curve.vtp diff --git a/tests/data/attributed_edged_curve.vtp b/tests/data/attributed_edged_curve.vtp new file mode 100644 index 0000000..7aa04b9 --- /dev/null +++ b/tests/data/attributed_edged_curve.vtp @@ -0,0 +1,22 @@ + + + + + + 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 + 0 0 0 3 0 0 3 3 0 0 3 0 0 0 4 3 0 4 3 3 4 0 3 4 1 1 1 2 1 1 2 2 1 1 2 1 1 1 2 2 1 2 2 2 2 1 2 2 1 1 3 2 1 3 2 2 3 1 2 3 4 1 1 5 1 1 5 2 1 4 2 1 4 1 3 5 1 3 5 2 3 4 2 3 1 1 3.5 1 2 3.5 + + + 0 0 0 3 0 0 3 3 0 0 3 0 0 0 4 3 0 4 3 3 4 0 3 4 1 1 1 2 1 1 2 2 1 1 2 1 1 1 2 2 1 2 2 2 2 1 2 2 1 1 3 2 1 3 2 2 3 1 2 3 4 1 1 5 1 1 5 2 1 4 2 1 4 1 3 5 1 3 5 2 3 4 2 3 1 1 3.5 1 2 3.5 + + + 0 1 1 2 2 3 3 0 0 1 1 5 5 4 4 0 1 2 2 6 6 5 5 1 3 2 2 6 6 7 7 3 4 5 5 6 6 7 7 4 0 3 3 7 7 4 4 0 8 9 9 10 10 11 11 8 12 13 13 14 14 15 15 12 16 17 17 18 18 19 19 16 8 9 9 13 13 12 12 8 12 13 13 17 17 16 16 12 9 10 10 14 14 13 13 9 13 14 14 18 18 17 17 13 11 10 10 14 14 15 15 11 15 14 14 18 18 19 19 15 8 11 11 15 15 12 12 8 12 15 15 19 19 16 16 12 20 21 21 22 22 23 23 20 20 21 21 25 25 24 24 20 21 22 22 26 26 25 25 21 23 22 22 26 26 27 27 23 24 25 25 26 26 27 27 24 20 23 23 27 27 24 24 20 16 19 19 29 29 28 28 16 + 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100 102 104 106 108 110 112 114 116 118 120 122 124 126 128 130 132 134 136 138 140 142 144 146 148 150 152 154 156 158 160 162 164 166 168 170 172 174 176 178 180 182 184 186 188 190 + + + 0 1 1 2 2 3 3 0 0 1 1 5 5 4 4 0 1 2 2 6 6 5 5 1 3 2 2 6 6 7 7 3 4 5 5 6 6 7 7 4 0 3 3 7 7 4 4 0 8 9 9 10 10 11 11 8 12 13 13 14 14 15 15 12 16 17 17 18 18 19 19 16 8 9 9 13 13 12 12 8 12 13 13 17 17 16 16 12 9 10 10 14 14 13 13 9 13 14 14 18 18 17 17 13 11 10 10 14 14 15 15 11 15 14 14 18 18 19 19 15 8 11 11 15 15 12 12 8 12 15 15 19 19 16 16 12 20 21 21 22 22 23 23 20 20 21 21 25 25 24 24 20 21 22 22 26 26 25 25 21 23 22 22 26 26 27 27 23 24 25 25 26 26 27 27 24 20 23 23 27 27 24 24 20 16 19 19 29 29 28 28 16 + 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100 102 104 106 108 110 112 114 116 118 120 122 124 126 128 130 132 134 136 138 140 142 144 146 148 150 152 154 156 158 160 162 164 166 168 170 172 174 176 178 180 182 184 186 188 190 192 + + + + diff --git a/tests/data/images/mesh/edges/vertex_attribute.jpeg b/tests/data/images/mesh/edges/vertex_attribute.jpeg index 7ffedaa875ab563b62ed77470926f04cf6d1a143..99c2caeda8564c18a70221e83218319e4d1f3b7e 100644 GIT binary patch literal 11571 zcmb_?WmH_vvgk0lGq?pG++_&C-CYubdvKQow*Z3$4Nh=(cY+fnxJ%IB?s`eSbM8C; z-g@ue-fMO3o|5U_UD8s|bI-p3SaMRbQUDkj008FY0X#1P#9vzfv+_sC|4hOQ_j4Bj zgapG3!wd^U1ptCzU_mg?Jpi&lodW=2|J45~hzKx9uyF7|WRw>?$;~T+3k|KUHvAys@@1T*wOvY^Jv&n0nFDY z0^Qw9KHuEp2pp$5>U00;&-?Yn6mpNs_7lx5l7*5ERIJOBMMtQ6ixNkmSs&lZ!Rvun zvyQQ@G7AIN$t9r_^QQl>;fJ=RKov~&`|R00i}xews|t8l?B$kpEc>H5B2%{_ocr^> z@L!k2zFAS1M<8w;L)>4D`+c6NoJ>y6a@nDKdvokL9&$kDYY3>8I&g8y2{>bN3|V}; zY%CefX2$<&a?j5FbhYkow-{ll>63oQL2H(qe1Z4)uKRM5&82}`6Lp!HOQnDD2(O1+ zZn2*G2-JI7QRo?PO`AB_~GrE=pc$k$Ceil?^g!>j}_U)u5CXm(d0o2()h{HP?wBxj#7ChcfZR1%gk6)Bt))Of698njQk3N~qE1NE7-eRxG zJ96(vuzb+a1pw>7rRqv?;Ylp!%9<$mjI?8ZFDi9a!f7>Xpo&Hu(fH5ASI`$vDkq>O zp-T@=y|p?i<659KE8t7A>@zBGOtM1IDw07D_|N2_q*b>lno#FxZM(Y7 zGuJ66pO{%y2#uRDb_i^yzuSys(mjurbpA>scf22lXqBJHJkp>Xvcos_5BL90{bEF{ zFBSp^ivSPzVoCoJ`qzl?fmk>cJP<@&c5V?69swscmmfCAi(MhTkiozMpR}!crk3~m z8=XEfZ(-5QcDl!Q4hKF9@XHL)eXm37!AGh-u9AL@WwC13nK8 z#D4P%bjo)^NgiN)OISoImg|TT*~Lf)C`Q|cOgKgVq1a7bH$=TkMvq^Zhf^I5Cm>fg1kQi3J z7S(&UENsdbH5#AEMh04kPAE>%8)u6nL+PbuhTV(9LZULHcDT;)7q1y?5eX))w%0Zg zXD-?lYnE5~m#>8Ou`aZlT5`hPV2WmaY4>+ZoN(+uU0GftHM)C|4e@N5yKgsGb|VXS z=jC>!6WQT*A{et%Td;fW!?f5E7$Gb_$wT|o-IK)q$72-zr`N1@AJ(N-{!*2zEkw!q zko=)C_(L`8>Pg}u_gL=niSIAf(hhgE%s8v!JM(*+a?b1la!xADq;bSy`hd5DV_PF1 zTXD&(X7jCB%Jm#Za!IPqS<+rSeC3?_OP}75zpynf2Txa03tM|Mw2iKjo<)%reg1r zA`Hy|;Tls#NT`NFQIn-&1hLw(i-kyZea8Cc$8SU+-k0|RO~#W>Y7>!*>&~f6O+^U6kGv0)isFJ9I6_IM*e{@aq(5( z!JH5&V{=Dmx8TIA+OC#`2!UiJS*^AK{dG#6@P{JEp8E(3o!Zd*z+j3s$Jj-Q<8Cim7EE z$4?7}(H*FQnrxLcI&~>@mwHiqv2IJY z>mx@g&)<&NlB7r6=KX2)c}@JmnFv{aEK@X0HP@ZQ!$rr%cT^xy<|gN4CNK^V59g@S zD@NGohh!JXMxLylwp-fiUF(^D+bC_^U=5~i&)$$yOe$6>mJdxT#%8->soS!yzf`)B zzpS6FYhTjzTw|Nn(Vyja);x~r(6jZ{JDk>O=Mr?Sd-QB@^|@8JoVga&KU_9wR~K}J zdfi^Uwuaa=L6_}}A=SBUl%go9&J?vU#={IzY<`+Wn3660r0 z9iIA%*c!`&Z<0CWGW-0U8(9g=94vkcoMsIxa;P*N0(P}1Z}_Q;sL zE-Y*oP*ruyzASSLVHs`?oRM#nk$6CECHxM#jDb+O#u?izMNZMTHnH`_T(gmk_P0#$ zqP@0h?z~T)Qq`6TR=S^r99;w5()*> zxbZ;wBVsVm=~Kit>oWk;H-?QjE(2l*3GxQTLbmM$1?ANyslCX9X8@Me znbzTZOq9|mlsJ9*Jhs+?lX@TF@r+x^tIwh?-xky~nT=yZ|^_S%=_>E{M#KP-;R-sgPW9Pod`|Mtx-Q!M46 zS*ztm73op6Az^v*TyhwPE(BaYrHy5G2t=!|<;)tlbfl?C!jyRMVCFoxvIW&^lLARc zk^|O4V=z$a|BR=F>t*JcRMLu6_olW(VdgL9$5MDX#sg!sn>#^UV$1itVn=6AelZj3=DWnor8#$|0&{Y4 zDy)f=dgIW+qlhWy@BCz>`cjo5w7)mJ0^OZsKwYe%7^Xe4cJvGyBOA9^Z4t7NKNBLP ze$wdY9d7Kp5sjqD4$OXtv5e4Flt*p$>=>!IM_EWDaJj&+^_|n2s=P1w=4`#vRi78K zEC`#be}z}aEVR2rx^P`tR%CRoEV4b@7HqpS{E5`iI1iYYQ{Jpx`syK!+*=)wnmY9k z7p&>~QGPI6TEzuESL>WNGj~FrM~dDYMxDn-vl}6h%TI(T&B4D?l1gIOlq%g-qH+>D zv%wQy&B`bMC(>%*_vfX-TmnW`V6jnMlFWvuYrF+}Z9NlCx^!NafH82=qp=H?xuL3_ z@B`ZW=vTSA#8Cr~A@Q+#U@A)qof~Gn#f*;D$bm5ZY=Nx~Z{gjSyv*^gE( z3R2!oIatv$Js+vx=b>;d5Ye@qnTxk=oX^H0B&^IfG?oz)D-MD}!(AIy#TJ`tM}OMk zs?;CZa@8yb;|jKkDvSR^fHQV=WXo2w7+c^cHQL3a)is)+vjcaigos{ai z3J!J2q^gbI1{~rC^3@X(9Dn0W++2cTtj70@?P#=16NIc*gF`}PlL^(^Ut>>f=QZ@b zW3@7|UE@>PFu~O|+QM9sH^HR$InyD$6+e_WA*c5)vN74htYZoF%DT#{o^#jZOY*X% zNxEcUcvQDbWo76?lWEAxQ{40VrbLZY9;VM5=8d855oKTEW$HDZnEHtjvTwL=rkb;k z2&aI|yMmF2Eh+i9YrB_sTaVb(zjxTC@sn5N`t_q;LwWM{j?gZ7N&S_&*DB&N;R`N) zmAC6!>rIQjEx%##QK|35^v&r;U*Qg+S(-|g@i+v1y*Z!2z#sd*LwVecEsXZAp|>if zU@-MDOJ?_jc81y9Q7R{~V@L`Zk=O&dL5F(-$7UP}S*VIeQr?)HL9ob{+Vb(6_uA9P zv$#0r3wk|TqPbvBHSFFnS~-ktEkf5#JbfA#!i3fK#c{23J?W*~OShGjic~AI-_#{F zrLEsf>}xkz!9U8H;pVd$^}mK?W9z3(YSrEn$*yZ>RGiwF7dg2-3dK!)Id|77=qlXG zy@;Pkzg1NK5Y}K2WeWdQTNtS`En-6ntMsGOdr>M4koPb>RNfA-nf(lKYk5$sSUlJk zHT?$D$UTeYC)4XbTHb(_x6{CUpSYz2mXvoF;&P^8VBCm$lhd*w=GyIYVWUY~Jz(Mx zI`#eo%r{BRE&x^f9+mkIC3)eotcx$^0Rig9$WScY!W}VLk1r+JL5$%=s_JUlk6H@Z zB~5YFLEHL~n!6$cAE>Eq8X8Lo0u@o|7fn84egZNSFJ7xJs4s80Lf#zeeO@QE3JQ(l zBaK-8tP?ZAGR@F|N<{2*0H6*=Mai~S;@2`2W`N?H>AQ*lmUWjoKO!kl$#bg>&0i}b zVnm^$1?$O#^<+}hKPYldKQTm1lPRqhsNE^i+U-jFX#ac$@J>q~T`LS4j!?&S+XFE_bbQqpko-2$`iV^V!H4(BJDS01aAu?(@P=4~ zqPOF87K5_ed(oe*`TnSlB__V9)+RY$y_jlD(bTkwvR-!*R+`l&IdtYLQdXSUP5l~* z;aj*$&}VENGjiJW9fv#F*5QoEnKYdv+fJUA=r$S_g96QzXt<)EoOn`IO{~;6r1m1l zEL`lU_{n3ons}!tcCS-zZjR)1?fInd$31Nm6YxbUVYLg`OKZ!DI)4YYPzy zzU%1aN^$qcR48x>vi}Q`Oqq&V`e2EtS_|9sb+qTK3 zS<0%IVyqD2fwy5xs;X)$Q>Ww7R3(4abEvhA@Xgj@l`nSgVh`8AdZnku1)J_GrRSvmaPPXgnz$A|kvv6XP{jB@g7H}rYqIfMiKx@Jnvbwu@M3c4W&HvW7=)vwhYaZlKF?h|{vlaf~URsU{AuhaHEwgNSFh%~96nGeDx= zUFGf>kgdaC80kH3n?5DgzEeNCKyBcnV_^%bXlALY51n1cpI?-)J_@%v%yzw&talrK zbDzD){~`SkL#@(Z2D-ltIDZ+!{xHl-TCap#zC8dJ4LXUl6Y;@OZTWY{zXQ3D(Ep}2 zRilsLALyeke=~KFhR{S- zQ3fQ>o_@surqps6?KeipKL~4Mhnf`%Q7s38o&lcKr-1BjDu$prZFNadkaHs0Zp|hMptQ~(qfw{|@!il_8XtJ%QrW>pqT^`gBaF>%-<@`R zMf0o66H9}Vlt*XKl!)|Ie+%10U~UCP8t@>;mD4VD)&B=lW?e(L`V?>T3iDG|+svuO zCHhfAxNxDpYpeF7xM$h=&pnc5dwgGwm3@zzyZmdN-puL0#6@j0CzyND%_}gEs@LxT zID+fEh*rXa#U2+u@JK=h)s=(G9)87(RJmcDeajqLiTa{W#J|u|f`RcUFxv^{e}*>U zaG>8}>X=y2O(M+%f#5(gdkACr5H<{HDULCKtG|M40-SY(e;=mde42haNw$3kq|Q_{ z-P=FR)O!D1^v$o!Ir3S2?jRLNOnjVzk*A=@rpdA1SU$yidM}Q z6dl?G2aCz}Np=rz#oWqj)p9pf&gCk^etUnlFLv`3 zuR7ze5S3}&C)J+}?=>v-Hhi|wY};mWIC|+6=16VS#Z_7szg9Do>S>{^9RLJ62H1rz z4(j^G7Hl=d@;w764TkKgU9Vhy!L4Dd^D_^LX9St%I%n_T-S)GAyny1^Fu&+Api}V1 zl2tl-+Ldi?KgxHfkIPBZYi4B9^ks^wv=utc#xbT{#PN;cdCjq#^hsT6#p3=7MjUpa z_UQq#)B=KAUM(sK4eufOY7jSPOFVu~{kB$(x#3Vb& zb}L`~2Hk`u3@{z_nQI)NFkT_~8ZWXc;x`w$I6hvA-H0S;L`^@hzG8i>Il#=CcpI># z#m5RjE%r3UWUQxqoD0nnrc{M{iVZ$J$v3!Qg209 z@w?-#Rm|#OP-ra;BX%V8az)b!Mw%q!PFfhUDy28{ zf%m0^dGV}=Yrz{UtzXcD*)LbvO5Ir~a%Sybk%F_?!-M1BVnAxLZC($*21xMtHu6WR zXHEKy)P7x)5mM%>A;{w)_%)T@T(*0U*<*E>OMuqrG{qvhvtcLKZTV_EFN7Y4`dx$>8LZ0c%(u`?jaL8L2G;hE5rKn z8p45UZhLK)uA_z_)t$;ulmEG^kWkp5;WJ?J^6KATMebx-c)-eTL;XX<&l+2r8!7V8qgHTS>9f0P>V!152(XK*3uKB3dn7c3WO92TBLjz`&w!~#-gj1jXF$Bpzo0gckTUln zhWOPN3CeqQz*PwGmtW#`Zu!`xDEy6zD-EV(xRHwx`7&xk@On}e!>AM3yB9B!Jx!q{ z?lTV}GAt080;LA`qK_R#X zgFXZz^7ybM+4bs6kO=|l*)NhFEvt3G3;FQ=E(RiQz5!ZV-OL(JrDfVXGi*Mm=1mDh zOU+)Y(xP}qvF2PnEo_*|ElrTBd{vqw(xO-1%ZH5r%42($_zX}|)18i|Gc}Eh-Gp1B zDC3bST%MpPwl;l5;Q~*Gw52L5Dyx>1EHU6&g_TXd_zR<||EUE(th`9O`4%_m(PuBV`GhX}tMVrp$;v}{OGcCcprveHMu133M9%t{X$E`vl#77tv zag(mRbE6A-9XZ>kL-Ol32Car9i^(`JxeG6}4Cb#y@dt_2qjr{med%}uO|zqt#o|>e z{>*5~vd!TK9IDoqG)Oi}WzI?})WDJ$3H|j=jI|jRHT-UKuBQ-0(WNS@DYBR$OIJ$# zz`62&!21W*Kdt{OVEBjRKLF#3G(%~M7vlgk+UBvO#`G$F&iW|Au^W5Cb<14f)0)*Z zED{Miix8O4zAM`T{|8NxeWOEhOlX$#9eEf^0WeD_ZD(U&WL<@VNTZ3y1Qb3qkK7sx# ztLoz_eS0CM9-Oka&JXWAM6q3U#Nf6P9LKDAob@6hym;68V(4H_;PLc_WQCm~)i#5A1kXMaDz$so%Nzq-AZi{{G?J(J?X+5{aKlC_5BnoL98X@Y-UFH{J$jP8&NozBC#DH`JSJ zyqW&Bk=hSe0?dhw-1E)wdmswLX1==4Oa>s%=+{JaUep(p#t}ObYxp{%TW)iY*sW3B#Sn(@bbCExxP3V)4{`2Ea2GM|GcyN3xeNH1NIm zUna6)6wq?d#x=@Tqrs&R3#Z}*Rr49Sd_o=ps1Bf3)S){{Pk9H|9BL`dR5z_BA)s~+ z8~BZWq^F5u?IN4Ulk%%(wvw)?1I-IgU7>|ga`VbzpCExM6ykr$2mw{zdyy{bL$2>S z+Yl0oLaip@90v^8=yVG=DKNV|s_;8C@W1PFE`RGNvXkPWh-2(Bf=Sot$IZc|70u?* z_#pWM^<5NjS0-v~_o|PD-J}gRv5xiq9eaqIU(?v_>H0NG#of_|1H|9`k@HlvpMHZa z)9Nl%F?Itz3(nViuik3^UV2urJ&P9%^17)C zIU@L}zBMntGsd5f{uJ^v+>byfs{|t{yJ|uS^p^KTk)r17W;}U+&ZJ-weJdZIAbmCM z2g>Nkm|78qU%xtZ>rd3sq@)b_oC@)X?tkj%N~kiDqa9R}=UAq=3T66yWonZ+&^`yl zRr5f4IsHmYI-&G)n%n_DXJeVQjmm|$G}FDk4zp$M^&(>IP8KNr{K~2goc;`=Hzs7c=KIux;UV%-F$}n)jM}M!0zlTRgmKk{ zw(>Jn;pncvYZlZbWyGG8h(9(oxlF8Or?1wF_Qga-|7q^@IzYhU`}v6#5`sdLq*OqF zkQ1133m#9~14DkW_}FJmzd!)y0jlbF>XSiURr8|pe{(+ourG%3vfKRsE?sEYV)UH< zV#kB&WA7B@HvFfF2axeYL#s;rrv(E*gOO(b^H)7Il`n}kK$rnqIAjs&4|k;ifCj*? z5JnW10tO9G3;=)t>;Rrvkqh`0q(%_{JOJsB1ipX704NaIv6RsqMgD2R$8@4~eP^@SXo?x8hwt=YST3~y2sk}tnQ_Y1pHIGezkAVNQekA>!hS5 zh`+CW!J`NjNG^mhvfF3|%=sY1*h+*O7LfI4P94gzFwj>;iesa&drHa6SZue@MZN+< zSGZN^i2;hVW^+v|L82gRiN>gb(^qI);#QRq8v0aO55+QBI|HypgK)}5vIZyt;1K!6 zX8rOl;0!;FTfKlwY_(;PzZGiH(@+Bb<0XjqO~NXQI8 z2><}tko*kjmZAVdkmamw9 z_&}$U6K#e?L!}XZk~I|flQQ6Ncx-p+8hZmpk_o|oAHa=dX_56w>Nr_~3uKte0i-=` z6|$P4V?^)1#n3m1dRtT^Kd4qKViY48&)eJ$AVek~<48XFkStVTcDj#qqW26?t~KRr z=8WG{;^aZHYm2wIxJb9TyM%6BT%^4vFUTDtw84^Rg0qtGnOWr(Wc5hk34`i8#ZWWh z_nGx%rJ?NJ=>lA^JWMxK1+Q)%Mo>c#5s$QlLSnQ%E)IQ`S zkNlDsbvwbL?EJ9Y+gn(9sm@lDS0WM_()Qo5!NlwW2F`DO;q5rPz&3kQhTOO?Vp%Fgi{&8% zzDH-Il_(_(2pv-y!R~91$;ihPtffV+q}{;O83e`RCgw~v6zB@dk5WVCTa4#v@M*p& za=|eqt6GbStL^)$g%t#!sTw2s!^J#s=?pq>&9(^5S$Lvp+b#BD7fth^t?(k*Nr=Wv zP%+3u!tddxcBR%$G+d0jJfNm8x#^D%cL4mH+MxMH7W6qQ9O2}VOxlKEkH10<4k5;Z%b*41CAJD&K>_R;_9R%e)@ zZeU4WmI+P{msgDF{^efy-)kWlL|FKjY{38aXcUw$4$UzJi``$usA~Kq>-(DDf3JnG zo&kx*DJJk~{^RlzJeLPaoZIMhl_D_Ka%%nj)-z1+=e7^|0RS}Tt8}b{!fS`=z)abo zGlAj}6MW;^*{H%j;+X?HLXlVGqETwZ=J}sCWiEmmNWwF|9Q*No@o)v``$BkqT!6%d zu*UgKZ?R76~XK1+yOC`vI@bo%*&lD5*ADKuP z5`j5?6Nyq3<7sMYT1-&1C4H=VOI(1s!lQQAkn0sq)w{gc>b<>1K3AHLari>MQhh^;I(PL^6SyK zF7aK-arAt?vw1CO5ZzJIG~Oh-PWfm47o&gA$^8)X!+Q+x#!M?aTC z^y&I8Qbh-ZGk=@)t#5xnit~RG($gG_?Yk9XM4T#3R8T70O6l#JXub@I_*~Z|uezNY z9G)ZJ(xc5**Q9(UywV-HH3D6wgDukCS$gDweK{*8^=78m!;T}nduq!%Hv`Jl2;))HF|;r4teY*kZ>kSJeU~`K#%VQkGQ@S2der`;TSeC2Er^KbU}|j~KMIQcFdix{+4JaJonp2)Bn)^*8IssyxV-QhDKp1-n}ECSDnS7e{}of#L$*-ARs(w*z{ zZ8cn`KNJ9?3D8Qyw+1M&s4_giBp>S7BPk0-dksPMRGfjfVIjL@t7JBNyMAocDAHTLRv}MU&q?aZEI?F7>@!t;YG6;k67TCw!65Y6&`TH3v_VbHqU-0Cd(f|Me literal 13360 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 U&*yR3g05Bm;QRqN+Wc7gf2Xy?^#A|> diff --git a/tests/data/images/mesh/edges/vertex_scalar_range.jpeg b/tests/data/images/mesh/edges/vertex_scalar_range.jpeg index 7d33fd37806b6c3d70ee875e8a4493cd5d11129c..aac849a205eca61ec3635b3839410a34b39e7a55 100644 GIT binary patch literal 10489 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 literal 11166 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 YFOX+JePMJnTBuRhq1*Yu^Ro2+0A+@TRsaA1 diff --git a/tests/mesh/edges/test_mesh_edges_protocols.py b/tests/mesh/edges/test_mesh_edges_protocols.py index abd2aa5..b60d917 100644 --- a/tests/mesh/edges/test_mesh_edges_protocols.py +++ b/tests/mesh/edges/test_mesh_edges_protocols.py @@ -66,12 +66,17 @@ def test_edges_vertex_attribute( server: ServerMonitor, dataset_factory: Callable[..., str] ) -> None: mesh_id = "123456789" - test_register_mesh(server, dataset_factory) + dataset_factory(id=mesh_id, viewable_file="attributed_edged_curve.vtp") + + server.call( + VtkMeshView.mesh_prefix + VtkMeshView.mesh_schemas_dict["register"]["rpc"], + [{"id": mesh_id}], + ) server.call( VtkMeshEdgesView.mesh_edges_prefix + VtkMeshEdgesView.mesh_edges_schemas_dict["vertex_attribute"]["rpc"], - [{"id": mesh_id, "name": "lambert2SG"}], + [{"id": mesh_id, "name": "vertex_attribute"}], ) assert server.compare_image("mesh/edges/vertex_attribute.jpeg") == True