陳培龍
(漳州市測(cè)繪設(shè)計(jì)研究院,福建 漳州 363000)
隨著國(guó)民經(jīng)濟(jì)的發(fā)展,我國(guó)的城市建設(shè)也取得了巨大的成就。近年來(lái)城市測(cè)量工作在城市發(fā)展中的作用越來(lái)越突出,而城市地下管線測(cè)量作為城市測(cè)量工作的重要組成部分,越來(lái)越受到相關(guān)部門的重視。城市建設(shè)的飛速發(fā)展,原有城市地下管線資料欠缺的矛盾越來(lái)越突出。因此查明地下管線,并確定其分布、埋深及走向等管點(diǎn)特征信息,建立一個(gè)有效的、簡(jiǎn)潔的管線信息測(cè)量錄入系統(tǒng),就顯得更加迫切[1]。筆者所在單位進(jìn)行的管線測(cè)量成果一般以Excel 電子表格的形式輸出,而日常測(cè)量成圖又是在AutoCAD 平臺(tái)下,故筆者利用AutoLISP 編制程序?qū)崿F(xiàn)AutoCAD 到Excel 的管線點(diǎn)、線表自動(dòng)輸出,從而提高工作效率。
AutoLISP 是內(nèi)含于AutoCAD 軟件中的開(kāi)發(fā)語(yǔ)言,是強(qiáng)化AutoCAD 最好、最直接的程序語(yǔ)言。它最大的特點(diǎn)就是不挑剔編輯環(huán)境,幾乎在所有的文本編輯器中都可以編寫,而且不需要特殊的編譯過(guò)程。它的語(yǔ)法結(jié)構(gòu)簡(jiǎn)單易懂,變量定義方便、簡(jiǎn)潔非常富有彈性。Dcl 是內(nèi)嵌于AutoCAD 平臺(tái)的一款對(duì)話框語(yǔ)言,該語(yǔ)言和LISP 一樣,語(yǔ)法結(jié)構(gòu)簡(jiǎn)單,不需經(jīng)過(guò)編譯,可以在AutoCAD 平臺(tái)下直接調(diào)用[2]。使用LISP+Dcl 能夠輕松實(shí)現(xiàn)基于AutoCAD 平臺(tái)的交互輸入與輸出,功能強(qiáng)大、通俗易用。本系統(tǒng)主要利用AutoCAD 圖元可以擴(kuò)展數(shù)據(jù)的功能,對(duì)管點(diǎn)圖塊的AutoCAD 屬性進(jìn)行擴(kuò)展,從而實(shí)現(xiàn)管線點(diǎn)、線表自動(dòng)輸出[3]。
管線測(cè)量一般先外業(yè)采集管點(diǎn)的坐標(biāo)及高程信息,然后再對(duì)各個(gè)管點(diǎn)的特征數(shù)據(jù)進(jìn)行采集,該系統(tǒng)主要模擬外業(yè)生產(chǎn)流程,根據(jù)外業(yè)采集的各特征點(diǎn)信息的流程進(jìn)行錄入,通過(guò)管線的流向方向,實(shí)現(xiàn)管線點(diǎn)、線表從CAD 到Excel 的輸出[4]。圖1 為地下管線探測(cè)工作流程。
圖1 地下管線探測(cè)工作流程圖
AutoCAD 擴(kuò)展數(shù)據(jù)是軟件自帶的一種擴(kuò)展方式,其主要結(jié)構(gòu)方式為:(-3(應(yīng)用名(1000 .文本型屬性)(1040.浮點(diǎn)型屬性)(1070 .整數(shù)型屬性))),應(yīng)用名可以通過(guò)“Regapp”函數(shù)直接注冊(cè),如果注冊(cè)成功,該應(yīng)用名會(huì)被加入到Appid 符號(hào)表中,該表保留了該圖形中所有使用擴(kuò)展數(shù)據(jù)的應(yīng)用名[5]。對(duì)話框是現(xiàn)今最流行的人機(jī)互動(dòng)界面,在早期的AutoCAD 版本中已經(jīng)使用,對(duì)話框的描述定義在一純文本文檔(后綴名為.dcl)內(nèi),無(wú)須特別的開(kāi)發(fā)環(huán)境,稱之為Dcl 語(yǔ)言。在AutoLISP 中內(nèi)嵌可以直接控制Dcl 對(duì)話框的函數(shù),對(duì)話框中的每一個(gè)對(duì)象均有一個(gè)唯一的標(biāo)示符即Dcl 主鍵名稱,通過(guò)主鍵名稱,就可以準(zhǔn)確的控制對(duì)話框的各個(gè)部件。對(duì)于擴(kuò)展數(shù)據(jù)結(jié)構(gòu)及主鍵的定義如表1 所示。
擴(kuò)展數(shù)據(jù)結(jié)構(gòu)及Dcl 主鍵一覽表 表1
管線外業(yè)采集一般使用全站儀或者GPS 進(jìn)行采集,采集數(shù)據(jù)包含測(cè)點(diǎn)點(diǎn)名,編碼,北坐標(biāo)X,東坐標(biāo)Y,高程值H。外業(yè)采集的同時(shí)需要根據(jù)管井的井蓋等信息判斷出管井的類型,例如污水、雨水、電力、電信、燃?xì)獾?,然后再?duì)管井進(jìn)行探測(cè)以便采集管點(diǎn)的屬性信息如管徑、埋深、井深、電纜根數(shù)、電纜孔數(shù)等[6],依據(jù)這些采集的數(shù)據(jù),通過(guò)使用自動(dòng)展繪模塊快速成圖。對(duì)于使用該模塊,首先每一種管點(diǎn)類型都先約定一個(gè)字母代碼,如污水管點(diǎn)為W,雨水管點(diǎn)為Y,電力管點(diǎn)為L(zhǎng) 等。在內(nèi)業(yè)處理時(shí)首先編輯對(duì)照文件,文件為文本格式,當(dāng)文本中出現(xiàn)管點(diǎn)字母代碼時(shí),表示該代碼后的所有測(cè)點(diǎn)點(diǎn)名都是該類型管點(diǎn),每一行表示一個(gè)點(diǎn)名,直到出現(xiàn)其他管點(diǎn)字母代碼。
例如:Y
表示點(diǎn)名為100、101 的測(cè)點(diǎn)為雨水管點(diǎn),103、104為污水管點(diǎn)。完成點(diǎn)、線表對(duì)照文件編輯后,就可以通過(guò)自動(dòng)展繪管點(diǎn)圖塊程序,完成管點(diǎn)圖塊的CAD 成圖,同時(shí)錄入該點(diǎn)的高程值和外業(yè)點(diǎn)名。模塊界面如圖2 所示:
圖2 自動(dòng)畫管線的界面
管點(diǎn)展繪后效果如圖3 所示:
圖3 管點(diǎn)展繪效果圖
完成管點(diǎn)圖塊繪制后,需要根據(jù)管線實(shí)地的連接方向進(jìn)行連線。AutoCAD 的二維多段線會(huì)根據(jù)每個(gè)端點(diǎn)繪制的順序形成一個(gè)方向,在管點(diǎn)流向繪制時(shí),需保證管點(diǎn)流向的方向與二維多段線的方向保持一致,例如:雨水管線從上游往下游方向繪制,并保證二維多段線每個(gè)端點(diǎn)均與管點(diǎn)圖塊的中心點(diǎn)一致,這樣就在繪制流向的同時(shí)也就完成了原來(lái)互相獨(dú)立的管點(diǎn)之間拓?fù)潢P(guān)系的連接。
如果管線的類型是雨水或者污水,那么在完成流向繪制后,還需要在每?jī)蓚€(gè)管點(diǎn)之間繪制一個(gè)表示流向的箭頭。為了保證箭頭的一致性和美觀性,程序還提供了自動(dòng)畫流向箭頭功能,同時(shí)約定在兩個(gè)管點(diǎn)距離大于等于5 m的情況下,箭頭長(zhǎng)度為1.6,距離小于5 m時(shí),箭頭長(zhǎng)度縮小為0.6,并保證箭頭的頂端位于兩管點(diǎn)流向線的中點(diǎn)上,與流向線兩側(cè)的夾角均為20°。由于AutoCAD 二維多段線的方向沒(méi)有直觀地顯示,故在實(shí)際操作中會(huì)出現(xiàn)二維多段線的方向與流向的方向相反的情況,為了防止這種情況的出現(xiàn),在流向箭頭繪制程序運(yùn)行的最后會(huì)在命令行提示用戶判斷繪制箭頭的方向是否正確,若用戶選擇為否(N),則程序會(huì)對(duì)該流向線進(jìn)行反向處理,并重新繪制正確的箭頭。同時(shí)還提供SCJT(刪除箭頭)命令,可以刪除最后繪制的一組箭頭,最大限度減少誤操作帶來(lái)的重復(fù)勞動(dòng)。
管點(diǎn)在圖形中主要靠管點(diǎn)的編號(hào)來(lái)識(shí)別,因此管點(diǎn)編號(hào)的條理性及準(zhǔn)確性就顯得特別重要。在將管線數(shù)據(jù)以Excel 表格方式輸出后,如何快速將文本數(shù)據(jù)與AutoCAD 圖形聯(lián)系起來(lái),跟管點(diǎn)編號(hào)的方式有很大的關(guān)系。為了能更快速、準(zhǔn)確、對(duì)管點(diǎn)進(jìn)行編號(hào),程序提供了自動(dòng)編號(hào)模塊。運(yùn)行命令時(shí),首先提示用戶選擇需要編號(hào)的流向線,然后根據(jù)用戶輸入的起始編號(hào),程序會(huì)按照流向線方向?qū)€上每個(gè)管點(diǎn)進(jìn)行遞增編號(hào)。例如:用戶輸入雨水管點(diǎn)起始編號(hào)為Y10D100,程序會(huì)對(duì)接下去的管點(diǎn)編號(hào)為Y10D101、Y10D102……,如圖4 所示。
圖4 自動(dòng)畫流向箭頭效果圖
完成上述工作后,就需要對(duì)外業(yè)采集的管點(diǎn)屬性信息進(jìn)行錄入。管點(diǎn)的屬性錄入界面如圖5 所示。一般管線測(cè)量只有電力和電信需要錄入共有孔數(shù)、已用孔數(shù)、電纜根數(shù)這三個(gè)屬性信息,在程序的運(yùn)行中,會(huì)根據(jù)管點(diǎn)的圖塊名稱自動(dòng)判斷出管線類型,如果是電力或電信,則共有孔數(shù)、已用孔數(shù)、電纜根數(shù)三項(xiàng)可以錄入信息;如果是雨水或者污水等其他類別的管線則錄入框會(huì)以灰色不可編輯框的形式出現(xiàn)。預(yù)留擴(kuò)展在程序執(zhí)行中會(huì)以不可編輯框的形式出現(xiàn),預(yù)留擴(kuò)展是為預(yù)防后期管線錄入屬性增多而準(zhǔn)備的,需要使用時(shí)必須修改后臺(tái)程序后才能錄入信息,應(yīng)用本文所提的方法,可以根據(jù)需要任意擴(kuò)展。
圖5 管點(diǎn)屬性信息錄入界面
完成所有的屬性錄入工作后,就可以輸出點(diǎn)線表了。程序約定輸入的點(diǎn)、線表自動(dòng)存放于當(dāng)前活動(dòng)圖形的同級(jí)目錄下,并命名為輸出點(diǎn)表.csv 和輸出線表.csv。用戶可以連續(xù)選擇需要輸出的流向線,右鍵結(jié)束選擇后,程序?qū)⒏鶕?jù)選擇的流向線,自動(dòng)輸出該線上所有管點(diǎn)的屬性信息[7]。
當(dāng)輸出的管線類型為雨水或者污水時(shí),程序會(huì)對(duì)各點(diǎn)井底高程就行復(fù)查,當(dāng)管點(diǎn)的井底高程大于上一管點(diǎn)井底高程的數(shù)值超過(guò)某一閾值時(shí)(默認(rèn)設(shè)置設(shè)為10 cm),會(huì)在該行線表的備注欄標(biāo)注“流不出”,提示用戶進(jìn)行人工再確認(rèn),防止出現(xiàn)粗差。由于在連線時(shí)已經(jīng)將流向與二維多段線的方向保持一致,故每次雨、污的流向均為正向。輸出效果如圖6 所示:
圖6 線表輸出效果圖
(setq ssjiantou(ssadd));創(chuàng)建一個(gè)集合,將所有箭頭放在這個(gè)集合內(nèi)
(setq a(car(entsel)));選擇需要畫箭頭的流向線
(setq leixing(cdr(assoc 0(entget a))));判斷對(duì)象是否為多段線
(if(=leixing "POLYLINE")(progn
(setq tuceng(cdr(assoc 8(entget a))));判斷所在圖層
(panduan);判斷模塊,如果不是雨水或者污水,則程序不再執(zhí)行
(setq en(entnext a));讀取下一圖元,用于接下去獲取多段線端點(diǎn)坐標(biāo)
(setq ed(assoc 10(entget en)))
(setq xs(cadr ed));分離出X 值(setq ys(caddr ed));分離出Y 值
(setq pts(list xs ys));構(gòu)造起始點(diǎn)坐標(biāo)(setq en(entnext en))
(setq long 1.6);設(shè)定每個(gè)箭頭長(zhǎng)度為1.6
(while(/=over "SEQEND")
(setq ed(assoc 10(entget en)))
(setq x(cadr ed));分離出X 值(setq y(caddr ed));分離出Y 值
(setq xzz x)(setq yzz y)(setq pt(list x y));構(gòu)造點(diǎn)坐標(biāo)
(setq x(/(+ x xs)2))(setq y(/(+ y ys)2))
(setq ptmid(list x y));構(gòu)造中點(diǎn)坐標(biāo)
(if(<(distance pt pts)5)(setq long 0.6));根據(jù)端點(diǎn)距離調(diào)整箭頭長(zhǎng)度為0.6
(setq ptmidon(polar ptmid(+(angle pts ptmid)2.792)long));箭頭第一個(gè)點(diǎn)
(setq ptmiddown(polar ptmid(+(angle pts ptmid)3.4906)long));第二個(gè)點(diǎn)
(command "layer" "s" tuceng "");設(shè)置流向線所在圖層為當(dāng)前圖層
(setvar "thickness" 5441200);設(shè)置箭頭厚度值
(command "pline" ptmidon ptmid ptmiddown "");繪制箭頭
(ssadd(entlast)ssjiantou);將繪制的箭頭加入選擇集ssjiantou
(setq long 1.6)(setq xs xzz)(setq ys yzz)(setq pts(list xs ys))
(setq en(entnext en));訪問(wèn)下一個(gè)子圖元,繼續(xù)繪制箭頭
(setq over(cdr(assoc 0(entget en)))));判斷子圖元是否結(jié)束
(initget 0 "Yes No")
(setq keyw(getkword " 流向方向是否正確[是(Y)/否(N)]:")));用戶確定方向
(alert "您選擇的不是多段線");如果選擇的不是多段線則提醒
)
(if(=keyw "No")(chongxinhua));如果用戶選擇流向方向?yàn)椴徽_,則反向重畫
(regapp "gxbh");將gxbh 注冊(cè)到Appid 符號(hào)表中
(if name(progn
(setq arealist(list-3(list "gxbh"(cons 1000 bianh))));構(gòu)建擴(kuò)展組
(setq endata(entget name '("gxbh")));檢查原圖塊是否已經(jīng)編號(hào)
(if(=(cdr(assoc 1000(cdr(cadr(assoc-3 endata)))))"")
(progn
(setq oldlist(assoc-3 endata));獲取原圖元已有的擴(kuò)展屬性
(setq endata(subst arealist oldlist endata));用新的屬性替換舊屬性
(entmod endata);更新圖元
(command "text" pt2 "1.5" "0" bianh);在圖上繪制管點(diǎn)編號(hào)
(setq num(1+(atoi num)))
(cond
((<num 10)(setq num(strcat "00"(itoa num))));如果編號(hào)編號(hào)是1,就改為001
((<num 100)(setq num(strcat "0"(itoa num))));如果編號(hào)是10 則改為010
((>=num 100)(setq num(itoa num))));如果編號(hào)大于100 則不做處理
(setq bianh(strcat zubie num)))
(if(not(assoc-3 endata))(prong
(setq endata(append endata(list arealist)));如果原圖元沒(méi)有編號(hào),則增加新編號(hào)
(entmod endata);更新圖元
(command "text" pt2 "1.5" "0" bianh)
(setq num(1+(atoi num)))
(cond
((<num 10)(setq num(strcat "00"(itoa num))))
((<num 100)(setq num(strcat "0"(itoa num))))
((>=num 100)(setq num(itoa num))))
(setq bianh(strcat zubie num))))))))
(while(<=(+ 1 i)(sslength sszhaodao));遍歷流向線上的管點(diǎn)組成的選擇集
(if(setq en(ssname sszhaodao i))(progn(setq edsdb(assoc 10(entget en)))
(setq x(rtos(-(+ xyd(/(Caddr edsdb)2))50)2 3));獲取圖塊的北坐標(biāo)X
(setq y(rtos(-(+ yyd(/(Cadr edsdb)2))50)2 3));獲取圖塊的東坐標(biāo)Y
(setq km(strcase(cdr(assoc 2(entget en)))));獲取圖塊名稱
(if(setq endatabh(entget en '("gxbh")))
(progn(setq endatabhsd(cdr(Cadr(assoc-3 endatabh))))
(if(assoc 1000 endatabhsd)(setq bgdbh(cdr(assoc 1000 endatabhsd))));獲取管點(diǎn)編號(hào)
(if(assoc 1040 endatabhsd)(setq bgdms(cdr(assoc 1040 endatabhsd))));獲取管點(diǎn)名稱
(if(assoc 1070 endatabhsd)(setq bgyks(cdr(assoc 1070 endatabhsd))))));獲取共有孔數(shù)
(if(setq endatakz(entget en '("gxkz")))(progn(setq endatakzsd(cdr(Cadr(assoc-3 endatakz))))
(if(assoc 1000 endatakzsd)(setq bgdgj(cdr(assoc 1000 endatakzsd))));獲取上點(diǎn)管徑
(if(assoc 1040 endatakzsd)(setq bdmgc(cdr(assoc 1040 endatakzsd))));獲取地面高程
(if(assoc 1070 endatakzsd)(setq byyks(cdr(assoc 1070 endatakzsd))))));獲取已用孔數(shù)…………
完成各變量的獲取后則輸出點(diǎn)、線表:
(if(and(=tuceng "J")(=km "GC041"))
(setq fushuwu "篦子")(setq fushuwu "檢修井"))
(if(=km "GC133")(setq fushuwu "消火栓"))
(if(=km "GC134")(setq fushuwu "閥門"))
(if(=km "GC170")(setq fushuwu "化糞池"));根據(jù)圖塊名稱判斷出對(duì)應(yīng)的附屬物,然后開(kāi)始輸出點(diǎn)表
(princ bwydh f1);輸出外業(yè)點(diǎn)號(hào)(princ "," f1);輸出逗號(hào)(princ bgdbh f1);輸出管點(diǎn)編號(hào)(princ "," f1)(princ leixingdb f1);輸出管線類型(princ "," f1)
(princ x f1);輸出北坐標(biāo)X(princ "," f1)
(princ y f1);輸出東坐標(biāo)Y(princ "," f1);
(princ bdmgc f1);輸出地面高程(princ "," f1)
(if bgdjs(princ bgdjs f1)(princ bgdms f1));如果井深與埋深不一致則輸出井深(princ "," f1)(princ fushuwu f1);輸出附屬物類型(princ " " f1)
輸出點(diǎn)表結(jié)束后以同樣的方式輸出線表,鑒于篇幅所限不再贅述。在輸出結(jié)束后,程序會(huì)提醒用戶是否直接打開(kāi)輸出的點(diǎn)、線表文件。
(setq kword(getkword " 是否打開(kāi)文件 是(Y) 否(N):"))(if(=kword "Y")
(progn(startapp " C:/Program Files/Microsoft Office/OFFICE11/Excel.exe" filedb);提示用戶打開(kāi)點(diǎn)表
(startapp"C:/Program Files/Microsoft Office/OFFICE11/Excel.exe" filexb )));提示用戶打開(kāi)線表
通過(guò)該程序?qū)崿F(xiàn)了基于AutoCAD 平臺(tái)下管線點(diǎn)、線表的自動(dòng)輸出,改變了傳統(tǒng)模式需要在AutoCAD 平臺(tái)完成圖形編輯后需要在Excel 中再次進(jìn)行管點(diǎn)特征信息錄入的生產(chǎn)模式。程序利用AutoCAD 擴(kuò)展數(shù)據(jù),使管點(diǎn)信息附著于圖塊中,可通用于所有的AutoCAD平臺(tái)。輸入、輸出信息可以根據(jù)需要定義,輸出格式可以多樣化,能夠很方便的移植和擴(kuò)展,在本單位的地下管線測(cè)量實(shí)際生產(chǎn)中不僅提高了工作效率,而且提高了準(zhǔn)確性,大大節(jié)約了工作時(shí)間。
當(dāng)然由于缺乏數(shù)據(jù)庫(kù)的支持,本系統(tǒng)對(duì)于后期的管線數(shù)據(jù)管理方面還是要依賴于人工導(dǎo)入到數(shù)據(jù)庫(kù)中,在今后的工作中,如何通過(guò)屬性信息自動(dòng)生成管線信息扯旗,如何解決同一平面內(nèi)管點(diǎn)重復(fù)編輯等方面應(yīng)加予探索,通過(guò)對(duì)程序繼續(xù)改進(jìn),實(shí)現(xiàn)更高程度的人工智能化。
[1]馬雪萍.地下管線竣工測(cè)量中交叉問(wèn)題的探討[J].城市勘測(cè),2013(5):143~145.
[2]任航科.LISP 語(yǔ)言在測(cè)繪作業(yè)中的應(yīng)用[J].城市勘測(cè),2011(1):110~112.
[3]朱虹.淺談AutoCAD 與一些常用軟件的結(jié)合運(yùn)用[J].科技轉(zhuǎn)讓集錦,2010(2).
[4]CJJ61-2003/J271-2003.城市地下管線探測(cè)技術(shù)規(guī)程[S].
[5]浮懷鵬,譚盧師,吳元碩.CAD 圖元擴(kuò)展數(shù)據(jù)[J].華北水利水電學(xué)院學(xué)報(bào),2010,31(3):74~75.
[6]劉軍,湯永凈.城市地下管線探測(cè)中遺留問(wèn)題的分析與處理[J].城市勘測(cè),2013(3).
[7]李潔,秦巖賓,解益辰等.CAD 環(huán)境下基于AutoLISP 語(yǔ)言的程序開(kāi)發(fā)[J].測(cè)繪與空間地理信息,2013(9).