/// <summary> /// Implements the FailuresProcessing event /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void FailuresProcessing(object sender, Autodesk.Revit.DB.Events.FailuresProcessingEventArgs e) { FailuresAccessor failuresAccessor = e.GetFailuresAccessor(); //failuresAccessor String transactionName = failuresAccessor.GetTransactionName(); IList <FailureMessageAccessor> fmas = failuresAccessor.GetFailureMessages(); if (fmas.Count == 0) { e.SetProcessingResult(FailureProcessingResult.Continue); return; } if (transactionName.Equals("Error_FailuresProcessingEvent")) { foreach (FailureMessageAccessor fma in fmas) { FailureDefinitionId id = fma.GetFailureDefinitionId(); if (id == Command.m_idError) { failuresAccessor.ResolveFailure(fma); } } e.SetProcessingResult(FailureProcessingResult.ProceedWithCommit); return; } e.SetProcessingResult(FailureProcessingResult.Continue); }
/// <summary> /// Implements the FailuresProcessing event /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void FailuresProcessing(object sender, Autodesk.Revit.DB.Events.FailuresProcessingEventArgs e) { FailuresAccessor failuresAccessor = e.GetFailuresAccessor(); //failuresAccessor String transactionName = failuresAccessor.GetTransactionName(); IList <FailureMessageAccessor> failures = failuresAccessor.GetFailureMessages(); if (failures.Count != 0) { foreach (FailureMessageAccessor f in failures) { FailureDefinitionId id = f.GetFailureDefinitionId(); if (id == BuiltInFailures.JoinElementsFailures.CannotJoinElementsError) { // only default option being choosen, not good enough! //failuresAccessor.DeleteWarning(f); failuresAccessor.ResolveFailure(f); //failuresAccessor. e.SetProcessingResult(FailureProcessingResult.ProceedWithCommit); } return; } } }
private static void FaliureProcessor2(object sender, FailuresProcessingEventArgs e) { FailuresAccessor fa = e.GetFailuresAccessor(); // Inside event handler, get all warnings IList <FailureMessageAccessor> a = fa.GetFailureMessages(); int count = 0; foreach (FailureMessageAccessor failure in a) { TaskDialog.Show("Failure", failure.GetDescriptionText()); fa.ResolveFailure(failure); ++count; } if (0 < count && e.GetProcessingResult() == FailureProcessingResult.Continue) { e.SetProcessingResult( FailureProcessingResult.ProceedWithCommit); } }
/// <summary> /// Method that Revit will invoke to process failures at the end of transaction. /// </summary> /// <param name="failuresAccessor">Provides all necessary data to perform the resolution of failures.</param> /// <returns></returns> public FailureProcessingResult ProcessFailures(FailuresAccessor failuresAccessor) { IList <FailureMessageAccessor> fmas = failuresAccessor.GetFailureMessages(); if (fmas.Count == 0) { return(FailureProcessingResult.Continue); } String transactionName = failuresAccessor.GetTransactionName(); if (transactionName.Equals("Error_FailuresProcessor")) { foreach (FailureMessageAccessor fma in fmas) { FailureDefinitionId id = fma.GetFailureDefinitionId(); if (id == Command.m_idError) { failuresAccessor.ResolveFailure(fma); } } return(FailureProcessingResult.ProceedWithCommit); } else { return(FailureProcessingResult.Continue); } }
private void Application_FailuresProcessing(object sender, FailuresProcessingEventArgs e) { FailuresAccessor failuresAccessor = e.GetFailuresAccessor(); IEnumerable <FailureMessageAccessor> failureMessages = failuresAccessor.GetFailureMessages(); if (failureMessages.Count() == 0) { // FailureProcessingResult.Continue is to let // the failure cycle continue next step. e.SetProcessingResult(FailureProcessingResult.Continue); return; } else { foreach (FailureMessageAccessor failureMessage in failureMessages) { if (failureMessage.GetSeverity() == FailureSeverity.Warning) { failuresAccessor.DeleteWarning(failureMessage); } else { failuresAccessor.ResolveFailure(failureMessage); } } } //String transactionName = failuresAccessor.GetTransactionName(); e.SetProcessingResult(FailureProcessingResult.Continue); }
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); } } }
FailureProcessingResult FixFailures(FailuresAccessor failuresAccessor, IEnumerable <FailureDefinitionId> failureIds) { foreach (var failureId in failureIds) { int solvedErrors = 0; foreach (var error in failuresAccessor.GetFailureMessages().Where(x => x.GetFailureDefinitionId() == failureId)) { if (!failuresAccessor.IsFailureResolutionPermitted(error)) { continue; } // Don't try to fix two times same issue if (failuresAccessor.GetAttemptedResolutionTypes(error).Any()) { continue; } AddRuntimeMessage(error, true); failuresAccessor.ResolveFailure(error); solvedErrors++; } if (solvedErrors > 0) { return(FailureProcessingResult.ProceedWithCommit); } } return(FailureProcessingResult.Continue); }
public FailureProcessingResult PreprocessFailures(FailuresAccessor failuresAccessor) { IList <FailureMessageAccessor> failList = new List <FailureMessageAccessor>(); var criticalFails = 0; var failedElements = new List <ElementId>(); // Inside event handler, get all warnings failList = failuresAccessor.GetFailureMessages(); foreach (FailureMessageAccessor failure in failList) { // check FailureDefinitionIds against ones that you want to dismiss, //FailureDefinitionId failID = failure.GetFailureDefinitionId(); // prevent Revit from showing Unenclosed room warnings //if (failID == BuiltInFailures.RoomFailures.RoomNotEnclosed) //{ var t = failure.GetDescriptionText(); _converter.ConversionErrors.Add(new Exception(t)); var s = failure.GetSeverity(); if (s == FailureSeverity.Warning) { continue; } try { failuresAccessor.ResolveFailure(failure); } catch (Exception e) { // currently, the whole commit is rolled back. this should be investigated further at a later date // to properly proceed with commit failedElements.AddRange(failure.GetFailingElementIds()); _converter.ConversionErrors.Clear(); _converter.ConversionErrors.Add(new Exception( "Objects failed to bake due to a fatal error!\n" + "This is likely due to scaling issues - please ensure you've set the correct units on your objects or remove any invalid objects.\n\n" + "Revit error: " + t)); // logging the error var exception = new Speckle.Core.Logging.SpeckleException("Revit commit failed: " + t, e, level: Sentry.SentryLevel.Warning); return(FailureProcessingResult.ProceedWithCommit); } } failuresAccessor.DeleteAllWarnings(); return(FailureProcessingResult.Continue); }
public FailureProcessingResult PreprocessFailures( FailuresAccessor failuresAccessor) { IList <FailureResolutionType> resolutionTypeList = new List <FailureResolutionType>(); IList <FailureMessageAccessor> failureMessages = failuresAccessor.GetFailureMessages(); if (failureMessages.Count == 0) { return(FailureProcessingResult.Continue); } else { foreach (FailureMessageAccessor fma in failureMessages) { // check how many resolutions types were attempted to try to prevent // entering infinite loop /* * resolutionTypeList = failuresAccessor.GetAttemptedResolutionTypes(fma); * FailureDefinitionId failId = fma.GetFailureDefinitionId(); * * string failureName = fma.ToString(); * * if(resolutionTypeList.Count >= 3) * { * return FailureProcessingResult.ProceedWithRollBack; * } */ FailureSeverity fsav = fma.GetSeverity(); if (fsav == FailureSeverity.Warning) { failuresAccessor.DeleteWarning(fma); } else { failuresAccessor.ResolveFailure(fma); return(FailureProcessingResult.ProceedWithRollBack); } } return(FailureProcessingResult.Continue); } }
FailureProcessingResult PreprocessFailures(FailuresAccessor a) { IList<FailureMessageAccessor> failures = a.GetFailureMessages(); foreach (FailureMessageAccessor f in failures) { FailureSeverity fseverity = a.GetSeverity(); if (fseverity == FailureSeverity.Warning) { a.DeleteWarning(f); } else { a.ResolveFailure(f); return FailureProcessingResult.ProceedWithCommit; } } return FailureProcessingResult.Continue; }
/// <summary> /// Implements the FailureProcessing event /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void FailuresProcessing(object sender, FailuresProcessingEventArgs e) { FailuresAccessor failuresAccessor = e.GetFailuresAccessor(); String transactionName = failuresAccessor.GetTransactionName(); IList <FailureMessageAccessor> failures = failuresAccessor.GetFailureMessages(); if (failures.Count != 0) { foreach (FailureMessageAccessor f in failures) { FailureDefinitionId id = f.GetFailureDefinitionId(); if (id == BuiltInFailures.JoinElementsFailures.CannotJoinElementsError) { failuresAccessor.ResolveFailure(f); e.SetProcessingResult(FailureProcessingResult.ProceedWithCommit); return; } } } }
/***************************************************/ /**** Private Event Handlers ****/ /***************************************************/ private static void ControlledApplication_FailuresProcessing(object sender, Autodesk.Revit.DB.Events.FailuresProcessingEventArgs e) { bool hasFailure = false; FailuresAccessor failuresAccessor = e.GetFailuresAccessor(); List <FailureMessageAccessor> failureMessageAccessorsList = failuresAccessor.GetFailureMessages().ToList(); List <ElementId> elementsToDelete = new List <ElementId>(); foreach (FailureMessageAccessor failureMessageAccessor in failureMessageAccessorsList) { try { if (failureMessageAccessor.GetSeverity() == FailureSeverity.Warning) { failuresAccessor.DeleteWarning(failureMessageAccessor); continue; } else { failuresAccessor.ResolveFailure(failureMessageAccessor); hasFailure = true; continue; } } catch { } } if (elementsToDelete.Count != 0) { failuresAccessor.DeleteElements(elementsToDelete); } if (hasFailure) { e.SetProcessingResult(FailureProcessingResult.ProceedWithCommit); } e.SetProcessingResult(FailureProcessingResult.Continue); }
/// <summary> /// Method that Revit will invoke to process failures at the end of transaction. /// </summary> /// <param name="failuresAccessor">Provides all necessary data to perform the resolution of failures.</param> /// <returns></returns> public FailureProcessingResult ProcessFailures(FailuresAccessor failuresAccessor) { IList <FailureMessageAccessor> fmas = failuresAccessor.GetFailureMessages(); if (fmas.Count == 0) { return(FailureProcessingResult.Continue); } foreach (FailureMessageAccessor fma in fmas) { FailureDefinitionId id = fma.GetFailureDefinitionId(); if (id == BuiltInFailures.JoinElementsFailures.CannotKeepWallJoinToRoof) { failuresAccessor.ResolveFailure(fma); } } return(FailureProcessingResult.ProceedWithCommit); return(FailureProcessingResult.Continue); }
public FailureProcessingResult PreprocessFailures(FailuresAccessor failuresAccessor) { string transName = failuresAccessor.GetTransactionName(); IList <FailureMessageAccessor> failMessages = failuresAccessor.GetFailureMessages(); if (failMessages.Count == 0) { return(FailureProcessingResult.Continue); } if (transName == Properties.Messages.ElementJoin_JoinTransaction || transName == Properties.Messages.ElementJoin_UnJoinTransaction) { foreach (FailureMessageAccessor currentMessage in failMessages) { failuresAccessor.ResolveFailure(currentMessage); } return(FailureProcessingResult.ProceedWithCommit); } return(FailureProcessingResult.Continue); }
/// <summary> /// Method that Revit will invoke to process failures at the end of transaction. /// </summary> /// <param name="data"></param> /// <returns></returns> public FailureProcessingResult ProcessFailures(FailuresAccessor failuresAccessor) { // 在事务结束时调用 IList <FailureMessageAccessor> fmas = failuresAccessor.GetFailureMessages(); if (fmas.Count == 0) { return(FailureProcessingResult.Continue); } String transactionName = failuresAccessor.GetTransactionName(); // 用事件名称区分是否是要处理的错误信息 if (transactionName.Equals("Error_FailuresProcessor")) { foreach (FailureMessageAccessor fma in fmas) { FailureDefinitionId id = fma.GetFailureDefinitionId(); if (id == Command.m_idError) { // 解决这个错误(用默认的错误处理器) failuresAccessor.ResolveFailure(fma); TaskDialog.Show("title", $"我捕捉到了消息内容为\"{fma.GetDescriptionText()}\"的错误,我在后台已经把他解决掉了0.0~~"); } } // 不再抛出 return(FailureProcessingResult.ProceedWithCommit); } else { // 没有做处理,继续抛出 return(FailureProcessingResult.Continue); } }
public FailureProcessingResult PreprocessFailures (FailuresAccessor a) { IList <FailureMessageAccessor> failures = a.GetFailureMessages(); FailureProcessingResult result = FailureProcessingResult.Continue; foreach (FailureMessageAccessor f in failures) { string s = f.GetDescriptionText(); var severity = f.GetSeverity(); //auto resolve detach error if (severity == FailureSeverity.Error && f.HasResolutionOfType(FailureResolutionType.DetachElements)) { DetachedIds.AddRange(f.GetFailingElementIds()); f.SetCurrentResolutionType(FailureResolutionType.DetachElements); a.ResolveFailure(f); result = FailureProcessingResult.ProceedWithCommit; } //serious errors: waiting for user input else if (severity == FailureSeverity.Error || severity == FailureSeverity.DocumentCorruption) { result = FailureProcessingResult.WaitForUserInput; break; } //ignore all warnings else { a.DeleteWarning(f); } } return(result); }
/// <summary> /// Method that Revit will invoke to process failures at the end of transaction. /// </summary> /// <param name="failuresAccessor">Provides all necessary data to perform the resolution of failures.</param> /// <returns></returns> public FailureProcessingResult ProcessFailures(FailuresAccessor failuresAccessor) { IList<FailureMessageAccessor> fmas = failuresAccessor.GetFailureMessages(); if (fmas.Count == 0) { return FailureProcessingResult.Continue; } String transactionName = failuresAccessor.GetTransactionName(); if (transactionName.Equals("Error_FailuresProcessor")) { foreach (FailureMessageAccessor fma in fmas) { FailureDefinitionId id = fma.GetFailureDefinitionId(); if (id == Command.m_idError) { failuresAccessor.ResolveFailure(fma); } } return FailureProcessingResult.ProceedWithCommit; } else { return FailureProcessingResult.Continue; } }
FailureProcessingResult PreprocessFailures( FailuresAccessor a) { IList<FailureMessageAccessor> failures = a.GetFailureMessages(); foreach( FailureMessageAccessor f in failures ) { FailureSeverity fseverity = a.GetSeverity(); if( fseverity == FailureSeverity.Warning ) { a.DeleteWarning( f ); } else { a.ResolveFailure( f ); return FailureProcessingResult.ProceedWithCommit; } } return FailureProcessingResult.Continue; }
/// <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); }