SAP2000 API基础编程
在上一节中,我们介绍了SAP2000的基本操作和界面使用方法。本节将深入探讨SAP2000的API基础编程,帮助您了解如何通过编程接口来自动化SAP2000的操作,提高工作效率,实现复杂的工程项目需求。
1. SAP2000 API概述
SAP2000的API(Application Programming Interface,应用程序接口)允许用户通过编程语言(如C#、Python、VBA等)与SAP2000进行交互。API提供了丰富的函数和方法,使得用户可以创建、修改、分析和导出模型,而无需手动操作SAP2000的图形界面。通过API,您可以实现以下功能:
- 自动化建模过程
- 批量处理数据
- 定制分析和设计流程
- 集成其他软件或工具
1.1 API的主要组件
SAP2000的API主要由以下几个组件构成:
- SAPObject: SAP2000的主要对象,用于初始化和控制SAP2000实例。
- Model: 代表SAP2000的模型对象,用于创建和操作模型。
- Frame: 代表框架(梁、柱等)对象,用于定义框架的几何和属性。
- LoadCase: 代表荷载工况对象,用于定义荷载工况和荷载组合。
- Analysis: 代表分析对象,用于运行不同的分析类型。
- Results: 代表结果对象,用于提取和处理分析结果。
1.2 API的调用方式
SAP2000 API可以通过COM(Component Object Model)接口进行调用。COM接口允许不同编程语言之间的互操作性,因此您可以选择自己熟悉的编程语言来开发SAP2000的自动化脚本。常见的调用方式包括:
- C#: 通过.NET框架调用COM接口。
- Python: 通过pywin32库调用COM接口。
- VBA: 通过Excel或其他Office应用程序调用COM接口。
2. 初始化和控制SAP2000实例
在使用SAP2000 API之前,首先需要初始化SAP2000实例并进行基本控制。以下是一个简单的示例,展示如何在C#中初始化SAP2000实例并打开一个现有的模型文件。
2.1 C#示例
using System;
using SAP2000v1;
class Program
{
static void Main(string[] args)
{
// 创建SAPObject对象
cSapModel objSapModel = null;
SAP2000i1.SapObject objSapObject = null;
// 初始化SAP2000实例
int ret = 0;
string sApp = “CSI.SAP2000.API”;
objSapObject = new SAP2000i1.SapObject();
ret = objSapObject.ApplicationStart(sApp, 20, 5, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
// 获取SAPModel对象
objSapObject.ObjectUsing = 1;
ret = objSapObject.SapModel(out objSapModel);
// 打开现有模型文件
string modelName = @”C:\Path\To\Your\Model.sdb”;
ret = objSapModel.File.OpenFile(modelName);
// 检查模型是否打开成功
if (ret == 0)
{
Console.WriteLine(“模型文件打开成功”);
}
else
{
Console.WriteLine(“模型文件打开失败”);
}
// 关闭SAP2000实例
ret = objSapModel.File.CloseFile();
objSapObject.ApplicationExit();
objSapObject = null;
objSapModel = null;
Console.WriteLine(“SAP2000实例已关闭”);
}
}
2.2 Python示例
import win32com.client
# 创建SAPObject对象
sap_obj = win32com.client.Dispatch(“SAP2000.API.SapObject”)
# 初始化SAP2000实例
ret = sap_obj.ApplicationStart(“CSI.SAP2000.API”, 20, 5, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
# 获取SAPModel对象
sap_obj.ObjectUsing = 1
sap_model = sap_obj.SapModel
# 打开现有模型文件
model_name = r”C:\Path\To\Your\Model.sdb”
ret = sap_model.File.OpenFile(model_name)
# 检查模型是否打开成功
if ret == 0:
print(“模型文件打开成功”)
else:
print(“模型文件打开失败”)
# 关闭SAP2000实例
ret = sap_model.File.CloseFile()
sap_obj.ApplicationExit()
print(“SAP2000实例已关闭”)
2.3 VBA示例
Sub OpenSAP2000Model()
‘ 创建SAPObject对象
Dim SapObject As Object
Set SapObject = CreateObject(“SAP2000.API.SapObject”)
‘ 初始化SAP2000实例
Dim ret As Integer
ret = SapObject.ApplicationStart(“CSI.SAP2000.API”, 20, 5, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
‘ 获取SAPModel对象
SapObject.ObjectUsing = 1
Dim SapModel As Object
Set SapModel = SapObject.SapModel
‘ 打开现有模型文件
Dim modelName As String
modelName = “C:\Path\To\Your\Model.sdb”
ret = SapModel.File.OpenFile(modelName)
‘ 检查模型是否打开成功
If ret = 0 Then
Debug.Print “模型文件打开成功”
Else
Debug.Print “模型文件打开失败”
End If
‘ 关闭SAP2000实例
ret = SapModel.File.CloseFile
SapObject.ApplicationExit
Debug.Print “SAP2000实例已关闭”
End Sub
3. 创建和操作模型
3.1 创建新模型
在SAP2000中创建新模型的基本步骤包括初始化模型、设置单位、定义节点和框架、应用荷载等。以下是一个C#示例,展示如何创建一个简单的框架模型。
3.1.1 C#示例
using System;
using SAP2000v1;
class Program
{
static void Main(string[] args)
{
// 创建SAPObject对象
cSapModel objSapModel = null;
SAP2000i1.SapObject objSapObject = null;
// 初始化SAP2000实例
int ret = 0;
string sApp = “CSI.SAP2000.API”;
objSapObject = new SAP2000i1.SapObject();
ret = objSapObject.ApplicationStart(sApp, 20, 5, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
// 获取SAPModel对象
objSapObject.ObjectUsing = 1;
ret = objSapObject.SapModel(out objSapModel);
// 创建新模型
ret = objSapModel.File.NewBlank();
// 设置模型单位
ret = objSapModel.SetPresentUnits(1); // 1表示“米-吨-秒”单位
// 定义节点
string[] pointNames = new string[4];
double[] xCoords = new double[] { 0, 0, 5, 5 };
double[] yCoords = new double[] { 0, 5, 0, 5 };
double[] zCoords = new double[] { 0, 0, 0, 0 };
ret = objSapModel.PointObj.AddCartesian(pointNames, xCoords, yCoords, zCoords);
// 定义框架
string[] frameNames = new string[2];
string[] point1 = new string[] { pointNames[0], pointNames[2] };
string[] point2 = new string[] { pointNames[1], pointNames[3] };
string[] prop = new string[] { “FrameProp1”, “FrameProp1” };
ret = objSapModel.FrameObj.AddByPoint(frameNames, point1, point2, prop);
// 定义框架截面属性
ret = objSapModel.PropFrame.SetRectangle(“FrameProp1”, “Steel”, 0.5, 0.3);
// 定义荷载工况
ret = objSapModel.LoadCases.DefineCase(“Dead”, 1);
// 定义荷载
ret = objSapModel.FrameObj.SetLoadForce(frameNames[0], “Dead”, 1, 0, -100, 0, 0, 0, 0);
ret = objSapModel.FrameObj.SetLoadForce(frameNames[1], “Dead”, 1, 0, -100, 0, 0, 0, 0);
// 保存模型
string savePath = @”C:\Path\To\Your\NewModel.sdb”;
ret = objSapModel.File.SaveAs(savePath);
// 检查模型是否保存成功
if (ret == 0)
{
Console.WriteLine(“模型文件保存成功”);
}
else
{
Console.WriteLine(“模型文件保存失败”);
}
// 关闭SAP2000实例
ret = objSapModel.File.CloseFile();
objSapObject.ApplicationExit();
objSapObject = null;
objSapModel = null;
Console.WriteLine(“SAP2000实例已关闭”);
}
}
3.1.2 Python示例
import win32com.client
# 创建SAPObject对象
sap_obj = win32com.client.Dispatch(“SAP2000.API.SapObject”)
# 初始化SAP2000实例
ret = sap_obj.ApplicationStart(“CSI.SAP2000.API”, 20, 5, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
# 获取SAPModel对象
sap_obj.ObjectUsing = 1
sap_model = sap_obj.SapModel
# 创建新模型
ret = sap_model.File.NewBlank()
# 设置模型单位
ret = sap_model.SetPresentUnits(1) # 1表示“米-吨-秒”单位
# 定义节点
point_names = [“Point1”, “Point2”, “Point3”, “Point4”]
x_coords = [0, 0, 5, 5]
y_coords = [0, 5, 0, 5]
z_coords = [0, 0, 0, 0]
ret = sap_model.PointObj.AddCartesian(x_coords, y_coords, z_coords, point_names)
# 定义框架
frame_names = [“Frame1”, “Frame2”]
point1 = [point_names[0], point_names[2]]
point2 = [point_names[1], point_names[3]]
prop = [“FrameProp1”, “FrameProp1”]
ret = sap_model.FrameObj.AddByPoint(point1, point2, prop, frame_names)
# 定义框架截面属性
ret = sap_model.PropFrame.SetRectangle(“FrameProp1”, “Steel”, 0.5, 0.3)
# 定义荷载工况
ret = sap_model.LoadCases.DefineCase(“Dead”, 1)
# 定义荷载
ret = sap_model.FrameObj.SetLoadForce(frame_names[0], “Dead”, 1, 0, -100, 0, 0, 0, 0)
ret = sap_model.FrameObj.SetLoadForce(frame_names[1], “Dead”, 1, 0, -100, 0, 0, 0, 0)
# 保存模型
save_path = r”C:\Path\To\Your\NewModel.sdb”
ret = sap_model.File.SaveAs(save_path)
# 检查模型是否保存成功
if ret == 0:
print(“模型文件保存成功”)
else:
print(“模型文件保存失败”)
# 关闭SAP2000实例
ret = sap_model.File.CloseFile()
sap_obj.ApplicationExit()
print(“SAP2000实例已关闭”)
3.1.3 VBA示例
Sub CreateSAP2000Model()
‘ 创建SAPObject对象
Dim SapObject As Object
Set SapObject = CreateObject(“SAP2000.API.SapObject”)
‘ 初始化SAP2000实例
Dim ret As Integer
ret = SapObject.ApplicationStart(“CSI.SAP2000.API”, 20, 5, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
‘ 获取SAPModel对象
SapObject.ObjectUsing = 1
Dim SapModel As Object
Set SapModel = SapObject.SapModel
‘ 创建新模型
ret = SapModel.File.NewBlank
‘ 设置模型单位
ret = SapModel.SetPresentUnits(1) ‘ 1表示“米-吨-秒”单位
‘ 定义节点
Dim pointNames(1 To 4) As String
Dim xCoords(1 To 4) As Double
Dim yCoords(1 To 4) As Double
Dim zCoords(1 To 4) As Double
pointNames(1) = “Point1”
pointNames(2) = “Point2”
pointNames(3) = “Point3”
pointNames(4) = “Point4”
xCoords(1) = 0
xCoords(2) = 0
xCoords(3) = 5
xCoords(4) = 5
yCoords(1) = 0
yCoords(2) = 5
yCoords(3) = 0
yCoords(4) = 5
zCoords(1) = 0
zCoords(2) = 0
zCoords(3) = 0
zCoords(4) = 0
ret = SapModel.PointObj.AddCartesian(xCoords, yCoords, zCoords, pointNames)
‘ 定义框架
Dim frameNames(1 To 2) As String
Dim point1(1 To 2) As String
Dim point2(1 To 2) As String
Dim prop(1 To 2) As String
frameNames(1) = “Frame1”
frameNames(2) = “Frame2”
point1(1) = pointNames(1)
point1(2) = pointNames(3)
point2(1) = pointNames(2)
point2(2) = pointNames(4)
prop(1) = “FrameProp1”
prop(2) = “FrameProp1”
ret = SapModel.FrameObj.AddByPoint(point1, point2, prop, frameNames)
‘ 定义框架截面属性
ret = SapModel.PropFrame.SetRectangle(“FrameProp1”, “Steel”, 0.5, 0.3)
‘ 定义荷载工况
ret = SapModel.LoadCases.DefineCase(“Dead”, 1)
‘ 定义荷载
ret = SapModel.FrameObj.SetLoadForce(frameNames(1), “Dead”, 1, 0, -100, 0, 0, 0, 0)
ret = SapModel.FrameObj.SetLoadForce(frameNames(2), “Dead”, 1, 0, -100, 0, 0, 0, 0)
‘ 保存模型
Dim savePath As String
savePath = “C:\Path\To\Your\NewModel.sdb”
ret = SapModel.File.SaveAs(savePath)
‘ 检查模型是否保存成功
If ret = 0 Then
Debug.Print “模型文件保存成功”
Else
Debug.Print “模型文件保存失败”
End If
‘ 关闭SAP2000实例
ret = SapModel.File.CloseFile
SapObject.ApplicationExit
Debug.Print “SAP2000实例已关闭”
End Sub
3.2 修改现有模型
除了创建新模型,SAP2000 API还允许您修改现有模型。您可以添加新的框架、节点、荷载工况等,或者修改现有的对象属性。以下是一个C#示例,展示如何修改现有模型中的框架截面属性。
3.2.1 C#示例
using System;
using SAP2000v1;
class Program
{
static void Main(string[] args)
{
// 创建SAPObject对象
cSapModel objSapModel = null;
SAP2000i1.SapObject objSapObject = null;
// 初始化SAP2000实例
int ret = 0;
string sApp = “CSI.SAP2000.API”;
objSapObject = new SAP2000i1.SapObject();
ret = objSapObject.ApplicationStart(sApp, 20, 5, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
// 获取SAPModel对象
objSapObject.ObjectUsing = 1;
ret = objSapObject.SapModel(out objSapModel);
// 打开现有模型文件
string modelName = @”C:\Path\To\Your\Model.sdb”;
ret = objSapModel.File.OpenFile(modelName);
// 检查模型是否打开成功
if (ret == 0)
{
Console.WriteLine(“模型文件打开成功”);
}
else
{
Console.WriteLine(“模型文件打开失败”);
return;
}
// 修改框架截面属性
ret = objSapModel.PropFrame.SetRectangle(“FrameProp1”, “Steel”, 0.6, 0.4);
// 保存模型
string savePath = @”C:\Path\To\Your\ModifiedModel.sdb”;
ret = objSapModel.File.SaveAs(savePath);
// 检查模型是否保存成功
if (ret == 0)
{
Console.WriteLine(“模型文件保存成功”);
}
else
{
Console.WriteLine(“模型文件保存失败”);
}
// 关闭SAP2000实例
ret = objSapModel.File.CloseFile();
objSapObject.ApplicationExit();
objSapObject = null;
objSapModel = null;
Console.WriteLine(“SAP2000实例已关闭”);
}
}
3.2.2 Python示例
import win32com.client
# 创建SAPObject对象
sap_obj = win32com.client.Dispatch(“SAP2000.API.SapObject”)
# 初始化SAP2000实例
ret = sap_obj.ApplicationStart(“CSI.SAP2000.API”, 20, 5, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
# 获取SAPModel对象
sap_obj.ObjectUsing = 1
sap_model = sap_obj.SapModel
# 打开现有模型文件
model_name = r”C:\Path\To\Your\Model.sdb”
ret = sap_model.File.OpenFile(model_name)
# 检查模型是否打开成功
if ret == 0:
print(“模型文件打开成功”)
else:
print(“模型文件打开失败”)
exit()
# 修改框架截面属性
ret = sap_model.PropFrame.SetRectangle(“FrameProp1”, “Steel”, 0.6, 0.4)
# 保存模型
save_path = r”C:\Path\To\Your\ModifiedModel.sdb”
ret = sap_model.File.SaveAs(save_path)
# 检查模型是否保存成功
if ret == 0:
print(“模型文件保存成功”)
else:
print(“模型文件保存失败”)
# 关闭SAP2000实例
ret = sap_model.File.CloseFile()
sap_obj.ApplicationExit()
print(“SAP2000实例已关闭”)
3.2.3 VBA示例
Sub ModifySAP2000Model()
‘ 创建SAPObject对象
Dim SapObject As Object
Set SapObject = CreateObject(“SAP2000.API.SapObject”)
‘ 初始化SAP2000实例
Dim ret As Integer
ret = SapObject.ApplicationStart(“CSI.SAP2000.API”, 20, 5, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
‘ 获取SAPModel对象
SapObject.ObjectUsing = 1
Dim SapModel As Object
Set SapModel = SapObject.SapModel
‘ 打开现有模型文件
Dim modelName As String
modelName = “C:\Path\To\Your\Model.sdb”
ret = SapModel.File.OpenFile(modelName)
‘ 检查模型是否打开成功
If ret = 0 Then
Debug.Print “模型文件打开成功”
Else
Debug.Print “模型文件打开失败”
Exit Sub
End If
‘ 修改框架截面属性
ret = SapModel.PropFrame.SetRectangle(“FrameProp1”, “Steel”, 0.6, 0.4)
‘ 保存模型
Dim savePath As String
savePath = “C:\Path\To\Your\ModifiedModel.sdb”
ret = SapModel.File.SaveAs(savePath)
‘ 检查模型是否保存成功
If ret = 0 Then
Debug.Print “模型文件保存成功”
Else
Debug.Print “模型文件保存失败”
End If
‘ 关闭SAP2000实例
ret = SapModel.File.CloseFile
SapObject.ApplicationExit
Debug.Print “SAP2000实例已关闭”
End Sub
4. 运行分析
4.1 运行线性静力分析
SAP2000 API允许您运行各种类型的分析,包括线性静力分析、非线性静力分析、动态分析等。以下是一个C#示例,展示如何运行线性静力分析并提取结果。
4.1.1 C#示例
using System;
using SAP2000v1;
class Program
{
static void Main(string[] args)
{
// 创建SAPObject对象
cSapModel objSapModel = null;
SAP2000i1.SapObject objSapObject = null;
// 初始化SAP2000实例
int ret = 0;
string sApp = “CSI.SAP2000.API”;
objSapObject = new SAP2000i1.SapObject();
ret = objSapObject.ApplicationStart(sApp, 20, 5, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
// 获取SAPModel对象
objSapObject.ObjectUsing = 1;
ret = objSapObject.SapModel(out objSapModel);
// 打开现有模型文件
string modelName = @”C:\Path\To\Your\Model.sdb”;
ret = objSapModel.File.OpenFile(modelName);
// 检查模型是否打开成功
if (ret == 0)
{
Console.WriteLine(“模型文件打开成功”);
}
else
{
Console.WriteLine(“模型文件打开失败”);
return;
}
// 运行线性静力分析
string loadCase = “Dead”;
ret = objSapModel.Analyze.RunCase(loadCase);
// 检查分析是否成功
if (ret == 0)
{
Console.WriteLine(“线性静力分析成功”);
}
else
{
Console.WriteLine(“线性静力分析失败”);
return;
}
// 提取分析结果
string[] frameNames = new string[] { “Frame1”, “Frame2” };
double[] results = new double[6];
int[] numberResults = new int[1];
string[] objectNames = new string[1];
double[] loadFactors = new double[1];
int[] stepTypes = new int[1];
double[] stepNumbers = new double[1];
ret = objSapModel.Results.Setup.DeselectAllCasesAndCombos();
ret = objSapModel.Results.Setup.SetCaseSelectedForOutput(loadCase);
ret = objSapModel.Results.FrameForce(frameNames, results, numberResults, objectNames, loadFactors, stepTypes, stepNumbers);
// 检查结果提取是否成功
if (ret == 0)
{
Console.WriteLine(“分析结果提取成功”);
for (int i = 0; i < numberResults[0]; i++)
{
Console.WriteLine($”框架: {objectNames[i]}, 荷载工况: {loadCase}, 荷载因子: {loadFactors[i]}, 步类型: {stepTypes[i]}, 步数: {stepNumbers[i]}, 结果: {results[i]}”);
}
}
else
{
Console.WriteLine(“分析结果提取失败”);
}
// 关闭SAP2000实例
ret = objSapModel.File.CloseFile();
objSapObject.ApplicationExit();
objSapObject = null;
objSapModel = null;
Console.WriteLine(“SAP2000实例已关闭”);
}
}
4.1.2 Python示例
import win32com.client
# 创建SAPObject对象
sap_obj = win32com.client.Dispatch(“SAP2000.API.SapObject”)
# 初始化SAP2000实例
ret = sap_obj.ApplicationStart(“CSI.SAP2000.API”, 20, 5, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
# 获取SAPModel对象
sap_obj.ObjectUsing = 1
sap_model = sap_obj.SapModel
# 打开现有模型文件
model_name = r”C:\Path\To\Your\Model.sdb”
ret = sap_model.File.OpenFile(model_name)
# 检查模型是否打开成功
if ret == 0:
print(“模型文件打开成功”)
else:
print(“模型文件打开失败”)
exit()
# 运行线性静力分析
load_case = “Dead”
ret = sap_model.Analyze.RunCase(load_case)
# 检查分析是否成功
if ret == 0:
print(“线性静力分析成功”)
else:
print(“线性静力分析失败”)
exit()
# 提取分析结果
frame_names = [“Frame1”, “Frame2”]
results = [0.0] * 6
number_results = [0]
object_names = [“”]
load_factors = [0.0]
step_types = [0]
step_numbers = [0.0]
ret = sap_model.Results.Setup.DeselectAllCasesAndCombos()
ret = sap_model.Results.Setup.SetCaseSelectedForOutput(load_case)
ret = sap_model.Results.FrameForce(frame_names, results, number_results, object_names, load_factors, step_types, step_numbers)
# 检查结果提取是否成功
if ret == 0:
print(“分析结果提取成功”)
for i in range(number_results[0]):
print(f”框架: {object_names[i]}, 荷载工况: {load_case}, 荷载因子: {load_factors[i]}, 步类型: {step_types[i]}, 步数: {step_numbers[i]}, 结果: {results[i]}”)
else:
print(“分析结果提取失败”)
# 关闭SAP2000实例
ret = sap_model.File.CloseFile()
sap_obj.ApplicationExit()
print(“SAP2000实例已关闭”)
4.1.3 VBA示例
Sub RunLinearStaticAnalysis()
‘ 创建SAPObject对象
Dim SapObject As Object
Set SapObject = CreateObject(“SAP2000.API.SapObject”)
‘ 初始化SAP2000实例
Dim ret As Integer
ret = SapObject.ApplicationStart(“CSI.SAP2000.API”, 20, 5, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
‘ 获取SAPModel对象
SapObject.ObjectUsing = 1
Dim SapModel As Object
Set SapModel = SapObject.SapModel
‘ 打开现有模型文件
Dim modelName As String
modelName = “C:\Path\To\Your\Model.sdb”
ret = SapModel.File.OpenFile(modelName)
‘ 检查模型是否打开成功
If ret = 0 Then
Debug.Print “模型文件打开成功”
Else
Debug.Print “模型文件打开失败”
Exit Sub
End If
‘ 运行线性静力分析
Dim loadCase As String
loadCase = “Dead”
ret = SapModel.Analyze.RunCase(loadCase)
‘ 检查分析是否成功
If ret = 0 Then
Debug.Print “线性静力分析成功”
Else
Debug.Print “线性静力分析失败”
Exit Sub
End If
‘ 提取分析结果
Dim frameNames(1 To 2) As String
Dim results(1 To 6) As Double
Dim numberResults As Integer
Dim objectNames(1 To 1) As String
Dim loadFactors(1 To 1) As Double
Dim stepTypes(1 To 1) As Integer
Dim stepNumbers(1 To 1) As Double
frameNames(1) = “Frame1”
frameNames(2) = “Frame2”
ret = SapModel.Results.Setup.DeselectAllCasesAndCombos
ret = SapModel.Results.Setup.SetCaseSelectedForOutput(loadCase)
ret = SapModel.Results.FrameForce(frameNames, results, numberResults, objectNames, loadFactors, stepTypes, stepNumbers)
‘ 检查结果提取是否成功
If ret = 0 Then
Debug.Print “分析结果提取成功”
For i = 1 To numberResults
Debug.Print “框架: ” & objectNames(i) & “, 荷载工况: ” & loadCase & “, 荷载因子: ” & loadFactors(i) & “, 步类型: ” & stepTypes(i) & “, 步数: ” & stepNumbers(i) & “, 结果: ” & results(i)
Next i
Else
Debug.Print “分析结果提取失败”
End If
‘ 关闭SAP2000实例
ret = SapModel.File.CloseFile
SapObject.ApplicationExit
Debug.Print “SAP2000实例已关闭”
End Sub
5. 导出和导入数据
5.1 导出分析结果
SAP2000 API允许您将分析结果导出到文件或数据库中,以便于进一步处理和分析。以下是一个C#示例,展示如何将分析结果导出到CSV文件中。
5.1.1 C#示例
using System;
using System.IO;
using SAP2000v1;
class Program
{
static void Main(string[] args)
{
// 创建SAPObject对象
cSapModel objSapModel = null;
SAP2000i1.SapObject objSapObject = null;
// 初始化SAP2000实例
int ret = 0;
string sApp = “CSI.SAP2000.API”;
objSapObject = new SAP2000i1.SapObject();
ret = objSapObject.ApplicationStart(sApp, 20, 5, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
// 获取SAPModel对象
objSapObject.ObjectUsing = 1;
ret = objSapObject.SapModel(out objSapModel);
// 打开现有模型文件
string modelName = @”C:\Path\To\Your\Model.sdb”;
ret = objSapModel.File.OpenFile(modelName);
// 检查模型是否打开成功
if (ret == 0)
{
Console.WriteLine(“模型文件打开成功”);
}
else
{
Console.WriteLine(“模型文件打开失败”);
return;
}
// 运行线性静力分析
string loadCase = “Dead”;
ret = objSapModel.Analyze.RunCase(loadCase);
// 检查分析是否成功
if (ret == 0)
{
Console.WriteLine(“线性静力分析成功”);
}
else
{
Console.WriteLine(“线性静力分析失败”);
return;
}
// 提取分析结果
string[] frameNames = new string[] { “Frame1”, “Frame2” };
double[] results = new double[6];
int[] numberResults = new int[1];
string[] objectNames = new string[1];
double[] loadFactors = new double[1];
int[] stepTypes = new int[1];
double[] stepNumbers = new double[1];
ret = objSapModel.Results.Setup.DeselectAllCasesAndCombos();
ret = objSapModel.Results.Setup.SetCaseSelectedForOutput(loadCase);
ret = objSapModel.Results.FrameForce(frameNames, results, numberResults, objectNames, loadFactors, stepTypes, stepNumbers);
// 检查结果提取是否成功
if (ret == 0)
{
Console.WriteLine(“分析结果提取成功”);
// 将结果导出到CSV文件
string exportPath = @”C:\Path\To\Your\Results.csv”;
using (StreamWriter sw = new StreamWriter(exportPath))
{
sw.WriteLine(“框架,荷载工况,荷载因子,步类型,步数,结果”);
for (int i = 0; i < numberResults[0]; i++)
{
sw.WriteLine($”{objectNames[i]},{loadCase},{loadFactors[i]},{stepTypes[i]},{stepNumbers[i]},{results[i]}”);
}
}
Console.WriteLine(“结果已导出到CSV文件”);
}
else
{
Console.WriteLine(“分析结果提取失败”);
}
// 关闭SAP2000实例
ret = objSapModel.File.CloseFile();
objSapObject.ApplicationExit();
objSapObject = null;
objSapModel = null;
Console.WriteLine(“SAP2000实例已关闭”);
}
}
5.1.2 Python示例
import win32com.client
import csv
# 创建SAPObject对象
sap_obj = win32com.client.Dispatch(“SAP2000.API.SapObject”)
# 初始化SAP2000实例
ret = sap_obj.ApplicationStart(“CSI.SAP2000.API”, 20, 5, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
# 获取SAPModel对象
sap_obj.ObjectUsing = 1
sap_model = sap_obj.SapModel
# 打开现有模型文件
model_name = r”C:\Path\To\Your\Model.sdb”
ret = sap_model.File.OpenFile(model_name)
# 检查模型是否打开成功
if ret == 0:
print(“模型文件打开成功”)
else:
print(“模型文件打开失败”)
exit()
# 运行线性静力分析
load_case = “Dead”
ret = sap_model.Analyze.RunCase(load_case)
# 检查分析是否成功
if ret == 0:
print(“线性静力分析成功”)
else:
print(“线性静力分析失败”)
exit()
# 提取分析结果
frame_names = [“Frame1”, “Frame2”]
results = [0.0] * 6
number_results = [0]
object_names = [“”]
load_factors = [0.0]
step_types = [0]
step_numbers = [0.0]
ret = sap_model.Results.Setup.DeselectAllCasesAndCombos()
ret = sap_model.Results.Setup.SetCaseSelectedForOutput(load_case)
ret = sap_model.Results.FrameForce(frame_names, results, number_results, object_names, load_factors, step_types, step_numbers)
# 检查结果提取是否成功
if ret == 0:
print(“分析结果提取成功”)
# 将结果导出到CSV文件
export_path = r”C:\Path\To\Your\Results.csv”
with open(export_path, ‘w’, newline=”) as csvfile:
csvwriter = csv.writer(csvfile)
csvwriter.writerow([“框架”, “荷载工况”, “荷载因子”, “步类型”, “步数”, “结果”])
for i in range(number_results[0]):
csvwriter.writerow([object_names[i], load_case, load_factors[i], step_types[i], step_numbers[i], results[i]])
print(“结果已导出到CSV文件”)
else:
print(“分析结果提取失败”)
# 关闭SAP2000实例
ret = sap_model.File.CloseFile()
sap_obj.ApplicationExit()
print(“SAP2000实例已关闭”)
5.1.3 VBA示例
“`vba
Sub ExportAnalysisResults()
‘ 创建SAPObject对象
Dim SapObject As Object
Set SapObject = CreateObject(“SAP2000.API.SapObject”)
‘ 初始化SAP2000实例
Dim ret As Integer
ret = SapObject.ApplicationStart(“CSI.SAP2000.API”, 20, 5, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
‘ 获取SAPModel对象
SapObject.ObjectUsing = 1
Dim SapModel As Object
Set SapModel = SapObject.SapModel
‘ 打开现有模型文件
Dim modelName As String
modelName = “C:\Path\To\Your\Model.sdb”
ret = SapModel.File.OpenFile(modelName)
‘ 检查模型是否打开成功
If ret = 0 Then
Debug.Print “模型文件打开成功”
Else
Debug.Print “模型文件打开失败”
Exit Sub
End If
‘ 运行线性静力分析
Dim loadCase As String
loadCase = “Dead”
ret = SapModel.Analyze.RunCase(loadCase)
‘ 检查分析是否成功
If ret = 0 Then
Debug.Print “线性静力分析成功”
Else
Debug.Print “线性静力分析失败”
Exit Sub
End If
‘ 提取分析结果
Dim frameNames(1 To 2) As String
Dim results(1 To 6) As Double
Dim numberResults As Integer
Dim objectNames(1 To 1) As String
Dim loadFactors(1 To 1) As Double
Dim stepTypes(1 To 1) As Integer
Dim stepNumbers(1 To 1) As Double
frameNames(1) = “Frame1”
frameNames(2) = “Frame2”
ret = SapModel.Results.Setup.DeselectAllCasesAndCombos
ret = SapModel.Results.Setup.Set




评论0