midas-civil 1.4.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. midas_civil/_BoundaryChangeAssignment.py +278 -0
  2. midas_civil/__init__.py +51 -0
  3. midas_civil/_analysiscontrol.py +585 -0
  4. midas_civil/_boundary.py +888 -0
  5. midas_civil/_construction.py +1004 -0
  6. midas_civil/_element.py +1346 -0
  7. midas_civil/_group.py +337 -0
  8. midas_civil/_load.py +967 -0
  9. midas_civil/_loadcomb.py +159 -0
  10. midas_civil/_mapi.py +249 -0
  11. midas_civil/_material.py +1692 -0
  12. midas_civil/_model.py +522 -0
  13. midas_civil/_movingload.py +1479 -0
  14. midas_civil/_node.py +532 -0
  15. midas_civil/_result_table.py +929 -0
  16. midas_civil/_result_test.py +5455 -0
  17. midas_civil/_section/_TapdbSecSS.py +175 -0
  18. midas_civil/_section/__init__.py +413 -0
  19. midas_civil/_section/_compositeSS.py +283 -0
  20. midas_civil/_section/_dbSecSS.py +164 -0
  21. midas_civil/_section/_offsetSS.py +53 -0
  22. midas_civil/_section/_pscSS copy.py +455 -0
  23. midas_civil/_section/_pscSS.py +822 -0
  24. midas_civil/_section/_tapPSC12CellSS.py +565 -0
  25. midas_civil/_section/_unSupp.py +58 -0
  26. midas_civil/_settlement.py +161 -0
  27. midas_civil/_temperature.py +677 -0
  28. midas_civil/_tendon.py +1016 -0
  29. midas_civil/_thickness.py +147 -0
  30. midas_civil/_utils.py +529 -0
  31. midas_civil/_utilsFunc/__init__.py +0 -0
  32. midas_civil/_utilsFunc/_line2plate.py +636 -0
  33. midas_civil/_view.py +891 -0
  34. midas_civil/_view_trial.py +430 -0
  35. midas_civil/_visualise.py +347 -0
  36. midas_civil-1.4.1.dist-info/METADATA +74 -0
  37. midas_civil-1.4.1.dist-info/RECORD +40 -0
  38. midas_civil-1.4.1.dist-info/WHEEL +5 -0
  39. midas_civil-1.4.1.dist-info/licenses/LICENSE +21 -0
  40. midas_civil-1.4.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,822 @@
