topirol 发表于 2003-12-9 17:13:00

如何获得整个文档的BoundingBox?

相当于GetBoundingBox获的对象的矩形边框一样,不过我现在的对象是整个图形文件中所有实体集合的总矩形边框

mccad 发表于 2003-12-9 17:43:00

选定整个图形做为选择集,然后用以下函数取得两个角点:

Public Function ssExtents(ss As AcadSelectionSet) As Variant

    Dim points(), c As Long

    Dim min, max, util As AcadUtility
   
    Set util = ThisDrawing.Utility
   
    c = 0
   
    For i = 0 To ss.Count - 1
      
      ss.Item(i).GetBoundingBox min, max
      min = util.TranslateCoordinates(min, acWorld, acUCS, False)
      max = util.TranslateCoordinates(max, acWorld, acUCS, False)
      ReDim Preserve points(0 To c + 1)
      points(c) = min: points(c + 1) = max
      c = c + 2
      
    Next
      
    ssExtents = Extents(points)

End Function

Public Function Extents(points)

    Dim min, max
    Dim i As Long, j As Long, pt, retVal(0 To 1)
   
    min = points(LBound(points))
    max = points(LBound(points))
      
    For i = LBound(points) To UBound(points)
      pt = points(i)
      For j = LBound(pt) To UBound(pt)
            If pt(j) < min(j) Then min(j) = pt(j)
            If pt(j) > max(j) Then max(j) = pt(j)
      Next
    Next
   
    retVal(0) = min: retVal(1) = max   
    Extents = retVal

End Function

efan2000 发表于 2003-12-9 18:49:00

使用Zoom Extent也是一种方法,这时矩形区域就是窗口的左下角和右上角构成的。它的值可以由系统变量ViewCtr、ViewSize、ScreenSize求的。

topirol 发表于 2003-12-9 20:28:00

明总的方法可以,E版主的做法我不知道怎么样做,最好有代码嘛:)

mccad 发表于 2003-12-9 21:10:00

E版的方法可能会由于绘图窗口的长宽不相同而得到不同的结果

efan2000 发表于 2003-12-9 21:16:00

本帖最后由 作者 于 2003-12-9 21:42:20 编辑

晕,都告诉你做法了。


Sub test()
    ' 图中没有实体时不做处理
    If ThisDrawing.ModelSpace.Count = 0 Then Exit Sub
    ' 按图中实体的最大范围缩放
    Application.ZoomExtents
    ' 窗口的中心点坐标
    Dim cPt As Variant
    cPt = ThisDrawing.GetVariable("VIEWCTR")
    ' 窗口的高度
    Dim h As Double
    h = ThisDrawing.GetVariable("VIEWSIZE")
   
    ' 窗口的宽度
    Dim w As Double
    Dim s As Variant
    s = ThisDrawing.GetVariable("SCREENSIZE")
    w = h * s(0) / s(1)
   
    ' 窗口的左下角和右下角坐标
    Dim minExt(0 To 2) As Double
    Dim maxExt(0 To 2) As Double
    minExt(0) = cPt(0) - w / 2: minExt(1) = cPt(1) - h / 2: minExt(2) = 0
    maxExt(0) = cPt(0) + w / 2: maxExt(1) = cPt(1) + h / 2: maxExt(2) = 0
End Sub



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

myfreemind 发表于 2003-12-9 21:19:00

缩放全图之后用extmin,extmax
我觉得更方便!

efan2000 发表于 2003-12-9 21:35:00

确实,这两个系统变量给忘了,我倒有点绕弯路了,而且只是取窗口坐标,当图形没有向四面刚好填满时,会比计算值的大,因而并不是最小的包含矩形。大家不要采用上面的方法,以免误导。


Sub test()

    ' 图中没有实体时不做处理
    If ThisDrawing.ModelSpace.Count = 0 Then Exit Sub
   
    ' 按图中实体的最大范围缩放
    Application.ZoomExtents
   
    ' 窗口的左下角和右下角坐标
    Dim minExt As Variant
    Dim maxExt As Variant
    minExt = ThisDrawing.GetVariable("EXTMIN")
    maxExt = ThisDrawing.GetVariable("EXTMAX")
End Sub

topirol 发表于 2003-12-9 21:41:00

呵呵,由于用Zoom Extent后,我的整体图形不一定刚好布满界面(长宽比不一定和CAD界面的一样),所以用E版主的算法得出的结果范围偏大。

明总的做法可以得到准确边框,但如果实体太多的话,就显得很慢了,不知道有没有更好的算法呢?

bluemoon 发表于 2003-12-10 09:41:00

如果图形没有出现大图套小图,也就是图形互不干涉 可以用
thisdrawing.sendcommand "region all"
thisdrawing.sendcommand "union all"
此时就只有一个thisdrawing.modelspace.count 了 可以直接得到啊
呵呵 当然 此法的限制条件太严了 不利于得到角点以后的操作
页: [1] 2
查看完整版本: 如何获得整个文档的BoundingBox?