//-----------------------------------------------------------
        protected override CResultAErreur MyFillFromElementDeGraphe(CElementDeArbreOperationnel element)
        {
            CResultAErreur result = CResultAErreur.True;
            CElementDeArbreOperationnelSousSchema eltSousSchema = element as CElementDeArbreOperationnelSousSchema;

            if (eltSousSchema == null)
            {
                result.EmpileErreur(I.T("Bad element type|20030"));
                return(result);
            }
            CSchemaReseau schema = new CSchemaReseau(ContexteDonnee);

            if (!schema.ReadIfExists(eltSousSchema.IdSchema))
            {
                result.EmpileErreur(I.T("Can not find schema @1|20032", eltSousSchema.IdSchema.ToString()));
                return(result);
            }
            SmtSchema            = schema;
            _sys_CleNoeudArrivee = GetKeyNoeud(eltSousSchema.NoeudArrive);
            _sys_CleNoeudDepart  = GetKeyNoeud(eltSousSchema.NoeudDepart);
            return(result);
        }
Esempio n. 2
0
        //-----------------------------------------------------------------
        /// <summary>
        /// recalcule l'arbre opérationnel
        /// </summary>
        /// <param name="baseGraphes"></param>
        /// <returns></returns>
        public CResultAErreur RecalculeArbreOperationnelInContexte(CBaseGraphesReseau baseGraphes)
        {
            if (baseGraphes == null)
            {
                baseGraphes = new CBaseGraphesReseau();
            }
            CResultAErreur result = CResultAErreur.True;
            CSchemaReseau  schema = ObjetTimosAssocie;

            //Supprime toutes les dépendances à des elements de graphe
            result = CObjetDonneeAIdNumerique.Delete(ElementsDeGraphe, true);
            if (!result)
            {
                return(result);
            }

            foreach (ESensAllerRetourLienReseau sens in Enum.GetValues(typeof(ESensAllerRetourLienReseau)))
            {
                ESensAllerRetourLienReseau?sensRetenu = null;
                if (schema.LienReseau == null)
                {
                    sensRetenu = sens;
                }
                //Calcule le graphe
                CGrapheReseau graphe = baseGraphes.GetGrapheExistant(schema, sensRetenu);
                if (graphe == null)
                {
                    graphe = new CGrapheReseau(baseGraphes);
                    result = graphe.CalculeGraphe(schema, sensRetenu);
                    if (!result)
                    {
                        return(result);
                    }
                }
                CArbreOperationnel arbre = new CArbreOperationnel();
                result = arbre.CalculArbreRedondanceAuto(schema, graphe);
                if (!result)
                {
                    return(result);
                }
                result = CSpvElementDeGraphe.CreateFromElementDeArbreOperationnel(this, arbre.ElementRacine, sensRetenu);
                if (!result)
                {
                    return(result);
                }
                if (schema.LienReseau != null)
                {
                    break;
                }
            }

            //Recalcule les éléments de graphe qui utilisent ce schéma
            CListeObjetsDonnees lstEltsUtilisantLeSchema = new CListeObjetsDonnees(ContexteDonnee, typeof(CSpvElementDeGraphe));

            lstEltsUtilisantLeSchema.Filtre = new CFiltreData(CSpvElementDeGraphe.c_champIdSchemaSmt + "=@1",
                                                              schema.Id);
            foreach (CSpvElementDeGraphe elt in lstEltsUtilisantLeSchema.ToArrayList())
            {
                CSpvElementDeGrapheSousSchema eltSpvSousSchema = elt.GetElementDuBonType() as CSpvElementDeGrapheSousSchema;
                if (eltSpvSousSchema != null)
                {
                    CNoeudDeGrapheReseau noeudDepart = eltSpvSousSchema.NoeudDepart;
                    CNoeudDeGrapheReseau noeudArrive = eltSpvSousSchema.NoeudArrive;
                    CArbreOperationnel   arbre       = new CArbreOperationnel();
                    CGrapheReseau        graphe      = baseGraphes.GetGrapheExistant(schema, eltSpvSousSchema.SensGraphe);
                    if (graphe == null)
                    {
                        graphe = new CGrapheReseau(baseGraphes);
                        result = graphe.CalculeGraphe(schema, eltSpvSousSchema.SensGraphe);
                        if (!result)
                        {
                            return(result);
                        }
                    }
                    result = arbre.CalculArbreRedondanceAuto(schema, graphe, noeudDepart, noeudArrive);
                    if (!result)
                    {
                        return(result);
                    }
                    CElementDeArbreOperationnelSousSchema eltOp = new CElementDeArbreOperationnelSousSchema(null);
                    eltOp.ElementDeArbre = arbre.ElementRacine;
                    eltOp.IdSchema       = schema.Id;
                    eltOp.NoeudArrive    = noeudArrive;
                    eltOp.NoeudDepart    = noeudDepart;

                    result = CObjetDonneeAIdNumerique.Delete(eltSpvSousSchema.ElementsFils, true);
                    if (!result)
                    {
                        return(result);
                    }
                    result = eltSpvSousSchema.FillFromElementDeGraphe(eltOp);
                    if (!result)
                    {
                        return(result);
                    }
                }
            }

            return(result);
        }