对于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();
。尽管插件成功启动并且MainWindow变为无模式且用户能够同时与插件和Revit交互,但当我在MainWindow中打开事务时,revit崩溃,因为Execute()方法在打开该事务之前终止。
如果有任何方法可以为revit开发多线程插件,请帮助我。
答案 0 :(得分:3)
请参阅Building Coder blog以获取有关该主题的长长讨论列表。如果您希望能够拥有无模式对话框,则可以使用ExternalEvents或空闲事件。但是,如果您希望同时运行多个线程,那么您就不幸了,因为Revit API不允许它。
答案 1 :(得分:2)
马特是绝对正确的。 Revit API根本不支持多线程。使用Revit API需要有效的API上下文,并且仅在Revit事件处理程序中提供,例如, Application.OnStartup,外部事件执行,DMO执行等
解决方法是使用外部事件。 ModelessDialog / ModelessForm_ExternalEvent示例提供了一个示例,有关此的详细讨论列表由The Building Coder主题组提供,用于无模式访问和从外部驱动Revit的外部事件:
http://thebuildingcoder.typepad.com/blog/about-the-author.html#5.28