Skip to content

Commit f2a9bfd

Browse files
authored
Merge pull request #212 from Geode-solutions/feat/attribute_values
feat(attribute_values): attribute_metadata added to attribute_names b…
2 parents 56b0b69 + 3ff3038 commit f2a9bfd

3 files changed

Lines changed: 58 additions & 13 deletions

File tree

requirements.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,3 @@ werkzeug==3.1.2
6060
# flask
6161
# flask-cors
6262

63-
opengeodeweb-microservice==1.*,>=1.0.13rc1

src/opengeodeweb_back/routes/blueprint_routes.py

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import flask
99
import werkzeug
1010
import zipfile
11+
import opengeode as og
1112
import opengeode_io as og_io
1213
import opengeode_geosciences as og_geosciences
1314
import opengeode_geosciencesio as og_geosciencesio
@@ -264,6 +265,30 @@ def texture_coordinates() -> flask.Response:
264265
return flask.make_response({"texture_coordinates": texture_coordinates}, 200)
265266

266267

268+
def attributes_metadata(manager: og.AttributeManager) -> dict[str, list[float]]:
269+
metadata: dict[str, list[float]] = {}
270+
for name in manager.attribute_names():
271+
attribute = manager.find_generic_attribute(name)
272+
if not attribute.is_genericable():
273+
metadata[name] = [-1.0, -1.0]
274+
continue
275+
min_value = None
276+
max_value = None
277+
nb_items = attribute.nb_items()
278+
for i in range(nb_items):
279+
generic_value = attribute.generic_value(i)
280+
if min_value is None or generic_value < min_value:
281+
min_value = generic_value
282+
if max_value is None or generic_value > max_value:
283+
max_value = generic_value
284+
metadata[name] = (
285+
[min_value, max_value]
286+
if min_value is not None and max_value is not None
287+
else [-1.0, -1.0]
288+
)
289+
return metadata
290+
291+
267292
@routes.route(
268293
schemas_dict["vertex_attribute_names"]["route"],
269294
methods=schemas_dict["vertex_attribute_names"]["methods"],
@@ -276,10 +301,11 @@ def vertex_attribute_names() -> flask.Response:
276301
geode_object = geode_functions.load_geode_object(params.id)
277302
if not isinstance(geode_object, GeodeMesh):
278303
flask.abort(400, f"{params.id} is not a GeodeMesh")
279-
vertex_attribute_names = geode_object.vertex_attribute_manager().attribute_names()
304+
attribute_manager = geode_object.vertex_attribute_manager()
280305
return flask.make_response(
281306
{
282-
"vertex_attribute_names": vertex_attribute_names,
307+
"vertex_attribute_names": attribute_manager.attribute_names(),
308+
"vertex_attribute_metadata": attributes_metadata(attribute_manager),
283309
},
284310
200,
285311
)
@@ -297,10 +323,11 @@ def cell_attribute_names() -> flask.Response:
297323
geode_object = geode_functions.load_geode_object(params.id)
298324
if not isinstance(geode_object, GeodeGrid2D | GeodeGrid3D):
299325
flask.abort(400, f"{params.id} is not a GeodeGrid")
300-
cell_attribute_names = geode_object.cell_attribute_manager().attribute_names()
326+
attribute_manager = geode_object.cell_attribute_manager()
301327
return flask.make_response(
302328
{
303-
"cell_attribute_names": cell_attribute_names,
329+
"cell_attribute_names": attribute_manager.attribute_names(),
330+
"cell_attribute_metadata": attributes_metadata(attribute_manager),
304331
},
305332
200,
306333
)
@@ -318,10 +345,11 @@ def polygon_attribute_names() -> flask.Response:
318345
geode_object = geode_functions.load_geode_object(params.id)
319346
if not isinstance(geode_object, GeodeSurfaceMesh2D | GeodeSurfaceMesh3D):
320347
flask.abort(400, f"{params.id} is not a GeodeSurfaceMesh")
321-
polygon_attribute_names = geode_object.polygon_attribute_manager().attribute_names()
348+
attribute_manager = geode_object.polygon_attribute_manager()
322349
return flask.make_response(
323350
{
324-
"polygon_attribute_names": polygon_attribute_names,
351+
"polygon_attribute_names": attribute_manager.attribute_names(),
352+
"polygon_attribute_metadata": attributes_metadata(attribute_manager),
325353
},
326354
200,
327355
)
@@ -339,12 +367,11 @@ def polyhedron_attribute_names() -> flask.Response:
339367
geode_object = geode_functions.load_geode_object(params.id)
340368
if not isinstance(geode_object, GeodeSolidMesh3D):
341369
flask.abort(400, f"{params.id} is not a GeodeSolidMesh")
342-
polyhedron_attribute_names = (
343-
geode_object.polyhedron_attribute_manager().attribute_names()
344-
)
370+
attribute_manager = geode_object.polyhedron_attribute_manager()
345371
return flask.make_response(
346372
{
347-
"polyhedron_attribute_names": polyhedron_attribute_names,
373+
"polyhedron_attribute_names": attribute_manager.attribute_names(),
374+
"polyhedron_attribute_metadata": attributes_metadata(attribute_manager),
348375
},
349376
200,
350377
)
@@ -362,10 +389,11 @@ def edge_attribute_names() -> flask.Response:
362389
geode_object = geode_functions.load_geode_object(params.id)
363390
if not isinstance(geode_object, GeodeGraph):
364391
flask.abort(400, f"{params.id} does not have edges")
365-
edge_attribute_names = geode_object.edge_attribute_manager().attribute_names()
392+
attribute_manager = geode_object.edge_attribute_manager()
366393
return flask.make_response(
367394
{
368-
"edge_attribute_names": edge_attribute_names,
395+
"edge_attribute_names": attribute_manager.attribute_names(),
396+
"edge_attribute_metadata": attributes_metadata(attribute_manager),
369397
},
370398
200,
371399
)

tests/test_routes.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,9 +245,12 @@ def test_vertex_attribute_names(client: FlaskClient, test_id: str) -> None:
245245
response = client.post(route, json={"id": data.id})
246246
assert response.status_code == 200
247247
vertex_attribute_names = response.get_json()["vertex_attribute_names"]
248+
vertex_attribute_metadata = response.get_json()["vertex_attribute_metadata"]
248249
assert type(vertex_attribute_names) is list
250+
assert type(vertex_attribute_metadata) is dict
249251
for vertex_attribute_name in vertex_attribute_names:
250252
assert type(vertex_attribute_name) is str
253+
assert vertex_attribute_name in vertex_attribute_metadata
251254

252255

253256
def test_cell_attribute_names(client: FlaskClient, test_id: str) -> None:
@@ -271,9 +274,12 @@ def test_cell_attribute_names(client: FlaskClient, test_id: str) -> None:
271274
response = client.post(route, json={"id": data.id})
272275
assert response.status_code == 200
273276
cell_attribute_names = response.get_json()["cell_attribute_names"]
277+
cell_attribute_metadata = response.get_json()["cell_attribute_metadata"]
274278
assert type(cell_attribute_names) is list
279+
assert type(cell_attribute_metadata) is dict
275280
for cell_attribute_name in cell_attribute_names:
276281
assert type(cell_attribute_name) is str
282+
assert cell_attribute_name in cell_attribute_metadata
277283

278284

279285
def test_polygon_attribute_names(client: FlaskClient, test_id: str) -> None:
@@ -297,9 +303,12 @@ def test_polygon_attribute_names(client: FlaskClient, test_id: str) -> None:
297303
response = client.post(route, json={"id": data.id})
298304
assert response.status_code == 200
299305
polygon_attribute_names = response.get_json()["polygon_attribute_names"]
306+
polygon_attribute_metadata = response.get_json()["polygon_attribute_metadata"]
300307
assert type(polygon_attribute_names) is list
308+
assert type(polygon_attribute_metadata) is dict
301309
for polygon_attribute_name in polygon_attribute_names:
302310
assert type(polygon_attribute_name) is str
311+
assert polygon_attribute_name in polygon_attribute_metadata
303312

304313

305314
def test_polyhedron_attribute_names(client: FlaskClient, test_id: str) -> None:
@@ -324,9 +333,15 @@ def test_polyhedron_attribute_names(client: FlaskClient, test_id: str) -> None:
324333
print(response.get_json())
325334
assert response.status_code == 200
326335
polyhedron_attribute_names = response.get_json()["polyhedron_attribute_names"]
336+
polyhedron_attribute_metadata = response.get_json()["polyhedron_attribute_metadata"]
327337
assert type(polyhedron_attribute_names) is list
338+
assert type(polyhedron_attribute_metadata) is dict
328339
for polyhedron_attribute_name in polyhedron_attribute_names:
329340
assert type(polyhedron_attribute_name) is str
341+
assert polyhedron_attribute_name in polyhedron_attribute_metadata
342+
343+
if "Range" in polyhedron_attribute_metadata:
344+
assert polyhedron_attribute_metadata["Range"] == [0.0, 579.0]
330345

331346

332347
def test_edge_attribute_names(client: FlaskClient, test_id: str) -> None:
@@ -351,9 +366,12 @@ def test_edge_attribute_names(client: FlaskClient, test_id: str) -> None:
351366
print(response.get_json())
352367
assert response.status_code == 200
353368
edge_attribute_names = response.get_json()["edge_attribute_names"]
369+
edge_attribute_metadata = response.get_json()["edge_attribute_metadata"]
354370
assert type(edge_attribute_names) is list
371+
assert type(edge_attribute_metadata) is dict
355372
for edge_attribute_name in edge_attribute_names:
356373
assert type(edge_attribute_name) is str
374+
assert edge_attribute_name in edge_attribute_metadata
357375

358376

359377
def test_database_uri_path(client: FlaskClient) -> None:

0 commit comments

Comments
 (0)