Sei sulla pagina 1di 40

Example 1 (VBA) Page 1 of 40

Example 1
Remarks
This example is written for Visual Basic for Applications (VBA). It can be run from a program such as
Microsoft Excel. 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
Sub VerificationExample1001()
'dimension variables
Dim SapObject As SAP2000.SapObject
Dim SapModel As cSapModel
Dim ret As Long
Dim i As Long
Dim ModValue() As Double
Dim PointLoadValue() As Double
Dim Restraint() As Boolean
Dim FrameName() As String
Dim PointName() As String
Dim NumberResults As Long
Dim Obj() As String
Dim Elm() As String
Dim LoadCase() As String
Dim StepType() As String
Dim StepNum() As Double
Dim U1() As Double
Dim U2() As Double
Dim U3() As Double
Dim R1() As Double
Dim R2() As Double
Dim R3() As Double
Dim SapResult() As Double
Dim IndResult() As Double
Dim PercentDiff() As Double
Dim SapResultString() As String
Dim IndResultString() As String
Dim PercentDiffString() As String
Dim msg As String

'create Sap2000 object


Set SapObject = New SAP2000.SapObject

'start Sap2000 application


SapObject.ApplicationStart

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 2 of 40

'create SapModel object


Set SapModel = SapObject.SapModel

'initialize model
ret = SapModel.InitializeNewModel

'create new blank model


ret = SapModel.File.NewBlank

'define material property


ret = SapModel.PropMaterial.SetMaterial("CONC", MATERIAL_CONCRETE)

'assign isotropic mechanical properties to material


ret = SapModel.PropMaterial.SetMPIsotropic("CONC", 3600, 0.2, 0.0000055)

'define rectangular frame section property


ret = SapModel.PropFrame.SetRectangle("R1", "CONC", 12, 12)

'define frame section property modifiers


ReDim ModValue(7)
For i = 0 To 7
ModValue(i) = 1
Next i
ModValue(0) = 1000
ModValue(1) = 0
ModValue(2) = 0
ret = SapModel.PropFrame.SetModifiers("R1", ModValue)

'switch to k-ft units


ret = SapModel.SetPresentUnits(kip_ft_F)

'add frame object by coordinates


ReDim FrameName(2)
ret = SapModel.FrameObj.AddByCoord(0, 0, 0, 0, 0, 10, FrameName(0), "R1", "1")
ret = SapModel.FrameObj.AddByCoord(0, 0, 10, 8, 0, 16, FrameName(1), "R1", "2")
ret = SapModel.FrameObj.AddByCoord(-4, 0, 10, 0, 0, 10, FrameName(2), "R1", "3")

'assign point object restraint at base


ReDim PointName(1)
ReDim Restraint(5)
For i = 0 To 3
Restraint(i) = True
Next i
For i = 4 To 5
Restraint(i) = False
Next i
ret = SapModel.FrameObj.GetPoints(FrameName(0), PointName(0), PointName(1))
ret = SapModel.PointObj.SetRestraint(PointName(0), Restraint)

'assign point object restraint at top


For i = 0 To 1

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 3 of 40

Restraint(i) = True
Next i
For i = 2 To 5
Restraint(i) = False
Next i
ret = SapModel.FrameObj.GetPoints(FrameName(1), PointName(0), PointName(1))
ret = SapModel.PointObj.SetRestraint(PointName(1), Restraint)

'refresh view, update (initialize) zoom


ret = SapModel.View.RefreshView(0, False)

'add load patterns


ret = SapModel.LoadPatterns.Add("1", LTYPE_OTHER, 1)
ret = SapModel.LoadPatterns.Add("2", LTYPE_OTHER)
ret = SapModel.LoadPatterns.Add("3", LTYPE_OTHER)
ret = SapModel.LoadPatterns.Add("4", LTYPE_OTHER)
ret = SapModel.LoadPatterns.Add("5", LTYPE_OTHER)
ret = SapModel.LoadPatterns.Add("6", LTYPE_OTHER)
ret = SapModel.LoadPatterns.Add("7", LTYPE_OTHER)

'assign loading for load pattern 2


ret = SapModel.FrameObj.GetPoints(FrameName(2), PointName(0), PointName(1))
ReDim PointLoadValue(5)
PointLoadValue(2) = -10
ret = SapModel.PointObj.SetLoadForce(PointName(0), "2", PointLoadValue)
ret = SapModel.FrameObj.SetLoadDistributed(FrameName(2), "2", 1, 10, 0, 1, 1.8, 1.8)

'assign loading for load pattern 3


ret = SapModel.FrameObj.GetPoints(FrameName(2), PointName(0), PointName(1))
ReDim PointLoadValue(5)
PointLoadValue(2) = -17.2
PointLoadValue(4) = -54.4
ret = SapModel.PointObj.SetLoadForce(PointName(1), "3", PointLoadValue)

'assign loading for load pattern 4


ret = SapModel.FrameObj.SetLoadDistributed(FrameName(1), "4", 1, 11, 0, 1, 2, 2)

'assign loading for load pattern 5


ret = SapModel.FrameObj.SetLoadDistributed(FrameName(0), "5", 1, 2, 0, 1, 2, 2, "Local")
ret = SapModel.FrameObj.SetLoadDistributed(FrameName(1), "5", 1, 2, 0, 1, -2, -2, "Local")

'assign loading for load pattern 6


ret = SapModel.FrameObj.SetLoadDistributed(FrameName(0), "6", 1, 2, 0, 1, 0.9984, 0.3744,
"Local")
ret = SapModel.FrameObj.SetLoadDistributed(FrameName(1), "6", 1, 2, 0, 1, -0.3744, 0, "Local")

'assign loading for load pattern 7


ret = SapModel.FrameObj.SetLoadPoint(FrameName(1), "7", 1, 2, 0.5, -15, "Local")

'switch to k-in units


ret = SapModel.SetPresentUnits(kip_in_F)

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 4 of 40

'save model
ret = SapModel.File.Save("C:\SapAPI\API_1-001.sdb")

'run model (this will create the analysis model)


ret = SapModel.Analyze.RunAnalysis

'initialize for Sap2000 results


ReDim SapResult(6)
ret = SapModel.FrameObj.GetPoints(FrameName(1), PointName(0), PointName(1))

'get Sap2000 results for load patterns 1 through 7


For i = 0 To 6
ret = SapModel.Results.Setup.DeselectAllCasesAndCombosForOutput
ret = SapModel.Results.Setup.SetCaseSelectedForOutput(Format(i + 1))
If i <= 3 Then
ret = SapModel.Results.JointDispl(PointName(1), ObjectElm, NumberResults, Obj, Elm,
LoadCase, StepType, StepNum, U1, U2, U3, R1, R2, R3)
SapResult(i) = U3(0)
Else
ret = SapModel.Results.JointDispl(PointName(0), ObjectElm, NumberResults, Obj, Elm,
LoadCase, StepType, StepNum, U1, U2, U3, R1, R2, R3)
SapResult(i) = U1(0)
End If
Next i

'close Sap2000
SapObject.ApplicationExit False
Set SapModel = Nothing
Set SapObject = Nothing

'fill Sap2000 result strings


ReDim SapResultString(6)
For i = 0 To 6
SapResultString(i) = Format(SapResult(i), "0.00000")
If Left(SapResultString(i), 1) <> "-" Then
SapResultString(i) = " " & SapResultString(i)
End If
Next i

'fill independent results (hand calculated)


ReDim IndResult(6)
ReDim IndResultString(6)
IndResult(0) = -0.02639
IndResult(1) = 0.06296
IndResult(2) = 0.06296
IndResult(3) = -0.2963
IndResult(4) = 0.3125
IndResult(5) = 0.11556
IndResult(6) = 0.00651
For i = 0 To 6

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 5 of 40

IndResultString(i) = Format(IndResult(i), "0.00000")


If Left(IndResultString(i), 1) <> "-" Then
IndResultString(i) = " " & IndResultString(i)
End If
Next i

'fill percent difference


ReDim PercentDiff(6)
ReDim PercentDiffString(6)
For i = 0 To 6
PercentDiff(i) = (SapResult(i) / IndResult(i)) - 1
PercentDiffString(i) = Format(PercentDiff(i), "0%")
If Left(PercentDiffString(i), 1) <> "-" Then
PercentDiffString(i) = " " & PercentDiffString(i)
End If
Next i

'display message box comparing results


msg = ""
msg = msg & "LC Sap2000 Independent %Diff" & vbCr & vbLf
For i = 0 To 5
msg = msg & Format(i + 1) & " " & SapResultString(i) & " " & IndResultString(i) & " " &
PercentDiffString(i) & vbCr & vbLf
Next i
msg = msg & Format(i + 1) & " " & SapResultString(i) & " " & IndResultString(i) & " " &
PercentDiffString(i)
MsgBox msg
End Sub

Release Notes
Initial release in version 11.03.

Changed nomenclature from Load Cases, Analysis Cases and Response Combinations to Load Patterns,
Load Cases and Load Combinations, respectively, in version 12.00.

Example 2 (Visual Basic 2005)


Remarks
This example is written for Visual Basic 2005. 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

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 6 of 40

1. Create a new Visual Basic 2005 project.

2. Add a reference (COM) in the project to the Sap2000.exe.

3. Add a new button to a form in the project.

4. Double click on the new button to bring up the Click procedure for the button and paste in the
following code.

'dimension variables
Dim SapObject As SAP2000.SapObject
Dim SapModel As SAP2000.cSapModel
Dim ret As Long
Dim i As Long
Dim ModValue() As Double
Dim PointLoadValue() As Double
Dim Restraint() As Boolean
Dim FrameName() As String
Dim PointName() As String
Dim NumberResults As Long
Dim Obj() As String
Dim Elm() As String
Dim LoadCase() As String
Dim StepType() As String
Dim StepNum() As Double
Dim U1() As Double
Dim U2() As Double
Dim U3() As Double
Dim R1() As Double
Dim R2() As Double
Dim R3() As Double
Dim SapResult() As Double
Dim IndResult() As Double
Dim PercentDiff() As Double
Dim SapResultString() As String
Dim IndResultString() As String
Dim PercentDiffString() As String
Dim msg As String

