mccad 发表于 2003-12-10 11:06:00

把图形中的所有对象做成一个图块,只用一次的取边框就行,这样速度会快很多吧

topirol 发表于 2003-12-10 11:36:00

请问用什么方法来把选择集转成一个图块?

mccad 发表于 2003-12-10 14:01:00

将选择集中的对象转换到一个数组中,然后通过数组来生成图块,再插入图块。
ssArray返回包含于选择集中每一项目的变体数组
http://www.mjtd.com/function/list.asp?id=333&ordertype=bysort&orderkey=33

topirol 发表于 2003-12-10 15:11:00

用图块的办法代码是简单一些,但不知道怎么回事,测试起来好像比前面的办法还要慢:(

'方法1
Sub getdrawingbox1() '通过制作图块再求图块的boundingbox
Dim bk As AcadBlock
Dim bror As AcadBlockReference
Dim ss As AcadSelectionSet
Dim po(0 To 2) As Double
On Error Resume Next

po(0) = 0
po(1) = 0
po(2) = 0

Dim boxp(0 To 1) As Variant
Set bk = ThisDrawing.Blocks.Add(po, "tempb")



Set ss = ThisDrawing.SelectionSets("ssss")
If Err Then
Err.Clear

Set ss = ThisDrawing.SelectionSets.Add("ssss")

End If

ss.Select acSelectionSetAll



ThisDrawing.CopyObjects ssArray(ss), bk
Set bror = ThisDrawing.ModelSpace.InsertBlock(po, "tempb", 1, 1, 1, 0)

bror.GetBoundingBox boxp(0), boxp(1)
Dim poly1 As AcadPolyline
Dim pllist(0 To 11) As Double
pllist(0) = boxp(0)(0)
pllist(1) = boxp(0)(1)
pllist(2) = 0
pllist(3) = boxp(0)(0)
pllist(4) = boxp(1)(1)
pllist(5) = 0
pllist(6) = boxp(1)(0)
pllist(7) = boxp(1)(1)
pllist(8) = 0
pllist(9) = boxp(1)(0)
pllist(10) = boxp(0)(1)
pllist(11) = 0
ss.Clear
bror.Delete
bk.Delete
Set poly1 = ThisDrawing.ModelSpace.AddPolyline(pllist)
poly1.Closed = True
poly1.Color = 1

End Sub

Function ssArray(ss As AcadSelectionSet)

    Dim retVal() As AcadEntity, i As Long
   
    ReDim retVal(0 To ss.Count - 1)
   
    For i = 0 To ss.Count - 1
      Set retVal(i) = ss.Item(i)
    Next
   
    ssArray = retVal

End Function



'******************************方法2
Sub getdrawingbox2() '通过各个实体的boundingbox求出

Dim acaddoc As AcadDocument
Set acaddoc = ThisDrawing
Dim ss As AcadSelectionSet
On Error Resume Next

Set ss = acaddoc.SelectionSets("ssss")
If Err Then
Err.Clear
Set ss = acaddoc.SelectionSets.Add("ssss")
End If

ss.Clear


ss.Select acSelectionSetAll

Dim poinsss As Variant
boxp = ssExtents(ss)



Dim poly1 As AcadPolyline
Dim pllist(0 To 11) As Double
pllist(0) = boxp(0)(0)
pllist(1) = boxp(0)(1)
pllist(2) = 0
pllist(3) = boxp(0)(0)
pllist(4) = boxp(1)(1)
pllist(5) = 0
pllist(6) = boxp(1)(0)
pllist(7) = boxp(1)(1)
pllist(8) = 0
pllist(9) = boxp(1)(0)
pllist(10) = boxp(0)(1)
pllist(11) = 0
ss.Clear
bror.Delete
bk.Delete
Set poly1 = ThisDrawing.ModelSpace.AddPolyline(pllist)
poly1.Closed = True
poly1.Color = 1
ss.Clear
ss.Delete
End Sub

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




页: 1 [2]
查看完整版本: 如何获得整个文档的BoundingBox?