Exemplo n.º 1
0
        private void m_btnGraphe_Click(object sender, EventArgs e)
        {
            if (m_schemaReseau == null)
            {
                return;
            }
            CGrapheReseau  graphe = new CGrapheReseau();
            CResultAErreur result = graphe.CalculeGraphe(m_schemaReseau, ESensAllerRetourLienReseau.Forward);

            if (!result)
            {
                CFormAlerte.Afficher(result.Erreur);
                return;
            }
            CArbreOperationnel arbre = new CArbreOperationnel();

            result = arbre.CalculArbreRedondanceAuto(m_schemaReseau, graphe);
            string strTexte = "";

            if (result)
            {
                strTexte = arbre.ElementRacine.ToString();
                Clipboard.SetText(strTexte);
                CFormTesteArbreElementDeGraphe.AfficheArbre(arbre);
            }
        }
        private void CalculArbreOperationnel()
        {
            // Calcul les graphes
            CResultAErreur result = CResultAErreur.True;

            CGrapheReseau grapheAller = new CGrapheReseau();

            result = grapheAller.CalculeGraphe(m_schema, ESensAllerRetourLienReseau.Forward);
            if (result)
            {
                result = m_arbreAller.CalculArbreRedondanceAuto(m_schema, grapheAller);
            }

            CGrapheReseau grapheRetour = new CGrapheReseau();

            result = grapheRetour.CalculeGraphe(m_schema, ESensAllerRetourLienReseau.Backward);
            if (result)
            {
                result = m_arbreRetour.CalculArbreRedondanceAuto(m_schema, grapheAller);
            }


            foreach (CInfoElementDeSchemaSupervise info in this.ListeFils)
            {
                CInfoSchemaDeSchemaSupervise infoSchema = info as CInfoSchemaDeSchemaSupervise;
                if (infoSchema != null)
                {
                    infoSchema.CalculArbreOperationnel();
                }
            }
        }
Exemplo n.º 3
0
        public CResultAErreur CalculArbreTousNecessaires(
            CSchemaReseau schema,
            CGrapheReseau graphe)
        {
            CResultAErreur result = CResultAErreur.True;

            return(result);
        }
Exemplo n.º 4
0
 //-------------------------------------------------
 /// <summary>
 /// Calcule un arbre en mode redondance auto pour
 /// un schéma
 /// </summary>
 /// <param name="schema"></param>
 /// <param name="graphe"></param>
 /// <returns></returns>
 public CResultAErreur CalculArbreRedondanceAuto(
     CSchemaReseau schema,
     CGrapheReseau graphe)
 {
     return(CalculArbreRedondanceAuto(
                schema,
                graphe,
                null,
                null));
 }
