How can I learn Sap2000 OAPI in Matlab? Is there anybody who have a orginal documentation?

52 views (last 30 days)
Osman TUNCA
Osman TUNCA on 25 Jun 2015
Answered: Tan Nguyen on 16 Oct 2020
I can not find any orginal documentation about Sap2000 oapi codes.

Answers (1)

Tan Nguyen
Tan Nguyen on 16 Oct 2020
I am workin on this file officially written in Csi OAPI Documentation. It is a nice introduction.
It is really difficult to find more. PLease let me know as you know anything else.
Thank you,
Example 6 (MATLAB)
Remarks
This example is written for MATLAB R2015a. It is based on the Sap2000 verification problem Example 1-001.
This example creates the example verification problem from scratch, runs the analysis, extracts results, and compares the results with hand calculated values.
Example
  1. You will need to have MATLAB installed on your computer. MATLAB is a product of MathWorks and can be purchased at www.mathworks.com. Free trials are also available.
  2. Create a MATLAB .m file and paste in the following code:
%% clean-up the workspace & command window
clear;
clc;
%%set the following flag to true to attach to an existing instance of the program otherwise a new instance of the program will be started
AttachToInstance = false(); % true(); %
%% set the following flag to true to manually specify the path to SAP2000.exe
%% this allows for a connection to a version of SAP2000 other than the latest installation
%% otherwise the latest installed version of SAP2000 will be launched
SpecifyPath = false(); % true(); %
%% if the above flag is set to true, specify the path to SAP2000 below
ProgramPath = 'C:\Program Files\Computers and Structures\SAP2000 21\SAP2000.exe';
%% full path to API dll
%% set it to the installation folder
APIDLLPath = 'C:\Program Files\Computers and Structures\SAP2000 21\SAP2000v1.dll';
%% full path to the model
%% set it to the desired path of your model
ModelDirectory = 'C:\CSiAPIexample';
if ~exist(ModelDirectory, 'dir')
mkdir(ModelDirectory);
end
ModelName = 'API_1-001.sdb';
ModelPath = strcat(ModelDirectory, filesep, ModelName);
%% create API helper object
a = NET.addAssembly(APIDLLPath);
helper = SAP2000v1.Helper;
helper = NET.explicitCast(helper,'SAP2000v1.cHelper');
if AttachToInstance
%% attach to a running instance of Sap2000
SapObject = helper.GetObject('CSI.SAP2000.API.SapObject');
SapObject = NET.explicitCast(SapObject,'SAP2000v1.cOAPI');
else
if SpecifyPath
%% create an instance of the SapObject from the specified path
SapObject = helper.CreateObject(ProgramPath);
else
%% create an instance of the SapObject from the latest installed SAP2000
SapObject = helper.CreateObjectProgID('CSI.SAP2000.API.SapObject');
end
SapObject = NET.explicitCast(SapObject,'SAP2000v1.cOAPI');
%% start Sap2000 application
SapObject.ApplicationStart;
end
helper = 0;
%% create SapModel object
SapModel = NET.explicitCast(SapObject.SapModel,'SAP2000v1.cSapModel');
%% initialize model
ret = SapModel.InitializeNewModel;
%% create new blank model
File = NET.explicitCast(SapModel.File,'SAP2000v1.cFile');
ret = File.NewBlank;
%% define material property
PropMaterial = NET.explicitCast(SapModel.PropMaterial,'SAP2000v1.cPropMaterial');
ret = PropMaterial.SetMaterial('CONC', SAP2000v1.eMatType.Concrete);
%% assign isotropic mechanical properties to material
ret = PropMaterial.SetMPIsotropic('CONC', 3600, 0.2, 0.0000055);
%% define rectangular frame section property
PropFrame = NET.explicitCast(SapModel.PropFrame,'SAP2000v1.cPropFrame');
ret = PropFrame.SetRectangle('R1', 'CONC', 12, 12);
%% define frame section property modifiers
ModValue = NET.createArray('System.Double',8);
for i = 1 : 8
ModValue(i) = 1;
end
ModValue(1) = 1000;
ModValue(2) = 0;
ModValue(3) = 0;
ret = PropFrame.SetModifiers('R1', ModValue);
%% switch to k-ft units
ret = SapModel.SetPresentUnits(SAP2000v1.eUnits.kip_ft_F);
%% add frame object by coordinates
FrameObj = NET.explicitCast(SapModel.FrameObj,'SAP2000v1.cFrameObj');
FrameName1 = System.String(' ');
FrameName2 = System.String(' ');
FrameName3 = System.String(' ');
[ret, FrameName1] = FrameObj.AddByCoord(0, 0, 0, 0, 0, 10, FrameName1, 'R1', '1', 'Global');
[ret, FrameName2] = FrameObj.AddByCoord(0, 0, 10, 8, 0, 16, FrameName2, 'R1', '2', 'Global');
[ret, FrameName3] = FrameObj.AddByCoord(-4, 0, 10, 0, 0, 10, FrameName3, 'R1', '3', 'Global');
%% assign point object restraint at base
PointObj = NET.explicitCast(SapModel.PointObj,'SAP2000v1.cPointObj');
PointName1 = System.String(' ');
PointName2 = System.String(' ');
Restraint = NET.createArray('System.Boolean',6);
for i = 1 : 4
Restraint(i) = true();
end
for i = 5 : 6
Restraint(i) = false();
end
[ret, PointName1, PointName2] = FrameObj.GetPoints(FrameName1, PointName1, PointName2);
ret = PointObj.SetRestraint(PointName1, Restraint);
%% assign point object restraint at top
for i = 1 : 2
Restraint(i) = true();
end
for i = 3 : 6
Restraint(i) = false();
end
[ret, PointName1, PointName2] = FrameObj.GetPoints(FrameName2, PointName1, PointName2);
ret = PointObj.SetRestraint(PointName2, Restraint);
%% refresh view, update (initialize) zoom
View = NET.explicitCast(SapModel.View,'SAP2000v1.cView');
ret = View.RefreshView(0, false());
%% add load patterns
LoadPatterns = NET.explicitCast(SapModel.LoadPatterns,'SAP2000v1.cLoadPatterns');
ret = LoadPatterns.Add('1', SAP2000v1.eLoadPatternType.Other, 1, true());
ret = LoadPatterns.Add('2', SAP2000v1.eLoadPatternType.Other, 0, true());
ret = LoadPatterns.Add('3', SAP2000v1.eLoadPatternType.Other, 0, true());
ret = LoadPatterns.Add('4', SAP2000v1.eLoadPatternType.Other, 0, true());
ret = LoadPatterns.Add('5', SAP2000v1.eLoadPatternType.Other, 0, true());
ret = LoadPatterns.Add('6', SAP2000v1.eLoadPatternType.Other, 0, true());
ret = LoadPatterns.Add('7', SAP2000v1.eLoadPatternType.Other, 0, true());
%% assign loading for load pattern 2
[ret, PointName1, PointName2] = FrameObj.GetPoints(FrameName3, PointName1, PointName2);
PointLoadValue = NET.createArray('System.Double',6);
for i = 1 : 6
PointLoadValue(i) = 0.0;
end
PointLoadValue(3) = -10;
ret = PointObj.SetLoadForce(PointName1, '2', PointLoadValue);
ret = FrameObj.SetLoadDistributed(FrameName3, '2', 1, 10, 0, 1, 1.8, 1.8);
%% assign loading for load pattern 3
[ret, PointName1, PointName2] = FrameObj.GetPoints(FrameName3, PointName1, PointName2);
for i = 1 : 6
PointLoadValue(i) = 0.0;
end
PointLoadValue(3) = -17.2;
PointLoadValue(5) = -54.4;
ret = PointObj.SetLoadForce(PointName2, '3', PointLoadValue);
%% assign loading for load pattern 4
ret = FrameObj.SetLoadDistributed(FrameName2, '4', 1, 11, 0, 1, 2, 2);
%% assign loading for load pattern 5
ret = FrameObj.SetLoadDistributed(FrameName1, '5', 1, 2, 0, 1, 2, 2, 'Local');
ret = FrameObj.SetLoadDistributed(FrameName2, '5', 1, 2, 0, 1, -2, -2, 'Local');
%% assign loading for load pattern 6
ret = FrameObj.SetLoadDistributed(FrameName1, '6', 1, 2, 0, 1, 0.9984, 0.3744, 'Local');
ret = FrameObj.SetLoadDistributed(FrameName2, '6', 1, 2, 0, 1, -0.3744, 0, 'Local');
%% assign loading for load pattern 7
ret = FrameObj.SetLoadPoint(FrameName2, '7', 1, 2, 0.5, -15, 'Local');
%% switch to k-in units
ret = SapModel.SetPresentUnits(SAP2000v1.eUnits.kip_in_F);
%% save model
ret = File.Save(ModelPath);
%% run model (this will create the analysis model)
Analyze = NET.explicitCast(SapModel.Analyze,'SAP2000v1.cAnalyze');
ret = Analyze.RunAnalysis();
%% initialize for Sap2000 results
SapResult = zeros(7,1,'double');
[ret, PointName1, PointName2] = FrameObj.GetPoints(FrameName2, PointName1, PointName2);
%% get Sap2000 results for load cases 1 through 7
AnalysisResults = NET.explicitCast(SapModel.Results,'SAP2000v1.cAnalysisResults');
AnalysisResultsSetup = NET.explicitCast(AnalysisResults.Setup,'SAP2000v1.cAnalysisResultsSetup');
for i = 1 : 7
NumberResults = 0;
Obj = NET.createArray('System.String',2);
Elm = NET.createArray('System.String',2);
ACase = NET.createArray('System.String',2);
StepType = NET.createArray('System.String',2);
StepNum = NET.createArray('System.Double',2);
U1 = NET.createArray('System.Double',2);
U2 = NET.createArray('System.Double',2);
U3 = NET.createArray('System.Double',2);
R1 = NET.createArray('System.Double',2);
R2 = NET.createArray('System.Double',2);
R3 = NET.createArray('System.Double',2);
ret = AnalysisResultsSetup.DeselectAllCasesAndCombosForOutput;
ret = AnalysisResultsSetup.SetCaseSelectedForOutput(int2str(i));
if i <= 4
[ret, NumberResults, Obj, Elm, ACase, StepType, StepNum, U1, U2, U3, R1, R2, R3] = AnalysisResults.JointDispl(PointName2, SAP2000v1.eItemTypeElm.ObjectElm, NumberResults, Obj, Elm, ACase, StepType, StepNum, U1, U2, U3, R1, R2, R3);
SapResult(i) = U3(1);
else
[ret, NumberResults, Obj, Elm, ACase, StepType, StepNum, U1, U2, U3, R1, R2, R3] = AnalysisResults.JointDispl(PointName1, SAP2000v1.eItemTypeElm.ObjectElm, NumberResults, Obj, Elm, ACase, StepType, StepNum, U1, U2, U3, R1, R2, R3);
SapResult(i) = U1(1);
end
end
%% close Sap2000
ret = SapObject.ApplicationExit(false());
File = 0;
PropMaterial = 0;
PropFrame = 0;
FrameObj = 0;
PointObj = 0;
View = 0;
LoadPatterns = 0;
Analyze = 0;
AnalysisResults = 0;
AnalysisResultsSetup = 0;
SapModel = 0;
SapObject = 0;
%% fill independent results
IndResult = zeros(7,1,'double');
IndResult(1) = -0.02639;
IndResult(2) = 0.06296;
IndResult(3) = 0.06296;
IndResult(4) = -0.2963;
IndResult(5) = 0.3125;
IndResult(6) = 0.11556;
IndResult(7) = 0.00651;
%% fill percent difference
PercentDiff = zeros(7,1,'double');
for i = 1 : 7
PercentDiff(i) = (SapResult(i) / IndResult(i)) - 1;
end
%% display results
SapResult
IndResult
PercentDiff
Release Notes
Initial release in version 15.0.1
Example 6 (MATLAB) has been updated to take advantage of MATLAB’s .NET interface. MATLAB users who were experiencing intermittent crashes when trying to retrieve analysis results through the API should update their client applications using the new example code as a template.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by