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.
Solved! Go to Solution.
Solved by Alexander.Rivilis. Go to Solution.
@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
I have just get information from attribute of that block. I do not want to add it into model space. How to?
@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
@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
@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
@Anonymous 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
AttDef.textstring ="" although AttributeDefinition has value. What happen?
@Anonymous 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
<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.
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
Can't find what you're looking for? Ask the community or share your knowledge.