📄 自动生成结构数据.bas
字号:
Attribute VB_Name = "Module6"
Option Explicit
Sub 自动生成NgnXY()
Dim i, j
Dim s0 As String, s1 As String, Nh As Integer, Ns As Integer
s0 = 0: s1 = 0: Kuatot = 0: Cengtot = 0
s0 = Kua '跨串
s1 = Ceng '层串
Call LxLy(s0, s1)
柱总数 = Cengshu * (Kuashu + 1)
For i = 1 To Kuashu
Kuatot = Kuatot + Lx(i) '单位:米
Next i
For i = 1 To Cengshu
Cengtot = Cengtot + Ly(i)
Next i
Call SetNgnXY
End Sub
Sub LxLy(s0 As String, s1 As String) '从层串跨串中取出总层数和总跨数及各层各跨长
Dim N1, N2, i As Integer, j As Integer
i = 0
Do
N1 = InStr(s0, "*")
N2 = InStr(s0, "+")
For j = 1 To Val(s0)
i = i + 1
Lx(i) = Val(Mid(s0, N1 + 1)) / 1000
Next j
If N2 = 0 Then Exit Do
s0 = Mid$(s0, N2 + 1)
Loop
Kuashu = i
i = 0
Do
N1 = InStr(s1, "*")
N2 = InStr(s1, "+")
For j = 1 To Val(s1)
i = i + 1
Ly(i) = Val(Mid$(s1, N1 + 1)) / 1000 '单位:米
Next j
If N2 = 0 Then Exit Do
s1 = Mid$(s1, N2 + 1)
Loop
Cengshu = i
End Sub
Sub EAI的自动生成()
Dim temp As String, n As Integer, M As Integer, B As Single, H As Single
Dim i As Integer, j As Integer, k As Integer, L As Integer, N1 As Integer
k = 1
For i = 1 To Cengshu '柱 b*hC. 例250*400C20
For j = 1 To Kuashu + 1
temp = CTable(Cengshu + 1 - i, j)
n = InStr(temp, "*")
M = InStr(temp, "C")
N1 = Len(temp)
B = Val(Left$(temp, n - 1))
H = Val(Mid$(temp, n + 1, M - n - 1))
EAI(k, 1) = Elast(Right$(temp, N1 - M + 1)) ' N/mm2
EAI(k, 2) = B / 1000 * H / 1000 '注意单位m2
EAI(k, 3) = B / 1000 * (H / 1000) ^ 3 / 12
BH(k, 1) = B
BH(k, 2) = H
混凝土标号(k) = Right$(temp, N1 - M + 1)
L = Length(k)
EIL(k) = EAI(k, 1) * EAI(k, 3) / L
tuxing1.Command.Text = tuxing1.Command.Text + Str(k) + "单元第" + Str(i) + "层第" + Str(j) + "跨柱" + Str(B) + "×" + Str(H) + vbCrLf
k = k + 1
Next j
Next i
For i = 1 To Cengshu '梁 '250*400C20
For j = 1 To Kuashu
temp = BTable(Cengshu + 1 - i, j)
n = InStr(temp, "*")
M = InStr(temp, "C")
N1 = Len(temp)
B = Val(Left$(temp, n - 1))
H = Val(Mid$(temp, n + 1, M - n - 1))
EAI(k, 1) = Elast(Right$(temp, N1 - M + 1))
EAI(k, 2) = B / 1000 * H / 1000 '注意单位m2
' EAI(k, 3) = B / 1000 * (H / 1000) ^ 3 / 12
BH(k, 1) = B
BH(k, 2) = H
混凝土标号(k) = Right$(temp, N1 - M + 1)
EAI(k, 3) = TLI(k, B, H, Right$(temp, N1 - M + 1))
L = Length(k)
EIL(k) = EAI(k, 1) * EAI(k, 3) / L
tuxing1.Command.Text = tuxing1.Command.Text + Str(k) + "单元第" + Str(i) + "层第" + Str(j) + "跨梁" + Str(B) + "×" + Str(H) + vbCrLf
k = k + 1
Next j
Next i
End Sub
Sub SetNgnXY() '这段程序为梁柱自动生成单元号并存储单元杆端结点号及节点坐标
Dim X As Single '以左下方为起点的横坐标
Dim Y As Single '以左下方为起点的纵坐标
Dim n As Integer '节点计数器
Dim i As Integer, j As Integer
'先将各柱按“从左至右,从下至上”的原则编号,并确定各柱的端点的结点号
Ncell = 1 '计数器,在过程中作单元号
For i = 1 To Cengshu '逐层
For j = 1 To Kuashu + 1 '逐柱
NGN(Ncell, 1) = (Kuashu + 1) * (i - 1) + j
NGN(Ncell, 2) = NGN(Ncell, 1) + Kuashu + 1
Ncell = Ncell + 1
Next j
Next i
' 柱编号后,各梁也按“从左至右,从下至上”的原则接着柱编号,并确定各梁的端点的结点号
For i = 1 To Cengshu '逐层
For j = 1 To Kuashu '逐梁
NGN(Ncell, 1) = i * (Kuashu + 1) + j
NGN(Ncell, 2) = NGN(Ncell, 1) + 1
Ncell = Ncell + 1
Next j
Next i
'节点坐标生成
Ncell = Ncell - 1
' If Ncell <> (kuashu + 1 + kuashu) * cengshu Then Stop '调试时语句
Y = 0 '起点的纵坐标
n = 1 '计数器
For i = 1 To Cengshu + 1
X = 0
For j = 1 To Kuashu + 1
XY(n, 1) = X '记录X方向坐标
XY(n, 2) = Y '记录Y方向坐标
n = n + 1
X = X + Lx(j)
Next j
Y = Y + Ly(i)
Next i
'生成支座力
Nodg = n - 1
If Nodg <> (Kuashu + 1) * (Cengshu + 1) Then Stop
For i = 1 To Ncell '各结点受力清零
For j = 1 To 3
XYM(i, j) = 0
Next j
Next i
End Sub
Function TLI(Ne As Integer, B As Single, H As Single, ci As String)
Dim Hf As Single, Bf As Single, H0 As Single
Dim temp As Single, A1 As Single, A2 As Single
Dim Yc As Single
Hf = Val(钢筋混凝土楼板厚度) / 1000
Bf = Length(Ne) / 3
H0 = (H - 保护层厚度(ci)) / 1000
Select Case Hf / H0
Case Is >= 0.05
temp = B / 1000 + 6 * Hf
Case Is >= 0.1
temp = B / 1000 + 12 * Hf
Case Else
temp = B / 1000
End Select
If Bf > temp Then Bf = temp
A1 = Bf * Hf
A2 = B / 1000 * (H / 1000 - Hf)
Yc = A2 * H / 2000 / (A1 + A2)
TLI = B / 1000 * (H / 1000 - Hf) ^ 3 / 12 + A1 * (H / 2000 - Yc) ^ 2 + Bf / 1000 * (Hf / 1000) ^ 3 / 12 + A2 * Yc ^ 2
End Function
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -