169 lines
6.0 KiB
C#
169 lines
6.0 KiB
C#
using Autodesk.Revit.DB;
|
|
|
|
namespace ShrlAlgoToolkit.RevitAddins.Common.Controls
|
|
{
|
|
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
|
|
}
|
|
}
|