Hi,
I am currently developing a C# .NET 6.0 Apllication that integrates with the Inventor COM API.
Starting Inventor and connecting/interacting with the API works fine. I just don't understand to register custom functions to intercept application events. I found a lot of examples for Addins, but none that use a standalone approach.
With the code below i can connect to Inventor, but the events are not triggering. I know the code is not beautiful, it's still more a sandbox than anything else - but why are my events not firing?
_aeh is an instance of my ApplicationEventsHandler class.
Thank you so much and all the best
internal class InventorAPI
{
[DllImport("ole32.dll")]
static extern int CLSIDFromProgID(
[MarshalAs(UnmanagedType.LPWStr)] string lpszProgID,
out Guid pclsid
);
[DllImport("oleaut32.dll", PreserveSig = false)]
static extern void GetActiveObject(
ref Guid rclsid,
IntPtr pvReserved,
[MarshalAs(UnmanagedType.IUnknown)] out Object ppunk
);
public static object getActiveObject(string progId)
{
Guid clsid;
CLSIDFromProgID(progId, out clsid);
object obj;
GetActiveObject(ref clsid, IntPtr.Zero, out obj);
return obj;
}
public bool connect()
{
Boolean _started = false;
try
{
_invApp = (Application)getActiveObject("Inventor.Application");
Debug.WriteLine("Connected to Inventor");
Connected = true;
}
catch (Exception ex)
{
try
{
Type invAppType = Type.GetTypeFromProgID("Inventor.Application");
_invApp = (Application)Activator.CreateInstance(invAppType);
_invApp.Visible = true;
_started = true;
Connected = true;
}
catch (Exception ex2)
{
Debug.WriteLine(ex2.ToString());
Debug.WriteLine("Unable to get or start Inventor");
Connected = false;
}
}
if (Connected)
{
_invApp = _aeh.Register(_invApp);
InvApp = _invApp;
}
return Connected;
}
}
public class AppEventsHandler
{
public Inventor.Application Register(Inventor.Application _invApp)
{
_invApp.ApplicationEvents.OnTranslateDocument += AppEvent_OnTranslateDocument_Handler;
_invApp.ApplicationEvents.OnTerminateDocument += AppEvent_OnTerminateDocument_Handler;
_invApp.ApplicationEvents.OnSaveDocument += AppEvent_OnSaveDocument_Handler;
_invApp.ApplicationEvents.OnRestart32BitHost += AppEvent_OnRestart32BitHost_Handler;
_invApp.ApplicationEvents.OnReady += AppEvent_OnReady_Handler;
_invApp.ApplicationEvents.OnQuit += AppEvent_OnQuit_Handler;
_invApp.ApplicationEvents.OnOpenDocument += AppEvent_OnOpenDocument_Handler;
_invApp.ApplicationEvents.OnNewView += AppEvent_OnNewView_Handler;
_invApp.ApplicationEvents.OnNewEditObject += AppEvent_OnNewEditObject_Handler;
_invApp.ApplicationEvents.OnNewDocument += AppEvent_OnNewDocument_Handler;
_invApp.ApplicationEvents.OnMigrateDocument += AppEvent_OnMigrateDocument_Handler;
_invApp.ApplicationEvents.OnInitializeDocument += AppEvent_OnInitializeDocument_Handler;
_invApp.ApplicationEvents.OnDocumentChange += AppEvent_OnDocumentChange_Handler;
_invApp.ApplicationEvents.OnDisplayModeChange += AppEvent_OnDisplayModeChange_Handler;
_invApp.ApplicationEvents.OnDeactivateView += AppEvent_OnDeactivateView_Handler;
_invApp.ApplicationEvents.OnDeactivateDocument += AppEvent_OnDeactivateDocument_Handler;
_invApp.ApplicationEvents.OnCloseView += AppEvent_OnCloseView_Handler;
_invApp.ApplicationEvents.OnCloseDocument += AppEvent_OnCloseDocument_Handler;
_invApp.ApplicationEvents.OnApplicationOptionChange += AppEvent_OnApplicationOptionChange_Handler;
_invApp.ApplicationEvents.OnActiveProjectChanged += AppEvent_OnActiveProjectChanged_Handler;
_invApp.ApplicationEvents.OnActivateView += AppEvent_OnActivateView_Handler;
_invApp.ApplicationEvents.OnActivateDocument += AppEvent_OnActivateDocument_Handler;
return _invApp;
}
public void UnRegister(Inventor.Application _invApp)
{
_invApp.ApplicationEvents.OnTranslateDocument -= AppEvent_OnTranslateDocument_Handler;
_invApp.ApplicationEvents.OnTerminateDocument -= AppEvent_OnTerminateDocument_Handler;
_invApp.ApplicationEvents.OnSaveDocument -= AppEvent_OnSaveDocument_Handler;
_invApp.ApplicationEvents.OnRestart32BitHost -= AppEvent_OnRestart32BitHost_Handler;
_invApp.ApplicationEvents.OnReady -= AppEvent_OnReady_Handler;
_invApp.ApplicationEvents.OnQuit -= AppEvent_OnQuit_Handler;
_invApp.ApplicationEvents.OnOpenDocument -= AppEvent_OnOpenDocument_Handler;
_invApp.ApplicationEvents.OnNewView -= AppEvent_OnNewView_Handler;
_invApp.ApplicationEvents.OnNewEditObject -= AppEvent_OnNewEditObject_Handler;
_invApp.ApplicationEvents.OnNewDocument -= AppEvent_OnNewDocument_Handler;
_invApp.ApplicationEvents.OnMigrateDocument -= AppEvent_OnMigrateDocument_Handler;
_invApp.ApplicationEvents.OnInitializeDocument -= AppEvent_OnInitializeDocument_Handler;
_invApp.ApplicationEvents.OnDocumentChange -= AppEvent_OnDocumentChange_Handler;
_invApp.ApplicationEvents.OnDisplayModeChange -= AppEvent_OnDisplayModeChange_Handler;
_invApp.ApplicationEvents.OnDeactivateView -= AppEvent_OnDeactivateView_Handler;
_invApp.ApplicationEvents.OnDeactivateDocument -= AppEvent_OnDeactivateDocument_Handler;
_invApp.ApplicationEvents.OnCloseView -= AppEvent_OnCloseView_Handler;
_invApp.ApplicationEvents.OnCloseDocument -= AppEvent_OnCloseDocument_Handler;
_invApp.ApplicationEvents.OnApplicationOptionChange -= AppEvent_OnApplicationOptionChange_Handler;
_invApp.ApplicationEvents.OnActiveProjectChanged -= AppEvent_OnActiveProjectChanged_Handler;
_invApp.ApplicationEvents.OnActivateView -= AppEvent_OnActivateView_Handler;
_invApp.ApplicationEvents.OnActivateDocument -= AppEvent_OnActivateDocument_Handler;
}
public void AppEvent_OnActivateDocument_Handler(_Document DocumentObject, EventTimingEnum BeforeOrAfter, NameValueMap Context, out HandlingCodeEnum HandlingCode)
{
Debug.WriteLine("OnActivateDocument");
HandlingCode = HandlingCodeEnum.kEventHandled;
}
public void AppEvent_OnActivateView_Handler(Inventor.View ViewObject, EventTimingEnum BeforeOrAfter, NameValueMap Context, out HandlingCodeEnum HandlingCode)
{
Debug.WriteLine("OnActivateView");
HandlingCode = HandlingCodeEnum.kEventHandled;
}
public void AppEvent_OnActiveProjectChanged_Handler(DesignProject ProjectObject, EventTimingEnum BeforeOrAfter, NameValueMap Context, out HandlingCodeEnum HandlingCode)
{
Debug.WriteLine("OnActiveProjectChanged");
HandlingCode = HandlingCodeEnum.kEventHandled;
}
public void AppEvent_OnApplicationOptionChange_Handler(EventTimingEnum BeforeOrAfter, NameValueMap Context, out HandlingCodeEnum HandlingCode)
{
Debug.WriteLine("OnApplicationOptionChange");
HandlingCode = HandlingCodeEnum.kEventHandled;
}
public void AppEvent_OnCloseDocument_Handler(_Document DocumentObject, string FullDocumentName, EventTimingEnum BeforeOrAfter, NameValueMap Context, out HandlingCodeEnum HandlingCode)
{
Debug.WriteLine("OnCloseDocument");
HandlingCode = HandlingCodeEnum.kEventHandled;
}
public void AppEvent_OnCloseView_Handler(Inventor.View ViewObject, EventTimingEnum BeforeOrAfter, NameValueMap Context, out HandlingCodeEnum HandlingCode)
{
Debug.WriteLine("OnCloseView");
HandlingCode = HandlingCodeEnum.kEventHandled;
}
public void AppEvent_OnDeactivateDocument_Handler(_Document DocumentObject, EventTimingEnum BeforeOrAfter, NameValueMap Context, out HandlingCodeEnum HandlingCode)
{
Debug.WriteLine("OnDeactivateDocument");
HandlingCode = HandlingCodeEnum.kEventHandled;
}
public void AppEvent_OnDeactivateView_Handler(Inventor.View ViewObject, EventTimingEnum BeforeOrAfter, NameValueMap Context, out HandlingCodeEnum HandlingCode)
{
Debug.WriteLine("OnDeactivateView");
HandlingCode = HandlingCodeEnum.kEventHandled;
}
public void AppEvent_OnDisplayModeChange_Handler(Inventor.View ViewObject, EventTimingEnum BeforeOrAfter, NameValueMap Context, out HandlingCodeEnum HandlingCode)
{
Debug.WriteLine("OnDisplayModeChange");
HandlingCode = HandlingCodeEnum.kEventHandled;
}
public void AppEvent_OnDocumentChange_Handler(_Document DocumentObject, EventTimingEnum BeforeOrAfter, CommandTypesEnum ReasonsForChange, NameValueMap Context, out HandlingCodeEnum HandlingCode)
{
Debug.WriteLine("OnDocumentChange");
HandlingCode = HandlingCodeEnum.kEventHandled;
}
public void AppEvent_OnInitializeDocument_Handler(_Document DocumentObject, string FullDocumentName, EventTimingEnum BeforeOrAfter, NameValueMap Context, out HandlingCodeEnum HandlingCode)
{
Debug.WriteLine("OnInitializeDocument");
HandlingCode = HandlingCodeEnum.kEventHandled;
}
public void AppEvent_OnMigrateDocument_Handler(_Document DocumentObject, EventTimingEnum BeforeOrAfter, NameValueMap Context, out HandlingCodeEnum HandlingCode)
{
Debug.WriteLine("OnMigrateDocument");
HandlingCode = HandlingCodeEnum.kEventHandled;
}
public void AppEvent_OnNewDocument_Handler(_Document DocumentObject, EventTimingEnum BeforeOrAfter, NameValueMap Context, out HandlingCodeEnum HandlingCode)
{
Debug.WriteLine("OnNewDocument");
HandlingCode = HandlingCodeEnum.kEventHandled;
}
public void AppEvent_OnNewEditObject_Handler(object EditObject, EventTimingEnum BeforeOrAfter, NameValueMap Context, out HandlingCodeEnum HandlingCode)
{
Debug.WriteLine("OnNewEditObject");
HandlingCode = HandlingCodeEnum.kEventHandled;
}
public void AppEvent_OnNewView_Handler(Inventor.View ViewObject, EventTimingEnum BeforeOrAfter, NameValueMap Context, out HandlingCodeEnum HandlingCode)
{
Debug.WriteLine("OnNewView");
HandlingCode = HandlingCodeEnum.kEventHandled;
}
public void AppEvent_OnOpenDocument_Handler(_Document DocumentObject, string FullDocumentName, EventTimingEnum BeforeOrAfter, NameValueMap Context, out HandlingCodeEnum HandlingCode)
{
Debug.WriteLine("OnOpenDocument");
HandlingCode = HandlingCodeEnum.kEventHandled;
}
public void AppEvent_OnQuit_Handler(EventTimingEnum BeforeOrAfter, NameValueMap Context, out HandlingCodeEnum HandlingCode)
{
Debug.WriteLine("OnQuit");
HandlingCode = HandlingCodeEnum.kEventHandled;
}
public void AppEvent_OnReady_Handler(EventTimingEnum BeforeOrAfter, NameValueMap Context, out HandlingCodeEnum HandlingCode)
{
Debug.WriteLine("OnReady");
HandlingCode = HandlingCodeEnum.kEventHandled;
}
public void AppEvent_OnRestart32BitHost_Handler(EventTimingEnum BeforeOrAfter, NameValueMap Context, out HandlingCodeEnum HandlingCode)
{
Debug.WriteLine("OnRestart32BitHost");
HandlingCode = HandlingCodeEnum.kEventHandled;
}
public void AppEvent_OnSaveDocument_Handler(_Document DocumentObject, EventTimingEnum BeforeOrAfter, NameValueMap Context, out HandlingCodeEnum HandlingCode)
{
Debug.WriteLine("OnSaveDocument");
HandlingCode = HandlingCodeEnum.kEventHandled;
}
public void AppEvent_OnTerminateDocument_Handler(_Document DocumentObject, string FullDocumentName, EventTimingEnum BeforeOrAfter, NameValueMap Context, out HandlingCodeEnum HandlingCode)
{
Debug.WriteLine("OnTerminateDocument");
HandlingCode = HandlingCodeEnum.kEventHandled;
}
public void AppEvent_OnTranslateDocument_Handler(bool TranslatingIn, _Document DocumentObject, string FullFileName, EventTimingEnum BeforeOrAfter, NameValueMap Context, out HandlingCodeEnum HandlingCode)
{
Debug.WriteLine("OnTranslateDocument");
HandlingCode = HandlingCodeEnum.kEventHandled;
}
}
}
Solved! Go to Solution.
Solved by Dev_rim. Go to Solution.
Hi there,
To trigger an event, you don't need to return application object again and again.
Lets try this code, you also should use (new) statement.
private Inventor.Application m_inventorApplication;
private Inventor.ApplicationEvents m_appEvents;
public void Main()
{
// You should fill application and Application events object here. Its important, you have to Delcare them above the function but inside of the class.
m_inventorApplication = application;
m_appEvents = m_inventorApplication.ApplicationEvents;
// Then if you need you can activate(start or trigger) the event.
Activate();
}
public void Activate()
{
//Its important, You need to fill them with "new" and then Sink_Handler and the name of the function.
m_appEvents.OnActivateDocument += new ApplicationEventsSink_OnActivateDocumentEventHandler (ApplicationEvents_OnActivateDocument);
}
public void Deactivate()
{
m_appEvents.OnActivateDocument -= new ApplicationEventsSink_OnActivateDocumentEventHandler(ApplicationEvents_OnActivateDocument);
}
private void ApplicationEvents_OnActivateDocument(_Document DocumentObject,EventTimingEnum BeforeOrAfter, NameValueMap Context, out HandlingCodeEnum HandlingCode)
{
//Here is inside of the event. If you want to reach more info, i will share an article below this code peace.
HandlingCode = Inventor.HandlingCodeEnum.kEventNotHandled;
if (BeforeOrAfter !=Inventor.EventTimingEnum.kAfter)
return;
HandlingCode = Inventor.HandlingCodeEnum.kEventHandled;
Console.WriteLine("OnActivateDocument");
}
Also, maybe you want to see this article:
https://modthemachine.typepad.com/my_weblog/2013/07/inventor-events-using-net-3-examples.html
Regards
Devrim
Thank you so much! I have integrated your recommendations and went with your code example and it works!
Awesome, thank you so much!!!
Can't find what you're looking for? Ask the community or share your knowledge.