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