明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 10423|回复: 21

如何编写VBA求解多个不规则封闭图形的总面积,总周长,个数?

  [复制链接]
发表于 2003-10-25 12:18 | 显示全部楼层 |阅读模式
AutoCAD2000和2002上怎样编写VBA程序,可以求出图形上所有封闭的但不规则的图形的总面积,封闭图形的个数,单个图形的面积,及图形的总周长与平均周长?急盼解答!
发表于 2003-10-25 18:21 | 显示全部楼层
这个程序给你参考,你拿去改改就可以用了,计算周长和平均边长你自己加进去吧!
发表于 2003-10-25 18:22 | 显示全部楼层
刚才忘了帖,呵呵~


Option Explicit
Sub smarea() '批量计算多边形面积程序
On Error Resume Next
Dim i As Integer
Dim areaobj As AcadLWPolyline '轻量多义线对象
Dim sset As AcadSelectionSet '选择集
Dim minpnt As Variant '对象边框最小点坐标
Dim maxpnt As Variant '对象边框最大点坐标
Dim areains(0 To 2) As Double '文本插入点坐标
Dim txtarea As String '面积文本
Dim txtins As String '插入文本综合
Dim ms As String '亩文本
Dim txtobj As AcadText '文字对象
Dim Ftype As Variant
Dim Fdata  As Variant
Dim entity As AcadEntity
Dim hatchobj As AcadHatch
Dim pname As String '阴影名称
Dim pype As Long '阴影类型
Dim outloop(0 To 0) As AcadEntity '阴影外部边界
Dim zminpnt(0 To 2) As Double '不闭合对象的缩放点左下角点坐标
Dim zmaxpnt(0 To 2) As Double '不闭合对象的缩放点右上角点坐标
Dim sclayer As String '当前图层名


Dim us1 As Integer '比例尺
us1 = ThisDrawing.GetVariable("userr1") '取得比例尺
sclayer = ThisDrawing.GetVariable("clayer")
'删除存在的选择集
If ThisDrawing.SelectionSets.Count > 0 Then
        For i = 0 To ThisDrawing.SelectionSets.Count - 1
        ThisDrawing.SelectionSets.Item(i).Clear
        ThisDrawing.SelectionSets.Item(i).Delete
        Next
End If

'**************
Dim gpCode(3) As Integer, dataValue(3) As Variant

  '创建过滤器
  '本例为过滤polyline or lwpolyline
  '使用的是变体数组进行定义

  '分组运算符
  gpCode(0) = -4
  dataValue(0) = "<or"

  'polyline过滤器
  gpCode(1) = 0
  dataValue(1) = "olyLINE"

  'lwpolyline过滤器
  gpCode(2) = 0
  dataValue(2) = "LwPolyline"
  
  



  '分组运算符
  gpCode(3) = -4
  dataValue(3) = "or>"

  Ftype = gpCode
  Fdata = dataValue
'**************





'创建选择集(只选择在当前图层的多边形对象)
Set sset = ThisDrawing.SelectionSets.Add("smarea1")
'选择
sset.Select acSelectionSetAll, , , Ftype, Fdata

For Each entity In sset
If entity.Layer = sclayer Then '只计算当前图层的多边形
'取得图形边框坐标(检查闭合放在后面)
entity.GetBoundingBox minpnt, maxpnt
'设置文字插入点坐标
areains(0) = (minpnt(0) + maxpnt(0)) / 2
areains(1) = (minpnt(1) + maxpnt(1)) / 2
areains(2) = 0
'将不闭合的图形显示在窗口中间(以两点缩放)
zminpnt(0) = minpnt(0) - 250
zminpnt(1) = minpnt(1) - 250
zminpnt(2) = 0
zmaxpnt(0) = maxpnt(0) + 250
zmaxpnt(1) = maxpnt(1) + 250
zmaxpnt(2) = 0

'若不闭合
If entity.Closed = False Then
'将视窗移动到非闭合图形
ThisDrawing.Application.ZoomWindow zminpnt, zmaxpnt
  entity.Color = acRed
entity.Highlight True '高亮
MsgBox "当前视口图形不闭合,请检查!"


Exit Sub
End If


'判断比例尺

Select Case us1
Case 500
txtarea = entity.Area / 4

Case 1000
txtarea = entity.Area
Case 2000
txtarea = entity.Area * 4
Case Else
MsgBox "你的比例尺不在可计算之列,请检查你的比例尺"
Exit Sub

End Select


''亩和平方米均取三位 , 自定义格式
ms = Format(txtarea / 666.6666, "#0.000")
txtarea = Format(txtarea, "#0.000")
''插入的文本内容
txtins = "S=" & txtarea & "平方米=" & ms & "亩"
''插入文本
Set txtobj = ThisDrawing.ModelSpace.AddText(txtins, areains, 5)
''设置文本颜色
txtobj.Color = acGreen
''*******************************
''创建阴影填充对象

Dim ptype As Long
pname = "ANSI31"
ptype = 0
'创建关联阴影对象
Set hatchobj = ThisDrawing.ModelSpace.AddHatch(ptype, pname, True)
hatchobj.PatternScale = 5
'设置外部边界
Set outloop(0) = entity
'为外部边界添加阴影
hatchobj.AppendOuterLoop (outloop)
hatchobj.Evaluate '求值
End If
''
Next
sset.Clear
sset.Delete
End Sub
 楼主| 发表于 2003-10-27 12:27 | 显示全部楼层
