前言
Revit API 提供了一些接口,用户可以在特定修改发生的时候,做一些额外的动作。
内容
这个例子的内容,注册更新器之后,当窗户的位置发生变化,对应的 section view 也会发生变化,保证它一直与窗户垂直,且经过窗户的中点。
核心逻辑
-
FailureDefinitionId 用于定义错误的行为,职责:
a. 标识一个错误
b. 错误严重等级
c. 默认的错误处理方法
d. 特定场景的错误处理方法 - FailureResolution
e. 通过自身的静态方法进行注册 - FailureDefinition.CreateFailureDefinition -
错误处理的时机,Transaction 开始之前、之中和之后:
a. 前处理 Transaction -> FailureHandlingOptions -> FailurePreproccessor
b. 中处理 Application.FailuresProcessing
c. 后处理 Transaction -> FailureHandlingOptions -> FailuresProcessor 或者 Application.RegisterFailuresProcessor
例子中列出的可能不全,Revit API 中可能还有其他地方可以进行错误处理。
注册更新器
// Autodesk.Revit.DB.UpdaterRegistry
public static void AddTrigger(UpdaterId id, Document document, ICollection<ElementId> elements, ChangeType change);
可能的变化类型 ChangeType
, Element 增加、删除、几何变化和参数变化:
// Autodesk.Revit.DB.Element
public static ChangeType GetChangeTypeAny();
public static ChangeType GetChangeTypeElementAddition();
public static ChangeType GetChangeTypeElementDeletion();
public static ChangeType GetChangeTypeGeometry();
public static ChangeType GetChangeTypeParameter(ElementId parameterId);
public static ChangeType GetChangeTypeParameter(Parameter param);
例子中注册的逻辑,几何发生变化的时候触发:
internal void AddTriggerForUpdater(Document doc, List<ElementId> idsToWatch, ElementId sectionId, Element sectionElement)
{
if (idsToWatch.Count == 0)
return;
m_windowId = idsToWatch[0];
m_sectionId = sectionId;
m_sectionElement = sectionElement;
UpdaterRegistry.AddTrigger(m_updaterId, doc, idsToWatch, Element.GetChangeTypeGeometry());
}
AddTriggerForUpdater 这个接口并属于 IUpdater,是这个例子特有的:
namespace Autodesk.Revit.DB
{
public interface IUpdater
{
void Execute(UpdaterData data);
string GetAdditionalInformation();
ChangePriority GetChangePriority();
UpdaterId GetUpdaterId();
string GetUpdaterName();
}
}
SectionUpdater
的更新逻辑: