Files
RevitArchive/RevitLess/MainWindowViewModel.cs

206 lines
5.2 KiB
C#
Raw Normal View History

2026-02-23 14:58:05 +08:00
using System;
using System.Globalization;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using Autodesk.Revit;
using Autodesk.Revit.DB;
using Autodesk.RevitAddIns;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Microsoft.Win32;
namespace RevitLess;
public partial class MainWindowViewModel : ObservableObject
{
private static RevitVersion RevitVersion = RevitVersion.Unknown;
private static Document doc;
private static RevitContext RevitApp => RevitContext.Instance;
/// <summary>
/// 获取Revit文件的版本
/// </summary>
/// <param name="path">文件路径</param>
/// <returns></returns>
public static RevitVersion GetRevitVersion(string path)
{
string revitVersion = null;
var stream = new FileStream(path, FileMode.Open);
var size = 1024 * 1024;
var bytes = new byte[size];
while (stream.Read(bytes, 0, size) > 0)
{
var str = Encoding.Unicode.GetString(bytes);
const string pattern = @"Autodesk Revit \d{4}";
var match = Regex.Match(str, pattern);
if (match.Success)
{
revitVersion = "Revit" + match.Value.Substring(match.Length - 4, 4);
//File.WriteAllText(@"D:\abc.txt", str);
break;
}
}
foreach (RevitVersion ver in Enum.GetValues(typeof(RevitVersion)))
{
if (Enum.GetName(typeof(RevitVersion), ver) == revitVersion)
{
return ver;
}
}
return RevitVersion.Unknown;
//var s = Enum.GetName(typeof(RevitVersion), revitVersion);
//return revitVersion;
}
/// <summary>
/// 根据Revit文件获取Revit安装路径
/// </summary>
/// <returns></returns>
private string GetRevitLocation()
{
var file = new FileInfo(SourceFilePath);
if (file.Exists)
{
//文件级获取Revit版本不打开Revit软件
RevitVersion = GetRevitVersion(SourceFilePath);
//根据文件版本获取Revit产品安装位置
return RevitProductUtility.GetAllInstalledRevitProducts().Find(x => x.Version == RevitVersion)?.InstallLocation;
}
else
{
//已安装的默认Revit产品安装位置
return RevitProductUtility.GetAllInstalledRevitProducts().Find(x => x.Version >= RevitVersion)?.InstallLocation;
}
}
private static void SaveFile(Document document)
{
var workPath = Path.GetDirectoryName(typeof(App).Assembly.Location);
var i = 1;
var saveFilePath = Path.Combine(workPath, $"项目 {i}.rvt");
var saveFile = new FileInfo(saveFilePath);
if (saveFile.Exists)
{
i++;
saveFilePath = $"项目 {i}";
}
document.SaveAs(saveFilePath);
}
private bool CanOperation => !(string.IsNullOrEmpty(SourceFilePath) || string.IsNullOrEmpty(TargetFilePath));
private void InitFinished(object sender, Product revitProduct)
{
doc = RevitApp.OpenFile(SourceFilePath);
}
[RelayCommand(CanExecute = nameof(CanOperation))]
private void Execute()
{
Log = "Revit程序启动中...\n";
RevitApp.Run();
RevitApp.InitFinished += InitFinished; //订阅
RevitApp.InitRevitAppAndOpenFile(); //执行订阅事件
ExecuteOperation();
RevitApp.Exit();
var time = Convert.ToString(DateTime.Now, CultureInfo.InvariantCulture);
Log = $"{time} 处理完毕,结束进程。";
//Console.ReadKey();
}
private void ExecuteOperation()
{
//document.SaveAs(saveFilePath, new SaveAsOptions() { OverwriteExistingFile = true });
//View3D view = revit.GetView3D(document);
//if (view != null)
//{
// Console.WriteLine(view.Name);
// //var elements = revit.GetElementsWithView(view);
// foreach (var element in elements)
// {
// Console.WriteLine(element.Name);
// }
//}
var view = RevitHelper.GetView3D(doc);
using (var ts = new Transaction(doc, "修改"))
{
ts.Start();
doc.Create.NewModelCurve(Line.CreateBound(new XYZ(0, 0, 0), new XYZ(0, 10, 0)), view.SketchPlane);
ts.Commit();
}
//doc.SaveAs(,new SaveAsOptions { PreviewViewId =view.Id});
doc.SaveAs(TargetFilePath);
}
[ObservableProperty]
[NotifyCanExecuteChangedFor(nameof(ExecuteCommand))]
private string sourceFilePath;
[ObservableProperty]
[NotifyCanExecuteChangedFor(nameof(ExecuteCommand))]
private string targetFilePath;
[ObservableProperty]
private string log;
[RelayCommand]
private void SelectFile()
{
var dialog = new OpenFileDialog
{
CheckFileExists = true,
CheckPathExists = true,
DereferenceLinks = false,
Filter = "所有Revit文件 (*.rvt, *.rfa, *.rte, *.rft)|*.rvt;*.rfa;*.rte;*.rft",
FilterIndex = 0,
Title = "打开文件",
ValidateNames = true,
Multiselect = true,
ReadOnlyChecked = true,
ShowReadOnly = true
};
if (dialog.ShowDialog() == true)
{
SourceFilePath = dialog.FileName;
var revitPath = GetRevitLocation();
//动态加载程序集
RevitContext.OnAssemblyResolve(revitPath);
Log = $"当前使用的Revit文件版本为{RevitVersion}\n";
}
}
[RelayCommand]
private void SaveFile()
{
SaveFileDialog dialog =
new()
{
CheckPathExists = true,
DereferenceLinks = false,
AddExtension = true,
Filter = "所有Revit文件 (*.rvt, *.rfa, *.rte, *.rft)|*.rvt;*.rfa;*.rte;*.rft",
FilterIndex = 0,
Title = "保存文件",
ValidateNames = true,
};
if (dialog.ShowDialog() == true)
{
TargetFilePath = dialog.FileName;
}
}
}