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