Source code for isaaclab.ui.widgets.ui_visualizer_base
# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
# All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
from __future__ import annotations
import inspect
from typing import TYPE_CHECKING
if TYPE_CHECKING:
import omni.ui
[docs]
class UiVisualizerBase:
"""Base Class for components that support debug visualizations that requires access to some UI elements.
This class provides a set of functions that can be used to assign ui interfaces.
The following functions are provided:
* :func:`set_debug_vis`: Assigns a debug visualization interface. This function is called by the main UI
when the checkbox for debug visualization is toggled.
* :func:`set_vis_frame`: Assigns a small frame within the isaac lab tab that can be used to visualize debug
information. Such as e.g. plots or images. It is called by the main UI on startup to create the frame.
* :func:`set_window`: Assigngs the main window that is used by the main UI. This allows the user
to have full controller over all UI elements. But be warned, with great power comes great responsibility.
"""
"""
Exposed Properties
"""
@property
def has_debug_vis_implementation(self) -> bool:
"""Whether the component has a debug visualization implemented."""
# check if function raises NotImplementedError
source_code = inspect.getsource(self._set_debug_vis_impl)
return "NotImplementedError" not in source_code
@property
def has_vis_frame_implementation(self) -> bool:
"""Whether the component has a debug visualization implemented."""
# check if function raises NotImplementedError
source_code = inspect.getsource(self._set_vis_frame_impl)
return "NotImplementedError" not in source_code
@property
def has_window_implementation(self) -> bool:
"""Whether the component has a debug visualization implemented."""
# check if function raises NotImplementedError
source_code = inspect.getsource(self._set_window_impl)
return "NotImplementedError" not in source_code
@property
def has_env_selection_implementation(self) -> bool:
"""Whether the component has a debug visualization implemented."""
# check if function raises NotImplementedError
source_code = inspect.getsource(self._set_env_selection_impl)
return "NotImplementedError" not in source_code
"""
Exposed Setters
"""
def set_env_selection(self, env_selection: int) -> bool:
"""Sets the selected environment id.
This function is called by the main UI when the user selects a different environment.
Args:
env_selection: The currently selected environment id.
Returns:
Whether the environment selection was successfully set. False if the component
does not support environment selection.
"""
# check if environment selection is supported
if not self.has_env_selection_implementation:
return False
# set environment selection
self._set_env_selection_impl(env_selection)
return True
def set_window(self, window: omni.ui.Window) -> bool:
"""Sets the current main ui window.
This function is called by the main UI when the window is created. It allows the component
to add custom UI elements to the window or to control the window and its elements.
Args:
window: The ui window.
Returns:
Whether the window was successfully set. False if the component
does not support this functionality.
"""
# check if window is supported
if not self.has_window_implementation:
return False
# set window
self._set_window_impl(window)
return True
def set_vis_frame(self, vis_frame: omni.ui.Frame) -> bool:
"""Sets the debug visualization frame.
This function is called by the main UI when the window is created. It allows the component
to modify a small frame within the orbit tab that can be used to visualize debug information.
Args:
vis_frame: The debug visualization frame.
Returns:
Whether the debug visualization frame was successfully set. False if the component
does not support debug visualization.
"""
# check if debug visualization is supported
if not self.has_vis_frame_implementation:
return False
# set debug visualization frame
self._set_vis_frame_impl(vis_frame)
return True
"""
Internal Implementation
"""
def _set_env_selection_impl(self, env_idx: int):
"""Set the environment selection."""
raise NotImplementedError(f"Environment selection is not implemented for {self.__class__.__name__}.")
def _set_window_impl(self, window: omni.ui.Window):
"""Set the window."""
raise NotImplementedError(f"Window is not implemented for {self.__class__.__name__}.")
def _set_debug_vis_impl(self, debug_vis: bool):
"""Set debug visualization state."""
raise NotImplementedError(f"Debug visualization is not implemented for {self.__class__.__name__}.")
def _set_vis_frame_impl(self, vis_frame: omni.ui.Frame):
"""Set debug visualization into visualization objects.
This function is responsible for creating the visualization objects if they don't exist
and input ``debug_vis`` is True. If the visualization objects exist, the function should
set their visibility into the stage.
"""
raise NotImplementedError(f"Debug visualization is not implemented for {self.__class__.__name__}.")