批量升級族文件

完成重複性的工作是計算機的強項,也是進行Revit二次開發時最常遇到的情況。本小節介紹如何通過Revit API將一個目錄下的所有Revit文件進行批量升級。眾所周知,由於Revit每年會更新一個版本,當新版本打開舊版本文件的時候會有一個升級的過程,這個過程隨文件大小等影響需要的時間不同,遇到大型文件,升級個把小時也是常事。為了避免項目Revit版本升級後每個項目成員都花時間去升級項目文件,一般會由一個模型管理員先將所有文件進行升級。但如果這個工作完全手工處理,將及其耗時並且非常無聊,基本的工作就是滑鼠點幾下,然後看著屏幕傻等,然後再重複這樣的循環。

本小節需要通過Revit API實現以下幾項功能:

  • 批量升級指定目錄下的所有文件
  • 搜索所有子目錄
  • 指定升級後的保存目錄,該目錄與源文件目錄不同,且沒有父子關係
  • 可以選擇只升級rvt文件或只升級rfa文件或者都升級
  • 顯示升級進度
  • 記錄異常日誌
  • 結束時顯示匯總信息

除了文件的升級功能外,其它功能都是.NET C#的功能,這裡不做詳細說明,詳情可以參考完整代碼。程序的界面如下圖:

這裡主要講一下如何升級Revit文件,主要其實就是調用OpenDocumentFile函數打開文件,然後調用Document.SaveAs函數另存文件。這裡略費一點功夫的是設定文件的預覽視圖,該視圖將決定該Revit文件在Windows的文件瀏覽器中預覽效果。升級單個文件的代碼如下:

private bool upgradeOneFile(string sourceFolder, string targetFolder, string file){ string fileName = file.Substring(sourceFolder.Length).TrimStart("\"); try { Document doc = _revitApp.OpenDocumentFile(file); string targetFile = System.IO.Path.Combine(targetFolder, fileName); string folder = System.IO.Path.GetDirectoryName(targetFile); if (Directory.Exists(folder) == false) { Directory.CreateDirectory(folder); } SaveAsOptions option = new SaveAsOptions(); option.Compact = true; option.OverwriteExistingFile = true; // set preview view id var setting = doc.GetDocumentPreviewSettings(); if (setting.PreviewViewId != ElementId.InvalidElementId) { option.PreviewViewId = setting.PreviewViewId; } else { // Find a candidate 3D view ElementId idView = findPreviewId<View3D>(doc, setting); if (idView == ElementId.InvalidElementId) { // no 3d view, try a plan view idView = findPreviewId<ViewPlan>(doc, setting); } if (idView != ElementId.InvalidElementId) { option.PreviewViewId = idView; } } doc.SaveAs(targetFile, option); doc.Close(); return true; } catch (Exception ex) { // write error message into log file logError(targetFolder, fileName, ex.Message); return false; }}

其中findPreviewId函數代碼如下:

private ElementId findPreviewId<T>(Document doc, DocumentPreviewSettings setting) where T : View{ FilteredElementCollector collector = new FilteredElementCollector(doc).OfClass(typeof(T)); Func<T, bool> isValidForPreview = v => setting.IsViewIdValidForPreview(v.Id); T viewForPreview = collector.OfType<T>().First<T>(isValidForPreview); if (viewForPreview != null) { return viewForPreview.Id; } else { return ElementId.InvalidElementId; }}

SaveAsOptions還有與中心文件保存相關的設置,可以調用SetWorksharingOptions進行設置,該內容可作為練習由讀者完成。

完整代碼請參見Github網站的BatchUpgrader目錄

github.com/songjiahong/

小知識:經常會有朋友問起為什麼同為Autodesk公司產品,AutoCAD能在新版本軟體保存舊版本格式文件,Revit就不行。這個有策略上的原因,也有技術上的原因。比較簡單來說,由於Revit是三維軟體,並且有強大的關聯更新能力,使得它內部的數據結構比AutoCAD來說要複雜很多,想要實現新版本保存舊版本格式文件需要付出的代價比AutoCAD做同樣的工作要高出好幾個數量級。讀者也可以在知乎搜索《兼容的尷尬-Revit文件存儲》查看我針對這個問題寫的文章。


推薦閱讀:

Python用於BIM(Revit等)軟體二次開發效率及體驗如何?
Win7x64配置達索CAA開發環境時需要注意哪些地方?

TAG:AutoDeskRevit | API | 二次开发 |