1

C++ API を使用して Maya プラグインを作成しようとしています。このプラグインは、選択範囲内のメッシュを識別し (何かを計算し)、それらを削除してから、新しいメッシュをシーンに挿入します。

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アクションを適切に元に戻すにはどうすればよいですか?

4

0 に答える 0