/// <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); }
/// <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); }