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

    .NET

    Reply
    Contributor
    Posts: 22
    Registered: ‎11-13-2008

    Re: ObjectModified event

    04-28-2011 06:30 AM in reply to: BellwetherBill
                AddHandler myDB.ObjectModified, AddressOf callback_ObjectModified
                AddHandler myDoc.CommandEnded, AddressOf callback_CommandEnded
            End Using
        End Sub
        Private Sub callback_ObjectModified(ByVal sender As Object, ByVal e As ObjectEventArgs)
            Dim myBlockRef As BlockReference = e.DBObject.Id.GetObject(OpenMode.ForRead)
            Dim BTR As BlockTableRecord = myBlockRef.BlockTableRecord.GetObject(OpenMode.ForRead)
            MsgBox(myBlockRef.Layer)' & vbCr & BTR.Name)
            If Not IDList.Contains(e.DBObject.Id) Then
                IDList.Add(e.DBObject.Id)
            End If
        End Sub
        Private Sub callback_CommandEnded(ByVal sender As Object, ByVal e As CommandEventArgs)
            If IDList.Count > 0 Then
                Dim objid As ObjectId
                For Each objid In IDList
                    MsgBox("aaaaaaahhhhhh")
                Next
                IDList.Clear()
            End If
        End Sub

     Here is some of the code (basically copying yours) I'm not sure how to test for the block name and layer of the object I modified. Like I said I'm really new at this and appreciate all your help. I'm still at the point where I have to add these events manually with the netload and commandmethods. I'd be willing to pay you for some phone help if this is to much to accomplish through email.

     

    once again thanks for your time

     

    Dave

    Please use plain text.
    Contributor
    Posts: 22
    Registered: ‎11-13-2008

    Re: ObjectModified event

    04-28-2011 10:33 AM in reply to: BellwetherBill
        Private Sub callback_ObjectModified(ByVal sender As Object, ByVal e As ObjectEventArgs)
            Dim trans As Transaction = e.DBObject.Database.TransactionManager.StartTransaction
            Try
                Dim obj As Object = trans.GetObject(e.DBObject.Id, OpenMode.ForRead)
                If obj.GetType.Name.ToString = "BlockReference" Then
                    If Not IDList.Contains(e.DBObject.Id) Then
                        IDList.Add(e.DBObject.Id)
                        MsgBox(obj.GetType.Name.ToString)
                        Dim myBlockRef As BlockReference = e.DBObject.Id.GetObject(OpenMode.ForRead)
                        Dim BTR As BlockTableRecord = myBlockRef.BlockTableRecord.GetObject(OpenMode.ForRead)
                        MsgBox(BTR.Name)
                    End If
                End If
            Catch ex As Exception
    
            End Try
            trans.Dispose()
        End Sub
        Private Sub callback_CommandEnded(ByVal sender As Object, ByVal e As CommandEventArgs)
            If IDList.Count > 0 Then
                Dim objid As ObjectId
    
                For Each objid In IDList
                    MsgBox(e.GetType.ToString)
                Next
                IDList.Clear()
            End If
        End Sub

     

    I got a little farther than earlier but I'm still not sure how to get blockref name in the commandended event

    Please use plain text.
    Active Contributor
    BellwetherBill
    Posts: 33
    Registered: ‎01-14-2011

    Re: ObjectModified event

    04-28-2011 12:14 PM in reply to: daverode

    Dave,

     

    Sorry for the delay. I am still very new to .NET as well and have not done much with block references. I will look at this and help where I can but you should at least know that I'm not well versed in this language.

     

    That said try using this in your object modified event. Then do the work in command ended event. I don't think you want to try opening the object that called the event.

     

      If e.DBObject.Id.ObjectClass.Name = "AcDbAttribute" Then 
        IDList.Add(e.DBObject.Id)

      End If

     

    Please use plain text.
    Active Contributor
    BellwetherBill
    Posts: 33
    Registered: ‎01-14-2011

    Re: ObjectModified event

    04-28-2011 12:35 PM in reply to: daverode

    Then try this in your Command ended event.

     

        For Each ObjID In IDList

                  Dim db As Database = Application.DocumentManager.MdiActiveDocument.Database

                  Using trans As Transaction = db.TransactionManager.StartTransaction
                      Dim Myatt As AttributeReference = trans.GetObject(ObjID, OpenMode.ForRead, False)
                      MsgBox(Myatt.TextString)
                  End Using

         Next

    Please use plain text.
    Contributor
    Posts: 22
    Registered: ‎11-13-2008

    Re: ObjectModified event

    04-28-2011 12:38 PM in reply to: BellwetherBill

    Thanks

    I'll try that and get back to you

    Please use plain text.
    Contributor
    Posts: 22
    Registered: ‎11-13-2008

    Re: ObjectModified event

    05-05-2011 01:49 PM in reply to: daverode

     

        Private Sub callback_ObjectModified(ByVal sender As Object, ByVal e As ObjectEventArgs)
            Dim trans As Transaction = e.DBObject.Database.TransactionManager.StartTransaction
            Try
                Dim obj As Object = trans.GetObject(e.DBObject.Id, OpenMode.ForRead)
                If obj.GetType.Name.ToString = "BlockReference" Then
                    If Not IDList.Contains(e.DBObject.Id) Then
                        IDList.Add(e.DBObject.Id)
                        Debug.Print(e.DBObject.Id.ToString)
                        Debug.Print(sender.ToString)
                        MsgBox(obj.GetType.Name.ToString)
                        Dim myBlockRef As BlockReference = e.DBObject.Id.GetObject(OpenMode.ForRead)
                        MsgBox(myBlockRef.ObjectId.ToString)
                        Dim BTR As BlockTableRecord = myBlockRef.BlockTableRecord.GetObject(OpenMode.ForRead)
                        MsgBox(BTR.Name)
                    End If
                End If
            Catch ex As Exception
            End Try
            trans.Dispose()
        End Sub
        Private Sub callback_CommandEnded(ByVal sender As Object, ByVal e As CommandEventArgs)
            Dim myDwg As Document = DocumentManager.MdiActiveDocument
            Dim myDB As Database = ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database
            Try
                For Each objid In IDList
                    Using myTrans As Transaction = myDwg.TransactionManager.StartTransaction
                        Dim myTags As New ArrayList
                        Dim myStrings As New ArrayList
                        myTags.Add("FunctionText")
                        myStrings.Add("This is a test")
                        SetAttributes(objid, myTags, myStrings)
                        myTrans.Commit()
                    End Using
                Next
                IDList.Clear()
                Catch ex As Exception
            End Try
            RemoveHandler myDB.ObjectModified, AddressOf callback_ObjectModified
            RemoveHandler myDoc.CommandEnded, AddressOf callback_CommandEnded
        End Sub
    
    
        Public Sub SetAttributes(ByVal BlockID As ObjectId, ByVal TagList As ArrayList, ByVal StringList As ArrayList)
            Dim myTransMan As DatabaseServices.TransactionManager
            Dim myTrans As DatabaseServices.Transaction
            Dim myDwg As Document
    
            myDwg = Application.DocumentManager.MdiActiveDocument
            myTransMan = myDwg.TransactionManager
            myTrans = myTransMan.StartTransaction
    
            Dim myBlockRef As BlockReference
            Dim myAttColl As AttributeCollection
            myBlockRef = BlockID.GetObject(OpenMode.ForWrite, False)
            myAttColl = myBlockRef.AttributeCollection
            Dim myEnt As ObjectId
            Dim myAttRef As AttributeReference
            For Each myEnt In myAttColl
                myAttRef = myEnt.GetObject(OpenMode.ForWrite, False)
                If TagList.Contains(myAttRef.Tag) Then
                    Dim X As Integer = TagList.BinarySearch(myAttRef.Tag)
                    If X >= 0 Then
                        myAttRef.TextString = StringList(X)
                    End If
                End If
            Next
            myTrans.Commit()
            myTrans.Dispose()
            myTransMan.Dispose()
        End Sub

    Seams like everthing works great until I try to open up the attref for read then I get an exception...any ideas

     

    Thanks

    Please use plain text.
    Active Contributor
    BellwetherBill
    Posts: 33
    Registered: ‎01-14-2011

    Re: ObjectModified event

    05-15-2011 07:34 AM in reply to: daverode

    Dave,

     

    Sorry I haven't looked at this much. I've been right out straight.

     

    I see several potential problems I think but have not had time to test. It would be helpfult too if you could tell me what it is you're trying to accomplish. Please post any progress you've made and I'll try to look at it later next week.

     

    Bill

    Please use plain text.