辛金超
(上海建筑設計研究院有限公司,上海 200041)
圖紙是工程師的語言,其中包含了大量的信息。將正則表達式技術結合到Visual LISP中,并用其處理結構施工圖,是一個簡單便捷而又智能準確的方法。使用該方法處理設計制圖時遇到的問題,可以高效、準確地完成設定任務,突破一些圖紙處理時遇到的瓶頸,提高工作效率和繪圖質量。
Visual LISP(VLISP)是新一代的AutoCAD LISP語言,它增強并擴展了AutoLISP[1],提供了曲線測量、反應器及ActiveX功能,并且程序可以編譯,加快了運行速度。對于時間緊張的工程設計人員來說,開發效率和使用效率同等重要,選擇開發效率較高的AutoLISP語言,能夠高效地完成一般開發任務,非常適合開發專業性很強并且結合工程師切身需要的應用程序。所謂正則表達式(Regular Expression),就是一種描述字符串結構模式的形象化表達方法。它優美而又功能強大,是計算機軟件領域內的一項偉大發明[2]。正則表達式由“元字符”和“文字”組成,二者構成了描述字符串結構模式的描述語法。它能夠添加、刪除、分離、疊加、插入和修整各種類型的文本和數據[2],具有很廣泛的應用。
正則表達式的使用需要宿主語言,雖然VLISP暫時不支持其使用,但憑借其對ActiveX功能的支持,可以編程驅動一些外部對象,將此功能融合到程序中。在VLISP中使用ActiveX Automation功能操作外部對象可以使用vlax-invoke-method函數調用特定對象的方法,用vlax-get-property和vlax-put-property函數獲取和設置特定對象的屬性,相對于導入類型庫方式來說,該方式較為節省內存開銷[3]。VBScript在Windows系統中較為常用,如果只是使用VBScript的正則表達式能力,那么可以直接創建“VBScript.RegExp”對 象:“(setq regex(vlax-create-object"VBScript.RegExp"))”,在設置完“regex”對象的“Pattern”等屬性之后,分別執行其“Test”“Replace”“Execute”方法可以對目標字符串進行“測試”“替換”“獲取子匹配”的操作。
perl的正則表達式能力很強,基于內建而非外部擴展,不是通過函數方式或者面向對象的方法調用,而是采用“=~”“!~”運算符結合正則表達式本身所提供的各種修飾符來決定進行何種運算。可以在程序中使用ScriptControl對象來調用perl的語言解釋器,解析腳本語言,下面給出了主要實現代碼:
(setq theScriptControl(vlax-create-object"ScriptControl"))
(vlax-put-property theScriptControl"Language""PerlScript")
(vlax-invoke-method theScriptControl"ExecuteStatement"(strcat"$TagetString=""TagetString"";""$s=$TagetString=~"thePattern";"))
(vlax-invoke-method theScriptControl"eval""$s");此即結果
此方式能夠支持固定長度的反向預查,但是需要提供完整的perl風格的匹配表達式,便于分隔符的靈活使用,例如上段代碼中,可令thePattern變量為"m/abc/"。
使用 Jscript語言時將上述代碼中的“PerlScript”替換為“JScript”,并采用如下語句:
(vlax-invoke-method theScriptControl"ExecuteStatement"(strcat"var TagetString=""TagetString"";""var thePattern=/"thePattern"/"))
(vlax-invoke-method theScriptControl"eval""thePattern.test(TagetString)");此即結果
在平法施工圖廣泛應用的今天,工程師經常要與各種標注打交道,將正則表達式用作信息提取,事半而功倍。腰筋處理是一項需要獲取較多信息的工作,《混凝土結構設計規范》[4]和《高層建筑混凝土結構技術規程》[5]對鋼筋混凝土梁(包括連梁、轉換梁)的腰筋在鋼筋直徑、面積配筋率、鋼筋豎向間距方面都有明確規定,如果梁承受扭矩的作用,還需要滿足抗扭承載力的要求。圖1給出了使用VLISP處理腰筋程序的信息獲取部分。

圖1 腰筋計算信息識別部分流程圖
圖層名是圖紙中必然存在的字符信息,這也是將正則表達式應用于圖紙處理的一個現實基礎。在AutoCAD中圖層與圖層名之間具有一一對應關系,正確識別出需要操作的圖層名稱,就正確找到了需要處理的圖層以及該圖層中的具體對象。對于圖層的選擇,常用的方法是對所選對象的圖層屬性進行提取,但是當我們知道圖層的命名特點時,就可以采用正則表達式定位法對這些圖層進行迅速準確的定位。例如可以使用正則表達式“^(.*?)(下)?(模型|變形).* ”及替換為字符串“0825-$1$3”,將一些工況下的變形圖以及初始模型圖層的名稱改變。
在處理施工圖時往往會遇到布局很多的情況,使用AutoCAD自帶的滾動條來切換效率不是很高,若中間出現錯誤點擊,則更增加了使用者的等待時間,若能首先準確方便地定位到某布局之后一次性切換,這無疑會給圖紙查看帶來便利。基于此目的,制作了功能函數,用戶可以輸入相對模糊的正則匹配條件,程序會將匹配的結果按照標簽的排列順序列出,供用戶二次選擇,最后切換至指定布局。
AutoLISP非常適合開發專業性很強并且符合工程師切身需要的應用程序,它能夠結合工程師對CAD系統的使用經驗,具有很高的開發效率。正則表達式是一種面向實踐的思想和方法,實實在在地提高了使用者的實戰能力。通過VLISP中提供的ActiveX方法,將正則表達式功能結合到程序當中,一方面提高了程序設計的效率,間接地節省了工程師的時間;另一方面,提供給工程師在CAD中直接使用正則表達式的接口,促進了制圖效率效果的改善。
[1] Autodesk Inc.Introduction[EB/OL].http://exchange.autodesk.com/autocad/enu/online-help/search # WSfacf1429558a55de1-a7524c1004e616f8b-5bb9.htm.
[2] Jeffrey E.F.Friedl.精通正則表達式[M].第 3版.余 晟,譯.北京:電子工業出版社,2012:2.
[3] Autodesk Inc.Using ActiveX without Importing a Type Library[EB/OL].http://exchange.autodesk.com/autocad/enu/online-help/search#WS73099cc142f4875516d84be10ebc87a53f-7bcb.htm.
[4] GB 50010-2010,混凝土結構設計規范[S].
[5] JGJ 3-2010,高層建筑混凝土結構技術規程[S].