.NET
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Get block reference information error

14 REPLIES 14
SOLVED
Reply
Message 1 of 15
ditran7577
1163 Views, 14 Replies

Get block reference information error

Hi All,

 

I get a block reference (has attribute) from other drawing as code follow:

 

Public Sub GetBlock_Info()
        Dim blockName As String = "test"
        Try
            Dim doc As Document = Application.DocumentManager.MdiActiveDocument
            Dim doclock As DocumentLock = doc.LockDocument()
            Dim ed As Editor = doc.Editor

            Dim ofd As New OpenFileDialog("Select Drawing", Nothing, "dwg; dwt", "ATS detai drawing", Autodesk.AutoCAD.Windows.OpenFileDialog.OpenFileDialogFlags.DoNotTransferRemoteFiles)
            Dim dr As System.Windows.Forms.DialogResult = ofd.ShowDialog()
            If dr <> System.Windows.Forms.DialogResult.OK Then
                Return
            End If
            Dim filePath As String = ofd.Filename
            'Using doclock
            Using OpenDb As New Database
                OpenDb.ReadDwgFile(filePath, System.IO.FileShare.ReadWrite, True, "")

                Using opentrans As Transaction = OpenDb.TransactionManager.StartTransaction()
                    Dim openBT As BlockTable = DirectCast(opentrans.GetObject(OpenDb.BlockTableId, OpenMode.ForRead), BlockTable)
                    If openBT.Has(blockName) Then

                        Dim openbtrec As BlockTableRecord = openBT(blockName).GetObject(OpenMode.ForRead)

                        Dim openbref As New BlockReference(New Point3d(0, 0, 0), openbtrec.ObjectId)

                        If openbtrec.HasAttributeDefinitions Then

                            Dim attCol As AttributeCollection = openbref.AttributeCollection
                     
                            For Each attId As ObjectId In attCol
                                Dim attRef As AttributeReference = DirectCast(opentrans.GetObject(attId, OpenMode.ForRead), AttributeReference)

                                MsgBox(attRef.TextString)
                                
                            Next
                        End If
                    End If
                    opentrans.Commit()
                    opentrans.Dispose()
                End Using
            End Using
       Catch ex As Autodesk.AutoCAD.Runtime.Exception
        End Try
    End Sub

Block "test" contains some attributes but the code can not get them.

Hope for help.

 

 

 

14 REPLIES 14
Message 2 of 15


@ditran7577 wrote:

...Block "test" contains some attributes but the code can not get them...


That is why you do not add attributes after inserting of block: Inserting a block with attributes to modelspace

You have to iterate block definition to find all non-constant AttributeDefinitions and adding corresponding AttributeReferences to openbref.AttributeCollection

Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"


Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Expert Elite Member

Message 3 of 15

I have just get information from attribute of that block. I do not want to add it into model space. How to?

Message 4 of 15


@ditran7577 wrote:

I have just get information from attribute of that block. I do not want to add it into model space. How to?


I think you do not understand me. Reread my post and my link again.

Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"


Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Expert Elite Member

Message 5 of 15
ditran7577
in reply to: ditran7577

Was it an impossibility?

Message 6 of 15


@ditran7577 wrote:

Was it an impossibility?


If you create BlockReference with code and do not add AttributeReferences to BlockReference.AttributeCollection - then there are no AttributeReference within BlockReference. So in this case you can only get AttributeDefinitions from BlockTableRecord.

Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"


Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Expert Elite Member

Message 7 of 15

But I want to read the block only. I don't creat or insert it. 

Message 8 of 15


@ditran7577 wrote:

But I want to read the block only. I don't creat or insert it. 


Repeat:

 

So in this case you can only get AttributeDefinitions from BlockTableRecord.

 

Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"


Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Expert Elite Member

Message 9 of 15
ditran
in reply to: Alexander.Rivilis

Are there any way to get value of AttributeDefinitions. Thanks.

Message 10 of 15
Alexander.Rivilis
in reply to: ditran


@ditran wrote:

Are there any way to get value of AttributeDefinitions. Thanks.


Of course!

 

      Dim DB As Database = HostApplicationServices.WorkingDatabase
      Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
      Dim trans As Transaction = DB.TransactionManager.StartTransaction
      Using trans
        Dim id As ObjectId ' id of our BlockTableRecord - in your's case is openBT(blockName)
        Dim btAttRec As BlockTableRecord = trans.GetObject(id, OpenMode.ForRead)
        Dim idAtt As ObjectId
        For Each idAtt In btAttRec
          Dim ent As Entity = trans.GetObject(idAtt, OpenMode.ForRead)
          If TypeOf ent Is AttributeDefinition Then
            Dim attDef As AttributeDefinition = CType(ent, AttributeDefinition)
            ed.WriteMessage(vbCrLf + "attdef.TextString = {0}", attDef.TextString)
            ed.WriteMessage(vbCrLf + "attdef.Tag = {0}", attDef.Tag)
          End If
        Next
        trans.Commit()
      End Using

Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"


Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Expert Elite Member

Message 11 of 15
ditran
in reply to: Alexander.Rivilis

AttDef.textstring ="" although AttributeDefinition has value. What happen?

Message 12 of 15
Alexander.Rivilis
in reply to: ditran


