2013-01-23 162 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进行搜索是个不错的主意。看到我的答案。 –