首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Revit API获取Revit文件版本?

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

Stack Overflow用户
提问于 2013-01-23 22:06:49
回答 2查看 4.9K关注 0票数 2

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

Similar Autodesk Discussion Group Question

Building Coder

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-24 11:30:16

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

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

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

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

代码语言:javascript
运行
复制
string fileContents = streamReader.ReadToEnd();

您将整个文件写入内存。

此外,大文件上的正则表达式运行速度很慢。

我觉得你应该用

代码语言:javascript
运行
复制
var rawString = System.Text.Encoding.Unicode.GetString(rawData);

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

希望能有所帮助。

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

票数 3
EN

Stack Overflow用户

发布于 2013-01-24 03:32:11

我仔细查看了问题中的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})))

代码如下:

代码语言:javascript
运行
复制
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对其进行修改。

更新了

my other answer.

  • If
  • 如果您使用的是Revit 2013或更高版本的,请参阅Revit 2012或更早版本的,然后将上面的正则表达式与Victor's answer结合使用,以获得读取BasicFileInfo (而不是整个内容)的更好方式。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14481652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档