何鑫星,王小娟,李 卓
(1.四川省測繪產(chǎn)品質(zhì)量監(jiān)督檢驗站,成都 610041)
在對AutoCAD 平臺的DWG 數(shù)據(jù)進行編輯時,經(jīng)常需要人機交互式使用選擇集對數(shù)據(jù)進行過濾搜索處理,但人機交互使用選擇集過濾器的方法無法將圖元之間的幾何關(guān)系也作為過濾條件對數(shù)據(jù)進行精準(zhǔn)搜索?;诖?,本文基于AutoCAD 選擇集的二次開發(fā)技術(shù)更寬泛地重新定義過濾搜索條件,從而實現(xiàn)基于圖元幾何關(guān)系及屬性信息組合的圖元自動化搜索。這種對圖元過濾搜索的方法,擴展了用戶對DWG 數(shù)據(jù)自動化處理的能力。
VBA 編程技術(shù)是Visual Basic 的一種宏語言,主要能用來擴展Windows 的應(yīng)用程序功能,特別是Microsoft Office 軟件。ActiveX 是微軟推出的一個基于COM 的技術(shù)規(guī)范[1]。它是在OLE 基礎(chǔ)上發(fā)展的新技術(shù),其宗旨是在Windows 系統(tǒng)的統(tǒng)一管理下協(xié)調(diào)不同的應(yīng)用程序。Autodesk 公司采納了微軟的這一技術(shù)規(guī)范,最早在AutoCAD R14.0 版推出了基于ActiveX Automation 技術(shù)的開發(fā)方式,隨后就有AutoCAD R14.01 版,該版本內(nèi)嵌了AutoCAD VBA。到AutoCAD 2000/2002(屬R15 版)、AutoCAD 2004/2005/2006(屬R16 版)和AutoCAD 2007(屬R17 版),這種新型的開發(fā)方式得到了進一步的改進及完善。將AutoCAD、ActiveX Automation 和VBA 相結(jié)合編程有3 個基本要素[1]。第一個要素是AutoCAD 本身,它提供了全面的對象,包括AutoCAD 圖元、數(shù)據(jù)和命令,要有效地使用VBA,必須熟悉 AutoCAD 的編程特性,例如一些基于對象的方法;第二個要素是AutoCAD ActiveX Automation 接口,是它與AutoCAD對象進行信息傳遞;第三個要素是VBA 本身,它有自己的一套對象、關(guān)鍵字和常量等的集合,用于提供程序流、控制、調(diào)試和執(zhí)行。
在AutoCAD 中通過菜單或命令的方式使用選擇集,實現(xiàn)對DWG 數(shù)據(jù)中目標(biāo)圖元對象的過濾選擇操作,但選擇集過濾參數(shù)是人工給定的,即需要交互式地給出圖元的線型、顏色、所在層等參數(shù)。利用VBA技術(shù)可以實現(xiàn)自動化選擇集的構(gòu)建,相對于人工操作,VBA 技術(shù)允許過濾參數(shù)做批量循環(huán)操作,適合做數(shù)據(jù)自動化批量處理。選擇集自動化構(gòu)建方法的實現(xiàn)主要是基于對AutoCAD ActiveX 接口對象的利用,如圖形對象、組織結(jié)構(gòu)對象、圖形顯示對象、應(yīng)用程序本身等。對象是通過分層方式來組織的,其中應(yīng)用程序?qū)ο鬄楦鶎ο螅@種分層結(jié)構(gòu)的視圖即對象模型,對象模型提供了訪問下一層對象的途徑[2]。模型中有一種集合對象是預(yù)先定義的對象,它包含所有相似對象的實例,即這些對象的父對象。用于創(chuàng)建選擇集的SelectionSets 對象就是常用的集合對象之一,常用的集合對象還有Documents 集合、ModelSpace 集合、Views 集合等。
在AutoCAD2008 中用于創(chuàng)建選擇集的VBA 編程方法有如下4 種:
1) object.Select Mode [,Point1][,Point2][,FilterType][,FilterData]
2)object.SelectAtPoint Point, FilterType, FilterData
3)object.SelectByPolygon Mode[,Pointslist][,FilterType][,FilterData]
4)object.SelectOnScreen [FilterType][,FilterData]
其中,Object 指使用SelectionSet 這個方法的對象;FilterType 為變體數(shù)組類型,僅用于輸入指定過濾器類型的DXF 組碼(可選項);FilterData 為變體數(shù)組類型,僅用于輸入過濾器的值(可選項)。方法1:object.Select 選擇的區(qū)域是由兩點構(gòu)成的矩形區(qū)域;方法2:object.SelectAtPoint 選擇的區(qū)域是某一個點;方法3:object. SelectByPolygon 選擇的區(qū)域是由坐標(biāo)列表構(gòu)成的多邊形區(qū)域;方法4:object.SelectOnScreen 選擇的區(qū)域是一個人機交互給定的矩形區(qū)域。方法1、3 中的Mode 包含8 種選擇模式,不同的模式對應(yīng)不同的對象過濾結(jié)果。
AutoCAD 的DXF 組碼碼值范圍為-5~1 071[3-4],熟練掌握DXF 組碼就可以靈活使用選擇集進行過濾,一般常用的DXF 組碼有10 個左右,其使用方式如表1、2 所示。
表1 常用選擇集過濾器的DXF 組碼代碼表
表2 常用過濾群組方式(FilterType(DXF 群組碼)=-4 時)
根據(jù)表1、2 可以得出,如果過濾的條件為圖元為TEXT 或LINE 但圖層不屬于TEST 層的組碼,則應(yīng)該如表3 所示。
表3 選擇集條件過濾實例
DWG 數(shù)據(jù)的自動化批量處理涉及的核心問題是如何對數(shù)據(jù)按特定圖元對象進行過濾搜索,只有訪問到目標(biāo)圖元對象后才能進行分析、處理、修改等操作,而這僅依賴AutoCAD 提供的交互式基本操作是實現(xiàn)不了的。為了擴展AutoCAD 的功能,讓其在測繪地理信息、土地規(guī)劃、勘察設(shè)計、城市地下管網(wǎng)等行業(yè)中得到更為廣泛的應(yīng)用,本文基于AutoCAD 選擇集的二次開發(fā)提出了一種能夠?qū)D元幾何關(guān)系也作為選擇集過濾參數(shù)的新自動化圖元搜索方法。
第2 章介紹了利用AutoCAD 選擇集的DXF 組碼條件過濾方法能搜索到圖元對象以及對象的所有屬性信息,但是卻無法按圖元對象之間的相關(guān)關(guān)系進行搜索,例如要搜索出所有內(nèi)部包含文字注記“磚2”的多邊形,這就無法避免判斷文字注記與該多邊形房屋的包含關(guān)系,所以過濾參數(shù)除了有屬性信息還有圖元對象間幾何拓撲關(guān)系(點與多邊形關(guān)系)[5-6],這也是僅用DXF 組碼條件過濾方法無法實現(xiàn)的。但類似的應(yīng)用需求在DWG 數(shù)據(jù)的處理中非常普遍,具體需求如DWG 格式的地形圖數(shù)據(jù)批量編輯修改、農(nóng)村不動產(chǎn)測繪分戶圖的批量編輯修改等。因此,由于DXF 組碼條件過濾的局限性,考慮用更底層的方法去設(shè)計開發(fā)一種能夠按圖元幾何拓撲關(guān)系作為過濾條件的自動化搜索方法,從而擴展選擇集的過濾搜索能力。
幾何拓撲關(guān)系按點、線、面的組合來分,最基本的有6 種關(guān)系,以下主要討論點與面、線與面、面與面的包含關(guān)系,由于AutoCAD 中對面的概念與GIS 軟件不同,所以這里討論的面實際是閉合的多邊形。為了能設(shè)計開發(fā)出一種實用的能自動判斷拓撲關(guān)系的搜索方法,需要綜合考慮穩(wěn)定性、數(shù)據(jù)量等實際情況。算法流程如圖1 所示。
圖1 自動化搜索算法流程
1)定義分區(qū)搜索是為了避免數(shù)據(jù)量太大的情況下算法過于復(fù)雜導(dǎo)致程序崩潰,通過數(shù)據(jù)量指定分區(qū)大小則可以有效避免程序崩潰。
2)目標(biāo)對象包含關(guān)系給出目標(biāo)圖元之間要滿足的拓撲關(guān)系參數(shù),可以是點與多邊形、線與多邊形、多邊形與多邊形(這里只討論包含與被包含的關(guān)系)。
3)DXF 組碼過濾條件是為了給出目標(biāo)圖元自身的類型與屬性信息。
4)創(chuàng)建選擇集利用AutoCAD 提供的創(chuàng)建接口進行創(chuàng)建。
5)分區(qū)內(nèi)搜索圖元是選擇集的搜索范圍大小為定義的分區(qū)大小,根據(jù)實際分區(qū)個數(shù)循環(huán)進行搜索,通過分區(qū)篩選的方式提高程序的運行效率[7]。
6)拓撲關(guān)系判斷是將點與多邊形、線與多邊形、多邊形與多邊形的包含關(guān)系都轉(zhuǎn)化成點集合與邊集合、多邊形集合后進行數(shù)學(xué)方法判斷[8]。
7)若目標(biāo)圖元的關(guān)系滿足定義參數(shù)要求則被提取,實現(xiàn)自動化過濾搜索。
點與多邊形關(guān)系的判斷是拓撲關(guān)系判斷的基礎(chǔ),其中涉及的多邊形分凸多邊形與凹多邊形兩種,關(guān)系又分為點在多邊形內(nèi)、點在多邊形外、點在多邊形邊上三種。以下為一種面積法判斷點與多邊形關(guān)系的方法。
如圖2 所示,當(dāng)點P 在凸多邊形ABCDE 外時,如果找到離P 點最近的邊AB,然后將P 點納入AB之間構(gòu)成新的多邊形APBCDE,多邊形APBCDE 的面積會大于多邊形ABCDE。反之,當(dāng)點P 在凸多邊形ABCDE 內(nèi)時,多邊形APBCDE 面積小于多邊形ABCDE。
圖2 凸多邊形與點的關(guān)系
如圖3 所示,P 點在多邊形ABCDEF 內(nèi)或外時對面積的變化完全與凸多邊形一致。所以關(guān)鍵算法只有兩部分,第一是找到離P 點最近的邊,并將P 納入兩點之間構(gòu)成新的多邊形;第二步利用公式(1)進行面積計算。
所以只需根據(jù)面積數(shù)值變化就可以實現(xiàn)點與多邊形關(guān)系的判斷。判斷點與多邊形關(guān)系的算法除了該方法還有向量法、射線法[9-10]等,但各種方法都有自身的優(yōu)缺點,所以具體用什么方法要根據(jù)實際情況來進行選擇。
圖3 凹多邊形與點的關(guān)系
本文按幾何拓撲關(guān)系搜索算法的總體流程對DWG數(shù)據(jù)的分區(qū)搜索、選擇集自動構(gòu)建、點與多邊形關(guān)系判斷等功能模塊完成了程序代碼編寫,并設(shè)計了相應(yīng)的用戶界面方便對圖元對象的輸入、提取、修改、輸出等操作。考慮程序的執(zhí)行效率及易用性,將程序各個功能模塊用現(xiàn)今主流的VBA、Lisp、ARX、.NET等AutoCAD 二次開發(fā)技術(shù)進行集成。其中VBA、.NET 等可以快捷的做出圖形界面;Lisp 可以便捷的調(diào)用VBA 程序的各個模塊,相當(dāng)于在CAD 中輸入命令,使用非常方便;VBA 可以直接操作CAD 圖元對象,程序執(zhí)行效率高,且VBA 可以實現(xiàn)簡潔易用的窗體,使得程序更加人性化,更簡單實用;Lisp 主要用來建立VBA 程序與CAD 菜單和工具欄之間的聯(lián)系,可以整合VBA 程序功能到菜單及工具欄中,使得程序使用更加方便,用戶體驗與使用CAD 內(nèi)置功能一致,如圖4 所示。
圖4 VBA 程序窗體界面
本文選擇用VBA 來高效實現(xiàn)按幾何拓撲關(guān)系搜索的算法、用戶界面搭建等,用lisp 及AutoCAD 的菜單文件“*.mnu”實現(xiàn)菜單的改寫,再用lisp 語言來說實現(xiàn)VBA 工程與自定義命令隨AutoCAD 啟動而自動加載,最終實現(xiàn)將二次開發(fā)的功能完整嵌入AutoCAD,使用時如同AutoCAD 本身功能一樣,可以從菜單調(diào)用也可以輸入命令調(diào)用程序功能。
實驗數(shù)據(jù)為四川省農(nóng)村不動產(chǎn)測繪項目的分戶圖數(shù)據(jù),該項目的質(zhì)量檢查需求之一是要能對每一戶的房產(chǎn)面積進行重新計算核對。其中每一戶的面積由若干層、若干戶型的面積組成,而且根據(jù)項目設(shè)計要求面積有全算、半算、不算3 種算法。需求二是要能全自動化檢查。本文提出的新搜索方法正好能滿足以上需求,因為其本質(zhì)是判斷多邊形內(nèi)的文字注記是否與定義要求一致。圖5 為農(nóng)村不動產(chǎn)測繪項目的按村組組織的分戶圖數(shù)據(jù),圖6 為程序查出的面積數(shù)值與圖形不符的錯誤情況圖。
圖5 農(nóng)村不動產(chǎn)測繪分戶圖
圖6 程序檢查結(jié)果
為了能更好地對該方法的效率及穩(wěn)定性進行測試實驗,實驗用了農(nóng)村不動產(chǎn)測繪項目中的25 個村組的分戶圖數(shù)據(jù)在64 位Windows 7 系統(tǒng)、2008 版AutoCAD環(huán)境下進行效率實測,測試過程中程序運行正常,測試結(jié)果如表4 所示。
表4 搜索效率測試
本文介紹了AutoCAD VBA 編程技術(shù),并對選擇集的VBA 編程方法進行了經(jīng)驗總結(jié),提出一種非人機交互式的自動選擇集對目標(biāo)數(shù)據(jù)進行搜索、過濾的新方法。通過集成AutoCAD 選擇集的VBA 編程方法、分區(qū)搜索、點與多邊形關(guān)系判斷等算法,實現(xiàn)對DWG數(shù)據(jù)中文字注記、二維圖形的高效搜素、過濾、提取、計算等操作。將該方法應(yīng)用到了四川省農(nóng)村不動產(chǎn)測繪項目質(zhì)量檢驗中,對項目成果數(shù)據(jù)中的大批量分戶產(chǎn)權(quán)信息完成了自動化比對分析,得到了預(yù)期的結(jié)果。這種基于AutoCAD ActiveX/VBA 技術(shù)開發(fā)的搜索方法的優(yōu)勢主要體現(xiàn)在如下方面。
1)VBA 代碼與AutoCAD 共享內(nèi)存空間,所以程序代碼執(zhí)行效率非常高。
2)在DXF 組碼選擇集過濾搜索的基礎(chǔ)上擴展出了按圖元包含關(guān)系的自動化搜索方法,拓展了應(yīng)用場景。
3)開發(fā)環(huán)境搭建非常簡單,AutoCAD 界面下按Alt+F11 就自動進入編程和執(zhí)行環(huán)境,無需安裝編程軟件。
需要注意的是該方法是基于AutoCAD 平臺開發(fā),部分內(nèi)容無法直接移植到其他圖形平臺下進行應(yīng)用,例如GIS 平臺中就沒有DXF 組碼進行選擇集過濾的方式。