整理代码

This commit is contained in:
GG Z
2025-04-24 20:56:10 +08:00
parent 4d798e5d99
commit 155cef46f8
532 changed files with 1018 additions and 854 deletions

View File

@@ -0,0 +1,182 @@
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
namespace ShrlAlgo.RvKits.Windows
{
class ProgressBarManager<T>
{
private readonly UIDocument uidoc;
private readonly IEnumerable<T> collection;
private readonly object addinParameter;
private readonly Action<UIDocument, T, object> action;
private readonly string taskName;
private readonly bool useTransaction;
ProgressMonitorViewModel viewModel;
ProgressMonitorView progressBarView;
#region
private readonly ProcessEventHandler<T> progressEventHandler;
/// <summary>
/// 非模态进度条,只能开启一次,请勿在遍历中使用
/// </summary>
/// <param name="progressEventHandler"></param>
/// <param name="collection"></param>
public ProgressBarManager(ProcessEventHandler<T> progressEventHandler, IEnumerable<T> collection, string taskName = "处理任务", object addinParameter = null)
{
this.progressEventHandler = progressEventHandler;
progressEventHandler.Collection = collection;
progressEventHandler.AddinParameter = addinParameter;
this.collection = collection;
this.taskName = taskName;
}
public void ProgressModeless()
{
if (!progressEventHandler.Collection.Any())
{
return;
}
viewModel = new()
{
MaxValue = collection.Count(),
Title = taskName
};
progressBarView ??= new();
//progressBarView = ProgressMonitorView.Instance;
progressBarView.DataContext = viewModel;
progressBarView.Loaded += CurrentUI_ContentRendered;
progressBarView.Closed += CurrentUI_Closed;
progressBarView.Topmost = true;
//progressEventHandler = new(collection, action)
//{
// ProgressBarView = progressBarView,
// ViewModel = viewModel
//};
if (collection.Any())
{
progressEventHandler.ProgressBarView = progressBarView;
progressEventHandler.ViewModel = viewModel;
//progressBarView.Show();
progressBarView.Show();
//progressEventHandler.Raise();
}
}
private void CurrentUI_ContentRendered(object sender, EventArgs e)
{
progressEventHandler.Raise();
}
#endregion
#region
bool Cancel { get; set; }
//private delegate void ProgressBarDelegate();
/// <summary>
/// 模态进度条
/// </summary>
/// <param name="uidoc"></param>
/// <param name="collection"></param>
/// <param name="action"></param>
public ProgressBarManager(UIDocument uidoc, ICollection<T> collection, Action<UIDocument, T, object> action, string taskName = "处理任务", bool useTransaction = true, object addinParameter = null)
{
this.uidoc = uidoc;
this.collection = collection;
this.addinParameter = addinParameter;
this.action = action;
this.taskName = taskName;
this.useTransaction = useTransaction;
}
public void ProgressModal()
{
if (!collection.Any())
{
return;
}
viewModel = new ProgressMonitorViewModel
{
MaxValue = collection.Count(),
Title = taskName
};
progressBarView = new ProgressMonitorView
{
DataContext = viewModel
};
//progressBarView = ProgressMonitorView.Instance;
//progressBarView.DataContext = viewModel;
progressBarView.Closed += CurrentUI_Closed;
progressBarView.ContentRendered += FireUPModal;
progressBarView.ShowDialog();
}
private async void FireUPModal(object sender, EventArgs e)
{
progressBarView.ContentRendered -= FireUPModal;
Transaction ts = null;
// 根据条件决定是否创建并启动事务
if (useTransaction)
{
ts = new Transaction(uidoc.Document, taskName);
ts.Start();
}
for (viewModel.CurrentValue = 0; viewModel.CurrentValue < viewModel.MaxValue; viewModel.CurrentValue++)
{
if (Cancel)
break;
//System.Threading.Thread.Sleep(50);
try
{
var t = collection.ElementAt(viewModel.CurrentValue);
//Debug.WriteLine(ViewModel.CurrentValue);
action(uidoc, t, addinParameter);
}
catch (Exception)
{
CloseWindow();
// 如果发生异常且事务已启动,则回滚事务
if (useTransaction && ts != null && ts.GetStatus() == TransactionStatus.Started)
{
ts.RollBack();
}
}
viewModel.CurrentContext = $"处理 {viewModel.CurrentValue} / {viewModel.MaxValue} 完成";
await Task.Delay(50);
//progressBarView.Dispatcher.Invoke(viewModel.NotifyUI, System.Windows.Threading.DispatcherPriority.Background);
}
// 根据条件决定是否提交事务
if (useTransaction && ts != null)
{
ts.Commit();
}
CloseWindow();
// 确保事务对象被正确处理
ts?.Dispose();
}
private void CloseWindow()
{
progressBarView.Closed -= CurrentUI_Closed;
progressBarView.Close();
}
private void CurrentUI_Closed(object sender, EventArgs e)
{
Cancel = true;
}
#endregion
}
}