C# 如何使用Revit API获取Revit文件版本?
在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年
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或更早版本的,请将上面的正则表达式与结合使用,以更好地读取基本文件信息(而不是全部内容)
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或更早版本的,请将上面的正则表达式与结合使用,以更好地读取基本文件信息(而不是全部内容)
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中使用正则表达式