C++ Usage Examples#
Example C++ Command#
class TestCppCommand : public Command
{
public:
static carb::ObjectPtr<ICommand> create(const char* extensionId,
const char* commandName,
const carb::dictionary::Item* kwargs)
{
return carb::stealObject<ICommand>(new TestCppCommand(extensionId, commandName, kwargs));
}
TestCppCommand(const char* extensionId, const char* commandName, const carb::dictionary::Item* kwargs)
: Command(extensionId, commandName)
{
if (carb::dictionary::IDictionary* iDictionary = carb::dictionary::getDictionary())
{
m_x = iDictionary->getAsInt(iDictionary->getItem(kwargs, "x"));
m_y = iDictionary->getAsInt(iDictionary->getItem(kwargs, "y"));
}
}
void doCommand() override
{
s_resultList.append(m_x);
s_resultList.append(m_y);
}
void undoCommand() override
{
s_resultList.attr("pop")();
s_resultList.attr("pop")();
}
private:
int32_t m_x = 0;
int32_t m_y = 0;
};
Registering C++ Commands#
auto commandBridge = carb::getCachedInterface<omni::kit::commands::ICommandBridge>());
commandBridge->registerCommand("omni.kit.command_tests", "RegisteredFromCppCommand", TestCppCommand::create);
// Note the command name (in this case "RegisteredFromCppCommand") is arbitrary and does not need to match the C++ class
Executing Commands From C++#
auto commandBridge = carb::getCachedInterface<omni::kit::commands::ICommandBridge>());
// Create the kwargs dictionary.
auto iDictionary = carb::getCachedInterface<carb::dictionary::IDictionary>();
carb::dictionary::Item* kwargs = iDictionary->createItem(nullptr, "", carb::dictionary::ItemType::eDictionary);
iDictionary->makeIntAtPath(kwargs, "x", 7);
iDictionary->makeIntAtPath(kwargs, "y", 9);
// Execute the command using its name...
commandBridge->executeCommand("RegisteredFromCppCommand", kwargs);
// or without the 'Command' postfix just like Python commands...
commandBridge->executeCommand("RegisteredFromCpp", kwargs);
// or fully qualified if needed to disambiguate (works with or without the 'Command)' postfix.
commandBridge->executeCommand("omni.kit.command_tests", "RegisteredFromCppCommand", kwargs);
// The C++ command can be executed from Python exactly like any Python command,
// and we can also execute Python commands from C++ in the same ways as above:
commandBridge->executeCommand("RegisteredFromPythonCommand", kwargs);
// etc.
// Destroy the kwargs dictionary.
iDictionary->destroyItem(kwargs);
Undo/Redo Commands From C++#
auto commandBridge = carb::getCachedInterface<omni::kit::commands::ICommandBridge>());
// It doesn't matter whether the command stack contains Python commands, C++ commands,
// or a mix of both, and the same stands for when undoing/redoing commands from Python.
commandBridge->undoCommand();
commandBridge->redoCommand();
Deregistering C++ Commands#
auto commandBridge = carb::getCachedInterface<omni::kit::commands::ICommandBridge>());
commandBridge->deregisterCommand("omni.kit.command_tests", "RegisteredFromCppCommand");