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

can't dispose xdata

6 REPLIES 6
SOLVED
Reply
Message 1 of 7
wang890
1096 Views, 6 Replies

can't dispose xdata

i have a combo box which choose from 3 items one is blank. the triggered item changed event will erase the old set of corresponding xdata in the selected object and populate with new ones read from different text boxes. i was able to set the xdata for the first time ok. but when trying to dispose it won't dispose.

 

Imports System.Runtime
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.DatabaseServices
Imports AcApp = Autodesk.AutoCAD.ApplicationServices.Application
Imports Create_Pipe_Data.ActiveDrawing


Public Class Container1

    Public oSelectedObjID As ObjectId
    Public WithEvents doc As Document
    Public AppName As String = "CreatePipeData"
    Private m_DocData As MyDocData = Nothing
    Friend Shared ps As Autodesk.AutoCAD.Windows.PaletteSet = Nothing
    Dim myPalette As Container1

    <CommandMethod("tp", CommandFlags.Transparent)> _
Public Sub DoIt()


        If m_DocData Is Nothing Then m_DocData = New MyDocData
        AddHandler AcApp.DocumentManager.DocumentActivated, AddressOf Me.DocumentManager_DocumentActivated
        AddHandler AcApp.DocumentManager.DocumentToBeDeactivated, AddressOf Me.DocumentManager_DocumentToBeDeactivated

        'check to see if paletteset is already created
        If ps Is Nothing Then
            'no so create it
            ps = New Autodesk.AutoCAD.Windows.PaletteSet("Create Pipe Data")
            'create new instance of user control
            myPalette = New Container1()
            'add it to the paletteset
            ps.Add("Create Pipe Data", myPalette)
        End If
        'turn it on
        ps.Visible = True

    End Sub

    Private Sub AddRegAppTableRecord(ByVal regAppName As String)

        Dim db As Database = doc.Database
        Dim tr As Transaction = doc.TransactionManager.StartTransaction()

        Try
            Using tr

                Dim rat As RegAppTable = DirectCast(tr.GetObject(db.RegAppTableId, OpenMode.ForRead, False), RegAppTable)
                If Not rat.Has(regAppName) Then
                    rat.UpgradeOpen()
                    Dim ratr As New RegAppTableRecord()
                    ratr.Name = regAppName
                    rat.Add(ratr)
                    tr.AddNewlyCreatedDBObject(ratr, True)
                End If

                tr.Commit()
            End Using
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

    End Sub

    Private Sub Container1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        If m_DocData Is Nothing Then m_DocData = New MyDocData
        doc = Application.DocumentManager.MdiActiveDocument
        'doc.LockDocument(DocumentLockMode.Write, Nothing, Nothing, True)
        ' AddHandler doc.ImpliedSelectionChanged, AddressOf ObjectSelected
        AddHandler AcApp.DocumentManager.DocumentActivated, AddressOf Me.DocumentManager_DocumentActivated
        AddHandler AcApp.DocumentManager.DocumentToBeDeactivated, AddressOf Me.DocumentManager_DocumentToBeDeactivated
        'AddHandler doc.ImpliedSelectionChanged, AddressOf ObjectSelected
    End Sub

    Private Sub DocumentManager_DocumentActivated(ByVal sender As Object, ByVal e As DocumentCollectionEventArgs)
        'display the current active document

        Try
            If Not m_DocData Is Nothing Then
                txtADwg.Text = m_DocData.Current.Stuff
                doc = Application.DocumentManager.MdiActiveDocument
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try


    End Sub
    Private Sub DocumentManager_DocumentToBeDeactivated(ByVal sender As Object, ByVal e As DocumentCollectionEventArgs)
        'store the current contents
        Try
            If Not m_DocData Is Nothing Then
                m_DocData.Current.Stuff = txtADwg.Text
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

    End Sub

    Private Sub ObjectSelectEvent(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles doc.ImpliedSelectionChanged
        ObjectSelected()
    End Sub

    Private Sub ObjectSelected()
        'Dim myDB As Database = HostApplicationServices.WorkingDatabase
        Dim myEditor As Editor = Application.DocumentManager.MdiActiveDocument.Editor
        Dim PossibleSelectionSet As PromptSelectionResult = myEditor.SelectImplied
        Dim mySelectionSet As SelectionSet = Nothing
        Dim myObjectIDs As New List(Of ObjectId)
        Dim oSelectedObj As DBObject

        If PossibleSelectionSet.Status = PromptStatus.OK Then
            Using tr As Transaction = doc.TransactionManager.StartTransaction
                mySelectionSet = PossibleSelectionSet.Value
                For Each mySelObj As SelectedObject In mySelectionSet
                    myObjectIDs.Add(mySelObj.ObjectId)
                Next
            End Using
        End If

        'SET TO LAST OBJECT SELECTED

        If myObjectIDs.Count <> 0 Then

            Try
                Using oLock As DocumentLock = doc.LockDocument() '(DocumentLockMode.Write, Nothing, Nothing, True)
                    Dim tr As Transaction = doc.TransactionManager.StartTransaction()
                    Using tr
                        oSelectedObj = tr.GetObject(myObjectIDs.Item(myObjectIDs.Count - 1), OpenMode.ForRead, False)
                        oSelectedObjID = oSelectedObj.ObjectId
                        'AFTER SELECT OBJECT, POPULATE FORM


                        PopulateXdataToForm(oSelectedObjID)

                    End Using
                End Using

                GroupBox1.Enabled = True
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try


        Else
            GroupBox1.Enabled = False
        End If

    End Sub

    Private Sub txtType_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtType.MouseLeave
        PopulateFormDataToObjectXdata(oSelectedObjID)
    End Sub

    Private Sub txtMaterial_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtMaterial.MouseLeave, TextBox6.MouseLeave, TextBox5.MouseLeave, TextBox4.MouseLeave, TextBox3.MouseLeave, TextBox2.MouseLeave, TextBox1.MouseLeave
        PopulateFormDataToObjectXdata(oSelectedObjID)
    End Sub

    Private Sub txtLength_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtLength.MouseLeave
        PopulateFormDataToObjectXdata(oSelectedObjID)
    End Sub

    Private Sub txtInvOut_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtInvOut.MouseLeave
        PopulateFormDataToObjectXdata(oSelectedObjID)
    End Sub

    Private Sub txtInvIn_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtInvIn.MouseLeave
        PopulateFormDataToObjectXdata(oSelectedObjID)
    End Sub

    Private Sub txtGrade_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtGrade.MouseLeave
        PopulateFormDataToObjectXdata(oSelectedObjID)
    End Sub

    Private Sub TxtDiameter_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtDiameter.MouseLeave
        PopulateFormDataToObjectXdata(oSelectedObjID)
    End Sub

    Private Sub cmbPipeOrStructure_SelectionChangeCommitted(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbPipeOrStructure.SelectionChangeCommitted
        PipeStructureChanged()
    End Sub

    Private Sub PipeStructureChanged()
        If cmbPipeOrStructure.Text = "Pipe" Then
            gpbPipe.Enabled = True
            gpbStructure.Enabled = False

            Using oLock As DocumentLock = doc.LockDocument()

                Dim tr As Transaction = doc.TransactionManager.StartTransaction()
                Using tr
                    'Dim oSelectedObj As DBObject = tr.GetObject(oSelectedObjID, OpenMode.ForWrite, False)
                    'If oSelectedObj.XData <> Nothing Then
                    '    Dim rb As ResultBuffer = oSelectedObj.XData
                    '    rb.Dispose()
                    'End If
                    'tr.Commit()
                    PopulateFormDataToObjectXdata(oSelectedObjID)
                End Using

            End Using
        ElseIf cmbPipeOrStructure.Text = "Structure" Then
            gpbStructure.Enabled = True
            gpbPipe.Enabled = False

            Using oLock As DocumentLock = doc.LockDocument()

                Dim tr As Transaction = doc.TransactionManager.StartTransaction()
                Using tr
                    'Dim oSelectedObj As DBObject = tr.GetObject(oSelectedObjID, OpenMode.ForWrite, False)
                    'If oSelectedObj.XData <> Nothing Then
                    '    Dim rb As ResultBuffer = oSelectedObj.XData
                    '    rb.Dispose()
                    'End If
                    'tr.Commit()
                    PopulateFormDataToObjectXdata(oSelectedObjID)
                End Using

            End Using

        ElseIf cmbPipeOrStructure.Text = "" Then
            ClearTextbox()
            gpbStructure.Enabled = False
            gpbPipe.Enabled = False

            Using oLock As DocumentLock = doc.LockDocument()

                Dim tr As Transaction = doc.TransactionManager.StartTransaction()
                Using tr
                    'Dim oSelectedObj As DBObject = tr.GetObject(oSelectedObjID, OpenMode.ForWrite, False)
                    'If oSelectedObj.XData <> Nothing Then
                    '    Dim rb As ResultBuffer = oSelectedObj.XData
                    '    rb.Dispose()
                    'End If
                    'tr.Commit()
                    PopulateFormDataToObjectXdata(oSelectedObjID)
                End Using

            End Using

        End If
    End Sub

    Private Sub ClearTextbox()

        txtGrade.Text = ""
        txtInvIn.Text = ""
        txtInvOut.Text = ""
        txtDiameter.Text = ""
        txtLength.Text = ""
        txtMaterial.Text = ""
        txtType.Text = ""
    End Sub

    'ADD PROPERTY FROM RESULTBUFFER TO TEXTBOX
    Private Sub PopulateXdataToForm(ByVal oSelectedObjID As ObjectId)


        Dim tr As Transaction = doc.TransactionManager.StartTransaction()
        Using tr

            Dim oSelectedObj As DBObject = tr.GetObject(oSelectedObjID, OpenMode.ForWrite, False)
            If oSelectedObj.XData = Nothing Then
                'IF FRESH OBJECT, CLEAR FORM
                ClearTextbox()
            Else
                'check to see if created by same application
                Dim oTypeValueApp As TypedValue = oSelectedObj.XData.AsArray(0)

                If oTypeValueApp.Value = AppName Then

                    For Each oTypedValue In oSelectedObj.XData.AsArray
                        If oTypedValue.Value <> AppName Then
                            Dim arSplitPipeData() As String = Split(oTypedValue.Value, ",")
                            Select Case arSplitPipeData(0).ToString

                                Case "pipe-structure"
                                    Select Case arSplitPipeData(1).ToString
                                        Case ""
                                            cmbPipeOrStructure.Text = cmbPipeOrStructure.Items(0)
                                            gpbStructure.Enabled = False
                                            gpbPipe.Enabled = False
                                        Case "Pipe"
                                            cmbPipeOrStructure.Text = cmbPipeOrStructure.Items(1)
                                            gpbStructure.Enabled = False
                                            gpbPipe.Enabled = True
                                        Case "Structure"
                                            cmbPipeOrStructure.Text = cmbPipeOrStructure.Items(2)
                                            gpbStructure.Enabled = True
                                            gpbPipe.Enabled = False
                                    End Select

                                Case "type"
                                    txtType.Text = arSplitPipeData(1).ToString
                                Case "material"
                                    txtMaterial.Text = arSplitPipeData(1).ToString
                                Case "diameter"
                                    txtDiameter.Text = arSplitPipeData(1).ToString
                                Case "invertin"
                                    txtInvIn.Text = arSplitPipeData(1).ToString
                                Case "invertout"
                                    txtInvOut.Text = arSplitPipeData(1).ToString
                                Case "length"
                                    txtLength.Text = arSplitPipeData(1).ToString
                                Case "grade"
                                    txtGrade.Text = arSplitPipeData(1).ToString
                            End Select
                        End If
                    Next
                End If

            End If
            ' doc.LockDocument.Dispose()
        End Using
    End Sub

    Private Sub PopulateFormDataToObjectXdata(ByVal oSelectedObjID As ObjectId)


        Try
            Dim tr As Transaction = doc.TransactionManager.StartTransaction()
            Using oLock As DocumentLock = doc.LockDocument()
                Using tr
                    'doc.LockDocument() '(DocumentLockMode.Write, Nothing, Nothing, True)
                    Dim oSelectedObj As DBObject = tr.GetObject(oSelectedObjID, OpenMode.ForWrite, False)
                    'clear xdata

                    If cmbPipeOrStructure.Text = "" Then
                        'clear info
                        oSelectedObj.XData.Dispose()
                        Exit Sub

                    ElseIf oSelectedObj.XData <> Nothing Then
                        oSelectedObj.XData.Dispose()
                    End If

                    AddRegAppTableRecord(AppName)

                    Dim rb As New ResultBuffer
                    rb.Add(New TypedValue(1001, AppName))
                    rb.Add(New TypedValue(1000, "pipe-structure," & cmbPipeOrStructure.Text))
                    rb.Add(New TypedValue(1000, "type," & txtType.Text))
                    rb.Add(New TypedValue(1000, "material," & txtMaterial.Text))
                    rb.Add(New TypedValue(1000, "diameter," & txtDiameter.Text))
                    rb.Add(New TypedValue(1000, "invertin," & txtInvIn.Text))
                    rb.Add(New TypedValue(1000, "invertout," & txtInvOut.Text))
                    rb.Add(New TypedValue(1000, "length," & txtLength.Text))
                    rb.Add(New TypedValue(1000, "grade," & txtGrade.Text))

                    oSelectedObj.XData = rb
                    rb.Dispose()
                    tr.Commit()
                End Using
            End Using

        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

End Class


 

Stantec
Dell Precision 5530, Prism M320PU, C3D 14/17/19
6 REPLIES 6
Message 2 of 7
Alfred.NESWADBA
in reply to: wang890

Hi,

 

>> but when trying to dispose it won't dispose

does that mean that you try to clean (to delete) the EED from the entity? If so you have to assign new XData containing just one RB-item containing only the App-Code but nothing else, so it get's removed from the entity.

 

If you do search for anything else, please describe what you mean by "to dispose XDATA" (as I think you don't mean .Dispose really),

PLUS an additional, important tip: please use the icon/function in the message-editor for placing code within the message:

otherwise (you see it in your thread-item) this code is

a) not readable

b) not useable (can't be copied&pasted to an editor as there are line-feeds and spaces lost).

 

- alfred -

------------------------------------------------------------------------------------
Alfred NESWADBA
Ingenieur Studio HOLLAUS ... www.hollaus.at ... blog.hollaus.at ... CDay 2024
------------------------------------------------------------------------------------
(not an Autodesk consultant)
Message 3 of 7
wang890
in reply to: wang890

thanks for showing me that button to paste code. that's where it is. i'll go fix it up

 

yeah i was trying to run the dispose first then add a new one in or leave it empty. so you are saying just repopulate resultbuffer with empty one. i was trying to get it to the original state before populating xdata. is that doable?

 

if no xdata part of my code runs fast just populate a blank palette.

Stantec
Dell Precision 5530, Prism M320PU, C3D 14/17/19
Message 4 of 7
Hallex
in reply to: wang890

Try

 

obj.xdata = New ResultBuffer()

 

to clear it

_____________________________________
C6309D9E0751D165D0934D0621DFF27919
Message 5 of 7
wang890
in reply to: Hallex

ha, still doesn't work. the set to new resultbuffer doesn't clear it. maybe a bug?

 

i changed a little bit here but this is the code that is key to dispose this xdata

 

 Private Sub PopulateFormDataToObjectXdata(ByVal oSelectedObjID As ObjectId)


        Try
            Dim tr As Transaction = doc.TransactionManager.StartTransaction()
            Using oLock As DocumentLock = doc.LockDocument()
                Using tr
                    'doc.LockDocument() '(DocumentLockMode.Write, Nothing, Nothing, True)
                    Dim oSelectedObj As DBObject = tr.GetObject(oSelectedObjID, OpenMode.ForWrite, False)
                    'clear xdata

                    If cmbPipeOrStructure.Text = "" Then
                        'clear info
                        oSelectedObj.XData.Dispose()
                    
                    ElseIf oSelectedObj.XData <> Nothing Then
                        oSelectedObj.XData.Dispose()
                        AddRegAppTableRecord(AppName)

                        Dim rb As New ResultBuffer
                        rb.Add(New TypedValue(1001, AppName))
                        rb.Add(New TypedValue(1000, "pipe-structure," & cmbPipeOrStructure.Text))
                        rb.Add(New TypedValue(1000, "type," & txtType.Text))
                        rb.Add(New TypedValue(1000, "material," & txtMaterial.Text))
                        rb.Add(New TypedValue(1000, "diameter," & txtDiameter.Text))
                        rb.Add(New TypedValue(1000, "invertin," & txtInvIn.Text))
                        rb.Add(New TypedValue(1000, "invertout," & txtInvOut.Text))
                        rb.Add(New TypedValue(1000, "length," & txtLength.Text))
                        rb.Add(New TypedValue(1000, "grade," & txtGrade.Text))

                        oSelectedObj.XData = rb
                        rb.Dispose()
                    End If

                    tr.Commit()
                End Using
            End Using

        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

 

Stantec
Dell Precision 5530, Prism M320PU, C3D 14/17/19
Message 6 of 7
chiefbraincloud
in reply to: wang890

As Alfred said, you need a single typed value with the Registered Application name to clear it.

 

If cmbPipeOrStructure.Text = "" Then
       'clear info
       Dim rb As New ResultBuffer
       rb.Add(New TypedValue(1001, AppName))

       oSelectedObj.XData = rb
       rb.Dispose()
ElseIf.....

Dave O.                                                                  Sig-Logos32.png
Message 7 of 7
wang890
in reply to: chiefbraincloud

yeah that worked. i also read this thread just now and they said you have to specify the app because other people can populate xdata with other app names as well. makes sense. but no way i can find this out on my own without this.

 

thanks you guys

 

http://forums.autodesk.com/t5/NET/Delete-XData/td-p/2280625

 

Stantec
Dell Precision 5530, Prism M320PU, C3D 14/17/19

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