在C++ API中嵌入MEL命令

在C++ API中嵌入MEL命令
MAYA的C++ API与MEL之间互为补充。我们可以在C++插件中嵌入MEL命令。MAYA的C++ API提供了MGlobal::executeCommand()接口,并有许多重载的版本,使用这个接口,我们可以轻松的将MEL命令嵌入插件中。
首先我们需要把MEL命令变成MString,再把这个MString填入MGlobal::executeCommand()中即可。下面是两个例子:
例1:
//假设场景中存在名为obj的物体
//duplicate -rr -n theTempObj obj
//上面的MEL语句是复制obj,并将复制得到的物体命名为theTempObj
//定义MString型变量 duplicateCommand
//并将duplicateCommand初始化为MEL命令
MString duplicateCommand("duplicate -rr -n theTempObj obj");
//执行MEL命令
MGlobal::executeCommand(duplicateCommand);
例2:
//float $pos[] =`xform –t –q –ws …`;
//上面MEL语句的作用是将查询到的物体的世界坐标存储到名为$pos的浮点数组中
//下面的C++ API实现了和上面的MEL语句几乎一样的功能。
//定义MString型变量bbCommand
MString bbCommand;
//将MEL语句赋予bbCommand
bbCommand = MString("xform -q -bb -ws ") + theDagPath.fullPathName();
//定义MDoubleArray型变量bbPos,
//相当于double型的数组,类似于MEL中的float $pos[]
MDoubleArray bbPos;
//执行MEL命令,并将结果返回到bbPos中
MGlobal::executeCommand(bbCommand,bbPos);
//下面调用MDoubleArray类的成员函数get()
//将bbPos中的数据存储到普通的double型数组中
double p[]; //定义double型数组
bbPos.get(p);// 将bbPos中的数据存储到数组p中
//调用MDoubleArray类的成员函数length (),获取数组中元素的个数
int count = bbPos.length();
值得注意的是:如果把大段大段的MEL脚本嵌入到C++中,编译执行,会出现什么结果?
这样虽然可以,但笔者不建议这么做!在C++插件中,请尽可能的使用C++ API!
因为C++中嵌入的MEL命令执行速度比直接在MAYA中运行MEL脚本要慢得多!
笔者曾经做过一个测试,执行同样的功能,分别用MEL 和C++ API实现,运行时间如下:
MEL 100~125秒
C++ API 10~14秒
最后笔者完全不使用C++ API,只是把MEL原封不动的嵌入C++,运行时间如下: C++嵌套MEL 6分钟 +
可以看到C++嵌套MEL的运行速度,相比直接使用MEL,慢了不是一点半点。所以建议大家在C++插件中,尽可能的使用C++ API!
当然,使用C++ API可以获得更快的执行时间,但相比MEL来说,C++ API很不直接,因为MAYA的核心被隐藏,不允许改动,也就意味着使用C++ API远比MEL要繁琐。
下面的例子,实现了同样的功能,都是设置时间线的当前时间,但MEL相当简洁和直观,C++ API则很麻烦。
//功能:设置当前时间到第10帧
C++ API
double currentTime = 10;
MTime tm(currentTime, MTime::kFilm);
MAnimControl anim;
anim.setCurrentTime(tm);
MEL
currentTime 10;
C++ Vs MEL
什么时候用MEL?什么时候用C++ API?
MEL与C++ API互为补助,90%的MEL命令,都有对应的C++ API;而部分C++ API具备MEL不能实现的功能或更高的效率。
建议:
1.界面部分使用MEL编写
2.核心尽量使用C++ API
3.不得不用MEL命令时,再使用MEL命令

作者: hmaya

developer!

看完不过瘾?点此向作者提问

发表评论

邮箱地址不会被公开。 必填项已用*标注