2013-01-23 160 views
1

在Revit API中,我知道我可以獲取當前正在運行的Revit實例的版本(ControlledApplication.VersionBuildControlledApplication.VersionNameControlledApplication.VersionNumber)。但是,我想在打開Revit文件之前先獲取Revit文件的版本。通過這種方式,我可以停止顯示用戶何時在較新版本的Revit中打開較舊的Revit文件的自動升級對話框。我使用Revit 2013年和2011年,2012期待的文件,和2013年如何使用Revit API獲取Revit文件版本?

Similar Autodesk Discussion Group Question
Building Coder

+1

該解決方案已經在建築編碼器http://thebuildingcoder.typepad.com/blog/2013/01/basic-file-info-and-rvt-file-version.html :) –

回答

3

至於你說的Revit文件格式是一種Structired存儲文件和信息,你需要的是存儲在BasicFileInfo流。

Here是完整的控制檯應用程序演示瞭如何提取BasicFileInfo數據

不幸的是,我不知道BasicFileInfoStream的格式。但是,如果您將它作爲字符串讀取,您可以獲取創建文件的版本。

閱讀唯一的BasicFileInfo比讀取整個文件要好得多。 想象一下,如果Revit項目超過500 MB或更多。當您致電

string fileContents = streamReader.ReadToEnd(); 

您將整個文件寫入內存。

此外,巨大文件上的正則表達式工作緩慢。

我想你應該從我的樣品使用

var rawString = System.Text.Encoding.Unicode.GetString(rawData); 

,並在rawString而不是整個文件中使用正則表達式。

希望它有幫助。

已更新: 我完全忘了。 在Revit 2013中,您可以使用BasicFileInfo類的SavedInCurrentVersion屬性來確定文件是否保存在當前Revit版本中。如果您想獲取保存文件的版本(如問題標題中所示),則可以使用同一類的SavedInVersion屬性。您可以使用BasicFileInfo.Extract方法獲取BasicFileInfo

+0

感謝您找到兩個很好的解決方案。我一定會使用新的BasicFileInfo類,但我也可以看到您的解決方案閱讀BasicFileInfo流將更快,然後我的解決方案的大文件。我剛剛在一個小樣本文件上測試了我的解決方案。 – skeletank

1

我把在discussion group posting從我的問題,仔細一看,發現該版本信息實際上是人類可讀在文件的其他亂碼之中。 「.rvt」文件以OLE格式存儲,因此如果使用Structured Storage Viewer之類的工具,則可以看到該內容。它將位於BasicFileInfo

如果您想要,那麼您可以使用OLE library for .NET來讀取數據,但我使用StreamReaderRegex來代替。

這裏是正則表達式:

的Revit \ sArchitecture \ S(?< >年份\ d {4})\ S(生成?:\ S(<生成> \ W *)\(( ?<處理器> \ w {3})\)\)

下面是代碼:

private void ControlledApplication_DocumentOpening (object sender, 
    DocumentOpeningEventArgs e) 
{ 
    FileInfo revitFileToUpgrade = new FileInfo(e.PathName); 
    Regex buildInfoRegex = new Regex(
    @"Revit\sArchitecture\s(?<Year>\d{4})\s\(Build:\s(?<Build>\w*)\((<Processor>\w{3})\)\)"); 

    using(StreamReader streamReader = 
    new StreamReader(e.PathName, Encoding.Unicode)) 
    { 
    string fileContents = streamReader.ReadToEnd(); 

    Match buildInfo = buildInfoRegex.Match(fileContents); 
    string year = buildInfo.Groups["Year"].Value; 
    string build = buildInfo.Groups["Build"].Value; 
    string processor = buildInfo.Groups["Processor"].Value; 
    } 
} 

這將讓你拿到年終,內部版本號和處理器類型。然而,請注意,我的版本特別針對架構進行檢查,因此您需要對MEP或結構進行修改。

修訂

  • 如果您正在使用的Revit 2013或更新然後看到my other answer
  • 如果您使用Revit 2012或更早版本然後將上述正則表達式與Victor's answer結合起來,以更好地閱讀BasicFileInfo(而不是整個內容)。
+0

你在正確的辦法。但是將整個文件讀到內存中,並通過Regex進行搜索是個不錯的主意。看到我的答案。 –