您的位置:首页 > 其它

3ds Max 2014的Maxscript中使用正则表达式

2015-05-20 10:13 281 查看
Maxscript里创建一个函数

--Function:Regex

--@param expression - 正则表达式字符串

--@return 返回.NET下的正则表达式对象

fn Regex expression=(rgx = dotNetObject "System.Text.RegularExpressions.Regex" expression;return rgx)

--使用方法举例

R1 = Regex "^(LG){0,1}([YnNnTtLl]||YP)(\d{1,})\S{0,}_(\d{1,})$"

bResult = R1.isMatch("LGY01_001")

返回的结果是bResult=true

实现非常简单,就是借用.NET里的Regex类对象,利用Maxscript对于.NET命名空间的映射Reflection,创建一个.NET下的正则表达式对象。返回的正则表达式对象的方法和属性访问和.NET下的用法相同。

心路历程:

手头项目中需要编写3ds Max的脚本插件检查Max建模场景中的某些类型的物体名称是否符合某一种命名规则,并且需要标记出不符合命名规则的物体。

虽然之前曾经使用过Python中的Re模块来做命名检查这件事,但是由于插件还需要对VRay插件的参数做访问和设定,Chaos Group的官方目前没有给VRay编写Python的sdk,因此如果需要完整的用Python写完这个插件,必须要给Maxscript里对于Vray的访问语句做很多Eval的包装,并且插件的UI需要使用PySide来创建,并没有Visual Maxscript的界面设计的功能,所以最后决定还是直接使用maxscript来创建界面并且完成整个插件。

但是Maxscript归根结底不支持正则表达式的,如果使用C++的SDK可以通过引入外部的正则表达式模块,但是这一过程对于很多对于我这类C++编程不熟悉的童鞋来说太过于麻烦,所以我继续翻阅Maxscript的文档,发觉了它有对于.NET的Reflection,即.NET框架下能够使用的命名空间,能够访问到了类,能够创建的类对象,在Maxscript里也能够做到,因此我又查找了.NET(4.0)下是否有正则表达式相关的类和函数,一查果然有!

Autodesk 3Ds Max的插件系统还是比较强大的,C++, .NET 还有Python 这三种编程方式与 Maxscript 都可以互相访问,甚至可以达到三种语言混编的可能,对于功能的扩展无疑增加的更多的可能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: