Example #1
0
        private void CreaNodos()
        {
            // Crea los Nodos.
            int númeroDeNodos = Coordenadas.Length;

            Nodos = new Nodo[númeroDeNodos];
            for (int i = 0; i < númeroDeNodos; ++i)
            {
                Nodos[i] = new Nodo(this, i);
            }
            foreach (Campo campo in Campos)
            {
                CampoNodoRuteable campoNodoRuteable = campo as CampoNodoRuteable;
                if (campoNodoRuteable != null)
                {
                    Nodos[campoNodoRuteable.IndiceDeCoordenadas].HacerRuteable(campoNodoRuteable);
                }
            }
        }
Example #2
0
        /// <summary>
        /// Añade un nodo ruteable.
        /// </summary>
        /// <param name="elIndice">El índice del nodo ruteable.</param>
        /// <param name="elIdentificadorGlobal">El identificador global.</param>
        /// <param name="laRazón">La razón.</param>
        public void AñadeNodoRuteable(int elIndice, int elIdentificadorGlobal, string laRazón)
        {
            // Hacer el nodo ruteable sin importar si ya era ruteable en caso
            // de que el identificador global sea diferente.
            Nodo nodoAHacerRuteable = Nodos[elIndice];

            // Si el nodo es ruteable pero con un identificador
            // global distinto entonces actualizamos el campo.
            // Si el identificador global es igual entonces no tenemos que hacer nada.
            if (nodoAHacerRuteable.EsRuteable)
            {
                if (nodoAHacerRuteable.CampoNodoRuteable.IdentificadorGlobal != elIdentificadorGlobal)
                {
                    CampoNodoRuteable nuevoCampoNodoRuteable = new CampoNodoRuteable(
                        CampoNodoRuteable.IdentificadorDeNodo,
                        elIndice,
                        elIdentificadorGlobal,
                        false);

                    // Actualiza el campo.
                    CambiaCampo(nuevoCampoNodoRuteable, nodoAHacerRuteable.CampoNodoRuteable, laRazón);

                    // Actualiza el nodo.
                    nodoAHacerRuteable.HacerRuteable(nuevoCampoNodoRuteable);

                    // TODO: Actualiza tabla global de nodos ruteables.
                }
            }
            // El nodo no era ruteable. Tenemos que insertar el campo de nodo
            // ruteable y hacer el nodo ruteable.
            else
            {
                CampoNodoRuteable nuevoCampoNodoRuteable = new CampoNodoRuteable(
                    CampoNodoRuteable.IdentificadorDeNodo,
                    elIndice,
                    elIdentificadorGlobal,
                    false);

                // El nuevo campo nodo ruteable hay que insertarlo si tiene
                // un índice de coordenadas menor que alguno de los nodos
                // ruteables que ya existen.
                CampoNodoRuteable campoEnDondeInsertar    = null;
                CampoNodoRuteable últimoCampoNodoRuteable = null;
                foreach (var nodo in Nodos)
                {
                    if (nodo.EsRuteable)
                    {
                        últimoCampoNodoRuteable = nodo.CampoNodoRuteable;

                        if (elIndice < nodo.Indice)
                        {
                            campoEnDondeInsertar = nodo.CampoNodoRuteable;
                        }
                    }
                }

                // Si existe el campo en donde insertar entonces procedemos.
                if (campoEnDondeInsertar != null)
                {
                    int indice = Campos.IndexOf(campoEnDondeInsertar);
                    InsertaCampo(nuevoCampoNodoRuteable, indice);
                }
                // Si no existe el campo en donde insertar entonces lo
                // insertamos depues del último campo de nodo ruteable.
                // Si no hay nnigún campo de nodo ruteable entonces
                // insertamos el campo al final de todos los campos.
                else
                {
                    if (últimoCampoNodoRuteable != null)
                    {
                        int indice = Campos.IndexOf(últimoCampoNodoRuteable);
                        InsertaCampo(nuevoCampoNodoRuteable, indice);
                    }
                    else
                    {
                        int indice = Campos.Count;
                        InsertaCampo(nuevoCampoNodoRuteable, indice);
                    }
                }

                // Hacer el nodo ruteable.
                nodoAHacerRuteable.HacerRuteable(nuevoCampoNodoRuteable);

                // TODO: Actualiza tabla global de nodos ruteables.
            }
        }
