Files
RevitArchive/RevitLess/MainWindowViewModel.cs
2026-02-23 14:58:05 +08:00

206 lines
5.2 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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;
}
}
}