Exemplo n.º 5
0
        public CResultAErreur CalculeArbre(
            CSchemaReseau schema,
            ESensAllerRetourLienReseau sens,
            CBaseGraphesReseau baseGraphes)
        {
            CResultAErreur result = CResultAErreur.True;

            if (baseGraphes == null)
            {
                baseGraphes = new CBaseGraphesReseau();
            }

            CGrapheReseau graphe = baseGraphes.GetGrapheExistant(schema, sens);

            if (graphe == null)
            {
                graphe = new CGrapheReseau(baseGraphes);
                result = graphe.CalculeGraphe(schema, sens);
                if (!result)
                {
                    return(result);
                }
                baseGraphes.AddGrapheReseau(schema.Id, sens, graphe);
            }

            switch (schema.ModeOperationnel.Code)
            {
            case EModeOperationnelSchema.AllMandatory:
                return(CalculArbreTousNecessaires(schema, graphe));

            case EModeOperationnelSchema.AutomaticRedundancy:
                return(CalculArbreRedondanceAuto(schema, graphe));

            case EModeOperationnelSchema.Custom:
                result.EmpileErreur("For future use");
                return(result);

            default:
                break;
            }

            return(result);
        }
        /// <summary>
        /// Le data du result contient l'élément de cablage ou null
        /// </summary>
        /// <param name="sens"></param>
        /// <param name="contexteDonnee"></param>
        /// <returns></returns>
        public CResultAErreur GetElementCablage(
            ESensAllerRetourLienReseau?sens,
            CContexteDonnee contexteDonnee)
        {
            CResultAErreur result = CResultAErreur.True;

            CNoeudDeGrapheReseauSite noeudSite = Composant as CNoeudDeGrapheReseauSite;

            if (noeudSite == null || !noeudSite.IsCable)//Pas un site ou pas cablé
            {
                return(result);
            }

            CSchemaReseau schema = new CSchemaReseau(contexteDonnee);

            if (!schema.ReadIfExists(Composant.IdSchemaReseau))
            {
                result.EmpileErreur(I.T("Can not find network diagram @1|20051", Composant.IdSchemaReseau.ToString()));
                return(result);
            }

            CSchemaReseau schemaCablage = schema.GetSousSchemas().FirstOrDefault(s =>
                                                                                 s.SiteApparenance != null &&
                                                                                 s.SiteApparenance.Id == noeudSite.IdSite);


            CGrapheReseau grapheCablage = new CGrapheReseau(null);

            result = grapheCablage.CalculeGraphe(schemaCablage, sens);
            if (!result)
            {
                return(result);
            }
            CArbreOperationnel arbreGraphe = new CArbreOperationnel();

            result = arbreGraphe.CalculArbreRedondanceAuto(schemaCablage, grapheCablage);
            if (result)
            {
                result.Data = arbreGraphe.ElementRacine;
            }
            return(result);
        }
        protected void PrepareSupervisionEtatOperationnel(CSchemaReseau schema)
        {
            m_listeGraphes.Clear();
            List <ESensAllerRetourLienReseau?> lstToCalcul = new List <ESensAllerRetourLienReseau?>();

            if (schema.LienReseau != null)
            {
                lstToCalcul.Add(null);
            }
            else
            {
                lstToCalcul.Add(ESensAllerRetourLienReseau.Forward);
                lstToCalcul.Add(ESensAllerRetourLienReseau.Backward);
            }
            foreach (ESensAllerRetourLienReseau?sens in lstToCalcul)
            {
                CGrapheReseau graphe = m_base.BaseGraphes.GetGrapheExistant(schema, sens);
                if (graphe == null)
                {
                    graphe = new CGrapheReseau(m_base.BaseGraphes);
                    graphe.IntegreLiaison = IntegreLienInGraphe;
                    if (graphe.CalculeGraphe(schema, sens))
                    {
                        m_listeGraphes.Add(graphe);
                    }
                }
                else
                {
                    m_listeGraphes.Add(graphe);
                }
            }
            if (m_listeGraphes.Count == 2)
            {
                //Si l'un des graphes a des liens et pas l'autre, supprime ce graphe
                int nNbLiens1 = m_listeGraphes[0].GetLiensNiveau0().Length;
                int nNbLiens2 = m_listeGraphes[1].GetLiensNiveau0().Length;
                if (nNbLiens1 == 0 && nNbLiens2 != 0)
                {
                    m_listeGraphes.RemoveAt(0);
                }
                else if (nNbLiens2 == 0)
                {
                    m_listeGraphes.RemoveAt(1);
                }
            }


            //Calcule tous les chemins de point d'entrée à point de sortie.
            m_baseChemins.Clear();
            m_dicNoeudsIsoles = new Dictionary <CNoeudDeGrapheReseau, bool>();
            if (m_listeGraphes.Count > 0)
            {
                foreach (CNoeudDeGrapheReseau noeud in m_listeGraphes[0].GetNoeudsIsoles())
                {
                    m_dicNoeudsIsoles[noeud] = true;
                }
            }
            int nIndex = 0;

            foreach (CGrapheReseau graphe in m_listeGraphes)
            {
                List <CNoeudDeGrapheReseau> noeudsDepart = new List <CNoeudDeGrapheReseau>(graphe.GetNoeudsEntreeNiveau0());
                List <CNoeudDeGrapheReseau> noeudsArrive = new List <CNoeudDeGrapheReseau>(graphe.GetNoeudsSortieNiveau0());
                foreach (CNoeudDeGrapheReseau noeudDepart in noeudsDepart)
                {
                    if (m_dicNoeudsIsoles.ContainsKey(noeudDepart))
                    {
                        m_dicNoeudsIsoles.Remove(noeudDepart);
                    }
                    foreach (CNoeudDeGrapheReseau noeudArrivee in noeudsArrive)
                    {
                        if (m_dicNoeudsIsoles.ContainsKey(noeudArrivee))
                        {
                            m_dicNoeudsIsoles.Remove(noeudArrivee);
                        }
                        CPointAPointDeGraphe pap = new CPointAPointDeGraphe(noeudDepart, noeudArrivee);
                        m_baseChemins.Add(pap, graphe.GetChemins(noeudDepart, noeudArrivee));
                    }
                }
            }
        }
Exemplo n.º 8
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);
        }
