Revit API では、現在実行中の Revit インスタンスのバージョンを取得できることがわかっています( ControlledApplication.VersionBuild
、ControlledApplication.VersionName
、ControlledApplication.VersionNumber
)。ただし、Revit ファイルを開く前にそのバージョンを取得したいと考えています。このようにして、ユーザーが古い Revit ファイルを新しいバージョンの Revit で開いたときに表示される自動アップグレード ダイアログを停止することができました。Revit 2013 を使用しており、2011、2012、および 2013 のファイルが必要です。
2 に答える
あなたが言ったように、Revit ファイル形式は構造化ストレージ ドキュメントであり、必要な情報はBasicFileInfoストリームに格納されます。
BasicFileInfoデータを抽出する方法を示す完全なコンソール アプリケーションを次に示します。
残念ながら、BasicFileInfoStream の形式はわかりません。ただし、文字列として読み取ると、ファイルが作成されたバージョンを取得できます。
ファイル全体を読み取るよりも、BasicFileInfo のみを読み取る方がはるかに優れています。Revit プロジェクトが 500 MB 以上の場合を想像してください。電話すると
string fileContents = streamReader.ReadToEnd();
ファイル全体をメモリに書き込みます。
また、巨大なファイルに対する正規表現の動作が遅くなります。
使うべきだと思います
var rawString = System.Text.Encoding.Unicode.GetString(rawData);
私のサンプルから、ファイル全体ではなく rawString で Regex を使用します。
それが役に立てば幸い。
更新:
完全に忘れてました。Revit 2013 ではSavedInCurrentVersion
、クラスのプロパティを使用BasicFileInfo
して、ファイルが現在の Revit バージョンで保存されたかどうかを判断できます。ファイルが保存されたバージョンを取得したい場合(質問のキャプションのように)SavedInVersion
、同じクラスのプロパティを使用できます。BasicFileInfo.Extract
メソッドを使用して を取得できますBasicFileInfo
。
私の質問から投稿されたディスカッショングループを詳しく調べたところ、バージョン情報は、ファイルの他のジバーリッシュの中でも実際に人間が読める形式であることがわかりました。「.rvt」ファイルはOLE形式で保存されるため、 StructuredStorageViewerなどのツールを使用するとコンテンツを確認できます。BasicFileInfoの下にあります。
必要に応じて、.NET用のOLEライブラリを使用してデータを読み取ることもできますがStreamReader
、Regex
代わりにとを使用しました。
正規表現は次のとおりです。
Revit \ sArchitecture \ s(?<Year> \ d {4})\ s(Build:\ s(?<Build> \ w *)\((?<Processor> \ 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;
}
}
これにより、年、ビルド番号、およびプロセッサのタイプを取得できます。ただし、私のバージョンは特にアーキテクチャをチェックするため、MEPまたは構造用に変更する必要があることに注意してください。
更新: