Usage Examples#
Register/Unregister Custom Data Accessor#
from omni.kit.manipulator.prim.core import get_prim_data_accessor_registry
from omni.kit.viewport.manipulator.transform import DataAccessor
# custom data accessor
class CustomDataAccessor(DataAccessor):
    def __init__(self, *args, **kwargs):
        super().__init__()
        print("CustomDataAccessor init")
    def get_sdf_path_type(self):
        import pxr
        return pxr.Sdf.Path
    @property
    def priority(self) -> int:
        return 1
    @property
    def priority_write(self) -> int:
        return 1
    def get_data_tag(self) -> str:
        return "USD"
    def destroy(self):
        print("CustomDataAccessor destroyed")
    def get_local_to_world_transform(self, obj):
        pass
    def get_parent_to_world_transform(self, obj):
        pass
    def clear_xform_cache(self):
        pass
    def update_xform_cache(self):
        pass
# get the singleton instance of the PrimDataAccessorRegistry
prim_data_accessor_registry = get_prim_data_accessor_registry()
# register custom data accessor
prim_data_accessor_registry.register_data_accessor(CustomDataAccessor, "CUSTOM")
# unregister custom data accessor
prim_data_accessor_registry.unregister_data_accessor("CUSTOM")
prim_data_accessor_registry = None
Custom a Prim Transform Manipulator#
from omni.kit.manipulator.prim.core import PrimTransformManipulator, PrimTransformModel
from omni.kit.viewport.registry import RegisterScene
class CustomPrimTransformModel(PrimTransformModel):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
    def on_selection_changed(self, selection):
        """Handles updates to the selection of prims within the model."""
        print(f"changed prims : {selection}")
# Creates a custom manipulator only works on mesh prims
class CustomPrimTransformManipulator(PrimTransformManipulator):
    def __init__(self, usd_context_name: str = "", viewport_api=None):
        custom_model = CustomPrimTransformModel(usd_context_name, viewport_api)
        super().__init__(
            usd_context_name=usd_context_name,
            viewport_api=viewport_api,
            name="omni.kit.manipulator.test_mesh_prim",
            model=custom_model,
            size=0.5,
        )
    def on_selection_changed(self, stage, selection, *args, **kwargs) -> bool:
        if selection is None:
            self.model.on_selection_changed([])
            return False
        self.model.on_selection_changed(selection)
        for path in selection:
            prim = stage.GetPrimAtPath(path)
            if prim.IsA(UsdGeom.Mesh):
                return True
        return False
class CustomScene:
    def __init__(self, desc):
        usd_context_name = desc.get("usd_context_name")
        self.__transform_manip_override = CustomPrimTransformManipulator(
            usd_context_name=usd_context_name, viewport_api=desc.get("viewport_api")
        )
    def destroy(self):
        if self.__transform_manip_override:
            self.__transform_manip_override.destroy()
            self.__transform_manip_override = None
# register the custom scene to make the custom manipulator could works
scene = RegisterScene(CustomScene, "omni.kit.manipulator.custom")
# relase and destroy the custom scene
scene = None
Toggle Transform Manipulator Toolbar#
import carb.settings
# Get the settings interface
settings = carb.settings.get_settings()
# Toggle the visibility of the transform manipulator toolbar
toolbar_enabled = settings.get("/exts/omni.kit.manipulator.prim.core/tools/enabled")
settings.set("/exts/omni.kit.manipulator.prim.core/tools/enabled", not toolbar_enabled)