Usage Examples#

Get Adapter Registry and Register Stage Adapter#

from omni.kit.property.adapter.core import get_adapter_registry, StageAdapter, PropertyType
from pxr import Usd

# Get the global adapter registry instance
registry = get_adapter_registry()

# Create a custom stage adapter by inheriting from StageAdapter
class MyCustomStageAdapter(StageAdapter):
    def __init__(self, stage):
        super().__init__(stage)
        self._name = "my_custom_adapter"
        self._priority_read = 100
        self._priority_write = 100

    @property
    def name(self):
        return self._name

    @property
    def priority_read(self):
        return self._priority_read

    @property
    def priority_write(self):
        return self._priority_write

    def GetPrimAtPath(self, path):
        return self.stage.GetPrimAtPath(path)

    def GetAttributeAtPath(self, path):
        return self.stage.GetAttributeAtPath(path)

    def CreateChangeTracker(self, attr_names, prim_paths, callback):
        # Implementation would create a change tracker
        pass

    def convert_data(self, data, dst_adapter_name):
        # Implementation would convert data between adapter formats
        return data

    def resolve_path_array(self, path, resolve_path, path_list, index):
        # Implementation would resolve path arrays
        pass

    def get_notice_paths(self, stage, notice):
        # Implementation would extract notice paths
        return []

# Register the custom stage adapter
registry.register_stage_adapter("my_custom_adapter", MyCustomStageAdapter)

# Get all registered adapters
adapters_dict = registry.registered_adapters
print(f"Registered adapters: {list(adapters_dict.keys())}")

Create Property Adapters#

from omni.kit.property.adapter.core import AttributeAdapter, PrimAdapter, PropertyType
from pxr import Usd, Sdf

# Create a custom attribute adapter
class MyAttributeAdapter(AttributeAdapter):
    def __init__(self, attribute):
        super().__init__(attribute)

    def GetPrim(self):
        # Return the prim that owns this attribute
        return self.attribute.GetPrim()

    def GetPropertyType(self):
        # Return the property type for this attribute
        return PropertyType.ATTRIBUTE

# Create a custom prim adapter
class MyPrimAdapter(PrimAdapter):
    def __init__(self, prim):
        super().__init__(prim)

    def custom_method(self):
        return f"Custom method for prim: {self.prim.GetPath()}"

# Use PropertyType enum
print(f"Attribute property type: {PropertyType.ATTRIBUTE}")
print(f"Relationship property type: {PropertyType.RELATIONSHIP}")

# Example usage with USD objects (assuming you have a stage and prim)
stage = Usd.Stage.CreateInMemory()
prim = stage.DefinePrim("/MyPrim", "Cube")
attribute = prim.CreateAttribute("myAttr", Sdf.ValueTypeNames.Float)

# Create adapter instances
attr_adapter = MyAttributeAdapter(attribute)
prim_adapter = MyPrimAdapter(prim)

Monitor Registry Events#

from omni.kit.property.adapter.core import get_adapter_registry, RegistryEventType, StageAdapter, RegistryGlobalEvent
from carb.eventdispatcher import get_eventdispatcher
from pxr import Usd

# Get the adapter registry
registry = get_adapter_registry()

# Define callback for registry events
def on_registry_event(event):
    print(f"Registry event received: {event.event_name}")
    if hasattr(event, 'payload') and event.payload:
        print(f"Event payload: {event.payload}")

# Subscribe to registry events using event dispatcher
event_dispatcher = get_eventdispatcher()

# Subscribe to adapter added events
adapter_added_sub = event_dispatcher.observe_event(
    observer_name="my_registry_observer",
    event_name=RegistryGlobalEvent.ADAPTER_ADDED,
    on_event=on_registry_event
)

# Subscribe to adapter removed events
adapter_removed_sub = event_dispatcher.observe_event(
    observer_name="my_registry_observer",
    event_name=RegistryGlobalEvent.ADAPTER_REMOVED,
    on_event=on_registry_event
)

# Create a simple test adapter
class TestAdapter(StageAdapter):
    def __init__(self, stage):
        super().__init__(stage)

    @property
    def name(self):
        return "test_adapter"

    @property
    def priority_read(self):
        return 50

    @property
    def priority_write(self):
        return 50

    def GetPrimAtPath(self, path):
        return self.stage.GetPrimAtPath(path)

    def GetAttributeAtPath(self, path):
        return self.stage.GetAttributeAtPath(path)

    def CreateChangeTracker(self, attr_names, prim_paths, callback):
        pass

    def convert_data(self, data, dst_adapter_name):
        return data

    def resolve_path_array(self, path, resolve_path, path_list, index):
        pass

    def get_notice_paths(self, stage, notice):
        return []

# Register adapter (this will trigger ADAPTER_ADDED event)
registry.register_stage_adapter("test_adapter", TestAdapter)

# Unregister adapter (this will trigger ADAPTER_REMOVED event)
registry.unregister_stage_adapter("test_adapter")

Instantiate Stage Adapters#

from omni.kit.property.adapter.core import get_adapter_registry, StageAdapter
from pxr import Usd, Sdf

# Get the adapter registry
registry = get_adapter_registry()

# Create an in-memory USD stage
stage = Usd.Stage.CreateInMemory()

# Create some basic prims and attributes
prim = stage.DefinePrim("/World", "Xform")
cube_prim = stage.DefinePrim("/World/Cube", "Cube")
cube_prim.CreateAttribute("size", Sdf.ValueTypeNames.Float).Set(2.0)

# Instantiate all registered stage adapters for this stage
adapter_instances = registry.instantiate_all_stage_adapters(stage)

print(f"Created {len(adapter_instances)} adapter instances")
for adapter_name, adapter_instance in adapter_instances.items():
    print(f"Adapter: {adapter_name}, Type: {type(adapter_instance)}")
    print(f"  Name: {adapter_instance.name}")
    print(f"  Read Priority: {adapter_instance.priority_read}")
    print(f"  Write Priority: {adapter_instance.priority_write}")

    # Test basic adapter functionality
    test_prim = adapter_instance.GetPrimAtPath(Sdf.Path("/World/Cube"))
    if test_prim:
        print(f"  Successfully retrieved prim: {test_prim.GetPath()}")