'create Sap2000 object


SapObject = New SAP2000.SapObject

'start Sap2000 application


SapObject.ApplicationStart()

'create SapModel object


SapModel = SapObject.SapModel

'initialize model
ret = SapModel.InitializeNewModel

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 7 of 40

'create new blank model


ret = SapModel.File.NewBlank

'define material property


ret = SapModel.PropMaterial.SetMaterial("CONC", SAP2000.eMatType.MATERIAL_CONCRETE)

'assign isotropic mechanical properties to material


ret = SapModel.PropMaterial.SetMPIsotropic("CONC", 3600, 0.2, 0.0000055)

'define rectangular frame section property


ret = SapModel.PropFrame.SetRectangle("R1", "CONC", 12, 12)

'define frame section property modifiers


ReDim ModValue(7)
For i = 0 To 7
ModValue(i) = 1
Next i
ModValue(0) = 1000
ModValue(1) = 0
ModValue(2) = 0
ret = SapModel.PropFrame.SetModifiers("R1", ModValue)

'switch to k-ft units


ret = SapModel.SetPresentUnits(SAP2000.eUnits.kip_ft_F)

'add frame object by coordinates


ReDim FrameName(2)
ret = SapModel.FrameObj.AddByCoord(0, 0, 0, 0, 0, 10, FrameName(0), "R1", "1")
ret = SapModel.FrameObj.AddByCoord(0, 0, 10, 8, 0, 16, FrameName(1), "R1", "2")
ret = SapModel.FrameObj.AddByCoord(-4, 0, 10, 0, 0, 10, FrameName(2), "R1", "3")

'assign point object restraint at base


ReDim PointName(1)
ReDim Restraint(5)
For i = 0 To 3
Restraint(i) = True
Next i
For i = 4 To 5
Restraint(i) = False
Next i
ret = SapModel.FrameObj.GetPoints(FrameName(0), PointName(0), PointName(1))
ret = SapModel.PointObj.SetRestraint(PointName(0), Restraint)

'assign point object restraint at top


For i = 0 To 1
Restraint(i) = True
Next i
For i = 2 To 5
Restraint(i) = False
Next i
ret = SapModel.FrameObj.GetPoints(FrameName(1), PointName(0), PointName(1))

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 8 of 40

ret = SapModel.PointObj.SetRestraint(PointName(1), Restraint)

'refresh view, update (initialize) zoom


ret = SapModel.View.RefreshView(0, False)

'add load patterns


ret = SapModel.LoadPatterns.Add("1", SAP2000.eLoadPatternType.LTYPE_OTHER, 1)
ret = SapModel.LoadPatterns.Add("2", SAP2000.eLoadPatternType.LTYPE_OTHER)
ret = SapModel.LoadPatterns.Add("3", SAP2000.eLoadPatternType.LTYPE_OTHER)
ret = SapModel.LoadPatterns.Add("4", SAP2000.eLoadPatternType.LTYPE_OTHER)
ret = SapModel.LoadPatterns.Add("5", SAP2000.eLoadPatternType.LTYPE_OTHER)
ret = SapModel.LoadPatterns.Add("6", SAP2000.eLoadPatternType.LTYPE_OTHER)
ret = SapModel.LoadPatterns.Add("7", SAP2000.eLoadPatternType.LTYPE_OTHER)

'assign loading for load pattern 2


ret = SapModel.FrameObj.GetPoints(FrameName(2), PointName(0), PointName(1))
ReDim PointLoadValue(5)
PointLoadValue(2) = -10
ret = SapModel.PointObj.SetLoadForce(PointName(0), "2", PointLoadValue)
ret = SapModel.FrameObj.SetLoadDistributed(FrameName(2), "2", 1, 10, 0, 1, 1.8, 1.8)

'assign loading for load pattern 3


ret = SapModel.FrameObj.GetPoints(FrameName(2), PointName(0), PointName(1))
ReDim PointLoadValue(5)
PointLoadValue(2) = -17.2
PointLoadValue(4) = -54.4
ret = SapModel.PointObj.SetLoadForce(PointName(1), "3", PointLoadValue)

'assign loading for load pattern 4


ret = SapModel.FrameObj.SetLoadDistributed(FrameName(1), "4", 1, 11, 0, 1, 2, 2)

'assign loading for load pattern 5


ret = SapModel.FrameObj.SetLoadDistributed(FrameName(0), "5", 1, 2, 0, 1, 2, 2, "Local")
ret = SapModel.FrameObj.SetLoadDistributed(FrameName(1), "5", 1, 2, 0, 1, -2, -2, "Local")

'assign loading for load pattern 6


ret = SapModel.FrameObj.SetLoadDistributed(FrameName(0), "6", 1, 2, 0, 1, 0.9984, 0.3744,
"Local")
ret = SapModel.FrameObj.SetLoadDistributed(FrameName(1), "6", 1, 2, 0, 1, -0.3744, 0, "Local")

'assign loading for load pattern 7


ret = SapModel.FrameObj.SetLoadPoint(FrameName(1), "7", 1, 2, 0.5, -15, "Local")

'switch to k-in units


ret = SapModel.SetPresentUnits(SAP2000.eUnits.kip_in_F)

'save model
ret = SapModel.File.Save("C:\SapAPI\API_1-001.sdb")

'run model (this will create the analysis model)


ret = SapModel.Analyze.RunAnalysis

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 9 of 40

'initialize for Sap2000 results


ReDim SapResult(6)
ret = SapModel.FrameObj.GetPoints(FrameName(1), PointName(0), PointName(1))

'get Sap2000 results for load patterns 1 through 7


ReDim Obj(0)
ReDim Elm(0)
ReDim LoadCase(0)
ReDim StepType(0)
ReDim StepNum(0)
ReDim U1(0)
ReDim U2(0)
ReDim U3(0)
ReDim R1(0)
ReDim R2(0)
ReDim R3(0)
For i = 0 To 6
ret = SapModel.Results.Setup.DeselectAllCasesAndCombosForOutput
ret = SapModel.Results.Setup.SetCaseSelectedForOutput(Format(i + 1))
If i <= 3 Then
ret = SapModel.Results.JointDispl(PointName(1), SAP2000.eItemTypeElm.ObjectElm,
NumberResults, Obj, Elm, LoadCase, StepType, StepNum, U1, U2, U3, R1, R2, R3)
SapResult(i) = U3(0)
Else
ret = SapModel.Results.JointDispl(PointName(0), SAP2000.eItemTypeElm.ObjectElm,
NumberResults, Obj, Elm, LoadCase, StepType, StepNum, U1, U2, U3, R1, R2, R3)
SapResult(i) = U1(0)
End If
Next i

'close Sap2000
SapObject.ApplicationExit(False)
SapModel = Nothing
SapObject = Nothing

'fill Sap2000 result strings


ReDim SapResultString(6)
For i = 0 To 6
SapResultString(i) = Format(SapResult(i), "0.00000")
If Microsoft.VisualBasic.Left(SapResultString(i), 1) <> "-" Then
SapResultString(i) = " " & SapResultString(i)
End If
Next i

'fill independent results (hand calculated)


ReDim IndResult(6)
ReDim IndResultString(6)
IndResult(0) = -0.02639
IndResult(1) = 0.06296
IndResult(2) = 0.06296

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 10 of 40

IndResult(3) = -0.2963
IndResult(4) = 0.3125
IndResult(5) = 0.11556
IndResult(6) = 0.00651
For i = 0 To 6
IndResultString(i) = Format(IndResult(i), "0.00000")
If Microsoft.VisualBasic.Left(IndResultString(i), 1) <> "-" Then
IndResultString(i) = " " & IndResultString(i)
End If
Next i

'fill percent difference


ReDim PercentDiff(6)
ReDim PercentDiffString(6)
For i = 0 To 6
PercentDiff(i) = (SapResult(i) / IndResult(i)) - 1
PercentDiffString(i) = Format(PercentDiff(i), "0%")
If Microsoft.VisualBasic.Left(PercentDiffString(i), 1) <> "-" Then
PercentDiffString(i) = " " & PercentDiffString(i)
End If
Next i

'display message box comparing results


msg = ""
msg = msg & "LC Sap2000 Independent %Diff" & vbCr & vbLf
For i = 0 To 5
msg = msg & Format(i + 1) & " " & SapResultString(i) & " " & IndResultString(i) & " "&
PercentDiffString(i) & vbCr & vbLf
Next i
msg = msg & Format(i + 1) & " " & SapResultString(i) & " " & IndResultString(i) & " "&
PercentDiffString(i)
MsgBox(msg)

Release Notes
Initial release in version 11.03.

Changed nomenclature from Load Cases, Analysis Cases and Response Combinations to Load Patterns,
Load Cases and Load Combinations, respectively, in version 12.00.

