midas-civil 1.0.3__py3-none-any.whl → 1.0.5__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.

Potentially problematic release.


This version of midas-civil might be problematic. Click here for more details.

midas_civil/_section.py DELETED
@@ -1,994 +0,0 @@
1
- from ._mapi import *
2
- import numpy as np
3
-
4
-
5
- def _poly_dir(poly,rot='CCW'):
6
- outer_cg = np.mean(poly,axis=0)
7
- outer_t = np.subtract(poly,outer_cg)
8
- dir = 0
9
- for i in range(len(poly)-1):
10
- dir+=outer_t[i][0]*outer_t[i+1][1]-outer_t[i][1]*outer_t[i+1][0]
11
- if dir < 0:
12
- poly.reverse()
13
-
14
- if rot == 'CW':
15
- poly.reverse()
16
-
17
- return poly
18
-
19
-
20
-
21
- def _SectionADD(self):
22
- # Commom HERE ---------------------------------------------
23
- id = int(self.ID)
24
- if Section.ids == []:
25
- count = 1
26
- else:
27
- count = max(Section.ids)+1
28
-
29
- if id==0 :
30
- self.ID = count
31
- Section.sect.append(self)
32
- Section.ids.append(int(self.ID))
33
- elif id in Section.ids:
34
- self.ID=int(id)
35
- print(f'⚠️ Section with ID {id} already exist! It will be replaced.')
36
- index=Section.ids.index(id)
37
- Section.sect[index]=self
38
- else:
39
- self.ID=id
40
- Section.sect.append(self)
41
- Section.ids.append(int(self.ID))
42
- # Common END -------------------------------------------------------
43
-
44
-
45
- def _updateSect(self):
46
- js2s = {'Assign':{self.ID : _Obj2JS(self)}}
47
- MidasAPI('PUT','/db/sect',js2s)
48
- return js2s
49
-
50
-
51
- def _Obj2JS(sect):
52
-
53
- js={}
54
-
55
- if sect.TYPE == 'DBUSER':
56
- if sect.DATATYPE == 2:
57
- #--- DB SECTION ---------------------------------------
58
- js = {
59
- "SECTTYPE": "DBUSER",
60
- "SECT_NAME": sect.NAME,
61
- "SECT_BEFORE": {
62
- "SHAPE": sect.SHAPE,
63
- "DATATYPE": sect.DATATYPE,
64
- "SECT_I": {
65
- "vSIZE": sect.PARAMS
66
- }
67
- }
68
- }
69
- #--- PSC 1-2 Cell ---------------------------------------
70
- elif sect.TYPE == 'PSC':
71
- if sect.SHAPE in ['1CEL','2CEL']:
72
- js = {
73
- "SECTTYPE": "PSC",
74
- "SECT_NAME": sect.NAME,
75
- "SECT_BEFORE": {
76
- "SHAPE": sect.SHAPE,
77
- "SECT_I": {
78
- "vSIZE_PSC_A": [sect.HO1,sect.HO2,sect.HO21,sect.HO22,sect.HO3,sect.HO31],
79
- "vSIZE_PSC_B": [sect.BO1,sect.BO11,sect.BO12,sect.BO2,sect.BO21,sect.BO3,],
80
- "vSIZE_PSC_C": [sect.HI1,sect.HI2,sect.HI21,sect.HI22,sect.HI3,sect.HI31,sect.HI4,sect.HI41,sect.HI42,sect.HI5],
81
- "vSIZE_PSC_D": [sect.BI1,sect.BI11,sect.BI12,sect.BI21,sect.BI3,sect.BI31,sect.BI32,sect.BI4]
82
- },
83
- "WARPING_CHK_AUTO_I": True,
84
- "WARPING_CHK_AUTO_J": True,
85
- "SHEAR_CHK": True,
86
- "WARPING_CHK_POS_I": [[0,0,0,0,0,0],[0,0,0,0,0,0]],
87
- "WARPING_CHK_POS_J": [[0,0,0,0,0,0],[0,0,0,0,0,0]],
88
- "USE_AUTO_SHEAR_CHK_POS": [[True,False,True],[False,False,False]],
89
- "USE_WEB_THICK_SHEAR": [[True, True,True],[False,False,False]],
90
- "SHEAR_CHK_POS": [[0,0,0],[0,0,0]],
91
- "USE_WEB_THICK": [True,False],
92
- "WEB_THICK": [0,0],
93
- "JOINT": [sect.JO1,sect.JO2,sect.JO3,sect.JI1,sect.JI2,sect.JI3,sect.JI4,sect.JI5]
94
- }
95
- }
96
-
97
- elif sect.SHAPE in ['PSCI']:
98
- js = {
99
- "SECTTYPE": "PSC",
100
- "SECT_NAME": sect.NAME,
101
- "SECT_BEFORE": {
102
- "SHAPE": sect.SHAPE,
103
- "SECT_I": {
104
- "vSIZE_PSC_A": [sect.H1,sect.HL1,sect.HL2,sect.HL21,sect.HL22,sect.HL3,sect.HL4,sect.HL41,sect.HL42,sect.HL5],
105
- "vSIZE_PSC_B": [sect.BL1,sect.BL2,sect.BL21,sect.BL22,sect.BL4,sect.BL41,sect.BL42],
106
- "vSIZE_PSC_C": [sect.HR1,sect.HR2,sect.HR21,sect.HR22,sect.HR3,sect.HR4,sect.HR41,sect.HR42,sect.HR5],
107
- "vSIZE_PSC_D": [sect.BR1,sect.BR2,sect.BR21,sect.BR22,sect.BR4,sect.BR41,sect.BR42]
108
- },
109
- "WARPING_CHK_AUTO_I": True,
110
- "WARPING_CHK_AUTO_J": True,
111
- "SHEAR_CHK": True,
112
- "WARPING_CHK_POS_I": [[0,0,0,0,0,0],[0,0,0,0,0,0]],
113
- "WARPING_CHK_POS_J": [[0,0,0,0,0,0],[0,0,0,0,0,0]],
114
- "USE_AUTO_SHEAR_CHK_POS": [[True,False,True],[False,False,False]],
115
- "USE_WEB_THICK_SHEAR": [[True, True,True],[False,False,False]],
116
- "SHEAR_CHK_POS": [[0,0,0],[0,0,0]],
117
- "USE_WEB_THICK": [True,False],
118
- "WEB_THICK": [0,0],
119
- "USE_SYMMETRIC" : sect.SYMM,
120
- "JOINT": [sect.J1,sect.JL1,sect.JL2,sect.JL3,sect.JL4,sect.JR1,sect.JR2,sect.JR3,sect.JR4]
121
- }
122
- }
123
- elif sect.SHAPE in ['VALUE']:
124
- js = {
125
- "SECTTYPE": "PSC",
126
- "SECT_NAME": sect.NAME,
127
- "CALC_OPT": True,
128
- "SECT_BEFORE": {
129
- "SHAPE": "VALU",
130
- "SECT_I": {
131
- "SECT_NAME": "",
132
- "vSIZE": [0.1, 0.1, 0.1, 0.1],
133
- "OUTER_POLYGON": [
134
- {
135
- "VERTEX": [
136
- {"X": 5, "Y": 5},
137
- {"X": -5, "Y": 5}
138
- ]
139
- }
140
- ]
141
- },
142
- "SHEAR_CHK": True,
143
- "SHEAR_CHK_POS": [[0.1, 0, 0.1], [0, 0, 0]],
144
- "USE_AUTO_QY": [[True, True, True], [False, False, False]],
145
- "WEB_THICK": [0, 0],
146
- "USE_WEB_THICK_SHEAR": [[True, True, True], [False, False, False]]
147
- }
148
- }
149
-
150
- v_list = []
151
- for i in sect.OUTER_POLYGON:
152
- v_list.append({"X":i[0],"Y":i[1]})
153
- js["SECT_BEFORE"]["SECT_I"]["OUTER_POLYGON"][0]["VERTEX"] =v_list
154
-
155
-
156
-
157
- if sect.N_INNER_POLYGON > 0 :
158
-
159
- js["SECT_BEFORE"]["SECT_I"]["INNER_POLYGON"]= []
160
-
161
- mult_ver = []
162
- for n in range(sect.N_INNER_POLYGON):
163
- vi_list = []
164
-
165
- js["SECT_BEFORE"]["SECT_I"]["INNER_POLYGON"]= [
166
- {
167
- "VERTEX": []
168
- }
169
- ]
170
- for i in sect.INNER_POLYGON[n]:
171
- vi_list.append({"X":i[0],"Y":i[1]})
172
-
173
- ver_json = {"VERTEX": vi_list}
174
- mult_ver.append(ver_json)
175
-
176
- js["SECT_BEFORE"]["SECT_I"]["INNER_POLYGON"] = mult_ver
177
-
178
-
179
-
180
-
181
-
182
-
183
-
184
- elif sect.TYPE == 'COMPOSITE':
185
- if sect.SHAPE in ['CI']:
186
- js = {
187
- "SECTTYPE": sect.TYPE,
188
- "SECT_NAME": sect.NAME,
189
- "SECT_BEFORE": {
190
- "SHAPE": sect.SHAPE,
191
- "SECT_I": {
192
- "vSIZE_PSC_A": [sect.H1,sect.HL1,sect.HL2,sect.HL21,sect.HL22,sect.HL3,sect.HL4,sect.HL41,sect.HL42,sect.HL5],
193
- "vSIZE_PSC_B": [sect.BL1,sect.BL2,sect.BL21,sect.BL22,sect.BL4,sect.BL41,sect.BL42],
194
- "vSIZE_PSC_C": [sect.HR1,sect.HR2,sect.HR21,sect.HR22,sect.HR3,sect.HR4,sect.HR41,sect.HR42,sect.HR5],
195
- "vSIZE_PSC_D": [sect.BR1,sect.BR2,sect.BR21,sect.BR22,sect.BR4,sect.BR41,sect.BR42]
196
- },
197
- "WARPING_CHK_AUTO_I": True,
198
- "WARPING_CHK_AUTO_J": True,
199
- "SHEAR_CHK": True,
200
- "WARPING_CHK_POS_I": [[0,0,0,0,0,0],[0,0,0,0,0,0]],
201
- "WARPING_CHK_POS_J": [[0,0,0,0,0,0],[0,0,0,0,0,0]],
202
- "USE_AUTO_SHEAR_CHK_POS": [[True,False,True],[False,False,False]],
203
- "USE_WEB_THICK_SHEAR": [[True, True,True],[False,False,False]],
204
- "SHEAR_CHK_POS": [[0,0,0],[0,0,0]],
205
- "USE_WEB_THICK": [True,False],
206
- "WEB_THICK": [0,0],
207
- "JOINT": [sect.J1,sect.JL1,sect.JL2,sect.JL3,sect.JL4,sect.JR1,sect.JR2,sect.JR3,sect.JR4],
208
- "MATL_ELAST": sect.MATL_ELAST,
209
- "MATL_DENS": sect.MATL_DENS,
210
- "MATL_POIS_S": sect.MATL_POIS_S,
211
- "MATL_POIS_C": sect.MATL_POIS_C,
212
- "MATL_THERMAL": sect.MATL_THERMAL,
213
- "USE_MULTI_ELAST": sect.USE_MULTI_ELAST,
214
- "LONGTERM_ESEC": sect.LONGTERM_ESEC,
215
- "SHRINK_ESEC": sect.SHRINK_ESEC,
216
- },
217
- "SECT_AFTER": {
218
- "SLAB": [sect.BC,sect.TC,sect.HH]
219
- }
220
- }
221
- elif sect.SHAPE in ['I']:
222
- js = {
223
- "SECTTYPE": sect.TYPE,
224
- "SECT_NAME": sect.NAME,
225
- "SECT_BEFORE": {
226
- "SHAPE": sect.SHAPE,
227
- "SECT_I": {
228
- "vSIZE": [sect.HW,sect.TW,sect.B1,sect.TF1,sect.B2,sect.TF2],
229
- },
230
-
231
- "MATL_ELAST": sect.MATL_ELAST,
232
- "MATL_DENS": sect.MATL_DENS,
233
- "MATL_POIS_S": sect.MATL_POIS_S,
234
- "MATL_POIS_C": sect.MATL_POIS_C,
235
- "MATL_THERMAL": sect.MATL_THERMAL,
236
- "USE_MULTI_ELAST": sect.USE_MULTI_ELAST,
237
- "LONGTERM_ESEC": sect.LONGTERM_ESEC,
238
- "SHRINK_ESEC": sect.SHRINK_ESEC,
239
- },
240
- "SECT_AFTER": {
241
- "SLAB": [sect.BC,sect.TC,sect.HH]
242
- }
243
- }
244
-
245
-
246
-
247
-
248
- #--- COMMON FOR ALL SECTIONS ---------------------------------------
249
- js['SECT_BEFORE'].update(sect.OFFSET.JS)
250
- js['SECT_BEFORE']['USE_SHEAR_DEFORM'] = sect.USESHEAR
251
- js['SECT_BEFORE']['USE_WARPING_EFFECT'] = sect.USE7DOF
252
- return js
253
-
254
-
255
-
256
- def _JS2Obj(id,js):
257
- name = js['SECT_NAME']
258
- type = js['SECTTYPE']
259
- shape = js['SECT_BEFORE']['SHAPE']
260
- offset = off_JS2Obj(js['SECT_BEFORE'])
261
- uShear = js['SECT_BEFORE']['USE_SHEAR_DEFORM']
262
- u7DOF = js['SECT_BEFORE']['USE_WARPING_EFFECT']
263
-
264
- if type == 'DBUSER':
265
- if js['SECT_BEFORE']['DATATYPE'] ==2:
266
- #--- USER DEFINED SECTIONS (STANDARD) -------------------
267
- Section.DBUSER(name,shape,js['SECT_BEFORE']['SECT_I']['vSIZE'],offset,uShear,u7DOF,id)
268
-
269
- elif type == 'PSC':
270
- if shape in ['1CEL','2CEL']:
271
- #--- PSC 1,2 CELL -------------------
272
- vA = js['SECT_BEFORE']['SECT_I']['vSIZE_PSC_A']
273
- vB = js['SECT_BEFORE']['SECT_I']['vSIZE_PSC_B']
274
- vC = js['SECT_BEFORE']['SECT_I']['vSIZE_PSC_C']
275
- vD = js['SECT_BEFORE']['SECT_I']['vSIZE_PSC_D']
276
- joint = js['SECT_BEFORE']['JOINT']
277
- Section.PSC.CEL12(name,shape,joint,
278
- vA[0],vA[1],vA[2],vA[3],vA[4],vA[5],
279
- vB[0],vB[1],vB[2],vB[3],vB[4],vB[5],
280
- vC[0],vC[1],vC[2],vC[3],vC[4],vC[5],vC[6],vC[7],vC[8],vC[9],
281
- vD[0],vD[1],vD[2],vD[3],vD[4],vD[5],vD[6],vD[7],
282
- offset,uShear,u7DOF,id)
283
- elif shape in ['PSCI']:
284
- #--- PSC I -------------------
285
- symm = js['SECT_BEFORE']['USE_SYMMETRIC']
286
- vA = js['SECT_BEFORE']['SECT_I']['vSIZE_PSC_A']
287
- vB = js['SECT_BEFORE']['SECT_I']['vSIZE_PSC_B']
288
- vC = js['SECT_BEFORE']['SECT_I']['vSIZE_PSC_C']
289
- vD = js['SECT_BEFORE']['SECT_I']['vSIZE_PSC_D']
290
- joint = js['SECT_BEFORE']['JOINT']
291
- Section.PSC.I(name,symm,joint,
292
- vA[0],
293
- vA[1],vA[2],vA[3],vA[4],vA[5],vA[6],vA[7],vA[8],vA[9],
294
- vB[0],vB[1],vB[2],vB[3],vB[4],vB[5],vB[6],
295
- vC[0],vC[1],vC[2],vC[3],vC[4],vC[5],vC[6],vC[7],vC[8],
296
- vD[0],vD[1],vD[2],vD[3],vD[4],vD[5],vD[6],
297
- offset,uShear,u7DOF,id)
298
- elif type == 'COMPOSITE':
299
- if shape in ['CI']:
300
- vA = js['SECT_BEFORE']['SECT_I']['vSIZE_PSC_A']
301
- vB = js['SECT_BEFORE']['SECT_I']['vSIZE_PSC_B']
302
- vC = js['SECT_BEFORE']['SECT_I']['vSIZE_PSC_C']
303
- vD = js['SECT_BEFORE']['SECT_I']['vSIZE_PSC_D']
304
- joint = js['SECT_BEFORE']['JOINT']
305
- slab = js['SECT_AFTER']['SLAB']
306
- secti = js['SECT_BEFORE']
307
-
308
- try: e1 = js['SECT_BEFORE']['LONGTERM_ESEC']
309
- except: e1 = 0
310
- try: e2 = js['SECT_BEFORE']['SHRINK_ESEC']
311
- except: e2 = 0
312
-
313
-
314
- Section.Composite.PSCI(name,False,joint,
315
- slab[0],slab[1],slab[2],
316
- vA[0],
317
- vA[1],vA[2],vA[3],vA[4],vA[5],vA[6],vA[7],vA[8],vA[9],
318
- vB[0],vB[1],vB[2],vB[3],vB[4],vB[5],vB[6],
319
- vC[0],vC[1],vC[2],vC[3],vC[4],vC[5],vC[6],vC[7],vC[8],
320
- vD[0],vD[1],vD[2],vD[3],vD[4],vD[5],vD[6],
321
- secti['MATL_ELAST'],secti['MATL_DENS'],secti['MATL_POIS_S'],secti['MATL_POIS_C'],secti['MATL_THERMAL'],
322
- secti['USE_MULTI_ELAST'],e1,e2,
323
- offset,uShear,u7DOF,id)
324
- if shape in ['I']:
325
- vS = js['SECT_BEFORE']['SECT_I']['vSIZE']
326
- slab = js['SECT_AFTER']['SLAB']
327
- secti = js['SECT_BEFORE']
328
-
329
- try: e1 = js['SECT_BEFORE']['LONGTERM_ESEC']
330
- except: e1 = 0
331
- try: e2 = js['SECT_BEFORE']['SHRINK_ESEC']
332
- except: e2 = 0
333
-
334
-
335
- Section.Composite.SteelI_Type1(name,
336
- slab[0],slab[1],slab[2],
337
- vS[0],vS[1],vS[2],vS[3],vS[4],vS[5],
338
- secti['MATL_ELAST'],secti['MATL_DENS'],secti['MATL_POIS_S'],secti['MATL_POIS_C'],secti['MATL_THERMAL'],
339
- secti['USE_MULTI_ELAST'],e1,e2,
340
- offset,uShear,u7DOF,id)
341
-
342
-
343
-
344
-
345
- class Offset:
346
- def __init__(self,OffsetPoint='CC',CenterLocation=0,HOffset=0,HOffOpt=0,VOffset=0,VOffOpt=0,UsrOffOpt=0):
347
-
348
- # self.OFFSET_PT =OffsetPoint
349
- # self.OFFSET_CENTER =CenterLocation
350
- # self.HORZ_OFFSET_OPT = HOffOpt
351
- # self.USERDEF_OFFSET_YI = HOffset
352
- # self.USERDEF_OFFSET_YJ = HOffset
353
- # self.VERT_OFFSET_OPT = VOffOpt
354
- # self.USERDEF_OFFSET_ZI = VOffset
355
- # self.USERDEF_OFFSET_ZJ = VOffset
356
- # self.USER_OFFSET_REF = UsrOffOpt
357
-
358
- self.JS = {
359
- "OFFSET_PT": OffsetPoint,
360
- "OFFSET_CENTER": CenterLocation,
361
-
362
- "USER_OFFSET_REF": UsrOffOpt,
363
- "HORZ_OFFSET_OPT": HOffOpt,
364
- "USERDEF_OFFSET_YI": HOffset,
365
-
366
- "USERDEF_OFFSET_YJ": HOffset, #Tapered only
367
-
368
- "VERT_OFFSET_OPT": VOffOpt,
369
- "USERDEF_OFFSET_ZI": VOffset,
370
-
371
- "USERDEF_OFFSET_ZJ": VOffset, #Tapered only
372
- }
373
-
374
-
375
- def __str__(self):
376
- return str(self.JS)
377
-
378
-
379
- @staticmethod
380
- def CC():
381
- return Offset()
382
-
383
- @staticmethod
384
- def CT():
385
- return Offset('CT')
386
-
387
-
388
- def off_JS2Obj(js):
389
-
390
- # self.USERDEF_OFFSET_YJ = HOffset
391
-
392
- # self.USERDEF_OFFSET_ZJ = VOffset
393
-
394
- try: OffsetPoint = js['OFFSET_PT']
395
- except: OffsetPoint='CC'
396
-
397
- try: CenterLocation = js['OFFSET_CENTER']
398
- except: CenterLocation=0
399
-
400
- try: HOffset = js['USERDEF_OFFSET_YI']
401
- except: HOffset=0
402
-
403
- try: HOffOpt = js['HORZ_OFFSET_OPT']
404
- except: HOffOpt=0
405
-
406
- try: VOffOpt = js['VERT_OFFSET_OPT']
407
- except: VOffOpt=0
408
-
409
- try: VOffset = js['USERDEF_OFFSET_ZI']
410
- except: VOffset=0
411
-
412
- try: UsrOffOpt = js['USER_OFFSET_REF']
413
- except: UsrOffOpt=0
414
-
415
-
416
- return Offset(OffsetPoint,CenterLocation,HOffset,HOffOpt,VOffset,VOffOpt,UsrOffOpt)
417
-
418
-
419
-
420
-
421
- class _common:
422
- def __str__(self):
423
- return str(f'ID = {self.ID} \nJSON : {_Obj2JS(self)}\n')
424
-
425
- def update(self):
426
- return _updateSect(self)
427
-
428
-
429
- class Section:
430
- """Create Sections \n Use Section.USER , Section.PSC to create sections"""
431
- sect = []
432
- ids = []
433
-
434
-
435
- @classmethod
436
- def json(cls):
437
- json = {"Assign":{}}
438
- for sect in cls.sect:
439
- js = _Obj2JS(sect)
440
- json["Assign"][sect.ID] = js
441
- return json
442
-
443
- @staticmethod
444
- def create():
445
- MidasAPI("PUT","/db/SECT",Section.json())
446
-
447
- @staticmethod
448
- def get():
449
- return MidasAPI("GET","/db/SECT")
450
-
451
-
452
- @staticmethod
453
- def delete():
454
- MidasAPI("DELETE","/db/SECT")
455
- Section.sect=[]
456
- Section.ids=[]
457
-
458
-
459
- @staticmethod
460
- def sync():
461
- a = Section.get()
462
- if a != {'message': ''}:
463
- if list(a['SECT'].keys()) != []:
464
- Section.sect = []
465
- Section.ids=[]
466
- for sect_id in a['SECT'].keys():
467
- _JS2Obj(sect_id,a['SECT'][sect_id])
468
-
469
-
470
- # --------------------------------- USER DEFINED SECTIONS --------------------------------------------------------------
471
-
472
- class DBUSER(_common):
473
-
474
- """ Create Standard USER DEFINED sections"""
475
-
476
- def __init__(self,Name='',Shape='',parameters:list=[],Offset:Offset=Offset.CC(),useShear=True,use7Dof=False,id:int=0):
477
- """ Shape = 'SB' 'SR' for rectangle \n For cylinder"""
478
- self.ID = id
479
- self.NAME = Name
480
- self.TYPE = 'DBUSER'
481
- self.SHAPE = Shape
482
- self.PARAMS = parameters
483
- self.OFFSET = Offset
484
- self.USESHEAR = useShear
485
- self.USE7DOF = use7Dof
486
- self.DATATYPE = 2
487
-
488
- _SectionADD(self)
489
-
490
- class PSC:
491
-
492
- class CEL12(_common):
493
-
494
- def __init__(self,Name='',Shape='1CEL',Joint=[0,0,0,0,0,0,0,0],
495
- HO1=0,HO2=0,HO21=0,HO22=0,HO3=0,HO31=0,
496
- BO1=0,BO11=0,BO12=0,BO2=0,BO21=0,BO3=0,
497
- HI1=0,HI2=0,HI21=0,HI22=0,HI3=0,HI31=0,HI4=0,HI41=0,HI42=0,HI5=0,
498
- BI1=0,BI11=0,BI12=0,BI21=0,BI3=0,BI31=0,BI32=0,BI4=0,
499
- Offset:Offset=Offset.CC(),useShear=True,use7Dof=False,id:int=0):
500
-
501
- self.ID = id
502
- self.NAME = Name
503
- self.SHAPE = Shape
504
- self.TYPE = 'PSC'
505
-
506
- self.JO1=bool(Joint[0])
507
- self.JO2=bool(Joint[1])
508
- self.JO3=bool(Joint[2])
509
- self.JI1=bool(Joint[3])
510
- self.JI2=bool(Joint[4])
511
- self.JI3=bool(Joint[5])
512
- self.JI4=bool(Joint[6])
513
- self.JI5=bool(Joint[7])
514
-
515
- self.OFFSET = Offset
516
- self.USESHEAR = bool(useShear)
517
- self.USE7DOF = bool(use7Dof)
518
-
519
- self.HO1 = HO1
520
- self.HO2 = HO2
521
- self.HO21 = HO21
522
- self.HO22= HO22
523
- self.HO3 = HO3
524
- self.HO31 = HO31
525
-
526
- self.BO1 = BO1
527
- self.BO11 = BO11
528
- self.BO12 = BO12
529
- self.BO2 = BO2
530
- self.BO21 = BO21
531
- self.BO3 = BO3
532
-
533
- self.HI1 = HI1
534
- self.HI2 = HI2
535
- self.HI21 = HI21
536
- self.HI22 = HI22
537
- self.HI3 = HI3
538
- self.HI31 = HI31
539
- self.HI4 = HI4
540
- self.HI41 = HI41
541
- self.HI42 = HI42
542
- self.HI5 = HI5
543
-
544
- self.BI1 = BI1
545
- self.BI11 = BI11
546
- self.BI12 = BI12
547
- self.BI21 = BI21
548
- self.BI3 = BI3
549
- self.BI31 = BI31
550
- self.BI32 = BI32
551
- self.BI4 = BI4
552
-
553
- _SectionADD(self)
554
-
555
- class I(_common):
556
-
557
- def __init__(self,Name='',Symm = True,Joint=[0,0,0,0,0,0,0,0,0],
558
- H1=0,
559
- HL1=0,HL2=0,HL21=0,HL22=0,HL3=0,HL4=0,HL41=0,HL42=0,HL5=0,
560
- BL1=0,BL2=0,BL21=0,BL22=0,BL4=0,BL41=0,BL42=0,
561
-
562
- HR1=0,HR2=0,HR21=0,HR22=0,HR3=0,HR4=0,HR41=0,HR42=0,HR5=0,
563
- BR1=0,BR2=0,BR21=0,BR22=0,BR4=0,BR41=0,BR42=0,
564
-
565
- Offset:Offset=Offset.CC(),useShear=True,use7Dof=False,id:int=0):
566
-
567
- self.ID = id
568
- self.NAME = Name
569
- self.SHAPE = 'PSCI'
570
- self.TYPE = 'PSC'
571
-
572
- self.SYMM = bool(Symm)
573
-
574
- self.J1=bool(Joint[0])
575
- self.JL1=bool(Joint[1])
576
- self.JL2=bool(Joint[2])
577
- self.JL3=bool(Joint[3])
578
- self.JL4=bool(Joint[4])
579
-
580
- if self.SYMM:
581
- self.JR1=bool(Joint[1])
582
- self.JR2=bool(Joint[2])
583
- self.JR3=bool(Joint[3])
584
- self.JR4=bool(Joint[4])
585
-
586
- self.HR1 = HL1
587
- self.HR2 = HL2
588
- self.HR21 = HL21
589
- self.HR22 = HL22
590
- self.HR3 = HL3
591
- self.HR4 = HL4
592
- self.HR41 = HL41
593
- self.HR42 = HL42
594
- self.HR5 = HL5
595
-
596
- self.BR1 = BL1
597
- self.BR2 = BL2
598
- self.BR21 = BL21
599
- self.BR22 = BL22
600
- self.BR4 = BL4
601
- self.BR41 = BL41
602
- self.BR42 = BL42
603
- else:
604
- self.JR1=bool(Joint[5])
605
- self.JR2=bool(Joint[6])
606
- self.JR3=bool(Joint[7])
607
- self.JR4=bool(Joint[8])
608
-
609
- self.HR1 = HR1
610
- self.HR2 = HR2
611
- self.HR21 = HR21
612
- self.HR22 = HR22
613
- self.HR3 = HR3
614
- self.HR4 = HR4
615
- self.HR41 = HR41
616
- self.HR42 = HR42
617
- self.HR5 = HR5
618
-
619
- self.BR1 = BR1
620
- self.BR2 = BR2
621
- self.BR21 = BR21
622
- self.BR22 = BR22
623
- self.BR4 = BR4
624
- self.BR41 = BR41
625
- self.BR42 = BR42
626
-
627
- self.OFFSET = Offset
628
- self.USESHEAR = bool(useShear)
629
- self.USE7DOF = bool(use7Dof)
630
-
631
- self.H1 = H1
632
- self.HL1 = HL1
633
- self.HL2 = HL2
634
- self.HL21 = HL21
635
- self.HL22 = HL22
636
- self.HL3 = HL3
637
- self.HL4 = HL4
638
- self.HL41 = HL41
639
- self.HL42 = HL42
640
- self.HL5 = HL5
641
-
642
- self.BL1 = BL1
643
- self.BL2 = BL2
644
- self.BL21 = BL21
645
- self.BL22 = BL22
646
- self.BL4 = BL4
647
- self.BL41 = BL41
648
- self.BL42 = BL42
649
-
650
- _SectionADD(self)
651
-
652
- class Value(_common):
653
- def __init__(self,Name:str,
654
- OuterPolygon:list,InnerPolygon:list=[],
655
- Offset:Offset=Offset.CC(),useShear=True,use7Dof=False,id:int=0):
656
-
657
- '''
658
- Outer Polygon -> List of points ; Last input is different from first
659
- [(0,0),(1,0),(1,1),(0,1)]
660
- Inner Polygon -> List of points ; Last input is different from first
661
- Only one inner polygon
662
- '''
663
-
664
- self.ID = id
665
- self.NAME = Name
666
- self.SHAPE = 'VALUE'
667
- self.TYPE = 'PSC'
668
-
669
- self.OFFSET = Offset
670
- self.USESHEAR = bool(useShear)
671
- self.USE7DOF = bool(use7Dof)
672
-
673
-
674
- self.OUTER_POLYGON = _poly_dir(OuterPolygon)
675
- self.INNER_POLYGON = []
676
- self.N_INNER_POLYGON = 0
677
-
678
- temp_arr = []
679
-
680
- # Finding no. of internal polygons
681
- if InnerPolygon != []:
682
- if not isinstance(InnerPolygon[0][0],(int,float)):
683
- self.N_INNER_POLYGON = len(InnerPolygon)
684
- temp_arr = InnerPolygon
685
-
686
- else:
687
- temp_arr.append(InnerPolygon) #Convert to list
688
- self.N_INNER_POLYGON = 1
689
-
690
- for i in range(len(temp_arr)):
691
- self.INNER_POLYGON.append(_poly_dir(temp_arr[i],'CW'))
692
-
693
-
694
- _SectionADD(self)
695
-
696
-
697
- class Composite:
698
- class PSCI(_common):
699
-
700
- def __init__(self,Name='',Symm = True,Joint=[0,0,0,0,0,0,0,0,0],
701
- Bc=0,tc=0,Hh=0,
702
- H1=0,
703
- HL1=0,HL2=0,HL21=0,HL22=0,HL3=0,HL4=0,HL41=0,HL42=0,HL5=0,
704
- BL1=0,BL2=0,BL21=0,BL22=0,BL4=0,BL41=0,BL42=0,
705
-
706
- HR1=0,HR2=0,HR21=0,HR22=0,HR3=0,HR4=0,HR41=0,HR42=0,HR5=0,
707
- BR1=0,BR2=0,BR21=0,BR22=0,BR4=0,BR41=0,BR42=0,
708
-
709
- EgdEsb =0, DgdDsb=0,Pgd=0,Psb=0,TgdTsb=0,
710
-
711
- MultiModulus = False,CreepEratio=0,ShrinkEratio=0,
712
-
713
- Offset:Offset=Offset.CC(),useShear=True,use7Dof=False,id:int=0):
714
-
715
- self.ID = id
716
- self.NAME = Name
717
- self.SHAPE = 'CI'
718
- self.TYPE = 'COMPOSITE'
719
-
720
- self.SYMM = bool(Symm)
721
-
722
- self.BC =Bc
723
- self.TC =tc
724
- self.HH =Hh
725
-
726
- self.MATL_ELAST = EgdEsb
727
- self.MATL_DENS = DgdDsb
728
- self.MATL_POIS_S = Pgd
729
- self.MATL_POIS_C = Psb
730
- self.MATL_THERMAL = TgdTsb
731
- self.USE_MULTI_ELAST = MultiModulus
732
- self.LONGTERM_ESEC = CreepEratio
733
- self.SHRINK_ESEC = ShrinkEratio
734
-
735
-
736
- self.J1=bool(Joint[0])
737
- self.JL1=bool(Joint[1])
738
- self.JL2=bool(Joint[2])
739
- self.JL3=bool(Joint[3])
740
- self.JL4=bool(Joint[4])
741
-
742
- if self.SYMM:
743
- self.JR1=bool(Joint[1])
744
- self.JR2=bool(Joint[2])
745
- self.JR3=bool(Joint[3])
746
- self.JR4=bool(Joint[4])
747
-
748
- self.HR1 = HL1
749
- self.HR2 = HL2
750
- self.HR21 = HL21
751
- self.HR22 = HL22
752
- self.HR3 = HL3
753
- self.HR4 = HL4
754
- self.HR41 = HL41
755
- self.HR42 = HL42
756
- self.HR5 = HL5
757
-
758
- self.BR1 = BL1
759
- self.BR2 = BL2
760
- self.BR21 = BL21
761
- self.BR22 = BL22
762
- self.BR4 = BL4
763
- self.BR41 = BL41
764
- self.BR42 = BL42
765
- else:
766
- self.JR1=bool(Joint[5])
767
- self.JR2=bool(Joint[6])
768
- self.JR3=bool(Joint[7])
769
- self.JR4=bool(Joint[8])
770
-
771
- self.HR1 = HR1
772
- self.HR2 = HR2
773
- self.HR21 = HR21
774
- self.HR22 = HR22
775
- self.HR3 = HR3
776
- self.HR4 = HR4
777
- self.HR41 = HR41
778
- self.HR42 = HR42
779
- self.HR5 = HR5
780
-
781
- self.BR1 = BR1
782
- self.BR2 = BR2
783
- self.BR21 = BR21
784
- self.BR22 = BR22
785
- self.BR4 = BR4
786
- self.BR41 = BR41
787
- self.BR42 = BR42
788
-
789
- self.OFFSET = Offset
790
- self.USESHEAR = bool(useShear)
791
- self.USE7DOF = bool(use7Dof)
792
-
793
- self.H1 = H1
794
- self.HL1 = HL1
795
- self.HL2 = HL2
796
- self.HL21 = HL21
797
- self.HL22 = HL22
798
- self.HL3 = HL3
799
- self.HL4 = HL4
800
- self.HL41 = HL41
801
- self.HL42 = HL42
802
- self.HL5 = HL5
803
-
804
- self.BL1 = BL1
805
- self.BL2 = BL2
806
- self.BL21 = BL21
807
- self.BL22 = BL22
808
- self.BL4 = BL4
809
- self.BL41 = BL41
810
- self.BL42 = BL42
811
-
812
- _SectionADD(self)
813
-
814
- class SteelI_Type1(_common):
815
-
816
- def __init__(self,Name='',
817
- Bc=0,tc=0,Hh=0,
818
- Hw=0,B1=0,tf1=0,tw=0,B2=0,tf2=0,
819
-
820
- EsEc =0, DsDc=0,Ps=0,Pc=0,TsTc=0,
821
- MultiModulus = False,CreepEratio=0,ShrinkEratio=0,
822
- Offset:Offset=Offset.CC(),useShear=True,use7Dof=False,id:int=0):
823
-
824
- self.ID = id
825
- self.NAME = Name
826
- self.SHAPE = 'I'
827
- self.TYPE = 'COMPOSITE'
828
-
829
- self.BC =Bc
830
- self.TC =tc
831
- self.HH =Hh
832
-
833
- self.HW = Hw
834
- self.B1 = B1
835
- self.TF1 = tf1
836
- self.TW = tw
837
- self.B2 = B2
838
- self.TF2 = tf2
839
-
840
- self.MATL_ELAST = EsEc
841
- self.MATL_DENS = DsDc
842
- self.MATL_POIS_S = Ps
843
- self.MATL_POIS_C = Pc
844
- self.MATL_THERMAL = TsTc
845
- self.USE_MULTI_ELAST = MultiModulus
846
- self.LONGTERM_ESEC = CreepEratio
847
- self.SHRINK_ESEC = ShrinkEratio
848
-
849
- self.OFFSET = Offset
850
- self.USESHEAR = bool(useShear)
851
- self.USE7DOF = bool(use7Dof)
852
-
853
- _SectionADD(self)
854
-
855
-
856
- #=======================================================Tapered Group===========================================
857
-
858
- class TaperedGroup:
859
-
860
- data = []
861
-
862
- def __init__(self, name, elem_list, z_var, y_var, z_exp=None, z_from=None, z_dist=None,
863
- y_exp=None, y_from=None, y_dist=None, id=""):
864
- """
865
- Args:
866
- name (str): Tapered Group Name (Required).
867
- elem_list (list): List of element numbers (Required).
868
- z_var (str): Section shape variation for Z-axis: "LINEAR" or "POLY" (Required).
869
- y_var (str): Section shape variation for Y-axis: "LINEAR" or "POLY" (Required).
870
- z_exp (float, optional): Z-axis exponent. Required if z_var is "POLY".
871
- z_from (str, optional): Z-axis symmetric plane ("i" or "j"). Defaults to "i" for "POLY".
872
- z_dist (float, optional): Z-axis symmetric plane distance. Defaults to 0 for "POLY".
873
- y_exp (float, optional): Y-axis exponent. Required if y_var is "POLY".
874
- y_from (str, optional): Y-axis symmetric plane ("i" or "j"). Defaults to "i" for "POLY".
875
- y_dist (float, optional): Y-axis symmetric plane distance. Defaults to 0 for "POLY".
876
- id (str, optional): ID for the tapered group. Auto-generated if not provided.
877
-
878
- Example:
879
- Section.TapperGroup("Linear", [1, 2, 3], "LINEAR", "LINEAR")
880
- Section.TapperGroup("ZPoly", [4, 5], "POLY", "LINEAR", z_exp=2.5)
881
- """
882
- self.NAME = name
883
- self.ELEM_LIST = elem_list
884
- self.Z_VAR = z_var
885
- self.Y_VAR = y_var
886
-
887
- # Z-axis parameters (only for POLY)
888
- if z_var == "POLY":
889
- if z_exp is None:
890
- raise ValueError("z_exp is required when z_var is 'POLY'")
891
- self.Z_EXP = z_exp
892
- self.Z_FROM = z_from if z_from is not None else "i"
893
- self.Z_DIST = z_dist if z_dist is not None else 0
894
- else:
895
- self.Z_EXP = None
896
- self.Z_FROM = None
897
- self.Z_DIST = None
898
-
899
- # Y-axis parameters (only for POLY)
900
- if y_var == "POLY":
901
- if y_exp is None:
902
- raise ValueError("y_exp is required when y_var is 'POLY'")
903
- self.Y_EXP = y_exp
904
- self.Y_FROM = y_from if y_from is not None else "i"
905
- self.Y_DIST = y_dist if y_dist is not None else 0
906
- else:
907
- self.Y_EXP = None
908
- self.Y_FROM = None
909
- self.Y_DIST = None
910
-
911
- if id == "":
912
- id = len(Section.TaperedGroup.data) + 1
913
- self.ID = id
914
-
915
- Section.TaperedGroup.data.append(self)
916
-
917
- @classmethod
918
- def json(cls):
919
- json_data = {"Assign": {}}
920
- for i in cls.data:
921
- # Base data that's always included
922
- tapper_data = {
923
- "NAME": i.NAME,
924
- "ELEMLIST": i.ELEM_LIST,
925
- "ZVAR": i.Z_VAR,
926
- "YVAR": i.Y_VAR
927
- }
928
-
929
- # Add Z-axis polynomial parameters only if Z_VAR is "POLY"
930
- if i.Z_VAR == "POLY":
931
- tapper_data["ZEXP"] = i.Z_EXP
932
- tapper_data["ZFROM"] = i.Z_FROM
933
- tapper_data["ZDIST"] = i.Z_DIST
934
-
935
- # Add Y-axis polynomial parameters only if Y_VAR is "POLY"
936
- if i.Y_VAR == "POLY":
937
- tapper_data["YEXP"] = i.Y_EXP
938
- tapper_data["YFROM"] = i.Y_FROM
939
- tapper_data["YDIST"] = i.Y_DIST
940
-
941
- json_data["Assign"][str(i.ID)] = tapper_data
942
-
943
- return json_data
944
-
945
- @classmethod
946
- def create(cls):
947
- MidasAPI("PUT", "/db/tsgr", cls.json())
948
-
949
- @classmethod
950
- def get(cls):
951
- return MidasAPI("GET", "/db/tsgr")
952
-
953
- @classmethod
954
- def delete(cls):
955
- cls.data = []
956
- return MidasAPI("DELETE", "/db/tsgr")
957
-
958
- @classmethod
959
- def sync(cls):
960
- cls.data = []
961
- response = cls.get()
962
-
963
- if response and response != {'message': ''}:
964
- tsgr_data = response.get('TSGR', {})
965
- # Iterate through the dictionary of tapered groups from the API response
966
- for tsgr_id, item_data in tsgr_data.items():
967
- # Extract base parameters
968
- name = item_data.get('NAME')
969
- elem_list = item_data.get('ELEMLIST')
970
- z_var = item_data.get('ZVAR')
971
- y_var = item_data.get('YVAR')
972
-
973
- # Extract optional parameters based on variation type
974
- z_exp = item_data.get('ZEXP') if z_var == "POLY" else None
975
- z_from = item_data.get('ZFROM') if z_var == "POLY" else None
976
- z_dist = item_data.get('ZDIST') if z_var == "POLY" else None
977
-
978
- y_exp = item_data.get('YEXP') if y_var == "POLY" else None
979
- y_from = item_data.get('YFROM') if y_var == "POLY" else None
980
- y_dist = item_data.get('YDIST') if y_var == "POLY" else None
981
-
982
- Section.TaperedGroup(
983
- name=name,
984
- elem_list=elem_list,
985
- z_var=z_var,
986
- y_var=y_var,
987
- z_exp=z_exp,
988
- z_from=z_from,
989
- z_dist=z_dist,
990
- y_exp=y_exp,
991
- y_from=y_from,
992
- y_dist=y_dist,
993
- id=tsgr_id
994
- )