【问题标题】:Check if Revit is ready to be closed检查 Revit 是否已准备好关闭
【发布时间】:2013-03-21 23:00:12
【问题描述】:

首先我为任何拼写错误等道歉。英语不是我的第一语言:)

我已经为 Revit 编写了一个插件,现在正在为插件进行自动更新。我已经对更新进行了排序,但我偶然发现了一个小问题。

我正在检查 Revit 启动时的更新(当 Revit 创建插件应用程序时)

    public Result OnStartup(UIControlledApplication application)
    {
        Result result = CreateApplication(application);
        if (result == Result.Succeeded)
        {
            UpdateService updates = new UpdateService();
            try
            {
                updates.ManageUpdates(application);
            }
            catch (Exception ex)
            {
                NotificationManager.Notify("error", ex.InnerException.Message, messageType.error);
            }
        }
        return result;
    }

如果有可用更新,我会向用户显示一条消息,询问他/她是否想要更新。如果是,我想为他们关闭 Revit 并开始更新。

问题是此时 Revit 还没有完成自身加载,如果我以编程方式关闭它,它会抛出一个错误,因为它还没有准备好再关闭 5 秒。

System.Threading.Thread.Sleep(5000);

可以解决我机器上的问题,但不一定能解决用户问题,所以我需要一种方法来检查 Revit 是否准备好关闭(处于允许关闭的状态)。

所以问题是:有没有办法检查 Revit 是否可以关闭?有没有人遇到过这样的问题并解决了?

(我知道我可以在用户关闭 Revit 时检查更新,但这并不理想......

有什么想法吗?

【问题讨论】:

    标签: revit revit-api


    【解决方案1】:

    您可以尝试订阅 ApplicationIntitialized 事件 - 我敢打赌,只有在 Revit 完全加载时才会触发。

    来自文档:

    该事件在 Revit 作为完全初始化启动后引发,包括外部应用程序的初始化。

    所以...在您的 OnStartup 方法中,执行以下操作:

    public Result OnStartup(UIControlledApplication application)
    {
        Result result = CreateApplication(application);
        if (result == Result.Succeeded)
        {
            application.Application.ApplicationInitialized += new EventHandler(delegate (Object o, ApplicationInitializedEventArgs a) {
                // this code will be deferred until the application is initialized
                UpdateService updates = new UpdateService();
                try
                {
                    updates.ManageUpdates(application);
                }
                catch (Exception ex)
                {
                    NotificationManager.Notify("error", ex.InnerException.Message, messageType.error);
                }
            });
        }
        return result;
    }
    

    编辑:我没有注意到我指的是 Revit 2013 API 参考并且错过了 2012 没有 ApplicationInitialized 事件。在这种情况下,您可以尝试连接到 DocumentOpeningIdling 事件之一,这会让您不知道应用程序 初始化,但遗憾的是,此时用户正在正要做某事,这可能会让他生气。

    如果在没有打开文档的情况下触发 Idling 事件会很有趣 - 这可能会解决您的问题。您可以尝试一下并报告吗?

    【讨论】:

    • 感谢您的帮助 :) 我已将此标记为答案,因为这确实是解决我遇到的问题的好方法...如果您碰巧使用 Revit API 2013 :) 不幸的是我需要支持 2012 年所以仍然必须找到解决方案...谢谢 :)
    猜你喜欢
    • 2014-06-30
    • 2018-03-12
    • 2021-11-20
    • 1970-01-01
    • 2010-11-14
    • 2019-08-20
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    相关资源
    最近更新 更多