/// <summary> /// 计算验算点的压弯组合构件强度 GB 50017-2003 式(5.2.1) /// </summary> /// <param name="NL">截面内力</param> /// <param name="Sec">截面</param> /// <param name="iPt">截面中的验算点号</param> /// <param name="DPs">截面验算参数</param> /// <returns>强度应力(拉为正,压为负)</returns> public static double CalPointStrength_YW(SecForce NL, BSections Sec, int iPt, DesignParameters DPs) { double y, z, Res; if (Sec is SectionDBuser) { Sec.getCheckPoint(iPt, out y, out z); //取得截面验算点坐标 } else if (Sec is SectionGeneral) //如果为自定截面则验算所有外轮廓点 { SectionGeneral GenSec = Sec as SectionGeneral; y = GenSec.OPOLY[iPt].X; z = GenSec.OPOLY[iPt].Y; } else { y = 0; z = 0; } //如果验算点为0,0,则直接返回0应力值 if (y == 0 && z == 0) { return(0); } double Wy = Sec.Iyy / z; //抗弯截面模量 double Wz = Sec.Izz / y; //抗弯截面模量 double Wny = Wy * DPs.Ratio_Anet; //净截面模量 double Wnz = Wz * DPs.Ratio_Anet; //净截面模量 double My = -(NL.My); //弯矩,取内力的反号:参Midsa手册02 P16页梁单元内力输出方向 double Mz = -(NL.Mz); Res = NL.N / (Sec.Area * DPs.Ratio_Anet) + My / (DPs.Gamma_y * Wny) + Mz / (DPs.Gamma_z * Wnz); return(Res); }
/// <summary> /// 更新当前对话框显示的截面信息 /// </summary> /// <param name="SecId">截面号</param> public void UpdateCurentSec(int SecId) { MainForm mmf = this.Owner as MainForm; ModelForm1 mf = mmf.ModelForm; Bmodel mm = mf.CurModel; BSections curSec = mm.sections[SecId]; string len = mm.unit.Length;//长度单位 //更新截面信息 tb_SecID.Text = SecId.ToString(); tb_SecName.Text = curSec.Name; //更新截面特性 Dgv_SecProp.Rows.Clear();//清除行 Dgv_SecProp.RowHeadersVisible = false; DataAddRow(ref Dgv_SecProp, "A", curSec.Area.ToString(), len + "^2"); DataAddRow(ref Dgv_SecProp, "Ixx", curSec.Ixx.ToString(), len + "^4"); DataAddRow(ref Dgv_SecProp, "Iyy", curSec.Iyy.ToString(), len + "^4"); DataAddRow(ref Dgv_SecProp, "Izz", curSec.Izz.ToString(), len + "^4"); DataAddRow(ref Dgv_SecProp, "Iw", curSec.Iw.ToString(), len + "^6"); DataAddRow(ref Dgv_SecProp, "Cent:y", curSec.Cy.ToString(), len); DataAddRow(ref Dgv_SecProp, "Cent:z", curSec.Cz.ToString(), len); DataAddRow(ref Dgv_SecProp, "Shear:y", curSec.Sy.ToString(), len); DataAddRow(ref Dgv_SecProp, "Shear:z", curSec.Sz.ToString(), len); DataAddRow(ref Dgv_SecProp, "CyM", curSec.CyM.ToString(), len); DataAddRow(ref Dgv_SecProp, "CyP", curSec.CyP.ToString(), len); DataAddRow(ref Dgv_SecProp, "CzM", curSec.CzM.ToString(), len); DataAddRow(ref Dgv_SecProp, "CzP", curSec.CzP.ToString(), len); MakeEditable(ref Dgv_SecProp, 1);//使可编辑 }
/// <summary> /// 计算截面所有验算点的控制稳定应力 /// </summary> /// <param name="NL">截面内力</param> /// <param name="Sec">截面对像</param> /// <param name="DPs">单元设计参数</param> /// <param name="E">材料弹性模量</param> /// <returns>截面稳定应力值</returns> public static double CalSecMaxStability_YW(SecForce NL, BSections Sec, DesignParameters DPs, double E) { double Res = 0; List <double> slist = new List <double>(); Point2dCollection pts; if (Sec is SectionGeneral) { SectionGeneral secg = Sec as SectionGeneral; pts = secg.OPOLY; } else { pts = Sec.CheckPointCollection; } //添加到结果表 foreach (Point2d pt in pts) { slist.Add(CodeCheck.CalPointStability(NL, Sec, pt, DPs, E)); } //求得集合中的最大值 foreach (double ss in slist) { Res = Math.Max(Res, ss); } return(Res); }
/// <summary> /// 计算四个最大外边角点压弯组合构件强度 GB 50017-2003 式(5.2.1) /// 注:目前默认支持单位为:N,m /// </summary> /// <param name="NL">截面内力</param> /// <param name="Sec">截面参数</param> /// <param name="DPs">设计参数</param> /// <returns>强度应力值(均为正值)</returns> public static double CalStrength_YW(SecForce NL, BSections Sec, DesignParameters DPs) { double Res1, Res2, Res3, Res4, RES; //返回结果 double Wy = Sec.Iyy / Math.Max(Sec.CzM, Sec.CzP); //抗弯截面模量 double Wz = Sec.Izz / Math.Max(Sec.CyM, Sec.CyP); //抗弯截面模量 double Wny = Wy * DPs.Ratio_Anet; //净截面模量 double Wnz = Wz * DPs.Ratio_Anet; //净截面模量 double My = Math.Abs(NL.My); //弯矩,取绝对值 double Mz = Math.Abs(NL.Mz); Res1 = NL.N / (Sec.Area * DPs.Ratio_Anet) + My / (DPs.Gamma_y * Wny) + Mz / (DPs.Gamma_z * Wnz); Res2 = NL.N / (Sec.Area * DPs.Ratio_Anet) - My / (DPs.Gamma_y * Wny) - Mz / (DPs.Gamma_z * Wnz); Res3 = NL.N / (Sec.Area * DPs.Ratio_Anet) - My / (DPs.Gamma_y * Wny) + Mz / (DPs.Gamma_z * Wnz); Res4 = NL.N / (Sec.Area * DPs.Ratio_Anet) + My / (DPs.Gamma_y * Wny) - Mz / (DPs.Gamma_z * Wnz); RES = Math.Max(Math.Abs(Res1), Math.Abs(Res2)); RES = Math.Max(Math.Abs(Res3), RES); RES = Math.Max(Math.Abs(Res4), RES); return(RES); }
/// <summary> /// 计算截面验算点上的强度最大值(绝对值) /// </summary> /// <param name="NL">截面内力</param> /// <param name="Sec">截面对像</param> /// <param name="DPs">单元设计参数</param> /// <returns>截面强度应力值(绝对值)</returns> public static double CalSecMaxStrength_YW(SecForce NL, BSections Sec, DesignParameters DPs) { double Res = 0; List <double> slist = new List <double>(); int count = 4; if (Sec is SectionGeneral) { SectionGeneral secg = Sec as SectionGeneral; count = secg.OPOLY.Length; } else { count = 4; } //添加到结果表 for (int i = 0; i < count; i++) { slist.Add(CodeCheck.CalPointStrength_YW(NL, Sec, i, DPs)); } //求得集合中的最大值 foreach (double ss in slist) { Res = Math.Max(Res, Math.Abs(ss)); } return(Res); }
private void button5_Click(object sender, EventArgs e) { BLoadComb com = CurModel.LoadCombTable.getLoadComb(LCKind.STEEL, "sGen2"); ElemForce ef = CurModel.CalElemForceComb(com, 4); SecForce sf = ef.Force_i; FrameElement fe = CurModel.elements[4] as FrameElement; BSections sec = CurModel.sections[fe.iPRO]; double s1 = CodeCheck.CalPointStrength_YW(sf, sec, 1, fe.DPs); double s2 = CodeCheck.CalPointStrength_YW(sf, sec, 2, fe.DPs); double s3 = CodeCheck.CalPointStrength_YW(sf, sec, 3, fe.DPs); double s4 = CodeCheck.CalPointStrength_YW(sf, sec, 4, fe.DPs); return; }
/// <summary> /// 计算四个最大外边角点压弯组合构件稳定性 GB 50017-2003 式(5.2.5-1) (5.2.5-2) /// 注:目前默认支持单位为:N,m /// </summary> /// <param name="NL">截面内力</param> /// <param name="Sec">截面参数</param> /// <param name="DPs">设计参数</param> /// <param name="E">材料的弹性模量</param> /// <returns>稳定验算应力值(均为正值)</returns> public static double CalStability_YW(SecForce NL, BSections Sec, DesignParameters DPs, double E) { double Res1, Res2, RES; //分别对应(5.2.5-1) (5.2.5-2)式结果 double Wy, Wz; //抗弯截面模量 if (NL.My >= 0) { Wy = Sec.Iyy / Sec.CzP;//+z侧受压 } else { Wy = Sec.Iyy / Sec.CzM;//-z侧受压 } if (NL.Mz >= 0) { Wz = Sec.Izz / Sec.CyP;//+y侧受压 } else { Wz = Sec.Izz / Sec.CyM; //-y侧受压 } double N = NL.N; //轴向力 double My = Math.Abs(NL.My); //弯矩,取绝对值 double Mz = Math.Abs(NL.Mz); //参数 double N_ey = Math.Pow(Math.PI, 2) * E * Sec.Area / (1.1 * Math.Pow(DPs.Lemda_y, 2)); double N_ez = Math.Pow(Math.PI, 2) * E * Sec.Area / (1.1 * Math.Pow(DPs.Lemda_z, 2)); double Ref_Ny = 1;//与轴压力有关的参数 double Ref_Nz = 1; if (N < 0)//如为轴压力对参数进行调整 { Ref_Ny = 1 - 0.8 * Math.Abs(N) / N_ey; Ref_Nz = 1 - 0.8 * Math.Abs(N) / N_ez; } //进行功能计算,注意弯矩后两项应为-号 Res1 = N / (DPs.Phi_y * Sec.Area) - DPs.Belta_my * My / (DPs.Gamma_y * Wy * Ref_Ny) - DPs.Yita * DPs.Belta_tz * Mz / (DPs.Phi_bz * Wz); Res2 = N / (DPs.Phi_z * Sec.Area) - DPs.Yita * DPs.Belta_ty * My / (DPs.Phi_by * Wy) - DPs.Belta_mz * Mz / (DPs.Gamma_z * Wz * Ref_Nz); RES = Math.Max(Math.Abs(Res1), Math.Abs(Res2)); return(RES); }
private void button1_Click(object sender, EventArgs e) { MainForm mmf = this.Owner as MainForm; ModelForm1 mf = mmf.ModelForm; Bmodel mm = mf.CurModel; int secid = Convert.ToInt32(tb_SecID.Text); BSections curSec = mm.sections[secid]; foreach (DataGridViewRow row in Dgv_SecProp.Rows) { string Prop = row.Cells[0].Value.ToString(); double valu = Convert.ToDouble(row.Cells[1].Value.ToString()); switch (Prop) { case "A": curSec.Area = valu; break; case "Iw": curSec.Iw = valu; break; case "Ixx": curSec.Ixx = valu; break; case "Iyy": curSec.Iyy = valu; break; case "Izz": curSec.Izz = valu; break; case "Cent:y": curSec.Cy = valu; break; case "Cent:z": curSec.Cz = valu; break; case "Shear:y": curSec.Sy = valu; break; case "Shear:z": curSec.Sz = valu; break; case "CyM": curSec.CyM = valu; break; case "CyP": curSec.CyP = valu; break; case "CzM": curSec.CzM = valu; break; case "CzP": curSec.CzP = valu; break; default: break; } } this.Close(); }
/// <summary> /// 对某单元按指定的计算长度计算长细比 /// </summary> /// <param name="mm">模型对像</param> /// <param name="iElem">单元号,必须为梁单元FrameElement</param> /// <param name="l_0y">平面内计算长度</param> /// <param name="l_0z">平面外计算长度</param> public static void CalDesignPara_lemda(ref Bmodel mm, int iElem, double l_0y, double l_0z) { FrameElement ele = mm.elements[iElem] as FrameElement; int iSec = ele.iPRO; //截面号 BSections curSec = mm.sections[iSec]; //当前截面 double i_y = Math.Sqrt(mm.sections[iSec].Iyy / mm.sections[iSec].Area); //回转半径 double i_z = Math.Sqrt(mm.sections[iSec].Izz / mm.sections[iSec].Area); ele.DPs.Lemda_y = l_0y / i_y; //计算长细比 ele.DPs.Lemda_z = l_0z / i_z; //计算长细比 //形心到剪心的矩离 double e0 = Math.Sqrt(Math.Pow(curSec.Sy - curSec.Cy, 2) + Math.Pow(curSec.Sz - curSec.Cz, 2)); double i02 = Math.Pow(e0, 2) + Math.Pow(i_y, 2) + Math.Pow(i_z, 2); double Lemda_z2 = 0;//扭转屈曲的换算长细比 //如果截面上下不对称 if (Math.Abs(curSec.CzM - curSec.CzP) > 0.002) { //扭转屈曲的换算长细比 Lemda_z2 = i02 * curSec.Area / (curSec.Ixx / 25.7 + curSec.Iw / Math.Pow(l_0z, 2)); double temp1 = Math.Pow(ele.DPs.Lemda_z, 2) + Lemda_z2; double temp2 = temp1 + Math.Sqrt(Math.Pow(temp1, 2) - 4 * (1 - Math.Pow(e0, 2) / i02) * Math.Pow(ele.DPs.Lemda_z, 2) * Lemda_z2); ele.DPs.Lemda_yz = Math.Sqrt(temp2) / Math.Sqrt(2); } else if (Math.Abs(curSec.CyM - curSec.CyP) > 0.002) { //扭转屈曲的换算长细比 Lemda_z2 = i02 * curSec.Area / (curSec.Ixx / 25.7 + curSec.Iw / Math.Pow(l_0y, 2)); double temp1 = Math.Pow(ele.DPs.Lemda_y, 2) + Lemda_z2; double temp2 = temp1 + Math.Sqrt(Math.Pow(temp1, 2) - 4 * (1 - Math.Pow(e0, 2) / i02) * Math.Pow(ele.DPs.Lemda_y, 2) * Lemda_z2); ele.DPs.Lemda_yz = Math.Sqrt(temp2) / Math.Sqrt(2); } double eleLeng = mm.getFrameLength(iElem); //单元长度 ele.DPs.Lk_y = l_0y / eleLeng; //计算长度系数(单元长度的倍数) ele.DPs.Lk_z = l_0z / eleLeng; }
/// <summary> /// 计算验算点的稳定性应力 GB 50017-2003 式(5.2.5-1) (5.2.5-2) /// </summary> /// <param name="NL">截面内力</param> /// <param name="Sec">截面</param> /// <param name="Pt">截面验算点,以截面形心为原点</param> /// <param name="DPs">截面验算参数</param> /// <param name="E">材料弹性模量</param> /// <returns>稳定应力(为正或0)</returns> public static double CalPointStability(SecForce NL, BSections Sec, Point2d Pt, DesignParameters DPs, double E) { double y, z, Res, Sta1, Sta2; y = Pt.X; z = Pt.Y; double N = NL.N; //轴向力 double My = NL.My; //弯矩 double Mz = NL.Mz; //参数 double N_ey = Math.Pow(Math.PI, 2) * E * Sec.Area / (1.1 * Math.Pow(DPs.Lemda_y, 2)); double N_ez = Math.Pow(Math.PI, 2) * E * Sec.Area / (1.1 * Math.Pow(DPs.Lemda_z, 2)); double Ref_Ny = 1;//与轴压力有关的参数 double Ref_Nz = 1; if (N < 0)//如为轴压力对参数进行调整 { Ref_Ny = 1 - 0.8 * Math.Abs(N) / N_ey; Ref_Nz = 1 - 0.8 * Math.Abs(N) / N_ez; } //进行功能计算,注意弯矩后两项应为-号 Sta1 = N / (DPs.Phi_y * Sec.Area) - DPs.Belta_my * My * z / (DPs.Gamma_y * Sec.Iyy * Ref_Ny) - DPs.Yita * DPs.Belta_tz * Mz * y / (DPs.Phi_bz * Sec.Izz); Sta2 = N / (DPs.Phi_z * Sec.Area) - DPs.Yita * DPs.Belta_ty * My * z / (DPs.Phi_by * Sec.Iyy) - DPs.Belta_mz * Mz * y / (DPs.Gamma_z * Sec.Izz * Ref_Nz); //取控制值 Res = Math.Min(Sta1, Sta2); //如果为拉应力则返回0,如果为压应力反回正的应力值 if (Res > 0) { return(0); } else { return(Math.Abs(Res)); } }