?

基于VBA自動提取坐標插件的設計及在±0驗線中的應用

2015-06-28 06:15王衛華盧云輝
城市勘測 2015年2期
關鍵詞:輕量多義坐標值

王衛華,盧云輝

(宜昌市測繪大隊,湖北 宜昌 443100)

1 引 言

建設工程±0 驗線是指建設工程施工至±0 位置時,對建筑單體外圍軸線位置的檢測及±0 標高的檢測。目的是檢查建設工程基礎是否按規劃主管部門放線的要求進行施工,±0 驗線是灰線檢驗工作的進一步深入,也是建設工程規劃報批后管理的重要環節?!?驗線報告作為規劃部門管理的重要依據,必須能準確、直觀地反映建筑物外圍軸線與放線軸線偏移量的方位和數值,圖1 所示的坐標較差表,是宜昌市規劃局要求的±0 驗線報告的一個附件。

圖1 ±0 驗線坐標較差表

表格中放線坐標和驗線坐標數值需要手工輸入,如果建筑物結構比較復雜,則輸入的工作量非常大而且容易出錯。雖然用CAD 命令“list”能列出多義線坐標列表,但是導入Excel 軟件時不能直觀的找到對應坐標軸,工作量仍然很大。因此,借助CAD 二次開發編寫插件無疑是解決此類問題最好的方法。

CAD 二次開發比較常用的工具是Visual LISP 和VBA,兩者各有所長,互為補充。Visual LISP 適合描述人機交互的工程,長于編寫模擬設計師思路的專業設計程序,對于各種用戶的輸入、錯誤的識別與恢復等有相當強大的功能,能充分發揮交互操作的特長,同時具有最多樣式的程序運行模式和很好的兼容性。缺點是編譯困難,對話框DCL 的設計編寫很難熟練掌握,因為其編譯困難,很難編寫大型程序。VBA 可以很方便地使用Windows 系統資源,使AutoCAD 很容易和Windows 下的Excel 等應用程序交互;對話框功能比LISP DCL 好很多,多圖檔環境下的應用程序也比Visual LISP 提供了更多的支持,且VBA 代碼有較好的可讀性,能進行復雜計算公式的編制。不足之處是不能像Visual LISP 一樣方便地調用CAD 的命令,許多交互操作的技巧在VBA中不能直接調用。綜上所述,熟練、靈活的掌握兩種語言的技巧和精髓,能幫助我們寫出實用高效,強壯性好的程序,本文中“驗線坐標較差表”坐標自動提取插件用VBA 編寫,輕松解決了坐標輸入的問題。

2 實例和編程思路

2.1 工程概況

某項目±0 驗線結果如圖2 所示,紅色線條為放線軸線,黑色線條為驗線軸線。為了圖面清晰,省略了與主題無關的要素,且人為拉大了差距,本案例需要分別列出1/K、56/K、48/A、35/A、22/A、9/A 等6 處軸線交點處的放線和驗線坐標:

圖2 放線驗線對照圖

2.2 編程思路

由于“坐標較差表”的格式較為固定,便于與Excel 軟件結合,本插件主要通過將提取的坐標數據自動寫入到表格中相應的單元格中。首先需要用輕量多義線(CAD中命令“PL”輸入,此線條只有二維坐標)依次連接所有提取坐標的交點,通過提取此輕量多義線的“Coordinates”屬性得到線上所有點的坐標,將坐標值賦值給一個數組,然后分別讀取數組中對應的值并寫入Excel 表格。數據寫入區首個單元格為“D4”,往下依次寫入放線坐標值,然后從單元格“G4”開始往下依次寫入驗線坐標值,本插件的主要難點在于寫入表格時的流程控制。

3 程序的實現

為了實現坐標的讀取,需要先用“輕量多義線”連接所有需要比較坐標的軸線交點,用“PL”命令依次連接圖3 中1 號~12 號點,得到的藍色多義線就有了插件需要的所有坐標值,并以此為基礎來完成插件的編寫。

完整代碼如下:

圖3 繪制連線圖

主要代碼過程解釋:

(1)代碼“ThisDrawing.Utility.GetEntity line,pt1,"拾取連線"”的功能是為輕量多義線賦值,調試過程中充分利用“本地窗口”的查詢功能,如圖4 所示,點開“本地窗口”中“line”的“Coordinates”屬性,即坐標屬性,可以看到本例中“Coordinates”是一個24 維的數組,由于測繪坐標系和CAD 直角坐標系的差異,Coordinates(0)和Coordinates(1)的值分別對應1 號點的Y坐標和X 坐標,同理,Coordinates(22)和Coordinates(23)的值分別對應12 號點的Y 坐標和X 坐標,深入了解數據的結構,有助于插件的編寫。

