.NET

Reply
Distinguished Contributor
JanetDavidson
Posts: 139
Registered: ‎08-23-2011
Message 1 of 20 (361 Views)
Accepted Solution

Can't find ModelessOperationWill Start Event in Dot net

361 Views, 19 Replies
05-04-2012 05:06 AM

Hello everybody. Hope somebody could help me

In objectArx  Editor  object has  ModelessOperationWillStart . But how could I use this in my vb net ?

ObjectBrowser doesn't show it ?!!!

Janet.

 

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.

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
*Expert Elite*
norman.yuan
Posts: 1,049
Registered: ‎04-27-2009
Message 2 of 20 (352 Views)

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

05-04-2012 06:40 AM in reply to: JanetDavidson

I believe modelessOperationWillStart() is an ObjectRAX's AcEditorReactor class' methos, which is only available since Acad2013. It is not exposed to ObjectARX .NET API (as we all know that not everything in ObjectARX is exposed in its .NET API). thus you do not find it in the Object Browser.

Moderator
Alexander.Rivilis
Posts: 1,449
Registered: ‎04-09-2008
Message 3 of 20 (348 Views)

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

05-04-2012 07:50 AM in reply to: norman.yuan

norman.yuan wrote:

I believe modelessOperationWillStart() is an ObjectRAX's AcEditorReactor class' methos, which is only available since Acad2013. It is not exposed to ObjectARX .NET API (as we all know that not everything in ObjectARX is exposed in its .NET API). thus you do not find it in the Object Browser.


Norman! This method (modelessOperationWillStart) available starting with version AutoCAD 2000 (!!!) but not yet exposed in .NET

Without ObjectARX there is no way to have modelessOperation notification.

 

 


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

*Expert Elite*
norman.yuan
Posts: 1,049
Registered: ‎04-27-2009
Message 4 of 20 (342 Views)

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

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

Well, I am not very familiar with ObjectARX. But that method and/or the class (the method's owner) have been renamed in Acad2013. In this snse, one can say it is only available in Acad2013. Just like, there is a class called Person with method Run, in early version. Then in new version you rename the class Person to Human (for good or bad reasons). So, you cannot say Human.Run(0 exists since beginning in regard to programming API.

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

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

05-04-2012 08:37 AM in reply to: norman.yuan

it is really a pain.

 I like to check if user change block  attributes in Properties Window (palette) . and I don't want to have an objectmodify event all the time running . that is a shame we can't do this using API.

Janet

 

Moderator
Alexander.Rivilis
Posts: 1,449
Registered: ‎04-09-2008
Message 6 of 20 (332 Views)

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

05-04-2012 10:01 AM in reply to: norman.yuan

norman.yuan wrote:

Well, I am not very familiar with ObjectARX. But that method and/or the class (the method's owner) have been renamed in Acad2013. In this snse, one can say it is only available in Acad2013. Just like, there is a class called Person with method Run, in early version. Then in new version you rename the class Person to Human (for good or bad reasons). So, you cannot say Human.Run(0 exists since beginning in regard to programming API.


Sorry, Norman, but you're wrong! The name of class (and base class) and name of method and parameters are the same in ObjectARX 2000 and 2013. The only difference is that this function in AutoCAD 2000 exported from acad.exe, and in 2013 from accore.dll. I skip "unicode revolution" in AutoCAD 2007.

//
// ObjectARX SDK 2000
// file aced.h
//
class AcEditorReactor: public AcRxEventReactor 
{ 
public:
//// skiped
    virtual void modelessOperationWillStart(const char* contextStr);
    virtual void modelessOperationEnded(const char* contextStr);
//// skiped
};

//
// ObjectARX SDK 2013
// file aced.h
//

class AcEditorReactor: public AcRxEventReactor 
{ 
public:
//// skiped
    virtual void modelessOperationWillStart(const ACHAR* contextStr);
    virtual void modelessOperationEnded(const ACHAR* contextStr);
//// skiped
};

 You admit your mistake:smileyhappy:

 


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

Moderator
Alexander.Rivilis
Posts: 1,449
Registered: ‎04-09-2008
Message 7 of 20 (331 Views)

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

05-04-2012 10:12 AM in reply to: JanetDavidson

Janet!

What about user change attribute(s) not from properties palette but (for example) with help of command _ATTEDIT  ?

 


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

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

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

05-04-2012 11:55 AM in reply to: Alexander.Rivilis

Hi again Alex and Norman.

I took care at that part (attedit) .  I  am watching  commandstart event, If it is attedit then I start  objectmodify event and if the object being modified is target block, I do necessary things I need to do . But for properties palette there is no command to catch. So basically I have to have objectmodify , on,  to watch the database all the times. there is big impact on database in my application.

Janet

Moderator
Alexander.Rivilis
Posts: 1,449
Registered: ‎04-09-2008
Message 9 of 20 (317 Views)

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

05-04-2012 12:59 PM in reply to: JanetDavidson

Janet. Are you ready to create arx-file (ie study C++ and ObjectARX) , which help you to check object was modified from OPM or no?

If your's answer is NO, than single solution is objectmodify event, which must be simplest in order to speed up AutoCAD.

If your's answer is YES, I can help you in ObjectARX discussion group.


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

Moderator
Alexander.Rivilis
Posts: 1,449
Registered: ‎04-09-2008
Message 10 of 20 (286 Views)

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

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

I've attach arx-files which exported function:

int IsOPMChangeProps();

This function can be P/Invoke from .NET (C#, VB.NET, etc.) Solution is for AutoCAD 2010...2012

[DllImport("OPMTest2010x32.arx",CallingConvention = CallingConvention.Cdecl, EntryPoint = "IsOPMChangeProps")]
private static int IsOPMChangeProps2010x32();
[DllImport("OPMTest2010x64.arx",CallingConvention = CallingConvention.Cdecl, EntryPoint = "IsOPMChangeProps")]
private static int IsOPMChangeProps2010x64();

arx-file must be loaded with help of call:

// For x86 (x32)
SystemObjects.DynamicLinker.LoadModule("OPMTest2010x32.arx", false, false);
// For x64
SystemObjects.DynamicLinker.LoadModule("OPMTest2010x64.arx", false, false);

But objectModified event must being active because this function can check status but not event (reactor).  

 


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

Post to the Community

Have questions about Autodesk products? Ask the community.

New Post
Announcements
Are You Going To Be @ AU 2014? Feel free to drop by our AU topic post and share your plans, plug a class that you're teaching, or simply check out who else from the community might be in attendance. Ohh and don't forgot to stop by the Autodesk Help | Learn | Collaborate booths in the Exhibit Hall and meet our community team if you get a chance!