我正在更新我的命令以使用MDGModifier :: commandToExecute而不是MGlobal :: executeCommand来提供撤消机制。问题是我的命令序列依赖于从以前的命令返回的值,并且由于MDGModifier保存所有命令而不是执行它们,我对如何做到这一点感到迷茫......例如:
MStringArray commandResult;
MGlobal::executeCommand("polyCube", commandResult);
MGlobal::executeCommand( "polyTriangulate " + commandResult[0]);
由于MDGModifier :: commandToExecute没有给我一个返回值(commandResult),我会传递给第二个命令?我想这很简单,人们已经明白了。任何帮助是极大的赞赏!谢谢。
答案 0 :(得分:1)
您可以在命令中使用多个MDGModifier实例。在命令的命令中,只要子命令依赖于先前子命令创建的DG节点的名称,就在第一个MDGModifier上安排创建DG节点,调用第一个MDGModifier的doIt,然后安排第二个使用DG节点现在已知的名称在第二个MDGModifier上执行子命令,并调用第二个MDGModifier的doIt。你的命令redoIt只是以相同的顺序在两个MDGModifiers上调用doIt,而你的命令的undoIt在两个MDGModifiers上调用undoIt,但顺序相反。
在您给出的示例中,您的第一个子命令是polyCube,它创建多个DG节点,因此使用MDGModifier :: commandToExecute调度polyCube comamnd是以可撤销方式实现该目标的最简单方法。但是与MDGModifer :: createNode或MDagModifier :: createNode不同,它不会为您提供任何引用已创建节点的MObject,并且您需要获取该名称。要获得这样的MObject,您需要在调用MDGModfier的doIt之前使用MDGMessage :: addNodeAddedCallback添加回调,然后将其删除。
警告:未经测试!
class MyCommand: public MPxCommand
{
...
MDGModifier m_modifier1;
MDGModifier m_modifier2;
static void NodeAdded( MObject& node, void* clientData )
{
if ( node.hasFn( MFn::kMesh ) )
{
*static_cast< MObject* >( clientData ) = node;
}
}
MStatus doIt( const MArgList& args )
{
MObject node;
MFnDependencyNode nodeFn;
MCallbackId nodeAddedId;
nodeAddedId = MDGMessage::addNodeAddedCallback( NodeAdded, &node );
m_modifier1.commandToExecute( "polyCube" );
m_modifier1.doIt();
MMessage::removeCallback( nodeAddedId );
nodeFn.setObject( node );
m_modifier2.commandToExecute( "polyTriangulate " + nodeFn.name() );
m_modifier2.doIt();
return MStatus::kSuccess;
}
MStatus redoIt()
{
m_modifier1.doIt();
m_modifier2.doIt();
return MStatus::kSuccess;
}
MStatus undoIt()
{
m_modifier2.undoIt();
m_modifier1.undoIt();
return MStatus::kSuccess;
}
...
};