Usage Examples#
Get and Set Transformations for Primitives Using Data Accessor#
# This snippet is adjusted for clarity and ensures that the FabricDataAccessor is correctly instantiated with a model (stage) that exists.
from omni.kit.manipulator.prim.fabric import FabricDataAccessor
from usdrt.Sdf import Path
from usdrt.Usd import TimeCode
import omni.usd
# Ensure the USD context is available and correctly referenced
context = omni.usd.get_context()
stage = context.get_stage() # Obtain the USD stage directly from the context
# Instantiate the data accessor for a given USD context
fabric_data_accessor = FabricDataAccessor(usd_context_name="default", model=stage) # Pass the stage as the model
# Get the SRT (scale, rotation, translation) of a primitive at a specified time
prim_path = Path("/World/MyPrim")
time = TimeCode.Default()
scale, rotation, rotation_order, translation = fabric_data_accessor.get_local_transform_SRT(
prim=fabric_data_accessor.get_prim_at_path(prim_path),
time=time
)
# Print the retrieved transformation components
print(f"Scale: {scale}, Rotation: {rotation}, Rotation Order: {rotation_order}, Translation: {translation}")
# Set a new transformation for the primitive (example: translate by 10 units along X axis)
fabric_data_accessor.do_transform_selected_prims(
paths=["/World/MyPrim"],
paths_c=[prim_path.pathC.path],
new_translations=[10, 0, 0], # New translation
new_rotation_eulers=[0, 0, 0], # Keep existing rotation
new_rotation_orders=[rotation_order[0], rotation_order[1], rotation_order[2]], # Keep existing rotation order
new_scales=[scale[0], scale[1], scale[2]] # Keep existing scale
)
Register and Unregister Fabric Data Accessor#
# This snippet is correct as provided and correctly simulates the startup and shutdown process for the extension.
from omni.kit.manipulator.prim.fabric import FabricDataAccessor
from omni.kit.manipulator.prim.core import get_prim_data_accessor_registry
# get the global data accessor registry
prim_data_accessor_registry = get_prim_data_accessor_registry()
# registers the Fabric data accessor from the global registry.
prim_data_accessor_registry.register_data_accessor(FabricDataAccessor, "FABRIC")
# unregisters the Fabric data accessor from the global registry.
prim_data_accessor_registry.unregister_data_accessor("FABRIC")
Transform Multiple Primitives with Given SRT (Scale, Rotation, Translation)#
# This snippet is correct as provided; the error mentioned does not directly correspond to the code provided.
import asyncio
from omni.kit.manipulator.prim.fabric import TransformMultiPrimsFabricSRT
from usdrt.Sdf import Path
from usdrt.Gf import Vec3d, Vec3i
from usdrt.Usd import TimeCode
# Define the paths to the primitives in the stage
paths = [Path("/World/Prim1"), Path("/World/Prim2")]
# Define the new transformations for each primitive
new_translations = [Vec3d(10, 0, 0), Vec3d(0, 20, 0)]
new_rotation_eulers = [Vec3d(0, 45, 0), Vec3d(90, 0, 0)]
new_rotation_orders = [Vec3i(0, 1, 2), Vec3i(0, 1, 2)]
new_scales = [Vec3d(1, 1, 1), Vec3d(2, 2, 2)]
# Create and execute the command to transform the primitives
transform_command = TransformMultiPrimsFabricSRT(
paths=paths,
new_translations=new_translations,
new_rotation_eulers=new_rotation_eulers,
new_rotation_orders=new_rotation_orders,
new_scales=new_scales,
time_code=TimeCode.Default()
)
# Use asyncio to run the command if it needs to be executed in an async context
asyncio.ensure_future(transform_command.do())
# To undo the transformation, simply call the undo method on the command
# Use asyncio to run the undo if it needs to be executed in an async context
asyncio.ensure_future(transform_command.undo())