Как отменить удаление сеток с помощью API Maya?

Я пытаюсь написать плагин Maya с использованием API C ++, который будет определять сетки в выделении (вычислять что-то), удалять их и затем вставлять новую сетку в сцену.

Я собираю выбранные сетки так же, как objExporter Пример плагина. Я использую MDagModifier удалить узлы сетки и попытка отменить эти изменения. Но undoIt не работает…

Вот мой упрощенный код:

#include <maya/MArgList.h>
#include <maya/MObject.h>
#include <maya/MGlobal.h>
#include <maya/MPxCommand.h>
#include <maya/MDagModifier.h>

class LibiglBoolean : public MPxCommand
{
private:
MDagModifier dgModifier;
public:
LibiglBoolean() {};
virtual MStatus doIt(const MArgList& argList);
virtual MStatus redoIt();
virtual MStatus undoIt();
virtual bool isUndoable() const;
static void* creator();
};

а также

#include "LibiglBoolean.h"#include <maya/MDagPath.h>
#include <maya/MFnDagNode.h>
#include <maya/MFnPlugin.h>
#include <maya/MItDag.h>
#include <maya/MItSelectionList.h>
#include <maya/MSelectionList.h>

void* LibiglBoolean::creator() { return new LibiglBoolean; }

MStatus LibiglBoolean::doIt(const MArgList& /*argList*/)
{
return redoIt();
}

MStatus LibiglBoolean::redoIt()
{
MSelectionList slist;
MGlobal::getActiveSelectionList(slist);
MItSelectionList iter(slist);
for(MItDag dagIterator(MItDag::kDepthFirst, MFn::kInvalid);
!iter.isDone();
iter.next())
{
MDagPath objectPath;
iter.getDagPath( objectPath );
dagIterator.reset(objectPath.node());

// DAG iteration beginning at at selected node
for ( ; !dagIterator.isDone(); dagIterator.next() )
{
MDagPath dagPath;
dagIterator.getPath(dagPath);
// skip over intermediate objects
MFnDagNode dagNode(dagPath);
if(dagNode.isIntermediateObject())
{
continue;
}else if((dagPath.hasFn(MFn::kMesh)) && (dagPath.hasFn(MFn::kTransform)))
{
continue;
}else if( dagPath.hasFn(MFn::kMesh))
{
dgModifier.deleteNode(dagPath.node());
}
}
}
dgModifier.doIt();
return MS::kSuccess;
}

MStatus LibiglBoolean::undoIt()
{
return dgModifier.undoIt();
}

bool LibiglBoolean::isUndoable() const
{
return true;
}

MStatus initializePlugin(MObject obj)
{
MFnPlugin plugin(obj, "Name", "1.0", "Any");
return plugin.registerCommand("LibiglBoolean", LibiglBoolean::creator);
}

MStatus uninitializePlugin(MObject obj)
{
MFnPlugin plugin(obj);
return plugin.deregisterCommand("LibiglBoolean");
}

(Я хотел бы придерживаться C ++ API и избегать интерфейсов MEL / Python).

Как я могу отменить deleteNode действия правильно?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]