Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
6 replies to this topic

#1 hongtvtk

hongtvtk

    biết vẽ circle

  • Members
  • PipPip
  • 36 Bài viết
Điểm đánh giá: 2 (bình thường)

Đã gửi 18 March 2011 - 01:49 PM

Các bác cho em hỏi cách đếm số đối tượng trong 1 block bằng VBA với?
em cảm ơn!
  • 0

#2 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 18 March 2011 - 02:48 PM

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

  • 3
Clear sky!

MF Rock collection.

#3 nghiautc

nghiautc

    biết lệnh copy

  • Members
  • PipPipPip
  • 112 Bài viết
Điểm đánh giá: 18 (tàm tạm)

Đã gửi 24 April 2011 - 11:25 AM

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.
  • 0

#4 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 24 April 2011 - 01:34 PM

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.
  • 1
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#5 nghiautc

nghiautc

    biết lệnh copy

  • Members
  • PipPipPip
  • 112 Bài viết
Điểm đánh giá: 18 (tàm tạm)

Đã gửi 25 April 2011 - 01:05 PM

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
  • 0

#6 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 25 April 2011 - 03:26 PM

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



  • 2
Clear sky!

MF Rock collection.

#7 nghiautc

nghiautc

    biết lệnh copy

  • Members
  • PipPipPip
  • 112 Bài viết
Điểm đánh giá: 18 (tàm tạm)

Đã gửi 26 April 2011 - 01:07 PM

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?
  • 0