.NET

Reply
Member
marcverdaasdonk9250
Posts: 4
Registered: ‎07-28-2010
Message 1 of 5 (403 Views)

writing attribute values

403 Views, 4 Replies
02-29-2012 02:34 AM

Hello,

 

I'm trying to write some code that adds values to attributes of a specified block.

 

I'm able to search for the block, but I'm having trouble aditing it...

 

 

Dim acDoc AsDocument = Application.DocumentManager.MdiActiveDocument

Dim acCurDb AsDatabase = acDoc.Database

Dim acTransMgr As Autodesk.AutoCAD.DatabaseServices.TransactionManager= acCurDb.TransactionManager

 

Using acTrans1 AsTransaction= acTransMgr.StartTransaction

 

Dim acBlkTbl AsBlockTable = acTrans1.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)

 

If acBlkTbl.Has("blockname") Then

 

    *** here I need to get the object found in the active block table and edit it's attributes by atribute name ****

 

 

End If

End Using

 

I hope aomebody was some simple-sample code I can use!!

 

 

Thanx,

Marc

Mentor
truss_85
Posts: 173
Registered: ‎02-13-2011
Message 2 of 5 (401 Views)

Re: writing attribute values

02-29-2012 03:02 AM in reply to: marcverdaasdonk9250

Below code you can edit att values by block

 

you can use it like

 


SetAttribute(ObjectId of block, "BLOCKNAME", "ATTNAME", "ATTVALUE")

 

 

Public Sub SetAttribute(ByVal BlockID As Autodesk.AutoCAD.DatabaseServices.ObjectId, ByVal blckname As String, ByVal AttTag As String, ByVal AttVal As String)
        Dim MyDb As Database = Application.DocumentManager.MdiActiveDocument.Database
        If BlockID.IsNull Then Exit Sub
        Try
            Using myTrans As Transaction = MyDb.TransactionManager.StartTransaction
                Dim myBlckRef As BlockReference
                Dim myAttColl As AttributeCollection
                Dim myBlckTable As BlockTableRecord
                myBlckRef = BlockID.GetObject(OpenMode.ForWrite)
                If myBlckRef.IsDynamicBlock Then
                    myBlckTable = myTrans.GetObject(myBlckRef.DynamicBlockTableRecord, OpenMode.ForRead)
                Else
                    myBlckTable = myTrans.GetObject(myBlckRef.BlockTableRecord, OpenMode.ForRead)
                End If

                If String.Compare(myBlckTable.Name, blckname, True) = 0 Then
                    myAttColl = myBlckRef.AttributeCollection
                    Dim myEnt As Autodesk.AutoCAD.DatabaseServices.ObjectId
                    Dim myAttRef As Autodesk.AutoCAD.DatabaseServices.AttributeReference
                    For Each myEnt In myAttColl
                        myAttRef = myEnt.GetObject(OpenMode.ForWrite)
                        If String.Compare(myAttRef.Tag, AttTag, True) = 0 Then
                            myAttRef.TextString = AttVal.ToString
                        End If
                    Next
                End If
                myTrans.Commit()
            End Using
        Catch ex As Exception
        End Try
    End Sub

 

Member
marcverdaasdonk9250
Posts: 4
Registered: ‎07-28-2010
Message 3 of 5 (381 Views)

Re: writing attribute values

02-29-2012 05:31 AM in reply to: marcverdaasdonk9250

Thanks for this!

 

The only thing; I don't know what to use in the ObjectId of block in the line:

 

SetAttribute(ObjectId of block, "BLOCKNAME", "ATTNAME", "ATTVALUE")

 

 

Marc

Mentor
truss_85
Posts: 173
Registered: ‎02-13-2011
Message 4 of 5 (378 Views)

Re: writing attribute values

02-29-2012 05:45 AM in reply to: marcverdaasdonk9250

I send you whole class

Maybe it is helpful for you. object id is block object.objectid in short property of object

Take a look at the code; the main sub create a selection set on screen and filter all the blocks