@ditran wrote:

AttDef.textstring ="" although AttributeDefinition has value. What happen?


I do not know what happen. Maybe you again confused AttributeDefinition in BlockTableRecord and AttributeReference in inserted BlockReference.

Please attach dwg-file with block and explain what do you mean.

Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"


Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Expert Elite Member

Message 13 of 15
ditran
in reply to: Alexander.Rivilis

 <CommandMethod("test")> _
    Public Sub test()
        Dim blockName As String = "blank_sheet"
        Dim ofd As New OpenFileDialog("CAD FILE", Nothing, "dwg; dwt", "CAD FILE", Autodesk.AutoCAD.Windows.OpenFileDialog.OpenFileDialogFlags.DoNotTransferRemoteFiles)
        Dim dr As System.Windows.Forms.DialogResult = ofd.ShowDialog()
        If dr <> System.Windows.Forms.DialogResult.OK Then
            Return
        End If
        Dim sourcefile As String = ofd.Filename

        Dim doc As Document = Application.DocumentManager.MdiActiveDocument
        Dim doclock As DocumentLock = doc.LockDocument()
        Dim ed As Editor = doc.Editor
        Dim acCurDb As Database = doc.Database

        Using doclock
            Using OpenDb As New Database(False, True)
                OpenDb.ReadDwgFile(sourcefile, System.IO.FileShare.ReadWrite, True, "")
                Using opentrans As Transaction = OpenDb.TransactionManager.StartTransaction()
                    Dim openBT As BlockTable = DirectCast(opentrans.GetObject(OpenDb.BlockTableId, OpenMode.ForRead), BlockTable)
                    If openBT.Has(blockName) Then
                        Dim id As ObjectId = openBT(blockName)
                        Dim btAttRec As BlockTableRecord = opentrans.GetObject(id, OpenMode.ForRead)
                        Dim idAtt As ObjectId
                        For Each idAtt In btAttRec
                            Dim ent As Entity = opentrans.GetObject(idAtt, OpenMode.ForRead)
                            If TypeOf ent Is AttributeDefinition Then
                                Dim attDef As AttributeDefinition = CType(ent, AttributeDefinition)
                                ed.WriteMessage(vbCrLf + "attdef.TextString = {0}", attDef.TextString)
                                ed.WriteMessage(vbCrLf + "attdef.Tag = {0}", attDef.Tag)
                            End If
                        Next
                    Else
                        opentrans.Commit()
                        Exit Sub
                    End If
                    opentrans.Commit()
                End Using
            End Using
        End Using

    End Sub

 

Thanks.

Message 14 of 15
Alexander.Rivilis
in reply to: ditran

I was right and you confuse BlockTableRecord and BlockReference, AttributeDefinition and AttributeReference.

 

Try this code (no error checking done):

 

<CommandMethod("test")> _
Public Sub test()
  Dim blockName As String = "blank_sheet"
  Dim ofd As New Autodesk.AutoCAD.Windows.OpenFileDialog( _
   "CAD FILE", Nothing, "dwg; dwt", "CAD FILE", _
   Autodesk.AutoCAD.Windows.OpenFileDialog.OpenFileDialogFlags.DoNotTransferRemoteFiles)
  Dim dr As System.Windows.Forms.DialogResult = ofd.ShowDialog()
  If dr <> System.Windows.Forms.DialogResult.OK Then
    Return
  End If
  Dim sourcefile As String = ofd.Filename

  Dim doc As Document = _
   Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument()
  Dim doclock As DocumentLock = doc.LockDocument()
  Dim ed As Editor = doc.Editor
  Dim acCurDb As Database = doc.Database

  Using doclock
    Using OpenDb As New Database(False, True)
      OpenDb.ReadDwgFile(sourcefile, System.IO.FileShare.ReadWrite, True, "")
      Using opentrans As Transaction = OpenDb.TransactionManager.StartTransaction()
        Dim openBT As BlockTable = _
         DirectCast(opentrans.GetObject(OpenDb.BlockTableId, OpenMode.ForRead), BlockTable)
        If openBT.Has(blockName) Then
          Dim id As ObjectId = openBT(blockName)
          Dim btAttRec As BlockTableRecord = opentrans.GetObject(id, OpenMode.ForRead)
          For Each idBref As ObjectId In btAttRec.GetBlockReferenceIds(True, True)
            Dim bRef As BlockReference = opentrans.GetObject(idBref, OpenMode.ForRead)
            For Each idAttRef In bRef.AttributeCollection
              Dim attRef As AttributeReference = opentrans.GetObject(idAttRef, OpenMode.ForRead)
              ed.WriteMessage(vbCrLf + "attRef.Tag = {0}", attRef.Tag)
              ed.WriteMessage(vbCrLf + "attRef.TextString = {0}", attRef.TextString)
            Next
          Next
        End If
        opentrans.Commit()
      End Using
    End Using
  End Using
End Sub

Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"


Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Expert Elite Member

Message 15 of 15
ditran
in reply to: Alexander.Rivilis

Oh. Thanks so much.

Can't find what you're looking for? Ask the community or share your knowledge.

Post to forums  

Autodesk DevCon in Munich May 28-29th


Autodesk Design & Make Report

”Boost