public void Dibujo_Autocad(double Xi, double Yi, int Num_Despiece)
        {
            string LayerCirculo = "FC_BORDES";

            double[] CentroDibujo = new double[3] {
                Xi + Centro[0], Yi - Centro[1], 0
            };
            double EscalaR     = (radio - 2 * 0.02) / radio;
            double EscalaR2    = radio * 4;
            string Nom_Seccion = "";
            string Escala      = "1:15";

            FunctionsAutoCAD.FunctionsAutoCAD.AddCircle(CentroDibujo, radio, LayerCirculo);
            FunctionsAutoCAD.FunctionsAutoCAD.B_Estribo_Circular(CentroDibujo, "FC_ESTRIBOS", EscalaR2, EscalaR2, EscalaR2, 1, 0);

            #region Dibujo de refuerzo en seccion

            var X_unicos = Refuerzos.Select(x => Math.Round(x.Coord[0], 2)).ToList().Distinct().ToList();
            var Y_unicos = Refuerzos.Select(x => Math.Round(x.Coord[1], 2)).ToList().Distinct().ToList();
            foreach (CRefuerzo refi in Refuerzos)
            {
                refi.Dibujo_Ref_Autocad(Xi, Yi, X_unicos.Max(), X_unicos.Min(), Y_unicos.Max(), Y_unicos.Min());
            }

            #endregion Dibujo de refuerzo en seccion

            #region Nombre_Seccion

            Nom_Seccion = "%%USeccion " + Num_Despiece;
            FunctionsAutoCAD.FunctionsAutoCAD.B_NombreSeccion(P_XYZ: new double[] { Xi + (B / 2), Yi - H - 0.20, 0 }, Seccion: Nom_Seccion, Escala: Escala, Layer: "FC_R-200", Xscale: 15, Yscale: 15, Zscale: 15, Rotation: 0);

            #endregion Nombre_Seccion
        }
        public void Pn_Balanceado(double recubrimiento, double DiyMax, int Angulo)
        {
            double Magnitud_Cb, Magnitud_ab;
            double Pc_b, Mc_B;
            double Pb, Mb;
            double cb, ab;
            double Centroide;
            double fsl, Msl;

            float  ecu = 0.003f;
            float  Fy = 4220;
            float  fc = Material.FC;
            float  Es = 2000000;
            float  beta = 0.85f - 0.05f * (fc - 280) / 70f;
            float  ey = Fy / Es;
            double A1, A2, AreaComp;

            Magnitud_Cb = (DiyMax + radio * 100) * ecu / (ey + ecu);
            Magnitud_ab = beta * Magnitud_Cb;

            cb = Magnitud_Cb - (radio * 100);
            ab = Magnitud_ab - (radio * 100);

            A1       = Area_Segmento((float)ab);
            A2       = Area_Segmento(-(float)radio * 100);
            AreaComp = (A1 - A2);

            Pc_b = 0.85 * fc * AreaComp;

            Centroide = Centroide_Segmento(ab, AreaComp);
            Mc_B      = Pc_b * Math.Abs(Centroide);

            List <float> temp_c = new List <float>();

            temp_c.Add((float)cb);

            foreach (CRefuerzo refuezo in Refuerzos)
            {
                refuezo.CalcularDeformacion(temp_c, ecu, Angulo, Fy, Es, (float)radio * 100, Shape);
            }

            fsl = Refuerzos.Select(x => x.Fuerzas_PorCadaCPorCadaAngulo.Select(x1 => x1.Item1).Select(x2 => x2[0]).First()).ToList().Sum();
            Msl = Refuerzos.Select(x => x.Momento_PorCadaCPorCadaAngulo.Select(x1 => x1.Item1).Select(x2 => x2[0]).First()).ToList().Sum();
            var coord  = Refuerzos.Select(x => x.Coordenadas_PorCadaAngulo.Select(x1 => x1.Item1).Select(x2 => x2[1]).First()).ToList();
            var prueba = Refuerzos.Select(x => x.Fuerzas_PorCadaCPorCadaAngulo.Select(x1 => x1.Item1).Select(x2 => x2[0]).First()).ToList();

            Pb = Pc_b + fsl;
            Mb = Mc_B + Msl;

            float[] Temp = new float[] { (float)Mb, (float)Pb };
            PbMb3D.Add(new Tuple <float[], int>(Temp, Angulo));
        }
        public void DiagramaInteraccion()
        {
            float ecu  = 0.003f;
            float Fy   = 4220;
            float fc   = Material.FC;
            float Es   = 2000000;
            float beta = 0.85f - 0.05f * (fc - 280) / 70f;

            PbMb2D                  = new List <Tuple <List <float[]>, int> >();
            PbMb3D                  = new List <Tuple <float[], int> >();
            AreaComprimida          = new List <Tuple <List <float>, int> >();
            CentroideAreaComprimida = new List <Tuple <List <float[]>, int> >();

            foreach (CRefuerzo cRefuerzo in Refuerzos)
            {
                cRefuerzo.Coordenadas_PorCadaAngulo         = new List <Tuple <float[], int> >();
                cRefuerzo.Esfuerzos_PorCadaCPorCadaAngulo   = new List <Tuple <List <float>, int> >();
                cRefuerzo.Fuerzas_PorCadaCPorCadaAngulo     = new List <Tuple <List <float>, int> >();
                cRefuerzo.Momento_PorCadaCPorCadaAngulo     = new List <Tuple <List <float>, int> >();
                cRefuerzo.Deformacion_PorCadaCPorCadaAngulo = new List <Tuple <List <float>, int> >();
            }

            int DeltasVariacionC = 20;
            int Delta            = 10;

            for (int Angulo = 0; Angulo <= 360; Angulo += Delta)
            {
                List <float[]> PorCadaRotacion = new List <float[]>();
                List <float>   ms = new List <float>();

                //Rotacion de la Sección

                Refuerzos.ForEach(x => x.CalcularCoordenadasPorCadaAngulo(Angulo));

                List <float>   C_Variando               = new List <float>();
                List <float>   a_Variando               = new List <float>();
                List <float>   AreaComprimida1          = new List <float>();
                List <float[]> CentroideAreaComprimida1 = new List <float[]>();

                float Ymin = -(float)radio * 100;
                float Ymax = (float)radio * 100;
                float Magnitud_C, Magnitud_a;
                float atemp;

                for (float C = Ymin + (Ymax - Ymin) / DeltasVariacionC; C <= Ymax; C += (Ymax - Ymin) / DeltasVariacionC)
                {
                    Magnitud_C = C + (float)radio * 100;
                    Magnitud_a = beta * Magnitud_C;
                    atemp      = Magnitud_a - (float)radio * 100;

                    C_Variando.Add(C);
                    a_Variando.Add(atemp);
                }

                Refuerzos.ForEach(x => x.CalcularDeformacion(C_Variando, ecu, Angulo, Fy, Es, Ymax, Shape));

                //Calculo del area comprimida para cada variacion de c
                for (int i = 0; i < a_Variando.Count; i++)
                {
                    float   A1, A2;
                    float[] Centroide_comp;

                    A1 = Area_Segmento(a_Variando[i]);
                    A2 = Area_Segmento(-(float)Math.Round(radio, 2) * 100);

                    AreaComprimida1.Add(A1 - A2);
                    Centroide_comp = new float[] { 0, (float)Centroide_Segmento(a_Variando[i], A1 - A2) };
                    CentroideAreaComprimida1.Add(Centroide_comp);
                }

                CentroideAreaComprimida.Add(new Tuple <List <float[]>, int>(CentroideAreaComprimida1, Angulo));
                AreaComprimida.Add(new Tuple <List <float>, int>(AreaComprimida1, Angulo));
            }

            PnMn2D = new List <Tuple <List <float[]>, int> >();
            PuMu2D = new List <Tuple <List <float[]>, int> >();

            for (int i = 0; i < AreaComprimida.Count; i++)
            {
                List <float[]> PnMnAux = new List <float[]>();
                List <float[]> PuMuAux = new List <float[]>();

                for (int j = 0; j < AreaComprimida[i].Item1.Count; j++)
                {
                    float Cc = 0.85f * fc * AreaComprimida[i].Item1[j];
                    float Fs = 0; float Ms = 0;
                    float Ast = 0;

                    Ast = (float)Refuerzos.Select(x => x.As_Long).Sum();

                    foreach (CRefuerzo cRefuerzo in Refuerzos)
                    {
                        Fs += cRefuerzo.Fuerzas_PorCadaCPorCadaAngulo[i].Item1[j];
                        Ms += cRefuerzo.Momento_PorCadaCPorCadaAngulo[i].Item1[j];
                    }

                    float Pmax = 0.75f * (0.85f * fc * ((float)Area * 10000 - Ast) + Fy * Ast);
                    float Pn_  = Cc + Fs;
                    float Mn_  = Cc * (-CentroideAreaComprimida[i].Item1[j][1]) + Ms;

                    float maxY = Refuerzos.Max(x => x.Coordenadas_PorCadaAngulo[i].Item1[1]);
                    float esi  = Refuerzos.Find(x => x.Coordenadas_PorCadaAngulo[i].Item1[1] == maxY).Deformacion_PorCadaCPorCadaAngulo[i].Item1[j];

                    float et = Math.Abs(esi);
                    float fi = DeterminarFi(et);

                    float Pu = Pn_ * fi;
                    float Mu = Mn_ * fi;

                    if (Pn_ > Pmax)
                    {
                        Pn_ = Pmax;
                        Pu  = Pmax * 0.65f;
                    }

                    if (Pn_ < 0)
                    {
                        if (PnMnAux.Exists(x => x[0] == 0) == false)
                        {
                            PnMnAux.Add(new float[] { 0, (-Ast * Fy) });
                            PuMuAux.Add(new float[] { 0, (-Ast * Fy) });
                        }
                    }
                    else
                    {
                        PnMnAux.Add(new float[] { Mn_, Pn_ });
                        PuMuAux.Add(new float[] { Mu, Pu });
                    }

                    if (j == AreaComprimida[i].Item1.Count - 1)
                    {
                        PnMnAux.Add(new float[] { 0, Pmax });
                        PuMuAux.Add(new float[] { 0, 0.65f * Pmax });
                    }
                }
                PnMn2D.Add(new Tuple <List <float[]>, int>(PnMnAux, AreaComprimida[i].Item2));
                PuMu2D.Add(new Tuple <List <float[]>, int>(PuMuAux, AreaComprimida[i].Item2));
            }

            MnPn3D = new List <Tuple <List <float[]>, int> >();
            MuPu3D = new List <Tuple <List <float[]>, int> >();

            for (int i = 0; i < PnMn2D.Count; i++)
            {
                int            Angulo       = PnMn2D[i].Item2;
                List <float[]> SeriePuntos  = new List <float[]>();
                List <float[]> SeriePuntosU = new List <float[]>();

                for (int j = 0; j < PnMn2D[i].Item1.Count; j++)
                {
                    float   X1 = (float)(PnMn2D[i].Item1[j][0] * Math.Cos((Angulo * Math.PI / 180)));
                    float   Y2 = (float)(PnMn2D[i].Item1[j][0] * Math.Sin((Angulo * Math.PI / 180)));
                    float   Z2 = PnMn2D[i].Item1[j][1];
                    float[] PuntosDescompuestos = new float[] { X1, Y2, Z2 };

                    SeriePuntos.Add(PuntosDescompuestos);

                    float   X1U = (float)(PuMu2D[i].Item1[j][0] * Math.Cos((Angulo * Math.PI / 180)));
                    float   Y2U = (float)(PuMu2D[i].Item1[j][0] * Math.Sin((Angulo * Math.PI / 180)));
                    float   Z2U = PuMu2D[i].Item1[j][1];
                    float[] PuntosDescompuestosUltimos = new float[] { X1U, Y2U, Z2U };

                    SeriePuntosU.Add(PuntosDescompuestosUltimos);
                }
                MnPn3D.Add(new Tuple <List <float[]>, int>(SeriePuntos, PnMn2D[i].Item2));
                MuPu3D.Add(new Tuple <List <float[]>, int>(SeriePuntosU, PnMn2D[i].Item2));
            }
        }