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