Exemplo n.º 9
0
        //-------------------------------------------------
        /// <summary>
        /// Calcule l'arbre entre deux noeuds pour un schéma
        /// </summary>
        /// <param name="schema"></param>
        /// <param name="graphe"></param>
        /// <param name="noeudDepart"></param>
        /// <param name="noeudArrivee"></param>
        /// <returns></returns>
        public CResultAErreur CalculArbreRedondanceAuto(
            CSchemaReseau schema,
            CGrapheReseau graphe,
            CNoeudDeGrapheReseau noeudDepart,
            CNoeudDeGrapheReseau noeudArrivee)
        {
            CResultAErreur result = CResultAErreur.True;

            CNoeudDeGrapheReseau[] noeudsEntree;
            if (noeudDepart != null)
            {
                noeudsEntree = new CNoeudDeGrapheReseau[] { noeudDepart }
            }
            ;
            else if (schema.LienReseau == null)  //Ce n'est pas un schéma de lien
            {
                noeudsEntree = graphe.GetNoeudsEntreeNiveau0();
            }
            else
            {
                noeudsEntree = new CNoeudDeGrapheReseau[] {
                    graphe.GetNoeudForElement(schema.LienReseau.Element1, schema)
                };
            }
            CNoeudDeGrapheReseau[] noeudsSortie;
            if (noeudArrivee != null)
            {
                noeudsSortie = new CNoeudDeGrapheReseau[] { noeudArrivee }
            }
            ;
            else if (schema.LienReseau == null)  //Ce n'est pas un schéma de lien
            {
                noeudsSortie = graphe.GetNoeudsSortieNiveau0();
            }
            else
            {
                noeudsSortie = new CNoeudDeGrapheReseau[] {
                    graphe.GetNoeudForElement(schema.LienReseau.Element2, schema)
                };
            }

            CElementDeArbreOperationnelOperateurEt eltSource = new CElementDeArbreOperationnelOperateurEt(null);

            m_elementRacine = eltSource;

            //Ajoute les éléments seuls
            foreach (CNoeudDeGrapheReseau noeud in graphe.GetNoeudsIsoles())
            {
                if (schema.LienReseau == null || noeud.Equals(noeudsEntree[0]) || noeud.Equals(noeudsSortie[0]))
                //si c'est un schéma de lien n'ajoute que les noeuds isolé correspondant à l'entrée ou à la sortie
                {
                    CElementDeArbreOperationnelEntite composant = new CElementDeArbreOperationnelEntite(eltSource, noeud);
                    eltSource.AddFils(composant);
                    result = composant.GetElementCablage(graphe.SensDuGraphe, schema.ContexteDonnee);
                    if (!result)
                    {
                        return(result);
                    }
                    CElementDeArbreOperationnel elementCablage = result.Data as CElementDeArbreOperationnel;
                    if (elementCablage != null)
                    {
                        eltSource.AddFils(elementCablage);
                    }
                }
            }

            foreach (CNoeudDeGrapheReseau noeudEntree in noeudsEntree)
            {
                foreach (CNoeudDeGrapheReseau noeudSortie in noeudsSortie)
                {
                    List <CCheminDeGrapheReseau> chemins = graphe.GetChemins(noeudEntree, noeudSortie);
                    if (chemins.Count() > 0)
                    {
                        CElementDeArbreOperationnelOperateurOu ouPourExtremites = new CElementDeArbreOperationnelOperateurOu(eltSource);
                        eltSource.AddFils(ouPourExtremites);
                        foreach (CCheminDeGrapheReseau chemin in chemins) //parcours tous les chemins en mettant un ou dessus
                        {
                            Stack <CRacineDeSchema> lstRacines = new Stack <CRacineDeSchema>();
                            CRacineDeSchema         racine     = new CRacineDeSchema(schema.Id, null, new CElementDeArbreOperationnelOperateurEt(ouPourExtremites));
                            ouPourExtremites.AddFils(racine.ElementRacine);
                            lstRacines.Push(racine);
                            int nLien = 0;
                            foreach (CLienDeGrapheReseau lien in chemin.Liens)
                            {
                                CRacineDeSchema racineEnCours = lstRacines.Peek();
                                if (lien.EtapesNoeudDepart != null)
                                {
                                    int[] idsSchemas = lien.EtapesNoeudDepart.IdsSchemas;
                                    //Dépile les sous schémas
                                    for (int nEtape = idsSchemas.Count() - 1; nEtape >= 0; nEtape--)
                                    {
                                        int nIdSchema = idsSchemas[nEtape];
                                        if (racineEnCours.IdSchema != nIdSchema)
                                        {
                                            result.EmpileErreur(I.T("Bad path for link @1 in graph for @2 diagram|20050",
                                                                    lien.IdLienReseau.ToString(), lien.IdSchemaReseau.ToString()));
                                            return(result);
                                        }
                                        if (racineEnCours.ElementSousSchema != null)
                                        {
                                            racineEnCours.ElementSousSchema.NoeudArrive = lien.NoeudDepart;
                                        }
                                        lstRacines.Pop();
                                        racineEnCours = lstRacines.Peek();
                                    }
                                }
                                //Si les extremités du lien sont cablées, le lien est dans un et, sinon,
                                //il est directement sous la racine en cours
                                CElementDeArbreOperationnelOperateur elementParentDeLien = racineEnCours.ElementRacine;

                                //Si ce n'est pas le dernier lien, on ajoute que les cablages des noeuds de départ,
                                //Puisque le cablage du noeud d'arrivé sera le cablage du noeud de départ du prochain lien
                                //Par contre, si c'est le dernier lien du chemin, il faut ajouter ce cablage

                                if ((lien.NoeudDepart is CNoeudDeGrapheReseauSite && ((CNoeudDeGrapheReseauSite)lien.NoeudDepart).IsCable) ||
                                    (nLien == chemin.Liens.Count() - 1 && (lien.NoeudArrive is CNoeudDeGrapheReseauSite && ((CNoeudDeGrapheReseauSite)lien.NoeudArrive).IsCable)))
                                {
                                    elementParentDeLien = new CElementDeArbreOperationnelOperateurEt(racineEnCours.ElementRacine);
                                    racineEnCours.ElementRacine.AddFils(elementParentDeLien);
                                }
                                elementParentDeLien.AddFils(new CElementDeArbreOperationnelEntite(elementParentDeLien, lien));

                                //Cablage du site entrée
                                CNoeudDeGrapheReseauSite noeudSite = lien.NoeudDepart as CNoeudDeGrapheReseauSite;
                                if (noeudSite != null && noeudSite.IsCable)
                                {
                                    //Le noeud correspondant à l'élément est déjà dans le schéma du lien
                                    CElementDeArbreOperationnelEntite elementNoeud = new CElementDeArbreOperationnelEntite(null, noeudSite);
                                    result = elementNoeud.GetElementCablage(graphe.SensDuGraphe, schema.ContexteDonnee);
                                    if (!result)
                                    {
                                        return(result);
                                    }
                                    CElementDeArbreOperationnel elementCablage = result.Data as CElementDeArbreOperationnel;
                                    if (elementCablage != null)
                                    {
                                        elementParentDeLien.AddFils(elementCablage);
                                    }
                                }
                                //Cablage du site sortie
                                noeudSite = lien.NoeudArrive as CNoeudDeGrapheReseauSite;
                                if (noeudSite != null && noeudSite.IsCable && nLien == chemin.Liens.Count() - 1)
                                {
                                    CElementDeArbreOperationnelEntite elementNoeud = new CElementDeArbreOperationnelEntite(null, noeudSite);
                                    result = elementNoeud.GetElementCablage(graphe.SensDuGraphe, schema.ContexteDonnee);
                                    if (!result)
                                    {
                                        return(result);
                                    }
                                    CElementDeArbreOperationnel elementCablage = result.Data as CElementDeArbreOperationnel;
                                    if (elementCablage != null)
                                    {
                                        elementParentDeLien.AddFils(elementCablage);
                                    }
                                }

                                if (lien.EtapesNoeudArrivee != null)
                                {
                                    int[] idsSchemas = lien.EtapesNoeudArrivee.IdsSchemas;
                                    foreach (int nIdSchema in idsSchemas)
                                    {
                                        CElementDeArbreOperationnelSousSchema eltSousSchema = new CElementDeArbreOperationnelSousSchema(racineEnCours.ElementRacine);
                                        eltSousSchema.NoeudDepart    = lien.NoeudArrive;
                                        eltSousSchema.ElementDeArbre = new CElementDeArbreOperationnelOperateurEt(racine.ElementRacine);
                                        eltSousSchema.IdSchema       = nIdSchema;
                                        CRacineDeSchema newRacine = new CRacineDeSchema(
                                            nIdSchema,
                                            eltSousSchema,
                                            eltSousSchema.ElementDeArbre as CElementDeArbreOperationnelOperateur);
                                        lstRacines.Push(newRacine);
                                        racineEnCours.ElementRacine.AddFils(eltSousSchema);
                                        racineEnCours = newRacine;
                                    }
                                }
                                nLien++;
                            }
                        }
                    }
                }
            }
            eltSource.Simplifier();
            return(result);
        }