.NET

Reply
Distinguished Contributor
JanetDavidson
Posts: 139
Registered: ‎08-23-2011
Message 11 of 20 (370 Views)

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.

 

 

Distinguished Contributor
JanetDavidson
Posts: 139
Registered: ‎08-23-2011
Message 12 of 20 (362 Views)

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

 

Moderator
Alexander.Rivilis
Posts: 1,417
Registered: ‎04-09-2008
Message 13 of 20 (354 Views)

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

Distinguished Contributor
JanetDavidson
Posts: 139
Registered: ‎08-23-2011
Message 14 of 20 (352 Views)

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.

 

Moderator
Alexander.Rivilis
Posts: 1,417
Registered: ‎04-09-2008
Message 15 of 20 (335 Views)

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

Distinguished Contributor
JanetDavidson
Posts: 139
Registered: ‎08-23-2011
Message 16 of 20 (328 Views)

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.

 

 

Moderator
Alexander.Rivilis
Posts: 1,417
Registered: ‎04-09-2008
Message 17 of 20 (326 Views)

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

Distinguished Contributor
JanetDavidson
Posts: 139
Registered: ‎08-23-2011
Message 18 of 20 (321 Views)

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.

 

 

Moderator
Alexander.Rivilis
Posts: 1,417
Registered: ‎04-09-2008
Message 19 of 20 (308 Views)

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

Distinguished Contributor
JanetDavidson
Posts: 139
Registered: ‎08-23-2011
Message 20 of 20 (303 Views)

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

 

Need installation help?

Start with some of our most frequented solutions or visit the Installation and Licensing Forum to get help installing your software.