我在这里使用方法http://teocomi.com/export-revit-warnings-list-from-api/并从应用程序宏方法调用它来导出rvt文件文件夹的警告:
public async void ExportWarningHTML()
{
Autodesk.Revit.UI.UIApplication uiapp = this;
Document doc = uiapp.ActiveUIDocument.Document;
// Input Directory
string inputDir = @"C:\input";
// Output Directory
string outputDir = @"C:\output";
//Get files from inputDir
string[] files = Directory.GetFiles(inputDir, "*.rvt");
// Set open options to detach from central and preserve ws
OpenOptions openOptions = new OpenOptions();
openOptions.DetachFromCentralOption = DetachFromCentralOption.DetachAndPreserveWorksets;
// Process each *.rvt file in folder
// Naive approach. DOES NOT WORK.
foreach(string file in files)
{
// Get current doc
var docLast = uiapp.ActiveUIDocument.Document;
// Open new document
var docNext = ActiveUIDocument.Application.OpenAndActivateDocument(file);
// Close last document
docLast.Close(false);
// Export Warnings
var html = await Win32Api.ExportWarinings(uiapp, outputDir);
}
}
}
但是这只适用于第一个文件然后崩溃。如何修改此代码或链接到的链接“ExportWarnings”代码,使此进程成为.rvt文件的文件夹。
答案 0 :(得分:0)
祝贺你对Export Revit Warnings List From Api非常好的解决方案!
如您所知,Revit API只能在有效的Revit API上下文中使用。这种上下文仅在Revit API提供的回调函数中提供,例如外部命令Execute
。此外,Revit API不是多线程的。在这样的上下文之外调用API可能会导致崩溃。这可能正是您所经历的。
因此,我想知道在这种情况下是否可以使用async
。处理这些限制的一种可能性是利用外部事件:
http://thebuildingcoder.typepad.com/blog/about-the-author.html#5.28
此代码是否以外部命令Execute
方法运行?如果是这样,那么只需删除async
内容,然后重复调用Sleep
直到Revit处理完第一个文件?
不,这可能行不通,可能根本就不对。
下一个建议:删除async
;进行调用以处理下一个文件;完成后,举起一个外部事件;在外部事件中,重复算法处理下一个文件;等
我非常期待听到你如何解决这个问题!