如何使用 Revit API 获取 Revit 文件版本
本文关键字:Revit 文件 版本 获取 API 何使用 | 更新日期: 2023-09-27 17:55:17
在Revit API中,我知道我可以获取当前正在运行的Revit实例的版本(ControlledApplication.VersionBuild
,ControlledApplication.VersionName
,ControlledApplication.VersionNumber
)。 但是,我想在打开Revit文件之前获取其本身的版本。 这样,我可以停止自动升级对话框,当用户在较新版本的Revit中打开较旧的Revit文件时显示该对话框。 我正在使用 Revit 2013 并期待 2011、2012 和 2013 年的文件。
类似的欧特克讨论组问题
建筑编码员
正如您所说,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 库来读取数据,但我改用了StreamReader
和Regex
。
下面是正则表达式:
Revit''sArchitecture''s(?(?
这是代码:
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(而不是全部内容)。