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

writing attribute values

4 REPLIES 4
Reply
Message 1 of 5
marcverdaasdonk9250
763 Views, 4 Replies

writing attribute values

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

4 REPLIES 4
Message 2 of 5

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

 

Message 3 of 5

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

Message 4 of 5

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

 

Message 5 of 5

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

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