/// <summary> /// Aggiunge un ramo tra un nodo ed un punto /// </summary> /// <param name="id1">id primo nodo </param> /// <param name="p2">Point2d secondo nodo</param> /// <returns>Elemento o null</returns> public Elemento AddRamo(uint id1, Point2D p2) { Ramo r = null; Nodo n2 = (Nodo)AddNodo(p2); if (n2 != null) { r = (Ramo)AddRamo(id1, n2.ID); } return(r); }
/// <summary> /// Scambia i nodi del ramo /// </summary> /// <param name="r"></param> private void InverteRamo(Ramo r) { Nodo nTmp; uint idTmp; idTmp = r.N1; nTmp = r.Nd1; r.N1 = r.N2; r.Nd1 = r.Nd2; r.N2 = idTmp; r.Nd2 = nTmp; }
/// <summary> /// Aggiunge un ramo tra due punti /// </summary> /// <param name="p1">Point2d</param> /// <param name="p2">Point2d</param> /// <returns>Elemento o null</returns> public Elemento AddRamo(Point2D p1, Point2D p2) { Ramo r = null; Nodo n1 = (Nodo)AddNodo(p1); Nodo n2 = (Nodo)AddNodo(p2); if ((n1 != null) && (n2 != null)) { r = (Ramo)AddRamo(n1.ID, n2.ID); } return(r); }
/// <summary> /// Aggiunge un ramo tra due nodi /// </summary> /// <param name="id1">primo id</param> /// <param name="id2">secondo id</param> /// <returns>Elemento o null</returns> public Elemento AddRamo(uint id1, uint id2) { Ramo r = new Ramo(); r.N1 = id1; r.N2 = id2; if (!dati.Add(r)) { return(null); } _isModified = true; return(r); }
/// <summary> /// Imposta i rif. ai nodi usando l'ID /// </summary> /// <param name="r"></param> /// <returns></returns> private bool AggiornaRifNodiInRamo(Ramo r) { bool ok = false; Nodo nd1, nd2; nd1 = (Nodo)GetElemento(r.N1, Def.Stat.Nodi); nd2 = (Nodo)GetElemento(r.N2, Def.Stat.Nodi); if ((nd1 != null) && (nd2 != null)) { r.Nd1 = nd1; r.Nd2 = nd2; ok = true; } return(ok); }
/// <summary> /// Divide in due un ramo /// </summary> /// <param name="r"></param> private void DivideRamo(Ramo r) { Nodo n = (Nodo)AddNodo(Point2D.Midpoint(r.Nd1.P, r.Nd2.P)); // Nuovo nodo nel punto medio uint id1, id2, id3; id1 = r.N1; // I nuovi id degli estremi id2 = n.ID; id3 = r.N2; dati.EliminaRamo(r.ID); // Elimina il ramo r Ramo r1 = (Ramo)AddRamo(id1, id2); // Crea i nuovi rami Ramo r2 = (Ramo)AddRamo(id2, id3); r1.CopyData(r); // Copia le proprietà r2.CopyData(r); r1.Name += ".1"; // Diversifica i nomi r2.Name += ".2"; }
/// <summary> /// Crea la matice di incidenza /// eliminando, se richiesto, il nodo selezionato /// per non avere le righe linearmente dipendenti /// </summary> /// <param name="eliminaNodoSelezionato">true per eliminare il nodo</param> /// <returns></returns> public Matrix CreaMatriceDiIncidenza(bool eliminaNodoSelezionato) { Matrix A = null; uint nodoDaEliminare = Elemento.UNASSIGNED; if (CompattaID()) // Compatta gli ID { if (VerificaNodiIsolati(false)) // Verifica se il circuito è connesso (senza cambiare lo stato di selezione) { List <Elemento> sel = GetSelezionati(true); // Cerca gli elementi selezionati if (eliminaNodoSelezionato && sel.Count > 0) // Se è richiesta la matrice ridotta (e c'é qualcosa di selezionato) { if (sel.Count == 1) // Verifica se selezione multipla { if (sel[0] is Nodo) // Verifica se è selezionato un nodo { nodoDaEliminare = sel[0].ID; // Imposta l'ID } else { Messaggi.AddMessage(Messaggi.ERR.SELEZIONE_ERRATA, Messaggi.MSG.SELEZIONARE_UN_NODO, Messaggi.Tipo.Errori); } } else { Messaggi.AddMessage(Messaggi.ERR.SELEZIONE_ERRATA, Messaggi.MSG.SELEZIONARE_UN_NODO, Messaggi.Tipo.Errori); } } int n, l; // nodi e rami/lati totali n = nodi.Count; l = rami.Count; A = new Matrix(n, l); // Crea la matrice completa int i, j; for (j = 1; j <= l; j++) { Ramo ramoj = (Ramo)GetElemento((uint)j, Def.Stat.Rami); if (ramoj != null) { uint uscenteDaN = ramoj.N1; uint entranteInN = ramoj.N2; for (i = 1; i <= n; i++) { if (i == uscenteDaN) { A[i - 1, j - 1] = +1; } else if (i == entranteInN) { A[i - 1, j - 1] = -1; } else { A[i - 1, j - 1] = 0; } } } else { Messaggi.AddMessage(String.Format("Ramo con ID={0} non trovato."), "Errore", Messaggi.Tipo.Errori); A = null; } } if (nodoDaEliminare != Nodo.UNASSIGNED) { A.RemRow((int)nodoDaEliminare - 1); } } else { Messaggi.AddMessage(Messaggi.ERR.CIRCUITO_NON_CONNESSO, "", Messaggi.Tipo.Errori); } } else { Messaggi.AddMessage(Messaggi.ERR.ERRORE_RINUMERAZIONE, "", Messaggi.Tipo.Errori); } return(A); }