3838import pickle
3939
4040import numpy
41+ import openvdb as vdb
4142
4243# For interpolated grids: need scipy.ndimage but we import it only when needed:
4344# import scipy
@@ -250,7 +251,10 @@ def __init__(
250251 self .interpolation_cval = None # default to using min(grid)
251252
252253 if grid is not None :
253- if isinstance (grid , str ):
254+ if self ._is_native_object (grid ):
255+ self ._load_from_native (grid )
256+ filename = None
257+ elif isinstance (grid , str ):
254258 # can probably safely try to load() it...
255259 filename = grid
256260 else :
@@ -273,7 +277,7 @@ def __init__(
273277 file_format = file_format ,
274278 assume_volumetric = assume_volumetric ,
275279 )
276- else :
280+ elif not self . _is_native_object ( grid ) :
277281 self ._load (grid , edges , metadata , origin , delta )
278282
279283 @property
@@ -622,38 +626,76 @@ def _load_plt(self, filename, **kwargs):
622626 grid , edges = g .histogramdd ()
623627 self ._load (grid = grid , edges = edges , metadata = self .metadata )
624628
629+ def _is_native_object (self , obj ):
630+ """Check if object is a native format object (OpenVDB grid, MRC object).
631+
632+ Parameters
633+ ----------
634+ obj : object
635+ Object to check
636+
637+ Returns
638+ -------
639+ bool
640+ True if obj is a native format object
641+ """
642+ if isinstance (obj , vdb .GridBase ):
643+ return True
644+
645+ return False
646+
647+ def _load_from_native (self , obj ):
648+ """Load Grid from a native format object.
649+
650+ Parameters
651+ ----------
652+ obj : object
653+ Native format object (openvdb.GridBase, mrcfile.mrcfile.MrcFile, etc.)
654+
655+ """
656+ self .vdb_field = OpenVDB .OpenVDBField (grid = obj )
657+
658+ origin = self .vdb_field .origin
659+ delta = self .vdb_field .delta
660+ grid = self .vdb_field .grid
661+
662+ self .metadata = self .vdb_field .metadata
663+ self ._from_native_vdb = True
664+
665+ self ._load (grid = grid , origin = origin , delta = delta )
666+
625667 def convert_to (self , format_specifier , tolerance = None , ** kwargs ):
626668 """generates an instance of the native object for a given format
627-
669+
628670 Implemented formats:
629-
671+
630672 vdb
631673 :mod:`OpenVDB`
632-
674+
633675 Parameters
634676 ----------
635- format_specifier : str
677+ format_specifier : str
636678 vdb, etc
637679
638680 Returns
639681 -------
640682 native object
641-
683+
642684 """
643685 formats = ("mrc" , "vdb" )
644- if ( format_specifier .lower () == formats [1 ]) :
686+ if format_specifier .lower () == formats [1 ]:
645687 grid_name = self .metadata .get ("name" , "density" )
646- vdb_field = OpenVDB .OpenVDBField (
688+ vdb_field = OpenVDB .OpenVDBField (
647689 grid = self .grid ,
648690 origin = self .origin ,
649691 delta = self .delta ,
650692 name = grid_name ,
651693 tolerance = tolerance ,
652- metadata = self .metadata
694+ metadata = self .metadata ,
653695 )
654-
696+
655697 return vdb_field .vdb_grid
656-
698+
657699 raise ValueError (f"Unsupported convert_to format : { format_specifier } " )
658700
659701 def export (
@@ -773,6 +815,14 @@ def _export_vdb(self, filename, tolerance=None, **kwargs):
773815
774816 For the file format see https://www.openvdb.org
775817 """
818+ if (
819+ hasattr (self , "_from_native_vdb" )
820+ and self ._from_native_vdb
821+ and tolerance is None
822+ ):
823+ self .vdb_field .write (filename )
824+ return
825+
776826 if self .grid .ndim != 3 :
777827 raise ValueError (
778828 f"OpenVDB export requires a 3D grid, got { self .grid .ndim } D"
0 commit comments