圖4 “Coordinates”屬性列表

(2)代碼“j=line.Coordinates”的功能是通過“Variant”型變量“j”將line 的“Coordinates”屬性取出,才能進行以后的操作,如圖5 所示,在賦值之后,本案例中變量“j”是一個24 維的數組,通過對數組的操作,能方便取出需要的值。

圖5 變量“j”結構列表

(3)代碼“k=UBound(j)-LBound(j):”的功能是通過調用函數“UBound”及“LBound”分別讀取數組“j”的上標和下標,本例中執行完本語句后,“K”值由默認的“0”變成“23”,所以“(K+1)/2”的值為12,即“j(0)”至“j(11)”中存儲放線數據,“j(12)”至“j(23)”中存儲驗線數據,通過變量“i”的“FOR”循環,依次讀取數組中的數據。如圖6 所示:

圖6 “K”值查詢

(4)代碼“For i=0 To(k-3)* 0.5 Step 2

Next i”中:“i”循環的步進設置為“2”是因為每個端點有X、Y 兩個值,每個“i”值能同時取j(i)和j(i+1)兩個值分別用來填充對應的單元格。由于數據寫入的開始單元格為“cells(4,,4)”和“cells(4,,5),所以循環中有變量“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”中,驗線數數據可以用“i”取值范圍“(k+1)* 0.5 To k – 1”、步進為2 的循環來讀取,單元格的操作和放線數據的操作類似,這里不再贅述。

本插件在繪制連接主要軸線交點的連線無誤的情況下,坐標取值和填寫位置能保證絕對準確,杜絕了手工輸入帶來的誤差和繁瑣的操作,對復雜的建筑物尤其如此。此編程思路具有廣泛的擴展性和衍生性,對于有不同要求和格式的坐標提取,只需要對寫入坐標值的單元格定位做相應的調整。由于不涉及復雜的函數和調用,本插件在AutoCAD 2004~AutoCAD 2014 各版本均可正常工作。

4 實例操作

打開Excel 程序,根據較差表模板建立標準空白工作表,用“PL”(輕量多義線)依次連接需要比較的放線點和驗線點,運行插件,根據提示選取連線,就能自動生成如圖7 所示,同時圖中連線自動刪除。由于模板自身帶有計算公式,計算自動完成,但需要手工填寫軸號、作業時間和備注。

圖7 坐標較差成果表

5 結 語

本文基于VBA 編程技術,比較輕松地解決了較差表中坐標輸入的問題,極大提高了±0 驗線“坐標較差表”輸入的效率和準確性。本單位在使用過程中遇到了一些特殊情況,通過反復修改和完善,現已能穩定高效地運行,而且在這個插件的基礎上衍生出了更多的坐標提取和展點的插件。只是軸線的自動判斷和輸入的問題比較難解決,AutoCAD 的圖元本身不帶這個屬性,人工定義工作量很大,所以現在作業中還是需要人工判斷和輸入。

[1]張帆.AutoCAD VBA 二次開發教程[M].北京:清華大學出版社,2006.

[2]張帆,鄭立凱,王華杰.Autocad VBA 開發精彩實例教程[M].北京:清華大學出版社,2004.

[3]李風華.Autocad 2002/2000 BVA 開發指南[M].北京:清華大學出版社,2001.

[4]曾洪飛,張帆,盧擇臨.Autocad VBA&VB.NET 開發基礎與實例教程[M].北京:中國電力出版社,2008.

[5]二代龍震工作室.Autocad VBA 函數庫查詢辭典[M].北京:中國鐵路出版社,2003.

[6]Micrsoft 公司.Microsoft visual basic 6.0 程序員指南[M].北京:希望電子出版社,1998.

[7]Micrsoft 公司.Microsoft visual basic 6.0 語言參考手冊[M].北京:希望電子出版社,1998.

猜你喜歡
輕量多義坐標值
輕量新能源汽車應用開關磁阻電機系統匹配的研究
試論成都方言的社會稱謂語
大跨度鋼結構安裝三維坐標擬合轉換
我對輕量型并繼竿的看法
基于二分法迭代的凸模數控銑削加工編程*
基于宏程序的數控車削加工應用
維吾爾語動詞“t∫iqmap”多義范疇的語義延伸機制
《錦瑟》賞析
多車道自由流技術在多義路徑識別領域的應用
外出的最“重量”武器是最“輕量”化妝包
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合