王衛(wèi)華 ,柯于衡
(宜昌市測(cè)繪大隊(duì),湖北 宜昌 443100)
“時(shí)間-沉降量曲線(xiàn)圖”作為測(cè)繪單位必須提供客戶(hù)的要資料之一,在很多地區(qū)是不能簡(jiǎn)單運(yùn)用Excel軟件提供的圖表繪制功能來(lái)完成的,生產(chǎn)單位往往是結(jié)合AutoCAD 的繪圖功能和Excel 的統(tǒng)計(jì)計(jì)算功能來(lái)手工繪制,不僅費(fèi)事費(fèi)力,而且在作業(yè)過(guò)程中容易引入人為誤差或錯(cuò)誤。因此,借助AutoCAD 二次開(kāi)發(fā)編寫(xiě)插件無(wú)疑是解決此類(lèi)問(wèn)題最好的方法。
Visual Lisp 和VBA 是常用的AutoCAD 二次開(kāi)發(fā)工具,兩者各有所長(zhǎng),互為補(bǔ)充。Visual Lisp 適合描述人機(jī)交互的工程,長(zhǎng)于編寫(xiě)模擬設(shè)計(jì)師思路的專(zhuān)業(yè)設(shè)計(jì)程序,對(duì)于各種用戶(hù)的輸入、錯(cuò)誤的識(shí)別與恢復(fù)等有相當(dāng)強(qiáng)大的功能,能充分發(fā)揮交互操作的特長(zhǎng),同時(shí)具有最多樣式的程序運(yùn)行模式和很好的兼容性。缺點(diǎn)是編譯困難,DCL的設(shè)計(jì)編寫(xiě)很難熟練掌握,因?yàn)槠渚幾g困難,很難編寫(xiě)大型程序。VBA 可以很方便的使用Windows 系統(tǒng)資源,使AutoCAD 很容易和Windows 下的Excel 等應(yīng)用程序交互;對(duì)話(huà)框功能比Lisp DCL 好很多,多文檔視圖環(huán)境下的應(yīng)用程序也比Visual Lisp 提供了更多的支持,且VBA 代碼有較好的可讀性,能進(jìn)行復(fù)雜計(jì)算公式的編制。不足之處是不能像Visual Lisp 一樣隨心所欲的調(diào)用CAD 的命令,許多交互操作的技巧在VBA 中不能直接調(diào)用。綜上所述,熟練、靈活的掌握兩種語(yǔ)言的技巧和精髓,能幫助我們寫(xiě)出實(shí)用高效,強(qiáng)壯性好的程序,本文中時(shí)間-沉降曲線(xiàn)自動(dòng)繪制插件的主體用VBA 編寫(xiě),局部借用了Visual Lisp 的一些功能,詳細(xì)情況見(jiàn)文中代碼。
某小區(qū)2#樓為18 層剪力墻結(jié)構(gòu),建筑總高度50.7 m,該樓共埋設(shè)了14 個(gè)沉降觀(guān)測(cè)點(diǎn),12 次觀(guān)測(cè)沉降數(shù)據(jù)如表1所示:
表1 2#樓沉降量統(tǒng)計(jì)表
時(shí)間-沉降曲線(xiàn)圖如圖1所示,橫軸代表時(shí)間跨度,縱軸代表各時(shí)間點(diǎn)對(duì)應(yīng)的沉降量,除了曲線(xiàn)主體之外,還必須注明時(shí)間刻度、沉降量刻度、曲線(xiàn)對(duì)應(yīng)點(diǎn)號(hào)等輔助要素。為了方便闡述插件的編寫(xiě)過(guò)程,將插件實(shí)現(xiàn)過(guò)程分為以下5 個(gè)步驟來(lái)分別說(shuō)明:
圖1 標(biāo)準(zhǔn)時(shí)間-沉降量曲線(xiàn)
(1)沉降曲線(xiàn)數(shù)據(jù)的讀取;
(2)自動(dòng)判斷監(jiān)測(cè)數(shù)據(jù)信息中的時(shí)間跨度、點(diǎn)號(hào)、有效取值區(qū)域;
(3)根據(jù)最大日期和最大沉降量定義橫縱軸刻度;
(4)繪制坐標(biāo)軸、標(biāo)注文字;
(5)生成時(shí)間-沉降量點(diǎn)陣,將點(diǎn)陣連成的折線(xiàn)擬合為曲線(xiàn)。
為了實(shí)現(xiàn)數(shù)據(jù)自動(dòng)讀取,完全不需要人為干預(yù)自動(dòng)繪制沉降曲線(xiàn),需要根據(jù)沉降觀(guān)測(cè)外業(yè)結(jié)束后歷次觀(guān)察數(shù)據(jù)統(tǒng)計(jì)出合格的時(shí)間-沉降量表格,以此為基礎(chǔ)來(lái)完成插件的編寫(xiě),如表2所示:
表2 時(shí)間-沉降量基礎(chǔ)表格
需要借用Excel VBA 的部分功能,讀取的對(duì)象是當(dāng)前打開(kāi)的Excel 工作簿中的數(shù)據(jù),如果找不到激活狀態(tài)的工作簿,程序會(huì)自動(dòng)提醒打開(kāi)需要繪制時(shí)間-沉降曲線(xiàn)的表格,代碼如下:
通過(guò)一個(gè)循環(huán)語(yǔ)句的使用,根據(jù)其是否為空來(lái)判斷當(dāng)前工作簿的有效范圍,這對(duì)后面所有工作都至關(guān)重要。觀(guān)測(cè)點(diǎn)的點(diǎn)號(hào)需要在曲線(xiàn)末端注明,點(diǎn)號(hào)的讀取位置為表一中單元格(3,A)至(k1,A)。時(shí)間跨度需要確定表格有效區(qū)域的最大列數(shù)“m1”,表格中單元格“excelSheet.cells(2,m1)”的值就是沉降觀(guān)測(cè)對(duì)應(yīng)的時(shí)間跨度,實(shí)現(xiàn)代碼如下:
為了圖形的美觀(guān)、突出沉降變化的特征和打印方便,橫軸和縱軸的長(zhǎng)度比例關(guān)系設(shè)定為2∶1,橫軸每格代表的天數(shù)要根據(jù)時(shí)間跨度自動(dòng)調(diào)整,時(shí)間跨度(“excelSheet.cells(2,m1).Value”)在3.2 操作中已經(jīng)得到,通過(guò)函數(shù)關(guān)系來(lái)調(diào)整橫軸刻度的大小;同樣,縱軸每格代表沉降量也需要根據(jù)整棟建筑最大的沉降量來(lái)調(diào)整,需要比較各個(gè)觀(guān)測(cè)點(diǎn)沉降量來(lái)獲得最大沉降量的值,再通過(guò)函數(shù)關(guān)系來(lái)調(diào)整縱軸刻度的大小,實(shí)現(xiàn)代碼如下:
如圖2,橫軸的繪制包括坐標(biāo)軸、刻度分劃、日期標(biāo)注和文本等內(nèi)容。因?yàn)槊總€(gè)項(xiàng)目有若干個(gè)觀(guān)測(cè)點(diǎn),需要引入一個(gè)三維點(diǎn)pt1(2)作為單個(gè)觀(guān)測(cè)點(diǎn)沉降曲線(xiàn)繪制的基點(diǎn),使各觀(guān)測(cè)點(diǎn)曲線(xiàn)成果整齊排列,互不干擾。定義代碼如下:
圖2 橫軸標(biāo)準(zhǔn)樣式
同理可以繪出縱軸及其輔助元素,此處不再贅述。
繪制曲線(xiàn)為本插件的主要功能,是最核心也是最有難度的部分。一種方案是先根據(jù)時(shí)間和沉降量組成的點(diǎn)陣畫(huà)出一列點(diǎn),用輕量級(jí)多義線(xiàn)連接所有點(diǎn),最后對(duì)多義線(xiàn)進(jìn)行擬合成沉降曲線(xiàn)。另外一種方案是用“樣條曲線(xiàn)”直接連接點(diǎn)列,兩種方案大同小異,差異之處就是第一種方案所繪曲線(xiàn)是二維曲線(xiàn),而第二種方案繪制為三維曲線(xiàn),表現(xiàn)出來(lái)的效果是完全一致的,本文采用第一種方案編程。由于實(shí)際監(jiān)測(cè)過(guò)程中,經(jīng)常遇到少數(shù)點(diǎn)被破壞的情況,如果出現(xiàn)了表3所示“202”點(diǎn)在第9 次觀(guān)測(cè)前被破壞或毀損的情況,需要中斷對(duì)該點(diǎn)的觀(guān)測(cè),這樣繪制曲線(xiàn)時(shí)點(diǎn)pt 的維數(shù)需要根據(jù)實(shí)際觀(guān)測(cè)的次數(shù)來(lái)決定,所以pt 的定義必須是一個(gè)不指定維數(shù)的雙精度數(shù)組,具體維數(shù)要看沉降量取值為“0”時(shí)候“列”的值,用redim 命令來(lái)重新定義。
表3 有缺損觀(guān)測(cè)點(diǎn)的表格
圖3 未經(jīng)擬合的沉降曲線(xiàn)
這樣繪制的輕量多義線(xiàn)是一條折線(xiàn),如圖3所示,還需要擬合成一條光滑的曲線(xiàn),這里需要結(jié)合Visual Lisp 的相關(guān)知識(shí),具體實(shí)現(xiàn)過(guò)程如下:通過(guò)所繪折線(xiàn)的handle 屬性得到該折線(xiàn)的句柄,組合成lisp 能識(shí)別的AutoCAD 命令來(lái)對(duì)折線(xiàn)編輯擬合,代碼如下:
擬合后就得到圖1所示沉降曲線(xiàn)圖成果。
通過(guò)設(shè)置行變量j 從3 到k1 的循環(huán),可以實(shí)現(xiàn)依次畫(huà)出整個(gè)項(xiàng)目所有觀(guān)測(cè)點(diǎn)的功能。所有成果圖會(huì)自動(dòng)排列成一列,由于本例觀(guān)測(cè)點(diǎn)偏多,不再一一列舉。
本文基于VBA 編程技術(shù),充分結(jié)合AutoCAD 軟件,所編寫(xiě)插件能很好完成滿(mǎn)足宜昌市沉降報(bào)告要求的時(shí)間-沉降量曲線(xiàn)的繪制,在本單位內(nèi)部使用節(jié)省了沉降內(nèi)業(yè)工作時(shí)間。同時(shí)再根據(jù)使用過(guò)程中遇到的新情況,比如觀(guān)測(cè)點(diǎn)被破壞,觀(guān)測(cè)被迫中斷等預(yù)先沒(méi)有考慮的情況,經(jīng)過(guò)不斷改進(jìn)完善,使插件的強(qiáng)壯性和穩(wěn)定得到提高。
[1]張帆.Autocad VBA 二次開(kāi)發(fā)教程[M].北京:清華大學(xué)出版社,2006.
[2]張帆,鄭立凱,王華杰.Autocad VBA 開(kāi)發(fā)精彩實(shí)例教程[M].北京:清華大學(xué)出版社,2004.
[3]李風(fēng)華.Autocad 2002/2000 VBA 開(kāi)發(fā)指南[M].北京:清華大學(xué)出版社,2001.
[4]曾洪飛,張帆,盧擇臨.Autocad VBA&VB.NET 開(kāi)發(fā)基礎(chǔ)與實(shí)例教程[M].北京:中國(guó)電力出版社,2008.
[5]二代龍震工作室.Autocad VBA 函數(shù)庫(kù)查詢(xún)辭典[M].北京:中國(guó)鐵路出版社,2003.
[6]Micrsoft 公司.Microsoft visual basic 6.0 程序員指南[M].北京:希望電子出版社,1998.
[7]Micrsoft 公司.Microsoft visual basic 6.0 語(yǔ)言參考手冊(cè)[M].北京:希望電子出版社,1998.