Source code for isaaclab.envs.ui.empty_window
# 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 asyncio
from typing import TYPE_CHECKING
import omni.kit.app
if TYPE_CHECKING:
import omni.ui
from ..manager_based_env import ManagerBasedEnv
[docs]
class EmptyWindow:
"""
Creates an empty UI window that can be docked in the Omniverse Kit environment.
The class initializes a dockable UI window and provides a main frame with a vertical stack.
You can add custom UI elements to this vertical stack.
Example for adding a UI element from the standalone execution script:
>>> with env.window.ui_window_elements["main_vstack"]:
>>> ui.Label("My UI element")
"""
[docs]
def __init__(self, env: ManagerBasedEnv, window_name: str):
"""Initialize the window.
Args:
env: The environment object.
window_name: The name of the window.
"""
# store environment
self.env = env
# create window for UI
self.ui_window = omni.ui.Window(
window_name, width=400, height=500, visible=True, dock_preference=omni.ui.DockPreference.RIGHT_TOP
)
# dock next to properties window
asyncio.ensure_future(self._dock_window(window_title=self.ui_window.title))
# keep a dictionary of stacks so that child environments can add their own UI elements
# this can be done by using the `with` context manager
self.ui_window_elements = dict()
# create main frame
self.ui_window_elements["main_frame"] = self.ui_window.frame
with self.ui_window_elements["main_frame"]:
# create main vstack
self.ui_window_elements["main_vstack"] = omni.ui.VStack(spacing=5, height=0)
def __del__(self):
"""Destructor for the window."""
# destroy the window
if self.ui_window is not None:
self.ui_window.visible = False
self.ui_window.destroy()
self.ui_window = None
async def _dock_window(self, window_title: str):
"""Docks the custom UI window to the property window."""
# wait for the window to be created
for _ in range(5):
if omni.ui.Workspace.get_window(window_title):
break
await self.env.sim.app.next_update_async()
# dock next to properties window
custom_window = omni.ui.Workspace.get_window(window_title)
property_window = omni.ui.Workspace.get_window("Property")
if custom_window and property_window:
custom_window.dock_in(property_window, omni.ui.DockPosition.SAME, 1.0)
custom_window.focus()