From 5e71dfa92ffc0cb80c485bbdff938bcf1ded7baa Mon Sep 17 00:00:00 2001 From: JulienChampagnol Date: Mon, 2 Feb 2026 15:15:47 +0100 Subject: [PATCH 1/8] fix(GeodeClasses): literal viewer_elements_type --- src/opengeodeweb_back/geode_objects/geode_graph.py | 6 +++++- src/opengeodeweb_back/geode_objects/geode_grid2d.py | 5 +++++ src/opengeodeweb_back/geode_objects/geode_grid3d.py | 5 +++++ src/opengeodeweb_back/geode_objects/geode_model.py | 6 +++++- src/opengeodeweb_back/geode_objects/geode_object.py | 6 +++++- src/opengeodeweb_back/geode_objects/geode_solid_mesh3d.py | 5 +++++ src/opengeodeweb_back/geode_objects/geode_surface_mesh2d.py | 5 +++++ src/opengeodeweb_back/geode_objects/geode_surface_mesh3d.py | 5 +++++ src/opengeodeweb_back/geode_objects/geode_vertex_set.py | 6 +++++- src/opengeodeweb_back/geode_objects/types.py | 2 ++ src/opengeodeweb_back/utils_functions.py | 2 ++ tests/test_routes.py | 6 ++++++ tests/test_utils_functions.py | 2 ++ 13 files changed, 57 insertions(+), 4 deletions(-) diff --git a/src/opengeodeweb_back/geode_objects/geode_graph.py b/src/opengeodeweb_back/geode_objects/geode_graph.py index 15f6e67a..364837c3 100644 --- a/src/opengeodeweb_back/geode_objects/geode_graph.py +++ b/src/opengeodeweb_back/geode_objects/geode_graph.py @@ -5,7 +5,7 @@ import opengeode as og # Local application imports -from .types import GeodeMeshType +from .types import GeodeMeshType, ViewerElementsType from .geode_vertex_set import GeodeVertexSet @@ -19,6 +19,10 @@ def __init__(self, graph: og.Graph | None = None) -> None: @classmethod def geode_object_type(cls) -> GeodeMeshType: return "Graph" + + @classmethod + def viewer_elements_type(cls) -> ViewerElementsType: + return "edges" def native_extension(self) -> str: return self.graph.native_extension() diff --git a/src/opengeodeweb_back/geode_objects/geode_grid2d.py b/src/opengeodeweb_back/geode_objects/geode_grid2d.py index f7d592ea..61134d67 100644 --- a/src/opengeodeweb_back/geode_objects/geode_grid2d.py +++ b/src/opengeodeweb_back/geode_objects/geode_grid2d.py @@ -7,6 +7,7 @@ # Local application imports from .geode_mesh import GeodeMesh +from .types import ViewerElementsType class GeodeGrid2D(GeodeMesh): @@ -18,6 +19,10 @@ def is_3D(cls) -> bool: def is_viewable(cls) -> bool: return True + @classmethod + def viewer_elements_type(cls) -> ViewerElementsType: + return "polygons" + def builder(self) -> object: return None diff --git a/src/opengeodeweb_back/geode_objects/geode_grid3d.py b/src/opengeodeweb_back/geode_objects/geode_grid3d.py index 91458c96..757620f2 100644 --- a/src/opengeodeweb_back/geode_objects/geode_grid3d.py +++ b/src/opengeodeweb_back/geode_objects/geode_grid3d.py @@ -7,6 +7,7 @@ # Local application imports from .geode_mesh import GeodeMesh +from .types import ViewerElementsType class GeodeGrid3D(GeodeMesh): @@ -18,6 +19,10 @@ def is_3D(cls) -> bool: def is_viewable(cls) -> bool: return True + @classmethod + def viewer_elements_type(cls) -> ViewerElementsType: + return "polyhedra" + def builder(self) -> object: return None diff --git a/src/opengeodeweb_back/geode_objects/geode_model.py b/src/opengeodeweb_back/geode_objects/geode_model.py index 394f0d80..529fa489 100644 --- a/src/opengeodeweb_back/geode_objects/geode_model.py +++ b/src/opengeodeweb_back/geode_objects/geode_model.py @@ -6,7 +6,7 @@ import opengeode as og # Local application imports -from .types import ViewerType +from .types import ViewerType, ViewerElementsType from .geode_object import GeodeObject ComponentRegistry = dict[og.ComponentType, list[og.uuid]] @@ -17,5 +17,9 @@ class GeodeModel(GeodeObject): def viewer_type(cls) -> ViewerType: return "model" + @classmethod + def viewer_elements_type(cls) -> ViewerElementsType: + return "default" + @abstractmethod def mesh_components(self) -> ComponentRegistry: ... diff --git a/src/opengeodeweb_back/geode_objects/geode_object.py b/src/opengeodeweb_back/geode_objects/geode_object.py index 580a846c..1dcd42b6 100644 --- a/src/opengeodeweb_back/geode_objects/geode_object.py +++ b/src/opengeodeweb_back/geode_objects/geode_object.py @@ -7,7 +7,7 @@ import opengeode as og # Local application imports -from .types import GeodeObjectType, ViewerType +from .types import GeodeObjectType, ViewerType, ViewerElementsType class GeodeObject(ABC): @@ -24,6 +24,10 @@ def geode_object_type(cls) -> GeodeObjectType: ... @abstractmethod def viewer_type(cls) -> ViewerType: ... + @classmethod + @abstractmethod + def viewer_elements_type(cls) -> ViewerElementsType: ... + @classmethod @abstractmethod def is_3D(cls) -> bool: ... diff --git a/src/opengeodeweb_back/geode_objects/geode_solid_mesh3d.py b/src/opengeodeweb_back/geode_objects/geode_solid_mesh3d.py index d7112035..2978272a 100644 --- a/src/opengeodeweb_back/geode_objects/geode_solid_mesh3d.py +++ b/src/opengeodeweb_back/geode_objects/geode_solid_mesh3d.py @@ -8,6 +8,7 @@ # Local application imports from .geode_vertex_set import GeodeVertexSet +from .types import ViewerElementsType class GeodeSolidMesh3D(GeodeVertexSet): @@ -25,6 +26,10 @@ def is_3D(cls) -> bool: def is_viewable(cls) -> bool: return True + @classmethod + def viewer_elements_type(cls) -> ViewerElementsType: + return "polyhedra" + def builder(self) -> og.SolidMeshBuilder3D: return og.SolidMeshBuilder3D.create(self.solid_mesh) diff --git a/src/opengeodeweb_back/geode_objects/geode_surface_mesh2d.py b/src/opengeodeweb_back/geode_objects/geode_surface_mesh2d.py index 199846f9..90731cf6 100644 --- a/src/opengeodeweb_back/geode_objects/geode_surface_mesh2d.py +++ b/src/opengeodeweb_back/geode_objects/geode_surface_mesh2d.py @@ -8,6 +8,7 @@ # Local application imports from .geode_vertex_set import GeodeVertexSet +from .types import ViewerElementsType class GeodeSurfaceMesh2D(GeodeVertexSet): @@ -26,6 +27,10 @@ def is_3D(cls) -> bool: @classmethod def is_viewable(cls) -> bool: return True + + @classmethod + def viewer_elements_type(cls) -> ViewerElementsType: + return "polygons" def builder(self) -> og.SurfaceMeshBuilder2D: return og.SurfaceMeshBuilder2D.create(self.surface_mesh) diff --git a/src/opengeodeweb_back/geode_objects/geode_surface_mesh3d.py b/src/opengeodeweb_back/geode_objects/geode_surface_mesh3d.py index 8468c7b0..f84c0854 100644 --- a/src/opengeodeweb_back/geode_objects/geode_surface_mesh3d.py +++ b/src/opengeodeweb_back/geode_objects/geode_surface_mesh3d.py @@ -8,6 +8,7 @@ # Local application imports from .geode_vertex_set import GeodeVertexSet +from .types import ViewerElementsType class GeodeSurfaceMesh3D(GeodeVertexSet): @@ -27,6 +28,10 @@ def is_3D(cls) -> bool: def is_viewable(cls) -> bool: return True + @classmethod + def viewer_elements_type(cls) -> ViewerElementsType: + return "polygons" + def builder(self) -> og.SurfaceMeshBuilder3D: return og.SurfaceMeshBuilder3D.create(self.surface_mesh) diff --git a/src/opengeodeweb_back/geode_objects/geode_vertex_set.py b/src/opengeodeweb_back/geode_objects/geode_vertex_set.py index 98d623ac..d40938c7 100644 --- a/src/opengeodeweb_back/geode_objects/geode_vertex_set.py +++ b/src/opengeodeweb_back/geode_objects/geode_vertex_set.py @@ -5,7 +5,7 @@ import opengeode as og # Local application imports -from .types import GeodeMeshType +from .types import GeodeMeshType, ViewerElementsType from .geode_mesh import GeodeMesh @@ -21,6 +21,10 @@ def __init__(self, vertex_set: og.VertexSet | None = None) -> None: @classmethod def geode_object_type(cls) -> GeodeMeshType: return "VertexSet" + + @classmethod + def viewer_elements_type(cls) -> ViewerElementsType: + return "points" def native_extension(self) -> str: return self.vertex_set.native_extension() diff --git a/src/opengeodeweb_back/geode_objects/types.py b/src/opengeodeweb_back/geode_objects/types.py index 57fbccf6..0faa76be 100644 --- a/src/opengeodeweb_back/geode_objects/types.py +++ b/src/opengeodeweb_back/geode_objects/types.py @@ -73,3 +73,5 @@ def geode_object_type(value: str) -> GeodeObjectType: ViewerType = Literal["mesh", "model"] + +ViewerElementsType = Literal["points", "edges", "polygons", "polyhedra", "default"] diff --git a/src/opengeodeweb_back/utils_functions.py b/src/opengeodeweb_back/utils_functions.py index f6c9d953..6341911f 100644 --- a/src/opengeodeweb_back/utils_functions.py +++ b/src/opengeodeweb_back/utils_functions.py @@ -237,6 +237,7 @@ def generate_native_viewable_and_light_viewable_from_object( data = Data.create( geode_object=geode_object.geode_object_type(), viewer_object=geode_object.viewer_type(), + viewer_elements_type=geode_object.viewer_elements_type(), ) data_path = create_data_folder_from_id(data.id) return save_all_viewables_and_return_info(geode_object, data, data_path) @@ -249,6 +250,7 @@ def generate_native_viewable_and_light_viewable_from_file( data = Data.create( geode_object=geode_object_type, viewer_object=generic_geode_object.viewer_type(), + viewer_elements_type=generic_geode_object.viewer_elements_type(), input_file=input_file, ) diff --git a/tests/test_routes.py b/tests/test_routes.py index d40c68a8..f669f55c 100644 --- a/tests/test_routes.py +++ b/tests/test_routes.py @@ -204,6 +204,7 @@ def test_texture_coordinates(client: FlaskClient, test_id: str) -> None: data = Data.create( geode_object=GeodePolygonalSurface3D.geode_object_type(), viewer_object=GeodePolygonalSurface3D.viewer_type(), + viewer_elements_type=GeodePolygonalSurface3D.viewer_elements_type(), input_file=file, ) data.native_file = file @@ -232,6 +233,7 @@ def test_vertex_attribute_names(client: FlaskClient, test_id: str) -> None: data = Data.create( geode_object=GeodePolygonalSurface3D.geode_object_type(), viewer_object=GeodePolygonalSurface3D.viewer_type(), + viewer_elements_type=GeodePolygonalSurface3D.viewer_elements_type(), input_file=file, ) data.native_file = file @@ -261,6 +263,7 @@ def test_cell_attribute_names(client: FlaskClient, test_id: str) -> None: data = Data.create( geode_object=GeodeRegularGrid2D.geode_object_type(), viewer_object=GeodeRegularGrid2D.viewer_type(), + viewer_elements_type=GeodeRegularGrid2D.viewer_elements_type(), input_file=file, ) data.native_file = file @@ -290,6 +293,7 @@ def test_polygon_attribute_names(client: FlaskClient, test_id: str) -> None: data = Data.create( geode_object=GeodePolygonalSurface3D.geode_object_type(), viewer_object=GeodePolygonalSurface3D.viewer_type(), + viewer_elements_type=GeodePolygonalSurface3D.viewer_elements_type(), input_file=file, ) data.native_file = file @@ -319,6 +323,7 @@ def test_polyhedron_attribute_names(client: FlaskClient, test_id: str) -> None: data = Data.create( geode_object=GeodePolyhedralSolid3D.geode_object_type(), viewer_object=GeodePolyhedralSolid3D.viewer_type(), + viewer_elements_type=GeodePolyhedralSolid3D.viewer_elements_type(), input_file=file, ) data.native_file = file @@ -352,6 +357,7 @@ def test_edge_attribute_names(client: FlaskClient, test_id: str) -> None: data = Data.create( geode_object=GeodeEdgedCurve3D.geode_object_type(), viewer_object=GeodeEdgedCurve3D.viewer_type(), + viewer_elements_type=GeodeEdgedCurve3D.viewer_elements_type(), input_file=file, ) data.native_file = file diff --git a/tests/test_utils_functions.py b/tests/test_utils_functions.py index 5da9bbd5..792f3367 100644 --- a/tests/test_utils_functions.py +++ b/tests/test_utils_functions.py @@ -111,6 +111,7 @@ def test_save_all_viewables_and_return_info(client: FlaskClient) -> None: data_entry = Data.create( geode_object=geode_object.geode_object_type(), viewer_object=geode_object.viewer_type(), + viewer_elements_type=geode_object.viewer_elements_type(), input_file=input_file, additional_files=additional_files, ) @@ -155,6 +156,7 @@ def test_save_all_viewables_commits_to_db(client: FlaskClient) -> None: data_entry = Data.create( geode_object=geode_object.geode_object_type(), viewer_object=geode_object.viewer_type(), + viewer_elements_type=geode_object.viewer_elements_type(), input_file=input_file, additional_files=[], ) From 7708ebbaba2516311d5ba9e11c4d28ad4d9769e4 Mon Sep 17 00:00:00 2001 From: JulienChampagnol <91873154+JulienChampagnol@users.noreply.github.com> Date: Mon, 2 Feb 2026 14:24:26 +0000 Subject: [PATCH 2/8] Apply prepare changes --- requirements.txt | 1 - src/opengeodeweb_back/geode_objects/geode_graph.py | 2 +- src/opengeodeweb_back/geode_objects/geode_surface_mesh2d.py | 2 +- src/opengeodeweb_back/geode_objects/geode_vertex_set.py | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/requirements.txt b/requirements.txt index b150412b..08d64bdf 100644 --- a/requirements.txt +++ b/requirements.txt @@ -60,4 +60,3 @@ werkzeug==3.1.2 # flask # flask-cors -opengeodeweb-microservice==1.*,>=1.0.13 diff --git a/src/opengeodeweb_back/geode_objects/geode_graph.py b/src/opengeodeweb_back/geode_objects/geode_graph.py index 364837c3..35d02e8f 100644 --- a/src/opengeodeweb_back/geode_objects/geode_graph.py +++ b/src/opengeodeweb_back/geode_objects/geode_graph.py @@ -19,7 +19,7 @@ def __init__(self, graph: og.Graph | None = None) -> None: @classmethod def geode_object_type(cls) -> GeodeMeshType: return "Graph" - + @classmethod def viewer_elements_type(cls) -> ViewerElementsType: return "edges" diff --git a/src/opengeodeweb_back/geode_objects/geode_surface_mesh2d.py b/src/opengeodeweb_back/geode_objects/geode_surface_mesh2d.py index 90731cf6..d0b72597 100644 --- a/src/opengeodeweb_back/geode_objects/geode_surface_mesh2d.py +++ b/src/opengeodeweb_back/geode_objects/geode_surface_mesh2d.py @@ -27,7 +27,7 @@ def is_3D(cls) -> bool: @classmethod def is_viewable(cls) -> bool: return True - + @classmethod def viewer_elements_type(cls) -> ViewerElementsType: return "polygons" diff --git a/src/opengeodeweb_back/geode_objects/geode_vertex_set.py b/src/opengeodeweb_back/geode_objects/geode_vertex_set.py index d40938c7..26b3ecd8 100644 --- a/src/opengeodeweb_back/geode_objects/geode_vertex_set.py +++ b/src/opengeodeweb_back/geode_objects/geode_vertex_set.py @@ -21,7 +21,7 @@ def __init__(self, vertex_set: og.VertexSet | None = None) -> None: @classmethod def geode_object_type(cls) -> GeodeMeshType: return "VertexSet" - + @classmethod def viewer_elements_type(cls) -> ViewerElementsType: return "points" From 81d187b52ff25a69049e015755921035a780d756 Mon Sep 17 00:00:00 2001 From: JulienChampagnol Date: Mon, 2 Feb 2026 16:57:10 +0100 Subject: [PATCH 3/8] test --- tests/test_models_routes.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_models_routes.py b/tests/test_models_routes.py index cc555627..e58194aa 100644 --- a/tests/test_models_routes.py +++ b/tests/test_models_routes.py @@ -60,7 +60,7 @@ def test_export_project_route(client: FlaskClient, tmp_path: Path) -> None: data1 = Data( id="test_data_1", geode_object="BRep", - viewer_object="BRep", + viewer_object="model", input_file="test_native.txt", native_file="test_native.txt", additional_files=[], @@ -68,7 +68,7 @@ def test_export_project_route(client: FlaskClient, tmp_path: Path) -> None: data2 = Data( id="test_data_2", geode_object="Section", - viewer_object="Section", + viewer_object="model", input_file="test_input.txt", native_file="test_native2.txt", additional_files=[], From 1bf225cd6112fbb204d20123f7205d7edf6e30cb Mon Sep 17 00:00:00 2001 From: JulienChampagnol Date: Tue, 3 Feb 2026 11:14:56 +0100 Subject: [PATCH 4/8] tests --- tests/test_models_routes.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_models_routes.py b/tests/test_models_routes.py index e58194aa..e18533bf 100644 --- a/tests/test_models_routes.py +++ b/tests/test_models_routes.py @@ -61,6 +61,7 @@ def test_export_project_route(client: FlaskClient, tmp_path: Path) -> None: id="test_data_1", geode_object="BRep", viewer_object="model", + viewer_elements_type="default", input_file="test_native.txt", native_file="test_native.txt", additional_files=[], @@ -69,6 +70,7 @@ def test_export_project_route(client: FlaskClient, tmp_path: Path) -> None: id="test_data_2", geode_object="Section", viewer_object="model", + viewer_elements_type="default", input_file="test_input.txt", native_file="test_native2.txt", additional_files=[], From e52b4b47f503f9e9a9043630960ed1b77a4f7fd7 Mon Sep 17 00:00:00 2001 From: JulienChampagnol Date: Tue, 3 Feb 2026 11:54:18 +0100 Subject: [PATCH 5/8] test fix RasterImages --- src/opengeodeweb_back/geode_objects/geode_raster_image2d.py | 6 +++++- src/opengeodeweb_back/geode_objects/geode_raster_image3d.py | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/opengeodeweb_back/geode_objects/geode_raster_image2d.py b/src/opengeodeweb_back/geode_objects/geode_raster_image2d.py index 846ae7ac..04787605 100644 --- a/src/opengeodeweb_back/geode_objects/geode_raster_image2d.py +++ b/src/opengeodeweb_back/geode_objects/geode_raster_image2d.py @@ -6,7 +6,7 @@ import geode_viewables as viewables # Local application imports -from .types import GeodeMeshType +from .types import GeodeMeshType, ViewerElementsType from .geode_mesh import GeodeMesh @@ -21,6 +21,10 @@ def __init__(self, raster_image: og.RasterImage2D) -> None: def geode_object_type(cls) -> GeodeMeshType: return "RasterImage2D" + @classmethod + def viewer_elements_type(cls) -> ViewerElementsType: + return "polygons" + def native_extension(self) -> str: return self.raster_image.native_extension() diff --git a/src/opengeodeweb_back/geode_objects/geode_raster_image3d.py b/src/opengeodeweb_back/geode_objects/geode_raster_image3d.py index de131c78..a897c2fc 100644 --- a/src/opengeodeweb_back/geode_objects/geode_raster_image3d.py +++ b/src/opengeodeweb_back/geode_objects/geode_raster_image3d.py @@ -6,7 +6,7 @@ import geode_viewables as viewables # Local application imports -from .types import GeodeMeshType +from .types import GeodeMeshType, ViewerElementsType from .geode_mesh import GeodeMesh @@ -20,6 +20,10 @@ def __init__(self, raster_image: og.RasterImage3D) -> None: @classmethod def geode_object_type(cls) -> GeodeMeshType: return "RasterImage3D" + + @classmethod + def viewer_elements_type(cls) -> ViewerElementsType: + return "polyhedra" def native_extension(self) -> str: return self.raster_image.native_extension() From 3a84cd967e659daec0f49d9c4d7b96e9ea9b4e82 Mon Sep 17 00:00:00 2001 From: JulienChampagnol <91873154+JulienChampagnol@users.noreply.github.com> Date: Tue, 3 Feb 2026 10:54:56 +0000 Subject: [PATCH 6/8] Apply prepare changes --- src/opengeodeweb_back/geode_objects/geode_raster_image3d.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/opengeodeweb_back/geode_objects/geode_raster_image3d.py b/src/opengeodeweb_back/geode_objects/geode_raster_image3d.py index a897c2fc..a01bacfc 100644 --- a/src/opengeodeweb_back/geode_objects/geode_raster_image3d.py +++ b/src/opengeodeweb_back/geode_objects/geode_raster_image3d.py @@ -20,7 +20,7 @@ def __init__(self, raster_image: og.RasterImage3D) -> None: @classmethod def geode_object_type(cls) -> GeodeMeshType: return "RasterImage3D" - + @classmethod def viewer_elements_type(cls) -> ViewerElementsType: return "polyhedra" From 47dc33f4c6b37bed603cbd11e5245e19416bdccc Mon Sep 17 00:00:00 2001 From: JulienChampagnol Date: Tue, 3 Feb 2026 12:03:54 +0100 Subject: [PATCH 7/8] test --- tests/test_models_routes.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_models_routes.py b/tests/test_models_routes.py index e18533bf..6834fc10 100644 --- a/tests/test_models_routes.py +++ b/tests/test_models_routes.py @@ -60,7 +60,7 @@ def test_export_project_route(client: FlaskClient, tmp_path: Path) -> None: data1 = Data( id="test_data_1", geode_object="BRep", - viewer_object="model", + viewer_object="BRep", viewer_elements_type="default", input_file="test_native.txt", native_file="test_native.txt", @@ -69,7 +69,7 @@ def test_export_project_route(client: FlaskClient, tmp_path: Path) -> None: data2 = Data( id="test_data_2", geode_object="Section", - viewer_object="model", + viewer_object="Section", viewer_elements_type="default", input_file="test_input.txt", native_file="test_native2.txt", From 74eb2c0adccb8a479d2a6fa1f8aaf8497aa05f8d Mon Sep 17 00:00:00 2001 From: JulienChampagnol Date: Tue, 3 Feb 2026 12:17:06 +0100 Subject: [PATCH 8/8] test CREATE TABLE --- tests/test_models_routes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_models_routes.py b/tests/test_models_routes.py index 6834fc10..d6fbf7f9 100644 --- a/tests/test_models_routes.py +++ b/tests/test_models_routes.py @@ -131,7 +131,7 @@ def test_import_project_route(client: FlaskClient, tmp_path: Path) -> None: temp_db = tmp_path / "temp_project.db" conn = sqlite3.connect(str(temp_db)) conn.execute( - "CREATE TABLE datas (id TEXT PRIMARY KEY, geode_object TEXT, viewer_object TEXT, native_file TEXT, " + "CREATE TABLE datas (id TEXT PRIMARY KEY, geode_object TEXT, viewer_object TEXT, viewer_elements_type TEXT, native_file TEXT, " "viewable_file TEXT, light_viewable_file TEXT, input_file TEXT, additional_files TEXT)" ) conn.commit()