private void btnAvanzar_Click(object sender, EventArgs e)
        {
            if (this.primeraEjecucion)
            {
                //deshabilitamos los ejemplos
                tsmnuEjemplos.Enabled = false;

                //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.
                this.controladorBode = new ControladorBode(this.Formula.K, this.Formula.N1, this.Formula.T1, this.Formula.T2,
                    this.Formula.Td, this.Formula.N2, this.Formula.T3, this.Formula.T4, this.Formula.Wn, this.Formula.Psi);

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

                    this.lineItemsPuntosCorte = generarLineItemsPuntosCorte();

                    this.lineItemsPuntosCruceGanancia = generarLineItemsPuntosCruceGanancia();
                    this.lineItemsPuntosCruceFase = generarLineItemsPuntosCruceFase();
                }

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

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

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

                this.primeraEjecucion = false;

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

                reestablecerEscala();
            }

            if (this.controladorBode.CurvasIndividuales.Count > 0 && this.controladorBode.CurvasParciales.Count > 0)
                avanzar();
        }
        private List<LineItem> generarLineItemsCurvasParcialesMagnitud(ControladorBode controladorBode, ZedGraphControl zedCMagnitud)
        {
            List<LineItem> lineItems = new List<LineItem>();

            //Por cada curva creamos un LineItem, lo agregamos al gráfico y enseguida lo ocultamos.
            for (int indiceCurva = 0; indiceCurva < controladorBode.CurvasParciales.Count; indiceCurva++)
            {
                PointPairList pointPairList = new PointPairList();
                for (int indicePunto = 0; indicePunto < controladorBode.CurvasParciales[indiceCurva].PuntosMagnitud.Count; indicePunto++)
                    pointPairList.Add(controladorBode.CurvasParciales[indiceCurva].PuntosMagnitud[indicePunto][0],
                        controladorBode.CurvasParciales[indiceCurva].PuntosMagnitud[indicePunto][1]);

                string nombre = "";

                if (indiceCurva + 1 == controladorBode.CurvasParciales.Count)
                {
                    nombre = "Curva Final";
                }
                else
                {
                    nombre = controladorBode.CurvasParciales[indiceCurva].Nombre;
                }

                LineItem lineItem = zedCMagnitud.GraphPane.AddCurve(nombre, pointPairList, this.colorCurvaParcial, SymbolType.None);
                lineItem.IsVisible = false;
                lineItem.Label.IsVisible = false;

                lineItem.Line.Width = GROSOR_CURVA_PARCIAL;
                lineItem.Line.IsAntiAlias = true;
                lineItem.Line.IsSmooth = true;
                lineItem.Line.SmoothTension = 0.05f;

                lineItems.Add(lineItem);
            }

            return lineItems;
        }
        /// <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 reestablecerEscala(ControladorBode controladorBode, ZedGraphControl zedCMagnitud, ZedGraphControl zedCFase)
        {
            zedCMagnitud.AxisChange();
                zedCFase.AxisChange();

            //Reestablecemos los valores mínimos y máximos de las gráficas.
            zedCMagnitud.GraphPane.YAxis.Scale.Min = controladorBode.InicioEjeYMagnitud;
            zedCMagnitud.GraphPane.YAxis.Scale.Max = controladorBode.FinEjeYMagnitud;

            zedCMagnitud.GraphPane.XAxis.Scale.Min = controladorBode.InicioEjeX;
            zedCMagnitud.GraphPane.XAxis.Scale.Max = controladorBode.FinEjeX;

            zedCFase.GraphPane.YAxis.Scale.Min = controladorBode.InicioEjeYFase;
            zedCFase.GraphPane.YAxis.Scale.Max = controladorBode.FinEjeYFase;

            zedCFase.GraphPane.XAxis.Scale.Min = controladorBode.InicioEjeX;
            zedCFase.GraphPane.XAxis.Scale.Max = controladorBode.FinEjeX;

                zedCMagnitud.Invalidate();
                zedCFase.Invalidate();
        }
        private List<LineItem> generarLineItemsCurvasIndividualesFase(ControladorBode controladorBode, ZedGraphControl zedCFase)
        {
            List<LineItem> lineItems = new List<LineItem>();

            //Por cada curva creamos un LineItem, lo agregamos al gráfico y enseguida lo ocultamos.
            for (int indiceCurva = 0; indiceCurva < controladorBode.CurvasIndividuales.Count; indiceCurva++)
            {
                PointPairList pointPairList = new PointPairList();
                for (int indicePunto = 0; indicePunto < controladorBode.CurvasIndividuales[indiceCurva].PuntosFase.Count; indicePunto++)
                    pointPairList.Add(controladorBode.CurvasIndividuales[indiceCurva].PuntosFase[indicePunto][0],
                        controladorBode.CurvasIndividuales[indiceCurva].PuntosFase[indicePunto][1]);

                LineItem lineItem = zedCFase.GraphPane.AddCurve(controladorBode.CurvasIndividuales[indiceCurva].Nombre, pointPairList,
                    this.coloresCurvasIndividuales[indiceCurva], SymbolType.None);
                lineItem.IsVisible = false;
                lineItem.Label.IsVisible = false;

                lineItem.Line.Width = GROSOR_CURVA_INDIVIDUAL;
                lineItem.Line.IsAntiAlias = true;
                lineItem.Line.IsSmooth = true;
                lineItem.Line.SmoothTension = 0.05f;

                lineItems.Add(lineItem);
            }

            return lineItems;
        }
        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 mostrarCurvas(ControladorBode controladorBode, int indiceCurvaActual, List<LineItem> lineItemsCurvasIndividualesMagnitud, List<LineItem> lineItemsCurvasIndividualesFase, List<LineItem> lineItemsCurvasParcialesMagnitud, List<LineItem> lineItemsCurvasParcialesFase, List<LineItem> lineItemsPuntosCorte, List<LineItem> lineItemsPuntosCruceGanancia, List<LineItem> lineItemsPuntosCruceFase, ZedGraphControl zedCMagnitud, ZedGraphControl zedCFase)
        {
            //Curvas individuales.
                //Mostramos las curvas hasta el índice actual, y ocultamos las restantes.
                int cantidadCurvasIndividuales = controladorBode.CurvasIndividuales.Count;
                for (int i = 0; i < cantidadCurvasIndividuales; i++)
                {
                    if (i <= indiceCurvaActual)
                    {
                        lineItemsCurvasIndividualesMagnitud[i].IsVisible = true;
                        lineItemsCurvasIndividualesMagnitud[i].Label.IsVisible = true;
                        lineItemsCurvasIndividualesFase[i].IsVisible = true;
                        lineItemsCurvasIndividualesFase[i].Label.IsVisible = true;
                    }
                    else
                    {
                        lineItemsCurvasIndividualesMagnitud[i].IsVisible = false;
                        lineItemsCurvasIndividualesMagnitud[i].Label.IsVisible = false;
                        lineItemsCurvasIndividualesFase[i].IsVisible = false;
                        lineItemsCurvasIndividualesFase[i].Label.IsVisible = false;
                    }
                }

                //Puntos de corte.
                //Mostramos los puntos del índice actual, y ocultamos los demás. Tener en
                //cuenta que una curva puede no tener punto de corte.
                int cantidadPuntosCorte = controladorBode.CurvasIndividuales.Count;
                for (int i = 0; i < cantidadPuntosCorte; i++)
                {
                    if (lineItemsPuntosCorte[i] != null)
                    {
                        if (i == indiceCurvaActual)
                            lineItemsPuntosCorte[i].IsVisible = true;
                        else
                            lineItemsPuntosCorte[i].IsVisible = false;
                    }
                }

            //Curvas parciales.
            //Mostramos las curvas del índice actual, y ocultamos las demás.
            int cantidadCurvasParciales = controladorBode.CurvasParciales.Count;
            for (int i = 0; i < cantidadCurvasParciales; i++)
            {
                if (i == indiceCurvaActual)
                {
                    lineItemsCurvasParcialesMagnitud[i].IsVisible = true;
                    lineItemsCurvasParcialesMagnitud[i].Label.IsVisible = true;
                    lineItemsCurvasParcialesFase[i].IsVisible = true;
                    lineItemsCurvasParcialesFase[i].Label.IsVisible = true;
                }
                else
                {
                    lineItemsCurvasParcialesMagnitud[i].IsVisible = false;
                    lineItemsCurvasParcialesMagnitud[i].Label.IsVisible = false;
                    lineItemsCurvasParcialesFase[i].IsVisible = false;
                    lineItemsCurvasParcialesFase[i].Label.IsVisible = false;
                }
            }

            //Muestra los puntos de cruce de fase y magnitud solo en la última gráfica.
            if ((cantidadCurvasParciales - 1) == indiceCurvaActual)
            {
                if (lineItemsPuntosCruceGanancia[0] != null)
                {
                    lineItemsPuntosCruceGanancia[0].IsVisible = true;
                    lineItemsPuntosCruceGanancia[0].Label.IsVisible = true;
                }

                if (lineItemsPuntosCruceGanancia[1] != null)
                {
                    lineItemsPuntosCruceGanancia[1].IsVisible = true;
                    lineItemsPuntosCruceGanancia[1].Label.IsVisible = true;

                    //Si hay un cruce de ganancia, significa que hay margen de fase.
                    lineItemsPuntosCruceGanancia[2].IsVisible = true;
                }

                if (lineItemsPuntosCruceFase[0] != null)
                {
                    lineItemsPuntosCruceFase[0].IsVisible = true;
                    lineItemsPuntosCruceFase[0].Label.IsVisible = true;
                }

                if (lineItemsPuntosCruceFase[1] != null)
                {
                    lineItemsPuntosCruceFase[1].IsVisible = true;
                    lineItemsPuntosCruceFase[1].Label.IsVisible = true;

                    //Si hay un cruce de fase, significa que hay margen de ganancia.
                    lineItemsPuntosCruceFase[2].IsVisible = true;
                }

                //Declaramos un datatable para poder guardar los datos obtenidos del datagridview
                //this.dat = new DataTable();
                //this.dat.Columns.Add(new DataColumn("Margen", typeof(string)));
                //this.dat.Columns.Add(new DataColumn("Valor", typeof(string)));

                ////Mostramos el margen de ganancia.
                //if (this.controladorBode.MargenGanancia != null)
                //{
                //    dgvMargenes.Rows.Add("GANANCIA", this.controladorBode.MargenGanancia.ToString() + " dB");
                //    this.dat.Rows.Add("GANANCIA", this.controladorBode.MargenGanancia.ToString() + " dB");

                //    if (this.controladorBode.MargenGanancia >= 0)
                //    {
                //        dgvMargenes[1, 0].Style.BackColor = Color.LightBlue;
                //    }
                //    else
                //    {
                //        dgvMargenes[1, 0].Style.BackColor = Color.LightPink;
                //    }
                //}
                //else
                //{
                //    dgvMargenes.Rows.Add("GANANCIA", "INFINITO");
                //    this.dat.Rows.Add("GANANCIA", "INFINITO");
                //}

                ////Mostramos el margen de fase.
                //if (this.controladorBode.MargenFase != null)
                //{
                //    dgvMargenes.Rows.Add("FASE", this.controladorBode.MargenFase.ToString() + " °");
                //    this.dat.Rows.Add("FASE", this.controladorBode.MargenFase.ToString() + " º");

                //    if (this.controladorBode.MargenFase >= 0)
                //    {
                //        dgvMargenes[1, 1].Style.BackColor = Color.LightBlue;
                //    }
                //    else
                //    {
                //        dgvMargenes[1, 1].Style.BackColor = Color.LightPink;
                //    }
                //}
                //else
                //{
                //    dgvMargenes.Rows.Add("FASE", "INFINITO");
                //    this.dat.Rows.Add("FASE", "INFINITO");
                //}

            }
            //Quita los puntos de cruce de Fase y Magnitud si no se esta en la ULTIMA gráfica
            else
            {
                if (lineItemsPuntosCruceGanancia[0] != null)
                {
                    lineItemsPuntosCruceGanancia[0].IsVisible = false;
                    lineItemsPuntosCruceGanancia[0].Label.IsVisible = false;
                }

                if (lineItemsPuntosCruceGanancia[1] != null)
                {
                    lineItemsPuntosCruceGanancia[1].IsVisible = false;
                    lineItemsPuntosCruceGanancia[1].Label.IsVisible = false;
                }

                if (lineItemsPuntosCruceFase[0] != null)
                {
                    lineItemsPuntosCruceFase[0].IsVisible = false;
                    lineItemsPuntosCruceFase[0].Label.IsVisible = false;
                }

                if (lineItemsPuntosCruceFase[1] != null)
                {
                    lineItemsPuntosCruceFase[1].IsVisible = false;
                    lineItemsPuntosCruceFase[1].Label.IsVisible = false;
                }

            }

            reestablecerEscala(controladorBode, zedCMagnitud, zedCFase);

            ////Habilita el boton Adelante hasta que se dibuja la ultima curva
            //if (this.indiceCurvaActual == this.controladorBode.CurvasIndividuales.Count - 1)
            //{
            //    this.btnAvanzar.Enabled = false;
            //    btnGuardar.Enabled = true;
            //}
            //else
            //{
            //    this.btnAvanzar.Enabled = true;
            //}

            ////Habilita el boton Atras hasta que se dibuja la primera curva
            //if (this.indiceCurvaActual == 0)
            //{
            //    this.btnRetroceder.Enabled = false;
            //}
            //else
            //{
            //    this.btnRetroceder.Enabled = true;
            //}
        }
        private void metodoBtnSig_Click1()
        {
            if (this.primeraEjecucion1)
            {

                //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.
                this.controladorBode1 = new ControladorBode(this.Formula1.K, this.Formula1.N1, this.Formula1.T1, this.Formula1.T2,
                    this.Formula1.Td, this.Formula1.N2, this.Formula1.T3, this.Formula1.T4, this.Formula1.Wn, this.Formula1.Psi);

                //Generamos todos los LineItem de las curvas individuales y parciales.
                //Luego los iremos mostrando y ocultando a medida que sea necesario.
                if (this.controladorBode1.CurvasIndividuales.Count > 0 && this.controladorBode1.CurvasParciales.Count > 0)
                {
                    this.lineItemsCurvasIndividualesMagnitud1 = generarLineItemsCurvasIndividualesMagnitud1();
                    this.lineItemsCurvasIndividualesFase1 = generarlineItemsCurvasIndividualesFase1();
                    this.lineItemsCurvasParcialesMagnitud1 = generarlineItemsCurvasParcialesMagnitud1();
                    this.lineItemsCurvasParcialesFase1 = generarlineItemsCurvasParcialesFase1();

                    this.lineItemsPuntosCorte1 = generarlineItemsPuntosCorte1();

                    this.lineItemsPuntosCruceGanancia1 = generarlineItemsPuntosCruceGanancia1();
                    this.lineItemsPuntosCruceFase1 = generarlineItemsPuntosCruceFase1();
                }

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

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

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

                this.primeraEjecucion1 = false;

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

                reestablecerEscala1();
            }

            if (this.controladorBode1.CurvasIndividuales.Count > 0 && this.controladorBode1.CurvasParciales.Count > 0)
                for (int i = 0; i < this.controladorBode1.CurvasParciales.Count; i++)
                {
                    this.indiceCurvaActual1++;
                    mostrarCurvas1();
                }
        }
        private List<LineItem> generarLineItemsPuntosCruceGanancia(ControladorBode controladorBode, ZedGraphControl zedCMagnitud,ZedGraphControl zedCFase)
        {
            List<LineItem> lineItems = new List<LineItem>();

            //Algunas curvas pueden no tener punto de corte, por lo que no habrá que dibujar nada.
            if (controladorBode.CruceGanancia[0, 0] != null)
            {
                PointPairList pointPairList = new PointPairList();
                pointPairList.Add((double)controladorBode.CruceGanancia[0, 0], (double)controladorBode.CruceGanancia[0, 1]);

                LineItem lineItem = zedCMagnitud.GraphPane.AddCurve("Cruce de Ganancia", pointPairList, Color.Black, SymbolType.Triangle);
                lineItem.IsVisible = false;
                lineItem.Label.IsVisible = false;

                lineItem.Symbol.Fill = new Fill(Color.Yellow);
                lineItem.Symbol.Border.Color = Color.Black;
                lineItem.Symbol.Border.Width = 1.0f;
                lineItem.Symbol.Size = 17.0f;
                lineItem.Symbol.IsAntiAlias = true;

                lineItems.Add(lineItem);
            }
            else
            {
                //Debemos saber cuál punto de corte pertenece a cuál curva, así
                //que debemos mantener una referencia.
                lineItems.Add(null);
            }

            if (controladorBode.CruceGanancia[1, 0] != null)
            {
                PointPairList pointPairList = new PointPairList();
                pointPairList.Add((double)controladorBode.CruceGanancia[1, 0], (double)controladorBode.CruceGanancia[1, 1]);

                LineItem lineItem = zedCFase.GraphPane.AddCurve("Margen de Fase", pointPairList, Color.Black, SymbolType.Square);
                lineItem.IsVisible = false;
                lineItem.Label.IsVisible = false;
                lineItem.Symbol.Fill = new Fill(Color.Yellow);
                lineItem.Symbol.Border.Color = Color.Black;
                lineItem.Symbol.Border.Width = 1.0f;
                lineItem.Symbol.Size = 17.0f;
                lineItem.Symbol.IsAntiAlias = true;

                lineItems.Add(lineItem);

                //Agregamos una línea desde la marca del margen de fase hasta la línea de -180 grados.
                PointPairList ppl = new PointPairList();
                ppl.Add((double)controladorBode.CruceGanancia[1, 0], (double)controladorBode.CruceGanancia[1, 1]);
                ppl.Add((double)controladorBode.CruceGanancia[1, 0], -180);
                LineItem li = zedCFase.GraphPane.AddCurve("", ppl, Color.Black, SymbolType.None);
                li.Line.Style = System.Drawing.Drawing2D.DashStyle.Dash;
                li.Line.Width = 2f;
                li.IsVisible = false;
                li.Label.IsVisible = false;

                lineItems.Add(li);
            }
            else
            {
                //Debemos saber cuál punto de corte pertenece a cuál curva, así
                //que debemos mantener una referencia.
                lineItems.Add(null);
            }

            return lineItems;
        }
        private List<LineItem> generarLineItemsPuntosCorte(ControladorBode controladorBode, ZedGraphControl zedCMagnitud)
        {
            List<LineItem> lineItems = new List<LineItem>();

            //Por cada punto de corte creamos un LineItem, lo agregamos al gráfico y enseguida lo ocultamos.
            for (int indiceCurva = 0; indiceCurva < controladorBode.CurvasIndividuales.Count; indiceCurva++)
            {
                //Algunas curvas pueden no tener punto de corte, por lo que no habrá que dibujar nada.
                if (controladorBode.CurvasIndividuales[indiceCurva].PuntoCorte != null)
                {
                    PointPairList pointPairList = new PointPairList();
                    pointPairList.Add(controladorBode.CurvasIndividuales[indiceCurva].PuntoCorte[0], controladorBode.CurvasIndividuales[indiceCurva].PuntoCorte[1]);

                    LineItem lineItem = zedCMagnitud.GraphPane.AddCurve("Punto de corte: " + controladorBode.CurvasIndividuales[indiceCurva].Nombre, pointPairList,
                         Color.Black, SymbolType.Diamond);
                    lineItem.IsVisible = false;
                    lineItem.Label.IsVisible = false;

                    lineItem.Symbol.Fill = new Fill(this.coloresCurvasIndividuales[indiceCurva]);
                    lineItem.Symbol.Border.Color = Color.Black;
                    lineItem.Symbol.Border.Width = 1.0f;
                    lineItem.Symbol.Size = 17.0f;
                    lineItem.Symbol.IsAntiAlias = true;

                    lineItems.Add(lineItem);
                }
                else
                {
                    //Debemos saber cuál punto de corte pertenece a cuál curva, así
                    //que debemos mantener una referencia.
                    lineItems.Add(null);
                }
            }

            return lineItems;
        }