添加项目文件。
This commit is contained in:
205
RevitLess/MainWindowViewModel.cs
Normal file
205
RevitLess/MainWindowViewModel.cs
Normal file
@@ -0,0 +1,205 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user