Revit二次开发小白学习笔记4——事务及事务组
1.概念解说
1.1 事务的分类
- Transaction:增删改的操作要开启事务,提交事务才能写入文档
- SubTransaction
- TransactionGroup:用于包含多个事务,可一次撤销事务组
1.2 事务主要方法
- 1、Start启动事务
- 2、Commit结束事务并提交所有的修改到文档中
- 3、RollBack结束事务并撤销对文档的所有的修改
- 4、GetStatue返回当前事务的状态
Started:事务已启动
RolltedBack:事务成功撤销
Committed:事务成功提交
Uninitialized:事务已经初始化
Pending:事务试图被提交或撤销。但由于出错,处理还未结束,还在等待用户响应。- 5、Assimilate:将多个事务合并(TransactionGroup使用)
事务实例
//新建事务(事务对应文档,事务名称)
using (Transaction transaction = new Transaction(document, "新建事务"))
{
transaction.Start();//开始事务
TaskDialog.Show("事务状态",transaction.GetStatus().ToString());//显示事务状态
#region 事务操作函数
Reference reference = uIDocument.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element);
FamilyInstance elem = document.GetElement(reference) as FamilyInstance;
//得到底部高度参数
Parameter parameter = elem.get_Parameter(BuiltInParameter.INSTANCE_SILL_HEIGHT_PARAM);
//对于自己定义的参数,BuiltInParameter无对应类型,显示无效,我们需要使用lookup获取参数
elem.LookupParameter("pl");//根据参数名称直接获取
//revit使用的是英尺,需要转换成需要的单位
parameter.Set(ToFoot(100));//使用Set还是SetValueString,取决于修改值得数据类型(StorageType)
#endregion
transaction.Commit();//提交事务
TaskDialog.Show("事务状态", transaction.GetStatus().ToString());
transaction.Start();
transaction.RollBack();//撤销操作
TaskDialog.Show("事务状态", transaction.GetStatus().ToString());
transaction.Commit();
}
使用的单位为mm,Revit使用的也为mm,但代码写入的是英尺,需要将毫米先转化为对应的英尺数值
#region 将传入的mm转化为英尺
/// <summary>
/// 毫米转英尺
/// </summary>
/// <param name="val">毫米</param>
/// <returns>英尺</returns>
public static double ToMM(double val)
{
return UnitUtils.ConvertToInternalUnits(val, DisplayUnitType.DUT_MILLIMETERS);
}
#endregion
3.事务组
用于包含多个事务,可一次撤销事务组
using (TransactionGroup transactionGroup = new TransactionGroup(document, "事务组"))
{
transactionGroup.Start();
//多个事务或事务循环
int i = 0;
while (i < 3)
{
using (Transaction transaction = new Transaction(document, "新建事务"))
{
transaction.Start();
Reference reference = uIDocument.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element);
FamilyInstance elem = document.GetElement(reference) as FamilyInstance;
//得到底部高度参数
Parameter parameter = elem.get_Parameter(BuiltInParameter.INSTANCE_SILL_HEIGHT_PARAM);
//我们输入的100是100英尺,绘图单位是mm,需要转换
parameter.Set(ToMM(10));//使用Set还是SetValueString,取决于修改值得数据类型(StorageType)
transaction.Commit();
i++;
}
}
transactionGroup.Assimilate();
}