Files
Shrlalgo.RvKits/ShrlAlgoToolkit.Revit/Extensions/TransactionExtensions.cs
2025-04-24 20:56:44 +08:00

236 lines
7.4 KiB
C#

using Autodesk.Revit.DB;
using ShrlAlgoToolkit.Revit.Assists;
using System.Runtime.CompilerServices;
namespace ShrlAlgoToolkit.Revit.Extensions
{
public static class TransactionExtensions
{
/// <summary>
/// 事务
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="doc"></param>
/// <param name="func"></param>
/// <param name="name"></param>
/// <param name="isBlockWarning"></param>
/// <returns></returns>
public static T Invoke<T>(this Document doc, Func<Transaction, T> func, [CallerMemberName] string name = "外部命令", bool isBlockWarning = false)
{
using var tr = new Transaction(doc, name);
tr.Start();
if (isBlockWarning)
{
var failureHandlingOptions = tr.GetFailureHandlingOptions();
failureHandlingOptions.SetFailuresPreprocessor(new FailuresPreProcessor());
tr.SetFailureHandlingOptions(failureHandlingOptions);
}
var result = func(tr);
var status = tr.GetStatus();
switch (status)
{
case TransactionStatus.Started:
tr.Commit();
return result;
case TransactionStatus.Committed:
case TransactionStatus.RolledBack:
return result;
case TransactionStatus.Error:
tr.RollBack();
return result;
default:
return result;
}
}
/// <summary>
/// 事务
/// </summary>
/// <param name="doc"></param>
/// <param name="action"></param>
/// <param name="name"></param>
/// <param name="isBlockWarning">阻止警告</param>
public static void Invoke(this Document doc, Action<Transaction> action, [CallerMemberName] string name = "外部命令", bool isBlockWarning = false)
{
if (doc == null)
{
throw new ArgumentException("参数为空", nameof(doc));
}
using var tr = new Transaction(doc, name);
tr.Start();
try
{
if (isBlockWarning)
{
var failureHandlingOptions = tr.GetFailureHandlingOptions();
failureHandlingOptions.SetFailuresPreprocessor(new FailuresPreProcessor());
tr.SetFailureHandlingOptions(failureHandlingOptions);
}
action?.Invoke(tr);
}
catch (Autodesk.Revit.Exceptions.OperationCanceledException) { }
//catch (Exception ex)
//{
// Debug.WriteLine($"异常:{ex.Message}");
// MessageBox.Show(ex.Message);
// //Log.Logger.Error(ex, $"{ex.Source}");
//}
var status = tr.GetStatus();
//根据事务的当前状态判断是否提交
switch (status)
{
case TransactionStatus.Started:
tr.Commit();
return;
case TransactionStatus.Error:
tr.RollBack();
return;
default:
return;
}
}
/// <summary>
/// 事务组
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="doc"></param>
/// <param name="func"></param>
/// <param name="name"></param>
/// <returns></returns>
public static T InvokeGroup<T>(this Document doc, Func<TransactionGroup, T> func, [CallerMemberName] string name = "外部命令组")
{
if (doc == null)
{
throw new ArgumentException(null, nameof(doc));
}
using var tg = new TransactionGroup(doc, name);
tg.Start();
var result = func(tg);
var status = tg.GetStatus();
switch (status)
{
case TransactionStatus.Started:
tg.Assimilate();
return result;
case TransactionStatus.Error:
tg.RollBack();
return result;
default:
return result;
}
}
/// <summary>
/// 事务组
/// </summary>
/// <param name="doc"></param>
/// <param name="action"></param>
/// <param name="name"></param>
public static void InvokeGroup(this Document doc, Action<TransactionGroup> action, [CallerMemberName] string name = "外部命令")
{
if (doc == null)
{
throw new ArgumentException(nameof(doc));
}
using var tg = new TransactionGroup(doc, name);
tg.Start();
action(tg);
var status = tg.GetStatus();
switch (status)
{
case TransactionStatus.Started:
tg.Assimilate();
return;
case TransactionStatus.Error:
tg.RollBack();
return;
default:
return;
}
}
/// <summary>
/// 子事务
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="doc"></param>
/// <param name="func"></param>
/// <returns></returns>
public static T InvokeSub<T>(this Document doc, Func<SubTransaction, T> func)
{
if (doc == null)
{
throw new ArgumentException(nameof(doc));
}
using SubTransaction st = new(doc);
st.Start();
var result = func(st);
var status = st.GetStatus();
switch (status)
{
case TransactionStatus.Started:
st.Commit();
return result;
case TransactionStatus.Error:
st.RollBack();
return result;
default:
return result;
}
}
public static void InvokeSub(this Document doc, Action<SubTransaction> action)
{
if (doc == null)
{
throw new ArgumentException(nameof(doc));
}
using var st = new SubTransaction(doc);
st.Start();
action(st);
var status = st.GetStatus();
switch (status)
{
case TransactionStatus.Started:
st.Commit();
return;
case TransactionStatus.Error:
st.RollBack();
return;
default:
return;
}
}
/// <summary>
/// 事务错误处理
/// </summary>
/// <param name="ts"></param>
/// <param name="failuresPreprocessor"></param>
public static void SetFailureProcess(this Transaction ts, IFailuresPreprocessor failuresPreprocessor)
{
var options = ts.GetFailureHandlingOptions();
options.SetFailuresPreprocessor(failuresPreprocessor);
ts.SetFailureHandlingOptions(options);
}
}
}