Поведение API Maya отличается, если выполняется через кнопку или timechange

У меня есть плагин Maya в C ++. В этом плагине функция timeChange запускается всякий раз, когда время изменяется в Maya.

Я хочу создать определенную форму сетки при достижении заданного времени. Форма создана правильно, но при желании назначить шейдеру фигуру, она говорит, что форма не может быть найдена. Повторное выполнение назначения с помощью кнопки или через интерфейс MEL работает правильно.

Алгоритм заключается в следующем:


Когда это не удается:

— Изменение времени

— Событие сработало (статическая функция)

— Форма создана

— Назначение шейдера через API с помощью команды mel -> Error

— Назначение шейдера через интерфейс с той же командой mel -> Works


Когда это работает:

— Функция нажата кнопкой

— Форма создана

— Назначение шейдера через API командой mel -> Works

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
}

Как правильно назначить мой шейдер в функции, запускаемой по событию?

0

Решение

Это звучит странно, но главная проблема в том, что вы не вызвали MDGModifier :: doIt (), чтобы заставить Maya обновить свои внутренние состояния, прежде чем пытаться создать больше соединений. И вместо этого я бы использовал MDagModifier :: createNode () для захвата его в правильный стек отмены при вызове функции doIt (). То, как вы это делаете, заключается в том, что вы создаете шаг отмены для каждого, в то время как вы, безусловно, хотите захватить все в одном. MDagModifier является производной от MDGModifier, поэтому он также имеет функцию doIt (). Поскольку иногда сложнее создавать соединения шейдеров / групп, вызов MEL — это хорошо, но вызовите doIt () раньше, это должно решить вашу проблему. Если нет, дайте мне знать, и я напишу код для демонстрации этого.

0

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

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

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