Example #3
0
        /// <summary>
        /// Añade un nodo ruteable.
        /// </summary>
        /// <param name="elIndice">El índice del nodo ruteable.</param>
        /// <param name="elIdentificadorGlobal">El identificador global.</param>
        /// <param name="laRazón">La razón.</param>
        public void AñadeNodoRuteable(int elIndice, int elIdentificadorGlobal, string laRazón)
        {
            // Hacer el nodo ruteable sin importar si ya era ruteable en caso
              // de que el identificador global sea diferente.
              Nodo nodoAHacerRuteable = Nodos[elIndice];

              // Si el nodo es ruteable pero con un identificador
              // global distinto entonces actualizamos el campo.
              // Si el identificador global es igual entonces no tenemos que hacer nada.
              if (nodoAHacerRuteable.EsRuteable)
              {
            if (nodoAHacerRuteable.CampoNodoRuteable.IdentificadorGlobal != elIdentificadorGlobal)
            {
              CampoNodoRuteable nuevoCampoNodoRuteable = new CampoNodoRuteable(
            CampoNodoRuteable.IdentificadorDeNodo,
            elIndice,
            elIdentificadorGlobal,
            false);

              // Actualiza el campo.
              CambiaCampo(nuevoCampoNodoRuteable, nodoAHacerRuteable.CampoNodoRuteable, laRazón);

              // Actualiza el nodo.
              nodoAHacerRuteable.HacerRuteable(nuevoCampoNodoRuteable);

              // TODO: Actualiza tabla global de nodos ruteables.
            }
              }
              // El nodo no era ruteable. Tenemos que insertar el campo de nodo
              // ruteable y hacer el nodo ruteable.
              else
              {
            CampoNodoRuteable nuevoCampoNodoRuteable = new CampoNodoRuteable(
              CampoNodoRuteable.IdentificadorDeNodo,
              elIndice,
              elIdentificadorGlobal,
              false);

            // El nuevo campo nodo ruteable hay que insertarlo si tiene
            // un índice de coordenadas menor que alguno de los nodos
            // ruteables que ya existen.
            CampoNodoRuteable campoEnDondeInsertar = null;
            CampoNodoRuteable últimoCampoNodoRuteable = null;
            foreach (var nodo in Nodos)
            {
              if (nodo.EsRuteable)
              {
            últimoCampoNodoRuteable = nodo.CampoNodoRuteable;

            if (elIndice < nodo.Indice)
            {
              campoEnDondeInsertar = nodo.CampoNodoRuteable;
            }
              }
            }

            // Si existe el campo en donde insertar entonces procedemos.
            if (campoEnDondeInsertar != null)
            {
              int indice = Campos.IndexOf(campoEnDondeInsertar);
              InsertaCampo(nuevoCampoNodoRuteable, indice);
            }
            // Si no existe el campo en donde insertar entonces lo
            // insertamos depues del último campo de nodo ruteable.
            // Si no hay nnigún campo de nodo ruteable entonces
            // insertamos el campo al final de todos los campos.
            else
            {
              if (últimoCampoNodoRuteable != null)
              {
            int indice = Campos.IndexOf(últimoCampoNodoRuteable);
            InsertaCampo(nuevoCampoNodoRuteable, indice);
              }
              else
              {
            int indice = Campos.Count;
            InsertaCampo(nuevoCampoNodoRuteable, indice);
              }
            }

            // Hacer el nodo ruteable.
            nodoAHacerRuteable.HacerRuteable(nuevoCampoNodoRuteable);

            // TODO: Actualiza tabla global de nodos ruteables.
              }
        }
Example #4
0
 /// <summary>
 /// Hace el nodo ruteable.
 /// </summary>
 /// <param name="elCampoNodoRuteable">El campo nodo ruteable.</param>
 public void HacerRuteable(CampoNodoRuteable elCampoNodoRuteable)
 {
     EsRuteable        = true;
     CampoNodoRuteable = elCampoNodoRuteable;
 }
        private static void Guarda(CampoNodoRuteable elCampoNodo, int elNúmero, StreamWriter elEscritor)
        {
            // Crea el texto.
              string texto = string.Format("{0},{1}", elCampoNodo.IndiceDeCoordenadas, elCampoNodo.IdentificadorGlobal);
              if (elCampoNodo.EsExterno)
              {
            texto += ",1";
              }
              else
              {
            texto += ",0";
              }

              Guarda(elCampoNodo, elNúmero, texto, elEscritor);
        }
Example #6
0
 /// <summary>
 /// Hace el nodo ruteable.
 /// </summary>
 /// <param name="elCampoNodoRuteable">El campo nodo ruteable.</param>
 public void HacerRuteable(CampoNodoRuteable elCampoNodoRuteable)
 {
     EsRuteable = true;
       CampoNodoRuteable = elCampoNodoRuteable;
 }
        private static CampoNodoRuteable LeeCampoNodo(
            string elIdentificador,
            string elTexto)
        {
            // Verifica que tenemos 3 partes.
              string[] partes = elTexto.Split(',');
              if (partes.Length != 3)
              {
            throw new ArgumentException(string.Format("El texto del campo de nodo debe tener tres partes: {0}", elTexto));
              }

              // Extrae los parámetros del nodo.
              int indice = Convert.ToInt32(partes[0]);
              int identificador = Convert.ToInt32(partes[1]);
              int esExternoComoNúmero = Convert.ToInt32(partes[2]);
              bool esExterno;
              switch (esExternoComoNúmero)
              {
            case 0:
              esExterno = false;
              break;
            case 1:
              esExterno = true;
              break;
            default:
              throw new ArgumentException(string.Format("El tercer parámetro debe ser 0 ó 1: {0}", elTexto));
              }

              // Crea el nodo.
              var nodo = new CampoNodoRuteable(
            elIdentificador,
            indice,
            identificador,
            esExterno);

              return nodo;
        }