如何在 Maya API 中从 MObject 获取节点 class 实例
How to get Node class instance from MObject in Maya API
在我用 Maya 开发的 cpp 插件中 API,我在 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?
这个问题的解决方案:
您只需要做:
myMPxTransformClass* newDerived = (myMPxTransformClass*)&transformedObj; // 1)
// For debugging
MGlobal::displayInfo(newDerived->className());
1) 我们在这里所做的基本上是创建一个 pointer 你的 class' 类型并分配给它铸造的类型 pointer 到创建的 MObject
。编译器不允许类型转换 MObject
本身,但是指向它的 指针 可以类型转换为您的 class' 指针(myMPxTransformClass*
).
然后我们可以只使用指针访问 class' 方法等。
p.s。在 dynamic_cast
的情况下,尝试直接转换 MObject
是行不通的,因为 MObject
不是多态类型(有意)。
侧面推荐:
附带说明一下,我想补充一点。 这主要是我的意见。由于我不知道你想用你的代码做什么,请对这个建议持保留态度。
根据core Maya的原理,
Thou shall never access member functions of a node/MObject
in Maya.
一旦创建,就完全由 Maya 控制。您可以(有点)控制它的唯一方法是使用 Maya 为该节点类型提供的函数集(MFn
类)(在您的情况下 MFnTransform
集,因为您的节点是 kPluginTransformNode
这是一个转换节点)。
如果您有 class 个数据成员,您可能希望以编程方式对其进行操作和操作,则必须使它们成为该节点的实际 Maya 属性(从而将它们暴露给 Maya)。然后,您将能够以 MPlugs
的形式获取它们并执行您的操作。
看你的代码,我觉得你的主要目标是生产两个组件,一个节点(即你的自定义MPxTransform
);和一种 class 的仿函数(即 UnitClass
),它可以对你的节点做一些 with/to 的事情。我建议将您的插件拆分为两个独立的组件:一个节点和一个命令。这样就有明确的职责分离。因为,就目前而言,只需加载您的插件即可创建节点并对其进行操作。用户可能对可能发生的事情感到困惑。如果您将它们分成一个节点和一个执行此操作的命令,则可以按照用户认为合适的方式以多种不同方式使用它们。该命令可以是用户使用您的插件的入口点。
希望对您有所帮助!
这是使用 api 的另一种方法:
myMPxTransformClass* node= (myMPxTransformClass*)(MFnDependencyNode(myMObject).userNode());
在我用 Maya 开发的 cpp 插件中 API,我在 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?
这个问题的解决方案:
您只需要做:
myMPxTransformClass* newDerived = (myMPxTransformClass*)&transformedObj; // 1)
// For debugging
MGlobal::displayInfo(newDerived->className());
1) 我们在这里所做的基本上是创建一个 pointer 你的 class' 类型并分配给它铸造的类型 pointer 到创建的 MObject
。编译器不允许类型转换 MObject
本身,但是指向它的 指针 可以类型转换为您的 class' 指针(myMPxTransformClass*
).
然后我们可以只使用指针访问 class' 方法等。
p.s。在 dynamic_cast
的情况下,尝试直接转换 MObject
是行不通的,因为 MObject
不是多态类型(有意)。
侧面推荐:
附带说明一下,我想补充一点。 这主要是我的意见。由于我不知道你想用你的代码做什么,请对这个建议持保留态度。
根据core Maya的原理,
Thou shall never access member functions of a node/
MObject
in Maya.
一旦创建,就完全由 Maya 控制。您可以(有点)控制它的唯一方法是使用 Maya 为该节点类型提供的函数集(MFn
类)(在您的情况下 MFnTransform
集,因为您的节点是 kPluginTransformNode
这是一个转换节点)。
如果您有 class 个数据成员,您可能希望以编程方式对其进行操作和操作,则必须使它们成为该节点的实际 Maya 属性(从而将它们暴露给 Maya)。然后,您将能够以 MPlugs
的形式获取它们并执行您的操作。
看你的代码,我觉得你的主要目标是生产两个组件,一个节点(即你的自定义MPxTransform
);和一种 class 的仿函数(即 UnitClass
),它可以对你的节点做一些 with/to 的事情。我建议将您的插件拆分为两个独立的组件:一个节点和一个命令。这样就有明确的职责分离。因为,就目前而言,只需加载您的插件即可创建节点并对其进行操作。用户可能对可能发生的事情感到困惑。如果您将它们分成一个节点和一个执行此操作的命令,则可以按照用户认为合适的方式以多种不同方式使用它们。该命令可以是用户使用您的插件的入口点。
希望对您有所帮助!
这是使用 api 的另一种方法:
myMPxTransformClass* node= (myMPxTransformClass*)(MFnDependencyNode(myMObject).userNode());