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

    .NET

    Reply
    Distinguished Contributor
    JanetDavidson
    Posts: 139
    Registered: ‎08-23-2011

    Re: Can't find ModelessOperationWill Start Event in Dot net

    05-07-2012 05:18 AM in reply to: JanetDavidson

    Hi Alex,

    Oh my God , You are so caring. I had a moving this weekend and couldn't check on internet the whole 3 days.

    Right now I am back on track. Still I didn't get into your posts but I  will . Just wanted to let you know I  am really

    appreciated . I will look and If I have question I will ask you for sure if you don't mind.

    Thanks you so much for your help Alex.

    Janet.

     

     

    Please use plain text.
    Distinguished Contributor
    JanetDavidson
    Posts: 139
    Registered: ‎08-23-2011

    Re: Can't find ModelessOperationWill Start Event in Dot net

    05-07-2012 08:07 AM in reply to: Alexander.Rivilis

    Hi Again Alex . I didn't understand one word of c++ code you provided, It is my fault , no offence , I am not that smart .  I said to myself   let's just use Alex's Arx compiled file  and implement it in my project. Below code  is what I did . But it doesn't work. what did I do wrong ? .

     

    Let me rephrase myself to avoid any confustion.

    this is how  I implement this for Attedit command. When commandStart triggers . If the command is Attedit I add handler for objectmodify event.

    If object had any changes then I do my stuff . And then when CommandEnded  triggers ,I remove ObjectModify handler.

    so basically Commandstart and Commandend events always running. But ObjectModify doesn't run always.

     

    Now let's go back to your solution for properties palette. How would I know user start changing an atrribute so I active the objectmodify event ?

    Please give me some light here . Thanks.

     

     

     

     

     

     

     

      Public Sub Initialize() Implements IExtensionApplication.Initialize
          SystemObjects.DynamicLinker.LoadModule("c:\OPMTest2010x64.arx", False, False)
           Properties_palette_changed_helper.Start_monitoring_pallette()
        End Sub
        Public Sub Terminate() Implements IExtensionApplication.Terminate
        End Sub
    
    
    
    Public Class Properties_palette_changed_helper
        <DllImport("OPMTest2010x64.arx", CallingConvention:=CallingConvention.Cdecl, EntryPoint:="IsOPMChangeProps")> _
        Private Shared Function IsOPMChangeProps2010x64() As Integer
        End Function
        Public Shared Sub Start_monitoring_pallette()
            Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(vbLf & IsOPMChangeProps2010x64.ToString)
        End Sub
    End Class

     

    Please use plain text.
    Moderator
    Alexander.Rivilis
    Posts: 1,168
    Registered: ‎04-09-2008

    Re: Can't find ModelessOperationWill Start Event in Dot net

    05-07-2012 10:53 AM in reply to: JanetDavidson

    Hi, Janet!

    You do not understand me. The function that I wrote allows you to check whether the entity has changed with the Properties Palette (OPM) or not. But it is not an event and does not allow him to subscribe to the event.
    If you are not interested in how the entity has been changed - you do not need this function.
    In order to make the event ModelessOperationWillStart / ModelessOperationEnd need to write .NET wrapper with Mixed C++, what I'm not an expert. Sorry!


    Пожалуйста не забывайте про Утвердить в качестве решения!Утвердить в качестве решения и Give Kudos!Баллы
    Please remember to Accept Solution!Accept as Solution and Give Kudos!Kudos

    Please use plain text.
    Distinguished Contributor
    JanetDavidson
    Posts: 139
    Registered: ‎08-23-2011

    Re: Can't find ModelessOperationWill Start Event in Dot net

    05-07-2012 11:19 AM in reply to: Alexander.Rivilis

    Anyways. At least you look into it. That is nice of you.

    Maybe somebody else  from autodesk help us. Now is the time we see lack of Tony Tanzilla in this forum .

    So many unanswered question.

    Cheers Janet.

     

    Please use plain text.
    Moderator
    Alexander.Rivilis
    Posts: 1,168
    Registered: ‎04-09-2008

    Re: Can't find ModelessOperationWill Start Event in Dot net

    05-07-2012 03:23 PM in reply to: JanetDavidson

    Hi Janet!

    I've found solution without mixed C++. Try it. I've attached two solution. First - create arx-files (OPMTest2010x32.arx and OPMTest2010x64.arx). Second - create .NET-assembly which use arx-files (from first solution) in order to set own event handlers.

    using System;
    using System.Runtime.InteropServices;
    using Autodesk.AutoCAD.Runtime;
    using Autodesk.AutoCAD.ApplicationServices;
    using Autodesk.AutoCAD.DatabaseServices;
    using Autodesk.AutoCAD.Geometry;
    using Autodesk.AutoCAD.EditorInput;
    
    // This line is not mandatory, but improves loading performances
    [assembly: CommandClass(typeof(COPMEvent.MyCommands))]
    
    namespace COPMEvent
    {
    
        // This class is instantiated by AutoCAD for each document when
        // a command is called by the user the first time in the context
        // of a given document. In other words, non static data in this class
        // is implicitly per-document!
        public class MyCommands
        {
            [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
            public delegate void OPMChangeEvent();
    
            [DllImport("OPMTest2010x32.arx", CallingConvention = CallingConvention.Cdecl, EntryPoint = "SetOPMChangeStart")]
            private static extern void SetOPMChangeStart32(OPMChangeEvent callBackFunc);
            [DllImport("OPMTest2010x64.arx", CallingConvention = CallingConvention.Cdecl, EntryPoint = "SetOPMChangeStart")]
            private static extern void SetOPMChangeStart64(OPMChangeEvent callBackFunc);
            [DllImport("OPMTest2010x32.arx", CallingConvention = CallingConvention.Cdecl, EntryPoint = "SetOPMChangeStop")]
            private static extern void SetOPMChangeStop32(OPMChangeEvent callBackFunc);
            [DllImport("OPMTest2010x64.arx", CallingConvention = CallingConvention.Cdecl, EntryPoint = "SetOPMChangeStop")]
            private static extern void SetOPMChangeStop64(OPMChangeEvent callBackFunc);
    
            private static void SetOPMChangeStart(OPMChangeEvent callBackFunc)
            {
                if (IntPtr.Size == 4) SetOPMChangeStart32(callBackFunc);
                else SetOPMChangeStart64(callBackFunc);
            }
            private static void SetOPMChangeStop(OPMChangeEvent callBackFunc)
            {
                if (IntPtr.Size == 4) SetOPMChangeStop32(callBackFunc);
                else SetOPMChangeStop64(callBackFunc);
            }
    
            private void OPMChangeEventStart()
            {
                // For testing only
                Application.ShowAlertDialog("OPMEventStart - Begin Editing");
            }
            private void OPMChangeEventStop()
            {
                // For testing only
                Application.ShowAlertDialog("OPMEventStop - Stop Editing");
            }
    
            private static OPMChangeEvent callBackFuncStart = null;
            private static OPMChangeEvent callBackFuncStop = null;
            // Modal Command with localized name
    
            
            [CommandMethod("SetOPMEvent")]
            public void SetOPMEvent() // This method can have any name
            {
                callBackFuncStart = new OPMChangeEvent(OPMChangeEventStart);
                callBackFuncStop  = new OPMChangeEvent(OPMChangeEventStop);
                SetOPMChangeStart(callBackFuncStart); SetOPMChangeStop(callBackFuncStop);
            }
    
            [CommandMethod("ResetOPMEvent")]
            public void ResetOPMEvent() // This method can have any name
            {
                callBackFuncStart = null;
                callBackFuncStop = null;
                SetOPMChangeStart(callBackFuncStart); SetOPMChangeStop(callBackFuncStop);
            }
    
    
        }
    
    }
    

    Select any entity and try change it with Properties Palette.


    Пожалуйста не забывайте про Утвердить в качестве решения!Утвердить в качестве решения и Give Kudos!Баллы
    Please remember to Accept Solution!Accept as Solution and Give Kudos!Kudos

    Please use plain text.
    Distinguished Contributor
    JanetDavidson
    Posts: 139
    Registered: ‎08-23-2011

    Re: Can't find ModelessOperationWill Start Event in Dot net

    05-08-2012 06:56 AM in reply to: Alexander.Rivilis

    Hi Alex.

    I really don't know how to make it up to you , for all your consideration. Thanks

     

    I tried to convert your code to vb. ( using those online translators.

    the only part I  couldn't translate is

     

      

        [CommandMethod("SetOPMEvent")]
            public void SetOPMEvent() // This method can have any name
            {
                callBackFuncStart = new OPMChangeEvent(OPMChangeEventStart);
                callBackFuncStop  = new OPMChangeEvent(OPMChangeEventStop);
                SetOPMChangeStart(callBackFuncStart); SetOPMChangeStop(callBackFuncStop);
            }
    
    

     

     

     

     

     

     

     

     

     I am pretty sure you can handle vb if you know C# and c++

     

    I just know vb

     

    Thanks again Alex.

    Regards,

    Janet.

     

     

    Please use plain text.
    Moderator
    Alexander.Rivilis
    Posts: 1,168
    Registered: ‎04-09-2008

    Re: Can't find ModelessOperationWill Start Event in Dot net

    05-08-2012 07:12 AM in reply to: JanetDavidson

    With help of http://www.developerfusion.com/tools/convert/csharp-to-vb/ you can get the same as I:

    Imports System.Runtime.InteropServices
    Imports Autodesk.AutoCAD.Runtime
    Imports Autodesk.AutoCAD.ApplicationServices
    Imports Autodesk.AutoCAD.DatabaseServices
    Imports Autodesk.AutoCAD.Geometry
    Imports Autodesk.AutoCAD.EditorInput
     
    ' This line is not mandatory, but improves loading performances
    <Assembly: CommandClass(GetType(COPMEvent.MyCommands))> 
     
    Namespace COPMEvent
     
        ' This class is instantiated by AutoCAD for each document when
        ' a command is called by the user the first time in the context
        ' of a given document. In other words, non static data in this class
        ' is implicitly per-document!
        Public Class MyCommands
            <UnmanagedFunctionPointer(CallingConvention.Cdecl)> _
            Public Delegate Sub OPMChangeEvent()
     
            <DllImport("OPMTest2010x32.arx", CallingConvention:=CallingConvention.Cdecl, EntryPoint:="SetOPMChangeStart")> _
            Private Shared Sub SetOPMChangeStart32(callBackFunc As OPMChangeEvent)
            End Sub
            <DllImport("OPMTest2010x64.arx", CallingConvention:=CallingConvention.Cdecl, EntryPoint:="SetOPMChangeStart")> _
            Private Shared Sub SetOPMChangeStart64(callBackFunc As OPMChangeEvent)
            End Sub
            <DllImport("OPMTest2010x32.arx", CallingConvention:=CallingConvention.Cdecl, EntryPoint:="SetOPMChangeStop")> _
            Private Shared Sub SetOPMChangeStop32(callBackFunc As OPMChangeEvent)
            End Sub
            <DllImport("OPMTest2010x64.arx", CallingConvention:=CallingConvention.Cdecl, EntryPoint:="SetOPMChangeStop")> _
            Private Shared Sub SetOPMChangeStop64(callBackFunc As OPMChangeEvent)
            End Sub
     
            Private Shared Sub SetOPMChangeStart(callBackFunc As OPMChangeEvent)
                If IntPtr.Size = 4 Then
                    SetOPMChangeStart32(callBackFunc)
                Else
                    SetOPMChangeStart64(callBackFunc)
                End If
            End Sub
            Private Shared Sub SetOPMChangeStop(callBackFunc As OPMChangeEvent)
                If IntPtr.Size = 4 Then
                    SetOPMChangeStop32(callBackFunc)
                Else
                    SetOPMChangeStop64(callBackFunc)
                End If
            End Sub
     
            Private Sub OPMChangeEventStart()
                ' For testing only
                Application.ShowAlertDialog("OPMEventStart - Begin Editing")
            End Sub
            Private Sub OPMChangeEventStop()
                ' For testing only
                Application.ShowAlertDialog("OPMEventStop - Stop Editing")
            End Sub
     
            Private Shared callBackFuncStart As OPMChangeEvent = Nothing
            Private Shared callBackFuncStop As OPMChangeEvent = Nothing
            ' Modal Command with localized name
     
     
            <CommandMethod("SetOPMEvent")> _
            Public Sub SetOPMEvent()
                ' This method can have any name
                callBackFuncStart = New OPMChangeEvent(AddressOf OPMChangeEventStart)
                callBackFuncStop = New OPMChangeEvent(AddressOf OPMChangeEventStop)
                SetOPMChangeStart(callBackFuncStart)
                SetOPMChangeStop(callBackFuncStop)
            End Sub
     
            <CommandMethod("ResetOPMEvent")> _
            Public Sub ResetOPMEvent()
                ' This method can have any name
                callBackFuncStart = Nothing
                callBackFuncStop = Nothing
                SetOPMChangeStart(callBackFuncStart)
                SetOPMChangeStop(callBackFuncStop)
            End Sub
     
     
        End Class
     
    End Namespace

    Пожалуйста не забывайте про Утвердить в качестве решения!Утвердить в качестве решения и Give Kudos!Баллы
    Please remember to Accept Solution!Accept as Solution and Give Kudos!Kudos

    Please use plain text.
    Distinguished Contributor
    JanetDavidson
    Posts: 139
    Registered: ‎08-23-2011

    Re: Can't find ModelessOperationWill Start Event in Dot net

    05-08-2012 07:54 AM in reply to: Alexander.Rivilis

    Alex,

    you are incredible. Now in vb editor I am error free.

    I ran the command and right after I hit enter

    I get this


    ************** Exception Text **************
    System.EntryPointNotFoundException: Unable to find an entry point named 'SetOPMChangeStart' in DLL 'OPMTest2010x64.arx'.
       at VBOPMEvent.COPMEvent.MyCommands.SetOPMChangeStart64(OPMChangeEvent callBackFunc)
       at VBOPMEvent.COPMEvent.MyCommands.SetOPMEvent() in C:\VBOPMEvent\myCommands.vb:line 69
       at Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorker(MethodInfo mi, Object commandObject, Boolean bLispFunction)
       at Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorkerWithExceptionFilter(MethodInfo mi, Object commandObject, Boolean bLispFunction)
       at Autodesk.AutoCAD.Runtime.PerDocumentCommandClass.Invoke(MethodInfo mi, Boolean bLispFunction)
       at Autodesk.AutoCAD.Runtime.CommandClass.CommandThunk.Invoke()

     

     

    and Alex line 69 is this line

    SetOPMChangeStop(callBackFuncStop)

     

     

    my system is 2012 64 bit.

     

    Cheers,

    Janet.

     

     

    Please use plain text.
    Moderator
    Alexander.Rivilis
    Posts: 1,168
    Registered: ‎04-09-2008

    Re: Can't find ModelessOperationWill Start Event in Dot net

    05-08-2012 09:57 AM in reply to: JanetDavidson

    Are you sure you used the correct version of OPMTest2010x64.arx?
    I just rechecked with AutoCAD 2012 x64 - no errors.

    The correct version is: http://forums.autodesk.com/autodesk/attachments/autodesk/152/28761/2/OPMTest.zip


    Пожалуйста не забывайте про Утвердить в качестве решения!Утвердить в качестве решения и Give Kudos!Баллы
    Please remember to Accept Solution!Accept as Solution and Give Kudos!Kudos

    Please use plain text.
    Distinguished Contributor
    JanetDavidson
    Posts: 139
    Registered: ‎08-23-2011

    Re: Can't find ModelessOperationWill Start Event in Dot net

    05-08-2012 10:27 AM in reply to: Alexander.Rivilis

    Don't kill me  Alex,

    you were right.

    Sorry . I am a girl .

     

    You are really my hero.

    I think autodesk should be proud of you.

     

    It works like a charm

     

    Please use plain text.