Example 3 (Visual C# 2005)


Remarks
This example is written for Visual C# 2005. 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.

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 11 of 40

Example
1. Create a new Visual C# 2005 project.

2. Add a reference (COM) in the project to the Sap2000.exe.

3. Add a new button to a form in the project.

4. Double click on the new button to bring up the Click procedure for the button and paste in the
following code.

//dimension variables
SAP2000.SapObject SapObject;
SAP2000.cSapModel SapModel;
int ret;
int i;
double[] ModValue;
double[] PointLoadValue;
bool[] Restraint;
string[] FrameName;
string[] PointName;
int NumberResults;
string[] Obj;
string[] Elm;
string[] LoadCase;
string[] StepType;
double[] StepNum;
double[] U1;
double[] U2;
double[] U3;
double[] R1;
double[] R2;
double[] R3;
double[] SapResult;
double[] IndResult;
double[] PercentDiff;
string[] SapResultString;
string[] IndResultString;
string[] PercentDiffString;
string msg;
string temp_string1;
string temp_string2;
bool temp_bool;

//create Sap2000 object


SapObject = new SAP2000.SapObject();

//start Sap2000 application


temp_bool = true;
SapObject.ApplicationStart(SAP2000.eUnits.kip_in_F, temp_bool, "");

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 12 of 40

//create SapModel object


SapModel = SapObject.SapModel;

//initialize model
ret = SapModel.InitializeNewModel((SAP2000.eUnits.kip_in_F));

//create new blank model


ret = SapModel.File.NewBlank();

//define material property


ret = SapModel.PropMaterial.SetMaterial("CONC", SAP2000.eMatType.MATERIAL_CONCRETE, -
1, "", "");

//assign isotropic mechanical properties to material


ret = SapModel.PropMaterial.SetMPIsotropic("CONC", 3600, 0.2, 0.0000055, 0);

//define rectangular frame section property


ret = SapModel.PropFrame.SetRectangle("R1", "CONC", 12, 12, -1, "", "");

//define frame section property modifiers


ModValue = new double[8];
for (i = 0; i <= 7; i++)
{
ModValue[i] = 1;
}
ModValue[0] = 1000;
ModValue[1] = 0;
ModValue[2] = 0;
System.Array temp_SystemArray = ModValue;
ret = SapModel.PropFrame.SetModifiers("R1", ref temp_SystemArray);

//switch to k-ft units


ret = SapModel.SetPresentUnits(SAP2000.eUnits.kip_ft_F);

//add frame object by coordinates


FrameName = new string[3];
temp_string1 = FrameName[0];
temp_string2 = FrameName[0];
ret = SapModel.FrameObj.AddByCoord(0, 0, 0, 0, 0, 10, ref temp_string1, "R1", "1", "Global");
FrameName[0] = temp_string1;
ret = SapModel.FrameObj.AddByCoord(0, 0, 10, 8, 0, 16, ref temp_string1, "R1", "2", "Global");
FrameName[1] = temp_string1;
ret = SapModel.FrameObj.AddByCoord(-4, 0, 10, 0, 0, 10, ref temp_string1, "R1", "3", "Global");
FrameName[2] = temp_string1;

//assign point object restraint at base


PointName = new string[2];
Restraint = new bool[6];
for (i = 0; i <= 3; i++)
{

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 13 of 40

Restraint[i] = true;
}
for (i = 4; i <= 5; i++)
{
Restraint[i] = false;
}
ret = SapModel.FrameObj.GetPoints(FrameName[0], ref temp_string1, ref temp_string2);
PointName[0] = temp_string1;
PointName[1] = temp_string2;
System.Array temp_SystemArray1 = Restraint;
ret = SapModel.PointObj.SetRestraint(PointName[0], ref temp_SystemArray1, 0);

//assign point object restraint at top


for (i = 0; i <= 1; i++)
{
Restraint[i] = true;
}
for (i = 2; i <= 5; i++)
{
Restraint[i] = false;
}
ret = SapModel.FrameObj.GetPoints(FrameName[1], ref temp_string1, ref temp_string2);
PointName[0] = temp_string1;
PointName[1] = temp_string2;
temp_SystemArray1 = Restraint;
ret = SapModel.PointObj.SetRestraint(PointName[1], ref temp_SystemArray1, 0);

//refresh view, update (initialize) zoom


temp_bool = false;
ret = SapModel.View.RefreshView(0, ref temp_bool);

//add load patterns


temp_bool = true;
ret = SapModel.LoadPatterns.Add("1", SAP2000.eLoadPatternType.LTYPE_OTHER, 1, ref
temp_bool);
ret = SapModel.LoadPatterns.Add("2", SAP2000.eLoadPatternType.LTYPE_OTHER, 0, ref
temp_bool);
ret = SapModel.LoadPatterns.Add("3", SAP2000.eLoadPatternType.LTYPE_OTHER, 0, ref
temp_bool);
ret = SapModel.LoadPatterns.Add("4", SAP2000.eLoadPatternType.LTYPE_OTHER, 0, ref
temp_bool);
ret = SapModel.LoadPatterns.Add("5", SAP2000.eLoadPatternType.LTYPE_OTHER, 0, ref
temp_bool);
ret = SapModel.LoadPatterns.Add("6", SAP2000.eLoadPatternType.LTYPE_OTHER, 0, ref
temp_bool);
ret = SapModel.LoadPatterns.Add("7", SAP2000.eLoadPatternType.LTYPE_OTHER, 0, ref
temp_bool);

//assign loading for load pattern 2


ret = SapModel.FrameObj.GetPoints(FrameName[2], ref temp_string1, ref temp_string2);
PointName[0] = temp_string1;

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 14 of 40

PointName[1] = temp_string2;
PointLoadValue = new double[6];
PointLoadValue[2] = -10;
temp_SystemArray1 = PointLoadValue;
ret = SapModel.PointObj.SetLoadForce(PointName[0], "2", ref temp_SystemArray1, false, "Global", 0);
ret = SapModel.FrameObj.SetLoadDistributed(FrameName[2], "2", 1, 10, 0, 1, 1.8, 1.8, "Global",
System.Convert.ToBoolean(-1), System.Convert.ToBoolean(-1), 0);

//assign loading for load pattern 3


ret = SapModel.FrameObj.GetPoints(FrameName[2], ref temp_string1, ref temp_string2);
PointName[0] = temp_string1;
PointName[1] = temp_string2;
PointLoadValue = new double[6];
PointLoadValue[2] = -17.2;
PointLoadValue[4] = -54.4;
temp_SystemArray1 = PointLoadValue;
ret = SapModel.PointObj.SetLoadForce(PointName[1], "3", ref temp_SystemArray1, false, "Global", 0);

//assign loading for load pattern 4


ret = SapModel.FrameObj.SetLoadDistributed(FrameName[1], "4", 1, 11, 0, 1, 2, 2, "Global",
System.Convert.ToBoolean(-1), System.Convert.ToBoolean(-1), 0);

//assign loading for load pattern 5


ret = SapModel.FrameObj.SetLoadDistributed(FrameName[0], "5", 1, 2, 0, 1, 2, 2, "Local",
System.Convert.ToBoolean(-1), System.Convert.ToBoolean(-1), 0);
ret = SapModel.FrameObj.SetLoadDistributed(FrameName[1], "5", 1, 2, 0, 1, -2, -2, "Local",
System.Convert.ToBoolean(-1), System.Convert.ToBoolean(-1), 0);

//assign loading for load pattern 6


ret = SapModel.FrameObj.SetLoadDistributed(FrameName[0], "6", 1, 2, 0, 1, 0.9984, 0.3744, "Local",
System.Convert.ToBoolean(-1), System.Convert.ToBoolean(-1), 0);
ret = SapModel.FrameObj.SetLoadDistributed(FrameName[1], "6", 1, 2, 0, 1, -0.3744, 0, "Local",
System.Convert.ToBoolean(-1), System.Convert.ToBoolean(-1), 0);

//assign loading for load pattern 7


ret = SapModel.FrameObj.SetLoadPoint(FrameName[1], "7", 1, 2, 0.5, -15, "Local",
System.Convert.ToBoolean(-1), System.Convert.ToBoolean(-1), 0);

//switch to k-in units


ret = SapModel.SetPresentUnits(SAP2000.eUnits.kip_in_F);

//save model
ret = SapModel.File.Save("C:\\SapAPI\\API_1-001.sdb");

//run model (this will create the analysis model)


ret = SapModel.Analyze.RunAnalysis();

//initialize for Sap2000 results


SapResult = new double[7];
ret = SapModel.FrameObj.GetPoints(FrameName[1], ref temp_string1, ref temp_string2);
PointName[0] = temp_string1;

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 15 of 40

PointName[1] = temp_string2;

//get Sap2000 results for load patterns 1 through 7


NumberResults = 0;
Obj = new string[1];
Elm = new string[1];
LoadCase = new string[1];
StepType = new string[1];
StepNum = new double[1];
U1 = new double[1];
U2 = new double[1];
U3 = new double[1];
R1 = new double[1];
R2 = new double[1];
R3 = new double[1];
for (i = 0; i <= 6; i++)
{
ret = SapModel.Results.Setup.DeselectAllCasesAndCombosForOutput();
ret = SapModel.Results.Setup.SetCaseSelectedForOutput(System.Convert.ToString(i+1),
System.Convert.ToBoolean(-1));
if (i <= 3)
{
System.Array temp_SystemArray2 = Obj;
System.Array temp_SystemArray3 = Elm;
System.Array temp_SystemArray4 = LoadCase;
System.Array temp_SystemArray5 = StepType;
System.Array temp_SystemArray6 = StepNum;
System.Array temp_SystemArray7 = U1;
System.Array temp_SystemArray8 = U2;
System.Array temp_SystemArray9 = U3;
System.Array temp_SystemArray10 = R1;
System.Array temp_SystemArray11 = R2;
System.Array temp_SystemArray12 = R3;
ret = SapModel.Results.JointDispl(PointName[1], SAP2000.eItemTypeElm.ObjectElm, ref
NumberResults, ref temp_SystemArray2, ref temp_SystemArray3, ref temp_SystemArray4, ref
temp_SystemArray5, ref temp_SystemArray6, ref temp_SystemArray7, ref temp_SystemArray8, ref
temp_SystemArray9, ref temp_SystemArray10, ref temp_SystemArray11, ref temp_SystemArray12);
temp_SystemArray9.CopyTo(U3, 0);
SapResult[i] = U3[0];
}
else
{
System.Array temp_SystemArray2 = Obj;
System.Array temp_SystemArray3 = Elm;
System.Array temp_SystemArray4 = LoadCase;
System.Array temp_SystemArray5 = StepType;
System.Array temp_SystemArray6 = StepNum;
System.Array temp_SystemArray7 = U1;
System.Array temp_SystemArray8 = U2;
System.Array temp_SystemArray9 = U3;
System.Array temp_SystemArray10 = R1;

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 16 of 40

System.Array temp_SystemArray11 = R2;


System.Array temp_SystemArray12 = R3;
ret = SapModel.Results.JointDispl(PointName[0], SAP2000.eItemTypeElm.ObjectElm, ref
NumberResults, ref temp_SystemArray2, ref temp_SystemArray3, ref temp_SystemArray4, ref
temp_SystemArray5, ref temp_SystemArray6, ref temp_SystemArray7, ref temp_SystemArray8, ref
temp_SystemArray9, ref temp_SystemArray10, ref temp_SystemArray11, ref temp_SystemArray12);
temp_SystemArray7.CopyTo(U1, 0);
SapResult[i] = U1[0];
}
}

//close Sap2000
SapObject.ApplicationExit(false);
SapModel = null;
SapObject = null;

//fill Sap2000 result strings


SapResultString = new string[7];
for (i = 0; i <= 6; i++)
{
SapResultString[i] = string.Format("{0:0.00000}", SapResult[i]);
ret = (string.Compare(SapResultString[i], 1, "-", 1, 1, true));
if (ret != 0)
{
SapResultString[i] = " " + SapResultString[i];
}
}

//fill independent results


IndResult = new double[7];
IndResultString = new string[7];
IndResult[0] = -0.02639;
IndResult[1] = 0.06296;
IndResult[2] = 0.06296;
IndResult[3] = -0.2963;
IndResult[4] = 0.3125;
IndResult[5] = 0.11556;
IndResult[6] = 0.00651;
for (i = 0; i <= 6; i++)
{
IndResultString[i] = string.Format("{0:0.00000}", IndResult[i]);
ret = (string.Compare(IndResultString[i], 1, "-", 1, 1, true));
if (ret != 0)
{
IndResultString[i] = " " + IndResultString[i];
}
}

//fill percent difference


PercentDiff = new double[7];
PercentDiffString = new string[7];

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 17 of 40

for (i = 0; i <= 6; i++)


{
PercentDiff[i] = (SapResult[i] / IndResult[i]) - 1;
PercentDiffString[i] = string.Format("{0:0%}", PercentDiff[i]);
ret = (string.Compare(PercentDiffString[i], 1, "-", 1, 1, true));
if (ret != 0)
{
PercentDiffString[i] = " " + PercentDiffString[i];
}
}

//display message box comparing results


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";
}
msg = msg + string.Format("{0:0}", i + 1) + " " + SapResultString[i] + " " + IndResultString[i] +
" " + PercentDiffString[i];
MessageBox.Show(msg);

