如何使用 Revit API 获取 Revit 文件版本

本文关键字:Revit 文件 版本 获取 API 何使用 | 更新日期: 2023-09-27 17:55:17

在Revit API中,我知道我可以获取当前正在运行的Revit实例的版本(ControlledApplication.VersionBuildControlledApplication.VersionNameControlledApplication.VersionNumber)。 但是,我想在打开Revit文件之前获取其本身的版本。 这样,我可以停止自动升级对话框,当用户在较新版本的Revit中打开较旧的Revit文件时显示该对话框。 我正在使用 Revit 2013 并期待 2011、2012 和 2013 年的文件。

类似的欧特克讨论组问题
建筑编码员

如何使用 Revit API 获取 Revit 文件版本

正如您所说,Revit文件格式是结构化存储文档,您需要的信息存储在BasicFileInfo流中。

下面是演示如何提取基本文件信息数据的完整控制台应用程序

不幸的是,我不知道BasicFileInfoStream的格式。但是,如果您将其读取为字符串,则可以获取创建文件的版本。

读取唯一的BasicFileInfo比读取整个文件要好得多。想象一下,如果 Revit 项目超过 500 MB 或更多。当您致电时

string fileContents = streamReader.ReadToEnd();

将整个文件写入内存。

此外,大文件上的正则表达式工作缓慢。

我认为你应该使用

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

从我的示例中,并在 rawString 中使用正则表达式而不是整个文件。

希望对您有所帮助。

更新:我完全忘记了。在 Revit 2013 中SavedInCurrentVersion可以使用BasicFileInfo类的属性来确定文件是否保存在当前 Revit 版本中。如果要获取保存文件的版本(如问题标题中所示),则可以使用同一类SavedInVersion属性。 您可以使用 BasicFileInfo.Extract 方法获取BasicFileInfo

我仔细查看了我的问题中的讨论组帖子,发现版本信息实际上是人类可读的。 ".rvt"文件以 OLE 格式存储,因此如果使用结构化存储查看器等工具,您可以看到内容。 它将位于BasicFileInfo下。

如果您愿意,则可以使用 .NET 的 OLE 库来读取数据,但我改用了StreamReaderRegex

下面是正则表达式:

Revit''sArchitecture''s(?''d{4})''s(Build:''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或更高版本,请参阅我的另一个答案。
  • 如果您使用的是Revit 2012或更早版本,请将上面的正则表达式与Victor的答案结合起来,以获得更好的方法来阅读BasicFileInfo(而不是全部内容)。