Пример #1
0
        /// <summary>
        /// Supprime les actions dont la durée est 0 du scénario.
        /// Supprime également les groupes vides qui pourraient résulter des suppressions précédentes.
        /// </summary>
        /// <param name="scenario">Le scénario.</param>
        internal static void RemoveEmptyDurationActionsAndGroupsFromNewScenario(Scenario scenario)
        {
            var emptyDurationActionsToDelete = new List <KAction>();
            var newTimings = new List <ActionTiming>();

            var derivedActions = GetActionsSortedWBS(scenario);

            // Mettre à jour IsGroup
            foreach (var action in derivedActions)
            {
                action.IsGroup = WBSHelper.HasChildren(action, derivedActions);
            }

            foreach (var action in derivedActions)
            {
                //On ne supprime pas si: la catégorie de type à supprimer &&  pas de parent dans le scenario n && originalBuildDuration!=0

                if (action.BuildDuration == 0 && !action.IsGroup &&
                    !(action.Category != null && action.Category.ActionTypeCode != null &&
                      action.Category.ActionTypeCode == KnownActionCategoryTypes.S &&
                      action.Original.Original == null &&
                      action.Reduced != null &&
                      action.Reduced.OriginalBuildDuration != 0))
                {
                    // Déplacer tous les pred vers ses succ
                    ActionsTimingsMoveManagement.MapAllPredToSucc(action, a => a.BuildDuration != 0 && !action.IsGroup, newTimings, false);

                    emptyDurationActionsToDelete.Add(action);
                    scenario.Actions.Remove(action);
                    action.Predecessors.Clear();
                    action.Successors.Clear();
                    action.MarkAsDeleted();
                }
            }

            //foreach (var action in actionsToDelete)
            //{
            //    // Mettre à jour les WBS des autres actions
            //    ActionsTimingsMoveManagement.DeleteUpdateWBS(derivedActions, action);
            //}

            if (scenario.NatureCode == KnownScenarioNatures.Realized)
            {
                foreach (var timing in newTimings)
                {
                    timing.Action.Start  = timing.Start;
                    timing.Action.Finish = timing.Finish;
                }
            }

            //actionsToDelete.Clear();
            var emptyGroupActionsToDelete = new List <KAction>();

            var actionsFiltered = GetActionsSortedWBS(scenario);

            foreach (var action in actionsFiltered)
            {
                if (action.IsGroup && !WBSHelper.HasChildren(action, actionsFiltered))
                {
                    emptyGroupActionsToDelete.Add(action);
                    scenario.Actions.Remove(action);
                    action.MarkAsDeleted();
                }
            }

            //foreach (var action in emptyGroupActionsToDelete)
            //{
            //    // Mettre à jour les WBS des autres actions
            //    ActionsTimingsMoveManagement.DeleteUpdateWBS(derivedActions, action);
            //}

            // Mettre à jour les WBS des autres actions
            var tree = derivedActions.VirtualizeTree();

            emptyDurationActionsToDelete
            .Union(emptyGroupActionsToDelete)
            .ForEach(_ => tree.Remove(_));
            tree.ApplyWBS();


            ActionsTimingsMoveManagement.DebugCheckAllWBS(EnumerableExt.Concat(scenario));
            ActionsTimingsMoveManagement.DebugCheckPredSucc(scenario.Actions, false);
        }
Пример #2
0
        /// <summary>
        /// Filtre les actions et met à jour leurs prédécesseurs et succésseurs managés.
        /// </summary>
        /// <param name="allActions">Toutes les actions.</param>
        /// <param name="excludedActionsFilter">Le filtre excluant les actions.</param>
        /// <param name="includedActionsPredSuccFilter">Le filtre incluant les actions prédécesseurs et succ.</param>
        /// <returns>Les actions filtrées.</returns>
        private ActionsDisplayResults FilterActionsUpdatePredSuccManaged(IEnumerable <KAction> allActions,
                                                                         Func <KAction, bool> excludedActionsFilter,
                                                                         Func <KAction, bool> includedActionsPredSuccFilter)
        {
            var results    = new ActionsDisplayResults();
            var newTimings = new List <ActionTiming>();

            var actionsSorted = allActions
                                .OrderBy(a => a.WBSParts, new WBSHelper.WBSComparer())
                                .ToArray();

#if DEBUG
            foreach (var action in allActions)
            {
                // S'assurer qu'une action soit un seul de : I/E/S/Group
                var isI = ActionsTimingsMoveManagement.IsActionInternal(action);
                var isE = ActionsTimingsMoveManagement.IsActionExternal(action);
                var isS = ActionsTimingsMoveManagement.IsActionDeleted(action);
                var isG = action.IsGroup;

                if (!(isI | isE | isS | isG))
                {
                    throw new InvalidOperationException("Impossible qu'une action soit à la fois I ou E ou S ou G");
                }
            }
#endif

            var actionsFinal = new List <KAction>();

            foreach (var action in actionsSorted)
            {
                action.PredecessorsManaged.Clear();
                action.SuccessorsManaged.Clear();
            }

            foreach (var action in actionsSorted)
            {
                if (excludedActionsFilter(action))
                {
                    // Déplacer tous les pred vers ses succ
                    ActionsTimingsMoveManagement.MapAllPredToSucc(action, includedActionsPredSuccFilter, newTimings, true);
                }
                else if (!action.IsGroup)
                {
                    foreach (var pred in action.Predecessors)
                    {
                        if (includedActionsPredSuccFilter(pred))
                        {
                            pred.SuccessorsManaged.Add(action);
                            action.PredecessorsManaged.Add(pred);
                        }
                    }
                    actionsFinal.Add(action);
                }
                else
                {
                    System.Diagnostics.Debug.Assert(action.IsGroup);
                    actionsFinal.Add(action);
                }
            }

            // Supprimer les liens pour les actions non présentes dans la collection
            foreach (var action in actionsFinal)
            {
                foreach (var pred in action.PredecessorsManaged.ToArray())
                {
                    if (!actionsFinal.Contains(pred))
                    {
                        action.PredecessorsManaged.Remove(pred);
                        pred.SuccessorsManaged.Remove(action);
                    }
                }

                foreach (var succ in action.SuccessorsManaged.ToArray())
                {
                    if (!actionsFinal.Contains(succ))
                    {
                        action.SuccessorsManaged.Remove(succ);
                        succ.PredecessorsManaged.Remove(action);
                    }
                }
            }

            // Il faut automatiquement supprimer les groupes qui ne contiennent plus d'enfants
            // Les groupes n'ayant ni précédesseurs ni successeurs, on peut les supprimer sans réel impact
            var copy = actionsFinal.ToArray();
            foreach (var action in copy)
            {
                if (action.IsGroup && !WBSHelper.HasChildren(action, copy))
                {
                    actionsFinal.Remove(action);
                }
            }

            results.Actions    = actionsFinal;
            results.NewTimings = newTimings;

            return(results);
        }