static private void OnFailuresProcessingEvent(object sender, FailuresProcessingEventArgs e) { FailuresAccessor failuresAccessor = e.GetFailuresAccessor(); IList <FailureMessageAccessor> failureMessages = failuresAccessor.GetFailureMessages(); if (failureMessages.Count == 0) { return; } foreach (FailureMessageAccessor failure in failureMessages) { if (failure.GetSeverity() == FailureSeverity.Error) { FailureResolutionType type = FailureResolutionType.Invalid; if (failure.HasResolutions() && GetFailureResolutionType(failuresAccessor, failure, ref type)) { failure.SetCurrentResolutionType(type); failuresAccessor.ResolveFailure(failure); e.SetProcessingResult(FailureProcessingResult.ProceedWithCommit); } } if (failure.GetSeverity() == FailureSeverity.Warning) { failuresAccessor.DeleteWarning(failure); } } }
/// <summary> /// This is an event handler that responds to a failure according to the current settings /// </summary> /// <param name="sender">The sending object, i.e. the Revit application</param> /// <param name="e">The event arguments</param> public void AutoOptionsFailureHandler(Object sender, Autodesk.Revit.DB.Events.FailuresProcessingEventArgs e) { //don't process if handling is turned off if (currentSettings.HandlingActive == false) { return; } //update the uiApp reference Application RevitApp = sender as Application; uiApp = new UIApplication(RevitApp); FailuresAccessor fa = e.GetFailuresAccessor(); //this is the action that will be taken to attempt resolution. Default is to continue the default Revit failure processing FailureProcessingResult action = FailureProcessingResult.Continue; foreach (FailureMessageAccessor fma in fa.GetFailureMessages()) { AutoFailureHandlingOptions aFOpts = currentSettings.AllFailureOptions .Where(x => x.FailureGuid == fma.GetFailureDefinitionId().Guid) .FirstOrDefault(); if (aFOpts != null) { //Show the CatchFailures dialog if a failure was caught if (currentSettings.InteractiveModeEnabled) { try { //todo: clone to allow roll-back? FailureCatcherWindow failWin = new FailureCatcherWindow(currentSettings, aFOpts, uiApp); Boolean?result = failWin.ShowDialog(); if (result.Value) { //Write changes to the .ini currentSettings.LastUpdate = DateTime.Now; IAutoOptionsRepository settingsRepo = new AutoOptionsConfigFileRepo(); settingsRepo.WriteAutoOptions(currentSettings); } } catch (Exception ex) { TaskDialog.Show("ex", ex.Message + "\n" + ex.StackTrace); throw; } } FailureResolutionOption selectedResolution = aFOpts.SelectedResolution; if (selectedResolution is AutoOptionsResolution) { try { switch (((AutoOptionsResolution)selectedResolution).Resolution) { case AutoOptionsResolutionType.NoAction: break; case AutoOptionsResolutionType.DeleteAffected: fa.DeleteElements(fma.GetFailingElementIds().ToList()); action = FailureProcessingResult.ProceedWithCommit; break; case AutoOptionsResolutionType.CancelTransaction: //todo: not working, being overwritten? action = FailureProcessingResult.ProceedWithRollBack; e.SetProcessingResult(action); fa.RollBackPendingTransaction(); return; case AutoOptionsResolutionType.HideWarning: //todo: check if actually is a warning? fa.DeleteWarning(fma); break; default: break; } } catch (Exception ex) { TaskDialog.Show("Dispatcher", ex.Message + "\n" + ex.Source + "\n" + ex.StackTrace); } } else if (selectedResolution is RevitResolution) { try { FailureResolutionType fRT = ((RevitResolution)selectedResolution).Resolution; if (fma.HasResolutionOfType(fRT)) { fma.SetCurrentResolutionType(fRT); fa.ResolveFailure(fma); action = FailureProcessingResult.ProceedWithCommit; } else { TaskDialog.Show("AutoOptions", "The selected automatic resolution \n***" + aFOpts.SelectedResolution.FriendlyCaption + " (" + fRT + ")***\ncan't be used"); } } catch (Exception ex) { TaskDialog.Show("Dispatcher", ex.Message + "\n" + ex.Source + "\n" + ex.StackTrace); } } } } e.SetProcessingResult(action); }
static private bool GetFailureResolutionType(FailuresAccessor failuresAccessor, FailureMessageAccessor failure, ref FailureResolutionType type) { IList <FailureResolutionType> resolutionTypeList = failuresAccessor.GetAttemptedResolutionTypes(failure); if (!resolutionTypeList.Contains(FailureResolutionType.Default) && failure.HasResolutionOfType(FailureResolutionType.Default)) { type = FailureResolutionType.Default; return(true); } else if (!resolutionTypeList.Contains(FailureResolutionType.CreateElements) && failure.HasResolutionOfType(FailureResolutionType.CreateElements)) { type = FailureResolutionType.CreateElements; return(true); } else if (!resolutionTypeList.Contains(FailureResolutionType.DeleteElements) && failure.HasResolutionOfType(FailureResolutionType.DeleteElements)) { type = FailureResolutionType.DeleteElements; return(true); } else if (!resolutionTypeList.Contains(FailureResolutionType.SkipElements) && failure.HasResolutionOfType(FailureResolutionType.SkipElements)) { type = FailureResolutionType.SkipElements; return(true); } else if (!resolutionTypeList.Contains(FailureResolutionType.MoveElements) && failure.HasResolutionOfType(FailureResolutionType.MoveElements)) { type = FailureResolutionType.MoveElements; return(true); } else if (!resolutionTypeList.Contains(FailureResolutionType.FixElements) && failure.HasResolutionOfType(FailureResolutionType.FixElements)) { type = FailureResolutionType.FixElements; return(true); } else if (!resolutionTypeList.Contains(FailureResolutionType.DetachElements) && failure.HasResolutionOfType(FailureResolutionType.DetachElements)) { type = FailureResolutionType.DetachElements; return(true); } else if (!resolutionTypeList.Contains(FailureResolutionType.QuitEditMode) && failure.HasResolutionOfType(FailureResolutionType.QuitEditMode)) { type = FailureResolutionType.QuitEditMode; return(true); } else if (!resolutionTypeList.Contains(FailureResolutionType.UnlockConstraints) && failure.HasResolutionOfType(FailureResolutionType.UnlockConstraints)) { type = FailureResolutionType.UnlockConstraints; return(true); } else if (!resolutionTypeList.Contains(FailureResolutionType.SetValue) && failure.HasResolutionOfType(FailureResolutionType.SetValue)) { type = FailureResolutionType.SetValue; return(true); } else if (!resolutionTypeList.Contains(FailureResolutionType.SaveDocument) && failure.HasResolutionOfType(FailureResolutionType.SaveDocument)) { type = FailureResolutionType.SaveDocument; return(true); } else if (!resolutionTypeList.Contains(FailureResolutionType.ShowElements) && failure.HasResolutionOfType(FailureResolutionType.ShowElements)) { type = FailureResolutionType.ShowElements; return(true); } else if (!resolutionTypeList.Contains(FailureResolutionType.Others) && failure.HasResolutionOfType(FailureResolutionType.Others)) { type = FailureResolutionType.Others; return(true); } return(false); }