in selection set then changed desired blocks att with SetAttribute Sub.

 

Let me know if it is helpful...

 

 

Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.Geometry
Imports Autodesk.AutoCAD.Runtime

Public Class Class1
    <CommandMethod("SBEA")> _
    Public Sub SBlocksEditAtts()

        Dim acDocEd As Editor = Application.DocumentManager.MdiActiveDocument.Editor
      
        Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
                Dim acTypValAr(0) As TypedValue
                acTypValAr.SetValue(New TypedValue(DxfCode.Start, "INSERT"), 0)
                Dim acSelFtr As SelectionFilter = New SelectionFilter(acTypValAr)
                Dim prselres As PromptSelectionResult = acDocEd.GetSelection(acSelFtr)

                If prselres.Status = PromptStatus.OK Then
                    Dim acSSet As SelectionSet = prselres.Value
                    Dim nn As Integer = 0
                    For Each acSSObj As SelectedObject In acSSet
                        SetAttribute(acSSObj.ObjectId, "BLOCKNAME", "ATTNAME", nn.ToString)
                        nn = nn + 1
                    Next
                    acDocEd.WriteMessage("Number of objects selected: " & acSSet.Count.ToString())
                End If
            End If
	    acTrans.Commit()
        End Using
    End Sub

    Public Sub SetAttribute(ByVal BlockID As Autodesk.AutoCAD.DatabaseServices.ObjectId, ByVal blckname As String, ByVal AttTag As String, ByVal AttVal As String)
        Dim MyDb As Database = Application.DocumentManager.MdiActiveDocument.Database
        If BlockID.IsNull Then Exit Sub
        Try
            Using myTrans As Transaction = MyDb.TransactionManager.StartTransaction
                Dim myBlckRef As BlockReference
                Dim myAttColl As AttributeCollection
                Dim myBlckTable As BlockTableRecord
                myBlckRef = BlockID.GetObject(OpenMode.ForWrite)
                If myBlckRef.IsDynamicBlock Then
                    myBlckTable = myTrans.GetObject(myBlckRef.DynamicBlockTableRecord, OpenMode.ForRead)
                Else
                    myBlckTable = myTrans.GetObject(myBlckRef.BlockTableRecord, OpenMode.ForRead)
                End If

                If String.Compare(myBlckTable.Name, blckname, True) = 0 Then
                    myAttColl = myBlckRef.AttributeCollection
                    Dim myEnt As Autodesk.AutoCAD.DatabaseServices.ObjectId
                    Dim myAttRef As Autodesk.AutoCAD.DatabaseServices.AttributeReference
                    For Each myEnt In myAttColl
                        myAttRef = myEnt.GetObject(OpenMode.ForWrite)
                        If String.Compare(myAttRef.Tag, AttTag, True) = 0 Then
                            myAttRef.TextString = AttVal.ToString
                        End If
                    Next
                End If
                myTrans.Commit()
            End Using
        Catch ex As Exception
        End Try
    End Sub
End Class

 

*Expert Elite*
chiefbraincloud
Posts: 753
Registered: ‎02-13-2008
Message 5 of 5 (352 Views)

Re: writing attribute values

02-29-2012 12:46 PM in reply to: marcverdaasdonk9250

What the OP needs to realize is that the code as posted would be looking at BlockTableRecords, and what he really needs is BlockReferences.

 

That said, there have been countless posts on that subject over the last few years, so rather than re-hashing the same old stuff, I would suggest you do a search on this group, and you could also get some info by doing a search on the Through the Interface blog.

 

Try this one:

http://through-the-interface.typepad.com/through_the_interface/2007/07/updating-a-spec.html

Dave O.                                                                  Sig-Logos32.png
Announcements
Are you familiar with the Autodesk Expert Elites? The Expert Elite program is made up of customers that help other customers by sharing knowledge and exemplifying an engaging style of collaboration. To learn more, please visit our Expert Elite website.
Need installation help?

Start with some of our most frequented solutions or visit the Installation and Licensing Forum to get help installing your software.