袁兆奎
(武漢市政工程設(shè)計(jì)研究院有限責(zé)任公司,湖北武漢 430023)
在市政工程中,道路的縱橫斷面測(cè)量是一項(xiàng)重要的工作內(nèi)容。一般來(lái)說(shuō),在獲取地形圖之后,應(yīng)進(jìn)行縱橫斷面的實(shí)地測(cè)量,包括各中樁點(diǎn)和碎部斷面點(diǎn)的高程測(cè)量,測(cè)得的數(shù)據(jù)人工填入記錄紙上。內(nèi)業(yè)時(shí),首先將記錄紙上的數(shù)據(jù)按指定的格式錄入電腦,然后進(jìn)行格式及數(shù)據(jù)內(nèi)容檢查,確認(rèn)無(wú)誤后交付給設(shè)計(jì)人員。
筆者經(jīng)過(guò)長(zhǎng)期的工作實(shí)踐,發(fā)現(xiàn)上述工作流程中,存在如下問(wèn)題:①人工錄入的數(shù)據(jù)大,耗時(shí)長(zhǎng),且容易出錯(cuò);②數(shù)據(jù)錄入后,查錯(cuò)糾正很難滿足要求;③縱橫斷面圖形檢查的功能很難發(fā)現(xiàn)細(xì)微的錯(cuò)誤,且運(yùn)行效率低下。
對(duì)此,筆者提出了一種簡(jiǎn)碼格式,能減少斷面錄入的工作量,提高工作效率;并基于.Net平臺(tái),用C#語(yǔ)言在Visual Studio 2005上開(kāi)發(fā)了一款能進(jìn)行斷面數(shù)據(jù)檢查的軟件;最后研究了縱橫斷面的繪制及圖形檢查,并在AutoCAD上進(jìn)行二次開(kāi)發(fā),實(shí)現(xiàn)了該功能。經(jīng)過(guò)一年多的推廣應(yīng)用,該軟件已經(jīng)較為成熟、完善。
武漢市政工程設(shè)計(jì)研究院有限責(zé)任公司勘測(cè)設(shè)計(jì)院設(shè)計(jì)軟件所能支持的縱橫斷面文件為下述格式:
這種格式稱(chēng)為全碼格式,對(duì)該格式進(jìn)行分析,可以看出其有如下特點(diǎn):
(1)每一個(gè)新的橫斷面都是以“Z=”作為開(kāi)頭,其后為中樁的里程、正負(fù)高程。
(2)橫斷面的數(shù)據(jù)以從左到右的順序列出,內(nèi)容為斷面點(diǎn)與中樁的距離,斷面點(diǎn)的高程。如果斷面點(diǎn)位于中樁的左側(cè),距離取負(fù),若在右側(cè),距離取正;高程全部取負(fù)。
(3)在縱斷面中,若有加樁,只需以“Z=”為開(kāi)頭,然后輸入里程和正負(fù)高程即可。
筆者認(rèn)為,上述文件格式雖為道路設(shè)計(jì)軟件所專(zhuān)用,但卻可以大大簡(jiǎn)化,減少手工錄入的工作量,提高效率:
①在中樁所在的數(shù)據(jù)行,可以只錄入一個(gè)高程值,不必錄入兩個(gè)。
②橫斷面的數(shù)據(jù)既然已規(guī)定為從左至右,因此左側(cè)的距離數(shù)據(jù)可以不用取負(fù)號(hào),直接按正號(hào)錄入;斷面點(diǎn)的高程也只按正號(hào)錄入。
因此,筆者設(shè)計(jì)了一種簡(jiǎn)化的縱橫斷面文件格式:
以上這種格式可稱(chēng)為“簡(jiǎn)碼”格式??梢钥闯?,若采用簡(jiǎn)碼格式,內(nèi)業(yè)數(shù)據(jù)錄入時(shí),可以大大減少工作量(沒(méi)有“-”號(hào)和“,”號(hào)),且所有的操作都可以集中在鍵盤(pán)的“數(shù)字鍵盤(pán)”區(qū)域內(nèi),能極大提高效率。
雖然采用簡(jiǎn)碼格式可以大大減少手工錄入的工作量,但仍然會(huì)出現(xiàn)各種錯(cuò)誤,尤其是當(dāng)?shù)缆泛荛L(zhǎng),且斷面寬度較大時(shí),錯(cuò)誤一般很難避免。另一方面,在沒(méi)有采用簡(jiǎn)碼格式之前,以前的工作中存在著很多全碼格式的斷面文件,也需要進(jìn)行檢查。因此,要實(shí)現(xiàn)簡(jiǎn)碼格式和全碼格式的數(shù)據(jù)檢查,并能將簡(jiǎn)碼轉(zhuǎn)換成全碼。
經(jīng)過(guò)長(zhǎng)期工作實(shí)踐,發(fā)現(xiàn)手工錄入后,斷面文件中一般有以下幾種類(lèi)型的錯(cuò)誤,如表1所示。
斷面文件中可能出現(xiàn)的錯(cuò)誤類(lèi)型 表1
編寫(xiě)程序時(shí),有兩處需要注意:
(1)斷面文件應(yīng)一次性全部讀入,不能逐行讀入,否則針對(duì)一個(gè)橫斷面的檢查時(shí)就很難操作。具體來(lái)說(shuō),用StreamReader.ReadToEnd()將斷面文件全部讀入,并用Regex.Split()將數(shù)據(jù)分割成string類(lèi)型的數(shù)組:
如此,在進(jìn)行一個(gè)橫斷面的檢查時(shí),先在file_content_array中尋找該斷面的起止位置,然后再進(jìn)行內(nèi)部檢查;檢查完畢后,尋找下一個(gè)橫斷面的起止位置,重復(fù)上面的檢查。
(2)在橫斷面內(nèi)部,檢查斷面點(diǎn)與樁號(hào)間的距離是否嚴(yán)格按從左到右的順序時(shí),可以先定義一個(gè)初始值為false的bool類(lèi)型變量zero_comeout。當(dāng)zero_comeout為false,且斷面點(diǎn)與樁號(hào)間的距離為遞減時(shí),認(rèn)為無(wú)誤,否則認(rèn)為有錯(cuò)誤,并輸出錯(cuò)誤的位置;當(dāng)距離為0時(shí),認(rèn)為讀到樁號(hào)處,將zero_comeout設(shè)為true,并檢查該處高程是否與樁號(hào)處一致;當(dāng)zero_comeout為true,且斷面點(diǎn)與樁號(hào)間的距離遞增時(shí),認(rèn)為無(wú)誤,否則認(rèn)為有錯(cuò)誤,并輸出錯(cuò)誤的位置。該處可用如下代碼實(shí)現(xiàn):
斷面文件數(shù)據(jù)檢查這部分程序的結(jié)構(gòu)示意圖如圖1所示。
在該軟件中,可以通過(guò)對(duì)話框設(shè)置檢查參數(shù),檢查完畢后生成報(bào)告,詳細(xì)指出錯(cuò)誤所在的行數(shù)及錯(cuò)誤的類(lèi)別,從而可以快速進(jìn)行定位、糾正。對(duì)于數(shù)據(jù)很長(zhǎng)的斷面文件,該功能尤其有效。檢查工作有必要多次進(jìn)行,以確保無(wú)誤。圖2為軟件的主界面。
圖1 斷面文件數(shù)據(jù)檢查程序示意圖
圖2 斷面數(shù)據(jù)處理程序主界面
該部分要實(shí)現(xiàn)將簡(jiǎn)碼格式的斷面文件生成全碼格式,實(shí)現(xiàn)起來(lái)較為簡(jiǎn)單,主要注意以下兩點(diǎn):
(1)樁號(hào)處。提取一行的數(shù)據(jù),若其中含有“*”,認(rèn)為該行為樁號(hào)處,將“*”號(hào)替換成“Z=”,并添加正負(fù)高程。
(2)樁號(hào)內(nèi)部。首先仍定義一個(gè)初始值為false的bool類(lèi)型變量zero_comeout。當(dāng)斷面點(diǎn)與樁號(hào)處的距離不為0,且zero_comeout為 false時(shí),距離取負(fù)號(hào),高程取負(fù)號(hào);當(dāng)斷面點(diǎn)與樁號(hào)間的距離為0時(shí),設(shè)置zero_comeout為true,高程取負(fù)號(hào);當(dāng)斷面點(diǎn)與樁號(hào)間的距離不為0,且zero_comeout為ture時(shí),距離取正號(hào),高程取負(fù)號(hào)。
每一步處理完后,均將處理結(jié)果寫(xiě)入新的文件,直到斷面文件全部處理完畢。
雖然上述程序?qū)嗝嫖募?nèi)的數(shù)據(jù)進(jìn)行了詳細(xì)的檢查,但并不能保證其已經(jīng)完全沒(méi)有問(wèn)題。例如,在錄入時(shí),陡砍上、下的高程值有可能輸成一樣,但前文的檢查并不能發(fā)現(xiàn)。作為工作成果的縱橫斷面文件在歸檔及交付設(shè)計(jì)人員、業(yè)主時(shí),應(yīng)確保無(wú)誤,因此,繪制縱橫斷面及進(jìn)行圖形檢查很有必要。
筆者基于.Net平臺(tái),用C#語(yǔ)言對(duì)AutoCAD進(jìn)行二次開(kāi)發(fā),實(shí)現(xiàn)了縱橫斷面圖的自動(dòng)繪制,其后即可以進(jìn)行圖形檢查。相對(duì)于AutoLisp或者VBA等傳統(tǒng)的開(kāi)發(fā)語(yǔ)言,C#可以編寫(xiě)出運(yùn)行效率更高的應(yīng)用程序。這對(duì)配置較低的電腦或者繪制數(shù)據(jù)量較大的縱橫斷面尤為重要。
編寫(xiě)程序時(shí),主要有以下幾方面需要注意:
(1)圖層。為便于繪制及檢查,筆者對(duì)縱橫斷面圖進(jìn)行分析,自定義了5個(gè)圖層:
①斷面點(diǎn):顯示縱斷面的中樁點(diǎn)和橫斷面的碎部斷面點(diǎn),均以“紅圈”突出顯示。
②斷面線:由縱斷面的所有中樁點(diǎn)或橫斷面的所有碎部斷面點(diǎn)以直線方式連接而成的多段線,以綠色顯示。
③斷面參考坐標(biāo)系:為平面直角坐標(biāo)系。對(duì)于縱斷面,以起始中樁為原點(diǎn),里程增加方向?yàn)闄M軸,高程增加方向?yàn)榭v軸;對(duì)于橫斷面,以中樁點(diǎn)為原點(diǎn),從左至右為橫軸,高程增加方向?yàn)榭v軸??v軸上的高程值范圍均嚴(yán)格標(biāo)示,例如高程標(biāo)示為[17,22],說(shuō)明所有點(diǎn)的高程值均在如下范圍內(nèi):17≤H≤22。
④斷面點(diǎn)高程:在縱斷面中樁點(diǎn)和橫斷面碎部斷面點(diǎn)的旁邊顯示其高程值。
⑤斷面點(diǎn)樁號(hào)點(diǎn)位置:顯示中樁點(diǎn)的里程值,或者橫斷面所有碎部斷面點(diǎn)距離中樁的距離值。
(2)在AutoCAD中繪制文字、斷面點(diǎn)和斷面線。它們的實(shí)現(xiàn)方式差不多,以較為復(fù)雜的繪制斷面線為例,程序中主要用到AddLine()這個(gè)函數(shù):
(3)針對(duì)不同版本的AutoCAD進(jìn)行開(kāi)發(fā)的問(wèn)題。在Visual Studio 2005的“解決方案資源管理器”中點(diǎn)“引用”,右鍵選擇“添加引用(R)…”,在對(duì)話框中選擇“瀏覽”,然后進(jìn)入AutoCAD的安裝目錄,選擇“acdbmgd.dll”、“acmgd.dll”。然后將程序重新編譯、生成,如此便生成針對(duì)該AutoCAD版本的程序了。
該部分程序的結(jié)構(gòu)示意如圖3所示。
圖3 斷面圖繪制程序示意圖
打開(kāi)AutoCAD后,輸入“netload”命令,在對(duì)話框中選擇已生成的dll文件,然后再輸入“drawdm”命令,彈出縱橫斷面繪制程序的主界面(圖4)。
圖4 縱橫斷面繪制程序主界面
在該界面上可以進(jìn)行一些參數(shù)設(shè)置,以適應(yīng)不同的比例尺等?!按_定”之后程序自動(dòng)繪制斷面,并調(diào)節(jié)縮放比例,讓所有斷面滿布在窗口中,圖5是繪制的某個(gè)橫斷面。
圖5 繪制出的橫斷面
縱橫斷面繪制完畢后,即可以進(jìn)行圖形檢查,發(fā)現(xiàn)并糾正細(xì)微的錯(cuò)誤。
在縱橫斷面文件檢查完畢后,可以統(tǒng)計(jì)本次工程的工作量,以作為計(jì)算產(chǎn)值、費(fèi)用等的依據(jù)。工作量的計(jì)算分縱向和橫向。對(duì)于縱向,只需提取里程的最小、最大值,進(jìn)行相減即可。對(duì)于橫向,需計(jì)算每一個(gè)橫斷面的工作寬度,即對(duì)最左側(cè)斷面點(diǎn)和樁號(hào)處的距離與最右側(cè)斷面點(diǎn)和樁號(hào)處的距離求和,然后累加所有的工作寬度,同時(shí)還應(yīng)累計(jì)橫斷面的個(gè)數(shù),如圖6所示。
圖6 縱橫斷面工作量統(tǒng)計(jì)
本文對(duì)道路的縱橫斷面文件格式進(jìn)行了分析,提出了一種簡(jiǎn)碼格式,能大大減少手工錄入的工作量,減少出錯(cuò),提高工作效率,并實(shí)現(xiàn)了簡(jiǎn)碼格式轉(zhuǎn)換為設(shè)計(jì)軟件所能識(shí)別處理的全碼格式,以及對(duì)全碼格式斷面文件的檢查。其次,研究了縱橫斷面文件的數(shù)據(jù)檢查和圖形化檢查。數(shù)據(jù)檢查能發(fā)現(xiàn)9大類(lèi)錯(cuò)誤,圖形化檢查能在AutoCAD上繪制縱橫斷面并人工發(fā)現(xiàn)細(xì)微的錯(cuò)誤。最后,實(shí)現(xiàn)了道路斷面的工作量統(tǒng)計(jì)。經(jīng)過(guò)長(zhǎng)期推廣應(yīng)用,該程序已較為成熟、完善。
[1]潘正風(fēng),楊正堯,程效軍等.?dāng)?shù)字測(cè)圖原理與方法[M].武漢大學(xué)出版社,2004.
[2] 張正祿.工程測(cè)量學(xué)[M].武漢:武漢大學(xué)出版社,2005.
[3]余興勝.用.NET進(jìn)行AutoCAD二次開(kāi)發(fā)的方案探索[EB/OL].http://news.e800.com.cn/articles/2008/12/1199238090246_1.html,2008.
[4] ObjectARX編程站.Hello World:訪問(wèn)ObjectARX.NET封裝類(lèi)[EB/OL].http://www.mjtd.com/Manual/Article-Show.a(chǎn)sp?ArticleID=836,2005.
[5]博客園.AutoCAD.net二次開(kāi)發(fā)官方教程及源碼C#版[EB/OL].http://kb.cnblogs.com/a/1257334/,2008.