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