鄭偉安 孟大鵬 王秀元 崔秀明 凌曉春
摘要: 在大比例尺地形圖編輯中存在大量的依比例斜坡類符號要素,包括依比例斜坡、干堤、加固岸、路堤、路塹等,該類符號是一種復(fù)合性符號,由坡頂線和坡面兩部分組成,坡頂線由坡頂母線和長短齒符號組成,其中長齒長度和坡面寬度一致且垂直于坡頂母線,該符號表示復(fù)雜,編輯工作較為費時費力。利用AutoLISP語言開發(fā)斜坡類符號要素處理程序,實現(xiàn)符號長齒自動延伸,可大大提高該類符號編輯工作效率,提升制圖表達效果。
關(guān)鍵詞: 斜坡類要素;AutoLISP語言;地形圖
中圖分類號: ?P208 ?????文獻標(biāo)識碼: ?A ???doi:10.12128/j.issn.1672 ?6979.2023.04.009
引文格式: 鄭偉安,孟大鵬,王秀元,等.一種基于AutoLISP的地形圖斜坡類要素處理程序的設(shè)計與實現(xiàn)[J].山東國土資源,2023,39(4):58 63. ZHENG Wei'an, MENG Dapeng, WANG Xiuyuan, et al. Design and Implementation of a Topographic Slope ?like Element Processing Program Based on AutoLISP[J].Shandong Land and Resources,2023,39(4):58 ?63.
0 引言
LISP語言是一種廣泛應(yīng)用的程序設(shè)計語言,該語言處理的對象為符號表達式,因此也稱為符號式語言,LISP語言具有語法簡單,編寫程序便捷、靈活,數(shù)據(jù)類型豐富等特點[1]。AutoLISP是由Autodesk公司開發(fā)的一種專門為AutoCAD二次開發(fā)設(shè)計的LISP編程語言,它即有LISP語言人工智能的特性,又有AutoCAD強大的圖形編輯功能等特點,可以把AutoLISP程序和AutoCAD繪圖功能結(jié)合起來[2],實現(xiàn)部分制圖功能的自動化,可大大提升地形圖編輯工作效率,提升制圖效果。
Geoway3.6軟件是一款優(yōu)秀的地形圖編輯軟件,具有強大的地形圖編輯和優(yōu)秀的符號設(shè)計功能[3]。在Geoway3.6軟件下可對符號進行自主設(shè)計,形成符合要求的符號系統(tǒng)。在Geoway3.6軟件中斜坡類符號的實現(xiàn)有一定優(yōu)勢,但難以實現(xiàn)斜坡長齒長度與斜坡寬度一致,需要將數(shù)據(jù)導(dǎo)出dxf格式,在AutoCAD軟件中進一步進行處理。本文主要討論了使用AutoLISP語言,在AutoCAD軟件下開發(fā)一套地形圖斜坡類要素處理程序,實現(xiàn)斜坡類要素長齒符號的自動延伸功能。
1 斜坡類符號結(jié)構(gòu)及實現(xiàn)思路
1.1 符號結(jié)構(gòu)
在大比例尺地形圖編輯工作中,依比例斜坡類要素是一種常見的符號要素,主要包括依比例尺干堤、加固岸、斜坡、斜坡式路塹等。以1 ?∶ ?2000比例尺未加固斜坡為例,未加固斜坡指各種天然形成或人工修筑但未加固的坡度在70°以下的坡面地段。未加固斜坡在圖上投影寬度小于2mm時,以陡坎符號表示,斜坡在圖上投影寬度大于2mm時,根據(jù)實際坡面寬度表示[4]。依比例未加固斜坡符號是一種復(fù)合符號,由坡頂線和坡面兩部分組成,坡頂線由坡頂母線和長短齒符號組成,其中坡頂線是一條有向線,長短齒符號在前進方向右側(cè),長齒長度和坡面寬度一致且垂直于坡頂母線。
未加固斜坡的幾何表示和制圖表達如圖1[5]。
1.2 符號實現(xiàn)思路
依比例斜坡類符號的表示十分復(fù)雜,編輯實現(xiàn)費時費力,不同的專業(yè)軟件也給出不同的解決方案,但優(yōu)缺點各異。在EPS軟件中,該類要素是一種程序符號,首先采集坡頂邊線,起筆點為坡頂線起點,然后逆時針采集整個斜坡符號,形成閉合面,然后在坡頂線終點處打“J”,程序自動生成坡頂線和坡面符號[6],該實現(xiàn)方法符號的長短齒方向不規(guī)范難以滿足制圖要求,需要后期進行人工調(diào)整,較為費時費力。
在Geoway3.6中依比例斜坡類符號的表示較為簡單,即只表示坡頂線和斜坡面即可,且斜坡長短齒符號的方向符合圖式要求,省去后期人工調(diào)整工作,但該軟件表示的斜坡長齒長度是固定的,不能滿足圖式要求,需要將數(shù)據(jù)導(dǎo)出dxf格式,在AutoCAD軟件使用AutoLISP語言開發(fā)程序?qū)崿F(xiàn)斜坡長齒的自動延伸處理。未處理的加固斜坡在AutoCAD下的表現(xiàn)形式見圖2。
實現(xiàn)的具體思路:首先在Geoway3.6下利用其符號庫編輯功能對斜坡類符號進行改造,將符號長齒全局寬度設(shè)置為與其他線符號寬度不同的全局線寬[7]。以1 ?∶ ?2000比例尺地形圖為例,符號基本線寬為圖上0.15mm,在AutoCAD下全局線寬為圖上基本線寬乘以比例尺分母,再換算成單位“m”,即全局寬度為0.3m,本例設(shè)置成0.24m即可。然后使用AutoLISP程序,創(chuàng)建某一斜坡類符號范圍線選擇集,選取全部該斜坡類符號范圍線,再逐一遍歷每一范圍線,根據(jù)范圍線創(chuàng)建選擇集,選取全局線寬為0.24m的斜坡長齒,再執(zhí)行LISP語言的擴展命令“extend”,將斜坡長齒延伸至坡面底部。
2 AutoCAD圖形信息
AutoCAD的圖形有dwg、dxf等格式,是由多個圖形對象組成的,最基本的圖形對象稱作圖元[8]。圖元間以鏈表的形式存儲,圖元的命名是唯一的,用十六進制表示[2]。
AutoCAD圖形的信息分類標(biāo)準(zhǔn)為dxf組碼[8],例如“8”代表圖層,圖層名則為組碼“8”對應(yīng)的字符串,如TERA(地貌與土質(zhì)(面))、TFCL(地貌附屬(線));“0”代表線型,線型名則為組碼“0”對應(yīng)的字符串,如LWPOLYLINE(輕量多段線)。
AutoCAD的圖形信息的查詢可使用(entget(car(entsel(提示信息))))語句。(entsel[提示信息])提示用戶以單點方式選擇單個對象,提示信息用于提示用戶的字符串,若省略提示信息,則提示信息為“選擇對象”。該函數(shù)返回值為表,由2個元素組成,第一個元素為選擇對象的圖元名,第二個元素為選擇對象時拾取點在當(dāng)前UCS下的坐標(biāo)[9],car(entsel(提示信息))語句返回第一個元素即圖元名。
entget用于取出(car(entsel(提示信息)))的列表信息,返回的是選中圖元的圖元表信息;圖元表的每個元素還是表,子表的第一個元素為有一定含義的整數(shù),與圖元在圖形交換文件(DXF)中的圖元代碼含義相同,多數(shù)子表采用了點對結(jié)構(gòu)。圖元表記錄圖元的名稱、類型、幾何數(shù)據(jù)、圖層、顏色、全局線寬等信息[10],通過查詢獲得相關(guān)要素的圖元信息,這些信息可作為選擇集構(gòu)建的過濾信息使用。
3 選擇集的構(gòu)建方法
選擇集是有名字的一些圖元名稱的集合,對圖形對象進行編輯和修改時,首先需要構(gòu)建選擇集[11]。
選擇集構(gòu)建方法:(ssget[選擇方法][點1][點2][點表][過濾表]),
選擇方法有以下幾種:
C(Crossing):選中與點1、點2所確定的窗口相交的對象。
CP(Cpolygon):選中與點表所確定的多邊形相交的對象。
W(Window):選中整體在點1、點2確定的窗口之內(nèi)的對象。
WP(Wpolygon):選中整體在點表所確定的多邊形之內(nèi)的對象。
X:選中整個數(shù)據(jù)庫,包括關(guān)閉、凍結(jié)圖層上的對象和屏幕之外的對象[12]。
點1、點2、點表、過濾表和選擇方法配合使用。而過濾表的作用是通過過濾表描述的條件對所選的圖元對象進行過濾篩選,最后只保留滿足過濾條件的圖元對象。過濾表描繪的是entget函數(shù)返回的圖元表點對信息。
如' (0. "LWPOLYLINE")、(8. "TERA")、(40. 0)或(list(cons 0 "LWPOLYLINE")(cons 8 "TERA")(cons 40 0)),分別代表線型為輕多義線、圖層名為TERA、全局線寬為0m的過濾信息。
(cons元素1、元素2)是一項基礎(chǔ)函數(shù),當(dāng)?shù)?個元素是一個表時,該函數(shù)將第1個元素插入到第2個元素表示的表內(nèi)并作為該表的第1個元素,該函數(shù)返回的是添加了第1個元素后的表,但當(dāng)兩個元素都是原子時,則該函數(shù)返回的并不是一個表,而是一個點對[12]。例如:(cons 8 "TERA")返回的是(8." TERA")。通過(list[表達式…])可將任意數(shù)目的表達式合成為一個表并作為返回值返回,如(list(cons 0 "LWPOLYLINE")(cons 8 "TERA")(cons 40 0)(cons 70 1))返回的就是由線型、圖層名、線寬、是否閉合4種條件構(gòu)成的過濾表。
4 斜坡類符號選擇集的構(gòu)建
4.1 符號范圍線選擇集構(gòu)建
以依比例尺斜坡為例,斜坡范圍線圖層名為“TERA”,全局線寬為0,是一條閉合的輕量多段線。
該類符號選擇集構(gòu)建程序為:(setq saa (ssget "X" (list(cons 0 "LWPOLYLINE")(cons 8 "TERA")(cons 40 0)(cons 70 1)))) ,該選擇集的成員是當(dāng)前成果中的所有圖層名為TERA的全局線寬為0的且未封閉的輕多義線,如成功構(gòu)建則將選擇結(jié)果賦給變量saa。
上述構(gòu)建了一個地貌面符號范圍線的選擇集,將TERA層(地貌面)中的所有線寬為0且閉合的范圍線進行了選擇集構(gòu)建,TERA層涉及的地類包括依比例未加固斜坡、加固斜坡,梯田等斜坡類符號[13]。
4.2 斜坡長齒符號選擇集構(gòu)建
在對斜坡長符號進行選擇集構(gòu)建前,需要首先獲取斜坡類符號范圍線矢量上的坐標(biāo)點對信息,即范圍線矢量上的點坐標(biāo)。在圖元表的點對信息中10代表的是坐標(biāo)信息,如(10 ??45.0 150.0),10后面的 ?45.0 150即是該點在圖上的坐標(biāo)信息。獲取圖元的圖元表點對信息后,通過car獲取圖元表的第一個元素,如果該元素是10,則判定該圖元表點對信息為表示坐標(biāo)的點對信息。判定正確后,通過cdr函數(shù)獲取去掉了第一個元素的表,該表即坐標(biāo)信息表,然后使用前面介紹的cons函數(shù),將所選范圍矢量上的所有點的坐標(biāo)逐個添加給PT ?LST圖元表[14]。實現(xiàn)語句如下:
(if (/= saa nil)
(progn
(setq tem 0)
(setq len (sslength saa))
(while (< tem len)
(setq entname (ssname saa tem))
(progn
(setq ENT (entget entname)
N 0
PT ?LST '()
)
(while (/= (setq EI (nth N ENT)) NIL)
(if(= (car EI) 10)
(setq PT ?LST (cons (cdr EI) ?PT ?LST))
)
setq N (+ N 1 ))
)
)
上述語句中car、cdr都是基礎(chǔ)函數(shù)。car和cdr用于分割表list,car是一個無害的函數(shù), 它只返回第一個元素,并不從表list移除第一個元素, car執(zhí)行完后表list并沒有發(fā)生改變。cdr函數(shù)返回表list中首元素后面的其他元素[15]。語句中(sslength saa)返回選擇集saa內(nèi)的圖形對象數(shù)目;(ssname saa 序號)返回選擇集saa中由序號指定的那個圖形對象的圖元名,選擇集中第一個元素的序號為0,如果成功則返回圖元名,如<圖元名: 7ee68b98>,否則返回nil;(nth N ENT)返回表的第N個元素,元素的序號從0開始,如果N超出表的最后一個元素的序號,則返回nil[16]。setq EI (nth N ENT)語句功能則是將所選范圍矢量的第N個元素的信息賦值給EI,通過循環(huán)調(diào)用該語句,可把范圍矢量所有或指定信息賦值給EI。
將范圍線上信息賦值給EI后通過if(= (car EI) 10)語名判定該信息是否是坐標(biāo)信息,如果是,則使用(setq PT ?LST (cons (cdr EI) PT ?LST))語句將斜坡范圍線上的點坐標(biāo)信息逐一添加給PT ?LST表,當(dāng)將斜坡范圍線上的所有點的坐標(biāo)對信息添加給PT ?LST表后,PT ?LST內(nèi)則存儲了斜坡范圍線上所有點的平面坐標(biāo)。此時,可以PT ?LST表中的平面坐標(biāo)點對信息構(gòu)建選擇集。斜坡坡頂母線、長短齒符號所在層為TFCL層,由于我們使用長齒的全局線寬作為選擇集構(gòu)建的過濾信息,因此該選擇集的構(gòu)建與圖層名無關(guān)。選擇集構(gòu)建語句如下:
(setq scc (ssget "WP" PT ?LST '((0 . "LWPOLYLINE")(40 . 0.24))))
該語句功能為構(gòu)建完全在斜坡符號范圍線(PT ?LST,范圍線坐標(biāo)點對信息)內(nèi)的全局線寬為0.24m的長齒多段線選擇集,由于只將斜坡長齒的全局線寬修改為0.24m,選擇集構(gòu)建時,無論斜坡范圍線內(nèi)有何種符號,也只會選擇斜坡長齒這一類符號。其中WP選項為選中整體在坐標(biāo)點對信息表所確定的范圍矢量內(nèi)的對象。
5 斜坡類符號自動延伸功能實現(xiàn)
構(gòu)建完成斜坡長齒的選擇集后,需將所有長齒的圖元名稱和長齒的終點坐標(biāo)逐一添加到PT ?LST1圖元表中。添加完成后需使用REVERSE語句對PT ?LST1圖元表中信息進行反轉(zhuǎn)處理,形成符合延伸命令要求的圖元表信息[17]。實現(xiàn)語句如下:
(if (/= scc nil)
(progn
(setq tem1 0)
(setq len1 (sslength scc))
(while (< tem1 len1)
(setq entname1 (ssname scc tem1))
(progn
(setq ENT1 (entget entname1)
N1 ?0
T1 ?1
PT ?LST1 '()
)
(while (/= (setq EI1 (nth N1 ENT1)) NIL)
(if (= (car EI1) ??1)
(setq PT ?LST1 (cons (cdr EI1) PT ?LST1))
;添加圖元名稱到PT ?LST1
)
(if (= (car EI1) 10)
(progn
(if (/= T1 1);用于判定長齒終點坐標(biāo)
(setq PT ?LST1 (cons (cdr EI1) PT ?LST1));添加長齒終點坐標(biāo)到PT ?LST1
(setq T1 (+ T1 1))
)
)
)
(setq N1 (+ N1 1))
)
)
(setq PT ?LST1 (reverse PT ?LST1));反轉(zhuǎn)處理
實現(xiàn)斜坡長齒的自動延伸功能,需循環(huán)調(diào)用LISP程序中的extend功能實現(xiàn),實現(xiàn)語句如下:
(command "extend" entname ""PT ?LST1 "")
其中entname 中包含斜坡類符號范圍線的圖元名信息,PT ?LST1包含為該斜坡范圍面內(nèi)的長齒符號中的圖元名和長齒終點坐標(biāo)信息表,""為該使命令的默認選項。在實際工作中,部分斜坡長齒符號起止點方向錯誤,會造成符號無法正常延伸,因此需要在Geoway符號設(shè)計器中對長齒符號進行返轉(zhuǎn)處理,使起點在上、止點在下即可。
在循環(huán)調(diào)用以上命令完成所有斜坡類符號長齒自動延伸后,由于長齒符號全局線寬為0.24m,不符合圖式要求,還需對所有斜坡長齒進行編輯,按圖式要求修改長齒的全局線寬為0.3m。主要程序代碼如下:
(command "pedit" entname1 "w" 0.3 "")
其中entname1為線寬為0.24m的斜坡長齒圖元名的變量,w代表寬度,0.3m斜坡長齒的新寬度,通過循環(huán)調(diào)用該語句可實現(xiàn)所有線寬為0.24m的斜坡類符號長齒的全局線寬的修改。最后由于斜坡類符號范圍線符號僅作為一種過渡性矢量,長齒符號延伸完成后,應(yīng)調(diào)用"erase" 命令作刪除處理。經(jīng)延伸處理后的加固斜坡如圖3所示。
6 結(jié)語
斜坡類符號是大比例尺地形圖編輯中最常見的一種符號之一,斜坡自動延伸程序的開發(fā),大大提高了該類符號的作業(yè)生產(chǎn)效率,作業(yè)過程中只需表達出斜坡的坡頂母線和斜坡范圍面即可,無需過多操作,同時由于坡頂線表達出的長短坡齒符號方向正確,自動延伸完成后,即可符合圖式要求,省去了大量人工調(diào)整坡齒方向時間。經(jīng)過實驗驗證,該程序在地形圖編輯中可節(jié)約10min/km2,且大大提高了制圖效果,在實際生產(chǎn)作業(yè)中具有很強的推廣使用價值。
參考文獻:
[1] ?李學(xué)志,方戈亮,孫力紅.Visual LISP程序設(shè)計(第2版)[M].北京:清華大學(xué)出版社,2010:104 ?106.
[2] ?高何利,何秀國,劉金婷.AutoLISP程序在地形圖圖廓整飾中的應(yīng)用[J].人民長江,2007(10):26 ?27.
[3] ?王玉.基于GEOWAY軟件的基礎(chǔ)地理信息數(shù)據(jù)更新方法:以山西省1 ?∶ ?10000 DLG數(shù)據(jù)更新為例[J].測繪與空間地理信息,2022,45(1):141 ?144.
[4] ?GB/T 20257.1 2017.國家基本比例尺地圖圖式 第1部分:1 ?∶ ?500 1 ?∶ ?1 000 1 ?∶ ?2 000地形圖圖式[S].
[5] ?GB/T 20258.1 2019.基礎(chǔ)地理信息要素數(shù)據(jù)字典 第1部分:1 ?∶ ?500 1 ?∶ ?1 000 1 ?∶ ?2 000比例尺[S].
[6] ?梁燕芬,梁子震.基于EPS的測繪技能競賽制圖解決方案定制[J].測繪通報,2015(S1):235 ?237.
[7] ?趙宇娟.基于Geoway的圖庫一體化的技術(shù)實現(xiàn)[J].甘肅科技,2008(19):40 ?43.
[8] ?孫淑賢,李光明,張貴麗.Auto CAD制作勘查線剖面圖中的數(shù)據(jù)共享及圖形格式交換[J].山東國土資源,2007,23(9):18 ?20.
[9] ?張志遙.基于AutoLISP的巖土工程勘察方案輔助設(shè)計系統(tǒng)研究[J].電子技術(shù)與軟件工程,2022(1):126 ?129.
[10] ?吳泊汛.自動化駝峰設(shè)計檢算系統(tǒng)研究[D].成都:西南交通大學(xué),2012:1 ?20.
[11] ?郭秀娟,范曉鷗.基于AutoLISP的AutoCAD二次開發(fā)研究[J].吉林建筑工程學(xué)院學(xué)報,2008,25(4):82 ?84.
[12] ?陳伯雄,馮偉.Visual LISP for AutoCAD 2000程序設(shè)計[M].北京:機械工業(yè)出版社,2000:110 ?117.
[13] ?曲莉莉.山東省1 ?∶ ?1萬基礎(chǔ)地理信息數(shù)據(jù)庫地形要素更新方法探討[J].山東國土資源,2018,34(7):82 ?85.
[14] ?鄧偉龍.基于VLisp開發(fā)車站信號計算機聯(lián)鎖輔助設(shè)計程序[J].鐵道標(biāo)準(zhǔn)設(shè)計,2014,58(3):127 ?130.
[15] ?商振偉.基于Auto LISP的ADS100航線結(jié)合表的制作程序的設(shè)計[J].地礦測繪,2018,34(3):41 ?43.
[16] ?蒲生亮.基于Visual LISP的水利工程測量軟件工具包的開發(fā)與應(yīng)用[D].呼和浩特:內(nèi)蒙古大學(xué),2013:48 ?52.
[17] ?趙興柱,陳貴海,姜坤序.關(guān)于AtuoLISP在CAD繪制采礦設(shè)計圖中的應(yīng)用[J].有色礦冶,2011,27(4):16 ?18.
Design and Implementation of a Topographic Slope ?like ???Element Processing Program Based on AutoLISP
ZHENG Wei'an1, MENG Dapeng2, WANG Xiuyuan3, CUI Xiuming4, LING Xiaochun1
(1.Shandong Institute of Land Surveying and Mapping, Shandong Ji'nan 250013, China; 2. No.1 Exploration Institute of Geology and Mineral Resources, Shandong Ji'nan 250013, China; 3.Shandong Institute of Geological Sciences, Shandong Ji'nan ?250013, China; 4. Shandong Geology and Mining Mapping Limited Corporation, ?Shandong Ji'nan 250013, China)
Abstract: ?In the large scale topographic map editing has a lot of scale slope symbol elements, including the proportion of slope, embankment, reinforced shore, embankment and cutting. The symbol is a kind of composite symbol, two parts of slope line and slope. Slope line is composed of slope top bus and length symbol, long tooth length and slope width and perpendicular to slope bus. The symbol is complex, editing work is time ?consuming and laborious. By using AutoLISP language, the slope class symbol element processing program can be developed, and the automatic extension of symbol long teeth can be realized. It can greatly improve the efficiency of such symbol editing and improve the effect of drawing expression.
Key words: ?Slope class elements; Auto LISP language; topographic map