Release Notes
Initial release in version 11.03.

Changed nomenclature from Load Cases, Analysis Cases and Response Combinations to Load Patterns,
Load Cases and Load Combinations, respectively, in version 12.00.

Example 4 (Intel Visual Fortran v9)


Remarks
This example is written for Intel Visual Fortran v9 with Microsoft Visual Studio Integration. 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. Create an empty Intel Fortran project.

2. Using the Intel Fortran Module Wizard (under Tools menu), browse for Sap2000.exe, and
select all members to generate Sap2000.f90. The generated module contains explicit interfaces to
all objects and member functions of the SAP2000 API.

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 18 of 40

3. Add an empty source file by right clicking on the “Source Files” folder in Solution Explorer
and by selecting Add/New Item/Source.

4. Open the newly added file by double clicking on it and paste in the following code:

program APIExample

use Sap2000 ! gives access to SAP2000 API calls

implicit none

!parameters
integer(kind=4), parameter :: nDimCON = 1 ! array dimension

!local variables
integer(kind=4) :: pSapObject ! pointer to a Sap object
integer(kind=4) :: pSapModel ! pointer to a model object
integer(kind=4) :: pFile ! pointer to a file object
integer(kind=4) :: pPropMaterial ! pointer to a material property object
integer(kind=4) :: pPropFrame ! pointer to a model object
integer(kind=4) :: pFrameObj ! pointer to a frame object
integer(kind=4) :: pView ! pointer to a view object
integer(kind=4) :: pPointObj ! pointer to a point object
integer(kind=4) :: pLoadPatterns ! pointer to a load patterns object
integer(kind=4) :: pAnalyze ! pointer to an analyze object
integer(kind=4) :: pAnalysisResults ! pointer to a analysis resutls object
integer(kind=4) :: pAnalysisResultsSetup ! pointer to a setup object
integer(kind=4) :: iStatus ! error code returned from COM subsystem

integer(kind=4) :: iRet ! error code returned from SAP2000 API calls


integer(kind=4) :: iCol
integer(kind=4) :: iUnits
integer(kind=4) :: iColor
integer(kind=4) :: iWindow
integer(kind=4) :: iItemType
integer(kind=4) :: iTypleLoadPat
integer(kind=4) :: iMyType
integer(kind=4) :: iDir
integer(kind=4) :: iNumberResults

real(kind=8) :: dE
real(kind=8) :: dU
real(kind=8) :: dA
real(kind=8) :: dTemp
real(kind=8) :: dT3
real(kind=8) :: dT2
real(kind=8) :: dModValue

real(kind=8) :: dXi

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 19 of 40

real(kind=8) :: dYi
real(kind=8) :: dZi
real(kind=8) :: dXj
real(kind=8) :: dYj
real(kind=8) :: dZj
real(kind=8) :: dSelfWTMultiplier

real(kind=8) :: dDist1
real(kind=8) :: dDist2
real(kind=8) :: dVal1
real(kind=8) :: dVal2

real(kind=8) :: dSapResultsRA1(7)
real(kind=8) :: dIndResultsRA1(7)

logical(kind=2) :: bVisible
logical(kind=2) :: bFileSave
logical(kind=2) :: bZoom
logical(kind=2) :: bRestrained
logical(kind=2) :: bAddLoadCase
logical(kind=2) :: bReplace
logical(kind=2) :: bRelDist
logical(kind=2) :: bSelected

character(len=256) :: cFileName
character(len=256) :: cNotes
character(len=256) :: cGUID
character(len=256) :: cCsys
character(len=256) :: cLoadPat
character(len=256) :: cFrameName(3)
character(len=256) :: cPointName(2)

! pointers to SafeArrays
type(SA_BOUNDS) :: saBounds ! bounds object defining for SafeArray
integer(kind=4) :: pModValueSA ! property modifiers
integer(kind=4) :: pRestraintSA ! restraints
integer(kind=4) :: pPointLoadValueSA ! load values
integer(kind=4) :: pObjSA ! object names
integer(kind=4) :: pElmSA ! element names
integer(kind=4) :: pLCaseSA ! load case names
integer(kind=4) :: pStepTypeSA ! step type names
integer(kind=4) :: pStepNumSA ! step numbers
integer(kind=4) :: pU1SA ! displacements along u1
integer(kind=4) :: pU2SA ! displacements along u2
integer(kind=4) :: pU3SA ! displacements along u3
integer(kind=4) :: pR1SA ! displacements along r1
integer(kind=4) :: pR2SA ! displacements along r2
integer(kind=4) :: pR3SA ! displacements along r3

!initialize COM
call COMInitialize(iStatus)

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 20 of 40

!create Sap2000 object


call COMCreateObjectByGUID(CLSID_SapObject, CLSCTX_ALL, IID__SapObject, pSapObject,
iStatus)

!start Sap2000 application


iUnits = kip_in_F
bVisible = .TRUE.
cFileName = ''
iStatus = $$SapObject_ApplicationStart(pSapObject, iUnits, bVisible, cFileName, iRet)

!create SapModel object


iStatus = $$SapObject_GetSapModel(pSapObject, pSapModel)

!initialize model
iStatus = $$cSapModel_InitializeNewModel(pSapModel, iUnits, iRet)

!create new blank model


iStatus = $$cSapModel_GetFile(pSapModel, pFile)
iStatus = $$cFile_NewBlank(pFile, iRet)

!define material property


iStatus = $$cSapModel_GetPropMaterial(pSapModel, pPropMaterial)

iColor = -1
cNotes = ''
cGUID = ''
iStatus = $$cPropMaterial_SetMaterial(pPropMaterial, 'CONC', MATERIAL_CONCRETE, iColor,
cNotes, cGUID, iRet)

!assign isotropic mechanical properties to material


dE = 3600.
dU = 0.2
dA = 0.0000055
dTemp = 0.
iStatus = $$cPropMaterial_SetMPIsotropic(pPropMaterial, 'CONC', dE, dU, dA, dTemp, iRet)

!define rectangular frame section property


iStatus = $$cSapModel_GetPropFrame(pSapModel, pPropFrame)

dT3 = 12.
dT2 = 12.
iColor = -1
cNotes = ''
cGUID = ''
iStatus = $$cPropFrame_SetRectangle(pPropFrame, 'R1', 'CONC', dT3, dT2, iColor, cNotes, cGUID,
iRet)

!define frame section property modifiers


saBounds%lbound = 0
saBounds%extent = 8

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 21 of 40

pModValueSA = SafeArrayCreate(VT_R8, nDimCON, saBounds)


dModValue = 1.
do iCol = 0, 7
iRet = SafeArrayPutElement(pModValueSA, iCol, loc(dModValue))
end do
dModValue = 1000.
iRet = SafeArrayPutElement(pModValueSA, 0, loc(dModValue))
dModValue = 0.
iRet = SafeArrayPutElement(pModValueSA, 1, loc(dModValue))
iRet = SafeArrayPutElement(pModValueSA, 2, loc(dModValue))

iStatus = $$cPropFrame_SetModifiers(pPropFrame, 'R1', pModValueSA, iRet)


iRet = SafeArrayDestroy(pModValueSA)

!switch to k-ft units


iStatus = $$cSapModel_SetPresentUnits(pSapModel, kip_ft_F, iRet)

