如何获得整个文档的BoundingBox?
相当于GetBoundingBox获的对象的矩形边框一样,不过我现在的对象是整个图形文件中所有实体集合的总矩形边框 选定整个图形做为选择集,然后用以下函数取得两个角点: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
使用Zoom Extent也是一种方法,这时矩形区域就是窗口的左下角和右上角构成的。它的值可以由系统变量ViewCtr、ViewSize、ScreenSize求的。 明总的方法可以,E版主的做法我不知道怎么样做,最好有代码嘛:) E版的方法可能会由于绘图窗口的长宽不相同而得到不同的结果 本帖最后由 作者 于 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
请参照下面的方法,上面的示例权且做为获取当前窗口坐标范围的例子吧。
缩放全图之后用extmin,extmax
我觉得更方便! 确实,这两个系统变量给忘了,我倒有点绕弯路了,而且只是取窗口坐标,当图形没有向四面刚好填满时,会比计算值的大,因而并不是最小的包含矩形。大家不要采用上面的方法,以免误导。
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
呵呵,由于用Zoom Extent后,我的整体图形不一定刚好布满界面(长宽比不一定和CAD界面的一样),所以用E版主的算法得出的结果范围偏大。
明总的做法可以得到准确边框,但如果实体太多的话,就显得很慢了,不知道有没有更好的算法呢? 如果图形没有出现大图套小图,也就是图形互不干涉 可以用
thisdrawing.sendcommand "region all"
thisdrawing.sendcommand "union all"
此时就只有一个thisdrawing.modelspace.count 了 可以直接得到啊
呵呵 当然 此法的限制条件太严了 不利于得到角点以后的操作
页:
[1]
2