1
+ from ._offsetSS import Offset
2
+ from ._offsetSS import _common
3
+ from math import hypot
4
+
5
+
6
+
7
+ class _SS_PSC_12CELL(_common):
8
+ def __init__(self,Name='',Shape='1CEL',Joint=[0,0,0,0,0,0,0,0],
9
+ HO1=0,HO2=0,HO21=0,HO22=0,HO3=0,HO31=0,
10
+ BO1=0,BO11=0,BO12=0,BO2=0,BO21=0,BO3=0,
11
+ HI1=0,HI2=0,HI21=0,HI22=0,HI3=0,HI31=0,HI4=0,HI41=0,HI42=0,HI5=0,
12
+ BI1=0,BI11=0,BI12=0,BI21=0,BI3=0,BI31=0,BI32=0,BI4=0,
13
+ Offset:Offset=Offset.CC(),useShear=True,use7Dof=False,id:int=0):
14
+
15
+ self.ID = id
16
+ self.NAME = Name
17
+ self.SHAPE = Shape
18
+ self.TYPE = 'PSC'
19
+
20
+ self.JO1=bool(Joint[0])
21
+ self.JO2=bool(Joint[1])
22
+ self.JO3=bool(Joint[2])
23
+ self.JI1=bool(Joint[3])
24
+ self.JI2=bool(Joint[4])
25
+ self.JI3=bool(Joint[5])
26
+ self.JI4=bool(Joint[6])
27
+ self.JI5=bool(Joint[7])
28
+
29
+ self.OFFSET = Offset
30
+ self.USESHEAR = bool(useShear)
31
+ self.USE7DOF = bool(use7Dof)
32
+
33
+ self.HO1 = HO1
34
+ self.HO2 = HO2
35
+ self.HO21 = HO21
36
+ self.HO22= HO22
37
+ self.HO3 = HO3
38
+ self.HO31 = HO31
39
+
40
+ self.BO1 = BO1
41
+ self.BO11 = BO11
42
+ self.BO12 = BO12
43
+ self.BO2 = BO2
44
+ self.BO21 = BO21
45
+ self.BO3 = BO3
46
+
47
+ self.HI1 = HI1
48
+ self.HI2 = HI2
49
+ self.HI21 = HI21
50
+ self.HI22 = HI22
51
+ self.HI3 = HI3
52
+ self.HI31 = HI31
53
+ self.HI4 = HI4
54
+ self.HI41 = HI41
55
+ self.HI42 = HI42
56
+ self.HI5 = HI5
57
+
58
+ self.BI1 = BI1
59
+ self.BI11 = BI11
60
+ self.BI12 = BI12
61
+ self.BI21 = BI21
62
+ self.BI3 = BI3
63
+ self.BI31 = BI31
64
+ self.BI32 = BI32
65
+ self.BI4 = BI4
66
+
67
+
68
+ def __str__(self):
69
+ return f' > ID = {self.ID} | PSC 1-2 CELL SECTION \nJSON = {self.toJSON()}\n'
70
+
71
+
72
+ def toJSON(sect):
73
+ js = {
74
+ "SECTTYPE": "PSC",
75
+ "SECT_NAME": sect.NAME,
76
+ "SECT_BEFORE": {
77
+ "SHAPE": sect.SHAPE,
78
+ "SECT_I": {
79
+ "vSIZE_PSC_A": [sect.HO1,sect.HO2,sect.HO21,sect.HO22,sect.HO3,sect.HO31],
80
+ "vSIZE_PSC_B": [sect.BO1,sect.BO11,sect.BO12,sect.BO2,sect.BO21,sect.BO3,],
81
+ "vSIZE_PSC_C": [sect.HI1,sect.HI2,sect.HI21,sect.HI22,sect.HI3,sect.HI31,sect.HI4,sect.HI41,sect.HI42,sect.HI5],
82
+ "vSIZE_PSC_D": [sect.BI1,sect.BI11,sect.BI12,sect.BI21,sect.BI3,sect.BI31,sect.BI32,sect.BI4]
83
+ },
84
+ "WARPING_CHK_AUTO_I": True,
85
+ "WARPING_CHK_AUTO_J": True,
86
+ "SHEAR_CHK": True,
87
+ "WARPING_CHK_POS_I": [[0,0,0,0,0,0],[0,0,0,0,0,0]],
88
+ "WARPING_CHK_POS_J": [[0,0,0,0,0,0],[0,0,0,0,0,0]],
89
+ "USE_AUTO_SHEAR_CHK_POS": [[True,False,True],[False,False,False]],
90
+ "USE_WEB_THICK_SHEAR": [[True, True,True],[False,False,False]],
91
+ "SHEAR_CHK_POS": [[0,0,0],[0,0,0]],
92
+ "USE_WEB_THICK": [True,False],
93
+ "WEB_THICK": [0,0],
94
+ "JOINT": [sect.JO1,sect.JO2,sect.JO3,sect.JI1,sect.JI2,sect.JI3,sect.JI4,sect.JI5]
95
+ }
96
+ }
97
+ js['SECT_BEFORE'].update(sect.OFFSET.JS)
98
+ js['SECT_BEFORE']['USE_SHEAR_DEFORM'] = sect.USESHEAR
99
+ js['SECT_BEFORE']['USE_WARPING_EFFECT'] = sect.USE7DOF
100
+ return js
101
+
102
+
103
+ @staticmethod
104
+ def _objectify(id,name,type,shape,offset,uShear,u7DOF,js):
105
+ #--- PSC 1,2 CELL -------------------
106
+ vA = js['SECT_BEFORE']['SECT_I']['vSIZE_PSC_A']
107
+ vB = js['SECT_BEFORE']['SECT_I']['vSIZE_PSC_B']
108
+ vC = js['SECT_BEFORE']['SECT_I']['vSIZE_PSC_C']
109
+ vD = js['SECT_BEFORE']['SECT_I']['vSIZE_PSC_D']
110
+ joint = js['SECT_BEFORE']['JOINT']
111
+ return _SS_PSC_12CELL(name,shape,joint,
112
+ vA[0],vA[1],vA[2],vA[3],vA[4],vA[5],
113
+ vB[0],vB[1],vB[2],vB[3],vB[4],vB[5],
114
+ vC[0],vC[1],vC[2],vC[3],vC[4],vC[5],vC[6],vC[7],vC[8],vC[9],
115
+ vD[0],vD[1],vD[2],vD[3],vD[4],vD[5],vD[6],vD[7],
116
+ offset,uShear,u7DOF,id)
117
+
118
+ def _centerLine(shape,*args):
119
+ import numpy as np
120
+ if shape.SHAPE in ['1CEL','2CEL'] :
121
+ HO1,HO2,HO21,HO22,HO3,HO31 = shape.HO1,shape.HO2,shape.HO21,shape.HO22,shape.HO3,shape.HO31
122
+ BO1,BO11,BO12,BO2,BO21,BO3 = shape.BO1,shape.BO11,shape.BO12,shape.BO2,shape.BO21,shape.BO3
123
+
124
+ HI1,HI2,HI21,HI22,HI3,HI31,HI4,HI41,HI42,HI5 = shape.HI1,shape.HI2,shape.HI21,shape.HI22,shape.HI3,shape.HI31,shape.HI4,shape.HI41,shape.HI42,shape.HI5
125
+ BI1,BI11,BI12,BI21,BI3,BI31,BI32,BI4 = shape.BI1,shape.BI11,shape.BI12,shape.BI21,shape.BI3,shape.BI31,shape.BI32,shape.BI4
126
+
127
+ JO1,JO2,JO3,JI1,JI2,JI3,JI4,JI5 = shape.JO1,shape.JO2,shape.JO3,shape.JI1,shape.JI2,shape.JI3,shape.JI4,shape.JI5
128
+
129
+
130
+ sect_cg_LT = [-(BO1+BO2+BO3),0]
131
+ sect_cg_RB = [(BO1+BO2+BO3),-(HO1+HO2+HO3)]
132
+ sect_cg_CC = [0,-(HO1+HO2+HO3)/2]
133
+
134
+
135
+
136
+
137
+ def perpendicular_point(pt1,pt2,point, l=0):
138
+ """Function to get orthogonal point on line (x1,y1)-(x2,y2) from point (x3,y3). Enter l=0 for point 3 in between 1 & 2. Enter l=1 for other scenario."""
139
+ x1,y1 = pt1
140
+ x2,y2 = pt2
141
+ x3,y3 = point
142
+
143
+ if x2 != x1:
144
+ m = (y2 - y1) / (x2 - x1)
145
+ c = y1 - m * x1
146
+ x_perp = (x3 + m * (y3 - c)) / (1 + m**2)
147
+ y_perp = m * x_perp + c
148
+ else:
149
+ x_perp, y_perp = x1, y3
150
+
151
+ thk = ((x3 - x_perp)**2 + (y3 - y_perp)**2)**0.5
152
+ return (x_perp, y_perp),thk
153
+
154
+ def distance_point(pt1,pt2):
155
+ x1,y1 = pt1
156
+ x2,y2 = pt2
157
+
158
+ return hypot((x1-x2),(y1-y2))
159
+
160
+
161
+ HTI = HI1+HI2+HI3+HI4+HI5
162
+ HTO = HO1+HO2+HO3
163
+ slope = (HTI-HTO)/(BO1+BO2+BO3)
164
+
165
+
166
+ pt1 = (0,0)
167
+ pt2 = (0,-HI1)
168
+ pt5 = (-BI1,-HI1-HI2)
169
+ pt7 = (-BI3,-HI1-HI2-HI3)
170
+ pt10 = (0,-HI1-HI2-HI3-HI4)
171
+ pt11 = (0,-HTI)
172
+
173
+ pt12 = (-BO3,-HTI)
174
+ pt14 = (-BO3-BO2,(-HTI+HTO)-HO1-HO2)
175
+ pt17 = (-BO3-BO2-BO1,(-HTI+HTO)-HO1)
176
+ pt18 = (-BO3-BO2-BO1,(-HTI+HTO))
177
+
178
+ pt3 = (-BI11,-HI1-HI21)
179
+ pt4 = (-BI12,-HI1-HI22)
180
+
181
+ pt6 = (-BI21,-HI1-HI2-HI31)
182
+
183
+ pt8 = (-BI32,-HI1-HI2-HI3-HI4+HI42)
184
+ pt9 = (-BI31,-HI1-HI2-HI3-HI4+HI41)
185
+
186
+ pt13 = (-BO3-BO21,-HO1-HO2-HO3+HO31)
187
+
188
+ pt15 = (-BO3-BO2-BO1+BO12,(-HTI+HTO)-HO1-HO22)
189
+ pt16 = (-BO3-BO2-BO1+BO11,(-HTI+HTO)-HO1-HO21)
190
+
191
+
192
+ pt016 = (-BO3-BO2-BO1+BO11,slope*(-BO3-BO2-BO1+BO11))
193
+ pt015 = (-BO3-BO2-BO1+BO12,slope*(-BO3-BO2-BO1+BO12))
194
+ pt014 = (-BO3-BO2,slope*(-BO3-BO2))
195
+ pt05 = (-BI1,slope*(-BI1))
196
+ pt04 = (-BI12,slope*(-BI12))
197
+ pt03 = (-BI11,slope*(-BI11))
198
+ # ---------------------- OUTER POINTS ---------------------------
199
+
200
+ # temppt = [pt016,pt015,pt014,pt05,pt04,pt03]
201
+ # points = []
202
+
203
+ # #-------
204
+ # points.append(pt1)
205
+ # points.append(pt2)
206
+ # if JI1 : points.append(pt3)
207
+ # if JI2 : points.append(pt4)
208
+ # points.append(pt5)
209
+ # if JI3 : points.append(pt6)
210
+ # points.append(pt7)
211
+ # if JI4 : points.append(pt8)
212
+ # if JI5 : points.append(pt9)
213
+ # points.append(pt10)
214
+ # points.append(pt11)
215
+ # points.append(pt12)
216
+ # if JO3 : points.append(pt13)
217
+ # points.append(pt14)
218
+ # if JO2 : points.append(pt15)
219
+ # if JO1 : points.append(pt16)
220
+ # points.append(pt17)
221
+ # points.append(pt18)
222
+ # points.append(pt1)
223
+
224
+ # x_values, y_values = zip(*points)
225
+
226
+ # print(x_values)
227
+ # print(y_values)
228
+
229
+ #----------------------------- THICKNESS COMPUTATION --------------
230
+
231
+ THI1 = HI1
232
+ TJI1 = distance_point(pt3,pt03)
233
+ TJI2 = distance_point(pt4,pt04)
234
+ THI2 = distance_point(pt5,pt05)
235
+ THO2 = distance_point(pt14,pt014)
236
+ THO1 = distance_point(pt17,pt18)
237
+ THI3 = (HI4+HI5)
238
+ THI5 = HI5
239
+ TJO1 = distance_point(pt16,pt016)
240
+ TJO2 = distance_point(pt15,pt015)
241
+ TJI4 = (HI5+HI42)
242
+ TJI5 = (HI5+HI41)
243
+
244
+ # ------------------- CENTER LINE POINTS ------------------
245
+
246
+ cp1 = (0,-HI1/2)
247
+
248
+
249
+ # cp2 = (-BI11,(-HI1-HI21)/2) #JI1
250
+ # cp2 = np.add(pt3,pt03)/2
251
+ cp2 = (pt03[0],pt03[1]-0.5*THI1)
252
+
253
+ # cp3 = (-BI12,(-HI1-HI22)/2) #JI2
254
+ # cp3 = np.add(pt4,pt04)/2
255
+ cp3 = (pt04[0],pt04[1]-0.5*THI1)
256
+ # cp4 = (-BI1,(-HI1-HI2)/2)
257
+ # cp4 = np.add(pt5,pt05)/2
258
+ cp4 = (pt05[0],pt05[1]-0.5*THI1)
259
+
260
+ # cp5 = (-BO3-BO2-BO1,-HO1/2)
261
+ cp5 = np.add(pt17,pt18)/2
262
+ # cp6 = (-BO3-BO2-BO1+BO11,(-HO1-HO21)/2) #JO1
263
+ # cp6 = np.add(pt16,pt016)/2
264
+ cp6 = (pt016[0],pt016[1]-0.5*THO1)
265
+ # cp7 = (-BO3-BO2-BO1+BO12,(-HO1-HO22)/2) #JO2
266
+ # cp7 = np.add(pt15,pt015)/2
267
+ cp7 = (pt015[0],pt015[1]-0.5*THO1)
268
+ # cp8 = (-BO3-BO2,(-HO1-HO2)/2)
269
+ # cp8 = np.add(pt14,pt014)/2
270
+ cp8 = (pt014[0],pt014[1]-0.5*THO1)
271
+
272
+ cp9 = np.add(cp8,cp4)/2
273
+
274
+ cp10 = np.add(pt5,pt14)/2
275
+
276
+ cp17 = np.add(pt10,pt11)/2
277
+ cp16 = (-BI31,(-HI1-HI2-HI3-HI4+HI41-HTI)/2) #JI5
278
+ cp15 = (-BI32,(-HI1-HI2-HI3-HI4+HI42-HTI)/2) #JI4
279
+ cp14 = (-BI3,(-HI1-HI2-HI3-HTI)/2)
280
+ cp13 = np.add(pt7,pt12)/2
281
+
282
+
283
+ tpt,TJI3 = perpendicular_point(pt13,pt14,pt6)
284
+ cp11 = np.add(tpt,pt6)/2 #JI3
285
+
286
+
287
+ tpt,TJO3 = perpendicular_point(pt7,pt6,pt13)
288
+ cp12 = np.add(pt7,pt13)/2 #JO3
289
+
290
+
291
+ # if cp12[1] < cp13[1] :
292
+ # print("JO3 invalid")
293
+
294
+
295
+
296
+
297
+
298
+ TX_INT_FLANGE = (THO2+THI2)/2
299
+ tpt,THIO2 = perpendicular_point(pt13,pt14,pt5)
300
+ TY_INT_FLANGE = THIO2
301
+
302
+ TX_BOT_JUNC = hypot(*np.subtract(pt7,pt12))
303
+
304
+ tpt,TY_BOT_JUNC = perpendicular_point(pt13,pt14,pt7)
305
+ # TY_BOT_JUNC = (TY_BOT_JUNC+hypot(*np.subtract(pt7,pt12)))/2
306
+
307
+ TJO3 = max(TJO3,TY_BOT_JUNC)
308
+
309
+
310
+ top_flange_point =[]
311
+ top_flange_line = []
312
+ top_flange_thk = []
313
+ top_flange_thk_off = []
314
+ q=1
315
+ top_flange_point.append(cp1)
316
+ if JI1 :
317
+ top_flange_point.append(cp2)
318
+ top_flange_line.append([q,q+1])
319
+ top_flange_thk.append([THI1,TJI1])
320
+ top_flange_thk_off.append([0,(TJI1-THI1)*0.5])
321
+ q+=1
322
+ if JI2 :
323
+ top_flange_point.append(cp3)
324
+ top_flange_line.append([q,q+1])
325
+ q+=1
326
+ if JI1:
327
+ top_flange_thk.append([TJI1,TJI2])
328
+ top_flange_thk_off.append([(TJI1-THI1)*0.5,(TJI2-THI1)*0.5])
329
+ else :
330
+ top_flange_thk.append([THI1,TJI2])
331
+ top_flange_thk_off.append([0,(TJI2-THI1)*0.5])
332
+ top_flange_point.append(cp4)
333
+ top_flange_line.append([q,q+1])
334
+ q+=1
335
+
336
+ if JI2:
337
+ top_flange_thk.append([TJI2,THI2])
338
+ top_flange_thk_off.append([(TJI2-THI1)*0.5,(THI2-THI1)*0.5])
339
+ elif JI1:
340
+ top_flange_thk.append([TJI1,THI2])
341
+ top_flange_thk_off.append([(TJI1-THI1)*0.5,(THI2-THI1)*0.5])
342
+ else :
343
+ top_flange_thk.append([THI1,THI2])
344
+ top_flange_thk_off.append([0,(THI2-THI1)*0.5])
345
+
346
+
347
+ top_flange_line.append([q,q+1]) # TO CONNECT WITH WEB
348
+ q+=1
349
+ top_flange_thk.append([THI2,TX_INT_FLANGE])
350
+ top_flange_thk_off.append([(THI2-THI1)*0.5,(TX_INT_FLANGE-THI1)*0.5])
351
+
352
+
353
+ # print(top_flange_thk)
354
+
355
+ web_point =[]
356
+ web_line =[]
357
+ web_thk = []
358
+ web_thk_off = []
359
+
360
+ web_point.append(cp9)
361
+ web_point.append(cp10)
362
+ web_line.append([q,q+1])
363
+ q+=1
364
+ web_thk.append([TY_INT_FLANGE,THIO2])
365
+ web_thk_off.append([0,0])
366
+ if JI3 :
367
+ web_point.append(cp11)
368
+ web_line.append([q,q+1])
369
+ q+=1
370
+ web_thk.append([THIO2,TJI3])
371
+ web_thk_off.append([0,0])
372
+ if JO3 : #JO3 and cp12[0] < cp13[0]:
373
+ web_point.append(cp12)
374
+ web_line.append([q,q+1])
375
+ if JI3 :
376
+ web_thk.append([TJI3,TJO3])
377
+ web_thk_off.append([0,0])
378
+ else:
379
+ web_thk.append([THIO2,TJO3])
380
+ web_thk_off.append([0,0])
381
+ q+=1
382
+
383
+ web_point.append(cp13)
384
+ web_line.append([q,q+1])
385
+ if JO3:
386
+ web_thk.append([TJO3,TY_BOT_JUNC])
387
+ web_thk_off.append([0,0])
388
+ elif JI3:
389
+ web_thk.append([TJI3,TY_BOT_JUNC])
390
+ web_thk_off.append([0,0])
391
+ else:
392
+ web_thk.append([THIO2,TY_BOT_JUNC])
393
+ web_thk_off.append([0,0])
394
+ q+=1
395
+
396
+
397
+ bottom_flange_point =[]
398
+ bottom_flange_line =[]
399
+ bottom_flange_thk = []
400
+ bottom_flange_thk_off = []
401
+
402
+ bottom_flange_line.append([q,q+1]) # TO CONNECT WITH WEB
403
+ bottom_flange_thk.append([TY_BOT_JUNC,THI3])
404
+ bottom_flange_thk_off.append([0,0])
405
+ q+=1
406
+ bottom_flange_point.append(cp14)
407
+ if JI4 :
408
+ bottom_flange_point.append(cp15)
409
+ bottom_flange_line.append([q,q+1])
410
+ q+=1
411
+ bottom_flange_thk.append([THI3,TJI4])
412
+ bottom_flange_thk_off.append([0,0])
413
+ if JI5 :
414
+ bottom_flange_point.append(cp16)
415
+ bottom_flange_line.append([q,q+1])
416
+ q+=1
417
+ if JI4:
418
+ bottom_flange_thk.append([TJI4,TJI5])
419
+ bottom_flange_thk_off.append([0,0])
420
+ else:
421
+ bottom_flange_thk.append([THI3,TJI5])
422
+ bottom_flange_thk_off.append([0,0])
423
+ bottom_flange_point.append(cp17)
424
+ bottom_flange_line.append([q,q+1])
425
+ n_cp17 = q+1
426
+ if JI5:
427
+ bottom_flange_thk.append([TJI5,THI5])
428
+ bottom_flange_thk_off.append([0,0])
429
+ elif JI4:
430
+ bottom_flange_thk.append([TJI4,THI5])
431
+ bottom_flange_thk_off.append([0,0])
432
+ else:
433
+ bottom_flange_thk.append([THI3,THI5])
434
+ bottom_flange_thk_off.append([0,0])
435
+ q+=1
436
+
437
+
438
+ top_cantelever_point =[]
439
+ top_cantelever_line =[]
440
+ top_cantelever_thk =[]
441
+ top_cantelever_thk_off =[]
442
+
443
+ top_cantelever_line.append([len(top_flange_point)+1,q+1]) # TO CONNECT WITH WEB
444
+ top_cantelever_thk.append([TX_INT_FLANGE,THO2])
445
+ top_cantelever_thk_off.append([(TX_INT_FLANGE-THO1)*0.5,(THO2-THO1)*0.5])
446
+ q+=1
447
+ top_cantelever_point.append(cp8)
448
+ if JO2 :
449
+ top_cantelever_point.append(cp7)
450
+ top_cantelever_line.append([q,q+1])
451
+ q+=1
452
+ top_cantelever_thk.append([THO2,TJO2])
453
+ top_cantelever_thk_off.append([(THO2-THO1)*0.5,(TJO2-THO1)*0.5])
454
+ if JO1 :
455
+ top_cantelever_point.append(cp6)
456
+ top_cantelever_line.append([q,q+1])
457
+ q+=1
458
+ if JO2:
459
+ top_cantelever_thk.append([TJO2,TJO1])
460
+ top_cantelever_thk_off.append([(TJO2-THO1)*0.5,(TJO1-THO1)*0.5])
461
+ else:
462
+ top_cantelever_thk.append([THO2,TJO1])
463
+ top_cantelever_thk_off.append([(THO2-THO1)*0.5,(TJO1-THO1)*0.5])
464
+ top_cantelever_point.append(cp5)
465
+ top_cantelever_line.append([q,q+1])
466
+ if JO1:
467
+ top_cantelever_thk.append([TJO1,THO1])
468
+ top_cantelever_thk_off.append([(TJO1-THO1)*0.5,0])
469
+ elif JO2:
470
+ top_cantelever_thk.append([TJO2,THO1])
471
+ top_cantelever_thk_off.append([(TJO2-THO1)*0.5,0])
472
+ else:
473
+ top_cantelever_thk.append([THO2,THO1])
474
+ top_cantelever_thk_off.append([(THO2-THO1)*0.5,0])
475
+
476
+
477
+ final_points = top_flange_point+web_point+bottom_flange_point+top_cantelever_point
478
+ final_line = top_flange_line+web_line+bottom_flange_line+top_cantelever_line
479
+ final_thk = top_flange_thk+web_thk+bottom_flange_thk+top_cantelever_thk
480
+ final_thk_off = top_flange_thk_off+web_thk_off+bottom_flange_thk_off+top_cantelever_thk_off
481
+
482
+ n_points = len(final_points)
483
+
484
+ # print(final_points)
485
+
486
+ sect_shape = final_points # SYMMETRY
487
+ for i in range(n_points):
488
+ sect_shape.append((-final_points[i][0],final_points[i][1]))
489
+
490
+
491
+ sect_lin_con = final_line
492
+ sect_thk = final_thk
493
+ sect_thk_off = final_thk_off
494
+
495
+
496
+ for q in range(len(final_line)): # SYMMETRY
497
+ sect_thk.append([final_thk[q][1],final_thk[q][0]])
498
+ sect_thk_off.append([final_thk_off[q][1],final_thk_off[q][0]])
499
+ sect_lin_con.append([final_line[q][1]+n_points,final_line[q][0]+n_points])
500
+
501
+
502
+ if shape.SHAPE == '2CEL':
503
+ sect_lin_con.append([1,n_cp17])
504
+ sect_thk.append([2*BI4,2*BI4])
505
+ sect_thk_off.append([0,0])
506
+
507
+ # sect_thk_off = [0 for _ in sect_thk]
508
+
509
+
510
+
511
+ sect_cg = (sect_cg_LT,sect_cg_CC,sect_cg_RB)
512
+
513
+ return sect_shape, sect_thk ,sect_thk_off, sect_cg , sect_lin_con
514
+
515
+
516
+
517
+
518
+
519
+
520
+
521
+ class _SS_PSC_I(_common):
522
+ def __init__(self,Name='',Symm = True,Joint=[0,0,0,0,0,0,0,0,0],
523
+ H1=0,
524
+ HL1=0,HL2=0,HL21=0,HL22=0,HL3=0,HL4=0,HL41=0,HL42=0,HL5=0,
525
+ BL1=0,BL2=0,BL21=0,BL22=0,BL4=0,BL41=0,BL42=0,
526
+
527
+ HR1=0,HR2=0,HR21=0,HR22=0,HR3=0,HR4=0,HR41=0,HR42=0,HR5=0,
528
+ BR1=0,BR2=0,BR21=0,BR22=0,BR4=0,BR41=0,BR42=0,
529
+
530
+ Offset:Offset=Offset.CC(),useShear=True,use7Dof=False,id:int=0):
531
+
532
+ self.ID = id
533
+ self.NAME = Name
534
+ self.SHAPE = 'PSCI'
535
+ self.TYPE = 'PSC'
536
+
537
+ self.SYMM = bool(Symm)
538
+
539
+ self.J1=bool(Joint[0])
540
+ self.JL1=bool(Joint[1])
541
+ self.JL2=bool(Joint[2])
542
+ self.JL3=bool(Joint[3])
543
+ self.JL4=bool(Joint[4])
544
+
545
+ if self.SYMM:
546
+ self.JR1=bool(Joint[1])
547
+ self.JR2=bool(Joint[2])
548
+ self.JR3=bool(Joint[3])
549
+ self.JR4=bool(Joint[4])
550
+
551
+ self.HR1 = HL1
552
+ self.HR2 = HL2
553
+ self.HR21 = HL21
554
+ self.HR22 = HL22
555
+ self.HR3 = HL3
556
+ self.HR4 = HL4
557
+ self.HR41 = HL41
558
+ self.HR42 = HL42
559
+ self.HR5 = HL5
560
+
561
+ self.BR1 = BL1
562
+ self.BR2 = BL2
563
+ self.BR21 = BL21
564
+ self.BR22 = BL22
565
+ self.BR4 = BL4
566
+ self.BR41 = BL41
567
+ self.BR42 = BL42
568
+ else:
569
+ self.JR1=bool(Joint[5])
570
+ self.JR2=bool(Joint[6])
571
+ self.JR3=bool(Joint[7])
572
+ self.JR4=bool(Joint[8])
573
+
574
+ self.HR1 = HR1
575
+ self.HR2 = HR2
576
+ self.HR21 = HR21
577
+ self.HR22 = HR22
578
+ self.HR3 = HR3
579
+ self.HR4 = HR4
580
+ self.HR41 = HR41
581
+ self.HR42 = HR42
582
+ self.HR5 = HR5
583
+
584
+ self.BR1 = BR1
585
+ self.BR2 = BR2
586
+ self.BR21 = BR21
587
+ self.BR22 = BR22
588
+ self.BR4 = BR4
589
+ self.BR41 = BR41
590
+ self.BR42 = BR42
591
+
592
+ self.OFFSET = Offset
593
+ self.USESHEAR = bool(useShear)
594
+ self.USE7DOF = bool(use7Dof)
595
+
596
+ self.H1 = H1
597
+ self.HL1 = HL1
598
+ self.HL2 = HL2
599
+ self.HL21 = HL21
600
+ self.HL22 = HL22
601
+ self.HL3 = HL3
602
+ self.HL4 = HL4
603
+ self.HL41 = HL41
604
+ self.HL42 = HL42
605
+ self.HL5 = HL5
606
+
607
+ self.BL1 = BL1
608
+ self.BL2 = BL2
609
+ self.BL21 = BL21
610
+ self.BL22 = BL22
611
+ self.BL4 = BL4
612
+ self.BL41 = BL41
613
+ self.BL42 = BL42
614
+
615
+
616
+ def __str__(self):
617
+ return f' > ID = {self.ID} | PSC I SECTION \nJSON = {self.toJSON()}\n'
618
+
619
+
620
+ def toJSON(sect):
621
+ js = {
622
+ "SECTTYPE": "PSC",
623
+ "SECT_NAME": sect.NAME,
624
+ "SECT_BEFORE": {
625
+ "SHAPE": sect.SHAPE,
626
+ "SECT_I": {
627
+ "vSIZE_PSC_A": [sect.H1,sect.HL1,sect.HL2,sect.HL21,sect.HL22,sect.HL3,sect.HL4,sect.HL41,sect.HL42,sect.HL5],
628
+ "vSIZE_PSC_B": [sect.BL1,sect.BL2,sect.BL21,sect.BL22,sect.BL4,sect.BL41,sect.BL42],
629
+ "vSIZE_PSC_C": [sect.HR1,sect.HR2,sect.HR21,sect.HR22,sect.HR3,sect.HR4,sect.HR41,sect.HR42,sect.HR5],
630
+ "vSIZE_PSC_D": [sect.BR1,sect.BR2,sect.BR21,sect.BR22,sect.BR4,sect.BR41,sect.BR42]
631
+ },
632
+ "WARPING_CHK_AUTO_I": True,
633
+ "WARPING_CHK_AUTO_J": True,
634
+ "SHEAR_CHK": True,
635
+ "WARPING_CHK_POS_I": [[0,0,0,0,0,0],[0,0,0,0,0,0]],
636
+ "WARPING_CHK_POS_J": [[0,0,0,0,0,0],[0,0,0,0,0,0]],
637
+ "USE_AUTO_SHEAR_CHK_POS": [[True,False,True],[False,False,False]],
638
+ "USE_WEB_THICK_SHEAR": [[True, True,True],[False,False,False]],
639
+ "SHEAR_CHK_POS": [[0,0,0],[0,0,0]],
640
+ "USE_WEB_THICK": [True,False],
641
+ "WEB_THICK": [0,0],
642
+ "USE_SYMMETRIC" : sect.SYMM,
643
+ "JOINT": [sect.J1,sect.JL1,sect.JL2,sect.JL3,sect.JL4,sect.JR1,sect.JR2,sect.JR3,sect.JR4]
644
+ }
645
+ }
646
+ js['SECT_BEFORE'].update(sect.OFFSET.JS)
647
+ js['SECT_BEFORE']['USE_SHEAR_DEFORM'] = sect.USESHEAR
648
+ js['SECT_BEFORE']['USE_WARPING_EFFECT'] = sect.USE7DOF
649
+ return js
650
+
651
+
652
+ @staticmethod
653
+ def _objectify(id,name,type,shape,offset,uShear,u7DOF,js):
654
+ symm = js['SECT_BEFORE']['USE_SYMMETRIC']
655
+ vA = js['SECT_BEFORE']['SECT_I']['vSIZE_PSC_A']
656
+ vB = js['SECT_BEFORE']['SECT_I']['vSIZE_PSC_B']
657
+ vC = js['SECT_BEFORE']['SECT_I']['vSIZE_PSC_C']
658
+ vD = js['SECT_BEFORE']['SECT_I']['vSIZE_PSC_D']
659
+ joint = js['SECT_BEFORE']['JOINT']
660
+ return _SS_PSC_I(name,symm,joint,
661
+ vA[0],
662
+ vA[1],vA[2],vA[3],vA[4],vA[5],vA[6],vA[7],vA[8],vA[9],
663
+ vB[0],vB[1],vB[2],vB[3],vB[4],vB[5],vB[6],
664
+ vC[0],vC[1],vC[2],vC[3],vC[4],vC[5],vC[6],vC[7],vC[8],
665
+ vD[0],vD[1],vD[2],vD[3],vD[4],vD[5],vD[6],
666
+ offset,uShear,u7DOF,id)
667
+
668
+
669
+
670
+
671
+
672
+
673
+
674
+
675
+
676
+
677
+
678
+
679
+
680
+ def _poly_dir(poly,rot='CCW'):
681
+ import numpy as np
682
+ outer_cg = np.mean(poly,axis=0)
683
+ outer_t = np.subtract(poly,outer_cg)
684
+ dir = 0
685
+ for i in range(len(poly)-1):
686
+ dir+=outer_t[i][0]*outer_t[i+1][1]-outer_t[i][1]*outer_t[i+1][0]
687
+ if dir < 0:
688
+ poly.reverse()
689
+
690
+ if rot == 'CW':
691
+ poly.reverse()
692
+
693
+ return poly
694
+
695
+
696
+
697
+
698
+
699
+
700
+ class _SS_PSC_Value(_common):
701
+ def __init__(self,Name:str,
702
+ OuterPolygon:list,InnerPolygon:list=[],
703
+ Offset:Offset=Offset.CC(),useShear=True,use7Dof=False,id:int=0):
704
+
705
+ '''
706
+ Outer Polygon -> List of points ; Last input is different from first
707
+ [(0,0),(1,0),(1,1),(0,1)]
708
+ Inner Polygon -> List of points ; Last input is different from first
709
+ Only one inner polygon
710
+ '''
711
+
712
+ self.ID = id
713
+ self.NAME = Name
714
+ self.SHAPE = 'VALUE'
715
+ self.TYPE = 'PSC'
716
+
717
+ self.OFFSET = Offset
718
+ self.USESHEAR = bool(useShear)
719
+ self.USE7DOF = bool(use7Dof)
720
+
721
+ self.OUTER_POLYGON = _poly_dir(OuterPolygon)
722
+ self.INNER_POLYGON = []
723
+ self.N_INNER_POLYGON = 0
724
+
725
+ temp_arr = []
726
+
727
+ # Finding no. of internal polygons
728
+ if InnerPolygon != []:
729
+ if not isinstance(InnerPolygon[0][0],(int,float)):
730
+ self.N_INNER_POLYGON = len(InnerPolygon)
731
+ temp_arr = InnerPolygon
732
+
733
+ else:
734
+ temp_arr.append(InnerPolygon) #Convert to list
735
+ self.N_INNER_POLYGON = 1
736
+
737
+ for i in range(len(temp_arr)):
738
+ self.INNER_POLYGON.append(_poly_dir(temp_arr[i],'CW'))
739
+
740
+
741
+ def __str__(self):
742
+ return f' > ID = {self.ID} | PSC VALUE SECTION \nJSON = {self.toJSON()}\n'
743
+
744
+
745
+ def toJSON(sect):
746
+ js = {
747
+ "SECTTYPE": "PSC",
748
+ "SECT_NAME": sect.NAME,
749
+ "CALC_OPT": True,
750
+ "SECT_BEFORE": {
751
+ "SHAPE": "VALU",
752
+ "SECT_I": {
753
+ "SECT_NAME": "",
754
+ "vSIZE": [0.1, 0.1, 0.1, 0.1],
755
+ "OUTER_POLYGON": [
756
+ {
757
+ "VERTEX": [
758
+ {"X": 5, "Y": 5},
759
+ {"X": -5, "Y": 5}
760
+ ]
761
+ }
762
+ ]
763
+ },
764
+ "SHEAR_CHK": True,
765
+ "SHEAR_CHK_POS": [[0.1, 0, 0.1], [0, 0, 0]],
766
+ "USE_AUTO_QY": [[True, True, True], [False, False, False]],
767
+ "WEB_THICK": [0, 0],
768
+ "USE_WEB_THICK_SHEAR": [[True, True, True], [False, False, False]]
769
+ }
770
+ }
771
+
772
+ v_list = []
773
+ for i in sect.OUTER_POLYGON:
774
+ v_list.append({"X":i[0],"Y":i[1]})
775
+ js["SECT_BEFORE"]["SECT_I"]["OUTER_POLYGON"][0]["VERTEX"] =v_list
776
+
777
+
778
+
779
+ if sect.N_INNER_POLYGON > 0 :
780
+
781
+ js["SECT_BEFORE"]["SECT_I"]["INNER_POLYGON"]= []
782
+
783
+ mult_ver = []
784
+ for n in range(sect.N_INNER_POLYGON):
785
+ vi_list = []
786
+
787
+ js["SECT_BEFORE"]["SECT_I"]["INNER_POLYGON"]= [
788
+ {
789
+ "VERTEX": []
790
+ }
791
+ ]
792
+ for i in sect.INNER_POLYGON[n]:
793
+ vi_list.append({"X":i[0],"Y":i[1]})
794
+
795
+ ver_json = {"VERTEX": vi_list}
796
+ mult_ver.append(ver_json)
797
+
798
+ js["SECT_BEFORE"]["SECT_I"]["INNER_POLYGON"] = mult_ver
799
+
800
+ js['SECT_BEFORE'].update(sect.OFFSET.JS)
801
+ js['SECT_BEFORE']['USE_SHEAR_DEFORM'] = sect.USESHEAR
802
+ js['SECT_BEFORE']['USE_WARPING_EFFECT'] = sect.USE7DOF
803
+ return js
804
+
805
+
806
+ @staticmethod
807
+ def _objectify(id,name,type,shape,offset,uShear,u7DOF,js):
808
+
809
+ outer_pt = []
810
+ for pt in js["SECT_BEFORE"]["SECT_I"]["OUTER_POLYGON"][0]["VERTEX"]:
811
+ outer_pt.append((pt['X'],pt['Y']))
812
+
813
+ inner_pt = []
814
+ if 'INNER_POLYGON' in js["SECT_BEFORE"]["SECT_I"]:
815
+ innerJSON = js["SECT_BEFORE"]["SECT_I"]['INNER_POLYGON']
816
+ for n_holes in innerJSON:
817
+ h_pt = []
818
+ for pt in n_holes['VERTEX']:
819
+ h_pt.append([pt['X'],pt['Y']])
820
+ inner_pt.append(h_pt)
821
+
822
+ return _SS_PSC_Value(name,outer_pt,inner_pt,offset,uShear,u7DOF,id)