!add frame object by coordinates


cCsys = 'Global'

dXi = 0.; dYi = 0.; dZi = 0.; dXj = 0.; dYj = 0.; dZj = 10.
iStatus = $$cSapModel_GetFrameObj(pSapModel, pFrameObj)
iStatus = $$cFrameObj_AddByCoord(pFrameObj, dXi, dYi, dZi, dXj, dYj, dZj, cFrameName(1), 'R1',
'1', cCsys, iRet)

dXi = 0.; dYi = 0.; dZi = 10.; dXj = 8.; dYj = 0.; dZj = 16.
iStatus = $$cFrameObj_AddByCoord(pFrameObj, dXi, dYi, dZi, dXj, dYj, dZj, cFrameName(2), 'R1',
'2', cCsys, iRet)

dXi = -4.; dYi = 0.; dZi = 10.; dXj = 0.; dYj = 0.; dZj = 10.
iStatus = $$cFrameObj_AddByCoord(pFrameObj, dXi, dYi, dZi, dXj, dYj, dZj, cFrameName(3), 'R1',
'3', cCsys, iRet)

!assign point object restraint at base


saBounds%lbound = 0
saBounds%extent = 6
pRestraintSA = SafeArrayCreate(VT_BOOL, nDimCON, saBounds)
bRestrained = .TRUE.
do iCol = 0, 3
iRet = SafeArrayPutElement(pRestraintSA, iCol, loc(bRestrained))
end do
bRestrained = .FALSE.
do iCol = 4, 5
iRet = SafeArrayPutElement(pRestraintSA, iCol, loc(bRestrained))
end do

iStatus = $$cFrameObj_GetPoints(pFrameObj, cFrameName(1), cPointName(1), cPointName(2),


iRet)
iStatus = $$cSapModel_GetPointObj(pSapModel, pPointObj)
iItemType = Object
iStatus = $$cPointObj_SetRestraint(pPointObj, cPointName(1), pRestraintSA, iItemType, iRet)

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 22 of 40

!assign point object restraint at top


bRestrained = .TRUE.
do iCol = 0, 1
iRet = SafeArrayPutElement(pRestraintSA, iCol, loc(bRestrained))
end do
bRestrained = .FALSE.
do iCol = 2, 5
iRet = SafeArrayPutElement(pRestraintSA, iCol, loc(bRestrained))
end do

iStatus = $$cFrameObj_GetPoints(pFrameObj, cFrameName(2), cPointName(1), cPointName(2),


iRet)
iItemType = Object
iStatus = $$cPointObj_SetRestraint(pPointObj, cPointName(2), pRestraintSA, iItemType, iRet)
iRet = SafeArrayDestroy(pRestraintSA)

!refresh view, update (initialize) zoom


iStatus = $$cSapModel_GetView(pSapModel, pView)
bZoom = .FALSE.
iWindow = 0
iStatus = $$cView_RefreshView(pView, iWindow, bZoom, iRet)

!add load patterns


iStatus = $$cSapModel_GetLoadPatterns(pSapModel, pLoadPatterns)
iTypleLoadPat = LTYPE_OTHER
dSelfWTMultiplier = 1.
bAddLoadCase = .TRUE.
iStatus = $$cLoadPatterns_Add(pLoadPatterns, '1', iTypleLoadPat, dSelfWTMultiplier,
bAddLoadCase, iRet)

dSelfWTMultiplier = 0.
iStatus = $$cLoadPatterns_Add(pLoadPatterns, '2', iTypleLoadPat, dSelfWTMultiplier,
bAddLoadCase, iRet)
iStatus = $$cLoadPatterns_Add(pLoadPatterns, '3', iTypleLoadPat, dSelfWTMultiplier,
bAddLoadCase, iRet)
iStatus = $$cLoadPatterns_Add(pLoadPatterns, '4', iTypleLoadPat, dSelfWTMultiplier,
bAddLoadCase, iRet)
iStatus = $$cLoadPatterns_Add(pLoadPatterns, '5', iTypleLoadPat, dSelfWTMultiplier,
bAddLoadCase, iRet)
iStatus = $$cLoadPatterns_Add(pLoadPatterns, '6', iTypleLoadPat, dSelfWTMultiplier,
bAddLoadCase, iRet)
iStatus = $$cLoadPatterns_Add(pLoadPatterns, '7', iTypleLoadPat, dSelfWTMultiplier,
bAddLoadCase, iRet)

!assign loading for load pattern 2


iStatus = $$cSapModel_GetFrameObj(pSapModel, pFrameObj)
iStatus = $$cFrameObj_GetPoints(pFrameObj, cFrameName(3), cPointName(1), cPointName(2),
iRet)

saBounds%lbound = 0

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 23 of 40

saBounds%extent = 6
pPointLoadValueSA = SafeArrayCreate(VT_R8, nDimCON, saBounds)
dModValue = 0.
do iCol = saBounds%lbound, saBounds%extent
iRet = SafeArrayPutElement(pPointLoadValueSA, iCol, loc(dModValue))
end do
dModValue = -10.
iRet = SafeArrayPutElement(pPointLoadValueSA, 2, loc(dModValue))

bReplace = .FALSE.
cCsys = 'Global'
iItemType = Object
iStatus = $$cPointObj_SetLoadForce(pPointObj, cPointName(1), '2', pPointLoadValueSA, bReplace,
cCsys, iItemType, iRet)

iMyType = 1
iDir = 10
dDist1 = 0.
dDist2 = 1.
dVal1 = 1.8
dVal2 = 1.8
cCsys = 'Global'
bRelDist = .TRUE.
bReplace = .TRUE.
iItemType = Object
iStatus = $$cFrameObj_SetLoadDistributed(pFrameObj, cFrameName(3), '2', iMyType, iDir, dDist1,
dDist2, dVal1, dVal2, cCsys, bRelDist, bReplace, iItemType, iRet)

!assign loading for load pattern 3


iStatus = $$cFrameObj_GetPoints(pFrameObj, cFrameName(3), cPointName(1), cPointName(2),
iRet)

dModValue = 0.
do iCol = saBounds%lbound, saBounds%extent
iRet = SafeArrayPutElement(pPointLoadValueSA, iCol, loc(dModValue))
end do
dModValue = -17.2
iRet = SafeArrayPutElement(pPointLoadValueSA, 2, loc(dModValue))
dModValue = -54.4
iRet = SafeArrayPutElement(pPointLoadValueSA, 4, loc(dModValue))

bReplace = .FALSE.
cCsys = 'Global'
iItemType = Object
iStatus = $$cPointObj_SetLoadForce(pPointObj, cPointName(2), '3', pPointLoadValueSA, bReplace,
cCsys, iItemType, iRet)
iRet = SafeArrayDestroy(pPointLoadValueSA)

!assign loading for load pattern 4


iMyType = 1
iDir = 11

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 24 of 40

dDist1 = 0.
dDist2 = 1.
dVal1 = 2.
dVal2 = 2.
cCsys = 'Global'
bRelDist = .TRUE.
bReplace = .TRUE.
iItemType = Object
iStatus = $$cFrameObj_SetLoadDistributed(pFrameObj, cFrameName(2), '4', iMyType, iDir, dDist1,
dDist2, dVal1, dVal2, cCsys, bRelDist, bReplace, iItemType, iRet)

!assign loading for load pattern 5


iMyType = 1
iDir = 2
dDist1 = 0.
dDist2 = 1.
dVal1 = 2.
dVal2 = 2.
cCsys = 'Local'
bRelDist = .TRUE.
bReplace = .TRUE.
iItemType = Object
iStatus = $$cFrameObj_SetLoadDistributed(pFrameObj, cFrameName(1), '5', iMyType, iDir, dDist1,
dDist2, dVal1, dVal2, cCsys, bRelDist, bReplace, iItemType, iRet)

dVal1 = -2.
dVal2 = -2.
iStatus = $$cFrameObj_SetLoadDistributed(pFrameObj, cFrameName(2), '5', iMyType, iDir, dDist1,
dDist2, dVal1, dVal2, cCsys, bRelDist, bReplace, iItemType, iRet)

!assign loading for load pattern 6


iMyType = 1
iDir = 2
dDist1 = 0.
dDist2 = 1.
dVal1 = 0.9984
dVal2 = 0.3744
cCsys = 'Local'
bRelDist = .TRUE.
bReplace = .TRUE.
iItemType = Object
iStatus = $$cFrameObj_SetLoadDistributed(pFrameObj, cFrameName(1), '6', iMyType, iDir, dDist1,
dDist2, dVal1, dVal2, cCsys, bRelDist, bReplace, iItemType, iRet)

dVal1 = -0.3744
dVal2 = 0.
iStatus = $$cFrameObj_SetLoadDistributed(pFrameObj, cFrameName(2), '6', iMyType, iDir, dDist1,
dDist2, dVal1, dVal2, cCsys, bRelDist, bReplace, iItemType, iRet)

!assign loading for load pattern 7


iMyType = 1

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 25 of 40

iDir = 2
dDist1 = 0.5
dVal1 = -15.
cCsys = 'Local'
bRelDist = .TRUE.
bReplace = .TRUE.
iItemType = Object
iStatus = $$cFrameObj_SetLoadPoint(pFrameObj, cFrameName(2), '7', iMyType, iDir, dDist1, dVal1,
cCsys, bRelDist, bReplace, iItemType, iRet)

!switch to k-in units


iStatus = $$cSapModel_SetPresentUnits(pSapModel, kip_in_F, iRet)

!save model
iStatus = $$cFile_Save(pFile, "c:\API_1-001.sdb", iRet)

!run model (this will create the analysis model)


iStatus = $$cSapModel_GetAnalyze(pSapModel, pAnalyze)
iStatus = $$cAnalyze_RunAnalysis(pAnalyze, iRet)

!initialize for Sap2000 results


iStatus = $$cFrameObj_GetPoints(pFrameObj, cFrameName(2), cPointName(1), cPointName(2),
iRet)