谢谢你回复得这么及时,但我好像用不好!能再给点建议吗?
发表于 2003-10-27 18:24 | 显示全部楼层
这个程序你直接用肯定是不好用的,因为这是我针对单位的测绘软件写的一个程序,如果你要用就要修改一下,给你这个程序是让你参考的.,因为我最近很忙,所以没有时间修改给你!
 楼主| 发表于 2003-10-29 11:43 | 显示全部楼层
拜托大侠,我不是搞专业VBA开发的,做这个程序是想处理一些实验数据,真的急用,请一定抽空尽早帮我全部搞定,万分感激了!QQ:21744705[em00]
发表于 2003-10-29 21:19 | 显示全部楼层
这是图形,大家试试吧
他的要求是:
外框去掉,双线变单线,再求面积等

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2003-10-29 21:25 | 显示全部楼层
看看大家能不能帮到你,我这段时间太忙,不好意思!
发表于 2003-10-29 22:57 | 显示全部楼层
注意程序需要加载VLAX类和CURVE类
程序处理过程调用了(gc)来强制释放内存,不然会出错。
  1. Sub GetTolArea()
  2.     ThisDrawing.SendCommand "(vl-load-com)" & vbCr
  3.     Dim CurveObj As Curve
  4.     Set CurveObj = New Curve
  5.     Dim VlaxObj As VLAX
  6.     Set VlaxObj = New VLAX
  7.     Dim OutEnt As AcadEntity
  8.     Dim Pnt As Variant
  9.     ThisDrawing.Utility.GetEntity OutEnt, Pnt, "选择外框:"
  10.     Dim MinBox As Variant
  11.     Dim MaxBox As Variant
  12.     Dim OutArea As Double
  13.     Dim OutLeng As Double
  14.     OutEnt.GetBoundingBox MinBox, MaxBox
  15.     If OutEnt.ObjectName = "AcDbRegion" Then
  16.         OutArea = OutEnt.Area
  17.         OutLeng = OutEnt.Perimeter
  18.     Else
  19.         Set CurveObj.Entity = OutEnt
  20.         OutArea = CurveObj.Area
  21.         OutLeng = CurveObj.length
  22.     End If
  23.     'Set CurveObj.Entity = OutEnt
  24.     Dim ss As AcadSelectionSet
  25.     Set ss = CreatSSet
  26.     Dim FType(0) As Integer
  27.     Dim FData(0) As Variant
  28.     FType(0) = 0
  29.     FData(0) = "SPLINE"
  30.     ss.Select acSelectionSetWindow, MinBox, MaxBox, FType, FData
  31.     'Debug.Print ss.Count
  32.     Dim i As Integer
  33.     Dim InArea() As Double
  34.     Dim InLeng() As Double
  35.     Dim j As Integer
  36.     Dim Ent As AcadEntity
  37.     ReDim Preserve InArea(0) As Double
  38.     ReDim Preserve InLeng(0) As Double
  39.     For i = 0 To ss.Count - 1
  40.         If ss.Item(i).ObjectID <> OutEnt.ObjectID Then
  41.             Set Ent = ss(i)
  42.             Set CurveObj.Entity = Ent
  43.             VlaxObj.EvalLispExpression "(gc)"
  44.             If i <> 0 Then
  45.                 j = UBound(InArea) + 1
  46.                 ReDim Preserve InArea(j) As Double
  47.                 ReDim Preserve InLeng(j) As Double
  48.                 InArea(j) = CurveObj.Area
  49.                 InLeng(j) = CurveObj.length
  50.             Else
  51.                 InArea(0) = CurveObj.Area
  52.                 InLeng(0) = CurveObj.length
  53.             End If
  54.         End If
  55.     Next
  56.     Dim TolArea As Double
  57.     Dim TolLeng As Double
  58.     Dim AreaPer As Double
  59.     Dim dispMsg As String
  60.     dispMsg = "外框的面积为:" & OutArea & ",周长为:" & OutLeng & vbCrLf & vbCrLf
  61.     dispMsg = dispMsg & "内部曲线的面积及周长如下:" & vbCrLf
  62.     For i = 0 To UBound(InArea)
  63.         dispMsg = dispMsg & "曲线" & i & "面积:" & InArea(i) & ",周长:" & InLeng(i) & vbCrLf
  64.         
  65.         TolArea = TolArea + InArea(i)
  66.         TolLeng = TolLeng + InLeng(i)
  67.     Next
  68.     dispMsg = dispMsg & vbCrLf
  69.     dispMsg = dispMsg & "总面积为:" & TolArea & " 总周长为:" & TolLeng & vbCrLf & vbCrLf
  70.     AreaPer = TolArea / OutArea * 100
  71.     dispMsg = dispMsg & "内部曲线面积总各占外框面积的百分比:" & AreaPer & "%"
  72.     'MsgBox dispMsg
  73.     ThisDrawing.Utility.Prompt dispMsg
  74. End Sub
  75. Function CreatSSet()
  76.     Dim ss As AcadSelectionSet
  77.     On Error Resume Next
  78.     Set ss = ThisDrawing.SelectionSets.Add("mccad")
  79.     If Err Then
  80.         Err.Clear
  81.         Set ss = ThisDrawing.SelectionSets("mccad")
  82.         ss.Clear
  83.     End If
  84.     Set CreatSSet = ss
  85. End Function

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2003-11-1 10:51 | 显示全部楼层

用了,很好用,谢谢!:)

很棒!
只是它只能算我从JPG通过cordraw转化过来的图形,线条是拟和的。但如果我直接手工画出来就不行了,它只能算外框面积,里面所有的图形面积和周长都为零,该怎么改呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-26 10:31 , Processed in 0.309708 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表