乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 132|回复: 9

如何获得整个文档的BoundingBox?

[复制链接]

28

主题

117

帖子

4

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
229
发表于 2003-12-9 17:13:00 | 显示全部楼层 |阅读模式
相当于GetBoundingBox获的对象的矩形边框一样,不过我现在的对象是整个图形文件中所有实体集合的总矩形边框
回复

使用道具 举报

158

主题

2315

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2951
发表于 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)  max(j) Then max(j) = pt(j)
  33.         Next
  34.     Next
  35.    
  36.     retVal(0) = min: retVal(1) = max   
  37.     Extents = retVal
  38. End Function
回复

使用道具 举报

26

主题

589

帖子

10

银币

中流砥柱

Rank: 25

铜币
693
发表于 2003-12-9 18:49:00 | 显示全部楼层
使用Zoom Extent也是一种方法,这时矩形区域就是窗口的左下角和右上角构成的。它的值可以由系统变量ViewCtr、ViewSize、ScreenSize求的。
回复

使用道具 举报

28

主题

117

帖子

4

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
229
发表于 2003-12-9 20:28:00 | 显示全部楼层
明总的方法可以,E版主的做法我不知道怎么样做,最好有代码嘛:)
回复

使用道具 举报

158

主题

2315

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2951
发表于 2003-12-9 21:10:00 | 显示全部楼层
E版的方法可能会由于绘图窗口的长宽不相同而得到不同的结果
回复

使用道具 举报

26

主题

589

帖子

10

银币

中流砥柱

Rank: 25

铜币
693
发表于 2003-12-9 21:16:00 | 显示全部楼层

晕,都告诉你做法了。
  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

请参照下面的方法,上面的示例权且做为获取当前窗口坐标范围的例子吧。
回复

使用道具 举报

41

主题

657

帖子

9

银币

中流砥柱

Rank: 25

铜币
821
发表于 2003-12-9 21:19:00 | 显示全部楼层
缩放全图之后用extmin,extmax
我觉得更方便!
回复

使用道具 举报

26

主题

589

帖子

10

银币

中流砥柱

Rank: 25

铜币
693
发表于 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
回复

使用道具 举报

28

主题

117

帖子

4

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
229
发表于 2003-12-9 21:41:00 | 显示全部楼层
呵呵,由于用Zoom Extent后,我的整体图形不一定刚好布满界面(长宽比不一定和CAD界面的一样),所以用E版主的算法得出的结果范围偏大。
明总的做法可以得到准确边框,但如果实体太多的话,就显得很慢了,不知道有没有更好的算法呢?
回复

使用道具 举报

15

主题

285

帖子

9

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
345
发表于 2003-12-10 09:41:00 | 显示全部楼层
如果图形没有出现大图套小图,也就是图形互不干涉 可以用
thisdrawing.sendcommand "region all  "
thisdrawing.sendcommand "union all  "
此时就只有一个thisdrawing.modelspace.count 了 可以直接得到啊
呵呵 当然 此法的限制条件太严了 不利于得到角点以后的操作
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-6-29 14:11 , Processed in 0.950983 second(s), 73 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表