论文部分内容阅读
[摘 要]本文以湖北省不动产确权调查登记工作为例,详细讲述了基于AUTOCAD-VBA开发分层平面图的批量出图的开发思路及方法。通过本文讲述的功能实现了分层平面图的自动出图,大大减少了内业工作量,并在保证质量的同时大大提高了实际工作的效率。
[关键词]不动产权籍调查;分层平面图;点与多边形关系判定;AutoCAD二次开发
中图分类号:D923.2 文献标识码:A 文章编号:1009-914X(2018)19-0399-02
1 引言
AUTOCAD是美国Autodesk公司于1982年生产的自动计算机辅助设计软件,用于二维绘图、详细绘图、文档设计、基本三维设计等。现已成为国际上广泛使用的绘图工具软件。Autocad具有良好的用户界面,通过交互菜单或命令行可以方便的实现各种操作。
当前AUTOCAD的二次开发工具主要有:VisualLisp、VBA、ObjectARX和.net API等。其中VisualLISP与VBA较为简单,使用方便且开发速度快,这两种语言所提供的对象模型和外部端口基本能满足不动产权籍调查工作中扩展功能二次开发的需求。本文以VBA开发为例,结合AtoCAD用户环境,主要讲述程序的开发思路,开发难点解决方法,并给出核心代码。
2 资料准备
在制作分层平面图之前应根据外业测量及外业调查的成果以“权属清楚、界址清晰、面积准确”为原则,绘制详细、准确的地籍图,并进行图形检查。根据《地籍调查规程》,界址点间距应大于0.1米,界址线不能交叉,相邻宗地重叠的界址线应有相同的界址点。另外,为了程序能自动识别房屋用途,需要新建“房屋用途”图层,在该图层中根据调查成果注记各房屋的用途,如“主房”、“厨房”、“车库”、“其他”等。
3 开发流程
3.1 图框制作
为了程序生成过程中可以重复使用图框,可以将图框绘制好后保存为DWG文件,在各宗地分层平面图生成过程中,分别将图框作为外部块插入进来。为了编程方便,图框文件中,最好将图框的左下角移动到原点(0,0)。
3.2 选择成图范围
利用AUTOCAD所提供的选择集可以方便的实现由用户选择成图范围。
Dim ssR As AcadSelectionSet
Set ssP = ThisDrawing.SelectionSets.Add("sSp")
ThisDrawing.Utility.Prompt ("请选择成图范围:")
ssP.SelectOnScreen
prPt = vbCrLf & "指定插入图框左下角的位置: "
startPnt = ThisDrawing.Utility.GetPoint(, prPt)‘用戶指定插入点
3.3 判断房屋的结构、层数及用途
新建另一个选择集SSR,用于以宗地为范围选择宗地内的房屋。
SSR.SelectByPolygon acSelectionSetWindowPolygon, objPnt
其中objPnt是权属线的顶点三维数组。这个选择集在生成完本宗地后应及时清空,避免产生多于图形。
房屋层数及用途的判断原理基本相同,分别以单个房屋为范围,判断在SSR果中是否有数字“2”或“3”且在“JMD”图层中,并且在房屋内部,否则判断为1层;分别以单个房屋为范围,判断是否有“主房”、“车库”等文本在多边形内且在“房屋用途”图层中,可得出房屋用途;分别判断房屋范围内的房屋结构注记可以得到房屋的结构。新建三个实体数组,分别存放分层判断的结果,新建6个双精度参数用于存放各种用途的房屋的面积,新建一个字符串参数用于存放房屋结构。
这里的房屋层数及用途的判读,其难点在于判断文本是否在房屋中,其实质是点与在多边形位置关系的判定。目前所采用的主要方法有射线法、极小圆法。相比之下极小圆法编程简单,但准确率不高,而且当数据量大的时候,运行缓慢,我们此处采用了射线法。射线法的原理是:抽象一条以目标点为起点向右的水平射线,当此射线与多边形交点个数为奇数个时,点在多边形内部。当然,要考虑点在多边形边上,多边存在水平边的情况。
为编程的严密性,此处我们不仅判断了右射线,也判断了左射线。以AcadLWPolylin对象为例,判断点与多边形的位置关系(射线法)函数的核心代码如下():
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 '点在多边形内
Else: ptInLwp = -1
End If
End Function
此函数当点在多边形内部时返回1,点在多边形边上时返回0,在多边形外时返回-1。由于函数只进行了常规的数学计算,所以代码运行效率非常高,且准确率达到100%,且适用于任何凹凸多边形。
3.4 绘制示意图并标记边长
将3.3中判断的结果以各个数组中各实体元素的中心为基点,复制到图框相应位置,并标注实际边长。标记边长的原理是先计算边长与方位角,将插入的文本起点设置为边长中点向外偏移1米并向起点移动文本长度一半的位置,旋转角度设为方位角。由于不需要标注内部边长,对于二层及三层房屋实体数组中重叠边可不标注。
3.5 填入面积数据
按湖北省省厅发布的不动产权籍调查《实施细则》的相关规定,面积保留两位小数,可用FORMAT函数先将面积格式化为“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….语句对选择集内的所有权属线对象进行循环处理,即可方便的实现对所有宗地的批量出图。
4 结束语
在以往的不动产权籍调查工作中,分层平面图由调查人员手工制作,制作过程复杂繁琐,工作时间长,人为错误多,效率低。本文论述的开发思路及所开发的应用软件使得分层平面图工作自动化,减少了重复工作量,大大提高了工作效率。本文所提及的代碼运行效率高,每1000宗地,只需5至6分钟即可完成。此外本文二次开发的成果已广泛应用于湖北省襄阳市、随州市等地的权籍调查工作中,并得到了用户的好评,为推进湖北省不动产权籍调查登记工作提供了有力的技术支持。
参考文献
[1] 《国土资源部不动产权籍调查技术方案》2015年41号文件.
[2] 《湖北省宅基地使用权和集体建设用地使用权确权登记发证工作实施细则》.
[3] 《地籍调查规程 TD T1001-2012》.
[4] 张帆.《AutoCAD VBA开发精彩实例教程》[M].北京:清华大学出版社,2005年版.
[关键词]不动产权籍调查;分层平面图;点与多边形关系判定;AutoCAD二次开发
中图分类号:D923.2 文献标识码:A 文章编号:1009-914X(2018)19-0399-02
1 引言
AUTOCAD是美国Autodesk公司于1982年生产的自动计算机辅助设计软件,用于二维绘图、详细绘图、文档设计、基本三维设计等。现已成为国际上广泛使用的绘图工具软件。Autocad具有良好的用户界面,通过交互菜单或命令行可以方便的实现各种操作。
当前AUTOCAD的二次开发工具主要有:VisualLisp、VBA、ObjectARX和.net API等。其中VisualLISP与VBA较为简单,使用方便且开发速度快,这两种语言所提供的对象模型和外部端口基本能满足不动产权籍调查工作中扩展功能二次开发的需求。本文以VBA开发为例,结合AtoCAD用户环境,主要讲述程序的开发思路,开发难点解决方法,并给出核心代码。
2 资料准备
在制作分层平面图之前应根据外业测量及外业调查的成果以“权属清楚、界址清晰、面积准确”为原则,绘制详细、准确的地籍图,并进行图形检查。根据《地籍调查规程》,界址点间距应大于0.1米,界址线不能交叉,相邻宗地重叠的界址线应有相同的界址点。另外,为了程序能自动识别房屋用途,需要新建“房屋用途”图层,在该图层中根据调查成果注记各房屋的用途,如“主房”、“厨房”、“车库”、“其他”等。
3 开发流程
3.1 图框制作
为了程序生成过程中可以重复使用图框,可以将图框绘制好后保存为DWG文件,在各宗地分层平面图生成过程中,分别将图框作为外部块插入进来。为了编程方便,图框文件中,最好将图框的左下角移动到原点(0,0)。
3.2 选择成图范围
利用AUTOCAD所提供的选择集可以方便的实现由用户选择成图范围。
Dim ssR As AcadSelectionSet
Set ssP = ThisDrawing.SelectionSets.Add("sSp")
ThisDrawing.Utility.Prompt ("请选择成图范围:")
ssP.SelectOnScreen
prPt = vbCrLf & "指定插入图框左下角的位置: "
startPnt = ThisDrawing.Utility.GetPoint(, prPt)‘用戶指定插入点
3.3 判断房屋的结构、层数及用途
新建另一个选择集SSR,用于以宗地为范围选择宗地内的房屋。
SSR.SelectByPolygon acSelectionSetWindowPolygon, objPnt
其中objPnt是权属线的顶点三维数组。这个选择集在生成完本宗地后应及时清空,避免产生多于图形。
房屋层数及用途的判断原理基本相同,分别以单个房屋为范围,判断在SSR果中是否有数字“2”或“3”且在“JMD”图层中,并且在房屋内部,否则判断为1层;分别以单个房屋为范围,判断是否有“主房”、“车库”等文本在多边形内且在“房屋用途”图层中,可得出房屋用途;分别判断房屋范围内的房屋结构注记可以得到房屋的结构。新建三个实体数组,分别存放分层判断的结果,新建6个双精度参数用于存放各种用途的房屋的面积,新建一个字符串参数用于存放房屋结构。
这里的房屋层数及用途的判读,其难点在于判断文本是否在房屋中,其实质是点与在多边形位置关系的判定。目前所采用的主要方法有射线法、极小圆法。相比之下极小圆法编程简单,但准确率不高,而且当数据量大的时候,运行缓慢,我们此处采用了射线法。射线法的原理是:抽象一条以目标点为起点向右的水平射线,当此射线与多边形交点个数为奇数个时,点在多边形内部。当然,要考虑点在多边形边上,多边存在水平边的情况。
为编程的严密性,此处我们不仅判断了右射线,也判断了左射线。以AcadLWPolylin对象为例,判断点与多边形的位置关系(射线法)函数的核心代码如下():
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 '点在多边形内
Else: ptInLwp = -1
End If
End Function
此函数当点在多边形内部时返回1,点在多边形边上时返回0,在多边形外时返回-1。由于函数只进行了常规的数学计算,所以代码运行效率非常高,且准确率达到100%,且适用于任何凹凸多边形。
3.4 绘制示意图并标记边长
将3.3中判断的结果以各个数组中各实体元素的中心为基点,复制到图框相应位置,并标注实际边长。标记边长的原理是先计算边长与方位角,将插入的文本起点设置为边长中点向外偏移1米并向起点移动文本长度一半的位置,旋转角度设为方位角。由于不需要标注内部边长,对于二层及三层房屋实体数组中重叠边可不标注。
3.5 填入面积数据
按湖北省省厅发布的不动产权籍调查《实施细则》的相关规定,面积保留两位小数,可用FORMAT函数先将面积格式化为“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….语句对选择集内的所有权属线对象进行循环处理,即可方便的实现对所有宗地的批量出图。
4 结束语
在以往的不动产权籍调查工作中,分层平面图由调查人员手工制作,制作过程复杂繁琐,工作时间长,人为错误多,效率低。本文论述的开发思路及所开发的应用软件使得分层平面图工作自动化,减少了重复工作量,大大提高了工作效率。本文所提及的代碼运行效率高,每1000宗地,只需5至6分钟即可完成。此外本文二次开发的成果已广泛应用于湖北省襄阳市、随州市等地的权籍调查工作中,并得到了用户的好评,为推进湖北省不动产权籍调查登记工作提供了有力的技术支持。
参考文献
[1] 《国土资源部不动产权籍调查技术方案》2015年41号文件.
[2] 《湖北省宅基地使用权和集体建设用地使用权确权登记发证工作实施细则》.
[3] 《地籍调查规程 TD T1001-2012》.
[4] 张帆.《AutoCAD VBA开发精彩实例教程》[M].北京:清华大学出版社,2005年版.