Subido por Ramiro Rojas Gálvez

etabsingles

Anuncio
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
Create a new VBA project.
Add a reference to "C:Program Files (x86)\Computers and Structures\SAP2000 19\SAP2000v19.TLB" to the VBA project. Modify the path as appropriate for CSiBridge or if you have installed the program in a different location. If the TLB is missing from the installed program directory, an error occurred during installation. Please uninstall the program, restart your computer, and re-install with full administrative rights.
Add a new module to the VBA project and paste in the following code. Please pay attention to the comments in this code block; they contain important information about running the script.:
Sub VerificationExample1001()
Dim ret As Long
'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
Dim AttachToInstance As Boolean
AttachToInstance = False
'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
Dim SpecifyPath As Boolean
SpecifyPath = False
'if the above flag is set to True, specify the path to SAP2000 below
Dim ProgramPath As String
'ProgramPath = "C:\Program Files (x86)\Computers and Structures\SAP2000 19\SAP2000.exe"
'full path to the model
'set it to the desired path of your model
Dim ModelDirectory As String
ModelDirectory = "C:\CSiAPIexample"
If Len(Dir(ModelDirectory, vbDirectory)) = 0 Then
MkDir ModelDirectory
End If
Dim ModelName As String
ModelName = "API_1-001.sdb"
Dim ModelPath As String
ModelPath = ModelDirectory & Application.PathSeparator & ModelName
'create API helper object
Dim myHelper As cHelper
Set myHelper = New Helper
'dimension the SapObject as cOAPI type
Dim mySapObject As cOAPI
Set mySapObject = Nothing
If AttachToInstance Then
'attach to a running instance of SAP2000
'get the active SapObject
Set mySapObject = GetObject(, "CSI.SAP2000.API.SapObject")
Else
If SpecifyPath Then
'create an instance of the SapObject from the specified path
Set mySapObject = myHelper.CreateObject(ProgramPath)
Else
'create an instance of the SapObject from the latest installed SAP2000
Set mySapObject = myHelper.CreateObjectProgID("CSI.SAP2000.API.SapObject")
End If
'start SAP2000 application
mySapObject.ApplicationStart
End If
'Get a reference to cSapModel to access all OAPI classes and functions
Dim mySapModel As cSapModel
Set mySapModel = mySapObject.SapModel
'initialize model
ret = mySapModel.InitializeNewModel
'create new blank model
ret = mySapModel.File.NewBlank
'define material property
ret = mySapModel.PropMaterial.SetMaterial("CONC", eMatType_Concrete)
'assign isotropic mechanical properties to material
ret = mySapModel.PropMaterial.SetMPIsotropic("CONC", 3600, 0.2, 0.0000055)
'define rectangular frame section property
ret = mySapModel.PropFrame.SetRectangle("R1", "CONC", 12, 12)
'define frame section property modifiers
Dim i As Long
Dim ModValue() As Double
ReDim ModValue(7)
For i = 0 To 7
ModValue(i) = 1
Next i
ModValue(0) = 1000
ModValue(1) = 0
ModValue(2) = 0
ret = mySapModel.PropFrame.SetModifiers("R1", ModValue)
'switch to k-ft units
ret = mySapModel.SetPresentUnits(eUnits_kip_ft_F)
'add frame object by coordinates
Dim FrameName(2) As String
ret = mySapModel.FrameObj.AddByCoord(0, 0, 0, 0, 0, 10, FrameName(0), "R1", "1")
ret = mySapModel.FrameObj.AddByCoord(0, 0, 10, 8, 0, 16, FrameName(1), "R1", "2")
ret = mySapModel.FrameObj.AddByCoord(-4, 0, 10, 0, 0, 10, FrameName(2), "R1", "3")
'assign point object restraint at base
Dim PointName() As String
ReDim PointName(1)
Dim Restraint() As Boolean
ReDim Restraint(5)
For i = 0 To 3
Restraint(i) = True
Next i
For i = 4 To 5
Restraint(i) = False
Next i
ret = mySapModel.FrameObj.GetPoints(FrameName(0), PointName(0), PointName(1))
ret = mySapModel.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 = mySapModel.FrameObj.GetPoints(FrameName(1), PointName(0), PointName(1))
ret = mySapModel.PointObj.SetRestraint(PointName(1), Restraint)
'refresh view, update (initialize) zoom
ret = mySapModel.View.RefreshView(0, False)
'add load patterns
ret = mySapModel.LoadPatterns.Add("1", eLoadPatternType_Other, 1)
ret = mySapModel.LoadPatterns.Add("2", eLoadPatternType_Other)
ret = mySapModel.LoadPatterns.Add("3", eLoadPatternType_Other)
ret = mySapModel.LoadPatterns.Add("4", eLoadPatternType_Other)
ret = mySapModel.LoadPatterns.Add("5", eLoadPatternType_Other)
ret = mySapModel.LoadPatterns.Add("6", eLoadPatternType_Other)
ret = mySapModel.LoadPatterns.Add("7", eLoadPatternType_Other)
'assign loading for load pattern 2
ret = mySapModel.FrameObj.GetPoints(FrameName(2), PointName(0), PointName(1))
Dim PointLoadValue() As Double
ReDim PointLoadValue(5)
PointLoadValue(2) = -10
ret = mySapModel.PointObj.SetLoadForce(PointName(0), "2", PointLoadValue)
ret = mySapModel.FrameObj.SetLoadDistributed(FrameName(2), "2", 1, 10, 0, 1, 1.8, 1.8)
'assign loading for load pattern 3
ret = mySapModel.FrameObj.GetPoints(FrameName(2), PointName(0), PointName(1))
ReDim PointLoadValue(5)
PointLoadValue(2) = -17.2
PointLoadValue(4) = -54.4
ret = mySapModel.PointObj.SetLoadForce(PointName(1), "3", PointLoadValue)
'assign loading for load pattern 4
ret = mySapModel.FrameObj.SetLoadDistributed(FrameName(1), "4", 1, 11, 0, 1, 2, 2)
'assign loading for load pattern 5
ret = mySapModel.FrameObj.SetLoadDistributed(FrameName(0), "5", 1, 2, 0, 1, 2, 2, "Local")
ret = mySapModel.FrameObj.SetLoadDistributed(FrameName(1), "5", 1, 2, 0, 1, -2, -2, "Local")
'assign loading for load pattern 6
ret = mySapModel.FrameObj.SetLoadDistributed(FrameName(0), "6", 1, 2, 0, 1, 0.9984, 0.3744, "Local")
ret = mySapModel.FrameObj.SetLoadDistributed(FrameName(1), "6", 1, 2, 0, 1, -0.3744, 0, "Local")
'assign loading for load pattern 7
ret = mySapModel.FrameObj.SetLoadPoint(FrameName(1), "7", 1, 2, 0.5, -15, "Local")
'switch to k-in units
ret = mySapModel.SetPresentUnits(eUnits_kip_in_F)
'save model
ret = mySapModel.File.Save(ModelPath)
'run model (this will create the analysis model)
ret = mySapModel.Analyze.RunAnalysis
'initialize for results
Dim SapResult(6) As Double
ret = mySapModel.FrameObj.GetPoints(FrameName(1), PointName(0), PointName(1))
'get results for load patterns 1 through 7
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
For i = 0 To 6
ret = mySapModel.Results.Setup.DeselectAllCasesAndCombosForOutput
ret = mySapModel.Results.Setup.SetCaseSelectedForOutput(Format(i + 1))
If i <= 3 Then
ret = mySapModel.Results.JointDispl(PointName(1), eItemTypeElm_ObjectElm, NumberResults, Obj, Elm, LoadCase, StepType, StepNum, U1, U2, U3, R1, R2, R3)
SapResult(i) = U3(0)
Else
ret = mySapModel.Results.JointDispl(PointName(0), eItemTypeElm_ObjectElm, NumberResults, Obj, Elm, LoadCase, StepType, StepNum, U1, U2, U3, R1, R2, R3)
SapResult(i) = U1(0)
End If
Next i
'close application
mySapObject.ApplicationExit False
Set mySapModel = Nothing
Set mySapObject = Nothing
'fill result strings
Dim SapResultString(6) As String
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)
Dim IndResult(6) As Double
Dim IndResultString(6) As String
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
IndResultString(i) = Format(IndResult(i), "0.00000")
If Left(IndResultString(i), 1) <> "-" Then
IndResultString(i) = " " & IndResultString(i)
End If
Next i
'fill percent difference
Dim PercentDiff(6) As Double
Dim PercentDiffString(6) As String
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
Dim msg As String
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 15.0.1.
Descargar