蘇亞楠
摘要:VisualLISP作為AutoCAD內(nèi)嵌的計(jì)算機(jī)語(yǔ)言,是進(jìn)行AutoCAD二次開發(fā)的重要工具,利用VisualLISP編寫具有針對(duì)性的實(shí)用軟件,可替代設(shè)計(jì)人員完成大量重復(fù)性工作,達(dá)到提高制圖效率的目的。在簡(jiǎn)述AutoCAD各種二次開發(fā)接口的基礎(chǔ)上,著重介紹了如何利用VisualLISP擴(kuò)展AutoCAD的功能。
關(guān)鍵詞:VisualLISP;AutoCAD;二次開發(fā)
VisualLISP language applications in water supply engineering CAD drawing
Su Ya-nan
(Tianjin Municipal Water-conservancy Survey and Design Institute,Tianjin 300204,China)
Abstract:VisualLISP as an embedded AutoCAD computer language,is an important tool for AutoCAD second development,VisualLISP prepared by the utility software,can replace designers to complete a large number of repetitive work,to improve drawing efficiency. Based on introduction of AutoCAD secondary development interface,mainly introduces how to use VisualLISP to extend the function of AutoCAD
Keywords:VisualLISP AutoCAD Secondary development
AutoCAD是供水工程制圖中普遍采用的計(jì)算機(jī)輔助設(shè)計(jì)軟件,該軟件使得工程繪圖的速度和質(zhì)量都的得到了很大的提升。但是供水工程制圖中存在大量的重復(fù)性工作,例如管線坐標(biāo)、高程、轉(zhuǎn)點(diǎn)、管材及樁號(hào)等信息的標(biāo)注。AutoCAD對(duì)于上述重復(fù)性工作來(lái)說,自動(dòng)化程度較低,使得工程勘查設(shè)計(jì)人員將大量的時(shí)間都花費(fèi)在繁瑣的繪圖中。針對(duì)以上問題,雖然很多軟件廠商也開發(fā)了相應(yīng)的專業(yè)軟件,但由于這些軟件要考慮各設(shè)計(jì)單位的通用性,很難滿足工程制圖中的一些具體要求,使用具有局限性。因此設(shè)計(jì)人員如能掌握AutoCAD二次開發(fā)軟件,編寫具有針對(duì)性的實(shí)用軟件,可極大的提高其繪圖效率。
目前AutoCAD系統(tǒng)為用戶提供了VisualLISP、AutoCAD Development System(C)、ObjectARX(C++)及 VBA等多種二次開發(fā)接口,其中VisualLISP作為默認(rèn)的代碼編輯工具在AutoCAD2000中已經(jīng)被完整地集成到系統(tǒng)中,開發(fā)者可以直接使用AutoCAD中的對(duì)象和反應(yīng)器,進(jìn)行底層的開發(fā)。通過有色代碼編輯器和完善的調(diào)試工具,使開發(fā)人員很容易創(chuàng)建和分析LISP程序的運(yùn)行情況。本文主要介紹利用VisualLISP對(duì)AutoCAD進(jìn)行二次開發(fā)的過程。
AutoCAD二次開發(fā)主要是根據(jù)供水工程制圖的流程,利用VisualLISP編寫AutoCAD繪圖命令,自動(dòng)完成圖紙數(shù)據(jù)的提取、計(jì)算及輸出,最大程度的實(shí)現(xiàn)自動(dòng)化制圖。具體內(nèi)容如下:
1、子模塊功能規(guī)劃
根據(jù)供水工程一般設(shè)計(jì)過程,需首先完成平面布置及初步管材劃分,而后根據(jù)平面布置成果進(jìn)行縱斷面布置,并進(jìn)一步細(xì)化管材劃分,待平面及縱斷面布置全部完成后,分別進(jìn)行相應(yīng)標(biāo)注工作。
其中,平面圖中需進(jìn)行轉(zhuǎn)點(diǎn)坐標(biāo)、轉(zhuǎn)點(diǎn)樁號(hào)、轉(zhuǎn)角角度、整公里樁號(hào)及管材標(biāo)注。縱斷圖需進(jìn)行地面高程、管中心線高程、管材分段樁號(hào)、管材分段長(zhǎng)度、轉(zhuǎn)角編號(hào)、轉(zhuǎn)角樁號(hào)及閘閥的標(biāo)注。根據(jù)以上制圖內(nèi)容可劃分為6個(gè)子模塊,各模塊功能分述如下:
(1)平面圖轉(zhuǎn)點(diǎn)標(biāo)注模塊
該模塊主要完成對(duì)平面圖中各轉(zhuǎn)點(diǎn)進(jìn)行編號(hào),同時(shí)從圖中讀取各轉(zhuǎn)點(diǎn)坐標(biāo),根據(jù)轉(zhuǎn)點(diǎn)坐標(biāo)完成樁號(hào)及轉(zhuǎn)角角度計(jì)算,在完成上述工作后,在平面圖中自動(dòng)完成標(biāo)注工作。
(2)平面圖管材標(biāo)注模塊
該模塊主要根據(jù)管材變化情況自動(dòng)完成起點(diǎn)、終點(diǎn)樁號(hào)的計(jì)算和標(biāo)注,同時(shí)根據(jù)選定的線型完成管線及接口的繪制。
(3)平面圖整樁號(hào)標(biāo)注模塊
該模塊主要根據(jù)管道布置自動(dòng)完成整樁號(hào)點(diǎn)的坐標(biāo)計(jì)算,并進(jìn)行樁號(hào)標(biāo)注。
(4)縱斷面圖管材標(biāo)注模塊
該模塊根據(jù)平面圖的管材信息自動(dòng)完成縱斷面圖管材的劃分,并進(jìn)行劃分點(diǎn)的地面高程、管中心線高程、樁號(hào)及劃分段長(zhǎng)度的計(jì)算與標(biāo)注。
(5)縱斷面圖轉(zhuǎn)點(diǎn)標(biāo)注模塊
該模塊根據(jù)平面圖的轉(zhuǎn)點(diǎn)信息,自動(dòng)完成縱斷面圖的轉(zhuǎn)點(diǎn)編號(hào)及樁號(hào)的標(biāo)注。
(6)縱斷面圖閘閥標(biāo)注模塊
該模塊根據(jù)用戶確定的閘閥位置,自動(dòng)在縱斷面圖中完成閘閥的繪制,并完成閘閥的編號(hào)及樁號(hào)標(biāo)注。
2、子模塊功能實(shí)現(xiàn)
在實(shí)現(xiàn)模塊功能之前,應(yīng)首先完成各個(gè)模塊的程序流程圖,現(xiàn)以整樁號(hào)標(biāo)注模塊為例說明功能實(shí)現(xiàn)的過程。該模塊的流程見圖1,主程序部分源代碼及注釋如下:
首先通過setq語(yǔ)句對(duì)本模塊涉及的輸出精度、字號(hào)及輸出位置等參數(shù)進(jìn)行初始化。
而后通過命令行文本提示用戶在平面圖中選取多段線,并輸入起始樁號(hào)及終止樁號(hào)。通過entget語(yǔ)句得到相應(yīng)多段線圖元;通過length語(yǔ)句得到該圖元所包含的折點(diǎn)數(shù)。
(setq pt_lst(mapcar 'cdr(vl-remove-if-not '(lambda(x)(=(car x)10))(entget en))));
(setq number(length pt_lst));
判斷終止樁號(hào)是否在線路范圍內(nèi),如超出則通過fix語(yǔ)句將線路末端的整數(shù)樁號(hào)做為終止樁號(hào)。
(while(> pd_number 1)
(setq now_cd(sqrt(+(expt x_cd 2)(expt y_cd 2))))
(setq q_zh(+ q_zh now_cd))
(setq pd_number(1- pd_number))
(setq pd_lst(cdr pd_lst)))
(if(> end_zh q_zh)(setq end_zh(*(fix(/ q_zh 500))500)));
計(jì)算各折點(diǎn)距離,找到首個(gè)整數(shù)樁號(hào)位置,并進(jìn)行相應(yīng)標(biāo)注。
;如果當(dāng)前折點(diǎn)的累積長(zhǎng)度小于整數(shù)樁號(hào)則繼續(xù)尋找下一個(gè)折點(diǎn)
(if(< q_zh begin_zh)
(progn(setq now_cd(sqrt(+(expt x_cd 2)(expt y_cd 2))))
(setq q_zh(+ q_zh now_cd)))
;如果當(dāng)前折點(diǎn)的累積長(zhǎng)度大于整數(shù)樁號(hào)則計(jì)算整數(shù)樁號(hào)點(diǎn)坐標(biāo),并對(duì)輸出結(jié)果進(jìn)行格式化后,通過command語(yǔ)句調(diào)用AutoCAD命令進(jìn)行標(biāo)注。在進(jìn)行標(biāo)注前需使用setvar命令設(shè)置AutoCAD系統(tǒng)變量值來(lái)關(guān)閉繪圖捕捉。
;計(jì)算坐標(biāo)
(progn(setq xl(atan(- point_y point_old_y)(- point_x point_old_x)))
(setq biaodian_x(+ point_x(*(cos xl)(- begin_zh q_zh))))
(setq biaodian_y(+ point_y(*(sin xl)(- begin_zh q_zh))))
(if(= weizhi 1)(setq line_xl(- xl 1.5708))(setq line_xl(+ xl 1.5708))) (下轉(zhuǎn)第頁(yè))
(上接第頁(yè))
;格式化輸出結(jié)果
(setq zh_int(fix(/ begin_zh 1000)))
(setq zh_float(- begin_zh(* zh_int 1000)))
(if(>= zh_float 100)(setq fh "+"))
(if(and(< zh_float 100)(>= zh_float 10))(setq fh "+0"))
(if(and(< zh_float 10)(>= zh_float 0))(setq fh "+00"))
;關(guān)閉繪圖捕捉后調(diào)用CAD命令進(jìn)行標(biāo)注
(setvar "osmode"(logior(getvar "osmode")16384));
(command "line" line1 line2 "")
(command "text" text_zb heg jd out_zh)
將源代碼保存為L(zhǎng)SP文件后,在AutoCAD環(huán)境中調(diào)入上述文件即可根據(jù)設(shè)計(jì)人員確定的管線布置,完成特定區(qū)間的整樁號(hào)標(biāo)注。由于篇幅所限,對(duì)其他模塊流程不再介紹。
3工程實(shí)例
在南水北調(diào)中線天津市內(nèi)配套寧漢供水工程中設(shè)計(jì)人員使用本套VisualLISP工程制圖插件進(jìn)行輔助制圖。該工程管線長(zhǎng)度約50km,采用雙排管道輸水。共需繪制管道平面布置圖及管道縱斷面圖約100張,圖紙中涉及大量數(shù)據(jù)標(biāo)注工作。在使用過程中根據(jù)設(shè)計(jì)人員的反饋意見,對(duì)部分功能進(jìn)行了補(bǔ)充及調(diào)整。主要包括以下幾點(diǎn):
(1)為便于對(duì)圖紙內(nèi)容進(jìn)行管理,通過調(diào)用AutoCAD中l(wèi)ayer命令,將各插件的輸出成果分別繪制在不同的圖層內(nèi)。
(2)由于平面圖中的線路及縱斷面圖中的地面線與管中心線均為多段線,設(shè)計(jì)人員在工程布置過程中需經(jīng)常對(duì)上述多段線進(jìn)行分?jǐn)嗉昂喜ⅲ纱嗽斐啥喽尉€方向與線路方向不一致的問題,為此另外編寫了可對(duì)多段線方向進(jìn)行調(diào)整的程序。
(3)在設(shè)計(jì)過程中,經(jīng)常需要測(cè)量線路中特定點(diǎn)的樁號(hào)及特定樁號(hào)的位置,為此分別編寫了平面圖及縱斷面圖單點(diǎn)標(biāo)注程序,以滿足需要。
通過使用本套制圖插件,極大提高了設(shè)計(jì)人員的制圖效率。由于本套插件可實(shí)現(xiàn)數(shù)據(jù)自動(dòng)采集、計(jì)算及輸出,因此基本避免了圖紙中出現(xiàn)計(jì)算及量測(cè)錯(cuò)誤的可能性。由于本套插件編寫時(shí)間較倉(cāng)促,故未進(jìn)行圖形化交互設(shè)計(jì),且與AutoCAD結(jié)合程度較低,在今后可進(jìn)一步優(yōu)化人機(jī)交互界面,使程序應(yīng)用更加便捷。
4、結(jié)語(yǔ)
利用VisualLISP語(yǔ)言,設(shè)計(jì)人員可根據(jù)自身需要開發(fā)出有針對(duì)性的插件,如本次編寫過程中除上述主功能模塊外,還根據(jù)實(shí)際情況編寫了多段線方向調(diào)整、平面圖單點(diǎn)標(biāo)注及縱斷面單點(diǎn)標(biāo)注等輔助性模塊,進(jìn)一步提高了制圖效率。同時(shí),VisualLISP語(yǔ)言還可形成圖形化界面,使用戶得到更友好的人機(jī)交互。
由于VisualLISP是一種嵌于AutoCAD內(nèi)部的計(jì)算機(jī)語(yǔ)言,具備與其他高級(jí)語(yǔ)言基本相同的結(jié)構(gòu)與功能。同時(shí),通過利用與AutoCAD之間良好的通訊能力,使其具有其他高級(jí)語(yǔ)言所沒有的制圖能力。應(yīng)用VisualLISP對(duì)AutoCAD進(jìn)行二次開發(fā),可大大提高繪圖的效率,是值得設(shè)計(jì)人員深入學(xué)習(xí)和掌握的一種計(jì)算機(jī)語(yǔ)言。