Source code for magicclass.ext.vispy.widgets3d

from __future__ import annotations
import numpy as np
from vispy import scene

from .image import Image, IsoSurface, LayerItem
from ...widgets import FreeWidget


[docs]class Vispy3DCanvas(FreeWidget): def __init__(self): super().__init__() self._scene = scene.SceneCanvas() grid = self._scene.central_widget.add_grid() self._viewbox = grid.add_view() self._viewbox.camera = scene.ArcballCamera(fov=0) self._items: list[LayerItem] = [] self._scene.create_native() self.set_widget(self._scene.native) @property def layers(self): return self._items @property def camera(self): return self._viewbox.camera
[docs] def add_image( self, data: np.ndarray, *, contrast_limits=None, rendering="mip", iso_threshold=None, attenuation=1.0, cmap="grays", gamma=1.0, interpolation="linear", ): image = Image( data, self._viewbox, contrast_limits=contrast_limits, rendering=rendering, iso_threshold=iso_threshold, attenuation=attenuation, cmap=cmap, gamma=gamma, interpolation=interpolation, ) self._items.append(image) self._viewbox.camera.scale_factor = max(data.shape) self._viewbox.camera.center = [s / 2 - 0.5 for s in data.shape]
[docs] def add_isosurface( self, data: np.ndarray, *, contrast_limits=None, iso_threshold=None, wire_color=None, face_color=None, ): surface = IsoSurface( data, self._viewbox, contrast_limits=contrast_limits, iso_threshold=iso_threshold, wire_color=wire_color, face_color=face_color, ) self._items.append(surface) self._viewbox.camera.scale_factor = max(data.shape) self._viewbox.camera.center = [s / 2 - 0.5 for s in data.shape]