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.

@@ -0,0 +1,361 @@
1
+ print('Section MODULE LOADED...')
2
+
3
+ from ._pscSS import SS_PSC_12CELL,SS_PSC_I,SS_PSC_Value
4
+ from ._dbSecSS import SS_DBUSER
5
+ from ._offsetSS import Offset
6
+ from ._unSupp import SS_UNSUPP,SS_STD_DB
7
+ from ._compositeSS import SS_COMP_PSC_I,SS_COMP_STEEL_I_TYPE1
8
+
9
+ from midas_civil import MidasAPI
10
+
11
+
12
+ class _helperSECTION:
13
+ NAME, SHAPE, TYPE, OFFSET, USESHEAR, USE7DOF = 0,0,0,0,0,0
14
+ def update():
15
+ pass
16
+ def toJSON():
17
+ pass
18
+
19
+
20
+ def _SectionADD(self):
21
+ # Commom HERE ---------------------------------------------
22
+ id = int(self.ID)
23
+ if Section.ids == []:
24
+ count = 1
25
+ else:
26
+ count = max(Section.ids)+1
27
+
28
+ if id==0 :
29
+ self.ID = count
30
+ Section.sect.append(self)
31
+ Section.ids.append(int(self.ID))
32
+ elif id in Section.ids:
33
+ self.ID=int(id)
34
+ print(f'⚠️ Section with ID {id} already exist! It will be replaced.')
35
+ index=Section.ids.index(id)
36
+ Section.sect[index]=self
37
+ else:
38
+ self.ID=id
39
+ Section.sect.append(self)
40
+ Section.ids.append(int(self.ID))
41
+ # Common END -------------------------------------------------------
42
+
43
+
44
+
45
+ def off_JS2Obj(js):
46
+
47
+ try: OffsetPoint = js['OFFSET_PT']
48
+ except: OffsetPoint='CC'
49
+ try: CenterLocation = js['OFFSET_CENTER']
50
+ except: CenterLocation=0
51
+ try: HOffset = js['USERDEF_OFFSET_YI']
52
+ except: HOffset=0
53
+ try: HOffOpt = js['HORZ_OFFSET_OPT']
54
+ except: HOffOpt=0
55
+ try: VOffOpt = js['VERT_OFFSET_OPT']
56
+ except: VOffOpt=0
57
+ try: VOffset = js['USERDEF_OFFSET_ZI']
58
+ except: VOffset=0
59
+ try: UsrOffOpt = js['USER_OFFSET_REF']
60
+ except: UsrOffOpt=0
61
+
62
+ return Offset(OffsetPoint,CenterLocation,HOffset,HOffOpt,VOffset,VOffOpt,UsrOffOpt)
63
+
64
+
65
+
66
+ # ------------------- FUNCTION TO CREATE OBJECT used in ELEMENT SYNC --------------------------
67
+ def _JS2OBJ(id,js):
68
+ name = js['SECT_NAME']
69
+ type = js['SECTTYPE']
70
+ shape = js['SECT_BEFORE']['SHAPE']
71
+ offset = off_JS2Obj(js['SECT_BEFORE'])
72
+ uShear = js['SECT_BEFORE']['USE_SHEAR_DEFORM']
73
+ u7DOF = js['SECT_BEFORE']['USE_WARPING_EFFECT']
74
+
75
+
76
+ if type == 'DBUSER':
77
+ if js['SECT_BEFORE']['DATATYPE'] ==2: obj = SS_DBUSER._objectify(id,name,type,shape,offset,uShear,u7DOF,js)
78
+ else: obj = SS_STD_DB(id,name,type,shape,offset,uShear,u7DOF,js)
79
+
80
+ elif type == 'PSC' :
81
+ if shape in ['1CEL','2CEL']: obj = SS_PSC_12CELL._objectify(id,name,type,shape,offset,uShear,u7DOF,js)
82
+ elif shape in ['PSCI']: obj = SS_PSC_I._objectify(id,name,type,shape,offset,uShear,u7DOF,js)
83
+ elif shape in ['VALU']: obj = SS_PSC_Value._objectify(id,name,type,shape,offset,uShear,u7DOF,js)
84
+ else: obj = SS_UNSUPP(id,name,type,shape,offset,uShear,u7DOF,js)
85
+
86
+ elif type == 'COMPOSITE':
87
+ if shape in ['CI']: obj = SS_COMP_PSC_I._objectify(id,name,type,shape,offset,uShear,u7DOF,js)
88
+ elif shape in ['I']: obj = SS_COMP_STEEL_I_TYPE1._objectify(id,name,type,shape,offset,uShear,u7DOF,js)
89
+ else: obj = SS_UNSUPP(id,name,type,shape,offset,uShear,u7DOF,js)
90
+ else :
91
+ obj = SS_UNSUPP(id,name,type,shape,offset,uShear,u7DOF,js)
92
+
93
+
94
+ _SectionADD(obj)
95
+
96
+
97
+
98
+
99
+
100
+ class Section:
101
+ """ NEW Create Sections \n Use Section.USER , Section.PSC to create sections"""
102
+ sect:list[_helperSECTION] = []
103
+ ids:list[int] = []
104
+
105
+
106
+ @classmethod
107
+ def json(cls):
108
+ json = {"Assign":{}}
109
+ for sect in cls.sect:
110
+ js = sect.toJSON()
111
+ json["Assign"][sect.ID] = js
112
+ return json
113
+
114
+ @staticmethod
115
+ def create():
116
+ MidasAPI("PUT","/db/SECT",Section.json())
117
+
118
+
119
+ @staticmethod
120
+ def get():
121
+ return MidasAPI("GET","/db/SECT")
122
+
123
+
124
+ @staticmethod
125
+ def delete():
126
+ MidasAPI("DELETE","/db/SECT")
127
+ Section.sect=[]
128
+ Section.ids=[]
129
+
130
+
131
+ @staticmethod
132
+ def sync():
133
+ a = Section.get()
134
+ if a != {'message': ''}:
135
+ Section.sect = []
136
+ Section.ids=[]
137
+ for sect_id in a['SECT'].keys():
138
+ _JS2OBJ(sect_id,a['SECT'][sect_id])
139
+
140
+
141
+ #--------------------------------- S E C T I O N S ---------------------------------------------
142
+
143
+ #--------------------- D B U S E R --------------------
144
+ @staticmethod
145
+ def DBUSER(Name='',Shape='',parameters:list=[],Offset=Offset(),useShear=True,use7Dof=False,id:int=0):
146
+ args = locals()
147
+ sect_Obj = SS_DBUSER(**args)
148
+ _SectionADD(sect_Obj)
149
+ return sect_Obj
150
+
151
+ class PSC :
152
+
153
+ @staticmethod
154
+ def CEL12(Name='',Shape='1CEL',Joint=[0,0,0,0,0,0,0,0],
155
+ HO1=0,HO2=0,HO21=0,HO22=0,HO3=0,HO31=0,
156
+ BO1=0,BO11=0,BO12=0,BO2=0,BO21=0,BO3=0,
157
+ HI1=0,HI2=0,HI21=0,HI22=0,HI3=0,HI31=0,HI4=0,HI41=0,HI42=0,HI5=0,
158
+ BI1=0,BI11=0,BI12=0,BI21=0,BI3=0,BI31=0,BI32=0,BI4=0,
159
+ Offset:Offset=Offset.CC(),useShear=True,use7Dof=False,id:int=0):
160
+ args = locals()
161
+ sect_Obj = SS_PSC_12CELL(**args)
162
+ _SectionADD(sect_Obj)
163
+ return sect_Obj
164
+
165
+ @staticmethod
166
+ def I(Name='',Symm = True,Joint=[0,0,0,0,0,0,0,0,0],
167
+ H1=0,
168
+ HL1=0,HL2=0,HL21=0,HL22=0,HL3=0,HL4=0,HL41=0,HL42=0,HL5=0,
169
+ BL1=0,BL2=0,BL21=0,BL22=0,BL4=0,BL41=0,BL42=0,
170
+ HR1=0,HR2=0,HR21=0,HR22=0,HR3=0,HR4=0,HR41=0,HR42=0,HR5=0,
171
+ BR1=0,BR2=0,BR21=0,BR22=0,BR4=0,BR41=0,BR42=0,
172
+ Offset:Offset=Offset.CC(),useShear=True,use7Dof=False,id:int=0):
173
+
174
+ args = locals()
175
+ sect_Obj = SS_COMP_PSC_I(**args)
176
+
177
+ _SectionADD(sect_Obj)
178
+ return sect_Obj
179
+
180
+ @staticmethod
181
+ def Value(Name:str,
182
+ OuterPolygon:list,InnerPolygon:list=[],
183
+ Offset:Offset=Offset.CC(),useShear=True,use7Dof=False,id:int=0):
184
+
185
+ args = locals()
186
+ sect_Obj = SS_PSC_Value(**args)
187
+
188
+ _SectionADD(sect_Obj)
189
+ return sect_Obj
190
+
191
+
192
+ class Composite :
193
+ @staticmethod
194
+ def PSCI(Name='',Symm = True,Joint=[0,0,0,0,0,0,0,0,0],
195
+ Bc=0,tc=0,Hh=0,
196
+ H1=0,
197
+ HL1=0,HL2=0,HL21=0,HL22=0,HL3=0,HL4=0,HL41=0,HL42=0,HL5=0,
198
+ BL1=0,BL2=0,BL21=0,BL22=0,BL4=0,BL41=0,BL42=0,
199
+ HR1=0,HR2=0,HR21=0,HR22=0,HR3=0,HR4=0,HR41=0,HR42=0,HR5=0,
200
+ BR1=0,BR2=0,BR21=0,BR22=0,BR4=0,BR41=0,BR42=0,
201
+ EgdEsb =0, DgdDsb=0,Pgd=0,Psb=0,TgdTsb=0,
202
+ MultiModulus = False,CreepEratio=0,ShrinkEratio=0,
203
+ Offset:Offset=Offset.CC(),useShear=True,use7Dof=False,id:int=0):
204
+
205
+ args = locals()
206
+ sect_Obj = SS_COMP_PSC_I(**args)
207
+
208
+ _SectionADD(sect_Obj)
209
+ return sect_Obj
210
+
211
+ @staticmethod
212
+ def SteelI_Type1(Name='',Bc=0,tc=0,Hh=0,Hw=0,B1=0,tf1=0,tw=0,B2=0,tf2=0,EsEc =0, DsDc=0,Ps=0,Pc=0,TsTc=0,
213
+ MultiModulus = False,CreepEratio=0,ShrinkEratio=0,
214
+ Offset:Offset=Offset.CC(),useShear=True,use7Dof=False,id:int=0):
215
+
216
+ args = locals()
217
+ sect_Obj = SS_COMP_STEEL_I_TYPE1(**args)
218
+
219
+ _SectionADD(sect_Obj)
220
+ return sect_Obj
221
+
222
+
223
+
224
+ #--------------------------------- T A P E R E D G R O U P ---------------------------------------------
225
+ class TaperedGroup:
226
+
227
+ data = []
228
+
229
+ def __init__(self, name, elem_list, z_var, y_var, z_exp=None, z_from=None, z_dist=None,
230
+ y_exp=None, y_from=None, y_dist=None, id=""):
231
+ """
232
+ Args:
233
+ name (str): Tapered Group Name (Required).
234
+ elem_list (list): List of element numbers (Required).
235
+ z_var (str): Section shape variation for Z-axis: "LINEAR" or "POLY" (Required).
236
+ y_var (str): Section shape variation for Y-axis: "LINEAR" or "POLY" (Required).
237
+ z_exp (float, optional): Z-axis exponent. Required if z_var is "POLY".
238
+ z_from (str, optional): Z-axis symmetric plane ("i" or "j"). Defaults to "i" for "POLY".
239
+ z_dist (float, optional): Z-axis symmetric plane distance. Defaults to 0 for "POLY".
240
+ y_exp (float, optional): Y-axis exponent. Required if y_var is "POLY".
241
+ y_from (str, optional): Y-axis symmetric plane ("i" or "j"). Defaults to "i" for "POLY".
242
+ y_dist (float, optional): Y-axis symmetric plane distance. Defaults to 0 for "POLY".
243
+ id (str, optional): ID for the tapered group. Auto-generated if not provided.
244
+
245
+ Example:
246
+ Section.TapperGroup("Linear", [1, 2, 3], "LINEAR", "LINEAR")
247
+ Section.TapperGroup("ZPoly", [4, 5], "POLY", "LINEAR", z_exp=2.5)
248
+ """
249
+ self.NAME = name
250
+ self.ELEM_LIST = elem_list
251
+ self.Z_VAR = z_var
252
+ self.Y_VAR = y_var
253
+
254
+ # Z-axis parameters (only for POLY)
255
+ if z_var == "POLY":
256
+ if z_exp is None:
257
+ raise ValueError("z_exp is required when z_var is 'POLY'")
258
+ self.Z_EXP = z_exp
259
+ self.Z_FROM = z_from if z_from is not None else "i"
260
+ self.Z_DIST = z_dist if z_dist is not None else 0
261
+ else:
262
+ self.Z_EXP = None
263
+ self.Z_FROM = None
264
+ self.Z_DIST = None
265
+
266
+ # Y-axis parameters (only for POLY)
267
+ if y_var == "POLY":
268
+ if y_exp is None:
269
+ raise ValueError("y_exp is required when y_var is 'POLY'")
270
+ self.Y_EXP = y_exp
271
+ self.Y_FROM = y_from if y_from is not None else "i"
272
+ self.Y_DIST = y_dist if y_dist is not None else 0
273
+ else:
274
+ self.Y_EXP = None
275
+ self.Y_FROM = None
276
+ self.Y_DIST = None
277
+
278
+ if id == "":
279
+ id = len(Section.TaperedGroup.data) + 1
280
+ self.ID = id
281
+
282
+ Section.TaperedGroup.data.append(self)
283
+
284
+ @classmethod
285
+ def json(cls):
286
+ json_data = {"Assign": {}}
287
+ for i in cls.data:
288
+ # Base data that's always included
289
+ tapper_data = {
290
+ "NAME": i.NAME,
291
+ "ELEMLIST": i.ELEM_LIST,
292
+ "ZVAR": i.Z_VAR,
293
+ "YVAR": i.Y_VAR
294
+ }
295
+
296
+ # Add Z-axis polynomial parameters only if Z_VAR is "POLY"
297
+ if i.Z_VAR == "POLY":
298
+ tapper_data["ZEXP"] = i.Z_EXP
299
+ tapper_data["ZFROM"] = i.Z_FROM
300
+ tapper_data["ZDIST"] = i.Z_DIST
301
+
302
+ # Add Y-axis polynomial parameters only if Y_VAR is "POLY"
303
+ if i.Y_VAR == "POLY":
304
+ tapper_data["YEXP"] = i.Y_EXP
305
+ tapper_data["YFROM"] = i.Y_FROM
306
+ tapper_data["YDIST"] = i.Y_DIST
307
+
308
+ json_data["Assign"][str(i.ID)] = tapper_data
309
+
310
+ return json_data
311
+
312
+ @classmethod
313
+ def create(cls):
314
+ MidasAPI("PUT", "/db/tsgr", cls.json())
315
+
316
+ @classmethod
317
+ def get(cls):
318
+ return MidasAPI("GET", "/db/tsgr")
319
+
320
+ @classmethod
321
+ def delete(cls):
322
+ cls.data = []
323
+ return MidasAPI("DELETE", "/db/tsgr")
324
+
325
+ @classmethod
326
+ def sync(cls):
327
+ cls.data = []
328
+ response = cls.get()
329
+
330
+ if response and response != {'message': ''}:
331
+ tsgr_data = response.get('TSGR', {})
332
+ # Iterate through the dictionary of tapered groups from the API response
333
+ for tsgr_id, item_data in tsgr_data.items():
334
+ # Extract base parameters
335
+ name = item_data.get('NAME')
336
+ elem_list = item_data.get('ELEMLIST')
337
+ z_var = item_data.get('ZVAR')
338
+ y_var = item_data.get('YVAR')
339
+
340
+ # Extract optional parameters based on variation type
341
+ z_exp = item_data.get('ZEXP') if z_var == "POLY" else None
342
+ z_from = item_data.get('ZFROM') if z_var == "POLY" else None
343
+ z_dist = item_data.get('ZDIST') if z_var == "POLY" else None
344
+
345
+ y_exp = item_data.get('YEXP') if y_var == "POLY" else None
346
+ y_from = item_data.get('YFROM') if y_var == "POLY" else None
347
+ y_dist = item_data.get('YDIST') if y_var == "POLY" else None
348
+
349
+ Section.TaperedGroup(
350
+ name=name,
351
+ elem_list=elem_list,
352
+ z_var=z_var,
353
+ y_var=y_var,
354
+ z_exp=z_exp,
355
+ z_from=z_from,
356
+ z_dist=z_dist,
357
+ y_exp=y_exp,
358
+ y_from=y_from,
359
+ y_dist=y_dist,
360
+ id=tsgr_id
361
+ )
@@ -0,0 +1,283 @@
1
+ from ._offsetSS import Offset
2
+ from ._offsetSS import _common
3
+
4
+ class SS_COMP_PSC_I(_common):
5
+
6
+ """ Create Standard USER DEFINED sections"""
7
+
8
+ def __init__(self,Name='',Symm = True,Joint=[0,0,0,0,0,0,0,0,0],
9
+ Bc=0,tc=0,Hh=0,
10
+ H1=0,
11
+ HL1=0,HL2=0,HL21=0,HL22=0,HL3=0,HL4=0,HL41=0,HL42=0,HL5=0,
12
+ BL1=0,BL2=0,BL21=0,BL22=0,BL4=0,BL41=0,BL42=0,
13
+
14
+ HR1=0,HR2=0,HR21=0,HR22=0,HR3=0,HR4=0,HR41=0,HR42=0,HR5=0,
15
+ BR1=0,BR2=0,BR21=0,BR22=0,BR4=0,BR41=0,BR42=0,
16
+
17
+ EgdEsb =0, DgdDsb=0,Pgd=0,Psb=0,TgdTsb=0,
18
+
19
+ MultiModulus = False,CreepEratio=0,ShrinkEratio=0,
20
+
21
+ Offset:Offset=Offset.CC(),useShear=True,use7Dof=False,id:int=0):
22
+
23
+ self.ID = id
24
+ self.NAME = Name
25
+ self.SHAPE = 'CI'
26
+ self.TYPE = 'COMPOSITE'
27
+
28
+ self.SYMM = bool(Symm)
29
+
30
+ self.BC =Bc
31
+ self.TC =tc
32
+ self.HH =Hh
33
+
34
+ self.MATL_ELAST = EgdEsb
35
+ self.MATL_DENS = DgdDsb
36
+ self.MATL_POIS_S = Pgd
37
+ self.MATL_POIS_C = Psb
38
+ self.MATL_THERMAL = TgdTsb
39
+ self.USE_MULTI_ELAST = MultiModulus
40
+ self.LONGTERM_ESEC = CreepEratio
41
+ self.SHRINK_ESEC = ShrinkEratio
42
+
43
+
44
+ self.J1=bool(Joint[0])
45
+ self.JL1=bool(Joint[1])
46
+ self.JL2=bool(Joint[2])
47
+ self.JL3=bool(Joint[3])
48
+ self.JL4=bool(Joint[4])
49
+
50
+ if self.SYMM:
51
+ self.JR1=bool(Joint[1])
52
+ self.JR2=bool(Joint[2])
53
+ self.JR3=bool(Joint[3])
54
+ self.JR4=bool(Joint[4])
55
+
56
+ self.HR1 = HL1
57
+ self.HR2 = HL2
58
+ self.HR21 = HL21
59
+ self.HR22 = HL22
60
+ self.HR3 = HL3
61
+ self.HR4 = HL4
62
+ self.HR41 = HL41
63
+ self.HR42 = HL42
64
+ self.HR5 = HL5
65
+
66
+ self.BR1 = BL1
67
+ self.BR2 = BL2
68
+ self.BR21 = BL21
69
+ self.BR22 = BL22
70
+ self.BR4 = BL4
71
+ self.BR41 = BL41
72
+ self.BR42 = BL42
73
+ else:
74
+ self.JR1=bool(Joint[5])
75
+ self.JR2=bool(Joint[6])
76
+ self.JR3=bool(Joint[7])
77
+ self.JR4=bool(Joint[8])
78
+
79
+ self.HR1 = HR1
80
+ self.HR2 = HR2
81
+ self.HR21 = HR21
82
+ self.HR22 = HR22
83
+ self.HR3 = HR3
84
+ self.HR4 = HR4
85
+ self.HR41 = HR41
86
+ self.HR42 = HR42
87
+ self.HR5 = HR5
88
+
89
+ self.BR1 = BR1
90
+ self.BR2 = BR2
91
+ self.BR21 = BR21
92
+ self.BR22 = BR22
93
+ self.BR4 = BR4
94
+ self.BR41 = BR41
95
+ self.BR42 = BR42
96
+
97
+ self.OFFSET = Offset
98
+ self.USESHEAR = bool(useShear)
99
+ self.USE7DOF = bool(use7Dof)
100
+
101
+ self.H1 = H1
102
+ self.HL1 = HL1
103
+ self.HL2 = HL2
104
+ self.HL21 = HL21
105
+ self.HL22 = HL22
106
+ self.HL3 = HL3
107
+ self.HL4 = HL4
108
+ self.HL41 = HL41
109
+ self.HL42 = HL42
110
+ self.HL5 = HL5
111
+
112
+ self.BL1 = BL1
113
+ self.BL2 = BL2
114
+ self.BL21 = BL21
115
+ self.BL22 = BL22
116
+ self.BL4 = BL4
117
+ self.BL41 = BL41
118
+ self.BL42 = BL42
119
+
120
+ def __str__(self):
121
+ return f' > ID = {self.ID} | PSC COMPOSITE I SECTION \nJSON = {self.toJSON()}\n'
122
+
123
+
124
+ def toJSON(sect):
125
+ js = {
126
+ "SECTTYPE": sect.TYPE,
127
+ "SECT_NAME": sect.NAME,
128
+ "SECT_BEFORE": {
129
+ "SHAPE": sect.SHAPE,
130
+ "SECT_I": {
131
+ "vSIZE_PSC_A": [sect.H1,sect.HL1,sect.HL2,sect.HL21,sect.HL22,sect.HL3,sect.HL4,sect.HL41,sect.HL42,sect.HL5],
132
+ "vSIZE_PSC_B": [sect.BL1,sect.BL2,sect.BL21,sect.BL22,sect.BL4,sect.BL41,sect.BL42],
133
+ "vSIZE_PSC_C": [sect.HR1,sect.HR2,sect.HR21,sect.HR22,sect.HR3,sect.HR4,sect.HR41,sect.HR42,sect.HR5],
134
+ "vSIZE_PSC_D": [sect.BR1,sect.BR2,sect.BR21,sect.BR22,sect.BR4,sect.BR41,sect.BR42]
135
+ },
136
+ "WARPING_CHK_AUTO_I": True,
137
+ "WARPING_CHK_AUTO_J": True,
138
+ "SHEAR_CHK": True,
139
+ "WARPING_CHK_POS_I": [[0,0,0,0,0,0],[0,0,0,0,0,0]],
140
+ "WARPING_CHK_POS_J": [[0,0,0,0,0,0],[0,0,0,0,0,0]],
141
+ "USE_AUTO_SHEAR_CHK_POS": [[True,False,True],[False,False,False]],
142
+ "USE_WEB_THICK_SHEAR": [[True, True,True],[False,False,False]],
143
+ "SHEAR_CHK_POS": [[0,0,0],[0,0,0]],
144
+ "USE_WEB_THICK": [True,False],
145
+ "WEB_THICK": [0,0],
146
+ "JOINT": [sect.J1,sect.JL1,sect.JL2,sect.JL3,sect.JL4,sect.JR1,sect.JR2,sect.JR3,sect.JR4],
147
+ "MATL_ELAST": sect.MATL_ELAST,
148
+ "MATL_DENS": sect.MATL_DENS,
149
+ "MATL_POIS_S": sect.MATL_POIS_S,
150
+ "MATL_POIS_C": sect.MATL_POIS_C,
151
+ "MATL_THERMAL": sect.MATL_THERMAL,
152
+ "USE_MULTI_ELAST": sect.USE_MULTI_ELAST,
153
+ "LONGTERM_ESEC": sect.LONGTERM_ESEC,
154
+ "SHRINK_ESEC": sect.SHRINK_ESEC,
155
+ },
156
+ "SECT_AFTER": {
157
+ "SLAB": [sect.BC,sect.TC,sect.HH]
158
+ }
159
+ }
160
+ js['SECT_BEFORE'].update(sect.OFFSET.JS)
161
+ js['SECT_BEFORE']['USE_SHEAR_DEFORM'] = sect.USESHEAR
162
+ js['SECT_BEFORE']['USE_WARPING_EFFECT'] = sect.USE7DOF
163
+ return js
164
+
165
+ @staticmethod
166
+ def _objectify(id,name,type,shape,offset,uShear,u7DOF,js):
167
+ vA = js['SECT_BEFORE']['SECT_I']['vSIZE_PSC_A']
168
+ vB = js['SECT_BEFORE']['SECT_I']['vSIZE_PSC_B']
169
+ vC = js['SECT_BEFORE']['SECT_I']['vSIZE_PSC_C']
170
+ vD = js['SECT_BEFORE']['SECT_I']['vSIZE_PSC_D']
171
+ joint = js['SECT_BEFORE']['JOINT']
172
+ slab = js['SECT_AFTER']['SLAB']
173
+ secti = js['SECT_BEFORE']
174
+
175
+ try: e1 = js['SECT_BEFORE']['LONGTERM_ESEC']
176
+ except: e1 = 0
177
+ try: e2 = js['SECT_BEFORE']['SHRINK_ESEC']
178
+ except: e2 = 0
179
+
180
+
181
+ return SS_COMP_PSC_I(name,False,joint,
182
+ slab[0],slab[1],slab[2],
183
+ vA[0],
184
+ vA[1],vA[2],vA[3],vA[4],vA[5],vA[6],vA[7],vA[8],vA[9],
185
+ vB[0],vB[1],vB[2],vB[3],vB[4],vB[5],vB[6],
186
+ vC[0],vC[1],vC[2],vC[3],vC[4],vC[5],vC[6],vC[7],vC[8],
187
+ vD[0],vD[1],vD[2],vD[3],vD[4],vD[5],vD[6],
188
+ secti['MATL_ELAST'],secti['MATL_DENS'],secti['MATL_POIS_S'],secti['MATL_POIS_C'],secti['MATL_THERMAL'],
189
+ secti['USE_MULTI_ELAST'],e1,e2,
190
+ offset,uShear,u7DOF,id)
191
+
192
+
193
+ class SS_COMP_STEEL_I_TYPE1(_common):
194
+
195
+ """ Create Standard USER DEFINED sections"""
196
+
197
+ def __init__(self,Name='',
198
+ Bc=0,tc=0,Hh=0,
199
+ Hw=0,B1=0,tf1=0,tw=0,B2=0,tf2=0,
200
+
201
+ EsEc =0, DsDc=0,Ps=0,Pc=0,TsTc=0,
202
+ MultiModulus = False,CreepEratio=0,ShrinkEratio=0,
203
+ Offset:Offset=Offset.CC(),useShear=True,use7Dof=False,id:int=0):
204
+
205
+ self.ID = id
206
+ self.NAME = Name
207
+ self.SHAPE = 'I'
208
+ self.TYPE = 'COMPOSITE'
209
+
210
+ self.BC =Bc
211
+ self.TC =tc
212
+ self.HH =Hh
213
+
214
+ self.HW = Hw
215
+ self.B1 = B1
216
+ self.TF1 = tf1
217
+ self.TW = tw
218
+ self.B2 = B2
219
+ self.TF2 = tf2
220
+
221
+ self.MATL_ELAST = EsEc
222
+ self.MATL_DENS = DsDc
223
+ self.MATL_POIS_S = Ps
224
+ self.MATL_POIS_C = Pc
225
+ self.MATL_THERMAL = TsTc
226
+ self.USE_MULTI_ELAST = MultiModulus
227
+ self.LONGTERM_ESEC = CreepEratio
228
+ self.SHRINK_ESEC = ShrinkEratio
229
+
230
+ self.OFFSET = Offset
231
+ self.USESHEAR = bool(useShear)
232
+ self.USE7DOF = bool(use7Dof)
233
+
234
+ def __str__(self):
235
+ return f' > ID = {self.ID} | STEEL COMPOSITE I SECTION \nJSON = {self.toJSON()}\n'
236
+
237
+
238
+ def toJSON(sect):
239
+ js = {
240
+ "SECTTYPE": sect.TYPE,
241
+ "SECT_NAME": sect.NAME,
242
+ "SECT_BEFORE": {
243
+ "SHAPE": sect.SHAPE,
244
+ "SECT_I": {
245
+ "vSIZE": [sect.HW,sect.TW,sect.B1,sect.TF1,sect.B2,sect.TF2],
246
+ },
247
+
248
+ "MATL_ELAST": sect.MATL_ELAST,
249
+ "MATL_DENS": sect.MATL_DENS,
250
+ "MATL_POIS_S": sect.MATL_POIS_S,
251
+ "MATL_POIS_C": sect.MATL_POIS_C,
252
+ "MATL_THERMAL": sect.MATL_THERMAL,
253
+ "USE_MULTI_ELAST": sect.USE_MULTI_ELAST,
254
+ "LONGTERM_ESEC": sect.LONGTERM_ESEC,
255
+ "SHRINK_ESEC": sect.SHRINK_ESEC,
256
+ },
257
+ "SECT_AFTER": {
258
+ "SLAB": [sect.BC,sect.TC,sect.HH]
259
+ }
260
+ }
261
+ js['SECT_BEFORE'].update(sect.OFFSET.JS)
262
+ js['SECT_BEFORE']['USE_SHEAR_DEFORM'] = sect.USESHEAR
263
+ js['SECT_BEFORE']['USE_WARPING_EFFECT'] = sect.USE7DOF
264
+ return js
265
+
266
+ @staticmethod
267
+ def _objectify(id,name,type,shape,offset,uShear,u7DOF,js):
268
+ vS = js['SECT_BEFORE']['SECT_I']['vSIZE']
269
+ slab = js['SECT_AFTER']['SLAB']
270
+ secti = js['SECT_BEFORE']
271
+
272
+ try: e1 = js['SECT_BEFORE']['LONGTERM_ESEC']
273
+ except: e1 = 0
274
+ try: e2 = js['SECT_BEFORE']['SHRINK_ESEC']
275
+ except: e2 = 0
276
+
277
+
278
+ return SS_COMP_STEEL_I_TYPE1(name,
279
+ slab[0],slab[1],slab[2],
280
+ vS[0],vS[2],vS[3],vS[1],vS[4],vS[5],
281
+ secti['MATL_ELAST'],secti['MATL_DENS'],secti['MATL_POIS_S'],secti['MATL_POIS_C'],secti['MATL_THERMAL'],
282
+ secti['USE_MULTI_ELAST'],e1,e2,
283
+ offset,uShear,u7DOF,id)
@@ -0,0 +1,43 @@
1
+ from ._offsetSS import Offset
2
+ from ._offsetSS import _common
3
+
4
+ class SS_DBUSER(_common):
5
+
6
+ """ Create Standard USER DEFINED sections"""
7
+
8
+ def __init__(self,Name='',Shape='',parameters:list=[],Offset=Offset(),useShear=True,use7Dof=False,id:int=0):
9
+ """ Shape = 'SB' 'SR' for rectangle \n For cylinder"""
10
+ self.ID = id
11
+ self.NAME = Name
12
+ self.TYPE = 'DBUSER'
13
+ self.SHAPE = Shape
14
+ self.PARAMS = parameters
15
+ self.OFFSET = Offset
16
+ self.USESHEAR = useShear
17
+ self.USE7DOF = use7Dof
18
+ self.DATATYPE = 2
19
+
20
+ def __str__(self):
21
+ return f' > ID = {self.ID} | USER DEFINED STANDARD SECTION \nJSON = {self.toJSON()}\n'
22
+
23
+
24
+ def toJSON(sect):
25
+ js = {
26
+ "SECTTYPE": "DBUSER",
27
+ "SECT_NAME": sect.NAME,
28
+ "SECT_BEFORE": {
29
+ "SHAPE": sect.SHAPE,
30
+ "DATATYPE": sect.DATATYPE,
31
+ "SECT_I": {
32
+ "vSIZE": sect.PARAMS
33
+ }
34
+ }
35
+ }
36
+ js['SECT_BEFORE'].update(sect.OFFSET.JS)
37
+ js['SECT_BEFORE']['USE_SHEAR_DEFORM'] = sect.USESHEAR
38
+ js['SECT_BEFORE']['USE_WARPING_EFFECT'] = sect.USE7DOF
39
+ return js
40
+
41
+ @staticmethod
42
+ def _objectify(id,name,type,shape,offset,uShear,u7DOF,js):
43
+ return SS_DBUSER(name,shape,js['SECT_BEFORE']['SECT_I']['vSIZE'],offset,uShear,u7DOF,id)