Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Revit API获取Revit文件版本?_C#_Revit_Revit Api - Fatal编程技术网

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

C# 如何使用Revit API获取Revit文件版本?,c#,revit,revit-api,C#,Revit,Revit Api,在Revit API中,我知道我可以获取当前正在运行的Revit实例的版本(Controlled Application.VersionBuild,Controlled Application.VersionName,Controlled Application.VersionNumber)。但是,我希望在打开Revit文件之前获取其自身的版本。这样,当用户在较新版本的Revit中打开较旧的Revit文件时,我可以停止显示的“自动升级”对话框。我正在使用Revit 2013,并希望使用2011年

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



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

如果您想,那么您可能可以使用一个来读取数据,但我使用了一个
StreamReader
和一个
Regex

下面是正则表达式:

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;
  }
}
private void controlled应用程序\u文档打开(对象发送方、,
文档OpeningEventArgs(e)
{
FileInfo revitFileToUpgrade=新文件信息(例如路径名);
Regex buildInfoRegex=新的Regex(
@“Revit\SarchitArchitecture\s(?\d{4})\s\(构建:\s(?\w*)\((\w{3})\)\)”;
使用(StreamReader StreamReader=
新的StreamReader(例如路径名、编码、Unicode))
{
string fileContents=streamReader.ReadToEnd();
Match buildInfo=buildInfoRegex.Match(fileContents);
字符串year=buildInfo.Groups[“year”].Value;
字符串build=buildInfo.Groups[“build”].Value;
字符串处理器=buildInfo.Groups[“处理器”].Value;
}
}
这将允许您获取年份、版本号和处理器类型。但是,请注意,我的版本专门检查体系结构,因此您需要为MEP或Structural对其进行修改

已更新

  • 如果您使用的是Revit 2013或更新版本,请参见
  • 如果使用的是Revit 2012或更早版本的,请将上面的正则表达式与结合使用,以更好地读取基本文件信息(而不是全部内容)

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

如果您想,那么您可能可以使用一个来读取数据,但我使用了一个
StreamReader
和一个
Regex

下面是正则表达式:

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;
  }
}
private void controlled应用程序\u文档打开(对象发送方、,
文档OpeningEventArgs(e)
{
FileInfo revitFileToUpgrade=新文件信息(例如路径名);
Regex buildInfoRegex=新的Regex(
@“Revit\SarchitArchitecture\s(?\d{4})\s\(构建:\s(?\w*)\((\w{3})\)\)”;
使用(StreamReader StreamReader=
新的StreamReader(例如路径名、编码、Unicode))
{
string fileContents=streamReader.ReadToEnd();
Match buildInfo=buildInfoRegex.Match(fileContents);
字符串year=buildInfo.Groups[“year”].Value;
字符串build=buildInfo.Groups[“build”].Value;
字符串处理器=buildInfo.Groups[“处理器”].Value;
}
}
这将允许您获取年份、版本号和处理器类型。但是,请注意,我的版本专门检查体系结构,因此您需要为MEP或Structural对其进行修改

已更新

  • 如果您使用的是Revit 2013或更新版本,请参见
  • 如果使用的是Revit 2012或更早版本的,请将上面的正则表达式与结合使用,以更好地读取基本文件信息(而不是全部内容)

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

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

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

读取唯一的基本文件信息要比读取整个文件好得多。 想象一下,如果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

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

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

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

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

string fileContents = streamReader.ReadToEnd();
将整个文件写入内存

此外,大型文件上的正则表达式工作速度较慢

我认为你应该使用

var rawString = System.Text.Encoding.Unicode.GetString(rawData);
从我的示例中,在r中使用正则表达式