I just ended up swapping the ProceedWithCommit to Continue because I ran into a situation where it couldn't commit so it started an infinite loop. Not sure if that might be related at this point though.
public class AdBlock : IFailuresPreprocessor
{
private readonly FailureDefinitionId blockedFailId;
private UIApplication _uiapp;
public AdBlock (FailureDefinitionId failure, UIApplication uiapp = null)
{
blockedFailId = failure;
_uiapp = uiapp;
}
public FailureProcessingResult PreprocessFailures(FailuresAccessor accessor)
{
IList<FailureMessageAccessor> failList = accessor.GetFailureMessages();
foreach (FailureMessageAccessor failure in failList)
{
FailureDefinitionId failId = failure.GetFailureDefinitionId();
Guid failGuid = failId.Guid;
FailureDefinitionRegistry failReg = Autodesk.Revit.ApplicationServices.Application.GetFailureDefinitionRegistry();
StringBuilder sb = new StringBuilder();
Type type = typeof(BuiltInFailures);
Type[] nested = type.GetNestedTypes(System.Reflection.BindingFlags.Public);
Dictionary<Guid, Type> dict = new Dictionary<Guid, Type>();
string className = string.Empty;
foreach (Type nt in nested)
{
className = nt.FullName.Replace('+', '.');
sb.AppendLine(string.Format("#### {0} ####", className));
foreach (System.Reflection.PropertyInfo pInfo in nt.GetProperties())
{
System.Reflection.MethodInfo mInfo = pInfo.GetGetMethod();
FailureDefinitionId res = mInfo.Invoke(nt, null) as FailureDefinitionId;
Guid resGuid = res.Guid;
if (res == null) continue;
if (dict.ContainsKey(res.Guid)) continue;
dict.Add(res.Guid, nt);
FailureDefinitionAccessor acc = failReg.FindFailureDefinition(res);
if (acc == null) continue;
sb.AppendLine(string.Format(" * {0} <{1}> {2}", acc.GetId().Guid, acc.GetSeverity(), className));
sb.AppendLine(string.Format(" {0}", acc.GetDescriptionText()));
}
}
className = "user-defined";
sb.AppendLine(string.Format("#### {0} ####", className));
foreach (FailureDefinitionAccessor _acc in failReg.ListAllFailureDefinitions())
{
Type DefType = null;
dict.TryGetValue(_acc.GetId().Guid, out DefType);
Guid accGuid = _acc.GetId().Guid;
if (DefType != null) continue; // failure already listed
sb.AppendLine(string.Format(" * {0} <{1}> {2}", _acc.GetId().Guid, _acc.GetSeverity(), className));
sb.AppendLine(string.Format(" {0}", _acc.GetDescriptionText()));
}
if (failId == blockedFailId)
{
if (failure.GetSeverity() == FailureSeverity.Warning)
accessor.DeleteWarning(failure);
else
{
_uiapp.Application.FailuresProcessing += new EventHandler<Autodesk.Revit.DB.Events.FailuresProcessingEventArgs>(ResolveErrors);
return FailureProcessingResult.Continue;
}
}
}
return FailureProcessingResult.Continue;
}
public void ResolveErrors(object sender, FailuresProcessingEventArgs args)
{
FailuresAccessor fa = args.GetFailuresAccessor();
List<FailureMessageAccessor> failList = new List<FailureMessageAccessor>();
failList = fa.GetFailureMessages().ToList();
foreach (FailureMessageAccessor failure in failList)
{
List<ElementId> ids = failure.GetFailingElementIds().ToList();
foreach (ElementId id in ids)
{
Element e = null;
try
{
Application app = sender as Application;
DocumentSet set = app.Documents;
DocumentSetIterator dsi = set.ForwardIterator();
dsi.MoveNext();
Document doc = dsi.Current as Document;
e = doc.GetElement(id);
}
catch (Exception ex)
{ }
if (e is Group)
{
args.SetProcessingResult(FailureProcessingResult.ProceedWithCommit);
failure.SetCurrentResolutionType(FailureResolutionType.DetachElements);
(e as Group).UngroupMembers();
fa.ResolveFailure(failure);
}
}
}
//(sender as UIApplication).Application.FailuresProcessing -= new EventHandler<FailuresProcessingEventArgs>(ResolveErrors);
}
}