2008年12月14日星期日

定制右键标记菜单

在dagMenuProc.mel的dagMenuProc过程定义了各种不同物体的右键标记菜单。
比如,在
if (($object == "CubeCompass"))
{
createViewCubeMenuItems($parent);
return;
}
的下面加入:
if(`attributeExists "extNode" $object`){
print ($object+" RMB menu proc calls!\n");
return;

}

重新加载dagMenuProc.mel,新建一个物体,增加一个属性:extNode,类别任意。
再这个物体上使用右键菜单时,就会输出OBJECT NAME RMB menu proc calls!
如果在$parent上加入菜单,就可以显示菜单了。

技术细节:
dagMenuProc并没有出现在文档中,更详细的信息也没法得到,从网上搜索到的信息表明rmb标记菜单是附加在dag属性上的。
Maya's dagMenuProc script controls Right-Mouse-Button clicking on objects in the model viewports.

2008年12月12日星期五

boost::regex匹配序列文件名2

regex默认是perl的语法,但是一些细微的地方和perl的不尽相同。今天就在这上面吃大亏了。

std::string regstr2="("+name+")([0-9]+{"+ia+"})([.]"+ext+")";
boost::regex expression2(regstr2);
就这两句,编译的时候没有问题,一运行就出错,总是说表达式不合法。折腾了半晚上才发现[0-9]+外面要加()才行。
用reggy工具的时候就没有这个问题([0-9]+){3}和[0-9]+{3}是同样的效果,在boost里后者就是不合法的表达式。

boost::regex匹配序列文件名

#include
#include
int main() {
std::string regstr = "(^.*/)([^/]+?)([0-9]+)([.])([^./]+$)";
boost::regex expression(regstr);
std::string testString = "/Users/cobranail/Documents/helghast_sub_ver2.4_mesh006.jpg";
boost::smatch what;
std::string::const_iterator start = testString.begin();
std::string::const_iterator end = testString.end();
while( boost::regex_search(start, end, what, expression) )
{

std::string path(what[1].first, what[1].second);
std::string name(what[2].first, what[2].second);
std::string index(what[3].first, what[3].second);
std::string ext(what[5].first, what[5].second);
std::cout<< "path:" << path.c_str() << std::endl;
std::cout<< "name:" << name.c_str() << std::endl;
std::cout<< "index:" << index.c_str() << std::endl;
std::cout<< "ext:" < start = what[0].second;
}

return 0;
}

可以匹配的文件名:
filename.001.ext
filename001.ext
filename1.ext
file.name.001.ext
file.name001.ext

(^.*/) ---->path
([^/]+?) ---->file
([0-9]+) ---->index
([.]) ------->dot
([^./]+$) ---->ext


参考