示例#1
0
        /// <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);
        }
示例#2
0
        /// <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;
        }
示例#3
0
        /// <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);
        }
示例#4
0
        /// <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);
        }
示例#5
0
        /// <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);
        }
示例#6
0
        /// <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";
        }
示例#7
0
        /// <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);
        }