Chuyển đến nội dung
Diễn đàn CADViet
hongtvtk

Hỏi cách đếm số đối tượng(cả tên) trong 1 block bằng VBA?

Các bài được khuyến nghị

Dùng thuộc tính Count của 1 block để biết xem nó có bao nhiêu đối tượng.

 

Trong trường hợp có block con, bạn gọi đệ quy để tính toàn bộ.

 

VD:

Function Dem(block as AcadBlock) as Integer
'Duyệt qua từng đối tượng xem nó có phải là Block con hay không
Dim i as Integer
Dim SoLuong as Integer

For i=0 to block.Count-1
 if block.Item(i).ObjectName = "AcDbBlock"
	SoLuong = SoLuong + Dem(block.Item(i))
 Else 'không phải Block
	SoLuong = SoLuong + 1
 End if
Next i

Dem = SoLuong
End Function

  • Vote tăng 3

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

anhcos có thể đưa ra 1 ví dụ về hàm đệ quy cho trường hợp này được không

Mình đang cần 1 ví dụ về đệ quy mà không biết lấy đâu.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

anhcos có thể đưa ra 1 ví dụ về hàm đệ quy cho trường hợp này được không

Mình đang cần 1 ví dụ về đệ quy mà không biết lấy đâu.

Trong đoạn code trên Bác anhcos đã dùng phép đệ quy rồi mà.

SoLuong = SoLuong + Dem(block.Item(i)) trong function Dem để tính trong số lượng block.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Thank phamngoctukts học lâu quá không dùng nên ko biết đâu mà lần lại cả.

Chỉnh lại ti code bạn anhcos.

 

Sub SLBlock()

Dim returnObj As AcadBlockReference

Dim basePnt As Variant

ThisDrawing.Utility.GetEntity returnObj, basePnt, "Select an object"

MsgBox Dem(returnObj)

End Sub

Function Dem(returnObj As AcadBlockReference) As Integer

Dim block As AcadBlock

Set block = ThisDrawing.Blocks(returnObj.Name)

'Duyet qua doi tuong co phai Block ko

Dim i As Integer

Dim SoLuong As Integer

For i = 0 To block.Count - 1

If block.Item(i).ObjectName = "AcDbBlockReference" Then

SoLuong = SoLuong + Dem(block.Item(i))

Else 'Khong phai block

SoLuong = SoLuong + 1

End If

Next i

Dem = SoLuong

End Function

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cả tôi với bạn cùng sai rồi.

 

Chỉnh như thế này mới đúng, đầu vào của hàm phải là một đối tượng Block để ta có thể duyệt qua từng đối tượng con, và block con sẽ là BlockReference

 

Function Dem(block as AcadBlock) as Integer
'Duyệt qua từng đối tượng xem nó có phải là Block con hay không
Dim i as Integer
Dim SoLuong as Integer
Dim SubBlock as Object

For i=0 to block.Count-1
 if block.Item(i).ObjectName = "AcDbBlockReference"
       'Tìm block tương ứng với BlockRef này
   	SubBlock = block.Document.Blocks(block.Item(i).Name)

 SoLuong = SoLuong + Dem(SubBlock)
 Else 'không phải Block
	SoLuong = SoLuong + 1
 End if
Next i

Dem = SoLuong
End Function

 

Hoặc đầu vào của hàm là BlockReference

Function Dem(blockref as AcadBlockReference as Integer)
'Tìm block tương ứng với BlockRef này
Dim block = blockref.Document.Blocks(blockref.Name)

'Duyệt qua từng đối tượng xem nó có phải là Block con hay không
Dim i as Integer
Dim SoLuong as Integer
Dim SubBlock as Object

For i=0 to block.Count-1
 if block.Item(i).ObjectName = "AcDbBlockReference
       'Tìm block tương ứng với BlockRef này
       SubBlock = block.Document.Blocks(block.Item(i).Name)
       SoLuong = SoLuong + Dem(block.Item(i))
 Else 'không phải Block
	SoLuong = SoLuong + 1
 End if
Next i

Dem = SoLuong
End Function

 

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Mình thực sự chưa hiểu mình sai ở chỗ nào.Của bạn cũng vậy. Mình làm thứ với các Block lồng block lồng nhau chạy thì mình thấy

chạy vẫn đúng số lượng đối tượng (Gồm nhiều Block chồng lên nhau).Thuật toán sai mà vẫn cho kết quả đúng?

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

×