创建一个简单的结构模型,运行分析,提取结果,并将结果与手算值进行比较。
以下是详细的代码解析:
-
开头部分是一些using语句,引用了必要的命名空间,特别是SAP2000v1, 它包含了SAP2000 API的类和方法。
-
在Main方法中,首先定义了一些变量,用于控制是启动一个新的SAP2000实例还是附加到一个已有的实例,以及SAP2000程序的路径。
bool AttachToInstance; //是否附加到一个已有实例
AttachToInstance = false;bool SpecifyPath; //是否指定SAP2000程序路径
SpecifyPath = false;string ProgramPath; //SAP2000程序路径
ProgramPath = @"C:\Program Files\Computers and Structures\SAP2000 22\SAP2000.exe";
- 接下来是创建模型文件的目录和文件名。
string ModelDirectory = @"C:\CSiAPIexample"; //模型文件的目录
string ModelName = "API_1-001.sdb"; //模型文件名
string ModelPath = ModelDirectory + System.IO.Path.DirectorySeparatorChar + ModelName; //模型文件完整路径
- 然后,创建一个cOAPI对象mySapObject,它是与SAP2000应用程序交互的主要对象。
cOAPI mySapObject = null;
- 创建一个cHelper对象myHelper,它提供了一些辅助方法。
cHelper myHelper;
myHelper = new Helper();
- 根据AttachToInstance的值,决定是附加到一个已有的SAP2000实例,还是启动一个新的实例。如果是启动新实例,那么还要根据SpecifyPath的值决定是使用指定的路径还是使用默认的安装路径。
if (AttachToInstance)
{//附加到一个已运行的SAP2000实例mySapObject = myHelper.GetObject("CSI.SAP2000.API.SapObject");
}
else
{if (SpecifyPath){//从指定路径启动一个新的SAP2000实例mySapObject = myHelper.CreateObject(ProgramPath);}else{//从默认安装路径启动一个新的SAP2000实例mySapObject = myHelper.CreateObjectProgID("CSI.SAP2000.API.SapObject");}//启动SAP2000应用程序mySapObject.ApplicationStart();
}
- 创建一个cSapModel对象mySapModel,它代表SAP2000的结构模型,大部分操作都是通过它进行的。
cSapModel mySapModel;
mySapModel = mySapObject.SapModel;
- 初始化模型,创建一个新的空模型。
mySapModel.InitializeNewModel((eUnits.kip_in_F));
mySapModel.File.NewBlank();
- 定义材料属性。
mySapModel.PropMaterial.SetMaterial("CONC", eMatType.Concrete, -1, "", "");
mySapModel.PropMaterial.SetMPIsotropic("CONC", 3600, 0.2, 0.0000055, 0);
- 定义截面属性。
mySapModel.PropFrame.SetRectangle("R1", "CONC", 12, 12, -1, "", "");
- 定义截面属性修正系数。
double[] ModValue = new double[8];
//...
mySapModel.PropFrame.SetModifiers("R1", ref ModValue);
- 切换单位制为kip-ft。
mySapModel.SetPresentUnits(eUnits.kip_ft_F);
- 添加框架单元。
string[] FrameName = new string[3];
//...
mySapModel.FrameObj.AddByCoord(0, 0, 0, 0, 0, 10, ref temp_string1, "R1", "1", "Global");
mySapModel.FrameObj.AddByCoord(0, 0, 10, 8, 0, 16, ref temp_string1, "R1", "2", "Global");
mySapModel.FrameObj.AddByCoord(-4, 0, 10, 0, 0, 10, ref temp_string1, "R1", "3", "Global");
- 指定节点约束。
string[] PointName = new string[2];
bool[] Restraint = new bool[6];
//...
mySapModel.PointObj.SetRestraint(PointName[0], ref Restraint, 0);
mySapModel.PointObj.SetRestraint(PointName[1], ref Restraint, 0);
- 刷新视图,更新缩放。
mySapModel.View.RefreshView(0, false);
- 添加荷载工况。
mySapModel.LoadPatterns.Add("1", eLoadPatternType.Other, 1, true);
mySapModel.LoadPatterns.Add("2", eLoadPatternType.Other, 0, true);
//...
- 指定各个荷载工况下的荷载。
mySapModel.PointObj.SetLoadForce(PointName[0], "2", ref PointLoadValue, false, "Global", 0);
mySapModel.FrameObj.SetLoadDistributed(FrameName[2], "2", 1, 10, 0, 1, 1.8, 1.8, "Global", false, false, 0);
//...
- 切换回kip-in单位制。
mySapModel.SetPresentUnits(eUnits.kip_in_F);
- 保存模型。
mySapModel.File.Save(ModelPath);
- 运行分析。
mySapModel.Analyze.RunAnalysis();
- 提取各个荷载工况下的分析结果。
double[] SapResult = new double[7];
for (i = 0; i <= 6; i++)
{mySapModel.Results.Setup.DeselectAllCasesAndCombosForOutput();mySapModel.Results.Setup.SetCaseSelectedForOutput(System.Convert.ToString(i + 1), true);if (i <= 3){mySapModel.Results.JointDispl(PointName[1], eItemTypeElm.ObjectElm, ref NumberResults, //...);}else{mySapModel.Results.JointDispl(PointName[0], eItemTypeElm.ObjectElm, ref NumberResults, //...);}
}
- 关闭SAP2000,释放资源。
mySapObject.ApplicationExit(false);
mySapModel = null;
mySapObject = null;
- 将SAP2000的分析结果与预设的独立计算结果进行对比,计算误差百分比,并输出对比结果。
double[] IndResult = new double[7];
//...
for (i = 0; i <= 6; i++)
{PercentDiff[i] = (SapResult[i] / IndResult[i]) - 1;//...
}string msg = "";
msg = msg + "LC Sap2000 Independent%Diff\r\n";
for (i = 0; i <= 5; i++)
{msg = msg + string.Format("{0:0}", i + 1) + "" + SapResultString[i] + "" + IndResultString[i] + "" + PercentDiffString[i] + "\r\n";
}
//...
Console.WriteLine(msg);
涵盖了SAP2000 API的许多基本功能,如
- 创建模型
- 定义材料
- 截面属性
- 创建结构对象
- 指定荷载和约束条件
- 运行分析
- 提取结果