AutoCAD图形中封闭区域面积的获取
摘要:以吴江农村河道清淤测量为例,介绍计算两次河道断面测量所形成的autocad图形中任意封闭区域面积的方法,以及用vb如何从autocad中获取相关数据,从而实现清淤工程量的计算。 关键词:autocad 面积 vb
中图分类号:tv85 文献标识码:a 文章编号: 1 引言
在吴江农村河道清淤测量中,采用断面法计算清淤工程量,首先得到用autocad生成的两次河道断面测量成果所形成的断面图的面积。要取得封闭区域的面积,采用人工的方法耗时较长且易出错,用编程的方法则易于实现,而autocad应用程序支持activex automation技术,其他应用程序(如vb)就可以通过其开放对象模型(object)对其进行操作。通过对象的方法和属性可以实现对象的操作及状态信息的收集或改变,从而实现vb与autocad之间的数据交互。
2 vb访问autocad对象
autocad中的activex automation是微软公司activex规范的具体应用。它通过基于activex的自动化对象,为其他应用程序提供了访问autocad内部功能的方法,是autocad最新的开发接口。在运行时,autocad与其他应用程序之间的关系是服务器与客户的关系,开发人员使用支持activex规范的编程语言(如vb等)就
能通过访问autocad的对象模型,把autocad的强大功能集成到应用程序中。autocad的对象模型是一种树型结构模型,在顶层是application对象(即autocad 本身),其他对象均为application对象的子对象。在application对象下面是preferences(设置)和document(文档)对象。从autocad图形中得到断面图的面积,主要用到了document对象object.sendcommand(command)方法,其功能是从vb中把command字符串里包含的autocad命令传递给autocad,并使autocad执行这个命令。因此,vb调用sendcommand()方法使autocad程序执行boundary命令,形成多段线实体或一个面域,然后用查询实体(面域)面积的方法,vb就能得到计算出的面积。
3 计算封闭区域面积的方法
autocad可由area命令和list命令用来获取面积,其中area命令用来计算弧、圆、椭圆、填充图案、优化多段线、多段线、面域或平面闭合样条曲线或指定区域的面积,并将计算的结果保存在autocad的系统变量area中;list命令用于显示选择对象的面积、周长等相关信息。但是,area命令和list命令都要求被计算的对象要是一个实体并能形成一个封闭区域或是一个面域,并且list命令只在屏幕上显示。而吴江农村河道清淤测量中两次生成的断面曲线虽闭合,但不是同一实体(面域),因而不能直接用area命令或list命令得到面积。解决这个问题的方法就是采用autocad中
的boundary命令,它的功能是根据形成封闭区域的现有实体创建一个面域或多段线。系统变量hpbound 控制 bhatch 和 boundary 创建的对象类型,当hpbound =0时创建一个面域,hpbound =1时则创建一条多段线。如果对象创建成功,就新增一个面域或者一个多段线实体,此时,图形里实体的数量就比执行boundary命令前多一个;否则,图形里的实体数量保持不变。这样,计算一个封闭区域面积的步骤为:①先设置系统变量hpbound =1,然后执行boundary命令,用boundary命令的“内部点”方式,在要计算面积的封闭区域内用鼠标任意点取一点,创建一个多段线实体;②将生成的多段线实体赋给某一变量,查询变量的area属性就能得到生成多段线实体的面积;③删除该多段线实体。
实际河道断面图中,看似封闭的区域很有可能未封闭,而boundary命令对所选区域创建多段线实体是否成功只在屏幕上显示,并不回传给所调用的宿主程序。因此,vb程序通过查询实体面积就有可能失败。要避免这种情况,可以通过判断执行boundary命令前后图形里的实体数量是否相等,来判断创建多段线实体是否成功。如果成功,则现有实体数量比原有实体数量多一个,那就直接查询生成的实体面积,否则提示用户创建不成功。以下是计算两次测量形成的河道断面图面积的核心代码: with acadapp.activedocument ‘设置当前边界创建的对象为多段线
.setvariable(“hpbound”,1) ‘保存现有实体数量 icount =.modelspace.count ‘防止干扰,关闭对象捕捉功能 .objectsnapmode = false
spt = .utility.getpoint(,vbcrlf & “点取断面图的内部一点:”)
‘以命令行模式发送boundary命令
.sendcommand chr(3) & chr(3) & “-boundary “ & spt & “ “ & “ “
if .modelspace.count >icount then ‘将生成的实体赋给变量
set lwplineobj = .modelspace.item(.modelspace.count - 1) ‘将获取的面积写入文件
print #fileno, “面积为:” & format(lwplineobj.area, “0.00”))
lwplineobj.delete else
print #fileno, “未发现有效的边界” end if end with
4 结束语
本文着重介绍了如何计算autocad图形中两次河道测量成果所形成的任意封闭区域的面积和vb从autocad中获取所需信息的方法,该方法运用于河道断面测量中,计算面积快速准确,避免了手工拾取面积,再将面积数据转存到文件的不便,能取得不错的效果。文中程序在vb6.0和autocad2010环境调试通过,为使程序能正常运行,需要先启动autocad2010。