Source code for omfvista.wrapper

"""This module provides a wrapper that will work for any OMF data object or
project files.

Example Use
-----------

Use the wrapper provided in ``omfvista`` to wrap any ``omf`` data object:

.. code-block:: python

    import omfvista

    omfvista.wrap(data)


Here's an example using the sample data hosted in the `OMF repository`_.

.. _OMF repository: https://github.com/gmggroup/omf/tree/master/assets

.. code-block:: python

    import omf
    import omfvista

    # Read all elements
    reader = omf.OMFReader('test_file.omf')
    project = reader.get_project()

    # Iterate over the elements and add converted VTK objects to dictionary:
    data = dict()
    for e in project.elements:
        d = omfvista.wrap(e)
        data[e.name] = d

Or better yet, just use the project loader:

.. code-block:: python

    import omfvista
    data = omfvista.load_project('test_file.omf')

"""


__all__ = [
    "wrap",
    "project_to_vtk",
    "load_project",
]

__displayname__ = "Wrapper"

import numpy as np
import omf
import pyvista

import omfvista
from omfvista.lineset import line_set_to_vtk
from omfvista.pointset import point_set_to_vtk
from omfvista.surface import surface_geom_to_vtk, surface_grid_geom_to_vtk, surface_to_vtk
from omfvista.utilities import get_textures, texture_to_vtk
from omfvista.volume import volume_grid_geom_to_vtk, volume_to_vtk


[docs] def wrap(data, origin=(0.0, 0.0, 0.0)): """Wraps the OMF data object/project as a VTK data object. This is the primary function that an end user will harness. Args: data: any OMF data object Example: >>> import omf >>> import omfvista >>> # Read all elements >>> reader = omf.OMFReader('test_file.omf') >>> project = reader.get_project() >>> # Iterate over the elements and add converted VTK objects to dictionary: >>> data = dict() >>> for e in project.elements: >>> d = omfvista.wrap(e) >>> data[e.name] = d """ # Allow recursion if isinstance(data, (list, tuple)): multi = pyvista.MultiBlock() for i, item in enumerate(data): multi.append(wrap(item)) multi.set_block_name(i, item.name) return multi # get the class name key = data.__class__.__name__ try: if key != "Project": return WRAPPERS[key](data, origin=origin) else: # Project is a special case return WRAPPERS[key](data) except KeyError: raise RuntimeError("Data of type ({}) is not supported currently.".format(key))
[docs] def project_to_vtk(project, load_textures=False): """Converts an OMF project (:class:`omf.base.Project`) to a :class:`pyvista.MultiBlock` data boject """ # Iterate over the elements and add converted VTK objects a MultiBlock data = pyvista.MultiBlock() textures = {} origin = np.array(project.origin) for e in project.elements: d = omfvista.wrap(e, origin=origin) data[e.name] = d if hasattr(e, "textures") and e.textures: textures[e.name] = get_textures(e) if load_textures: return data, textures return data
[docs] def load_project(filename, load_textures=False): """Loads an OMF project file into a :class:`pyvista.MultiBlock` dataset""" reader = omf.OMFReader(filename) project = reader.get_project() return project_to_vtk(project, load_textures=load_textures)
WRAPPERS = { "LineSetElement": line_set_to_vtk, "PointSetElement": point_set_to_vtk, # Surfaces "SurfaceGeometry": surface_geom_to_vtk, "SurfaceGridGeometry": surface_grid_geom_to_vtk, "SurfaceElement": surface_to_vtk, "ImageTexture": texture_to_vtk, # Volumes "VolumeGridGeometry": volume_grid_geom_to_vtk, "VolumeElement": volume_to_vtk, "Project": project_to_vtk, } # Now set up the display names for the docs load_project.__displayname__ = "Load Project File" project_to_vtk.__displayname__ = "Project to VTK" wrap.__displayname__ = "The Wrapper"