IFailuresProcessor Interface


To create your own UI or fully automated tool to process Revit Failures, derive a class from this interface.

Namespace: Autodesk.Revit.DB
Assembly: RevitAPI (in RevitAPI.dll) Version: 17.0.0.0 (17.0.484.0)

Syntax

C#
public interface IFailuresProcessor
Visual Basic
Public Interface IFailuresProcessor
Visual C++
public interface class IFailuresProcessor

Remarks

To override Revit default Failures Processing UI, instantiate your own processor derived from this interface and register it in Revit application.

Examples

Copy C#
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]

public class MyFailuresUI : IExternalApplication
{
    static AddInId m_appId = new AddInId(new Guid("9F179363-B349-4541-823F-A2DDB2B86AF3"));
    public Result OnStartup(UIControlledApplication application)
    {
        IFailuresProcessor myFailUI = new FailUI();
        //Autodesk.Revit.ApplicationServices.Application.RegisterFailuresProcessor(myFailUI);
        return Result.Succeeded;
    }

    public Result OnShutdown(UIControlledApplication application)
    {
        return Result.Succeeded;
    }

    public class FailUI : IFailuresProcessor
    {
        public void Dismiss(Document document)
        {
            // This method is being called in case of exception or document destruction to 
            // dismiss any possible pending failure UI that may have left on the screen
        }

        public FailureProcessingResult ProcessFailures(FailuresAccessor failuresAccessor)
        {
            IList<FailureResolutionType> resolutionTypeList = new List<FailureResolutionType>();
            IList<FailureMessageAccessor> failList = new List<FailureMessageAccessor>();
            // Inside event handler, get all warnings
            failList = failuresAccessor.GetFailureMessages(); 
            string errorString = "";
            bool hasFailures = false;
            foreach (FailureMessageAccessor failure in failList)
            {
                // check how many resolutions types were attempted to try to prevent
                // entering infinite loop
                resolutionTypeList = failuresAccessor.GetAttemptedResolutionTypes(failure);
                if (resolutionTypeList.Count >= 3)
                {
                    TaskDialog.Show("Error", "Cannot resolve failures - transaction will be rolled back.");
                    return FailureProcessingResult.ProceedWithRollBack;
                }

                errorString += "IDs ";
                foreach (ElementId id in failure.GetFailingElementIds())
                {
                    errorString += id.ToString() + ", ";
                    hasFailures = true;
                }
                errorString += "\nWill be deleted because: " + failure.GetDescriptionText() + "\n";
                failuresAccessor.DeleteElements(failure.GetFailingElementIds() as IList<ElementId>);
            }
            if (hasFailures)
            {
                TaskDialog.Show("Error", errorString);
                return FailureProcessingResult.ProceedWithCommit;
            }

            return FailureProcessingResult.Continue;
        }
    }
}
Copy VB.NET
<Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)> _
 Public Class MyFailuresUI
   Implements IExternalApplication
   Shared m_appId As New AddInId(New Guid("9F179363-B349-4541-823F-A2DDB2B86AF3"))
   Public Function OnStartup(application As UIControlledApplication) As Autodesk.Revit.UI.Result Implements IExternalApplication.OnStartup
      Dim myFailUI As IFailuresProcessor = New FailUI()
      'Autodesk.Revit.ApplicationServices.Application.RegisterFailuresProcessor(myFailUI);
      Return Result.Succeeded
   End Function

   Public Function OnShutdown(application As UIControlledApplication) As Autodesk.Revit.UI.Result Implements IExternalApplication.OnShutdown
      Return Result.Succeeded
   End Function

   Public Class FailUI
      Implements IFailuresProcessor
      Public Sub Dismiss(document As Document) Implements IFailuresProcessor.Dismiss
         ' This method is being called in case of exception or document destruction to 
         ' dismiss any possible pending failure UI that may have left on the screen
      End Sub

      Public Function ProcessFailures(failuresAccessor As FailuresAccessor) As FailureProcessingResult Implements IFailuresProcessor.ProcessFailures
         Dim resolutionTypeList As IList(Of FailureResolutionType) = New List(Of FailureResolutionType)()
         Dim failList As IList(Of FailureMessageAccessor) = New List(Of FailureMessageAccessor)()
         ' Inside event handler, get all warnings
         failList = failuresAccessor.GetFailureMessages()
         Dim errorString As String = ""
         Dim hasFailures As Boolean = False
         For Each failure As FailureMessageAccessor In failList
            ' check how many resolutions types were attempted to try to prevent
            ' entering infinite loop
            resolutionTypeList = failuresAccessor.GetAttemptedResolutionTypes(failure)
            If resolutionTypeList.Count >= 3 Then
               TaskDialog.Show("Error", "Cannot resolve failures - transaction will be rolled back.")
               Return FailureProcessingResult.ProceedWithRollBack
            End If

            errorString += "IDs "
            For Each id As ElementId In failure.GetFailingElementIds()
               errorString += id.ToString() & ", "
               hasFailures = True
            Next
            errorString += vbLf & "Will be deleted because: " & failure.GetDescriptionText() & vbLf
            failuresAccessor.DeleteElements(TryCast(failure.GetFailingElementIds(), IList(Of ElementId)))
         Next
         If hasFailures Then
            TaskDialog.Show("Error", errorString)
            Return FailureProcessingResult.ProceedWithCommit
         End If

         Return FailureProcessingResult.[Continue]
      End Function
   End Class
End Class

See Also