예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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;
                }
            }
        }
예제 #3
0
        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);
            }
        }
예제 #4
0
        /// <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);
            }
        }
예제 #5
0
        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);
        }
예제 #8
0
        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);
        }
예제 #9
0
        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);
            }
        }
예제 #10
0
        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;
        }
예제 #11
0
        /// <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;
                    }
                }
            }
        }
예제 #12
0
        /***************************************************/
        /****           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);
        }
예제 #13
0
        /// <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);
        }
예제 #14
0
        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);
        }
예제 #15
0
        /// <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);
            }
        }
예제 #16
0
        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);
        }
예제 #17
0
파일: Command.cs 프로젝트: AMEE/revit
        /// <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);
        }