-
Notifications
You must be signed in to change notification settings - Fork 25
Description
Summary
The Python bindings for resqml2::UnstructuredGridRepresentation::setGeometry() and setHexahedraOnlyGeometry() consistently fail with type errors when passing FESAPI array types (DoubleArray, UInt64Array, UInt8Array), despite the method signatures appearing correct in Python.
Environment
- FESAPI Version: 2.14.0 (with pip install fesapi)
- Python Version: 3.11+
- Operating System: Windows 11
Expected Behavior
The following code should successfully set unstructured grid geometry:
import fesapi
import numpy as np
# Create repository and grid
repo = fesapi.DataObjectRepository()
grid = repo.createUnstructuredGridRepresentation(
"uuid-here",
"Test Grid",
100 # cell count
)
# Create HDF proxy
hdf_proxy = repo.createHdfProxy(
"uuid-here",
"HDF5 Proxy",
"",
"",
fesapi.DataObjectRepository.openingMode_READ_WRITE
)
# Prepare arrays
points = fesapi.DoubleArray(300) # 100 points * 3 coords
for i in range(300):
points.setitem(i, float(i))
face_indices = fesapi.UInt64Array(600) # 100 cells * 6 faces
for i in range(600):
face_indices.setitem(i, int(i % 100))
node_indices = fesapi.UInt64Array(2400) # ~4 nodes per face avg
for i in range(2400):
node_indices.setitem(i, int(i % 100))
face_handedness = fesapi.UInt8Array(600)
for i in range(600):
face_handedness.setitem(i, 1)
# This should work but fails
grid.setHexahedraOnlyGeometry(
face_handedness, # uint8_t *
points, # double *
100, # pointCount
100, # faceCount
hdf_proxy, # AbstractHdfProxy *
face_indices, # uint64_t *
node_indices # uint64_t *
)Actual Behavior
The call fails with:
TypeError: Wrong number or type of arguments for overloaded function 'Resqml2_UnstructuredGridRepresentation_setHexahedraOnlyGeometry'.
Possible C/C++ prototypes are:
resqml2::UnstructuredGridRepresentation::setHexahedraOnlyGeometry(uint8_t *,double *,uint64_t,uint64_t,eml2::AbstractHdfProxy *,uint64_t *,uint64_t *,eml2::AbstractLocal3dCrs *)
resqml2::UnstructuredGridRepresentation::setHexahedraOnlyGeometry(uint8_t *,double *,uint64_t,uint64_t,eml2::AbstractHdfProxy *,uint64_t *,uint64_t *)
Investigation
Python Signature (via inspect)
import inspect
print(inspect.signature(grid.setHexahedraOnlyGeometry))Output:
(cellFaceIsRightHanded: 'uint8_t *', points: 'double *', pointCount: 'uint64_t',
faceCount: 'uint64_t', proxy: 'Eml2_AbstractHdfProxy', faceIndicesPerCell: 'uint64_t *',
nodeIndicesPerFace: 'uint64_t *', localCrs: 'Eml2_AbstractLocal3dCrs' = None) -> 'void'
The signature appears correct, but the SWIG-generated code doesn't accept the FESAPI array types.
Tested Approaches
-
FESAPI Array Types (DoubleArray, UInt64Array, UInt8Array)
- Created via constructor:
fesapi.DoubleArray(size) - Populated with
setitem(index, value) - Result: Type error
- Created via constructor:
-
NumPy Arrays (contiguous, correct dtype)
np.ascontiguousarray(data, dtype=np.float64)np.ascontiguousarray(data, dtype=np.uint64)np.ascontiguousarray(data, dtype=np.uint8)- Result: Type error
-
Different Method Variants
setGeometry()- Full signature with cumulative countssetHexahedraOnlyGeometry()- Simplified for hexahedrasetTetrahedraOnlyGeometry()- Simplified for tetrahedra- Result: All fail with same error
-
With/Without Optional Parameters
- Tried with explicit
NoneforlocalCrs - Tried without
localCrsparameter - Result: Both fail
- Tried with explicit
Successful Method Calls
The following FESAPI methods work correctly with the same array types:
# Property creation works fine
prop = repo.createContinuousProperty(...)
fesapi_values = fesapi.DoubleArray(n)
for i, val in enumerate(values):
fesapi_values.setitem(i, float(val))
prop.pushBackDoubleHdf5Array3dOfValues(
fesapi_values, # DoubleArray accepted here
n_cells, 1, 1,
min_val, max_val,
hdf_proxy
)
# ✓ This works!This proves the SWIG bindings can accept FESAPI array types in some contexts.
Additional Information
Related Methods Affected
All of these methods show the same issue:
setGeometry()setHexahedraOnlyGeometry()setTetrahedraOnlyGeometry()setGeometryUsingExistingDatasets()(different signature, but may have similar issues)