AttributeCollection from a non-placed block

AttributeCollection from a non-placed block

Anonymous
Not applicable
758 Views
2 Replies
Message 1 of 3

AttributeCollection from a non-placed block

Anonymous
Not applicable

I need to get the AttributeCollection of a named block wich is not been placed in the drawing, but it does exist

        Dim paaltype As String

        Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument

        Dim acCurDb As Database = acDoc.Database

        Dim acDocEd As Editor = acDoc.Editor

 

        Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()

                paaltype = "paal01"

                Dim acBlkTbl As BlockTable

                acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)

                If acBlkTbl.Has(paaltype) Then

                    ‘block exist, how to get the attributecollection

                End If

            acTrans.Dispose()

        End Using

0 Likes
Accepted solutions (1)
759 Views
2 Replies
Replies (2)
Message 2 of 3

norman.yuan
Mentor
Mentor

If by "AttributeCollection", you mean the class Autodesk.AutoCAD.DatabaseServices.AttribueCollection, then, you cannot: non-placed block is a block definition, a BlockTableRecord, it DOES not hold an AttributeCollection - a collection of AttributeReference. BlockTableRecord itself is a collection of entities, including possible 0 or more AttributeDefinitions. To see if a block has attrbutions and collect a list of them, you do:

 

...

Dim attrs As New List(Of AttributeDefinition)()

 

If acBlkTbl.Has(paaltype) Then

    Dim blk As BlockTableRecord=acBlkTbl(paaltype)

    If blk.HasAttributeDefinitions Then

        For Each id As ObjectId in blk

            Dim att As AttributeDefinition=TryCast(acTrans.GetObject(id,OpenMode.ForRead),AttributeDefinition)

            If att IsNot Nothing Then

                attrs.Add(att)

            End

        Next

    End If

End If

 

MessageBox.Show(attr.Count & " attributes found in block " & paaltype)

 

Norman Yuan

Drive CAD With Code

EESignature

Message 3 of 3

Anonymous
Not applicable
Accepted solution

Thanks a lot.

With some modifications it work perfect.

Here is my working code:

 

       Dim paaltype As String

        lvPalen.Items.Clear()

        Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument

        Dim acCurDb As Database = acDoc.Database

        Dim acDocEd As Editor = acDoc.Editor

 

 

        Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()

            For i = 1 To 36

                paaltype = "paal" + Format(i, "00")

                Dim acBlkTbl As BlockTable

                acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)

                If acBlkTbl.Has(paaltype) Then

                    Dim blk As BlockTableRecord = acBlkTbl(paaltype).GetObject(OpenMode.ForRead)

                    If blk.HasAttributeDefinitions Then

                        For Each id2 As ObjectId In blk

                            Dim att As AttributeDefinition = TryCast(acTrans.GetObject(id2, OpenMode.ForRead), AttributeDefinition)

                            If att IsNot Nothing Then

                                If att.Tag.ToUpper = "AFMETING" Then lvPalen.Items.Add(att.TextString, i - 1)

                            End If

                        Next

                    End If

                End If

            Next

            acTrans.Dispose()

        End Using

 

0 Likes