如果通过按钮或时间更改执行,Maya API行为会有所不同

时间:2016-02-01 14:04:28

标签: c++ plugins maya mel

我在c ++中有一个Maya插件。在此插件中,只要Maya中的时间发生变化,就会触发timeChange函数 我想在达到给定时间时创建特定的网格形状。正确创建了形状,但是当想要为形状指定着色器时,它会告诉无法找到形状。通过按钮或MEL接口重新执行分配可正常工作 算法如下:

失败时:
- 时间变化
- 事件功能触发(静态功能)
- 形状创造
- 通过API使用mel命令分配着色器 - >错误
- 通过具有相同mel命令的界面分配着色器 - >作品

当它工作时:
- 按钮单击功能已解雇
- 形状创造
- 通过API使用mel命令分配着色器 - >作品

void MyClass::CreateOneShape()
{
    MDagPath thisDagNode;
    MFnDagNode dagPath;

    MString rootName;

    // CREATING SHAPE

    log("Will create shape");

    MFnDependencyNode fnPolySp;
    MObject objPolySp = fnPolySp.create("polyPrimitiveMisc");
    MFnDagNode fnPolyTrans;
    MObject objPolyTrans = fnPolyTrans.create("transform");
    MFnDagNode fnPolyShape;
    MObject objPolyShp = fnPolyShape.create("mesh", objPolyTrans,&status);

    rootName="Unit_";

    fnPolyShape.setName(rootName+MString()+UnitId+"_Shape");
    MFnTransform m(objPolyTrans);
    m.setName(rootName+MString()+UnitId);

    MFnDagNode n(theMesh,&status);
    MDagPath dp;
    status=n.getPath(dp);
    MFnMesh fn(dp,&status);
    MObjectArray shaders;

    MIntArray indices;
    status=fn.getConnectedShaders(0,shaders,indices);
    for (int sh=0;sh<shaders.length();sh++)
    {
       MFnDependencyNode dep(shaders[sh]);
// Below is the command that fails when called in an event function and works when called via a button function.

       MString cmd="select -cl ; select -r "+rootName+MString()+UnitId+"_Shape.f[" + MString()+int(surfaceNb) + "] ; sets -e -forceElement " + dep.name() + ";";

       MGlobal::executeCommand(cmd);
       surfaceNb++;
    }
}

void timeChanged(MyClass *clientData)
{
    clientData->CreateOneShape(); --> Gives error that shape cannot be found
}

void buttonClicked()
{
    CreateOneShape(); --> Works fine
}

如何在事件触发函数中正确分配我的着色器?

1 个答案:

答案 0 :(得分:0)

主要听起来很奇怪,但主要问题是你没有调用MDGModifier :: doIt()来强制Maya在尝试构建更多连接之前刷新其内部状态。我会在调用doIt()函数时使用MDagModifier :: createNode()代替在正确的撤销堆栈中捕获它。你这样做的方法是为每个创建一个撤消步骤,而你当然希望将所有步骤捕获到一个中。 MDagModifier是MDGModifier的衍生物,因此它也具有doIt()函数。因为有时创建着色器/组连接更难,所以调用MEL很好,但之前调用doIt(),这应该可以解决您的问题。如果没有让我知道,我会写一些代码来演示。