private void btnAceptar_Click(object sender, EventArgs e)
        {
            if (ingresoFormulaBode.validarFormula().Equals(""))
            {
                //Seteamos las propiedades de la fórmula según los valores ingresados.
                //Esta fórmula va a ser usada por el formulario llamador.
                this.Formula = new Formula();
                this.Formula.K = ingresoFormulaBode.K;
                this.Formula.N1 = ingresoFormulaBode.N1;
                this.Formula.T1 = ingresoFormulaBode.T1;
                this.Formula.T2 = ingresoFormulaBode.T2;
                this.Formula.Td = ingresoFormulaBode.Td;
                this.Formula.N2 = ingresoFormulaBode.N2;
                this.Formula.T3 = ingresoFormulaBode.T3;
                this.Formula.T4 = ingresoFormulaBode.T4;
                this.Formula.Wn = ingresoFormulaBode.Wn;
                this.Formula.Psi = ingresoFormulaBode.Psi;

                Dispose();
            }
            else
            {
                MessageBox.Show(ingresoFormulaBode.validarFormula(), "Diagramas de Bode",
                    MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }
        public FrmEdicionFormula(Formula formula)
        {
            InitializeComponent();

            this.formulaAEditar = formula;

            this.modo = Modos.Edicion;
            txtTitulo.Enabled = false;
            llenarFormulario(formula);
        }
        private void btnAceptar_Click(object sender, EventArgs e)
        {
            //Si la fórmula es válida.
            if (ingresoFormulaBode.validarFormula().Equals(""))
            {
                if (this.modo == Modos.Creacion)
                {
                    Formula formula = new Formula();

                    formula.Titulo = txtTitulo.Text;
                    formula.Descripcion = txtDescripcion.Text;
                    formula.K = ingresoFormulaBode.K;
                    formula.N1 = ingresoFormulaBode.N1;
                    formula.T1 = ingresoFormulaBode.T1;
                    formula.T2 = ingresoFormulaBode.T2;
                    formula.Td = ingresoFormulaBode.Td;
                    formula.N2 = ingresoFormulaBode.N2;
                    formula.T3 = ingresoFormulaBode.T3;
                    formula.T4 = ingresoFormulaBode.T4;
                    formula.Wn = ingresoFormulaBode.Wn;
                    formula.Psi = ingresoFormulaBode.Psi;

                    Formula.save(formula);
                }
                else
                {
                    this.formulaAEditar.Descripcion = txtDescripcion.Text;
                    this.formulaAEditar.K = ingresoFormulaBode.K;
                    this.formulaAEditar.N1 = ingresoFormulaBode.N1;
                    this.formulaAEditar.T1 = ingresoFormulaBode.T1;
                    this.formulaAEditar.T2 = ingresoFormulaBode.T2;
                    this.formulaAEditar.Td = ingresoFormulaBode.Td;
                    this.formulaAEditar.N2 = ingresoFormulaBode.N2;
                    this.formulaAEditar.T3 = ingresoFormulaBode.T3;
                    this.formulaAEditar.T4 = ingresoFormulaBode.T4;
                    this.formulaAEditar.Wn = ingresoFormulaBode.Wn;
                    this.formulaAEditar.Psi = ingresoFormulaBode.Psi;

                    Formula.update(this.formulaAEditar);
                }

                Dispose();
            }
            //Si la fórmula es inválida.
            else
            {
                MessageBox.Show(ingresoFormulaBode.validarFormula(), "Diagramas de Bode",
                    MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }
        private void btnEjemplos_Click(object sender, EventArgs e)
        {
            FrmFormulas frmEjemplos = new FrmFormulas();
            frmEjemplos.ShowDialog();

            if (frmEjemplos.FormulaSeleccionada != null)
            {
                //Limpiamos todo lo que puede haber en el formulario.
                limpiar();

                //Tratamos a los ejemplos como fórmulas.
                this.Formula = frmEjemplos.FormulaSeleccionada;
                establecerFormula();

                //Habilitamos los botones que correspondan.
                btnAvanzar.Enabled = true;
                btnLimpiar.Enabled = true;
            }
        }
        /// <summary>
        /// Limpia las gráficas de magnitud y fase, la fórmula mostrada, y reestablece todos los
        /// atributos gráficos y no gráficos.
        /// </summary>
        private void limpiar()
        {
            //Reestablecemos todos los atributos gráficos.
            this.lineItemsCurvasIndividualesMagnitud.Clear();
            this.lineItemsCurvasIndividualesFase.Clear();
            this.lineItemsCurvasParcialesMagnitud.Clear();
            this.lineItemsCurvasParcialesFase.Clear();
            this.lineItemsPuntosCorte.Clear();
            this.lineItemsPuntosCruceGanancia.Clear();
            this.lineItemsPuntosCruceFase.Clear();
            this.graficaDobleActiva = true;

            //Reestablecemos los atributos no gráficos.
            this.controladorBode = null;
            this.Formula = null;
            this.primeraEjecucion = true;
            this.indiceCurvaActual = -1;

            //Reestablecemos la interfaz de usuario.
            this.btnAvanzar.Enabled = false;
            this.btnRetroceder.Enabled = false;
            establecerFormula();
            dgvMargenes.Rows.Clear();

            //Limpiamos las gráficas.
            this.gpMagnitud.CurveList.Clear();
            this.gpFase.CurveList.Clear();

            //Refrescamos las gráficas.
            this.zgcMagnitud.Invalidate();
            this.zgcFase.Invalidate();
        }
        private void FrmCompara_Load(object sender, EventArgs e)
        {
            //Se crea un panel y un ZGC no visibles, para la maximizacion
            p = new TableLayoutPanel();
            p.Dock = DockStyle.Fill;
            p.ColumnCount = 1;
            p.Location = new System.Drawing.Point(0, 0);
            p.Name = "p";
            p.RowCount = 2;
            p.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent,100F));
            p.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute,110F));

            zedMax = new ZedGraphControl();
            zedMax.Anchor = AnchorStyles.Top;
            zedMax.Dock = DockStyle.Fill;
            zedMax.ZoomEvent += new ZedGraph.ZedGraphControl.ZoomEventHandler(Zoom);
            //zedMax.PointValueEvent += new ZedGraphControl.PointValueHandler(infoPunto);
            zedMax.DoubleClick += new System.EventHandler(minimizar);

            dgvDatos.Rows.Add(2);

            this.gpMagnitud1 = zedGraphControl1.GraphPane;
            this.gpFase1 = zedGraphControl2.GraphPane;

            this.gpMagnitud = zedGraphControl3.GraphPane;
            this.gpFase = zedGraphControl4.GraphPane;

            establecerPropiedadesPrimarias1();

            establecerPropiedadesPrimarias();

            Formula1 = h.formulas[0];

            Formula = h.formulas[1];

            if (Formula1 != null)
                this.metodoBtnSig_Click1();

            if (Formula != null)
                this.metodoBtnSig_Click();

            for (int i = 0; i < 2; i++)
                this.rellenarFilaTabla(i);

            foreach (DataGridViewRow fila in dgvDatos.Rows)
                fila.Selected = false;

            ////Instancia la tabla de datos
            //dgvDatos.Rows.Add(2);

            ////Da formato a los zedGraphControls y a la tabla.
            //int cont = 0;
            //int x=0;
            //for(int i=0;i<controles.Count;i=i+2)
            //{
            //    if (i == 0)
            //    {
            //        this.gpMagnitud1 = controles[i].GraphPane;
            //        this.gpFase1 = controles[i + 1].GraphPane;
            //    }
            //    else
            //    {
            //        this.gpMagnitud2 = controles[i].GraphPane;
            //        this.gpFase2 = controles[i + 1].GraphPane;
            //    }
            //    this.rellenarFilaTabla(cont);

            //    //formatoZed(z, cont);
            //    //z.PointValueEvent += new ZedGraphControl.PointValueHandler(infoPunto);
            //    controles[i].ZoomEvent += new ZedGraph.ZedGraphControl.ZoomEventHandler(Zoom);
            //    //controles[i].DoubleClick += new System.EventHandler(maximizar);

            //    controles[i + 1].ZoomEvent += new ZedGraph.ZedGraphControl.ZoomEventHandler(Zoom);
            //    //controles[i + 1].DoubleClick += new System.EventHandler(maximizar);

            //    if(i==0)
            //        x=0;
            //    else
            //        x=1;

            //    asignarGrafica(controles[i],controles[i+1],h.formulas[x], cont++); // Se asignan las gráficas del historial

            //    refresh(controles[i]);
            //    refresh(controles[i+1]);

            //    if(i==0)
            //    {
            //    controles[i].ZoomOutAll(this.gpMagnitud1);
            //    controles[i+1].ZoomOutAll(this.gpFase1);
            //    }
            //    else
            //    {
            //    controles[i].ZoomOutAll(this.gpMagnitud2);
            //    controles[i+1].ZoomOutAll(this.gpFase2);
            //    }
            //}

            //foreach (DataGridViewRow fila in dgvDatos.Rows)
            //    fila.Selected = false;
        }
        private void asignarGrafica(ZedGraphControl zedCMagnitud,ZedGraphControl zedCFase,Formula formula, int cont)
        {
            establecerPropiedadesPrimarias(zedCMagnitud,zedCFase,cont);

            if(formula!=null)
                this.metodoBtnAvanzarClick(zedCMagnitud,zedCFase,formula);
        }
        public void metodoBtnAvanzarClick(ZedGraphControl zedCMagnitud, ZedGraphControl zedCFase, Formula formula)
        {
            List<LineItem> lineItemsCurvasIndividualesMagnitud = new List<LineItem>();

                List<LineItem> lineItemsCurvasIndividualesFase = new List<LineItem>();

                List<LineItem> lineItemsCurvasParcialesMagnitud = new List<LineItem>();

                List<LineItem> lineItemsCurvasParcialesFase = new List<LineItem>();

                List<LineItem> lineItemsPuntosCorte = new List<LineItem>();

                List<LineItem> lineItemsPuntosCruceGanancia = new List<LineItem>();

                List<LineItem> lineItemsPuntosCruceFase = new List<LineItem>();

                ControladorBode controladorBode;
                //Indicamos que se están ejecutando los cálculos.
                this.Cursor = Cursors.WaitCursor;

                //Generamos el controlador, que tiene las curvas individuales, parciales y puntos de corte.
                controladorBode = new ControladorBode(formula.K, formula.N1, formula.T1, formula.T2,
                    formula.Td, formula.N2, formula.T3, formula.T4, formula.Wn, formula.Psi);

                //Generamos todos los LineItem de las curvas individuales y parciales.
                //Luego los iremos mostrando y ocultando a medida que sea necesario.
                if (controladorBode.CurvasIndividuales.Count > 0 && controladorBode.CurvasParciales.Count > 0)
                {
                    lineItemsCurvasIndividualesMagnitud = generarLineItemsCurvasIndividualesMagnitud(controladorBode,zedCMagnitud);
                    lineItemsCurvasIndividualesFase = generarLineItemsCurvasIndividualesFase(controladorBode,zedCFase);
                    lineItemsCurvasParcialesMagnitud = generarLineItemsCurvasParcialesMagnitud(controladorBode,zedCMagnitud);
                    lineItemsCurvasParcialesFase = generarLineItemsCurvasParcialesFase(controladorBode,zedCFase);

                    lineItemsPuntosCorte = generarLineItemsPuntosCorte(controladorBode, zedCMagnitud);

                    lineItemsPuntosCruceGanancia = generarLineItemsPuntosCruceGanancia(controladorBode, zedCMagnitud, zedCFase);
                    lineItemsPuntosCruceFase = generarLineItemsPuntosCruceFase(controladorBode, zedCMagnitud, zedCFase);
                }

                //Resaltamos la gráfica de magnitud en magnitud = 0, y la gráfica de
                //fase en fase = -180,.
                PointPairList pplResaltadoMagnitud = new PointPairList();
                pplResaltadoMagnitud.Add(controladorBode.InicioEjeX, 0);
                pplResaltadoMagnitud.Add(controladorBode.FinEjeX, 0);
                LineItem liResaltadoMagnitud = zedCMagnitud.GraphPane.AddCurve("", pplResaltadoMagnitud, Color.Red, SymbolType.None);
                liResaltadoMagnitud.Line.Width = 2f;
                liResaltadoMagnitud.Line.Style = System.Drawing.Drawing2D.DashStyle.Dash;

                PointPairList pplResaltadoFaseSuperior = new PointPairList();
                pplResaltadoFaseSuperior.Add(controladorBode.InicioEjeX, 180);
                pplResaltadoFaseSuperior.Add(controladorBode.FinEjeX, 180);
                LineItem liFaseResaltadoSuperior = zedCFase.GraphPane.AddCurve("", pplResaltadoFaseSuperior, Color.Red, SymbolType.None);
                liFaseResaltadoSuperior.Line.Width = 2f;
                liFaseResaltadoSuperior.Line.Style = System.Drawing.Drawing2D.DashStyle.Dash;

                PointPairList pplResaltadoFase = new PointPairList();
                pplResaltadoFase.Add(controladorBode.InicioEjeX, -180);
                pplResaltadoFase.Add(controladorBode.FinEjeX, -180);
                LineItem liFaseResaltado = zedCFase.GraphPane.AddCurve("", pplResaltadoFase, Color.Red, SymbolType.None);
                liFaseResaltado.Line.Width = 2f;
                liFaseResaltado.Line.Style = System.Drawing.Drawing2D.DashStyle.Dash;

                //Indicamos que los cálculos finalizaron.
                this.Cursor = Cursors.Default;

                reestablecerEscala(controladorBode,zedCMagnitud,zedCFase);

                for (int indiceCurvaActual = 0; indiceCurvaActual < controladorBode.CurvasIndividuales.Count;indiceCurvaActual++ )
                {
                    mostrarCurvas(controladorBode, indiceCurvaActual, lineItemsCurvasIndividualesMagnitud, lineItemsCurvasIndividualesFase, lineItemsCurvasParcialesMagnitud, lineItemsCurvasParcialesFase, lineItemsPuntosCorte, lineItemsPuntosCruceGanancia, lineItemsPuntosCruceFase,zedCMagnitud,zedCFase);
                }
        }
        private void btnAceptar_Click(object sender, EventArgs e)
        {
            //Asignamos la fórmula seleccionada para que lo use el formulario llamador.
            if (lbFormulas.Items.Count > 0)
                this.FormulaSeleccionada = this.formulas[lbFormulas.SelectedIndex];

            Dispose();
        }
        private void btnGanancia_Click(object sender, EventArgs e)
        {
            btnGuardar.Enabled = false;

            limpiar();

            FrmIngresoFormula frmIngresoFormula = new FrmIngresoFormula();

            Formula formulaNueva = new Formula();

            if (frmDiagramaBloques.TipoControlador == "PID")
            {
                formulaNueva.K = (double)((double)nudGanancia.Value * frmDiagramaBloques.ControladorPIDSinK);
            }
            else
            {
                if (frmDiagramaBloques.TipoControlador == "PI")
                {
                    formulaNueva.K = (double)((double)nudGanancia.Value /frmDiagramaBloques.T1);
                }
                else
                {
                    formulaNueva.K = (double)nudGanancia.Value;
                }
            }

            if (frmDiagramaBloques.T1 != null)
            {
                formulaNueva.T1 = frmDiagramaBloques.T1;
            }
            if (frmDiagramaBloques.T2 != null)
            {
                formulaNueva.T2 = frmDiagramaBloques.T2;
            }
            if (frmDiagramaBloques.T3 != null)
            {
                formulaNueva.T3 = frmDiagramaBloques.T3;
            }
            if (frmDiagramaBloques.T4 != null)
            {
                formulaNueva.T4 = frmDiagramaBloques.T4;
            }
            if (frmDiagramaBloques.N2 != null)
            {
                formulaNueva.N2 = frmDiagramaBloques.N2;
            }
            if (frmDiagramaBloques.Td != null)
            {
                formulaNueva.Td = frmDiagramaBloques.Td;
            }
            if (frmDiagramaBloques.Wn != null)
            {
                formulaNueva.Wn = frmDiagramaBloques.Wn;
            }
            if (frmDiagramaBloques.Psi != null)
            {
                formulaNueva.Psi = frmDiagramaBloques.Psi;
            }

            this.Formula = formulaNueva;

            establecerFormula();

            btnGanancia.Enabled = true;

            //limpiarDatos();

            frmDiagramaBloques.ingresoCorrecto = false;

            //Habilitamos los botones que correspondan.
            btnAvanzar.Enabled = true;
            btnLimpiar.Enabled = true;

            while (btnAvanzar.Enabled)
            {
                btnAvanzar.PerformClick();
            }
        }
        private void btnFormula_Click(object sender, EventArgs e)
        {
            btnGuardar.Enabled = false;

            frmDiagramaBloques.ShowDialog();

            limpiar();

            if (frmDiagramaBloques.ingresoCorrecto)
            {
                FrmIngresoFormula frmIngresoFormula = new FrmIngresoFormula();

                Formula formulaNueva = new Formula();

                if (frmDiagramaBloques.TipoControlador == "PID")
                {
                    formulaNueva.K = (double)(frmDiagramaBloques.K * frmDiagramaBloques.ControladorPIDSinK);
                }
                else
                {
                    if(frmDiagramaBloques.TipoControlador=="PI")
                    {
                        formulaNueva.K = (double)(frmDiagramaBloques.K/frmDiagramaBloques.T1);
                    }
                    else
                    {
                        formulaNueva.K = frmDiagramaBloques.K;
                    }
                }

                if (frmDiagramaBloques.T1 != null)
                {
                    formulaNueva.T1 = frmDiagramaBloques.T1;
                }
                if (frmDiagramaBloques.T2 != null)
                {
                    formulaNueva.T2 = frmDiagramaBloques.T2;
                }
                if (frmDiagramaBloques.T3 != null)
                {
                    formulaNueva.T3 = frmDiagramaBloques.T3;
                }
                if (frmDiagramaBloques.T4 != null)
                {
                    formulaNueva.T4 = frmDiagramaBloques.T4;
                }
                if (frmDiagramaBloques.N2 != null)
                {
                    formulaNueva.N2 = frmDiagramaBloques.N2;
                }
                if (frmDiagramaBloques.Td != null)
                {
                    formulaNueva.Td = frmDiagramaBloques.Td;
                }
                if (frmDiagramaBloques.Wn != null)
                {
                    formulaNueva.Wn = frmDiagramaBloques.Wn;
                }
                if (frmDiagramaBloques.Psi != null)
                {
                    formulaNueva.Psi = frmDiagramaBloques.Psi;
                }

                this.Formula = formulaNueva;

                establecerFormula();

                //Ponemos el valor de la ganancia actual en el control nudGanancia.
                nudGanancia.Value = (decimal)frmDiagramaBloques.K;

                //limpiarDatos();

                frmDiagramaBloques.ingresoCorrecto = false;

                //Habilitamos los botones que correspondan.
                btnAvanzar.Enabled = true;
                btnLimpiar.Enabled = true;
            }
        }
        /// <summary>
        /// Actualiza una fórmula.
        /// </summary>
        /// <param name="formula">Fórmula a actualizar.</param>
        public static void update(Formula formula)
        {
            //Leemos todas las fórmulas.
            List<Formula> formulas = getAll();

            if (formulas.Count > 0)
            {
                //Buscamos la fórmula según su título y la editamos.
                for (int indiceEjemplo = 0; indiceEjemplo < formulas.Count; indiceEjemplo++)
                {
                    if (formulas[indiceEjemplo].Titulo.Equals(formula.Titulo))
                    {
                        formulas[indiceEjemplo].Descripcion = formula.Descripcion;
                        formulas[indiceEjemplo].K = formula.K;
                        formulas[indiceEjemplo].N1 = formula.N1;
                        formulas[indiceEjemplo].T1 = formula.T1;
                        formulas[indiceEjemplo].T2 = formula.T2;
                        formulas[indiceEjemplo].Td = formula.Td;
                        formulas[indiceEjemplo].N2 = formula.N2;
                        formulas[indiceEjemplo].T3 = formula.T3;
                        formulas[indiceEjemplo].T4 = formula.T4;
                        formulas[indiceEjemplo].Wn = formula.Wn;
                        formulas[indiceEjemplo].Psi = formula.Psi;

                        break;
                    }
                }

                //Vaciamos el archivo.
                File.WriteAllText(obtenerRutaArchivo(), string.Empty);

                //Guardamos la colección con la fórmula editada.
                BinaryFormatter formatter = new BinaryFormatter();
                FileStream streamEscritura = new FileStream(obtenerRutaArchivo(), FileMode.Append);
                formatter.Serialize(streamEscritura, formulas);
                streamEscritura.Close();
            }
        }
        /// <summary>
        /// Guarda una fórmula.
        /// </summary>
        /// <param name="formula">Fórmula a guardar.</param>
        public static void save(Formula formula)
        {
            //Leemos todas las fórmulas.
            List<Formula> formulas = getAll();

            //Agregamos la fórmula a la colección.
            formulas.Add(formula);

            BinaryFormatter formatter = new BinaryFormatter();
            if (File.Exists(obtenerRutaArchivo()))
            {
                //Vaciamos el archivo.
                File.WriteAllText(obtenerRutaArchivo(), string.Empty);

                FileStream streamEscritura = new FileStream(obtenerRutaArchivo(), FileMode.Append);
                formatter.Serialize(streamEscritura, formulas);
                streamEscritura.Close();
            }
            else
            {
                FileStream streamEscritura = new FileStream(obtenerRutaArchivo(), FileMode.Create);
                formatter.Serialize(streamEscritura, formulas);
                streamEscritura.Close();
            }
        }
        /// <summary>
        /// Elimina una fórmula.
        /// </summary>
        /// <param name="formula">Fórmula a eliminar.</param>
        public static void delete(Formula formula)
        {
            //Leemos todas las fórmulas.
            List<Formula> formulas = getAll();

            if (formulas.Count > 0)
            {
                //Buscamos la fórmula según su título y lo eliminamos.
                for (int indiceEjemplo = 0; indiceEjemplo < formulas.Count; indiceEjemplo++)
                {
                    if (formulas[indiceEjemplo].Titulo.Equals(formula.Titulo))
                    {
                        formulas.RemoveAt(indiceEjemplo);
                        break;
                    }
                }

                //Vaciamos el archivo.
                File.WriteAllText(obtenerRutaArchivo(), string.Empty);

                //Guardamos la colección con la fórmula eliminada.
                BinaryFormatter formatter = new BinaryFormatter();
                FileStream streamEscritura = new FileStream(obtenerRutaArchivo(), FileMode.Append);
                formatter.Serialize(streamEscritura, formulas);
                streamEscritura.Close();
            }
        }
        private void btnFormula_Click(object sender, EventArgs e)
        {
            btnGuardar.Enabled = false;

            FrmIngresoFormula frmIngresoFormula = new FrmIngresoFormula();
            frmIngresoFormula.ShowDialog();

            if (frmIngresoFormula.Formula != null)
            {
                //Limpiamos cualquier fórmula que pudo haber quedado graficada.
                limpiar();

                this.Formula = frmIngresoFormula.Formula;

                //Establecemos los valores de los parámetros y cambiamos su color.
                establecerFormula();

                //Habilitamos los botones que correspondan.
                btnAvanzar.Enabled = true;
                btnLimpiar.Enabled = true;
            }
        }
        private void ejemplo3ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Formula formulaNueva = new Formula();
            formulaNueva.K = 1;
            formulaNueva.Td = 0.5;
            formulaNueva.T3 = 1;
            formulaNueva.T4 = 2;
            this.Formula = formulaNueva;
            establecerFormula();

            //Habilitamos los botones que correspondan.
            btnAvanzar.Enabled = true;
            btnLimpiar.Enabled = true;
        }
 /// <summary>
 /// Llena el formulario con los valores de una fórmula.
 /// </summary>
 /// <param name="formula">Fórmula con la que se llenará el formulario.</param>
 private void llenarFormulario(Formula formula)
 {
     txtTitulo.Text = formula.Titulo;
     txtDescripcion.Text = formula.Descripcion;
     ingresoFormulaBode.llenarCampos(formula.K, formula.N1, formula.T1, formula.T2, formula.Td, formula.N2,
         formula.T3, formula.T4, formula.Wn, formula.Psi);
 }