明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4640|回复: 13

如何获得整个文档的BoundingBox?

  [复制链接]
发表于 2003-12-9 17:13:00 | 显示全部楼层 |阅读模式
相当于GetBoundingBox获的对象的矩形边框一样,不过我现在的对象是整个图形文件中所有实体集合的总矩形边框
发表于 2003-12-9 17:43:00 | 显示全部楼层
选定整个图形做为选择集,然后用以下函数取得两个角点:

  1. Public Function ssExtents(ss As AcadSelectionSet) As Variant

  2.     Dim points(), c As Long

  3.     Dim min, max, util As AcadUtility
  4.    
  5.     Set util = ThisDrawing.Utility
  6.    
  7.     c = 0
  8.    
  9.     For i = 0 To ss.Count - 1
  10.         
  11.         ss.Item(i).GetBoundingBox min, max
  12.         min = util.TranslateCoordinates(min, acWorld, acUCS, False)
  13.         max = util.TranslateCoordinates(max, acWorld, acUCS, False)
  14.         ReDim Preserve points(0 To c + 1)
  15.         points(c) = min: points(c + 1) = max
  16.         c = c + 2
  17.         
  18.     Next
  19.         
  20.     ssExtents = Extents(points)

  21. End Function

  22. Public Function Extents(points)

  23.     Dim min, max
  24.     Dim i As Long, j As Long, pt, retVal(0 To 1)
  25.    
  26.     min = points(LBound(points))
  27.     max = points(LBound(points))
  28.         
  29.     For i = LBound(points) To UBound(points)
  30.         pt = points(i)
  31.         For j = LBound(pt) To UBound(pt)
  32.             If pt(j) < min(j) Then min(j) = pt(j)
  33.             If pt(j) > max(j) Then max(j) = pt(j)
  34.         Next
  35.     Next
  36.    
  37.     retVal(0) = min: retVal(1) = max   
  38.     Extents = retVal

  39. End Function
发表于 2003-12-9 18:49:00 | 显示全部楼层
使用Zoom Extent也是一种方法,这时矩形区域就是窗口的左下角和右上角构成的。它的值可以由系统变量ViewCtr、ViewSize、ScreenSize求的。
 楼主| 发表于 2003-12-9 20:28:00 | 显示全部楼层
明总的方法可以,E版主的做法我不知道怎么样做,最好有代码嘛:)
发表于 2003-12-9 21:10:00 | 显示全部楼层
E版的方法可能会由于绘图窗口的长宽不相同而得到不同的结果
发表于 2003-12-9 21:16:00 | 显示全部楼层
本帖最后由 作者 于 2003-12-9 21:42:20 编辑

晕,都告诉你做法了。


  1. Sub test()
  2.     ' 图中没有实体时不做处理
  3.     If ThisDrawing.ModelSpace.Count = 0 Then Exit Sub
  4.     ' 按图中实体的最大范围缩放
  5.     Application.ZoomExtents
  6.     ' 窗口的中心点坐标
  7.     Dim cPt As Variant
  8.     cPt = ThisDrawing.GetVariable("VIEWCTR")
  9.     ' 窗口的高度
  10.     Dim h As Double
  11.     h = ThisDrawing.GetVariable("VIEWSIZE")
  12.    
  13.     ' 窗口的宽度
  14.     Dim w As Double
  15.     Dim s As Variant
  16.     s = ThisDrawing.GetVariable("SCREENSIZE")
  17.     w = h * s(0) / s(1)
  18.    
  19.     ' 窗口的左下角和右下角坐标
  20.     Dim minExt(0 To 2) As Double
  21.     Dim maxExt(0 To 2) As Double
  22.     minExt(0) = cPt(0) - w / 2: minExt(1) = cPt(1) - h / 2: minExt(2) = 0
  23.     maxExt(0) = cPt(0) + w / 2: maxExt(1) = cPt(1) + h / 2: maxExt(2) = 0
  24. End Sub



请参照下面的方法,上面的示例权且做为获取当前窗口坐标范围的例子吧。
发表于 2003-12-9 21:19:00 | 显示全部楼层
缩放全图之后用extmin,extmax
我觉得更方便!
发表于 2003-12-9 21:35:00 | 显示全部楼层
确实,这两个系统变量给忘了,我倒有点绕弯路了,而且只是取窗口坐标,当图形没有向四面刚好填满时,会比计算值的大,因而并不是最小的包含矩形。大家不要采用上面的方法,以免误导。


  1. Sub test()

  2.     ' 图中没有实体时不做处理
  3.     If ThisDrawing.ModelSpace.Count = 0 Then Exit Sub
  4.    
  5.     ' 按图中实体的最大范围缩放
  6.     Application.ZoomExtents
  7.    
  8.     ' 窗口的左下角和右下角坐标
  9.     Dim minExt As Variant
  10.     Dim maxExt As Variant
  11.     minExt = ThisDrawing.GetVariable("EXTMIN")
  12.     maxExt = ThisDrawing.GetVariable("EXTMAX")
  13. End Sub
 楼主| 发表于 2003-12-9 21:41:00 | 显示全部楼层
呵呵,由于用Zoom Extent后,我的整体图形不一定刚好布满界面(长宽比不一定和CAD界面的一样),所以用E版主的算法得出的结果范围偏大。

明总的做法可以得到准确边框,但如果实体太多的话,就显得很慢了,不知道有没有更好的算法呢?
发表于 2003-12-10 09:41:00 | 显示全部楼层
如果图形没有出现大图套小图,也就是图形互不干涉 可以用
thisdrawing.sendcommand "region all  "
thisdrawing.sendcommand "union all  "
此时就只有一个thisdrawing.modelspace.count 了 可以直接得到啊
呵呵 当然 此法的限制条件太严了 不利于得到角点以后的操作
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-28 12:43 , Processed in 0.174634 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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