diff --git a/opengeodeweb_back_schemas.json b/opengeodeweb_back_schemas.json index 2258eed1..9e09d762 100644 --- a/opengeodeweb_back_schemas.json +++ b/opengeodeweb_back_schemas.json @@ -33,9 +33,9 @@ } }, "models": { - "mesh_components": { - "$id": "opengeodeweb_back/models/mesh_components", - "route": "/mesh_components", + "model_components": { + "$id": "opengeodeweb_back/models/model_components", + "route": "/model_components", "methods": [ "POST" ], diff --git a/requirements.txt b/requirements.txt index bd1ed694..c8216d02 100644 --- a/requirements.txt +++ b/requirements.txt @@ -60,4 +60,3 @@ werkzeug==3.1.2 # flask # flask-cors -opengeodeweb-microservice==1.*,>=1.0.14 diff --git a/src/opengeodeweb_back/geode_objects/geode_brep.py b/src/opengeodeweb_back/geode_objects/geode_brep.py index 6637fb9a..5cb32453 100644 --- a/src/opengeodeweb_back/geode_objects/geode_brep.py +++ b/src/opengeodeweb_back/geode_objects/geode_brep.py @@ -76,6 +76,18 @@ def save_light_viewable(self, filename_without_extension: str) -> str: def mesh_components(self) -> ComponentRegistry: return self.brep.mesh_components() + def collection_components(self) -> ComponentRegistry: + return self.brep.collection_components() + + def boundaries(self, id: og.uuid) -> list[og.ComponentID]: + return self.brep.boundaries(id) + + def internals(self, id: og.uuid) -> list[og.ComponentID]: + return self.brep.internals(id) + + def items(self, id: og.uuid) -> list[og.ComponentID]: + return self.brep.items(id) + def inspect(self) -> og_inspector.BRepInspectionResult: return og_inspector.inspect_brep(self.brep) diff --git a/src/opengeodeweb_back/geode_objects/geode_model.py b/src/opengeodeweb_back/geode_objects/geode_model.py index 529fa489..14d867b3 100644 --- a/src/opengeodeweb_back/geode_objects/geode_model.py +++ b/src/opengeodeweb_back/geode_objects/geode_model.py @@ -23,3 +23,15 @@ def viewer_elements_type(cls) -> ViewerElementsType: @abstractmethod def mesh_components(self) -> ComponentRegistry: ... + + @abstractmethod + def collection_components(self) -> ComponentRegistry: ... + + @abstractmethod + def boundaries(self, id: og.uuid) -> list[og.ComponentID]: ... + + @abstractmethod + def internals(self, id: og.uuid) -> list[og.ComponentID]: ... + + @abstractmethod + def items(self, id: og.uuid) -> list[og.ComponentID]: ... diff --git a/src/opengeodeweb_back/geode_objects/geode_section.py b/src/opengeodeweb_back/geode_objects/geode_section.py index af35be7f..7f2b7dc6 100644 --- a/src/opengeodeweb_back/geode_objects/geode_section.py +++ b/src/opengeodeweb_back/geode_objects/geode_section.py @@ -78,6 +78,18 @@ def save_light_viewable(self, filename_without_extension: str) -> str: def mesh_components(self) -> ComponentRegistry: return self.section.mesh_components() + def collection_components(self) -> ComponentRegistry: + return self.section.collection_components() + + def boundaries(self, id: og.uuid) -> list[og.ComponentID]: + return self.section.boundaries(id) + + def internals(self, id: og.uuid) -> list[og.ComponentID]: + return self.section.internals(id) + + def items(self, id: og.uuid) -> list[og.ComponentID]: + return self.section.items(id) + def inspect(self) -> og_inspector.SectionInspectionResult: return og_inspector.inspect_section(self.section) diff --git a/src/opengeodeweb_back/routes/models/blueprint_models.py b/src/opengeodeweb_back/routes/models/blueprint_models.py index 287b1860..01668f07 100644 --- a/src/opengeodeweb_back/routes/models/blueprint_models.py +++ b/src/opengeodeweb_back/routes/models/blueprint_models.py @@ -12,14 +12,14 @@ @routes.route( - schemas_dict["mesh_components"]["route"], - methods=schemas_dict["mesh_components"]["methods"], + schemas_dict["model_components"]["route"], + methods=schemas_dict["model_components"]["methods"], ) -def mesh_components() -> flask.Response: +def model_components() -> flask.Response: json_data = utils_functions.validate_request( - flask.request, schemas_dict["mesh_components"] + flask.request, schemas_dict["model_components"] ) - params = schemas.MeshComponents.from_dict(json_data) + params = schemas.ModelComponents.from_dict(json_data) model = geode_functions.load_geode_object(params.id) if not isinstance(model, GeodeModel): flask.abort(400, f"{params.id} is not a GeodeModel") @@ -44,14 +44,40 @@ def mesh_components() -> flask.Response: geode_id = id.string() component_name = geode_id viewer_id = uuid_to_flat_index[geode_id] - + boundaries = model.boundaries(id) + boundaries_uuid = [boundary.id().string() for boundary in boundaries] + internals = model.internals(id) + internals_uuid = [internal.id().string() for internal in internals] mesh_component_object = { - "id": params.id, "viewer_id": viewer_id, "geode_id": geode_id, "name": component_name, "type": component_type, + "boundaries": boundaries_uuid, + "internals": internals_uuid, } mesh_components.append(mesh_component_object) - return flask.make_response({"mesh_components": mesh_components}, 200) + model_collection_components = model.collection_components() + collection_components = [] + for collection_component, ids in model_collection_components.items(): + component_type = collection_component.get() + for id in ids: + geode_id = id.string() + items = model.items(id) + items_uuid = [item.id().string() for item in items] + collection_component_object = { + "geode_id": geode_id, + "name": geode_id, + "type": component_type, + "items": items_uuid, + } + collection_components.append(collection_component_object) + + return flask.make_response( + { + "mesh_components": mesh_components, + "collection_components": collection_components, + }, + 200, + ) diff --git a/src/opengeodeweb_back/routes/models/schemas/__init__.py b/src/opengeodeweb_back/routes/models/schemas/__init__.py index 9455a6fe..4ef41586 100644 --- a/src/opengeodeweb_back/routes/models/schemas/__init__.py +++ b/src/opengeodeweb_back/routes/models/schemas/__init__.py @@ -1 +1 @@ -from .mesh_components import * +from .model_components import * diff --git a/src/opengeodeweb_back/routes/models/schemas/mesh_components.json b/src/opengeodeweb_back/routes/models/schemas/model_components.json similarity index 86% rename from src/opengeodeweb_back/routes/models/schemas/mesh_components.json rename to src/opengeodeweb_back/routes/models/schemas/model_components.json index d8f315aa..b054564d 100644 --- a/src/opengeodeweb_back/routes/models/schemas/mesh_components.json +++ b/src/opengeodeweb_back/routes/models/schemas/model_components.json @@ -1,5 +1,5 @@ { - "route": "/mesh_components", + "route": "/model_components", "methods": [ "POST" ], diff --git a/src/opengeodeweb_back/routes/models/schemas/mesh_components.py b/src/opengeodeweb_back/routes/models/schemas/model_components.py similarity index 80% rename from src/opengeodeweb_back/routes/models/schemas/mesh_components.py rename to src/opengeodeweb_back/routes/models/schemas/model_components.py index 80165275..a471788a 100644 --- a/src/opengeodeweb_back/routes/models/schemas/mesh_components.py +++ b/src/opengeodeweb_back/routes/models/schemas/model_components.py @@ -3,7 +3,7 @@ @dataclass -class MeshComponents(DataClassJsonMixin): +class ModelComponents(DataClassJsonMixin): def __post_init__(self) -> None: print(self, flush=True) diff --git a/tests/test_models_routes.py b/tests/test_models_routes.py index d6fbf7f9..72bf0fa7 100644 --- a/tests/test_models_routes.py +++ b/tests/test_models_routes.py @@ -18,12 +18,12 @@ data_dir = os.path.join(base_dir, "data") -def test_mesh_components(client: FlaskClient) -> None: +def test_model_components(client: FlaskClient) -> None: geode_object_type = "BRep" filename = "cube.og_brep" response = test_save_viewable_file(client, geode_object_type, filename) - route = "/opengeodeweb_back/models/mesh_components" + route = "/opengeodeweb_back/models/model_components" brep_filename = os.path.join(data_dir, "cube.og_brep") response = client.post(route, json={"id": response.get_json()["id"]}) @@ -34,11 +34,26 @@ def test_mesh_components(client: FlaskClient) -> None: assert len(mesh_components) > 0 for mesh_component in mesh_components: assert isinstance(mesh_component, object) - assert isinstance(mesh_component["id"], str) assert isinstance(mesh_component["geode_id"], str) assert isinstance(mesh_component["viewer_id"], int) assert isinstance(mesh_component["name"], str) assert isinstance(mesh_component["type"], str) + assert isinstance(mesh_component["boundaries"], list) + for boundary_uuid in mesh_component["boundaries"]: + assert isinstance(boundary_uuid, str) + assert isinstance(mesh_component["internals"], list) + for internal_uuid in mesh_component["internals"]: + assert isinstance(internal_uuid, str) + assert "collection_components" in response.get_json() + collection_components = response.get_json()["collection_components"] + assert isinstance(collection_components, list) + for collection_component in collection_components: + assert isinstance(collection_component, object) + assert isinstance(collection_component["geode_id"], str) + assert isinstance(collection_component["name"], str) + assert isinstance(collection_component["items"], list) + for item_uuid in collection_component["items"]: + assert isinstance(item_uuid, str) def test_export_project_route(client: FlaskClient, tmp_path: Path) -> None: