' require references to: acdbmgd.dll acmgd.dll accoremgd.dll '_________________________________________________' ''DynBlockUtils.vb Imports System.IO Imports System.Text Imports System.Windows.Forms Imports Autodesk.AutoCAD.ApplicationServices Imports Autodesk.AutoCAD.DatabaseServices Imports Autodesk.AutoCAD.EditorInput Imports Autodesk.AutoCAD.Runtime Imports Autodesk.AutoCAD.Geometry Public Class DynBlockUtils Public Shared listAtts As New List(Of KeyValuePair(Of String, String)) Public Shared listBlkRefs As New List(Of List(Of KeyValuePair(Of String, String))) '' get the real block name. '' Public Shared Function EffectiveName(tr As Transaction, bref As BlockReference) As String Dim btr As BlockTableRecord = Nothing If (bref.IsDynamicBlock) Or (bref.Name.StartsWith("*U", StringComparison.InvariantCultureIgnoreCase)) Then btr = TryCast(tr.GetObject(bref.DynamicBlockTableRecord, OpenMode.ForRead), BlockTableRecord) Else btr = TryCast(tr.GetObject(bref.BlockTableRecord, OpenMode.ForRead), BlockTableRecord) End If Return btr.Name End Function _ Public Shared Sub testBlocksCount() Dim Path As String = "C:\Test\Trusted\blocks.dwg" ''"C:\Test\CADPLUGIN\dwgs\11-E-03436_SHT2_rB.dwg" Dim i As Integer 'Set up AutoCAD and load drawing Dim acDocMgr As DocumentCollection = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager Dim acDoc As Document = DocumentCollectionExtension.Open(acDocMgr, Path, False) Dim acDb As Database = acDocMgr.MdiActiveDocument.Database Dim acEd As Editor = acDoc.Editor Using doclock As DocumentLock = acDoc.LockDocument() 'Init transaction manager and get block table Using acTrans As Transaction = acDb.TransactionManager.StartTransaction() Dim acBlkTbl As BlockTable = acTrans.GetObject(acDb.BlockTableId, OpenMode.ForRead) Dim acBlkTblRec As BlockTableRecord = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), OpenMode.ForRead) listBlkRefs = New List(Of List(Of KeyValuePair(Of String, String))) For Each acBlkId As ObjectId In acBlkTblRec 'DO SOMETHING Dim acEnt As Entity = DirectCast(acTrans.GetObject(acBlkId, OpenMode.ForRead), Entity) If TypeOf acEnt Is BlockReference Then Dim acBlkRef As BlockReference = DirectCast(acTrans.GetObject(acBlkId, OpenMode.ForRead), BlockReference) listAtts = New List(Of KeyValuePair(Of String, String)) listAtts.Add(New KeyValuePair(Of String, String)(acBlkRef.Name, acBlkRef.Handle.ToString)) If EffectiveName(acTrans, acBlkRef) = "Door" Then Dim attColl As AttributeCollection = acBlkRef.AttributeCollection For Each attRefId As ObjectId In attColl Dim attRef As AttributeReference = DirectCast(acTrans.GetObject(attRefId, OpenMode.ForRead), AttributeReference) listAtts.Add(New KeyValuePair(Of String, String)(attRef.Tag, attRef.TextString)) Next listBlkRefs.Add(listAtts) End If End If i = i + 1 Next End Using End Using End Sub End Class '_________________________________________________' ''RunForm.vb Imports Autodesk.AutoCAD.Runtime Imports Autodesk.AutoCAD.EditorInput Imports Autodesk.AutoCAD.DatabaseServices Imports Autodesk.AutoCAD.GraphicsInterface Imports Autodesk.AutoCAD.ApplicationServices.Application Imports System.Windows.Forms Imports Autodesk.AutoCAD.ApplicationServices Namespace YourProjectName Public Class RunForm Implements Autodesk.AutoCAD.Runtime.IExtensionApplication Public Sub Initialize() Implements IExtensionApplication.Initialize Try Dim doc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument Dim ed As Editor = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor Dim frm As Form1 = Nothing If frm Is Nothing Then frm = New Form1 ' Using frm Autodesk.AutoCAD.ApplicationServices.Application.ShowModelessDialog(frm) ' End Using End If Catch ex As System.Exception Dim ed As Editor = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor ed.WriteMessage(vbNewLine & "Errorr occurs: " + ex.ToString()) Throw New ApplicationException("Problem loading program") End Try End Sub Public Sub Terminate() Implements IExtensionApplication.Terminate End Sub End Class End Namespace '_________________________________________________' Imports Autodesk.AutoCAD.ApplicationServices Imports Autodesk.AutoCAD.Runtime Imports Autodesk.AutoCAD.EditorInput Imports System.Windows.Forms Imports System.Data Imports Autodesk.AutoCAD.DatabaseServices Public Class Form1 Private listAtts As New List(Of KeyValuePair(Of String, String)) Private listBlkRefs As New List(Of List(Of KeyValuePair(Of String, String))) Private Sub btnTest_Click(sender As System.Object, e As System.EventArgs) Handles btnTest.Click Me.Hide() DynBlockUtils.testBlocksCount() Me.Show() listBlkRefs = DynBlockUtils.listBlkRefs MessageBox.Show(listBlkRefs.Count.ToString) 'do your rest job here... End Sub End Class '_________________________________________________'