如何为Revit编写多线程插件

本文关键字:多线程 插件 Revit | 更新日期: 2023-09-27 18:19:06

对于Revit插件,我编写了以下代码:

public Result Execute(ExternalCommandData commandData,
                       ref string message, ElementSet elements)
    {
        try
        {
            Global.GetInstance(commandData);
            message = "Studio Launcher";
            var mw = new MainWindow();
            mw.ShowDialg();
        }
        catch (Exception)
        {
            TaskDialog.Show("Failure", "Please Open or Create a document");
            return Result.Failed;
        }
        return Result.Succeeded;
    }

在这个插件中,MainWindow是一个用户交互的ui,一些事务在那里发生。
它的工作魅力,但形式不是模态,因为插件是在同一线程作为Revit本身。为了提供一个非模态窗口,我将mw.ShowDialg();更改为mw.Show();。虽然插件成功启动,主窗口变成非模态,用户能够与插件和Revit在同一时间进行交互,当我在主窗口打开一个事务,Revit崩溃,因为Execute()方法在打开该事务之前被终止。

请帮助我,如果有任何方法来开发一个多线程插件的revit。

如何为Revit编写多线程插件

查看Building Coder博客中关于该主题的一长串讨论。如果你只是想要一个非模态对话框,那么可以使用ExternalEvents或idle Events。然而,如果你想同时运行多个线程,那么你就不走运了,因为Revit API不允许它。

Matt是绝对正确的。Revit API根本不支持多线程。使用Revit API需要一个有效的API上下文,这只在Revit事件处理程序中提供,例如Application。OnStartup, external event Execute, DMO Execute等

解决方法是使用外部事件。ModelessDialog/ModelessForm_ExternalEvent示例提供了一个示例,并且关于此的详细讨论的长列表由Building Coder主题组提供,该主题组针对非模态访问和从外部驱动Revit的空转和外部事件:

5.28 http://thebuildingcoder.typepad.com/blog/about-the-author.html