• Industries
  • Products
  • Buy
  • Services & Support
  • Communities
  • Discussion Groups

    .NET

    Reply
    Member
    marcverdaasdonk9250
    Posts: 4
    Registered: ‎07-28-2010

    writing attribute values

    299 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

    Please use plain text.
    Distinguished Contributor
    truss_85
    Posts: 131
    Registered: ‎02-13-2011

    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

     

    Please use plain text.
    Member
    marcverdaasdonk9250
    Posts: 4
    Registered: ‎07-28-2010

    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

    Please use plain text.
    Distinguished Contributor
    truss_85
    Posts: 131
    Registered: ‎02-13-2011

    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

     

    Please use plain text.
    *Expert Elite*
    chiefbraincloud
    Posts: 736
    Registered: ‎02-13-2008

    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
    Please use plain text.