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