【问题标题】:How can I get the Revit file version using the Revit API?如何使用 Revit API 获取 Revit 文件版本?
【发布时间】:2013-01-07 01:07:13
【问题描述】:

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

Similar Autodesk Discussion Group Question
Building Coder

【问题讨论】:

标签: c# revit revit-api


【解决方案1】:

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

Here 是完整的控制台应用程序,演示如何提取 BasicFileInfo 数据

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

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

string fileContents = streamReader.ReadToEnd();

你将整个文件写入内存。

另外,大文件上的正则表达式运行缓慢。

我认为你应该使用

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

从我的示例中并在 rawString 中使用 Regex 而不是整个文件。

希望对你有帮助。

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

【讨论】:

  • 感谢您找到两个好的解决方案。我肯定会使用新的 BasicFileInfo 类,但我也可以看到你的读取 BasicFileInfo 流的解决方案比我的大文件解决方案更快。我刚刚在一个小示例文件上测试了我的解决方案。
【解决方案2】:

我仔细查看了我的问题中的discussion group posting,发现版本信息实际上在文件的其他乱码中是人类可读的。 “.rvt”文件以 OLE 格式存储,因此您可以使用Structured Storage Viewer 之类的工具查看内容。它将位于 BasicFileInfo 下。

如果您愿意,您可以使用 OLE library for .NET 来读取数据,但我使用了 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;
  }
}

这将允许您获取年份、内部版本号和处理器类型。但是请注意,我的版本专门针对 Architecture 进行检查,因此您需要针对 MEP 或 Structural 进行修改。

更新

  • 如果您使用的是 Revit 2013 或更新版本,请参阅my other answer
  • 如果您使用的是 Revit 2012 或更早版本,请将上面的 Regex 与 Victor's answer 结合使用,以便更好地读取 BasicFileInfo(而不是全部内容)。

【讨论】:

  • 你走对了。但是将整个文件读入内存并通过正则表达式在其中搜索是一个坏主意。看我的回答。
猜你喜欢
  • 2019-03-06
  • 2021-01-08
  • 2019-09-21
  • 2021-03-27
  • 1970-01-01
  • 2019-05-01
  • 2020-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多