!get Sap2000 results for load patterns 1 through 7


saBounds%lbound = 0
saBounds%extent = 0
pObjSA = SafeArrayCreate(VT_BSTR, nDimCON, saBounds)
pElmSA = SafeArrayCreate(VT_BSTR, nDimCON, saBounds)
pLCaseSA = SafeArrayCreate(VT_BSTR, nDimCON, saBounds)
pStepTypeSA = SafeArrayCreate(VT_BSTR, nDimCON, saBounds)
pStepNumSA = SafeArrayCreate(VT_R8, nDimCON, saBounds)
pU1SA = SafeArrayCreate(VT_R8, nDimCON, saBounds)
pU2SA = SafeArrayCreate(VT_R8, nDimCON, saBounds)
pU3SA = SafeArrayCreate(VT_R8, nDimCON, saBounds)
pR1SA = SafeArrayCreate(VT_R8, nDimCON, saBounds)
pR2SA = SafeArrayCreate(VT_R8, nDimCON, saBounds)
pR3SA = SafeArrayCreate(VT_R8, nDimCON, saBounds)

dSapResultsRA1(:) = 0.

iItemType = ObjectElm
bSelected = .TRUE.
iStatus = $$cSapModel_GetResults(pSapModel, pAnalysisResults)
do iCol = 0, 6
iStatus = $$cAnalysisResults_GetSetup(pAnalysisResults, pAnalysisResultsSetup)
write (cLoadPat, '(I1)') iCol+1
iStatus = $$cAnalysisResultsSetup_DeselectAllCasesAndCombosForOutput
(pAnalysisResultsSetup, iRet)

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 26 of 40

iStatus = $$cAnalysisResultsSetup_SetCaseSelectedForOutput(pAnalysisResultsSetup, cLoadPat,


bSelected, iRet)

if (iCol <= 3) then


iStatus = $$cAnalysisResults_JointDispl(pAnalysisResults, cPointName(2), iItemType,
iNumberResults, pObjSA, pElmSA, pLCaseSA, pStepTypeSA, pStepNumSA, pU1SA, pU2SA, pU3SA,
pR1SA, pR2SA, pR3SA, iRet)
iRet = SafeArrayGetElement(pU3SA, 0, loc(dModValue))

else
iStatus = $$cAnalysisResults_JointDispl(pAnalysisResults, cPointName(1), iItemType,
iNumberResults, pObjSA, pElmSA, pLCaseSA, pStepTypeSA, pStepNumSA, pU1SA, pU2SA, pU3SA,
pR1SA, pR2SA, pR3SA, iRet)
iRet = SafeArrayGetElement(pU1SA, 0, loc(dModValue))
end if
dSapResultsRA1(iCol+1) = dModValue
end do

!close Sap2000 application


bFileSave = .FALSE.
iRet = $$SapObject_ApplicationExit(pSapObject, bFileSave, iStatus)

!release Sap2000 object


iStatus = COMReleaseObject(pSapObject)

!uninitialize COM
call COMUninitialize()

!deallocate SafeArrays
iRet = SafeArrayDestroy(pObjSA)
iRet = SafeArrayDestroy(pElmSA)
iRet = SafeArrayDestroy(pLCaseSA)
iRet = SafeArrayDestroy(pStepTypeSA)
iRet = SafeArrayDestroy(pStepNumSA)
iRet = SafeArrayDestroy(pU1SA)
iRet = SafeArrayDestroy(pU3SA)
iRet = SafeArrayDestroy(pR1SA)
iRet = SafeArrayDestroy(pR2SA)
iRet = SafeArrayDestroy(pR3SA)

!fill independent results


dIndResultsRA1(1) = -0.02639
dIndResultsRA1(2) = 0.06296
dIndResultsRA1(3) = 0.06296
dIndResultsRA1(4) = -0.29630
dIndResultsRA1(5) = 0.31250
dIndResultsRA1(6) = 0.11556
dIndResultsRA1(7) = 0.00651

!display results
print *, 'LC Sap2000 Independent %Diff'

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 27 of 40

print *, '-- -------- ----------- -----'


do iCol = 1, 7
print 1, iCol, dSapResultsRA1(iCol), dIndResultsRA1(iCol), (dSapResultsRA1(iCol) /
dIndResultsRA1(iCol)) - 1.
end do

1format ( i3, f10.5, f13.5, f7.2)


pause

end program APIExample

Release Notes
Initial release in version 11.03.

Changed nomenclature from Load Cases, Analysis Cases and Response Combinations to Load Patterns,
Load Cases and Load Combinations, respectively, in version 12.00.

Example 5 (Microsoft Visual C++ 2005)


Remarks
This example is written for Microsoft Visual C++ 2005. 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. Create a Visual C++ Win32 project using the template “Win32 Console Application”.

2. In Win32 Application Wizard, add common header files for ATL under Application Settings
tab.

3. Create a folder named “tlb” under the project folder and copy “Sap2000.tlb” from the
installation folder to the “tlb” folder.

4. Create a folder named “C:\API” if it does not exist.

5. Open the .cpp file generated by the wizard by double clicking on it and paste in the
following code:

#include "stdafx.h"
#include <sstream>

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 28 of 40

#include <iomanip>
#include <math.h>

#import "..\tlb\Sap2000.tlb" high_property_prefixes("Get_","Put_","PutRef_") no_smart_pointers


no_namespace raw_native_types rename("min", "sap2000v12_min") rename("SetProp",
"sap2000v12_SetProp") rename("GetProp", "sap2000v12_GetProp") rename("Yield",
"sap2000v12_Yield")

using namespace std;

bool CheckHRESULT(HRESULT hRes, const wchar_t *msg)


{
if(FAILED(hRes)) {
MessageBox(0, msg, L"ERROR!", MB_SETFOREGROUND);
return (false);

}
return (true);
}

int _tmain(int argc, _TCHAR* argv[])


