吳思蘊(yùn) 溫立委 張漢春
摘 ?要:AutoCAD是全球領(lǐng)先的軟件,在測繪工程應(yīng)用十分普遍。文章介紹了AutoLISP語言的特點,列舉了廣州市地下管線探測工程中的物探點號展點、測繪地形行樹繪制、廣州白云國際機(jī)場、廣州亞運城等工程的設(shè)計報建圖的管線長度估算、繪制高壓走廊線路圖的部分lisp程序,彌補(bǔ)現(xiàn)有測繪專業(yè)軟件的不足,完善管線探測工程制圖的功能,保證了管線信息動態(tài)更新的要求。
關(guān)鍵詞:AutoLISP;AutoCAD;測繪工程;管線探測;編程
中圖分類號:TP39 ? ? 文獻(xiàn)標(biāo)識碼:A ? 文章編號:2096-4706(2023)14-0134-04
Application of LISP Programming for Map Drawing in Pipeline Exploration Engineering
WU Siyun, WEN Liwei, ZHANG Hanchun
(Guangzhou Urban Planning & Design Survey Research Institute, Guangzhou ?510060, China)
Abstract: AutoCAD is the global leading software and it is widely used in surveying and mapping engineering. This paper introduces the characteristics of AutoLISP language, and lists some lisp programs, such as drawing points of position for physical exploration name of underground pipeline in Guangzhou underground pipeline detection project, drawing row of trees for terrain, pipeline length estimation for designing and construction planes in Guangzhou Baiyun International Airport and Guangzhou Asian Games City projects, and drawing high-pressure corridor route diagrams, etc. It makes up the shortage of the existing surveying and mapping professional software, improves the function of pipeline detection engineering drawing, and guarantees the requirements of dynamic update of pipeline information.
Keywords: AutoLISP; AutoCAD; surveying and mapping engineering; pipeline detection; programming
0 ?引 ?言
AutoCAD是Autodesk公司開發(fā)的工程圖形處理軟件,在勘察設(shè)計行業(yè)中普遍地在得到推廣和應(yīng)用。目前測繪領(lǐng)域內(nèi)基于機(jī)助CAD的二次開發(fā)取得了飛速發(fā)展[1],并應(yīng)用于各種比例尺的地形圖、地藉圖、宗地圖、地下管線成果圖、斷面圖。該軟件不僅具有豐富的繪圖命令,還具有強(qiáng)大的圖形編輯功能,而且軟件運行相當(dāng)穩(wěn)定。要用好AutoCAD進(jìn)行測繪制圖,利用CAD本身提供二次開發(fā)的工具是必不可少的,其中包括內(nèi)嵌編程語言AutoLISP。
1 ?AutoLisp語言的特點與功能
AutoLISP是AutoCAD內(nèi)嵌的解釋性語言。它起源于LISP語言,嵌入在AutoCAD的內(nèi)部,全部都是函數(shù),沒有語句的概念和語法結(jié)構(gòu),函數(shù)的調(diào)用是通過表來完成的。表通過圓括號()來定義,程序通過表結(jié)構(gòu)完成,它程序設(shè)計和繪圖完全融為一體,還可以實現(xiàn)對AutoCAD圖形數(shù)據(jù)庫的直接訪問和修改。AutoLISP語言語法簡單,易學(xué)易用,表達(dá)能力強(qiáng),功能函數(shù)強(qiáng)大,編寫的環(huán)境簡單,通過定義函數(shù)實現(xiàn)各種功能。除可以完成各種科學(xué)計算外,還能調(diào)用AutoCAD各項命令,創(chuàng)造更有用的AutoCAD新指令,直接訪問和修改圖形數(shù)據(jù),從而大大地擴(kuò)充了圖形處理功能[2-5]。
2 ?用Lisp語言開發(fā)制圖新功能
盡管AutoCAD本身圖形功能很強(qiáng)的,但是由于它本身不是為勘察行業(yè)制定的,用戶必須根據(jù)自己的需要對AutoCAD進(jìn)行各種功能的開發(fā),利用AutoLISP語言,編寫不同程序,讀取有關(guān)數(shù)據(jù)文件,組合操作AutoCAD命令,實現(xiàn)用戶要求的圖件,下面介紹幾個典型示例。
2.1 ?實現(xiàn)在管線數(shù)據(jù)的展點、寫點號
地形圖或地下管線測量,既有導(dǎo)線點,也有大量的圖根點、管線點,有時多達(dá)幾千個上萬個。因此先將各外業(yè)測繪的測量點號、物探點號、X、Y、Z坐標(biāo)的格式,寫入文本txt文件,通過常規(guī)檢查,就可展點程序生成DWG點位文件,用作后一步處理。
如下為用txt數(shù)據(jù)展點程序[6-7]:
(setqfname (getfiled "管線點數(shù)據(jù)文件txt" "" "txt;*" 2));獲取文件名
(setq f (open fname "r"));打開txt文件
(setqsj (read-line f));讀取第一行數(shù)據(jù)
(while (/= sj nil)
(setqclh (substrsj 1 6));提取測量點號
(setqwth (substrsj 7 5)) ;提取物探點號
(setq x (atof(substrsj 12 10)));提取并轉(zhuǎn)換X坐標(biāo)為浮點數(shù)
(setq y (atof(substrsj 22 10))) ;提取并轉(zhuǎn)換Y坐標(biāo)為浮點數(shù)
(setq h (atof(substr sj32 5))) ;提取并轉(zhuǎn)換Z坐標(biāo)為浮點數(shù)
(setq pt (list yy xx hh));組成三維坐標(biāo)點
(command "point" pt) ;; 展座標(biāo)點位
(command "text" (list (+ y (* 0.2 msl)) (- x (* 0.4 msl))) (* 1.0 msl) "0.0" clh) ;注測量點號
(command "text" (list (+ y (* 0.25 msl)) (- x (* 0.45 msl))) (* 1.0 msl) "0.0" ?wth)) ;;注物探點號
(setqsj (read-line f));繼續(xù)下一行
);;while
(close f);關(guān)閉文件,結(jié)束
實際操作中,輸入txt文件,便可在CAD中生成展點圖形,效果如圖1所示。
2.2 ?地形行樹繪制
在地形測量中,需要繪制階梯、陡坎、鐵路、圍墻、界址線、行樹等地貌符號和圖式符號,而AutoCAD卻這些繪圖命令,但是,我們采用LISP編程,可以準(zhǔn)確、快速、自動處理完成各種命令。如下為繪制行樹(效果如圖2所示)程序:
(defunc:hs (/ ?pt1 pt2 ptcdist ang msl)
(setvar "cmdecho" 0)
(setq msl 0.5)
(setq pt1 (getpoint "\n 1請給出行樹的起點:"))
(setq pt2 (getpoint "\n 2請給出轉(zhuǎn)折點:" pt1))
(while (/= pt2 nil)
(if ?(/= pt2 nil)
(progn
(setqdist (distance pt1 pt2));計算兩點距離
(setq ang (angle pt1 pt2)) ;計算兩點角度
(command "circle" pt1 (* msl 0.5) "") ;起點繪樹
(setqptc pt1);中間樹
(while (>= dist (* msl 10.0));中間樹與轉(zhuǎn)折點是否小于5米
(setqptc (polar ptc ang (* msl 10.0))) ;計算方向ang、距離5m繪樹點坐標(biāo)
(command "circle" ptc (* msl 0.5) "") ;該點繪樹
(setqdist (distance ptc pt2));重新計算繪樹ptc與轉(zhuǎn)折點pt2的距離
) ;while 2
);progn
);if
(setq pt1 pt2) ? ?;轉(zhuǎn)折點賦值給起點
(setq pt2 (getpoint "\n 請給出轉(zhuǎn)折點:" pt1))
);while
(princ "OK")
);enddefun
2.3 ?設(shè)計報建圖的管線長度估算
在政府委托的管線竣工測量工程時,并不是每宗工程都有管線長度,往往只提供綜合管線設(shè)計圖,里面有給水、排水、電力、電信、燃?xì)?,也有新型管線如中水、冷凍水、垃圾真空等,也有其他如道路邊線、道路中線等其他層。我們需要計算全部圖層的各管線長度預(yù)估,偏于便于工作安排。部分程序如下:
(defunC:cal_all_lay_len ()
(setqwfname (getstring ?"\n輸出長度計算的文件名: "))
(setqtxtfilename (strcat (getvar "dwgprefix") wfname ".txt"))
(setqfh (open txtfilename "w"))
(setq ?out1 (strcat "DWG文件:" ?(getvar "dwgname") "的統(tǒng)計如下:\n"))
(print out1)
(princ out1 fh)
(setq ?out1 (strcat "\n 層名 圓 直線 圓弧 多段線 本層長度 本層實體數(shù) \n") )
(print out1)
(princ out1 fh)
(setq t1 (tblnext "layer" "0"))
(setqcnt 1)
(while (setq t1 (tblnext "layer"));;圖層循環(huán)
(setqcnt (+ cnt 1))
(setq cur_layer1 (cdr (assoc 2 t1)))
(cal_Onelay_len ?cur_layer1);;某一圖層cal_Onelay_len函數(shù)計算
(setqall_sn (+ Sn_cirSn_lineSn_arcSn_poly));4種實體相加
(setqall_len (+ len_cirlen_linelen_arclen_poly));
4種長度相加
(princ cur_layer1 fh);寫層名
(princ " " fh) ;加空格
(princlen_cirfh);寫圓長
(princ " " fh)
(princlen_linefh);寫直線
(princ " " fh)
(princlen_arcfh);寫圓弧長
(princ " " fh)
(princlen_polyfh);寫多段線長
(princ " " fh)
(princll_lenfh);寫本層長度
(princ " " fh)
(princlall_snfh);寫本層實體數(shù)
(princ "\n" fh);;換行
)
(closefh)
(princ (strcat "\n文件寫在->: " txtfilename))
(prin1)
)
2.4 ?繪制高壓走廊線路圖
廣州市高壓走廊數(shù)據(jù)采集技術(shù)規(guī)定中,要求采集的內(nèi)容有:塔位平面坐標(biāo)、高程、線路名稱、塔號、塔型、塔高、最大橫梁寬度、最低呼稱高、根開、塔基高程、最低弧垂高程等。先外業(yè)測量采集有關(guān)數(shù)據(jù),室內(nèi)計算,形成Excel數(shù)據(jù)文件。
根據(jù)高壓走廊Excel數(shù)據(jù),便可繪制圖形文件[8]。部分程序如下:
(DEFUN c:run_xls2cad ();加載主文件
(SETQ FileName "d:/gyzl/xls_cad_0509.dvb")
(VL-VBALOAD FileName);加載VBA文件
(VL-VBARUN "draw_gyx.main");執(zhí)行VBA讀取Excel數(shù)據(jù)并繪制三維高壓走廊圖主程序
(COMMAND "_vbaUnload" FileName);御載VBA文件
)
再在高壓線路圖上輸入:“HZTK2Q”,圖內(nèi)鼠標(biāo)點一下,自動計算1/2000圖名、矩形邊界,就可以在圖上畫出(效果見圖3):
(DEFUN C:HZTK2Q (/ tuchjuan juan1 x y);繪1/2千的邊界和圖幅名
(COMMAND "layer" "s" "tk2000" "");
(SETQ juan (GETPOINT "\n點取位置:"));
(SETQ x_n (CADR juan));計算點取位置的X坐標(biāo)
(SETQ y_e (CAR juan));計算點取位置的Y坐標(biāo)
(tfh2001 x_ny_e);;該函數(shù)求出1/2千的圖幅名qqname,坐下角的X,Y坐標(biāo)mm1、nn1
(SETQ juan0 (LIST nn1 mm1 0));坐下角的X,Y坐標(biāo)
(SETQ juan1 (LIST (+ nn1 1000) (+ mm1 800) 0));計算右上角的X,Y坐標(biāo)
(COMMAND "rectang" juan0 juan1) ;繪制1/2千矩形圖框
(COMMAND "text"
(LIST (+ nn1 260) (+ mm1 370))
"100"
"0"
Qqname;函數(shù)tfh2001求出1/2千的圖幅名
""
);圖框中心繪圖名
) ;_END DEFUN
3 ?結(jié) ?論
目前,南方CASS等專業(yè)軟件在數(shù)字成圖、數(shù)據(jù)入庫功能強(qiáng)大和成熟,欠缺一些特殊業(yè)務(wù)、復(fù)雜用途的功能。AutoCAD的版本已經(jīng)2023版,但是AutoCAD R14到AutoCAD 2022都有不同程度的使用,Visual LISP是AutoLISP的完善和補(bǔ)充,采用兩者開發(fā)的程序適合全部AutoCAD版本,靈活地完成各種重復(fù)性、復(fù)雜性較高的實際編輯工作,可以補(bǔ)充市場軟件的不足,提高管線探測工程工程的繪圖效率。
參考文獻(xiàn):
[1] 青盛,滿旺.AutoCAD及測繪應(yīng)用 [M].西安:西南交通大學(xué)出版社,2012.
[2] 李灶強(qiáng).用LISP語言實現(xiàn)分幅圖的自動提取 [J].城市勘測,2015(3):76-78.
[3] 李勝利,李雯.VBA和LISP編程實現(xiàn)地籍調(diào)查成果的自動化輸出 [J].城市勘測,2010(4):145-147.
[4] 梁華冰.編寫LISP程序進(jìn)行城市地下管線竣工圖標(biāo)注的實例 [J].測繪與空間地理信息,2014,37(7):159-161.
[5] 曾攀立,劉傳逢,劉永鋒,等.基于AutoCAD的排水管線缺陷類型自動標(biāo)記成圖系統(tǒng)設(shè)計與實現(xiàn) [J].城市勘測,2020(1):135-137.
[6] 廖宇宏,張漢春.LISP編程在管線制圖中的開發(fā)應(yīng)用 [J].現(xiàn)代計算機(jī):專業(yè)版,2010(9):130-132.
[7] 劉剛,張小波.Visual LISP程序設(shè)計在市政管線竣工測量的應(yīng)用 [J].城市勘測,2017(3):141-144.
[8] 張漢春.基于VBA和VLISP的高壓走廊數(shù)據(jù)處理系統(tǒng)開發(fā) [J].現(xiàn)代計算機(jī),2006(8):53-56.
作者簡介:吳思蘊(yùn)(1983—),女,漢族,廣東廣州
人,工程師,本科,主要研究方向:計算機(jī)信息技術(shù)、測繪工程;通訊作者:張漢春(1962—),男,漢族,廣東梅縣人,高級工程師(教授級),本科,研究方向:計算機(jī)技術(shù)、測繪工程、工程物探、工程咨詢。