摘 要:在市政道路勘測中,橫斷面數(shù)據(jù)提取是常見的內(nèi)業(yè)工作任務(wù)之一。對所采集的橫斷面數(shù)據(jù)進(jìn)行分析時,通常需要內(nèi)業(yè)人員通過AutoCAD軟件逐個量取數(shù)據(jù),存在工作效率低、工作量大、數(shù)據(jù)易錯等問題。文章利用AutoLISP語言在AutoCAD軟件中二次開發(fā)程序,實現(xiàn)了圖中橫斷面線上的斷面點全自動化輸出為三行一組橫斷面數(shù)據(jù)格式,避免了手工重復(fù)量取、錄入的煩瑣工作。實踐證明,該方法有效提高了內(nèi)業(yè)工作效率與數(shù)據(jù)質(zhì)量,稍微修改程序還可提取并輸出不同的橫斷面數(shù)據(jù)格式。
關(guān)鍵詞:AutoLISP;道路勘測;橫斷面數(shù)據(jù)
中圖分類號:TP39 文獻(xiàn)標(biāo)識碼:A 文章編號:2096-4706(2025)02-0158-05
Automatic Output of Road Cross-section Data Based on AutoLISP
PENG Yining
(Shanghai Jiyuan Construction Engineering Consulting Co., Ltd., Shanghai 201700, China)
Abstract: In the survey of municipal roads, cross-section data extraction is one of the common interior work tasks. During the analysis of collected cross-section data, the data usually needs to be measured one by one by the interior staff through AutoCAD software, and there are problems of low work efficiency, large workload, and error-prone data. This paper uses AutoLISP language to carry out secondary development of program in AutoCAD software, and it realizes that the cross-section points on the cross-section line in the map could output with full-automation into cross-section data format of three rows per group, avoiding manual and repeated measurement and trouble input process. The practice has proven that this method effectively improves the efficiency and data quality of interior work, and it can also extract and output various cross-section data formats with minor modifications to the program.
Keywords: AutoLISP; road survey; cross-section data
DOI:10.19850/j.cnki.2096-4706.2025.02.030
0 引 言
在市政道路勘測設(shè)計階段,需要進(jìn)行道路勘測,其主要任務(wù)和工作是為設(shè)計提供真實可靠的測量數(shù)據(jù),測量數(shù)據(jù)包括道路帶狀地形數(shù)據(jù)、斷面數(shù)據(jù)等,道路斷面圖能直觀的體現(xiàn)現(xiàn)狀地形起伏情況,其中橫斷面是道路設(shè)計及填挖土方量預(yù)算的重要依據(jù),從而需要測量人員進(jìn)行野外斷面測量工作,橫斷面測量一般采用常規(guī)測量實測或建立DEM模型、TIN構(gòu)建不規(guī)則三角網(wǎng)、生成等高線等方法內(nèi)插生成橫斷面點,內(nèi)業(yè)則按設(shè)計要求的三行一組格式提供道路設(shè)計中線樁上的橫斷面數(shù)據(jù)。制作橫斷面數(shù)據(jù)常規(guī)操作是測量技術(shù)人員內(nèi)業(yè)使用AutoCAD軟件采用傳統(tǒng)手工方法通過每條橫斷面線上的斷面點逐個量取至中樁間距并記錄至Excel文檔的工作,此過程給測量技術(shù)人員帶來了大量重復(fù)煩瑣的工作,不僅效率低且數(shù)據(jù)容易出錯等現(xiàn)實問題困擾著測量技術(shù)人員[1-4],或者使用常用的CASS軟件提取橫斷面數(shù)據(jù),但斷面數(shù)據(jù)格式不符合設(shè)計要求,需要使用專用的轉(zhuǎn)換程序[5-6],當(dāng)內(nèi)業(yè)使用半自動程序輸出時,雖然工作效率有所提高,但還是需要手工方式對每條橫斷面逐個選取,效果不太理想,因此迫切需要通過一種新的提取輸出方式來改變這一現(xiàn)狀[7]。
基于上述問題與橫斷面數(shù)據(jù)格式分析,借助AutoCAD軟件二次開發(fā)的開放性,AutoLISP程序語言簡單易學(xué)的特性,本文提出基于AutoLISP語言在AutoCAD軟件二次開發(fā)實現(xiàn)自動提取輸出三行一組橫斷面數(shù)據(jù)的方法,可以使得橫斷面數(shù)據(jù)提取輸出作業(yè)實現(xiàn)完全自動化,該方法可有效提高內(nèi)業(yè)工作效率與數(shù)據(jù)質(zhì)量。
1 AutoCAD二次開發(fā)概述
隨著AutoCAD制圖軟件在工程測量行業(yè)的廣泛應(yīng)用,使用開放的體系結(jié)構(gòu),允許用戶可以采用嵌入式的開發(fā)語言對其進(jìn)行功能擴(kuò)充,滿足用戶特殊的要求,合理應(yīng)用AutoCAD二次開發(fā)技術(shù),可以根據(jù)數(shù)據(jù)類型、數(shù)據(jù)成果等特點進(jìn)行針對性的二次開發(fā)。
LISP是表處理程序語言,在人工智能學(xué)科領(lǐng)域廣泛采用,AutoLISP由AUTODESK公司在LISP語言基礎(chǔ)上開發(fā)的一種僅能運(yùn)行于AutoCAD內(nèi)部的解釋型程序語言,用于擴(kuò)展和定制AutoCAD軟件功能,該程序語言簡單易懂,非常易于理解和閱讀,內(nèi)含于AutoCAD軟件中,不挑剔編輯環(huán)境,文本編輯器即可編寫,與AutoCAD緊密集成,可直接訪問和操作AutoCAD中的對象和功能,AutoLISP語言所有成分都是以函數(shù)形式,沒有語句概念與其他語法結(jié)構(gòu),提供了一系列函數(shù)調(diào)用,統(tǒng)一表達(dá)式為表結(jié)構(gòu),可以直接調(diào)用執(zhí)行AutoCAD命令,AutoLISP的特點在AutoCAD二次開發(fā)中成為最主要的基礎(chǔ)開發(fā)工具之一,通過命令A(yù)PPLOAD加載后使用,基本結(jié)構(gòu)如下:
(defun c:**();自定義命令函數(shù)聲明
(vl-load-com);加載ActiveX擴(kuò)展函數(shù)
(setq **);變量聲明
(……);實現(xiàn)代碼
)
用戶定義的函數(shù),**為啟動命令,AutoCAD加載此函數(shù)后輸入此命令執(zhí)行
2 數(shù)據(jù)采集與分析
2.1 數(shù)據(jù)采集
橫斷面點是各中樁處垂直于路線方向上的地形起伏點,在市政道路勘測實際工作中目前常用的獲得橫斷面點方式大多使用全站儀[8]、RTK常規(guī)野外測量,沿著橫斷面方向,根據(jù)實際地形變化走勢實測采集獲取斷面點三維坐標(biāo)數(shù)據(jù)或使用地形碎步點構(gòu)建不規(guī)則三角網(wǎng)、建立DEM模型、生成等高線、實景三維數(shù)據(jù)、機(jī)載激光雷達(dá)[9]等方式獲取、內(nèi)插生成橫斷面線上的斷面點三維坐標(biāo)數(shù)據(jù)。當(dāng)采用實測時,野外測量時應(yīng)保持左、右方向上的斷面點大致在一個方向上,目前隨著RTK技術(shù)發(fā)展[10],RTK測量技術(shù)表現(xiàn)出了極大的優(yōu)勢,RTK自帶橫斷面測量功能,使得采用常規(guī)野外測量橫斷面點時不會偏離斷面方向,且不受橫向通視條件限制,在市政道路勘測中使用RTK實測采集橫斷面點應(yīng)當(dāng)作為首選。
如圖1中的市政道路中線及橫斷面線由設(shè)計單位提供,橫斷面線也可通過設(shè)計要求左右側(cè)寬度數(shù)據(jù)使用南方CASS軟件自動生成,道路中樁數(shù)據(jù)由野外測設(shè)作業(yè)采集獲得。當(dāng)獲取中樁、橫斷面點三維坐標(biāo)數(shù)據(jù)后,內(nèi)業(yè)在AutoCAD為平臺分別展出中樁及橫斷面點,展點后的橫斷面點以中樁為中心分布于橫斷面線上左、右兩側(cè),采用實測展出的斷面點時,偶爾會產(chǎn)生方向偏差,展點后不一定全在橫斷面線上,偏差點在偏差范圍內(nèi)應(yīng)處理至橫斷面線上,便于后續(xù)提取輸出,在些不再贅述。
2.2 數(shù)據(jù)分析
根據(jù)設(shè)計單位提出的三行一組橫斷面數(shù)據(jù)格式要求,使用TXT或Excel文件作為存儲載體,文件內(nèi)容中的數(shù)據(jù)是按道路設(shè)計中樁的順序為每條橫斷面,其每條橫斷面格式是第一行為里程樁號,第二行為中線前進(jìn)方向左側(cè)斷面數(shù)據(jù),斷面點相對中樁平距、絕對高程為一對數(shù)據(jù),依次向后由近至遠(yuǎn)填寫,如使用TXT文件需用“,”符號隔開,第三行為右側(cè)斷面數(shù)據(jù),數(shù)據(jù)格式和左邊一樣,此三行為一中樁處完整的橫斷面數(shù)據(jù),其余中樁類似。數(shù)據(jù)格式如表1所示。
為了提取輸出滿足于設(shè)計要求的三行一組橫斷面數(shù)據(jù)格式,本文結(jié)合圖1為參考介紹使用AutoLISP編程選擇中線后獲取中樁、橫斷面線、橫斷面點三維坐標(biāo)數(shù)據(jù)后自動提取輸出橫斷面數(shù)據(jù)的過程方法。
3 程序原理及流程
通過圖1所示的中線、中樁、橫斷面線、橫斷面點、橫斷面數(shù)據(jù)格式分析得出,道路中線為PLINE多段線,橫斷面線為LINE直線,中樁為符號塊,橫斷面點為符號塊。中線上的中樁符號是生成橫斷面數(shù)據(jù)的基礎(chǔ),橫斷面線及橫斷面點數(shù)據(jù)具有規(guī)律性,橫斷面線沿著中線方向布置,且橫斷面點都在橫斷面線上,通過對圖上道路中線、中樁、橫斷面線、橫斷面點實體的獲取,按實體特定的規(guī)則循環(huán)遍歷,采用AutoLISP語言完全可實現(xiàn)自動提取輸出三行一組橫斷面數(shù)據(jù)的功能。程序中只要獲取中樁至中線起點的距離,即可提取輸出第一行的里程數(shù)據(jù),再按中樁與橫斷面線起點獲取左側(cè)所有橫斷面點,通過橫斷面點坐標(biāo)與中樁坐標(biāo)依次反算求出橫斷面點相對中樁的平距,緊接著再依次提取出橫斷面點符號的Z坐標(biāo)值,即可提取輸出第二行左側(cè)橫斷面點相對中樁平距和該點的絕對高程,依次提取輸出左側(cè)所有數(shù)據(jù)。第三行右側(cè)按中樁與橫斷面線端點獲取右側(cè)橫斷面點提取輸出,按左側(cè)提取輸出同樣原理依次提取輸出右側(cè)所有數(shù)據(jù)。重復(fù)以上過程依次獲取道路中線上所有橫斷面線,提取輸出三行一組橫斷面數(shù)據(jù)。
編程環(huán)境采用AutoCAD本身自帶的編輯工具,代碼編寫完成經(jīng)調(diào)試后保存為.LSP文件,在AutoCAD命令行輸入APPLOAD命令加載此文件,命令行輸入函數(shù)命令即可執(zhí)行程序。編輯環(huán)境如圖2所示。
根據(jù)程序原理介紹并結(jié)合實際的程序設(shè)計,以AutoCAD為開發(fā)平臺,在程序運(yùn)行的過程中只需要選擇中線和保存數(shù)據(jù)路徑兩個步驟為人工操作外,其他相關(guān)操作都由程序自動完成。由此得出基于AutoLISP語言二次開發(fā)實現(xiàn)自動輸出橫斷面數(shù)據(jù)的基本流程如圖3所示。
4 程序?qū)崿F(xiàn)步驟及主要代碼
4.1 程序步驟
具體步驟如下:
1)獲取中線:圖上選取道路中線,轉(zhuǎn)為VLA對象后可使用VLA擴(kuò)展函數(shù),利用VLA擴(kuò)展函數(shù)獲取中線的最小包圍盒左下角與右下角坐標(biāo)。
2)獲取中樁及里程:利用中線最小包圍盒左下角與右下角自動框選出圖中道路中線上所有中樁,使用循環(huán)遍歷獲取每個中樁至中線起點的距離和中樁三維坐標(biāo)分別存儲于中樁里程表和中樁坐標(biāo)表變量中。由于框選出的中樁順序是不固定的,中樁里程表和中樁坐標(biāo)表變量中的內(nèi)容順序也同樣是不固定的,后續(xù)無法按順序提取輸出數(shù)據(jù),此時利用VLA擴(kuò)展函數(shù)對表中的內(nèi)容順序按距離從小到大排序。
3)保存數(shù)據(jù)路徑:通過寫入遞增的方式保存為.txt文件,輸出的橫斷面數(shù)據(jù)將保存于此文件中。
4)獲取橫斷面線:利用中樁坐標(biāo)表變量中的坐標(biāo)自動攔選出中線上所有橫斷面線,此時橫斷面線的順序是與中樁里程、中樁坐標(biāo)順序一致的,循環(huán)遍歷拉選出的每條橫斷線。
5)中樁里程提取輸出:從中樁里程表變量中提取輸出中樁里程數(shù)據(jù),即第一行里程樁號輸出至TXT文件中。
6)獲取左側(cè)斷面點提取輸出:從中樁坐標(biāo)表變量中提取中樁坐標(biāo),提取橫斷面線左側(cè)起點坐標(biāo),自動攔選出左側(cè)橫斷面線上所有橫斷面點,獲得左側(cè)橫斷面點集,橫斷面點集依次循環(huán)遍歷,通過橫斷面點坐標(biāo)與中樁坐標(biāo)反算出橫斷面點與中樁平距,提取斷面點的Z值,同行輸出左側(cè)的距離、高程數(shù)據(jù),即第二行左側(cè)數(shù)據(jù)輸出至TXT文件中。
7)獲取右側(cè)斷面點提取輸出:以左側(cè)同樣的方法,依次攔選右側(cè)橫斷面點輸出右側(cè)距離、高程數(shù)據(jù),即第三行右側(cè)數(shù)據(jù)輸出至TXT文件中。
8)一組數(shù)據(jù)提取輸出完成:通過步驟5)、6)、7)完成一條橫斷面線三行一組橫斷面數(shù)據(jù)輸出。
9)全部輸出完成:通過獲取橫斷面線集的循環(huán)遍歷,按順序通過步驟5)、6)、7)輸出每條橫斷面數(shù)據(jù),直至所有橫斷面線提取輸出完成,程序結(jié)束。
4.2 主要代碼
主要代碼內(nèi)容如下:
(setq vla (vlax-ename-gt;vla-objec (car (entsel))));選中線
(VLA-GetboundingBox vla 'minpoint 'maxpoint)
(setq hk (ssget \"c\"(VLAX-Safearray-gt;list minpoint) (VLAX-Safearray-gt;list maxpoint)))
(repeat (sslength hk)
(setq lczh (vlax-curve-getDistAtPoint vla pt))
);里程
(setq hkpp (vl-sort hkpp'(lambda (a b)(lt; (car a) (car b))));排序
(repeat (length hkpp)
(setq ppss (cons lczh ppss))
(setq pdss (cons gzb pdss))
)
(setq ffa (open (getfiled \"\" \"\" \"txt\" 1) \"w\"));輸出
(setq hk (ssget \"f\" pdss));橫斷面線
(repeat (sslength hk)
(write-line (nth hii ppss) ffa);里程輸出
(setq gk (ssget \"f\" (list (list (car hzb) (cadr hzb)) (list (car hzb1) (cadr hzb1)))))
(repeat (sslength gk)
(setq gzb (cdr (assoc 10 (entget (ssname gk gi)))))
(setq gzbxy (list (car gzb) (cadr gzb)))
(setq ggc (caddr gzb))
(setq jls (sqrt (+ (* (- zx (car gzb)) (- zx (car gzb))) (* (- zy (cadr gzb)) (- zy (cadr gzb))))))
(setq pdz (strcat (rtos jls 2 2) \",\" (rtos ggc 2 2)))
(princ pdz ffa);左側(cè)輸出
)
(princ \"\n\" ffa)
……右側(cè)橫斷面數(shù)據(jù)輸出與左側(cè)相同
)
5 程序應(yīng)用
啟動AutoCAD軟件,打開圖4的.DWG某工程市政道路勘測文檔自動提取輸出橫斷面數(shù)據(jù),設(shè)計全長691.896米,中線按20間距左右各60米范圍布設(shè)橫斷面線,勘測外業(yè)采集、內(nèi)業(yè)編輯工作已全部完成,中樁與斷面點已經(jīng)展繪在圖上。如果沿用手工方式量取每條橫斷面線上斷面點相對中樁平距,斷面高程再錄入至Excel中,勞動強(qiáng)度非常大,工作效率低且易出錯,而采用AutoLISP編寫的自動提取輸出程序的應(yīng)用,命令行輸入APPLOAD加載HDMSC自動輸出橫斷面輸出.lsp程序,命令行輸入HDMSC命令“回車”后在圖上選擇道路設(shè)計中線,彈出保存數(shù)據(jù)對話框選擇數(shù)據(jù)保存路徑,確定即可按設(shè)計要求的三行一組橫斷面格式提取輸出至TXT文件中,提取輸出數(shù)據(jù)的整個過程都無須任何干預(yù),所有橫斷面數(shù)據(jù)輸出時間只需要1秒鐘。程序結(jié)束后對提取輸出的橫斷面數(shù)據(jù)進(jìn)行圖中手工量取檢核,說明該程序提取輸出的橫斷面數(shù)據(jù)準(zhǔn)確、可靠,格式均符合要求。
從圖4中提取輸出的橫斷面數(shù)據(jù)部分結(jié)果如圖5所示。
采用AutoLISP語言編寫的自動輸出橫斷面數(shù)據(jù)程序已在我單位多項市政道路勘測工程中得到應(yīng)用驗證,自動化程度很高,提取輸出的橫斷面數(shù)據(jù)準(zhǔn)確無誤,保證了工期,減輕了工作量,確保了數(shù)據(jù)質(zhì)量,為測量技術(shù)人員內(nèi)業(yè)提取輸出橫斷面數(shù)據(jù)時提供了有力保障。
6 結(jié) 論
本文闡述了在市政道路勘測中基于AutoLISP程序語言二次開發(fā)自動輸出三行一組的橫斷面數(shù)據(jù)程序應(yīng)用,在提取橫斷面數(shù)據(jù)工作效率與數(shù)據(jù)質(zhì)量方面有著極大的優(yōu)勢,杜絕了采用傳統(tǒng)手工方法重復(fù)煩瑣且易出錯的問題,應(yīng)用證明了ATUOLISP 程序語言在道路勘測中發(fā)揮著越來越大的作用。該程序還可以根據(jù)實際應(yīng)用需要,稍微改動代碼,便可完全自動化提取輸出不同格式、不同數(shù)據(jù)值要求的橫斷面數(shù)據(jù),如CASS格式,一行一組格式等,數(shù)據(jù)值可相對前點距離,相對前點高差,相對中樁高差等,能滿足絕大多數(shù)道路設(shè)計軟件格式。后期將在實測點與橫斷面線存在一定偏差手工處理等方面加予探索,實現(xiàn)更高的自動化。
參考文獻(xiàn):
[1] 潘智勇.基于實景三維數(shù)據(jù)的道路橫斷面自動提取方法研究 [D].阜新:遼寧工程技術(shù)大學(xué),2023.
[2] 常君鋒,孫增輝,王月.破碎地形路線斷面數(shù)據(jù)自動提取方法探討 [J].地理空間信息,2021,19(11):38-40+7.
[3] 徐加榮,魏敏.基于AutoCAD的道路橫斷面的提取方法 [J].地礦測繪,2021,37(1):40-44.
[4] 榮幸.利用DEM在AutoCAD Civil 3D下自動提取斷面數(shù)據(jù) [J].地礦測繪,2013,29(4):31-34.
[5] 馬俊杰,王少文.CASS橫斷面數(shù)據(jù)與飛時達(dá)等斷面數(shù)據(jù)轉(zhuǎn)換的程序設(shè)計 [J].科學(xué)技術(shù)創(chuàng)新,2024(8):82-86.
[6] 肖怡,徐益飛,趙飛,等.一種基于C~#語言開發(fā)的公路橫斷面轉(zhuǎn)換技術(shù) [J].交通科技,2024(2):43-49.
[7] 唐爭氣;陳正陽.基于Visual LISP全路線橫斷面數(shù)據(jù)自動提取 [J].湖南城市學(xué)院學(xué)報:自然科學(xué)版,2013,22(2):28-30.
[8] 湯世海.全站儀測繪技術(shù)在市政道路測量中的應(yīng)用 [J].智能城市,2021,7(16):145-146.
[9] 高波,縱瑾,李濤.機(jī)載激光雷達(dá)技術(shù)在高速公路橫斷面測量中的應(yīng)用 [J].測繪通報,2023(S1):11-14.
[10] 漆志軍,鄒海峰,于群松,等.基于無人機(jī)RTK輔助定位技術(shù)的研究與應(yīng)用 [J].公路,2020,65(12):201-203.
作者簡介:彭奕寧(1985.08—),男,壯族,廣西柳州人,測繪師,研究方向:工程測量。
收稿日期:2024-06-19