{
HRESULT hRes = 0;
int res = 0;

// initialize COM
hRes = CoInitialize(NULL);
if(!CheckHRESULT(hRes, L"Error initializing COM subsystem!")) return (hRes);

// create Sap2000 object


// CComQIPtr is a smart pointer class for managing COM interface pointers.
CComQIPtr<_SapObject> pSapObject;
hRes = pSapObject.CoCreateInstance( __uuidof(SapObject), NULL,
CLSCTX_LOCAL_SERVER);
if(!CheckHRESULT(hRes, L"Cannot instanciate SapObject!")) return (hRes);

try {
// start Sap2000 application
// CComBSTR is a wrapper for BSTRs.
CComBSTR bstrEmpty("");
res = pSapObject->ApplicationStart(kip_in_F, VARIANT_TRUE, bstrEmpty);

// create SapModel object


CComQIPtr<_cSapModel> pSapModel;
pSapModel = pSapObject->Get_SapModel();

// initialize model
res = pSapModel->InitializeNewModel(kip_in_F);

// create new blank model


CComQIPtr<_cFile> pFile;

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 29 of 40

pFile = pSapModel->Get_File();
res = pFile->NewBlank();

// define material property


CComQIPtr<_cPropMaterial> pPropMaterial;
CComBSTR bstrPropMaterial("CONC");
pPropMaterial = pSapModel->Get_PropMaterial();
res = pPropMaterial->SetMaterial(bstrPropMaterial, MATERIAL_CONCRETE, -1, bstrEmpty,
bstrEmpty);

// assign isotropic mechanical properties to material


res = pPropMaterial->SetMPIsotropic(bstrPropMaterial, 3600, 0.2, 0.0000055, 0.0);

// define rectangular frame section property


CComQIPtr<_cPropFrame> pPropFrame;
pPropFrame = pSapModel->Get_PropFrame();

CComBSTR bstrPropFrame("R1");
res = pPropFrame->SetRectangle(bstrPropFrame, bstrPropMaterial, 12, 12, -1, bstrEmpty,
bstrEmpty);

// define frame section property modifiers


// CComSafeArray is a wrapper for the SAFEARRAY structure.
CComSafeArray<double> saMod(8);
for (int i = 0; i < 8; i++)
saMod[i] = 1.;
saMod[0] = 1000.;
saMod[1] = 0.;
saMod[2] = 0.;
res = pPropFrame->SetModifiers(bstrPropFrame, &(saMod.m_psa));

// switch to k-ft units


res = pSapModel->SetPresentUnits(kip_ft_F);

// add frame object by coordinates


CComBSTR name1(" ");
CComBSTR name2(" ");
CComBSTR name3(" ");
CComBSTR FrameName0("1");
CComBSTR FrameName1("2");
CComBSTR FrameName2("3");
CComBSTR bstrCoordSys("Global");
CComQIPtr<_cFrameObj> pFrameObj;
pFrameObj = pSapModel->Get_FrameObj();
res = pFrameObj->AddByCoord(0, 0, 0, 0, 0, 10, &name1, bstrPropFrame, FrameName0,
bstrCoordSys);
res = pFrameObj->AddByCoord(0, 0, 10, 8, 0, 16, &name2, bstrPropFrame, FrameName1,
bstrCoordSys);
res = pFrameObj->AddByCoord(-4, 0, 10, 0, 0, 10, &name3, bstrPropFrame, FrameName2,
bstrCoordSys);

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 30 of 40

// assign point object restraint at base


CComBSTR PointName("");
CComBSTR PointName0("");
CComBSTR PointName1("");
CComSafeArray<VARIANT_BOOL> saRest(6);
for (int i = 0; i < 4; i++)
saRest[i] = VARIANT_TRUE;
for (int i = 4; i < 6; i++)
saRest[i] = VARIANT_FALSE;
res = pFrameObj->GetPoints(FrameName0, &PointName0, &PointName1);

CComQIPtr<_cPointObj> pPointObj;
pPointObj = pSapModel->Get_PointObj();
res = pPointObj->SetRestraint(PointName0, &(saRest.m_psa), Object);

// assign point object restraint at top


for (int i = 0; i < 2; i++)
saRest[i] = VARIANT_TRUE;
for (int i = 2; i < 6; i++)
saRest[i] = VARIANT_FALSE;
res = pFrameObj->GetPoints(FrameName1, &PointName0, &PointName1);
res = pPointObj->SetRestraint(PointName1, &(saRest.m_psa), Object);

// refresh view, update (initialize) zoom


long window = 0;
VARIANT_BOOL zoom = VARIANT_FALSE;
CComQIPtr<_cView> pView;
pView = pSapModel->Get_View();
res = pView->RefreshView(window, zoom);

// add load patterns


double SelfWTMultiplier = 1.0;
VARIANT_BOOL AddLoadCase = VARIANT_TRUE;
CComQIPtr<_cLoadPatterns> pLoadPatterns;
pLoadPatterns = pSapModel->Get_LoadPatterns();

CComBSTR bstrLoadPattern("1");
res = pLoadPatterns->Add(bstrLoadPattern, LTYPE_OTHER, SelfWTMultiplier,
AddLoadCase);

SelfWTMultiplier = 0.;
bstrLoadPattern = "2";
res = pLoadPatterns->Add(bstrLoadPattern, LTYPE_OTHER, SelfWTMultiplier,
AddLoadCase);

bstrLoadPattern = "3";
res = pLoadPatterns->Add(bstrLoadPattern, LTYPE_OTHER, SelfWTMultiplier,
AddLoadCase);

bstrLoadPattern = "4";
res = pLoadPatterns->Add(bstrLoadPattern, LTYPE_OTHER, SelfWTMultiplier,

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 31 of 40

AddLoadCase);

bstrLoadPattern = "5";
res = pLoadPatterns->Add(bstrLoadPattern, LTYPE_OTHER, SelfWTMultiplier,
AddLoadCase);

bstrLoadPattern = "6";
res = pLoadPatterns->Add(bstrLoadPattern, LTYPE_OTHER, SelfWTMultiplier,
AddLoadCase);

bstrLoadPattern = "7";
res = pLoadPatterns->Add(bstrLoadPattern, LTYPE_OTHER, SelfWTMultiplier,
AddLoadCase);

// assign loading for load pattern 2


res = pFrameObj->GetPoints(FrameName2, &PointName0, &PointName1);

CComSafeArray<double> saPLoad(6);
for (int i = 0; i < 6; i++)
saPLoad[i] = 0.;
saPLoad[2] = -10.;

bstrLoadPattern = "2";
bstrCoordSys = "Global";
res = pPointObj->SetLoadForce(PointName0, bstrLoadPattern, &(saPLoad.m_psa),
VARIANT_FALSE, bstrCoordSys, Object);
res = pFrameObj->SetLoadDistributed(FrameName2, bstrLoadPattern, 1, 10, 0., 1., 1.8, 1.8,
bstrCoordSys, VARIANT_TRUE, VARIANT_TRUE, Object);

// assign loading for load pattern 3


res = pFrameObj->GetPoints(FrameName2, &PointName0, &PointName1);
for (int i = 0; i < 6; i++)
saPLoad[i] = 0.;
saPLoad[2] = -17.2;
saPLoad[4] = -54.4;

bstrLoadPattern = "3";
res = pPointObj->SetLoadForce(PointName1, bstrLoadPattern, &(saPLoad.m_psa),
VARIANT_FALSE, bstrCoordSys, Object);

// assign loading for load pattern 4


bstrLoadPattern = "4";
res = pFrameObj->SetLoadDistributed(FrameName1, bstrLoadPattern, 1, 10, 0, 1, 1.8, 1.8,
bstrCoordSys, VARIANT_TRUE, VARIANT_TRUE, Object);

// assign loading for load pattern 5


bstrCoordSys = "Local";
bstrLoadPattern = "5";
res = pFrameObj->SetLoadDistributed(FrameName0, bstrLoadPattern, 1, 2, 0, 1, 2, 2,
bstrCoordSys, VARIANT_TRUE, VARIANT_TRUE, Object);
res = pFrameObj->SetLoadDistributed(FrameName1, bstrLoadPattern, 1, 2, 0, 1, -2, -2,

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 32 of 40

bstrCoordSys, VARIANT_TRUE, VARIANT_TRUE, Object);

// assign loading for load pattern 6


bstrLoadPattern = "6";
res = pFrameObj->SetLoadDistributed(FrameName0, bstrLoadPattern, 1, 2, 0, 1, 0.9984, 0.3744,
bstrCoordSys, VARIANT_TRUE, VARIANT_TRUE, Object);
res = pFrameObj->SetLoadDistributed(FrameName1, bstrLoadPattern, 1, 2, 0, 1, -0.3744, 0,
bstrCoordSys, VARIANT_TRUE, VARIANT_TRUE, Object);

// assign loading for load pattern 7


bstrLoadPattern = "7";
res = pFrameObj->SetLoadPoint(FrameName1,bstrLoadPattern, 1, 2, 0.5, -15, bstrCoordSys,
VARIANT_TRUE, VARIANT_TRUE, Object);

// switch to k-in units


res = pSapModel->SetPresentUnits(kip_in_F);

// save model
CComBSTR bstrFileName("C:\\SapAPI\\API_1-001.sdb");
res = pFile->Save(bstrFileName);

// run model (this will create the analysis model)


CComQIPtr<_cAnalyze> pAnalyze;
pAnalyze = pSapModel->Get_Analyze();
res = pAnalyze->RunAnalysis();

// initialize for Sap2000 results


long NumberResults = 0;
double SapResult[7];
for (int i = 0; i < 7; i++)
SapResult[i] = 0.;

// use CComSafeArray class to simplify SAFEARRAY creation


CComSafeArray<BSTR> saResObj(1);
saResObj[0] = ::SysAllocString(L"");
CComSafeArray<BSTR> saResElm(1);
saResElm[0] = ::SysAllocString(L"");
CComSafeArray<BSTR> saResLoadCase(1);
saResLoadCase[0] = ::SysAllocString(L"");
CComSafeArray<BSTR> saResStepType(1);
saResStepType[0] = ::SysAllocString(L"");
CComSafeArray<double> saResStepNum(1);
CComSafeArray<double> saResU1(1);
CComSafeArray<double> saResU2(1);
CComSafeArray<double> saResU3(1);
CComSafeArray<double> saResR1(1);
CComSafeArray<double> saResR2(1);
CComSafeArray<double> saResR3(1);

res = pFrameObj->GetPoints(FrameName1, &PointName0, &PointName1);

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 33 of 40

// get Sap2000 results for load cases 1 through 7


CComQIPtr<_cAnalysisResults> pResults;
CComQIPtr<_cAnalysisResultsSetup> pResultsSetup;

pResults = pSapModel->Get_Results();
pResultsSetup = pResults->Get_Setup();

for (int i = 0; i < 7; i++) {


res = pResultsSetup->DeselectAllCasesAndCombosForOutput();

if (i==0) {
bstrLoadPattern = "1";
res = pResultsSetup->SetCaseSelectedForOutput(bstrLoadPattern, VARIANT_TRUE);
} else if (i==1) {
bstrLoadPattern = "2";
res = pResultsSetup->SetCaseSelectedForOutput(bstrLoadPattern, VARIANT_TRUE);
} else if (i==2) {
bstrLoadPattern = "3";
res = pResultsSetup->SetCaseSelectedForOutput(bstrLoadPattern, VARIANT_TRUE);
} else if (i==3) {
bstrLoadPattern = "4";
res = pResultsSetup->SetCaseSelectedForOutput(bstrLoadPattern, VARIANT_TRUE);
} else if (i==4) {
bstrLoadPattern = "5";
res = pResultsSetup->SetCaseSelectedForOutput(bstrLoadPattern, VARIANT_TRUE);
} else if (i==5) {
bstrLoadPattern = "6";
res = pResultsSetup->SetCaseSelectedForOutput(bstrLoadPattern, VARIANT_TRUE);
} else if (i==6) {
bstrLoadPattern = "7";
res = pResultsSetup->SetCaseSelectedForOutput(bstrLoadPattern, VARIANT_TRUE);
}

// SAFEARRAY pointers must be detached before being passed


// if they are to be redimensioned in the SAP2000 API method
LPSAFEARRAY psaResObj = saResObj.Detach();
LPSAFEARRAY psaResElm = saResElm.Detach();
LPSAFEARRAY psaResLoadCase = saResLoadCase.Detach();
LPSAFEARRAY psaResStepType = saResStepType.Detach();
LPSAFEARRAY psaResStepNum = saResStepNum.Detach();
LPSAFEARRAY psaResU1 = saResU1.Detach();
LPSAFEARRAY psaResU2 = saResU2.Detach();
LPSAFEARRAY psaResU3 = saResU3.Detach();
LPSAFEARRAY psaResR1 = saResR1.Detach();
LPSAFEARRAY psaResR2 = saResR2.Detach();
LPSAFEARRAY psaResR3 = saResR3.Detach();

if (i <= 3)
PointName = PointName1;
else
PointName = PointName0;

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 34 of 40

res = pResults->JointDispl(PointName, ObjectElm, &NumberResults, &psaResObj,


&psaResElm, &psaResLoadCase, &psaResStepType, &psaResStepNum, &psaResU1, &psaResU2,
&psaResU3, &psaResR1, &psaResR2, &psaResR3);

// reattach SAFEARRAY pointers


saResObj.Attach(psaResObj);
saResElm.Attach(psaResElm);
saResLoadCase.Attach(psaResLoadCase);
saResStepType.Attach(psaResStepType);
saResStepNum.Attach(psaResStepNum);
saResU1.Attach(psaResU1);
saResU2.Attach(psaResU2);
saResU3.Attach(psaResU3);
saResR1.Attach(psaResR1);
saResR2.Attach(psaResR2);
saResR3.Attach(psaResR3);

if (i <= 3)
SapResult[i] = saResU3[0];
else
SapResult[i] = saResU1[0];
}

// close Sap2000 application


res = pSapObject->ApplicationExit(VARIANT_FALSE);

// fill independent results (hand calculated)


double IndResult[7];
IndResult[0] = -0.02639;
IndResult[1] = 0.06296;
IndResult[2] = 0.06296;
IndResult[3] = -0.2963;
IndResult[4] = 0.3125;
IndResult[5] = 0.11556;
IndResult[6] = 0.00651;

// fill percent difference


double PercentDiff[7];
for (int i = 0; i < 7; i++)
PercentDiff[i] = fabs((SapResult[i] / IndResult[i]) - 1);

// print results
stringstream sMsg;
sMsg << fixed << setfill(' ');
sMsg << "LC Sap2000 Independent %Diff" << endl;
for (int i = 0; i < 7; i++)
sMsg << setprecision(5) << showpoint <<
setiosflags(ios::left)
<< setw(2) << i + 1 << " "
<< setw(11) << IndResult[i] << " "

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 35 of 40

<< setw(11) << SapResult[i] << " "


<< setprecision(0) << noshowpoint << setiosflags(ios::right)
<< setw(5) << PercentDiff[i] << '%' << endl;
MessageBoxA(0, sMsg.str().c_str(), " Results", MB_SETFOREGROUND);

// clean up objects
pFile.Release();
pPropMaterial.Release();
pPropFrame.Release();
pFrameObj.Release();
pPointObj.Release();
pView.Release();
pLoadPatterns.Release();
pAnalyze.Release();
pResults.Release();
pResultsSetup.Release();
pSapModel.Release();
pSapObject.Release();

// uninitialize COM
CoUninitialize();

// we're done!
return (res);
}
catch( _com_error& ex ) {
CheckHRESULT(ex.Error(), ex.ErrorMessage());

// close Sap2000 application


res = pSapObject->ApplicationExit(VARIANT_FALSE);

// uninitialize COM
CoUninitialize();

return (-1);
}
}

