在我使用Maya API开发的cpp插件中,我在initializePlugin函数中注册了一个自定义MPxTransform节点:
status=pluginFn.registerTransform("mympxtransform",
myMPxTransformClass::id,
&myMPxTransformClass::creator,
&myMPxTransformClass::initialize,
&myMPxTransformMatrixClass::creator,
myMPxTransformMatrixClass::id);
然后以编程方式创建节点:
MDagModifier mdagmod;
MObject MyMObject;
MyMObject=mdagmod.createNode("mympxtransform",MObject::kNullObj,&status);
我可以在大纲中看到正确创建的节点 但是现在,我如何从获得的MyMObject访问我的自定义myMPxTransformClass?
答案 0 :(得分:1)
你只需要这样做:
Therapist
1)我们在这里做的基本上是创建类'类型的指针,并为其创建类型指针到创建的myMPxTransformClass* newDerived = (myMPxTransformClass*)&transformedObj; // 1)
// For debugging
MGlobal::displayInfo(newDerived->className());
。编译器不允许使用类型转换MObject
本身,但可以将指针类型转换为类的指针(MObject
)。
然后我们可以使用指针来访问类的方法等等。
P.S。对于myMPxTransformClass*
,尝试直接投射dynamic_cast
将无效,因为MObject
不是多态类型(故意)。
另一方面,我想补充一下。 这主要是我的观点。由于我不知道您要对代码执行什么操作,请谨慎使用此建议。
根据Maya的核心原则,
您永远不会在Maya中访问节点/
MObject
的成员函数。
一旦创建,它完全由Maya控制。您可以(有点)控制它的唯一方法是使用Maya提供的函数集(MObject
类)作为该节点类型(在您的情况下为MFn
集,因为您的节点是MFnTransform
是一个转换节点。)
如果您有可能希望以编程方式操作和操作的类数据成员,则必须为它们设置实际的Maya属性(从而将它们公开给Maya)。然后,您将能够将它们设为kPluginTransformNode
并完成您的工作。
查看您的代码,我觉得您主要打算生成两个组件,一个节点(即您的自定义MPlugs
);和函数类(即MPxTransform
)对你的节点做一些事情。我建议将插件分成两个独立的组件:节点和命令。这样就明确分离了责任。因为,就目前而言,只需加载插件即可创建节点并对其进行操作。用户可能会对可能发生的事情感到困惑。如果将它们分成节点和执行该操作的命令,则可以按用户认为合适的方式使用它们。该命令可以是用户使用插件的入口点。
希望这有帮助!
答案 1 :(得分:1)
以下是使用api的另一种方式:
myMPxTransformClass* node= (myMPxTransformClass*)(MFnDependencyNode(myMObject).userNode());