Beispiel #1
0
        /// <summary>
        /// Carica il documento da stream
        /// </summary>
        /// <param name="stream"></param>
        /// <param name="fileName"></param>
        /// <returns>true se ok</returns>
        public bool Open(Stream stream, string fileName)
        {
            bool ok = true;

            selezionati.Clear();
            this.filename = fileName;
            try
            {
                using (StreamReader sr = new StreamReader(stream))
                {
                    var serializer = new JsonSerializer();
                    dati = (Dati)serializer.Deserialize(sr, typeof(Dati));
                }
            }
            catch (Exception e)
            {
                ok = false;
                Messaggi.AddMessage(Messaggi.ERR.ERRORE_OPEN, e.ToString(), Messaggi.Tipo.Errori);
            }
            int failed;

            if ((failed = dati.AggiornaRiferimenti()) > 0)
            {
                ok = false;
                Messaggi.AddMessage(Messaggi.ERR.AGGIORNA_RIFERIMENTI, $"Falliti {failed} rami", Messaggi.Tipo.Errori);
            }
            if (ok)
            {
                _isModified = false;
            }
            return(ok);
        }
Beispiel #2
0
        /// <summary>
        /// Rinumera l'ID di un nodo (private)
        /// </summary>
        /// <param name="oldID"></param>
        /// <param name="newID"></param>
        /// <param name="check_max"></param>
        /// <returns></returns>
        public bool RinumeraIDnodo(uint oldID, uint newID, bool check_max)
        {
            bool            ok = false;
            List <Elemento> _old, _new;

            _old = GetElementi(oldID, Def.Stat.Nodi);                   // Nodi con l'id attuale (vecchio)
            _new = GetElementi(newID, Def.Stat.Nodi);                   // Nodi con l'id nuovo
            if ((_old.Count == 1) && (_new.Count == 0))
            {
                if ((newID < Def.ID_NODI_MAX) || !check_max)
                {
                    _old[0].ID = newID;                                             // Aggiorna l'ID del nodo
                    foreach (Ramo r in rami)                                        // Percorre tutti i rami
                    {
                        if (r.N1 == oldID)
                        {
                            r.N1 = newID;                                           // Se trova l'ID vecchio del nodo vecchio...
                        }
                        if (r.N2 == oldID)
                        {
                            r.N2 = newID;                       // ...lo aggiorna con l'ID nuovo.
                        }
                    }                                           // Gli elementi non cambiano ed i puntatori Nd1 e Nd2 ai nodo non devono esser aggiornati
                    ok = true;
                }
            }
            if (!ok)
            {
                Messaggi.AddMessage(Messaggi.ERR.ERRORE_RINUMERAZIONE_NODO, "", Messaggi.Tipo.Errori);
            }
            return(ok);
        }
Beispiel #3
0
        /// <summary>
        /// Salva il documento su strem
        /// </summary>
        /// <param name="stream"></param>
        /// <param name="fileName"></param>
        /// <returns>true se ok</returns>
        public bool Save(Stream stream, string fileName)
        {
            bool ok = true;

            selezionati.Clear();
            this.filename = fileName;
#if (DEBUG)
            System.Windows.Forms.MessageBox.Show(filename);
#endif
            try
            {
                dati.Nome = Path.GetFileName(this.filename);
            }
            catch (Exception e)
            {
                ok = false;
                Messaggi.AddMessage(Messaggi.ERR.ERRORE_FILE, e.ToString(), Messaggi.Tipo.Errori);
            }

            if (ok)
            {
                try
                {
                    using (StreamWriter sw = new StreamWriter(stream))
                    {
                        string jsonstring = JsonConvert.SerializeObject(dati, Formatting.Indented);
                        sw.Write(jsonstring);
                    }
                }
                catch (Exception e)
                {
                    ok = false;
                    Messaggi.AddMessage(Messaggi.ERR.ERRORE_SAVE, e.ToString(), Messaggi.Tipo.Errori);
                }
            }

            if (ok)
            {
                _isModified = false;
            }
            return(ok);
        }
Beispiel #4
0
        /// <summary>
        /// Rinumera l'ID di un ramo (private)
        /// </summary>
        /// <param name="oldID"></param>
        /// <param name="newID"></param>
        /// <param name="check_max">Controlla se supera l'ID_MAX</param>
        /// <returns></returns>
        private bool RinumeraIDramo(uint oldID, uint newID, bool check_max)
        {
            bool            ok = false;
            List <Elemento> _old, _new;

            _old = GetElementi(oldID, Def.Stat.Rami);                   // Rami con l'id attuale (vecchio)
            _new = GetElementi(newID, Def.Stat.Rami);                   // Rami con l'id nuovo
            if ((_old.Count == 1) && (_new.Count == 0))
            {
                if ((newID < Def.ID_NODI_MAX) || !check_max)
                {
                    _old[0].ID = newID;                                             // Aggiorna l'ID del ramo
                    ok         = true;
                }
            }
            if (!ok)
            {
                Messaggi.AddMessage(Messaggi.ERR.ERRORE_RINUMERAZIONE_RAMO, "", Messaggi.Tipo.Errori);
            }
            return(ok);
        }
Beispiel #5
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);
        }