Skip to content

Commit 027c44e

Browse files
committed
added convert_to in core.py, checked for grid and origin
1 parent 65bcc79 commit 027c44e

3 files changed

Lines changed: 67 additions & 1 deletion

File tree

gridData/OpenVDB.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,11 +186,17 @@ def _populate(self, grid, origin, delta):
186186
187187
"""
188188
self.grid = numpy.asarray(grid)
189-
if grid.ndim != 3:
189+
if self.grid.ndim != 3:
190190
raise ValueError(f"OpenVDB only supports 3D grids, got {grid.ndim}D")
191191

192192
self.grid = numpy.ascontiguousarray(self.grid)
193193

194+
if origin is None:
195+
raise ValueError("origin must be provided for VDB export")
196+
197+
if len(origin) != 3:
198+
raise ValueError("origin must be length-3")
199+
194200
self.origin = numpy.asarray(origin)
195201

196202
# Handle delta: could be 1D array or diagonal matrix

gridData/core.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -622,6 +622,40 @@ def _load_plt(self, filename, **kwargs):
622622
grid, edges = g.histogramdd()
623623
self._load(grid=grid, edges=edges, metadata=self.metadata)
624624

625+
def convert_to(self, format_specifier, tolerance=None, **kwargs):
626+
"""generates an instance of the native object for a given format
627+
628+
Implemented formats:
629+
630+
vdb
631+
:mod:`OpenVDB`
632+
633+
Parameters
634+
----------
635+
format_specifier : str
636+
vdb, etc
637+
638+
Returns
639+
-------
640+
native object
641+
642+
"""
643+
formats = ("mrc", "vdb")
644+
if (format_specifier.lower() == formats[1]):
645+
grid_name = self.metadata.get("name", "density")
646+
vdb_field = OpenVDB.OpenVDBField(
647+
grid=self.grid,
648+
origin=self.origin,
649+
delta=self.delta,
650+
name=grid_name,
651+
tolerance=tolerance,
652+
metadata=self.metadata
653+
)
654+
655+
return vdb_field.vdb_grid
656+
657+
raise ValueError(f"Unsupported convert_to format : {format_specifier}")
658+
625659
def export(
626660
self, filename, file_format=None, type=None, typequote='"', tolerance=None
627661
):

gridData/tests/test_vdb.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,32 @@ def test_openvdb_field_empty_initialization(self, tmpdir):
336336

337337
assert tmpdir.join("empty_init.vdb").exists()
338338

339+
def test_vdb_origin_none_raises(self):
340+
data = np.ones((5, 5, 5))
341+
342+
with pytest.raises(ValueError, match="origin must be provided"):
343+
gridData.OpenVDB.OpenVDBField(grid=data, origin=None, delta=(1, 1, 1))
344+
345+
def test_vdb_origin_wrong_length_raises(self):
346+
data = np.ones((5, 5, 5))
347+
348+
with pytest.raises(ValueError, match="length-3"):
349+
gridData.OpenVDB.OpenVDBField(grid=data, origin=(0, 0), delta=(1, 1, 1))
350+
351+
def test_vdb_write_without_grid_raises(self, tmpdir):
352+
vdb_field = gridData.OpenVDB.OpenVDBField()
353+
354+
outfile = str(tmpdir / "test.vdb")
355+
356+
with pytest.raises(ValueError, match="No grid data"):
357+
vdb_field.write(str(outfile))
358+
359+
def test_grid_convert_to_vdb(self, grid345):
360+
data, g = grid345
361+
native = g.convert_to("vdb")
362+
363+
assert isinstance(native, vdb.GridBase)
364+
339365

340366
@pytest.mark.skipif(
341367
not HAS_OPENVDB, reason="Need openvdb to test import error handling"

0 commit comments

Comments
 (0)