Source code for brainrender.camera

"""Camera utilities for brainrender scenes."""

from __future__ import annotations

from typing import TYPE_CHECKING

from loguru import logger
from vtkmodules.vtkRenderingCore import vtkCamera

from brainrender.cameras import cameras

if TYPE_CHECKING:
    from brainrender.scene import Scene


[docs] def get_camera(camera: str) -> dict: """ Return the parameters for a pre-defined camera. Parameters ---------- camera Name of the pre-defined camera. Returns ------- dict Camera parameters dictionary. """ return cameras[camera]
[docs] def check_camera_param(camera: str | dict) -> dict: """ Check that a dictionary of camera parameters is complete. Must have entries: ``["pos", "viewup", "clipping_range"]``. Parameters ---------- camera Camera name or parameters dictionary. Returns ------- dict Validated camera parameters dictionary. Raises ------ ValueError If a required key is missing from the camera dictionary. """ if isinstance(camera, str): return get_camera(camera) else: params = ["pos", "viewup", "clipping_range"] for param in params: if param not in list(camera.keys()): raise ValueError( f"Camera parameters dict should include the following keys: {params}, missing: {param}" ) if "focal_point" not in camera.keys(): camera["focal_point"] = None return camera
[docs] def set_camera_params(camera: vtkCamera, params: dict) -> None: """ Set camera parameters. Parameters ---------- camera Camera object to configure. params Dictionary of camera parameters with keys ``pos``, ``viewup``, ``clipping_range``, and optionally ``focal_point`` and ``distance``. """ logger.debug(f"Setting camera parameters: {params}") # Apply camera parameters camera.SetPosition(params["pos"]) camera.SetViewUp(params["viewup"]) camera.SetClippingRange(params["clipping_range"]) if "focal_point" in params.keys() and params["focal_point"] is not None: camera.SetFocalPoint(params["focal_point"]) if "distance" in params.keys(): camera.SetDistance(params["distance"])
[docs] def set_camera( scene: Scene, camera: str | dict | vtkCamera | None, ) -> dict | vtkCamera | None: """ Set the position of the camera of a brainrender scene. Parameters ---------- scene Instance of brainrender Scene. camera Pre-defined camera name, a dictionary of camera parameters, or a ``vtkCamera`` object. If None, returns immediately. Returns ------- dict, vtkCamera, or None The applied camera parameters or object, or None if not applied. """ if camera is None: return None if not isinstance(camera, vtkCamera): # Get camera params camera = check_camera_param(camera) # set params try: set_camera_params(scene.plotter.camera, camera) except AttributeError: return None else: scene.plotter.camera = camera return camera
[docs] def get_camera_params( scene: Scene | None = None, camera: vtkCamera | None = None ) -> dict: """ Return the camera parameters from an active scene or camera object. Parameters ---------- scene Instance of brainrender Scene whose camera is to be used. camera Camera object to read parameters from. Returns ------- dict Camera parameters with keys ``pos``, ``focal_point``, ``viewup``, ``distance``, and ``clipping_range``. """ def clean(val: tuple | float) -> tuple | int: if isinstance(val, tuple): return tuple((round(v) for v in val)) else: return round(val) if scene is not None: if not scene.is_rendered: scene.render(interactive=False) cam = scene.plotter.camera else: cam = camera params = dict( pos=clean(cam.GetPosition()), focal_point=clean(cam.GetFocalPoint()), viewup=clean(cam.GetViewUp()), distance=clean(cam.GetDistance()), clipping_range=clean(cam.GetClippingRange()), ) return params