羅鎮(zhèn)泉 詹明珠
(上海船舶研究設(shè)計(jì)院,上海201203)
船舶結(jié)構(gòu)
基于AUTOLISP二次開發(fā)的剖面繪制輔助工具原理及應(yīng)用
羅鎮(zhèn)泉詹明珠
(上海船舶研究設(shè)計(jì)院,上海201203)
利用VISUAL LISP集成開發(fā)環(huán)境,通過AUTOLISP語言,開發(fā)出在繪制船體結(jié)構(gòu)剖面的時候有效的輔助工具??梢愿鶕?jù)肋骨型線圖,自動鋪開剖面、自動繪制縱骨并加縱骨號標(biāo)注。利用該工具可以有效地提高剖面繪制效率,并能在設(shè)計(jì)初期對縱骨布置方案做出有效評估。
AUTOLISP;AUTOCAD;二次開發(fā);剖面繪制
1.1AUTOLISP概述
LISP(List Processing Language)是一種符號式語言,因?yàn)樗幚淼膶ο笫欠柋磉_(dá)式[1]。LISP語言的程序和數(shù)據(jù)都以符號表達(dá)式的形式來表示,因此,一個LISP程序可以把另一個LISP程序作為它的數(shù)據(jù)來處理。LISP語言語法簡單,編寫程序便捷、靈活,數(shù)據(jù)類型豐富。
AUTOLISP是為了二次開發(fā)AUTOCAD而專門設(shè)計(jì)的編程語言。它起源于LISP語言,嵌入在AUTOCAD內(nèi)部,是LISP語言和AUTOCAD有機(jī)結(jié)合的產(chǎn)物。利用AUTOLISP語言可以進(jìn)行各種工程的分析計(jì)算,自動繪制復(fù)雜的圖形;還可以定義新的AUTOCAD命令,驅(qū)動對話框,控制菜單;并且可為AUTOCAD擴(kuò)充具有一定智能化、參數(shù)化的功能。
VISUAL LISP是新一代AUTOLISP語言。它對AUTOLISP語言的功能進(jìn)行了擴(kuò)展,可以通過Microsoft ActiveX Automation接口與 AUTOCAD對象進(jìn)行交互,可以通過反應(yīng)器函數(shù)擴(kuò)展AUTOLISP響應(yīng)事件的能力。使用VISUAL LISP中對AUTOLISP進(jìn)行擴(kuò)展的功能時,必須調(diào)用vl-load-com函數(shù),或者將調(diào)用該函數(shù)的表達(dá)式寫在acad2006doc.lsp文件內(nèi)。
1.2重要數(shù)據(jù)類型介紹
AUTOLISP的數(shù)據(jù)類型豐富,除了具有一般程序設(shè)計(jì)語言的整型、實(shí)型、字符串等數(shù)據(jù)類型之外,還有表、函數(shù)、文件描述符、AUTOCAD選擇集、AUTOCAD圖元名、VLA對象、函數(shù)分頁表和外部函數(shù)等數(shù)據(jù)類型。
本程序著重用到表、VLA對象等數(shù)據(jù)類型。用表(LIST)可以很方便地構(gòu)造出復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。而VLA對象是ActiveX應(yīng)用程序的主要組成部分。不僅直線、圓弧、多義線和圓等稱為VLA對象,圖層、組、塊、視圖、視口、圖形的模型空間、圖紙空間、線型和尺寸標(biāo)注樣式等也稱為VLA對象,甚至連AUTOCAD應(yīng)用程序本身也被認(rèn)為是VLA對象。
2.1界面介紹
利用VISUAL LISP集成開發(fā)環(huán)境,可以便捷、高效地開發(fā)AUTOLISP程序,經(jīng)過編譯可以得到運(yùn)行效率高、代碼緊湊、源代碼受到保護(hù)的應(yīng)用程序。
本文通過AUTOLISP語言,開發(fā)出在繪制船體結(jié)構(gòu)剖面的時候有效的輔助工具,可以根據(jù)肋骨型線圖,自動鋪開剖面、自動繪制縱骨并加縱骨號標(biāo)注。程序界面如圖1。
圖1 程序界面
該程序分為兩部分:復(fù)制型線部分和縱骨生成部分。
2.2復(fù)制型線部分
在繪制船體結(jié)構(gòu)剖面的時候,特別是首部、機(jī)艙、尾部等每檔線型變化的分段,需要把每檔的肋骨型線逐個復(fù)制到相應(yīng)的剖面。本程序的第一部分即可以實(shí)現(xiàn)自動將型線復(fù)制到相應(yīng)肋位,效果如圖2所示。
圖2 自動復(fù)制型線效果
該部分程序操作步驟如下:
1)首先根據(jù)程序中的【橫向間隔】(往右)和【縱向間隔】(往下)利用陣列(array)命令,布置出兩個豎列的剖面基線和中心線;
2)以肋骨型線圖中的基點(diǎn)作為程序的【基點(diǎn)】;
3)以布置出來的兩個豎列的剖面最左上角的剖面基點(diǎn)為【插入點(diǎn)】,程序?qū)⒏鶕?jù)【插入點(diǎn)】位置和【橫向間隔】、【縱向間隔】自動得到后續(xù)剖面的基點(diǎn)位置供后續(xù)復(fù)制型線使用。
4)利用fence方法按順序選擇要拷貝的型線,點(diǎn)擊 【執(zhí)行】,程序則自動將需要拷貝的型線形成“表”,并逐個將型線復(fù)制到相應(yīng)剖面。
2.3縱骨生成部分
在繪制縱骨架式的首部分段、首尾貨艙分段時,因?yàn)樾途€變化,需要把每檔剖面都表達(dá)出來,而在每檔肋位將縱骨表達(dá)出來,如果手動繪制,將費(fèi)時費(fèi)事。利用程序,可以根據(jù)肋骨型線圖上的縱骨線自動地將縱骨布置在相應(yīng)的結(jié)構(gòu)剖面,并且可以根據(jù)需要選擇縱骨是否垂直于外板。同樣原理,還可以自動布置縱桁、縱骨縱桁的文字標(biāo)注等。每個剖面的縱骨自動生成效果見圖3,其中SL.5、SL.6為垂直于外板,SL.4、SL.5a為沒有選擇垂直于外板。
圖3 自動生成縱骨及其文字標(biāo)注效果
該部分程序操作步驟如下:
1)根據(jù)程序第一部分,得到各個剖面的型線。并將相應(yīng)的【橫向間隔】、【縱向間隔】填寫到這部分的【橫向間隔】、【縱向間隔】上。
2)根據(jù)第一部分同樣的原理選擇【基點(diǎn)】以及【插入點(diǎn)】。
3)點(diǎn)擊【縱骨線】,選擇一根縱骨線,該縱骨線可以為直線或者多段線。這里只能選擇一個對象,方便后續(xù)程序有序獲得交點(diǎn)并將之形成“表”供程序后續(xù)使用。
4)點(diǎn)擊【選擇型線】,用fence方法按順序選擇與縱骨線相交的肋骨線,程序自動將相應(yīng)剖面對應(yīng)的型線形成“表”,并通過ActiveX對象方法,利用vla-intersectwith函數(shù)依次有序獲得縱骨線和肋骨線的交點(diǎn),并形成“表”。這里肋骨線必須為多段線。
此時,程序?qū)⒆詣痈鶕?jù)【插入點(diǎn)】和【橫向間隔】、【縱向間隔】獲得后續(xù)所有剖面的基點(diǎn),并根據(jù)【基點(diǎn)】以及交點(diǎn)的相對位置獲得在相應(yīng)剖面處縱骨線和肋骨線的交點(diǎn),為程序后續(xù)將型材剖面復(fù)制到相應(yīng)交點(diǎn)位置作準(zhǔn)備。
5)點(diǎn)擊【縱骨剖面】和【剖面基點(diǎn)】,獲得該縱骨線所代表的型材剖面以及拷貝和旋轉(zhuǎn)基點(diǎn)。這里選擇的型材剖面為一個對象,一般為多段線或者塊。
如果要完成如圖3所示的自動完成縱骨的文字標(biāo)注效果,則可以將型材剖面和文字標(biāo)注做成一個塊,或者單獨(dú)將文字標(biāo)注作為型材剖面來操作,可以得到相同的效果。
6)如果勾選了【縱骨是否垂直外板】復(fù)選框,則程序?qū)⒃趶?fù)制型材剖面到相應(yīng)交點(diǎn)位置之后,把復(fù)制對象根據(jù)交點(diǎn)做一個旋轉(zhuǎn)。而為了得到旋轉(zhuǎn)角度,程序?qū)⒆詣荧@取該肋位上的型線的所有頂點(diǎn),并找到與交點(diǎn)位置最近的頂點(diǎn)(統(tǒng)一在頂點(diǎn)上方),利用angle函數(shù)得到這兩個點(diǎn)形成的角度,這樣便通過幾何關(guān)系得到需要的旋轉(zhuǎn)角度。
為了統(tǒng)一幾何關(guān)系,當(dāng)需要選定縱骨垂直于外板時,選擇【縱骨剖面】的時候,型材剖面原始狀態(tài)如圖3中SL.5a所示 (此時需要要求該部分所有操作都是針對于剖面右舷)。如果型材是垂直布置(如圖3中SL.4所示)或者水平布置(如圖3中SL.5a所示),則不勾選【縱骨是否垂直外板】,并在選擇【縱骨剖面】的時候,保證型材剖面原始狀態(tài)為相應(yīng)樣式即可。
7)點(diǎn)擊【執(zhí)行】,程序完成選定模式相應(yīng)的操作。
3.1表數(shù)據(jù)類型的使用
表以左括號“(”開始,以配對的右括號“)”結(jié)束。表可以是空的,也可以有若干個元素;元素可以是簡單的,也可以是復(fù)雜的,還可以是其他的表。
通過2.2和2.3可以看到,利用表數(shù)據(jù)類型,可以很方便地有序引用CAD里的圖元,作為后續(xù)依次復(fù)制或求取交點(diǎn)的基礎(chǔ)。而建立表只需要以下一句代碼 (在選擇圖元的時候用fence方法按順序選擇)。
代碼:(setq ssframe(ssget))
3.2訪問ActiveX對象
如果要在Visual LISP中使用ActiveX函數(shù),必須首先調(diào)用vl-load-com函數(shù)來初始化ActiveX環(huán)境。vl-load-com函數(shù)首先檢查是否加載了ActiveX支持的函數(shù),如果已加載,就不做任何工作,否則將加載ActiveX和其他Visual LISP擴(kuò)展部分的函數(shù)。
在2.3中可以看到,為了獲取縱骨線和肋骨線的交點(diǎn),需要調(diào)用一個求取交點(diǎn)的函數(shù)。而在AUTOLISP中,僅有inters函數(shù)可供使用。該函數(shù)格式如下:
(inters pt1 pt2 pt3 pt4[onseg])
由于inters函數(shù)僅支持求取以4個點(diǎn)中前2個點(diǎn)和后2個點(diǎn)分別形成的直線的交點(diǎn)。無法滿足程序的使用要求,故需要使用ActiveX函數(shù),先將縱骨線和肋骨線等用AUTOCAD實(shí)體名引用的圖元,利用vlax-ename→vla-object函數(shù)轉(zhuǎn)換為VLA對象。再利用vla-intersectwith函數(shù)得到兩個VLA對象的交點(diǎn)。
3.3DCL語言使程序可視化
對話框形象、直觀,可以隨意輸人、隨時修改,鼠標(biāo)、鍵盤并用,是一種深受用戶歡迎的界面。對話框用DCL語言(Dialog Control Language)定義,得到“.DCL”類型的文件,用AUTOLISP或C程序驅(qū)動。
如圖1所示,本程序利用加框列(boxed_column)控件,將界面根據(jù)程序用途分為【復(fù)制型線】和【縱骨生成】兩個部分。使程序更為直觀,而且在2.3中,當(dāng)選擇一條縱骨線執(zhí)行之后,如果另一條縱骨線表示的型材型號一致,則不需要重新依據(jù)步驟按部就班,只需要點(diǎn)擊【縱骨線】選取新的一條縱骨線,并點(diǎn)擊【執(zhí)行】即可??稍谔幚硪唤M相同型材剖面的縱骨的時候大大提高效率。
3.4獲取多段線的所有頂點(diǎn)
在AUTOCAD中有二維多段線(Polyline)和多段線(LWPolyline)之分,分別利用entget函數(shù)獲得二維多段線和多段線的屬性表可以看到,二維多段線并沒有將所有頂點(diǎn)坐標(biāo)顯示在屬性表中,如果需要訪問頂點(diǎn),需要再利用entnext函數(shù)訪問子實(shí)體(subentity)的屬性表以獲得頂點(diǎn)坐標(biāo)。而多段線則可以直接在屬性表中獲得頂點(diǎn)坐標(biāo)。故在2.3獲取多段線頂點(diǎn)以獲得離交點(diǎn)最近的頂點(diǎn)時,本程序只考慮肋骨線為多段線的情況。如果從Napa中導(dǎo)出的肋骨線為二維多段線,則可以利用convert命令將其轉(zhuǎn)化為多段線。
本文詳細(xì)地介紹了基于AUTOLISP二次開發(fā)的剖面繪制輔助工具的具體編程思路及實(shí)現(xiàn)方法。對于利用該工具繪制船體結(jié)構(gòu)剖面的讀者可以更好的提高工作效率;另外對于讀者自行開發(fā)AUTOLISP程序也有一定的啟發(fā)意義。
[1]李學(xué)志.Visual LISP程序設(shè)計(jì):AutoCAD 2006.北京:清華大學(xué)出版社,2006.
Technique and Application of Section Drawing Assistant Tool Based on AUTOLISP Secondary Development
Luo Zhen-quanZhan Ming-zhu
(Shanghai Merchant Ship Design and Research Institute,Shanghai 201203,China)
An assistant tool for section drawings of ship structure was developed based on VISUAL LISP integrated developing environment with AUTOLISP language.The tool could collocate sections and draw longitudinal at frames automatically.It would improve drawing sections efficiency and evaluate longitudinal arrangement at the beginning of design.
AUTOLISP;AUTOCAD;secondary development;section drawing
U662.9
A
1001-4624(2015)01-0057-04
2014-08-07;
2014-12-20
羅鎮(zhèn)泉(1987—),男,助理工程師,從事船舶結(jié)構(gòu)設(shè)計(jì)工作。詹明珠(1982—),女,工程師,從事船舶結(jié)構(gòu)設(shè)計(jì)工作。