Событие синхронизации Revit

Начиная с этого... https://github.com/jeremytammik/RevitLookup/blob/master/CS/EventTrack/Events/ApplicationEvents.cs

Я пытаюсь добавить прослушиватель событий для события синхронизации. приведенный ниже код выдает ошибку о том, что m_app имеет значение null. Могу ли я не подписаться на это событие во время запуска Revit?

Я мог сделать это раньше с application.ViewActivated += ..... Мне интересно, имеет ли это какое-то отношение к событиям, управляемым БД и пользовательским интерфейсом, и когда на них разрешено подписываться? Я просто не знаю.

  namespace RevitModelHealth
{
    public class checkHealth : IExternalApplication
    {
        // Document doc;
        static public Autodesk.Revit.ApplicationServices.Application m_app = null;

        public Result OnShutdown(UIControlledApplication application)
        {
            return Result.Succeeded;
        }

        public Result OnStartup(UIControlledApplication application)
        {

            m_app.DocumentSynchronizingWithCentral += new EventHandler<DocumentSynchronizingWithCentralEventArgs>(m_app_DocumentSavingToCentral);
            return Result.Succeeded;
        }

        void m_app_DocumentSavingToCentral(object sender, Autodesk.Revit.DB.Events.DocumentSynchronizingWithCentralEventArgs e)
        {
            MessageBox.Show("asd","asd");
        }

    }
}

Вот обновленный код, отражающий мой ответ на первый ответ. Окно сообщения открывается при загрузке документа. При попытке инициализировать обработчики событий синхронизации никаких ошибок не возникает, однако ни одно из окон сообщений не открывается ни до, ни после события синхронизации.

  public class checkHealth : IExternalApplication
    {
        // Document doc;
        static public Autodesk.Revit.ApplicationServices.Application m_app;


        public Result OnShutdown(UIControlledApplication application)
        {
            return Result.Succeeded;
        }

        public Result OnStartup(UIControlledApplication application)
        {
            application.ControlledApplication.DocumentOpened += new EventHandler<DocumentOpenedEventArgs>(app_DocOpened);
            return Result.Succeeded;
        }

        public void app_DocOpened(object sender, DocumentOpenedEventArgs args)
        {
            MessageBox.Show("asd","asd");

            m_app.DocumentSynchronizingWithCentral += new EventHandler<DocumentSynchronizingWithCentralEventArgs>(m_app_DocumentSavingToCentral);
            m_app.DocumentSynchronizedWithCentral += new EventHandler<Autodesk.Revit.DB.Events.DocumentSynchronizedWithCentralEventArgs>(m_app_DocumentSavedToCentral);
        }

        void m_app_DocumentSavingToCentral(object sender, Autodesk.Revit.DB.Events.DocumentSynchronizingWithCentralEventArgs e)
        {
            MessageBox.Show("sync", "sync");
        }

        void m_app_DocumentSavedToCentral(object sender, Autodesk.Revit.DB.Events.DocumentSynchronizedWithCentralEventArgs e)
        {
            MessageBox.Show("Doone", "Done");
        }
    }

это сработало... Частично благодаря примеру проекта SDK EventsMonitor

namespace RevitModelHealth
{
    public class checkHealth : IExternalApplication
    {


        public Result OnShutdown(UIControlledApplication application)
        {
            return Result.Succeeded;
        }

        public Result OnStartup(UIControlledApplication application)
        {
            application.ControlledApplication.DocumentSynchronizingWithCentral += new EventHandler<DocumentSynchronizingWithCentralEventArgs>(app_syncStart);
            application.ControlledApplication.DocumentSynchronizedWithCentral += new EventHandler<DocumentSynchronizedWithCentralEventArgs>(app_syncOver);
            return Result.Succeeded;
        }

        public void app_syncStart(object o ,DocumentSynchronizingWithCentralEventArgs args)
        {
            MessageBox.Show("","Stasrting");
        }

        public void app_syncOver(object o,DocumentSynchronizedWithCentralEventArgs args)
        {
            MessageBox.Show("", "Over");
        }

    }

}

person Skinner    schedule 04.02.2019    source источник


Ответы (1)


Пытаться

application.ControlledApplication.DocumentSynchronizingWithCentral += new EventHandler<DocumentSynchronizingWithCentralEventArgs>(m_app_DocumentSavingToCentral)

в вашем методе OnStartup().

Вызов завершается ошибкой, так как член экземпляра m_app инициализирован нулевым значением.

Объект UIApplication.ControlledApplication, который вызывает DocumentSynchronizingWithCentralEventArgs доступен из параметра OnStartup.

person Shea    schedule 04.02.2019
comment
Благодарю вас. Но событие находится не в пространстве UIControlledApplication, а в пространстве ApplicationServices.Application. Я могу зарегистрировать событие DocumentOpened и из этой функции создать новый обработчик событий без исключений, однако событие не срабатывает при синхронизации. Я обновлю код, чтобы проиллюстрировать... - person Skinner; 04.02.2019