Release Notes
Initial release in version 12.0.1

Example 6 (MATLAB R2008a)


Remarks
This example is written for MATLAB R2008a. It is based on the Sap2000 verification problem Example
1-001.

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 36 of 40

This example creates the example verification problem from scratch, runs the analysis, extracts results,
and compares the results with hand calculated values.

Example
1. Create a folder named “C:\API” if it does not exist.

2. Create a MATLAB .m file using the built-in or any text editor and paste in the following code:

%% clean-up the workspace & command window


clear;
clc;

%% pass data to Sap2000 as one-dimensional arrays


feature('COM_SafeArraySingleDim', 1);

%% pass non-scalar arrays to Sap2000 API by reference


feature('COM_PassSafeArrayByRef', 1);

%% create Sap2000 object


SapObject = actxserver('sap2000.SapObject');

%% start Sap2000 application


SapObject.ApplicationStart;

%% create SapModel object


SapModel = SapObject.SapModel;

%% initialize model
ret = SapModel.InitializeNewModel;

%% create new blank model


ret = SapModel.File.NewBlank;

%% define material property


MATERIAL_CONCRETE = 2;
ret = SapModel.PropMaterial.SetMaterial('CONC', MATERIAL_CONCRETE);

%% assign isotropic mechanical properties to material


ret = SapModel.PropMaterial.SetMPIsotropic('CONC', 3600, 0.2, 0.0000055);

%% define rectangular frame section property


ret = SapModel.PropFrame.SetRectangle('R1', 'CONC', 12, 12);

%% define frame section property modifiers


ModValue = zeros(8,1,'double');
for i = 1 : 8
ModValue(i,1) = 1;

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 37 of 40

end
ModValue(1,1) = 1000;
ModValue(2,1) = 0;
ModValue(3,1) = 0;
ret = SapModel.PropFrame.SetModifiers('R1', ModValue);

%% switch to k-ft units


kip_ft_F = 4;
ret = SapModel.SetPresentUnits(kip_ft_F);

%% add frame object by coordinates


FrameName1 = ' ';

FrameName2 = ' ';

FrameName3 = ' ';

[ret, FrameName1] = SapModel.FrameObj.AddByCoord(0, 0, 0, 0, 0, 10, FrameName1, 'R1', '1',


Global');
[ret, FrameName2] = SapModel.FrameObj.AddByCoord(0, 0, 10, 8, 0, 16, FrameName2, 'R1', '2',
Global');
[ret, FrameName3] = SapModel.FrameObj.AddByCoord(-4, 0, 10, 0, 0, 10, FrameName3, 'R1', '3',
Global');

%% assign point object restraint at base


PointName1 = ' ';

PointName2 = ' ';

Restraint = logical(zeros(6,1));
for i = 1 : 4
Restraint(i,1) = true();
end

for i = 5 : 6
Restraint(i,1) = false();
end

[ret, PointName2] = SapModel.FrameObj.GetPoints(FrameName1, PointName1, PointName2);


ret = SapModel.PointObj.SetRestraint(PointName1, Restraint);

%% assign point object restraint at top


for i = 1 : 2
Restraint(i,1) = true();
end

for i = 3 : 6
Restraint(i,1) = false();
end

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 38 of 40

[ret, PointName1, PointName2] = SapModel.FrameObj.GetPoints(FrameName2, PointName1,


PointName2);
ret = SapModel.PointObj.SetRestraint(PointName2, Restraint);

%% refresh view, update (initialize) zoom


ret = SapModel.View.RefreshView(0, false());

%% add load patterns


LTYPE_OTHER = 8;
ret = SapModel.LoadPatterns.Add('1', LTYPE_OTHER, 1, true());
ret = SapModel.LoadPatterns.Add('2', LTYPE_OTHER, 0, true());
ret = SapModel.LoadPatterns.Add('3', LTYPE_OTHER, 0, true());
ret = SapModel.LoadPatterns.Add('4', LTYPE_OTHER, 0, true());
ret = SapModel.LoadPatterns.Add('5', LTYPE_OTHER, 0, true());
ret = SapModel.LoadPatterns.Add('6', LTYPE_OTHER, 0, true());
ret = SapModel.LoadPatterns.Add('7', LTYPE_OTHER, 0, true());

%% assign loading for load pattern 2


[ret, PointName1, PointName2] = SapModel.FrameObj.GetPoints(FrameName3, PointName1,
PointName2);
PointLoadValue(6,1) = 0;
PointLoadValue(3,1) = -10;
ret = SapModel.PointObj.SetLoadForce(PointName1, '2', PointLoadValue);
ret = SapModel.FrameObj.SetLoadDistributed(FrameName3, '2', 1, 10, 0, 1, 1.8, 1.8);

%% assign loading for load pattern 3


[ret, PointName1, PointName2] = SapModel.FrameObj.GetPoints(FrameName3, PointName1,
PointName2);
PointLoadValue(6,1) = 0;
PointLoadValue(3,1) = -17.2;
PointLoadValue(5,1) = -54.4;
ret = SapModel.PointObj.SetLoadForce(PointName2, '3', PointLoadValue);

%% assign loading for load pattern 4


ret = SapModel.FrameObj.SetLoadDistributed(FrameName2, '4', 1, 11, 0, 1, 2, 2);

%% assign loading for load pattern 5


ret = SapModel.FrameObj.SetLoadDistributed(FrameName1, '5', 1, 2, 0, 1, 2, 2, 'Local');
ret = SapModel.FrameObj.SetLoadDistributed(FrameName2, '5', 1, 2, 0, 1, -2, -2, 'Local');

%% assign loading for load pattern 6


ret = SapModel.FrameObj.SetLoadDistributed(FrameName1, '6', 1, 2, 0, 1, 0.9984, 0.3744, 'Local');
ret = SapModel.FrameObj.SetLoadDistributed(FrameName2, '6', 1, 2, 0, 1, -0.3744, 0, 'Local');

%% assign loading for load pattern 7


ret = SapModel.FrameObj.SetLoadPoint(FrameName2, '7', 1, 2, 0.5, -15, 'Local');

%% switch to k-in units


kip_in_F = 3;
ret = SapModel.SetPresentUnits(kip_in_F);

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 39 of 40

%% save model
ret = SapModel.File.Save('C:\API\API_1-001.sdb');

%% run model (this will create the analysis model)


ret = SapModel.Analyze.RunAnalysis();

%% initialize for Sap2000 results


SapResult= zeros(7,1,'double');
[ret, PointName1, PointName2] = SapModel.FrameObj.GetPoints(FrameName2, PointName1,
PointName2);

%% get Sap2000 results for load cases 1 through 7


for i = 1 : 7
NumberResults = 0;
Obj = cellstr(' ');
Elm = cellstr(' ');
ACase = cellstr(' ');
StepType = cellstr(' ');
StepNum = zeros(1,1,'double');
U1 = zeros(1,1,'double');
U2 = zeros(1,1,'double');
U3 = zeros(1,1,'double');
R1 = zeros(1,1,'double');
R2 = zeros(1,1,'double');
R3 = zeros(1,1,'double');
ObjectElm = 0;

ret = SapModel.Results.Setup.DeselectAllCasesAndCombosForOutput;
ret = SapModel.Results.Setup.SetCaseSelectedForOutput(int2str(i));
if i <= 4
[ret, NumberResults, Obj, Elm, ACase, StepType, StepNum, U1, U2, U3, R1, R2, R3] =
SapModel.Results.JointDispl(PointName2, 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] =
SapModel.Results.JointDispl(PointName1, 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());
SapModel = 0;
SapObject = 0;

%% fill independent results


IndResult= zeros(7,1,'double');
IndResult(1) = -0.02639;

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011


Example 1 (VBA) Page 40 of 40

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 12.0.1

file://C:\Documents and Settings\chraud\Local Settings\Temp\~hhCCE8.htm 12-04-2011

Potrebbero piacerti anche