From the outset let me be clear, I am not a programmer. I am sure many of you will be able to look at the code I share and suggest better ways of achieving the same effect as demonstrated in this project. Please feel free to add your comments and experience to help others produce their own solutions.
However, saying that I hope you will be able to see the important points that I am trying to share and that are needed to produce your own VB.NET project.
Over the years, I have used OpenSTAAD in VBA in macros in STAAD.Pro and in Excel. However there are some noticable differnces that need to be observed to successfully use OpenSTAAD in a VB.NET project.
I have created a simple dialog that displays the number and list of beams and load cases in the current STAAD.Pro model.
The project is attached with some comments to indicate the important things that need to be taken into consideration compared to a similar VBA or VB6 project, namely
1) When using Option Strict, (eqiuivalent to OPTION EXPLICIT in VBA/VB6), then late binding is not supported and thus it is not possible to access object members such as would be done with objSTAAD.Geometry.***. Therefore we need to create new variables for these members.
2) Function calls need to be cast to the expected return type, e.g. myBeamCount = CInt(mySTAADGeometry.GetMemberCount)
3) The most important point is that the size of INTEGERS and LONGS have changed and thus where in VBA we would define a varriable as a LONG, in VB.NET, this should now be defined as an INTEGER.
4) Functions that expect arrays, need to have these first cast as OBJECTS, the object passed, and the results cast back to the original array type.
Feel free to add other sample projects or tips to help others.
Regards
Carlos
I have checked your code in VBA and found that the design ratio is not extracted properly due to incorrect variable definition. In your code, you have defined the following variable types--
Dim BeamNumberArray() As Integer Dim mem As Integer
The variable type is not correct. The extracted member number is always 0. You need to change the variable type to Long as --
Dim BeamNumberArray() As Long Dim mem As Long
A snapshot of the code that I have used and the extracted results are attached below --
Hi i am trying to develop code for extracting utilization ratio in staad pro but i am facing little bit of problem while coding please suggest me your opinion Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Dim appXL As Excel.Application Dim wbXl As Excel.Workbook Dim shXL As Excel.Worksheet Dim raXL As Excel.Range ' Start Excel and get Application object. appXL = CreateObject("Excel.Application") appXL.Visible = True wbXl = appXL.Workbooks.Add shXL = wbXl.ActiveSheet Dim objOpenSTAAD As Object Dim lBeamCnt As Integer Dim BeamNumberArray() As Integer Dim mem As Integer Dim pdRatio As Double Dim sBeamMaterialName As String Dim lBeamSectionName As String '' shXL.Range("A4:e10010").ClearContents() objOpenSTAAD = GetObject(, "StaadPro.OpenSTAAD") lBeamCnt = objOpenSTAAD.Geometry.GetMemberCount ReDim Preserve BeamNumberArray(0 To (lBeamCnt - 1)) objOpenSTAAD.Geometry.GetBeamList(BeamNumberArray) For I = 1 To lBeamCnt objOpenSTAAD.Geometry.GetBeamList(BeamNumberArray) Dim X As Double shXL.Cells(I + 3, 1) = BeamNumberArray(I - 1) mem = shXL.Cells(I + 3, 1).Value objOpenSTAAD.Output.GetMemberSteelDesignRatio(mem, pdRatio) shXL.Cells(I + 3, 4) = pdRatio sBeamMaterialName = objOpenSTAAD.Property.GetBeamMaterialName(mem) lBeamSectionName = objOpenSTAAD.Property.GetBeamSectionName(mem) shXL.Cells(I + 3, 2) = sBeamMaterialName shXL.Cells(I + 3, 3) = lBeamSectionName Next I End Sub End Class
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Dim appXL As Excel.Application Dim wbXl As Excel.Workbook Dim shXL As Excel.Worksheet Dim raXL As Excel.Range ' Start Excel and get Application object. appXL = CreateObject("Excel.Application") appXL.Visible = True wbXl = appXL.Workbooks.Add shXL = wbXl.ActiveSheet Dim objOpenSTAAD As Object Dim lBeamCnt As Integer Dim BeamNumberArray() As Integer Dim mem As Integer Dim pdRatio As Double Dim sBeamMaterialName As String Dim lBeamSectionName As String '' shXL.Range("A4:e10010").ClearContents() objOpenSTAAD = GetObject(, "StaadPro.OpenSTAAD") lBeamCnt = objOpenSTAAD.Geometry.GetMemberCount ReDim Preserve BeamNumberArray(0 To (lBeamCnt - 1)) objOpenSTAAD.Geometry.GetBeamList(BeamNumberArray) For I = 1 To lBeamCnt objOpenSTAAD.Geometry.GetBeamList(BeamNumberArray) Dim X As Double shXL.Cells(I + 3, 1) = BeamNumberArray(I - 1) mem = shXL.Cells(I + 3, 1).Value objOpenSTAAD.Output.GetMemberSteelDesignRatio(mem, pdRatio) shXL.Cells(I + 3, 4) = pdRatio sBeamMaterialName = objOpenSTAAD.Property.GetBeamMaterialName(mem) lBeamSectionName = objOpenSTAAD.Property.GetBeamSectionName(mem) shXL.Cells(I + 3, 2) = sBeamMaterialName shXL.Cells(I + 3, 3) = lBeamSectionName Next I End Sub End Class
Note that to make use of the above project, you will need to have a VB.NET IDE such as Microsofts Visual Studio.