--- title: Maya插件笔记 date: 2022-08-09 13:55:15 tags: Maya rating: ⭐️⭐️ --- # Maya2022文档地址 [Maya2022 C++ 文档](https://help.autodesk.com/view/MAYAUL/2022/ENU/?guid=Maya_SDK_cpp_ref_index_html) [Maya2022 Python1.0文档](https://help.autodesk.com/view/MAYAUL/2022/ENU/?guid=Maya_SDK_Maya_Python_API_Maya_Python_API_1_0_html) [Maya2022 Python2.0文档](https://help.autodesk.com/view/MAYAUL/2022/ENU/?guid=Maya_SDK_py_ref_index_html) # 设置开发环境 这里我比较推荐官方文档的设置方法:[Maya2022Devkit设置](https://help.autodesk.com/view/MAYAUL/2022/ENU/?guid=Maya_SDK_Setting_up_your_build_Windows_environment_64_bit_html) 主要的步骤是将各个版本的Devkit放到User文件夹中,并且在各个版本的Maya中添加Maya.env文件以及3个路径信息: > `MAYA_PLUG_IN_PATH=C:\Users\\devkitBase\plug-ins\plug-ins` `MAYA_SCRIPT_PATH=C:\Users\\devkitBase\plug-ins\scripts` `XBMLANGPATH=C:\Users\\devkitBase\plug-ins\icons` 之后设置CMake,将生成MLL与PDB放到`MAYA_PLUG_IN_PATH` 路径中即可。这样不会出现UAV导致的生成失败问题,以方便Maya插件的开发。 # 调试方法 ## 参考方法1 1. 在Visual Studio中以debug模式生成目标mll 2. 在Maya中加载此mll 3. ctrl+alt+p打开附加到进程,然后附加到Maya进程中 4. 建立断点(任何时候都可以) 5. 执行mll中的命令或节点,当遇到断点时会自动停下切换到VS中 或者在你的项目上右键点击Properties,Configuration Properties->Debugging里设置(之后按F5即可): - Command为Maya路径,比如`D:\Program Files\Autodesk\Maya2022\bin\maya.exe` - Attach为true ## 测试方法2 使用bat查看Log: ```cd /d D:/Program Files/Autodesk/Maya2020/bin/ mayabatch.exe -script D:/Work/MUTools/MUToolsUE/Plugins/MUTools/Mel/MayaDriverStartupScript.mel 127.0.0.1 8000 pause ``` # Maya ## MFnPlugin 在MStatus initializePlugin(MObject obj)中使用**MFnPlugin**对象对命令与节点进行注册,initializePlugin()会在插件加载后立即调用;在MStatus uninitializePlugin ( MObject obj )进行卸载,插件卸载时会调用uninitializePlugin()。 所有插件都必须实现initializePlugin()与uninitializePlugin()。 ## MPxCommand 自定义的命令需继承自该类,并且实现: - void* creator() - virtual [MStatus](https://help.autodesk.com/cloudhelp/2015/ENU/Maya-SDK/cpp_ref/class_m_status.html) [doIt](https://help.autodesk.com/cloudhelp/2015/ENU/Maya-SDK/cpp_ref/class_m_px_command.html#ade7d0a873cbe811d6eab464e695390a9) (const [MArgList](https://help.autodesk.com/cloudhelp/2015/ENU/Maya-SDK/cpp_ref/class_m_arg_list.html) &args) 其他可选虚函数: - virtual [MStatus](https://help.autodesk.com/cloudhelp/2015/ENU/Maya-SDK/cpp_ref/class_m_status.html) [undoIt](https://help.autodesk.com/cloudhelp/2015/ENU/Maya-SDK/cpp_ref/class_m_px_command.html#a0789a8d51244cad0495abb2b811c39db) () - virtual MStatus [redoIt](https://help.autodesk.com/cloudhelp/2015/ENU/Maya-SDK/cpp_ref/class_m_px_command.html#a3b583cbc082553f11853db459b2f7795) () - virtual bool [isUndoable](https://help.autodesk.com/cloudhelp/2015/ENU/Maya-SDK/cpp_ref/class_m_px_command.html#a2f6c567cc02d575ab14006d9c5e37761) () const - virtual bool [hasSyntax](https://help.autodesk.com/cloudhelp/2015/ENU/Maya-SDK/cpp_ref/class_m_px_command.html#a8121b9d1e18f95acf1f634e29e3b3d54) () const 返回结果则需要使用appendToResult()与setResult();实现完Command之后就可以在MEL中调用命令了。 ## DAG DAG名为有向非循环图(directed acyclic graph)。 - **DG** **node** - 基本上可以认为maya当中所有的node都是DG node,包括DAG node - **DAG** **node** - 只有两种DAG node,transform 和shape - shape永远是transform的child - 组transform+shape组成一组DAG 结构 在窗口->常规编辑器->Hypergraph:Connect中,选择选项->显示->形状节点就可以完整DAG。 **注意:一个DAG节点可以有多个DAG路径。** 因为DAG是图,而不是树,所以会出现一个子节点拥有一个父节点的情况。在Maya中就是实例化的情况(比如实例化复制某个模型),即多个transform节点将一个特定Node进行了多次形变。 以下代码将生成案例场景: ```ptrhon import maya.cmds as cmds; sphere1 = cmds.polySphere(r=1); sphere2 = cmds.polySphere(r=0.5); cmds.xform(sphere2[0], t=[0,1,0]); cmds.parent(sphere2[0],sphere1[0]) sphere3 = cmds.instance(sphere1[0]); cmds.xform(sphere3, t=[2,0,0], ro=[45,0,0]); cmds.xform(sphere2[0],t=[0,2,0]); ``` 显示sphere2的DAG路径: ```python import maya.OpenMaya as om; sel = om.MSelectionList(); sel.add(cmds.listRelatives(sphere2[0])[0]); shapeNode=om.MObject(); sel.getDependNode(0,shapeNode); paths=om.MDagPathArray(); om.MDagPath.getAllPathsTo(shapeNode,paths); for i in range(paths.length()):     print(paths[i].fullPathName()); ``` - [MFnDagNode](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_fn_dag_node.html)— 具有取得父节与父节点数量的方法。 - [MObject](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_object.html) dagRoot([MStatus](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_status.html) * _ReturnStatus_ = `NULL`) - bool [hasParent](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_fn_dag_node.html#ae44174b85fc62850f863823a9f9f418f) (const [MObject](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_object.html) &node, [MStatus](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_status.html) *ReturnStatus=NULL) const - bool [hasChild](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_fn_dag_node.html#a59dfb5113547bc4cb73fb1c030d3c6b9) (const [MObject](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_object.html) &node, [MStatus](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_status.html) *ReturnStatus=NULL) const - bool [isChildOf](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_fn_dag_node.html#ab1ed8580ddc4046557612745812564a7) (const [MObject](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_object.html) &node, [MStatus](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_status.html) *ReturnStatus=NULL) const - bool [isParentOf](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_fn_dag_node.html#afcdebae60da551fd16379fd296ffa1e3) (const [MObject](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_object.html) &node, [MStatus](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_status.html) *ReturnStatus=NULL) const - unsigned int [childCount](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_fn_dag_node.html#a7c6cdc0f5380b205fcf6e524e307b47f) ([MStatus](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_status.html) *ReturnStatus=NULL) const - bool [isInstanced](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_fn_dag_node.html#a6a7ad65572dca3e5cbeab283ffc9c90b) (bool indirect=true, [MStatus](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_status.html) *ReturnStatus=NULL) const - [MFnTransform](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_fn_transform.html)— 具有对节点进行形变操作的函数集(源自[MFnDagNode](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_fn_dag_node.html)),并具有获取和设置变换的方法,例如旋转、平移或缩放。 - [MFnNurbsSurface](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_fn_nurbs_surface.html)— 具有操作多种类型形状节点的函数集(也派生自[MFnDagNode](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_fn_dag_node.html),但不派生自[MFnTransform](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_fn_transform.html)),并具有获取和设置曲面 CV 等的方法。 - MItDag:为DAG迭代器,遍历方式有深度与广度。 - MItDependencyGraph:为DG迭代器。从指定的根节点或插头开始对依赖图(DG)节点或插头进行迭代。 - MItDependencyNodes:为依赖性节点迭代器。使用依赖性节点迭代器来遍历Maya的依赖性图中的所有节点。 - MDagPath:Dag路径存储。 - pop():取得上一层级路径。