天天看點

3ds Max 2014的Maxscript中使用正規表達式

Maxscript裡建立一個函數

--Function:Regex

[email protected] expression - 正規表達式字元串

[email protected] 傳回.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 都可以互相通路,甚至可以達到三種語言混編的可能,對于功能的擴充無疑增加的更多的可能。