Maya C++开发 in VS2017

API, HelloWorld, plugin

Posted by elmagnifico on December 23, 2017

Foreword

maya除了可以直接使用MEL和Python的脚本语言(Maya Commands)来开发,还可以使用C++ API或者python API,又或者C#

SMMS

从本质上说python API 是基于C++ API来的,而C#的API基本就是C++ API

在这里面C++无疑是速度最快的,并且最接近maya的,而python则是速度最慢的。

要开发maya c++ plugin插件,需要先搭好环境,这里记录两种初始化环境的方式。

Maya Developer Kit (aka devkit)

首先自从maya2016以后开始,maya就不自带开发套件了,需要单独从官网的APP商城里下载

https://apps.autodesk.com/MAYA/en/Home/Index 或者 https://www.autodesk.com/developer-network/platform-technologies/maya

商城里搜索develope 就能找到2016版以后的开发套件,需要与你开发的版本一一对应,否则可能会有无法解决的错误。

MayaPluginWizard

MayaPluginWizard 这个比较简单,就是普通Visual Studio中新建项目时的项目引导,或者说工程模板,帮助你快速建立项目,而与maya相关的配置他都帮你配好了,非常好用。

Visual Studio的版本更新比较快,而maya自然不可能跟上最新版的VS,比如maya2017使用的是vs2012,而maya2018使用的是vs2015,所以经常会遇到问题,使用这种方法,就需要和maya相配套的vs.

使用方法

下载完Maya2017_DEVKIT_Windows之后,解压下面目录中的内容

devkitBase\devkit\pluginwizard\MayaPluginWizard2.0
vs2012

将顶层目录MayaPluginWizard整个复制到 D:\Microsoft Visual Studio 11.0\VC\VCWizards(你自己的安装路径)

vs2017

将顶层目录MayaPluginWizard整个复制到 D:\Visual Studio 2017\VC\VCWizards(你自己的安装路径)

vs2012

然后将MayaPluginWizard目录下的这三个文件全都放到 D:\Microsoft Visual Studio 11.0\VC\vcprojects 目录下(你自己的安装路径)。

MayaPluginWizard.ico
MayaPluginWizard.vsz
MayaPluginWizard.vsdir
vs2017

然后将MayaPluginWizard目录下的这三个文件全都放到 D:\Visual Studio 2017\Common7\IDE\VC\vcprojects 目录下(你自己的安装路径)。

MayaPluginWizard.ico
MayaPluginWizard.vsz
MayaPluginWizard.vsdir

然后重新打开一下VS和MAYA,基本就可以直接通过项目模板,建立一个简单的MAYA插件的工程了,其相关的所有配置都给你配置好了。

SMMS

然后选择maya版本,这里最好是使用 Custom location,不然一会还要手动设置maya的库文件路径什么的

SMMS

选择模板类型,是mel命令还是node节点等

SMMS

最后选择是要用的库都有哪些

SMMS

然后就能正常编译了,同时使用cout流输出也是会自动输出到 output window,都是正常的

Maya Plug-in Tutorials

MayaPluginWizard 可能vs版本不同或者更新的版本导致不能用,这里用另一种方式,手动配置工程,完全从头开始.

使用方法

http://blog.josephkider.com/2015/08/20/creating-your-first-maya-plug-in-in-visual-studio/#comment-274

具体流程,参见上面的博文.他是基于maya2016并且使用Visual Studio 2015 来创建的.整个配置流程照搬到maya2017以及Visual Studio 2017也是可以使用的.

唯一遇到的问题是输入输出流定向好像出了问题,使用maya的流文件,无法从脚本编辑器或者是Output Windows中看到输出信息,加上断点,可以看到代码执行了,但是内容输出到哪去了就不知道了.

#include <maya/MIOStream.h>

cout<<"Hello World"<<endl;

而使用下面的输出方式,则都能在脚本编辑器中看到正确的输出.

setResult("helloworld command executed!\n");
MGlobal::displayInfo("Hello world!~!!");

当然如果嫌麻烦,也可以直接使用博文中的工程,其git在下面,但是使用他的工程就需要配置一下环境变量, MAYA_PATH,或者是手动修改工程中lib和include的搜索目录.

https://github.com/hepcatjk/maya_tutorials

不过他的工程不能直接调试,调试需要再配置一下.

打开他的工程过程中可能会提示工程版本更新等信息,更新不更新都可以正常运行.

Debug

使用VS直接调试maya插件,需要在工程配置中的Debugging中,切换到远程Windows调试器,然后下面的命令指定到maya.exe的位置,比如:

D:\Autodesk\Maya2017\bin\maya.exe

附加选项也要选择是.

每次开始调试前,一定要确保maya已经打开,并且maya已经加载完成,可以操作为止,否则会报异常.

调试的时候也要切换到远程调试模式下,再按F5.

Cout

之前一直有maya中cout无法正常工作,或者是在某些条件下又能正常工作

  • Debug/Release
  • 管理员模式/非管理员模式
  • 2016版本/2013版本/2018版本等等

实际上这个情况并不明确,所以这里通过重新向流来保证Cout一定能正常工作

我工作电脑上cout正常工作,编译出来的插件也是正常工作的,但是家里电脑上编译出来的不能正常输出信息,在插件的初始化地方直接重定向流,可以确保不同环境下cout也能正常工作。

// rebuf the stream to the maya output windows
// without this some envs cound now cout anything
std::cout.set_rdbuf(MStreamUtils::stdOutStream().rdbuf());
std::cerr.set_rdbuf(MStreamUtils::stdErrorStream().rdbuf());

Summary

自己手动配置maya工程的方式在maya的help中并没有提及,网上能找到的资料都很有限,而AutoDesk论坛上关于VS和maya的问题基本上都是被要求切换到对应的VS版本来解决了,也没有人说具体怎么配置.

上面提到的流定向的问题,在Maya2017配合VS2017无输出的情况下,安装了VS2012版本,而然问题依旧,要解决这个问题最好是使用现成的工程模板或者说是从工程模板里反向找到缺少的设置。

Quote

http://help.autodesk.com/view/MAYAUL/2017/CHS/?guid=__files_API_Introduction_htm

http://blog.josephkider.com/2015/08/20/creating-your-first-maya-plug-in-in-visual-studio/#comment-274

https://nickcullen.net/blog/misc-tutorials/how-to-debug-a-maya-2016-c-plugin-using-visual-studio-2015/

https://beesoverdundee.wordpress.com/2015/04/02/tutorial-making-maya-2015-plugins-with-visual-studio/