王衛(wèi)華,盧云輝
(宜昌市測繪大隊,湖北 宜昌 443100)
建設工程±0 驗線是指建設工程施工至±0 位置時,對建筑單體外圍軸線位置的檢測及±0 標高的檢測。目的是檢查建設工程基礎是否按規(guī)劃主管部門放線的要求進行施工,±0 驗線是灰線檢驗工作的進一步深入,也是建設工程規(guī)劃報批后管理的重要環(huán)節(jié)?!?驗線報告作為規(guī)劃部門管理的重要依據(jù),必須能準確、直觀地反映建筑物外圍軸線與放線軸線偏移量的方位和數(shù)值,圖1 所示的坐標較差表,是宜昌市規(guī)劃局要求的±0 驗線報告的一個附件。
圖1 ±0 驗線坐標較差表
表格中放線坐標和驗線坐標數(shù)值需要手工輸入,如果建筑物結(jié)構(gòu)比較復雜,則輸入的工作量非常大而且容易出錯。雖然用CAD 命令“l(fā)ist”能列出多義線坐標列表,但是導入Excel 軟件時不能直觀的找到對應坐標軸,工作量仍然很大。因此,借助CAD 二次開發(fā)編寫插件無疑是解決此類問題最好的方法。
CAD 二次開發(fā)比較常用的工具是Visual LISP 和VBA,兩者各有所長,互為補充。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 編寫,輕松解決了坐標輸入的問題。
某項目±0 驗線結(jié)果如圖2 所示,紅色線條為放線軸線,黑色線條為驗線軸線。為了圖面清晰,省略了與主題無關(guān)的要素,且人為拉大了差距,本案例需要分別列出1/K、56/K、48/A、35/A、22/A、9/A 等6 處軸線交點處的放線和驗線坐標:
圖2 放線驗線對照圖
由于“坐標較差表”的格式較為固定,便于與Excel 軟件結(jié)合,本插件主要通過將提取的坐標數(shù)據(jù)自動寫入到表格中相應的單元格中。首先需要用輕量多義線(CAD中命令“PL”輸入,此線條只有二維坐標)依次連接所有提取坐標的交點,通過提取此輕量多義線的“Coordinates”屬性得到線上所有點的坐標,將坐標值賦值給一個數(shù)組,然后分別讀取數(shù)組中對應的值并寫入Excel 表格。數(shù)據(jù)寫入?yún)^(qū)首個單元格為“D4”,往下依次寫入放線坐標值,然后從單元格“G4”開始往下依次寫入驗線坐標值,本插件的主要難點在于寫入表格時的流程控制。
為了實現(xiàn)坐標的讀取,需要先用“輕量多義線”連接所有需要比較坐標的軸線交點,用“PL”命令依次連接圖3 中1 號~12 號點,得到的藍色多義線就有了插件需要的所有坐標值,并以此為基礎來完成插件的編寫。
完整代碼如下:
圖3 繪制連線圖
主要代碼過程解釋:
(1)代碼“ThisDrawing.Utility.GetEntity line,pt1,"拾取連線"”的功能是為輕量多義線賦值,調(diào)試過程中充分利用“本地窗口”的查詢功能,如圖4 所示,點開“本地窗口”中“l(fā)ine”的“Coordinates”屬性,即坐標屬性,可以看到本例中“Coordinates”是一個24 維的數(shù)組,由于測繪坐標系和CAD 直角坐標系的差異,Coordinates(0)和Coordinates(1)的值分別對應1 號點的Y坐標和X 坐標,同理,Coordinates(22)和Coordinates(23)的值分別對應12 號點的Y 坐標和X 坐標,深入了解數(shù)據(jù)的結(jié)構(gòu),有助于插件的編寫。
圖4 “Coordinates”屬性列表
(2)代碼“j=line.Coordinates”的功能是通過“Variant”型變量“j”將line 的“Coordinates”屬性取出,才能進行以后的操作,如圖5 所示,在賦值之后,本案例中變量“j”是一個24 維的數(shù)組,通過對數(shù)組的操作,能方便取出需要的值。
圖5 變量“j”結(jié)構(gòu)列表
(3)代碼“k=UBound(j)-LBound(j):”的功能是通過調(diào)用函數(shù)“UBound”及“LBound”分別讀取數(shù)組“j”的上標和下標,本例中執(zhí)行完本語句后,“K”值由默認的“0”變成“23”,所以“(K+1)/2”的值為12,即“j(0)”至“j(11)”中存儲放線數(shù)據(jù),“j(12)”至“j(23)”中存儲驗線數(shù)據(jù),通過變量“i”的“FOR”循環(huán),依次讀取數(shù)組中的數(shù)據(jù)。如圖6 所示:
圖6 “K”值查詢
(4)代碼“For i=0 To(k-3)* 0.5 Step 2
Next i”中:“i”循環(huán)的步進設置為“2”是因為每個端點有X、Y 兩個值,每個“i”值能同時取j(i)和j(i+1)兩個值分別用來填充對應的單元格。由于數(shù)據(jù)寫入的開始單元格為“cells(4,,4)”和“cells(4,,5),所以循環(huán)中有變量“i”的表達式分別為“cells(i * 0.5+4,4)”和“cells(i * 0.5+4,5)”,“i”值變化范圍定義成0 至“(k-3)* 0.5”,本案例中“K”值為23,步進為2 的情況下,“i”值依次能取到“0、2、4、6、8、10”,這樣可讀取所有放線坐標。
(5)代碼“i=(k+1)* 0.5
Next i”中,驗線數(shù)數(shù)據(jù)可以用“i”取值范圍“(k+1)* 0.5 To k – 1”、步進為2 的循環(huán)來讀取,單元格的操作和放線數(shù)據(jù)的操作類似,這里不再贅述。
本插件在繪制連接主要軸線交點的連線無誤的情況下,坐標取值和填寫位置能保證絕對準確,杜絕了手工輸入帶來的誤差和繁瑣的操作,對復雜的建筑物尤其如此。此編程思路具有廣泛的擴展性和衍生性,對于有不同要求和格式的坐標提取,只需要對寫入坐標值的單元格定位做相應的調(diào)整。由于不涉及復雜的函數(shù)和調(diào)用,本插件在AutoCAD 2004~AutoCAD 2014 各版本均可正常工作。
打開Excel 程序,根據(jù)較差表模板建立標準空白工作表,用“PL”(輕量多義線)依次連接需要比較的放線點和驗線點,運行插件,根據(jù)提示選取連線,就能自動生成如圖7 所示,同時圖中連線自動刪除。由于模板自身帶有計算公式,計算自動完成,但需要手工填寫軸號、作業(yè)時間和備注。
圖7 坐標較差成果表
本文基于VBA 編程技術(shù),比較輕松地解決了較差表中坐標輸入的問題,極大提高了±0 驗線“坐標較差表”輸入的效率和準確性。本單位在使用過程中遇到了一些特殊情況,通過反復修改和完善,現(xiàn)已能穩(wěn)定高效地運行,而且在這個插件的基礎上衍生出了更多的坐標提取和展點的插件。只是軸線的自動判斷和輸入的問題比較難解決,AutoCAD 的圖元本身不帶這個屬性,人工定義工作量很大,所以現(xiàn)在作業(yè)中還是需要人工判斷和輸入。
[1]張帆.AutoCAD VBA 二次開發(fā)教程[M].北京:清華大學出版社,2006.
[2]張帆,鄭立凱,王華杰.Autocad VBA 開發(fā)精彩實例教程[M].北京:清華大學出版社,2004.
[3]李風華.Autocad 2002/2000 BVA 開發(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.