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
midas_civil/_tendon.py ADDED
@@ -0,0 +1,1016 @@
1
+
2
+ from ._mapi import MidasAPI
3
+ # from ._utils import *
4
+ from ._load import Load_Case
5
+ from ._group import Group
6
+
7
+
8
+ def _JStoObj_Relax(js):
9
+ rm = js['RM']
10
+ rv = js['RV']
11
+ us = js['US']
12
+ ys = js['YS']
13
+ bRelax = js['bRELAX']
14
+ cff = js['FF']
15
+
16
+ if rm == 9: # CEBFIP 2010 Code
17
+ wtype = js['W_TYPE']
18
+ if wtype:
19
+ return Tendon.Relaxation.CEBFIP_2010(rv,js['TDMFK'],us,ys,cff,0,js['W_ANGLE'])
20
+ else:
21
+ return Tendon.Relaxation.CEBFIP_2010(rv,js['TDMFK'],us,ys,cff,js['WF'],0)
22
+
23
+ elif rm == 8: # CEBFIP 1990 Code
24
+ wtype = js['W_TYPE']
25
+ if wtype:
26
+ return Tendon.Relaxation.CEBFIP_1990(rv,us,ys,cff,0,js['W_ANGLE'])
27
+ else:
28
+ return Tendon.Relaxation.CEBFIP_1990(rv,us,ys,cff,js['WF'],0)
29
+
30
+ elif rm == 1: # CEBFIP 2010 Code
31
+ wtype = js['W_TYPE']
32
+ if wtype:
33
+ return Tendon.Relaxation.CEBFIP_1978(rv,us,ys,cff,0,js['W_ANGLE'])
34
+ else:
35
+ return Tendon.Relaxation.CEBFIP_1978(rv,us,ys,cff,js['WF'],0)
36
+
37
+ elif rm == 5: # European
38
+ wtype = js['W_TYPE']
39
+ if wtype:
40
+ return Tendon.Relaxation.European(rv,us,ys,cff,0,js['W_ANGLE'])
41
+ else:
42
+ return Tendon.Relaxation.European(rv,us,ys,cff,js['WF'],0)
43
+
44
+ elif rm == 4:
45
+ return Tendon.Relaxation.IRC_18(rv,us,ys,cff,js['WF'])
46
+
47
+ elif rm == 7:
48
+ return Tendon.Relaxation.IRC_112(rv,us,ys,cff,js['WF'])
49
+
50
+ elif rm == 0:
51
+ if bRelax:
52
+ return Tendon.Relaxation.Magura(rv,us,ys,cff,js['WF'])
53
+ else: return Tendon.Relaxation.Null(us,ys,cff,js['WF'])
54
+
55
+ else : # If nothing is matched No relaxation is applied
56
+ return Tendon.Relaxation.Null(us,ys,cff,js['WF'])
57
+
58
+ def _JStoObj_Prop(id, js):
59
+ name = js['NAME']
60
+
61
+ if js['TYPE'] == 'INTERNAL' :
62
+ if js['LT'] == 'POST': type = 2
63
+ else : type = 1
64
+ else: type = 3
65
+
66
+
67
+ matID = js['MATL']
68
+ tdn_area = js['AREA']
69
+ duct_dia = js['D_AREA']
70
+ relax = _JStoObj_Relax(js)
71
+ ext_mo = js['ALPHA']
72
+ an_s_b = js['ASB']
73
+ an_s_e = js['ASE']
74
+ bond_type = js['bBONDED']
75
+
76
+ Tendon.Property(name,type,matID,tdn_area,duct_dia,relax,ext_mo,an_s_b,an_s_e,bond_type,id)
77
+
78
+ def _JStoObj_Profile(id,js):
79
+ tdn_id = id
80
+ name = js['NAME']
81
+ tdnProperty = js['TDN_PROP']
82
+ tdn_group = js['TDN_GRUP']
83
+ elem = js['ELEM']
84
+
85
+ inp_type = js['INPUT'] #3D
86
+ curve_type = js['CURVE'] #SPLINE
87
+ ref_axis = js['SHAPE'] #ELEMENT
88
+
89
+ # Common
90
+ st_len_begin = js['BELENG']
91
+ st_len_end = js['ELENG']
92
+
93
+ b_typical_tendon = js['bTP']
94
+ n_typical_tendon = 0
95
+ if b_typical_tendon:
96
+ n_typical_tendon = js['CNT']
97
+
98
+ trans_len_opt = js['LENG_OPT']
99
+ trans_len_begin = js['BLEN']
100
+ trans_len_end = js['ELEN']
101
+
102
+ debon_len_begin = js['DeBondBLEN']
103
+ debon_len_end = js['DeBondELEN']
104
+
105
+
106
+ #Variable initialise to remove errors
107
+ prof_xyz = []
108
+ prof_xy = []
109
+ prof_xz = []
110
+ prof_ins_point_end = 'END-I'
111
+ prof_ins_point_elem = 0
112
+ x_axis_dir_element = 'I-J'
113
+ x_axis_rot_ang = 0
114
+ projection = True
115
+ offset_y = 0
116
+ offset_z = 0
117
+ prof_ins_point = [0, 0, 0]
118
+ x_axis_dir_straight = 'X'
119
+ x_axis_dir_vec = [0, 0]
120
+ grad_rot_axis = 'X'
121
+ grad_rot_ang = 0
122
+ radius_cen = [0, 0]
123
+ offset = 0
124
+ dir = 'CW'
125
+
126
+
127
+ #3D - SPLINE - ROUND is bFIX , R is not considered
128
+ if inp_type == '3D' :
129
+ prof_xyz = []
130
+ json_profile_arr = js['PROF']
131
+
132
+ for i in range(len(json_profile_arr)):
133
+ prof_xyz.append([json_profile_arr[i]['PT'][0],json_profile_arr[i]['PT'][1],json_profile_arr[i]['PT'][2]])
134
+
135
+
136
+
137
+ #2D
138
+ elif inp_type == '2D' :
139
+ prof_xy = []
140
+ prof_xz = []
141
+ json_profileY_arr = js['PROFY']
142
+ json_profileZ_arr = js['PROFZ']
143
+
144
+ for i in range(len(json_profileY_arr)):
145
+ prof_xy.append([json_profileY_arr[i]['PT'][0],json_profileY_arr[i]['PT'][1]])
146
+
147
+ for i in range(len(json_profileZ_arr)):
148
+ prof_xz.append([json_profileZ_arr[i]['PT'][0],json_profileZ_arr[i]['PT'][1]])
149
+
150
+
151
+ # ELEMENT
152
+ if ref_axis == 'ELEMENT' :
153
+
154
+ prof_ins_point_end = js['INS_PT']
155
+ prof_ins_point_elem = js['INS_ELEM']
156
+ x_axis_dir_element = js['AXIS_IJ']
157
+ x_axis_rot_ang =js['XAR_ANGLE']
158
+ projection = js['bPJ']
159
+ offset_y = js['OFF_YZ'][0]
160
+ offset_z = js['OFF_YZ'][1]
161
+
162
+ elif ref_axis == 'STRAIGHT' :
163
+ prof_ins_point = js['IP']
164
+ x_axis_dir_straight = js['AXIS']
165
+ x_axis_dir_vec = js['VEC']
166
+ x_axis_rot_ang =js['XAR_ANGLE']
167
+ projection = js['bPJ']
168
+ grad_rot_axis = js['GR_AXIS']
169
+ grad_rot_ang = js['GR_ANGLE']
170
+
171
+ elif ref_axis == 'CURVE' :
172
+ prof_ins_point = js['IP']
173
+ radius_cen = js['RC']
174
+ offset = js['OFFSET']
175
+ dir = js['DIR']
176
+ x_axis_rot_ang =js['XAR_ANGLE']
177
+ projection = js['bPJ']
178
+ grad_rot_axis = js['GR_AXIS']
179
+ grad_rot_ang = js['GR_ANGLE']
180
+
181
+
182
+ Tendon.Profile(name,tdnProperty,tdn_group,elem,inp_type,curve_type,st_len_begin,st_len_end,n_typical_tendon,
183
+ trans_len_opt,trans_len_begin,trans_len_end,debon_len_begin,debon_len_end,ref_axis,
184
+ prof_xyz,prof_xy,prof_xz,prof_ins_point,prof_ins_point_elem,x_axis_dir_element,x_axis_rot_ang,
185
+ projection,offset_y,offset_z,prof_ins_point,x_axis_dir_straight,x_axis_dir_vec,grad_rot_axis,grad_rot_ang,radius_cen,offset,dir,tdn_id)
186
+
187
+
188
+
189
+ class _POINT_ : # Local class to store points
190
+ def __init__(self,x,y,z):
191
+ self.X = x
192
+ self.Y = y
193
+ self.Z = z
194
+
195
+ def __str__(self):
196
+ return str(self.X , self.Y, self.Z)
197
+
198
+ #5 Class to create nodes
199
+ class Tendon:
200
+
201
+ @staticmethod
202
+ def create():
203
+ if Tendon.Property.properties!=[]:
204
+ Tendon.Property.create()
205
+ if Tendon.Profile.profiles !=[]:
206
+ Tendon.Profile.create()
207
+ if Tendon.Prestress.loads !=[]:
208
+ Tendon.Prestress.create()
209
+
210
+ @staticmethod
211
+ def clear():
212
+ Tendon.Property.clear()
213
+ Tendon.Profile.clear()
214
+ Tendon.Prestress.clear()
215
+
216
+
217
+ class Relaxation:
218
+
219
+ class CEBFIP_2010:
220
+
221
+ def __init__(self,rho,rel_class,ult_st,yield_st,curv_fric_fac=0,wob_fric_fac=0,unint_ang_disp=0):
222
+ '''
223
+ rel_class = 1 Slow | 2 Mean | 3 Rapid
224
+ '''
225
+ self.CODE = 'CEB FIP-2010'
226
+ self.RHO = rho
227
+ self.CLASS = rel_class
228
+
229
+ self.ULT_ST = ult_st
230
+ self.YIELD_ST = yield_st
231
+ self.CURV_FF = curv_fric_fac
232
+ self.WOBBLE_FF = wob_fric_fac
233
+
234
+ self.UNINT_AD = unint_ang_disp
235
+
236
+ def json(self):
237
+ bs_json ={
238
+ "RM" : 9,
239
+ "RV" : self.RHO,
240
+ "TDMFK" : self.CLASS,
241
+ "US" : self.ULT_ST,
242
+ "YS" : self.YIELD_ST,
243
+ "FF" : self.CURV_FF,
244
+ "WF" : self.WOBBLE_FF,
245
+ }
246
+
247
+ if self.UNINT_AD != 0:
248
+ bs_json.update({"W_TYPE" : 1 , "W_ANGLE" : self.UNINT_AD})
249
+
250
+ return bs_json
251
+
252
+ def __str__(self):
253
+ return str(self.__dict__)
254
+
255
+ class CEBFIP_1978:
256
+
257
+ def __init__(self,rho,ult_st,yield_st,curv_fric_fac=0,wob_fric_fac=0,unint_ang_disp=0):
258
+ '''
259
+ rel_class = 1 Slow | 2 Mean | 3 Rapid
260
+ '''
261
+ self.CODE = 'CEB FIP-1978'
262
+ self.RHO = rho
263
+
264
+ self.ULT_ST = ult_st
265
+ self.YIELD_ST = yield_st
266
+ self.CURV_FF = curv_fric_fac
267
+ self.WOBBLE_FF = wob_fric_fac
268
+
269
+ self.UNINT_AD = unint_ang_disp
270
+
271
+ def json(self):
272
+ bs_json ={
273
+ "RM" : 1,
274
+ "RV" : self.RHO,
275
+ "US" : self.ULT_ST,
276
+ "YS" : self.YIELD_ST,
277
+ "FF" : self.CURV_FF,
278
+ "WF" : self.WOBBLE_FF,
279
+ }
280
+
281
+ if self.UNINT_AD != 0:
282
+ bs_json.update({"W_TYPE" : 1 , "W_ANGLE" : self.UNINT_AD})
283
+
284
+ return bs_json
285
+
286
+ def __str__(self):
287
+ return str(self.__dict__)
288
+
289
+ class CEBFIP_1990:
290
+
291
+ def __init__(self,rho,ult_st,yield_st,curv_fric_fac=0,wob_fric_fac=0,unint_ang_disp=0):
292
+ '''
293
+ rel_class = 1 Slow | 2 Mean | 3 Rapid
294
+ '''
295
+ self.CODE = 'CEB FIP-1990'
296
+ self.RHO = rho
297
+
298
+ self.ULT_ST = ult_st
299
+ self.YIELD_ST = yield_st
300
+ self.CURV_FF = curv_fric_fac
301
+ self.WOBBLE_FF = wob_fric_fac
302
+
303
+ self.UNINT_AD = unint_ang_disp
304
+
305
+ def json(self):
306
+ bs_json ={
307
+ "RM" : 8,
308
+ "RV" : self.RHO,
309
+ "US" : self.ULT_ST,
310
+ "YS" : self.YIELD_ST,
311
+ "FF" : self.CURV_FF,
312
+ "WF" : self.WOBBLE_FF,
313
+ }
314
+
315
+ if self.UNINT_AD != 0:
316
+ bs_json.update({"W_TYPE" : 1 , "W_ANGLE" : self.UNINT_AD})
317
+
318
+ return bs_json
319
+
320
+ def __str__(self):
321
+ return str(self.__dict__)
322
+
323
+ class European:
324
+
325
+ def __init__(self,rel_class,ult_st,yield_st,curv_fric_fac=0,wob_fric_fac=0,unint_ang_disp=0):
326
+ '''
327
+ rel_class = 1 Ordinary | 2 Low | 3 HotRolled
328
+ '''
329
+ self.CODE = 'European'
330
+ self.CLASS = rel_class
331
+
332
+ self.ULT_ST = ult_st
333
+ self.YIELD_ST = yield_st
334
+ self.CURV_FF = curv_fric_fac
335
+ self.WOBBLE_FF = wob_fric_fac
336
+
337
+ self.UNINT_AD = unint_ang_disp
338
+
339
+ def json(self):
340
+ bs_json ={
341
+ "RM" : 5,
342
+ "RV" : self.CLASS,
343
+ "US" : self.ULT_ST,
344
+ "YS" : self.YIELD_ST,
345
+ "FF" : self.CURV_FF,
346
+ "WF" : self.WOBBLE_FF,
347
+ }
348
+
349
+ if self.UNINT_AD != 0:
350
+ bs_json.update({"W_TYPE" : 1 , "W_ANGLE" : self.UNINT_AD})
351
+
352
+ return bs_json
353
+
354
+ def __str__(self):
355
+ return str(self.__dict__)
356
+
357
+ class IRC_18:
358
+
359
+ def __init__(self,factor,ult_st,yield_st,curv_fric_fac=0,wob_fric_fac=0):
360
+
361
+ self.CODE = 'IRC:18-2000'
362
+
363
+ self.FACTOR = factor
364
+
365
+ self.ULT_ST = ult_st
366
+ self.YIELD_ST = yield_st
367
+ self.CURV_FF = curv_fric_fac
368
+ self.WOBBLE_FF = wob_fric_fac
369
+
370
+ def json(self):
371
+ bs_json ={
372
+ "RM" : 4,
373
+ "RV" : self.FACTOR,
374
+ "US" : self.ULT_ST,
375
+ "YS" : self.YIELD_ST,
376
+ "FF" : self.CURV_FF,
377
+ "WF" : self.WOBBLE_FF
378
+ }
379
+ return bs_json
380
+
381
+ def __str__(self):
382
+ return str(self.__dict__)
383
+
384
+ class IRC_112:
385
+
386
+ def __init__(self,factor,ult_st,yield_st,curv_fric_fac=0,wob_fric_fac=0):
387
+
388
+ self.CODE = 'IRC:112-2011'
389
+
390
+
391
+ self.FACTOR = factor
392
+
393
+ self.ULT_ST = ult_st
394
+ self.YIELD_ST = yield_st
395
+ self.CURV_FF = curv_fric_fac
396
+ self.WOBBLE_FF = wob_fric_fac
397
+
398
+ def json(self):
399
+ bs_json ={
400
+ "RM" : 7,
401
+ "RV" : self.FACTOR,
402
+ "US" : self.ULT_ST,
403
+ "YS" : self.YIELD_ST,
404
+ "FF" : self.CURV_FF,
405
+ "WF" : self.WOBBLE_FF
406
+ }
407
+ return bs_json
408
+
409
+ def __str__(self):
410
+ return str(self.__dict__)
411
+
412
+ class Null:
413
+
414
+ def __init__(self,ult_st,yield_st,curv_fric_fac=0,wob_fric_fac=0):
415
+
416
+ self.CODE = 'No Relaxation'
417
+
418
+ self.ULT_ST = ult_st
419
+ self.YIELD_ST = yield_st
420
+ self.CURV_FF = curv_fric_fac
421
+ self.WOBBLE_FF = wob_fric_fac
422
+
423
+ def json(self):
424
+ bs_json ={
425
+ "RM" : 0,
426
+ "RV" : 0,
427
+ "US" : self.ULT_ST,
428
+ "YS" : self.YIELD_ST,
429
+ "FF" : self.CURV_FF,
430
+ "WF" : self.WOBBLE_FF,
431
+ "bRELAX" : False
432
+ }
433
+ return bs_json
434
+
435
+ def __str__(self):
436
+ return str(self.__dict__)
437
+
438
+ class Magura:
439
+
440
+ def __init__(self,factor,ult_st,yield_st,curv_fric_fac=0,wob_fric_fac=0):
441
+
442
+ self.CODE = 'Magura'
443
+
444
+ if factor not in [10,45]:
445
+ factor = 45
446
+
447
+ self.FACTOR = factor
448
+
449
+ self.ULT_ST = ult_st
450
+ self.YIELD_ST = yield_st
451
+ self.CURV_FF = curv_fric_fac
452
+ self.WOBBLE_FF = wob_fric_fac
453
+
454
+ def json(self):
455
+ bs_json ={
456
+ "RM" : 0,
457
+ "RV" : self.FACTOR,
458
+ "US" : self.ULT_ST,
459
+ "YS" : self.YIELD_ST,
460
+ "FF" : self.CURV_FF,
461
+ "WF" : self.WOBBLE_FF
462
+ }
463
+ return bs_json
464
+
465
+ def __str__(self):
466
+ return str(self.__dict__)
467
+
468
+ # ----------------- TENDON PROPERTY --------------------------
469
+ class Property:
470
+ properties =[]
471
+ ids = []
472
+
473
+ def __init__(self,name,type,matID:int,tdn_area,duct_dia,relaxation,ext_mom_mag=0,anch_slip_begin=0,anch_slip_end=0,bond_type:bool=True,id=None):
474
+
475
+ '''
476
+ type = ['Internal (Pre-tension)' , 'Internal (Post-tenstion)' , 'External'] => 1,2,3
477
+ '''
478
+ if Tendon.Property.ids == []:
479
+ tp_count = 1
480
+ else:
481
+ tp_count = max(Tendon.Property.ids)+1
482
+
483
+ if id == None : self.ID = tp_count
484
+ if id != None : self.ID = id
485
+
486
+ self.NAME = name
487
+
488
+ if type == 2:
489
+ self.TYPE = 'INTERNAL'
490
+ self.TENS = 'POST'
491
+ elif type == 3:
492
+ self.TYPE = 'EXTERNAL'
493
+ self.TENS = 'PRE'
494
+ else :
495
+ self.TYPE = 'INTERNAL'
496
+ self.TENS = 'PRE'
497
+
498
+ self.MAT = matID
499
+ self.TDN_AREA = tdn_area
500
+ self.DUCT_DIA = duct_dia
501
+
502
+ self.RELAX = relaxation
503
+
504
+ self.EXT_MOM_MAG = ext_mom_mag
505
+ self.ANC_SLIP_B = anch_slip_begin
506
+ self.ANC_SLIP_E = anch_slip_end
507
+ self.BOND_TYPE = bond_type
508
+
509
+ Tendon.Property.properties.append(self)
510
+ Tendon.Property.ids.append(self.ID)
511
+
512
+ @classmethod
513
+ def json(cls):
514
+ json = {"Assign":{}}
515
+
516
+ for self in cls.properties:
517
+ json['Assign'][self.ID]={
518
+ "NAME" : self.NAME,
519
+ "TYPE" : self.TYPE,
520
+ "LT" : self.TENS,
521
+ "MATL" : self.MAT,
522
+ "AREA" : self.TDN_AREA,
523
+ "D_AREA" : self.DUCT_DIA,
524
+ "ASB" : self.ANC_SLIP_B,
525
+ "ASE" : self.ANC_SLIP_E,
526
+ "bBONDED" : self.BOND_TYPE,
527
+ "ALPHA" : self.EXT_MOM_MAG
528
+ }
529
+ json['Assign'][self.ID].update(self.RELAX.json())
530
+
531
+ return json
532
+
533
+ @classmethod
534
+ def create(cls):
535
+ MidasAPI("PUT","/db/TDNT",cls.json())
536
+
537
+
538
+ @classmethod
539
+ def get(cls):
540
+ return MidasAPI('GET','/db/TDNT')
541
+
542
+ @classmethod
543
+ def delete(cls):
544
+ MidasAPI("DELETE","/db/TDNT")
545
+ cls.clear()
546
+
547
+ @classmethod
548
+ def clear(cls):
549
+ cls.properties = []
550
+ cls.ids = []
551
+
552
+
553
+ @classmethod
554
+ def sync(cls):
555
+ a = cls.get()
556
+ if a != {'message': ''}:
557
+ if list(a['TDNT'].keys()) != []:
558
+ cls.properties = []
559
+ cls.ids=[]
560
+ for id in a['TDNT'].keys():
561
+ _JStoObj_Prop(int(id),a['TDNT'][id])
562
+
563
+
564
+ # ----------------- TENDON PROFILE --------------------------
565
+ class Profile:
566
+ profiles =[]
567
+ ids=[]
568
+
569
+ def __init__(self,name,tdn_prop,tdn_group=0,elem=[],inp_type='3D',curve_type = 'SPLINE',st_len_begin = 0 , st_len_end = 0,n_typical_tendon=0,
570
+ trans_len_opt='USER', trans_len_begin = 0 , trans_len_end = 0, debon_len_begin=0 , debon_len_end=0,
571
+ ref_axis = 'ELEMENT',
572
+ prof_xyz = [], prof_xy =[],prof_xz=[],
573
+ prof_ins_point_end = 'END-I', prof_ins_point_elem = 0, x_axis_dir_element = 'I-J', x_axis_rot_ang = 0 , projection = True, offset_y = 0 , offset_z = 0,
574
+ prof_ins_point =[0,0,0], x_axis_dir_straight = 'X' , x_axis_dir_vec = [0,0], grad_rot_axis = 'X', grad_rot_ang=0,
575
+ radius_cen = [0,0], offset = 0, dir = 'CW',
576
+ id=None):
577
+ '''
578
+ TDN GROUP = Group ID
579
+ '''
580
+
581
+
582
+
583
+ if Tendon.Profile.ids == []:
584
+ td_count = 1
585
+ else:
586
+ td_count = max(Tendon.Profile.ids)+1
587
+
588
+ if id == None : self.ID = td_count
589
+ else : self.ID = id
590
+
591
+ self.NAME = name
592
+ self.PROP = tdn_prop
593
+ self.GROUP = tdn_group
594
+ self.ELEM = elem
595
+
596
+ if inp_type not in ['2D' , '3D']: inp_type = '3D'
597
+ self.INPUT = inp_type
598
+
599
+ if curve_type not in ['SPLINE' , 'ROUND']: curve_type = 'ROUND'
600
+ self.CURVE = curve_type
601
+
602
+ self.BELENG = st_len_begin
603
+ self.ELENG = st_len_end
604
+
605
+
606
+ self.CNT = n_typical_tendon
607
+ if n_typical_tendon > 0:
608
+ self.bTP = True
609
+ else: self.bTP = False
610
+
611
+ if trans_len_opt not in ['USER' , 'AUTO']: trans_len_opt = 'USER'
612
+ self.LENG_OPT = trans_len_opt
613
+ self.BLEN = trans_len_begin
614
+ self.ELEN = trans_len_end
615
+
616
+ self.DeBondBLEN = debon_len_begin
617
+ self.DeBondELEN = debon_len_end
618
+
619
+ if ref_axis not in ['ELEMENT' , 'STRAIGHT' , 'CURVE']: ref_axis = 'ELEMENT'
620
+ self.SHAPE = ref_axis
621
+
622
+ #------- ELEMENT TYPE -------------
623
+
624
+ if prof_ins_point_end not in ['END-I' , 'END-J']: prof_ins_point_end = 'END-I'
625
+ self.INS_PT = prof_ins_point_end
626
+
627
+ if prof_ins_point_elem == 0: prof_ins_point_elem = elem[0]
628
+ self.INS_ELEM = prof_ins_point_elem
629
+
630
+ if x_axis_dir_element not in ['I-J' , 'J-I']: x_axis_dir_element = 'I-J'
631
+ self.AXIS_IJ = x_axis_dir_element
632
+
633
+ self.XAR_ANGLE = x_axis_rot_ang # common in straight
634
+ self.bPJ = projection # common in straight
635
+
636
+ self.OFF_YZ = [offset_y,offset_z]
637
+
638
+ #------- STRAIGHT TYPE -------------
639
+
640
+ self.IP = prof_ins_point
641
+
642
+ if x_axis_dir_straight not in ['X' , 'Y' , 'VECTOR']: x_axis_dir_straight = 'X'
643
+ self.AXIS = x_axis_dir_straight
644
+
645
+ self.VEC = x_axis_dir_vec
646
+
647
+
648
+ if grad_rot_axis not in ['X' , 'Y']: grad_rot_axis = 'X'
649
+ self.GR_AXIS = grad_rot_axis
650
+
651
+ self.GR_ANGLE = grad_rot_ang
652
+
653
+ #------- CURVE TYPE -------------
654
+
655
+ self.RC = radius_cen
656
+ self.OFFSET = offset
657
+
658
+ if dir not in ['CW' , 'CCW']: dir = 'CW'
659
+ self.DIR = dir
660
+
661
+
662
+
663
+ #--------------- PROFILES CREATION -----------------
664
+
665
+ #----- 3D Profile (Round + Spline) -------------
666
+ xyz_loc = []
667
+ bFix = []
668
+ R_spline3d = []
669
+ R_round3d = []
670
+
671
+ for point in prof_xyz:
672
+ xyz_loc.append(_POINT_(point[0],point[1],point[2]))
673
+ bFix.append(False) # Default not defining here
674
+ if curve_type == 'SPLINE':
675
+ R_spline3d.append([0,0]) # Default not defining here
676
+ else:
677
+ R_round3d.append(0)
678
+
679
+ self.P_XYZ = xyz_loc
680
+
681
+ self.bFIX = bFix
682
+ self.R = R_spline3d
683
+ self.RADIUS = R_round3d
684
+
685
+
686
+
687
+ #----- 2D Profile Spline (only)-------------
688
+ xy_loc = []
689
+ xz_loc = []
690
+
691
+ bFix_y = []
692
+ bFix_z = []
693
+
694
+ R_spline2d_Rz = []
695
+ R_spline2d_Ry = []
696
+
697
+ for point in prof_xy:
698
+ xy_loc.append(_POINT_(point[0],point[1],0))
699
+ bFix_y.append(False) # Default not defining here
700
+ R_spline2d_Rz.append(0)
701
+
702
+ for point in prof_xz:
703
+ xz_loc.append(_POINT_(point[0],0,point[1]))
704
+ bFix_z.append(False) # Default not defining here
705
+ R_spline2d_Ry.append(0)
706
+
707
+
708
+ self.P_XY = xy_loc
709
+ self.P_XZ = xz_loc
710
+
711
+ self.bFIX_XY = bFix_y
712
+ self.bFIX_XZ = bFix_z
713
+
714
+ self.R_XY = R_spline2d_Rz
715
+ self.R_XZ = R_spline2d_Ry
716
+
717
+
718
+ Tendon.Profile.profiles.append(self)
719
+ Tendon.Profile.ids.append(self.ID)
720
+
721
+ def update_profile(self,points_xyz):
722
+ xyz_loc = []
723
+ bFix = []
724
+ R_spline3d = []
725
+ R_round3d = []
726
+
727
+ for point in points_xyz:
728
+ xyz_loc.append(_POINT_(point[0],point[1],point[2]))
729
+ bFix.append(False) # Default not defining here
730
+ R_spline3d.append([0,0]) # Default not defining here
731
+
732
+ self.P_XYZ = xyz_loc
733
+ self.INPUT = '3D'
734
+ self.CURVE = 'SPLINE'
735
+ self.SHAPE = 'STRAIGHT'
736
+
737
+ self.bFIX = bFix
738
+ self.R = R_spline3d
739
+ self.RADIUS = R_round3d
740
+
741
+ @classmethod
742
+ def json(cls):
743
+
744
+ json = {"Assign":{}}
745
+
746
+ for self in cls.profiles:
747
+ json["Assign"][self.ID] = {
748
+ 'NAME' : self.NAME,
749
+ 'TDN_PROP' : self.PROP,
750
+ 'ELEM' : self.ELEM,
751
+ 'BELENG' : self.BELENG,
752
+ 'ELENG' : self.ELENG,
753
+ 'CURVE' : self.CURVE,
754
+ 'INPUT' : self.INPUT,
755
+ 'TDN_GRUP' : self.GROUP,
756
+ "LENG_OPT": self.LENG_OPT,
757
+ "BLEN": self.BLEN,
758
+ "ELEN": self.ELEN,
759
+ "bTP": self.bTP,
760
+ "CNT": self.CNT,
761
+ "DeBondBLEN": self.DeBondBLEN,
762
+ "DeBondELEN": self.DeBondELEN,
763
+ "SHAPE": self.SHAPE
764
+ }
765
+ # -------------------------------- 2D OR 3D (ROUND/SPLINE)--------------------------
766
+ if self.INPUT == '3D':
767
+
768
+ # -------- 3D ------------
769
+ array_temp = []
770
+
771
+ # -------- 3D SPLINE & ROUND ------------
772
+ if self.CURVE == 'ROUND' :
773
+ for j in range(len(self.P_XYZ)):
774
+ array_temp.append({
775
+ 'PT' : [self.P_XYZ[j].X,self.P_XYZ[j].Y,self.P_XYZ[j].Z],
776
+ 'bFIX' : self.bFIX[j],
777
+ 'RADIUS' : self.RADIUS[j]
778
+ })
779
+ else:
780
+ for j in range(len(self.P_XYZ)):
781
+ array_temp.append({
782
+ 'PT' : [self.P_XYZ[j].X,self.P_XYZ[j].Y,self.P_XYZ[j].Z],
783
+ 'bFIX' : self.bFIX[j],
784
+ 'R' : self.R[j]
785
+ })
786
+
787
+
788
+
789
+
790
+ # --- 3D Main ----
791
+
792
+ json_prof = {
793
+ "PROF":array_temp
794
+ }
795
+
796
+ elif self.INPUT == '2D':
797
+
798
+ # -------- 2D ------------
799
+ array_y_temp = []
800
+ array_z_temp = []
801
+
802
+ # -------- 2D ONLY SPLINE NOT ROUND ❌ ------------
803
+
804
+ for j in range(len(self.P_XY)):
805
+ array_y_temp.append({
806
+ 'PT' : [self.P_XY[j].X,self.P_XY[j].Y],
807
+ 'bFIX' : self.bFIX_XY[j],
808
+ 'R' : self.R_XY[j]
809
+ })
810
+
811
+ for j in range(len(self.P_XZ)):
812
+ array_z_temp.append({
813
+ 'PT' : [self.P_XZ[j].X,self.P_XZ[j].Z],
814
+ 'bFIX' : self.bFIX_XZ[j],
815
+ 'R' : self.R_XZ[j]
816
+ })
817
+
818
+
819
+ # --- 3D Main ----
820
+
821
+ json_prof = {
822
+ "PROFY":array_y_temp,
823
+ "PROFZ":array_z_temp
824
+ }
825
+
826
+ # ------------------------------------------- TYPE (ELEMNENT , STRAIGHT , CURVE) ------------------------------------
827
+
828
+ # ----- 3D Spline Element--------
829
+ if self.SHAPE == 'ELEMENT' :
830
+ json_shape={
831
+ "INS_PT": self.INS_PT,
832
+ "INS_ELEM": self.INS_ELEM,
833
+ "AXIS_IJ": self.AXIS_IJ,
834
+ "XAR_ANGLE": self.XAR_ANGLE,
835
+ "bPJ": self.bPJ,
836
+ "OFF_YZ": self.OFF_YZ,
837
+ }
838
+
839
+ # ----- 3D Spline Straight --------
840
+ elif self.SHAPE == 'STRAIGHT' :
841
+ json_shape={
842
+ "IP" : self.IP,
843
+ "AXIS" : self.AXIS,
844
+ "VEC" : self.VEC,
845
+ "XAR_ANGLE": self.XAR_ANGLE,
846
+ "bPJ": self.bPJ,
847
+ "GR_AXIS": self.GR_AXIS,
848
+ "GR_ANGLE": self.GR_ANGLE,
849
+ }
850
+
851
+ # ----- 3D Spline Curve --------
852
+ elif self.SHAPE == 'CURVE' :
853
+ json_shape={
854
+ "IP" : self.IP,
855
+ "RC" : self.RC,
856
+ "OFFSET" : self.OFFSET,
857
+ "DIR" : self.DIR,
858
+ "XAR_ANGLE": self.XAR_ANGLE,
859
+ "bPJ": self.bPJ,
860
+ "GR_AXIS": self.GR_AXIS,
861
+ "GR_ANGLE": self.GR_ANGLE,
862
+ }
863
+
864
+ json["Assign"][self.ID].update(json_shape)
865
+ json["Assign"][self.ID].update(json_prof)
866
+
867
+ return json
868
+
869
+
870
+ @classmethod
871
+ def create(cls):
872
+ MidasAPI("PUT","/db/TDNA",cls.json())
873
+
874
+
875
+ @classmethod
876
+ def get(cls):
877
+ return MidasAPI('GET','/db/TDNA')
878
+
879
+ @classmethod
880
+ def delete(cls):
881
+ cls.clear()
882
+ return MidasAPI('DELETE','/db/TDNA')
883
+
884
+ @classmethod
885
+ def clear(cls):
886
+ cls.profiles=[]
887
+ cls.ids=[]
888
+
889
+ @classmethod
890
+ def sync(cls):
891
+ a = cls.get()
892
+ if a != {'message': ''}:
893
+ if list(a['TDNA'].keys()) != []:
894
+ cls.profiles = []
895
+ cls.ids=[]
896
+ for id in a['TDNA'].keys():
897
+ _JStoObj_Profile(int(id),a['TDNA'][id])
898
+
899
+ # --------------------- END CLASSS -----------------------------------------------------
900
+
901
+
902
+ class Prestress:
903
+ """Prestress Loading for Tendons.
904
+ """
905
+ loads = []
906
+ ids = []
907
+ def __init__(self, profile_name, load_case, load_group = "", prestress_type = "STRESS", jack_step = "BEGIN", jack_begin = 0, jack_end=0, grouting_stage = 0, id = None):
908
+
909
+ if id == None: id = 0
910
+ if id > -1 :
911
+ chk = 0
912
+ for i in Load_Case.cases:
913
+ if load_case in i.NAME: chk = 1
914
+ if chk == 0: Load_Case("PS", load_case)
915
+ if load_group != "":
916
+ chk = 0
917
+ a = [v['NAME'] for v in Group.Load.json()["Assign"].values()]
918
+ if load_group in a: chk = 1
919
+ if chk == 0: Group.Load(load_group)
920
+
921
+
922
+ if prestress_type not in ['STRESS' , 'FORCE']: prestress_type = 'STRESS'
923
+ if jack_step not in ['BEGIN' , 'END' , 'BOTH']: jack_step = 'BEGIN'
924
+
925
+ self.TDN_ID = 0
926
+ if id == 0: id = len(Tendon.Prestress.loads) + 1
927
+ self.ID = id
928
+ else:
929
+ self.TDN_ID = -id//100000
930
+ self.ID = -id%100000
931
+
932
+
933
+ self.TDN_NAME = profile_name
934
+
935
+ self.LCNAME = load_case
936
+ self.LDGR = load_group
937
+ self.TYPE =prestress_type
938
+ self.ORDER = jack_step
939
+
940
+ self.JACK_BEGIN = jack_begin
941
+ self.JACK_END = jack_end
942
+ self.GROUTING = grouting_stage
943
+
944
+
945
+
946
+ Tendon.Prestress.loads.append(self)
947
+ Tendon.Prestress.ids.append(self.ID)
948
+
949
+
950
+ @classmethod
951
+ def json(cls):
952
+ json = {"Assign": {}}
953
+ for self in cls.loads:
954
+
955
+ # Finding Tendon ID
956
+ tdn_id = self.TDN_ID
957
+ if not self.TDN_ID :
958
+ tdn_check=0
959
+ for prof in Tendon.Profile.profiles:
960
+ if prof.NAME == self.TDN_NAME:
961
+ tdn_id = prof.ID
962
+ tdn_check=1
963
+ break
964
+ if not tdn_check:
965
+ print(f'⚠️ "{self.TDN_NAME}" Tendon name is not found for Prestress load application. Prestress load skipped.\n📑 Try Tendon.Profile.sync() to retrieve Profile Names first')
966
+ continue
967
+
968
+
969
+ if tdn_id not in list(json["Assign"].keys()):
970
+ json["Assign"][tdn_id] = {"ITEMS": []}
971
+
972
+ json["Assign"][tdn_id]["ITEMS"].append({
973
+ "ID": self.ID,
974
+ "LCNAME": self.LCNAME,
975
+ "GROUP_NAME": self.LDGR,
976
+ "TENDON_NAME": self.TDN_NAME,
977
+ "TYPE": self.TYPE,
978
+ "ORDER": self.ORDER,
979
+ "BEGIN": self.JACK_BEGIN,
980
+ "END": self.JACK_END,
981
+ "GROUTING": self.GROUTING
982
+ })
983
+ return json
984
+
985
+ @classmethod
986
+ def create(cls):
987
+ MidasAPI("PUT", "/db/TDPL",cls.json())
988
+
989
+ @classmethod
990
+ def get(cls):
991
+ return MidasAPI("GET", "/db/TDPL")
992
+
993
+ @classmethod
994
+ def delete(cls):
995
+ cls.clear()
996
+ return MidasAPI("DELETE", "/db/TDPL")
997
+
998
+ @classmethod
999
+ def clear(cls):
1000
+ cls.loads=[]
1001
+
1002
+ @classmethod
1003
+ def sync(cls):
1004
+ cls.loads = []
1005
+ a = cls.get()
1006
+ if a != {'message': ''}:
1007
+ for i in a['TDPL'].keys():
1008
+ for j in range(len(a['TDPL'][i]['ITEMS'])):
1009
+ Tendon.Prestress(a['TDPL'][i]['ITEMS'][j]['TENDON_NAME'],a['TDPL'][i]['ITEMS'][j]['LCNAME']
1010
+ ,a['TDPL'][i]['ITEMS'][j]['GROUP_NAME']
1011
+ ,a['TDPL'][i]['ITEMS'][j]['TYPE']
1012
+ ,a['TDPL'][i]['ITEMS'][j]['ORDER']
1013
+ ,a['TDPL'][i]['ITEMS'][j]['BEGIN']
1014
+ ,a['TDPL'][i]['ITEMS'][j]['END']
1015
+ ,a['TDPL'][i]['ITEMS'][j]['GROUTING']
1016
+ ,-(100000*int(i)+int(a['TDPL'][i]['ITEMS'][j]['ID'])))