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