趙濤 何世偉
[摘 要]本文以湖北省不動(dòng)產(chǎn)確權(quán)調(diào)查登記工作為例,詳細(xì)講述了基于AUTOCAD-VBA開發(fā)分層平面圖的批量出圖的開發(fā)思路及方法。通過本文講述的功能實(shí)現(xiàn)了分層平面圖的自動(dòng)出圖,大大減少了內(nèi)業(yè)工作量,并在保證質(zhì)量的同時(shí)大大提高了實(shí)際工作的效率。
[關(guān)鍵詞]不動(dòng)產(chǎn)權(quán)籍調(diào)查;分層平面圖;點(diǎn)與多邊形關(guān)系判定;AutoCAD二次開發(fā)
中圖分類號(hào):D923.2 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-914X(2018)19-0399-02
1 引言
AUTOCAD是美國Autodesk公司于1982年生產(chǎn)的自動(dòng)計(jì)算機(jī)輔助設(shè)計(jì)軟件,用于二維繪圖、詳細(xì)繪圖、文檔設(shè)計(jì)、基本三維設(shè)計(jì)等?,F(xiàn)已成為國際上廣泛使用的繪圖工具軟件。Autocad具有良好的用戶界面,通過交互菜單或命令行可以方便的實(shí)現(xiàn)各種操作。
當(dāng)前AUTOCAD的二次開發(fā)工具主要有:VisualLisp、VBA、ObjectARX和.net API等。其中VisualLISP與VBA較為簡單,使用方便且開發(fā)速度快,這兩種語言所提供的對(duì)象模型和外部端口基本能滿足不動(dòng)產(chǎn)權(quán)籍調(diào)查工作中擴(kuò)展功能二次開發(fā)的需求。本文以VBA開發(fā)為例,結(jié)合AtoCAD用戶環(huán)境,主要講述程序的開發(fā)思路,開發(fā)難點(diǎn)解決方法,并給出核心代碼。
2 資料準(zhǔn)備
在制作分層平面圖之前應(yīng)根據(jù)外業(yè)測(cè)量及外業(yè)調(diào)查的成果以“權(quán)屬清楚、界址清晰、面積準(zhǔn)確”為原則,繪制詳細(xì)、準(zhǔn)確的地籍圖,并進(jìn)行圖形檢查。根據(jù)《地籍調(diào)查規(guī)程》,界址點(diǎn)間距應(yīng)大于0.1米,界址線不能交叉,相鄰宗地重疊的界址線應(yīng)有相同的界址點(diǎn)。另外,為了程序能自動(dòng)識(shí)別房屋用途,需要新建“房屋用途”圖層,在該圖層中根據(jù)調(diào)查成果注記各房屋的用途,如“主房”、“廚房”、“車庫”、“其他”等。
3 開發(fā)流程
3.1 圖框制作
為了程序生成過程中可以重復(fù)使用圖框,可以將圖框繪制好后保存為DWG文件,在各宗地分層平面圖生成過程中,分別將圖框作為外部塊插入進(jìn)來。為了編程方便,圖框文件中,最好將圖框的左下角移動(dòng)到原點(diǎn)(0,0)。
3.2 選擇成圖范圍
利用AUTOCAD所提供的選擇集可以方便的實(shí)現(xiàn)由用戶選擇成圖范圍。
Dim ssR As AcadSelectionSet
Set ssP = ThisDrawing.SelectionSets.Add("sSp")
ThisDrawing.Utility.Prompt ("請(qǐng)選擇成圖范圍:")
ssP.SelectOnScreen
prPt = vbCrLf & "指定插入圖框左下角的位置: "
startPnt = ThisDrawing.Utility.GetPoint(, prPt)‘用戶指定插入點(diǎn)
3.3 判斷房屋的結(jié)構(gòu)、層數(shù)及用途
新建另一個(gè)選擇集SSR,用于以宗地為范圍選擇宗地內(nèi)的房屋。
SSR.SelectByPolygon acSelectionSetWindowPolygon, objPnt
其中objPnt是權(quán)屬線的頂點(diǎn)三維數(shù)組。這個(gè)選擇集在生成完本宗地后應(yīng)及時(shí)清空,避免產(chǎn)生多于圖形。
房屋層數(shù)及用途的判斷原理基本相同,分別以單個(gè)房屋為范圍,判斷在SSR果中是否有數(shù)字“2”或“3”且在“JMD”圖層中,并且在房屋內(nèi)部,否則判斷為1層;分別以單個(gè)房屋為范圍,判斷是否有“主房”、“車庫”等文本在多邊形內(nèi)且在“房屋用途”圖層中,可得出房屋用途;分別判斷房屋范圍內(nèi)的房屋結(jié)構(gòu)注記可以得到房屋的結(jié)構(gòu)。新建三個(gè)實(shí)體數(shù)組,分別存放分層判斷的結(jié)果,新建6個(gè)雙精度參數(shù)用于存放各種用途的房屋的面積,新建一個(gè)字符串參數(shù)用于存放房屋結(jié)構(gòu)。
這里的房屋層數(shù)及用途的判讀,其難點(diǎn)在于判斷文本是否在房屋中,其實(shí)質(zhì)是點(diǎn)與在多邊形位置關(guān)系的判定。目前所采用的主要方法有射線法、極小圓法。相比之下極小圓法編程簡單,但準(zhǔn)確率不高,而且當(dāng)數(shù)據(jù)量大的時(shí)候,運(yùn)行緩慢,我們此處采用了射線法。射線法的原理是:抽象一條以目標(biāo)點(diǎn)為起點(diǎn)向右的水平射線,當(dāng)此射線與多邊形交點(diǎn)個(gè)數(shù)為奇數(shù)個(gè)時(shí),點(diǎn)在多邊形內(nèi)部。當(dāng)然,要考慮點(diǎn)在多邊形邊上,多邊存在水平邊的情況。
為編程的嚴(yán)密性,此處我們不僅判斷了右射線,也判斷了左射線。以AcadLWPolylin對(duì)象為例,判斷點(diǎn)與多邊形的位置關(guān)系(射線法)函數(shù)的核心代碼如下():
Public Function ptInLwp(ByVal objPl As AcadLWPolyline, ByRef pnt) As Integer
………
For i = 0 To pCount - 1
xJ = 0
If pAr(i).Y = pAr(i + 1).Y Then
xJ = 0
Else
xJ = pAr(i).X - (pAr(i).X - pAr(i + 1).X) / (pAr(i).Y - pAr(i + 1).Y) * (pAr(i).Y - pnt(0))
End If
If xJ < pnt(1) And gMax(pAr(i).Y, pAr(i + 1).Y) > pnt(0) And gMin(pAr(i).Y, pAr(i + 1).Y) < pnt(0) Then
intLJD = intLJD + 1
ElseIf xJ > pnt(1) And gMax(pAr(i).Y, pAr(i + 1).Y) > pnt(0) And gMin(pAr(i).Y, pAr(i + 1).Y) < pnt(0) Then
intRJD = intRJD + 1
End If
Next i
If pAr(0).Y = pAr(pCount).Y Then
xJ = 0
Else
xJ = pAr(0).X - (pAr(0).X - pAr(pCount).X) / (pAr(0).Y - pAr(pCount).Y) * (pAr(0).Y - pnt(0))
End If
If xJ < pnt(1) And gMax(pAr(0).Y, pAr(pCount).Y) > pnt(0) And gMin(pAr(0).Y, pAr(pCount).Y) < pnt(0) Then
intLJD = intLJD + 1
ElseIf xJ > pnt(1) And gMax(pAr(0).Y, pAr(pCount).Y) > pnt(0) And gMin(pAr(0).Y, pAr(pCount).Y) < pnt(0) Then
intRJD = intRJD + 1
End If
If intLJD Mod 2 = 1 And intRJD Mod 2 = 1 Then
ptInLwp = 1 '點(diǎn)在多邊形內(nèi)
Else: ptInLwp = -1
End If
End Function
此函數(shù)當(dāng)點(diǎn)在多邊形內(nèi)部時(shí)返回1,點(diǎn)在多邊形邊上時(shí)返回0,在多邊形外時(shí)返回-1。由于函數(shù)只進(jìn)行了常規(guī)的數(shù)學(xué)計(jì)算,所以代碼運(yùn)行效率非常高,且準(zhǔn)確率達(dá)到100%,且適用于任何凹凸多邊形。
3.4 繪制示意圖并標(biāo)記邊長
將3.3中判斷的結(jié)果以各個(gè)數(shù)組中各實(shí)體元素的中心為基點(diǎn),復(fù)制到圖框相應(yīng)位置,并標(biāo)注實(shí)際邊長。標(biāo)記邊長的原理是先計(jì)算邊長與方位角,將插入的文本起點(diǎn)設(shè)置為邊長中點(diǎn)向外偏移1米并向起點(diǎn)移動(dòng)文本長度一半的位置,旋轉(zhuǎn)角度設(shè)為方位角。由于不需要標(biāo)注內(nèi)部邊長,對(duì)于二層及三層房屋實(shí)體數(shù)組中重疊邊可不標(biāo)注。
3.5 填入面積數(shù)據(jù)
按湖北省省廳發(fā)布的不動(dòng)產(chǎn)權(quán)籍調(diào)查《實(shí)施細(xì)則》的相關(guān)規(guī)定,面積保留兩位小數(shù),可用FORMAT函數(shù)先將面積格式化為“0.00”再填入。填入的文本插入坐標(biāo)以插入點(diǎn)為基準(zhǔn)較為簡便。部分代碼如下:
sPnt(0) = startPnt(0) + 112.32: sPnt(1) = startPnt(1) + 17.49: sPnt(2) = 0
Set pTxt = ThisDrawing.ModelSpace.AddText(zfJG, sPnt, 1)
pTxt.Alignment=acAlignmentMiddle:pTxt.TextAlignmentPoint=sPnt
我們只需要使用FOR EACH…..NEXT….語句對(duì)選擇集內(nèi)的所有權(quán)屬線對(duì)象進(jìn)行循環(huán)處理,即可方便的實(shí)現(xiàn)對(duì)所有宗地的批量出圖。
4 結(jié)束語
在以往的不動(dòng)產(chǎn)權(quán)籍調(diào)查工作中,分層平面圖由調(diào)查人員手工制作,制作過程復(fù)雜繁瑣,工作時(shí)間長,人為錯(cuò)誤多,效率低。本文論述的開發(fā)思路及所開發(fā)的應(yīng)用軟件使得分層平面圖工作自動(dòng)化,減少了重復(fù)工作量,大大提高了工作效率。本文所提及的代碼運(yùn)行效率高,每1000宗地,只需5至6分鐘即可完成。此外本文二次開發(fā)的成果已廣泛應(yīng)用于湖北省襄陽市、隨州市等地的權(quán)籍調(diào)查工作中,并得到了用戶的好評(píng),為推進(jìn)湖北省不動(dòng)產(chǎn)權(quán)籍調(diào)查登記工作提供了有力的技術(shù)支持。
參考文獻(xiàn)
[1] 《國土資源部不動(dòng)產(chǎn)權(quán)籍調(diào)查技術(shù)方案》2015年41號(hào)文件.
[2] 《湖北省宅基地使用權(quán)和集體建設(shè)用地使用權(quán)確權(quán)登記發(fā)證工作實(shí)施細(xì)則》.
[3] 《地籍調(diào)查規(guī)程 TD T1001-2012》.
[4] 張帆.《AutoCAD VBA開發(fā)精彩實(shí)例教程》[M].北京:清華大學(xué)出版社,2005年版.