midas-civil 1.0.7__tar.gz → 1.0.8__tar.gz
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-1.0.7 → midas_civil-1.0.8}/PKG-INFO +1 -1
- midas_civil-1.0.8/midas_civil/_BoundaryChangeAssignment.py +278 -0
- {midas_civil-1.0.7 → midas_civil-1.0.8}/midas_civil/__init__.py +5 -5
- {midas_civil-1.0.7 → midas_civil-1.0.8}/midas_civil/_element.py +62 -2
- {midas_civil-1.0.7 → midas_civil-1.0.8}/midas_civil/_group.py +1 -1
- {midas_civil-1.0.7 → midas_civil-1.0.8}/midas_civil/_load.py +1 -1
- {midas_civil-1.0.7 → midas_civil-1.0.8}/midas_civil/_mapi.py +2 -1
- {midas_civil-1.0.7 → midas_civil-1.0.8}/midas_civil/_model.py +40 -41
- {midas_civil-1.0.7 → midas_civil-1.0.8}/midas_civil/_movingload.py +1 -1
- {midas_civil-1.0.7 → midas_civil-1.0.8}/midas_civil/_node.py +1 -1
- {midas_civil-1.0.7 → midas_civil-1.0.8}/midas_civil/_result.py +1 -2
- {midas_civil-1.0.7 → midas_civil-1.0.8}/midas_civil/_result_extract.py +0 -1
- midas_civil-1.0.8/midas_civil/_section/_TapdbSecSS.py +47 -0
- {midas_civil-1.0.7 → midas_civil-1.0.8}/midas_civil/_section/__init__.py +41 -2
- {midas_civil-1.0.7 → midas_civil-1.0.8}/midas_civil/_section/_dbSecSS.py +15 -1
- midas_civil-1.0.8/midas_civil/_section/_tapPSC1CellSS.py +186 -0
- {midas_civil-1.0.7 → midas_civil-1.0.8}/midas_civil/_settlement.py +0 -1
- {midas_civil-1.0.7 → midas_civil-1.0.8}/midas_civil/_temperature.py +1 -1
- {midas_civil-1.0.7 → midas_civil-1.0.8}/midas_civil/_tendon.py +1 -0
- {midas_civil-1.0.7 → midas_civil-1.0.8}/midas_civil/_thickness.py +0 -1
- {midas_civil-1.0.7 → midas_civil-1.0.8}/midas_civil/_utils.py +3 -3
- {midas_civil-1.0.7 → midas_civil-1.0.8}/midas_civil.egg-info/PKG-INFO +1 -1
- {midas_civil-1.0.7 → midas_civil-1.0.8}/midas_civil.egg-info/SOURCES.txt +3 -0
- {midas_civil-1.0.7 → midas_civil-1.0.8}/setup.py +1 -1
- {midas_civil-1.0.7 → midas_civil-1.0.8}/LICENSE +0 -0
- {midas_civil-1.0.7 → midas_civil-1.0.8}/README.md +0 -0
- {midas_civil-1.0.7 → midas_civil-1.0.8}/midas_civil/_analysiscontrol.py +0 -0
- {midas_civil-1.0.7 → midas_civil-1.0.8}/midas_civil/_boundary.py +0 -0
- {midas_civil-1.0.7 → midas_civil-1.0.8}/midas_civil/_construction.py +0 -0
- {midas_civil-1.0.7 → midas_civil-1.0.8}/midas_civil/_construction_backup.py +0 -0
- {midas_civil-1.0.7 → midas_civil-1.0.8}/midas_civil/_material.py +0 -0
- {midas_civil-1.0.7 → midas_civil-1.0.8}/midas_civil/_result copy.py +0 -0
- {midas_civil-1.0.7 → midas_civil-1.0.8}/midas_civil/_section/_compositeSS.py +0 -0
- {midas_civil-1.0.7 → midas_civil-1.0.8}/midas_civil/_section/_offsetSS.py +0 -0
- {midas_civil-1.0.7 → midas_civil-1.0.8}/midas_civil/_section/_pscSS.py +0 -0
- {midas_civil-1.0.7 → midas_civil-1.0.8}/midas_civil/_section/_unSupp.py +0 -0
- {midas_civil-1.0.7 → midas_civil-1.0.8}/midas_civil/_view.py +0 -0
- {midas_civil-1.0.7 → midas_civil-1.0.8}/midas_civil.egg-info/dependency_links.txt +0 -0
- {midas_civil-1.0.7 → midas_civil-1.0.8}/midas_civil.egg-info/requires.txt +0 -0
- {midas_civil-1.0.7 → midas_civil-1.0.8}/midas_civil.egg-info/top_level.txt +0 -0
- {midas_civil-1.0.7 → midas_civil-1.0.8}/setup.cfg +0 -0
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
from ._mapi import *
|
|
2
|
+
from ._load import *
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class BoundaryChangeAssignment:
|
|
6
|
+
|
|
7
|
+
data = []
|
|
8
|
+
|
|
9
|
+
def __init__(self,
|
|
10
|
+
# Support options
|
|
11
|
+
bSPT: bool = False,
|
|
12
|
+
bSPR: bool = False,
|
|
13
|
+
bGSPR: bool = False,
|
|
14
|
+
bCGLINK: bool = False,
|
|
15
|
+
bSSSF: bool = False,
|
|
16
|
+
bPSSF: bool = False,
|
|
17
|
+
bRLS: bool = False,
|
|
18
|
+
bWSSF: bool = False,
|
|
19
|
+
bESSF: bool = False,
|
|
20
|
+
bCDOF: bool = False,
|
|
21
|
+
# Boundary settings
|
|
22
|
+
vBOUNDARY: list = None,
|
|
23
|
+
# Load analysis settings for ST type
|
|
24
|
+
ST_load_assignments: list = None,
|
|
25
|
+
# Load analysis settings for other types
|
|
26
|
+
MV: str = None,
|
|
27
|
+
SM: str = None,
|
|
28
|
+
THRSEV: str = None,
|
|
29
|
+
PO: str = None,
|
|
30
|
+
THNS: str = None,
|
|
31
|
+
ULAT: str = None):
|
|
32
|
+
"""
|
|
33
|
+
Boundary Change Assignment constructor.
|
|
34
|
+
|
|
35
|
+
Parameters:
|
|
36
|
+
bSPT: Support (default False)
|
|
37
|
+
bSPR: Point Spring Support (default False)
|
|
38
|
+
bGSPR: General Spring Support (default False)
|
|
39
|
+
bCGLINK: Change General Link Property (default False)
|
|
40
|
+
bSSSF: Section Stiffness Scale Factor (default False)
|
|
41
|
+
bPSSF: Plate Stiffness Scale Factor (default False)
|
|
42
|
+
bRLS: Beam End Release (default False)
|
|
43
|
+
bWSSF: Wall Stiffness Scale Factor (default False)
|
|
44
|
+
bESSF: Element Stiffness Scale Factor (default False)
|
|
45
|
+
bCDOF: Constrain DOF associated with specified displacements/Settlements by boundary group combinations (default False)
|
|
46
|
+
vBOUNDARY: List of boundary assignments in format [["L1", "BG2"], ["L2", "BG1"]]
|
|
47
|
+
ST_load_assignments: List of ST type load cases with BGCNAME assignments in format [["Self-weight", "L1"], ["SIDL", "UNCHANGED"]]
|
|
48
|
+
MV, SM, THRSEV, PO, THNS, ULAT: Boundary group names for respective analysis types
|
|
49
|
+
|
|
50
|
+
Examples:
|
|
51
|
+
# Basic boundary change assignment
|
|
52
|
+
BoundaryChangeAssignment(
|
|
53
|
+
bSPT=True,
|
|
54
|
+
bCDOF=True,
|
|
55
|
+
vBOUNDARY=[["L1", "BG2"], ["L2", "BG1"]],
|
|
56
|
+
ST_load_assignments=[["Self-weight", "L1"]],
|
|
57
|
+
MV="L1"
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
# Complex assignment with multiple load types
|
|
61
|
+
BoundaryChangeAssignment(
|
|
62
|
+
bSPT=True,
|
|
63
|
+
bSPR=False,
|
|
64
|
+
bGSPR=False,
|
|
65
|
+
vBOUNDARY=[["L1", "BG2"], ["L2", "BG1"]],
|
|
66
|
+
ST_load_assignments=[["Self-weight", "L1"], ["SIDL", "L2"]],
|
|
67
|
+
MV="L1",
|
|
68
|
+
SM="L2",
|
|
69
|
+
THRSEV="L1"
|
|
70
|
+
)
|
|
71
|
+
"""
|
|
72
|
+
|
|
73
|
+
# ID is always 1 based on the pattern
|
|
74
|
+
self.ID = 1
|
|
75
|
+
|
|
76
|
+
# Set support parameters
|
|
77
|
+
self.bSPT = bSPT
|
|
78
|
+
self.bSPR = bSPR
|
|
79
|
+
self.bGSPR = bGSPR
|
|
80
|
+
self.bCGLINK = bCGLINK
|
|
81
|
+
self.bSSSF = bSSSF
|
|
82
|
+
self.bPSSF = bPSSF
|
|
83
|
+
self.bRLS = bRLS
|
|
84
|
+
self.bWSSF = bWSSF
|
|
85
|
+
self.bESSF = bESSF
|
|
86
|
+
self.bCDOF = bCDOF
|
|
87
|
+
|
|
88
|
+
# Process boundary data
|
|
89
|
+
self.vBOUNDARY = self._process_boundary_data(vBOUNDARY)
|
|
90
|
+
|
|
91
|
+
# Process load analysis data
|
|
92
|
+
self.vLOADANAL = self._process_load_analysis_data(
|
|
93
|
+
ST_load_assignments, MV, SM, THRSEV, PO, THNS, ULAT
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
# Add to static list
|
|
97
|
+
BoundaryChangeAssignment.data.append(self)
|
|
98
|
+
|
|
99
|
+
# Automatically execute the data when instance is created
|
|
100
|
+
self._execute()
|
|
101
|
+
|
|
102
|
+
def _process_boundary_data(self, vBOUNDARY):
|
|
103
|
+
"""
|
|
104
|
+
Process boundary data from list format to required JSON structure.
|
|
105
|
+
Input: [["L1", "BG2"], ["L2", "BG1"]]
|
|
106
|
+
Output: [{"BGCNAME": "L1", "vBG": ["BG2"]}, {"BGCNAME": "L2", "vBG": ["BG1"]}]
|
|
107
|
+
"""
|
|
108
|
+
if not vBOUNDARY:
|
|
109
|
+
return []
|
|
110
|
+
|
|
111
|
+
boundary_list = []
|
|
112
|
+
for boundary_pair in vBOUNDARY:
|
|
113
|
+
if len(boundary_pair) == 2:
|
|
114
|
+
boundary_list.append({
|
|
115
|
+
"BGCNAME": boundary_pair[0],
|
|
116
|
+
"vBG": [boundary_pair[1]]
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
return boundary_list
|
|
120
|
+
|
|
121
|
+
def _get_load_cases(self):
|
|
122
|
+
"""
|
|
123
|
+
Get load cases from the system using Load_Case.get() command.
|
|
124
|
+
This simulates the API call that would retrieve current load cases.
|
|
125
|
+
"""
|
|
126
|
+
try:
|
|
127
|
+
# This would be replaced with actual API call: Load_Case.get()
|
|
128
|
+
# For now, using the provided example data structure
|
|
129
|
+
load_cases_response = Load_Case.get()
|
|
130
|
+
return load_cases_response.get('STLD', {})
|
|
131
|
+
except:
|
|
132
|
+
# Fallback to empty if API call fails
|
|
133
|
+
return {}
|
|
134
|
+
|
|
135
|
+
def _convert_st_assignments_to_dict(self, ST_load_assignments):
|
|
136
|
+
"""
|
|
137
|
+
Convert ST_load_assignments from list format to dictionary format.
|
|
138
|
+
Input: [["Self-weight", "L1"], ["SIDL", "UNCHANGED"]]
|
|
139
|
+
Output: {"Self-weight": "L1", "SIDL": "UNCHANGED"}
|
|
140
|
+
"""
|
|
141
|
+
if not ST_load_assignments:
|
|
142
|
+
return {}
|
|
143
|
+
|
|
144
|
+
assignments_dict = {}
|
|
145
|
+
for assignment_pair in ST_load_assignments:
|
|
146
|
+
if len(assignment_pair) == 2:
|
|
147
|
+
assignments_dict[assignment_pair[0]] = assignment_pair[1]
|
|
148
|
+
|
|
149
|
+
return assignments_dict
|
|
150
|
+
|
|
151
|
+
def _process_load_analysis_data(self, ST_load_assignments, MV, SM, THRSEV, PO, THNS, ULAT):
|
|
152
|
+
"""
|
|
153
|
+
Process load analysis data combining user input with system load cases.
|
|
154
|
+
"""
|
|
155
|
+
load_anal_list = []
|
|
156
|
+
|
|
157
|
+
# Get current load cases from system
|
|
158
|
+
load_cases = self._get_load_cases()
|
|
159
|
+
|
|
160
|
+
# Process ST type load cases
|
|
161
|
+
st_cases = {case_data['NAME']: case_data for case_data in load_cases.values() } # Assuming ST cases are USER type
|
|
162
|
+
|
|
163
|
+
# Convert ST_load_assignments from list format to dictionary format for internal processing
|
|
164
|
+
st_assignments_dict = self._convert_st_assignments_to_dict(ST_load_assignments)
|
|
165
|
+
|
|
166
|
+
if st_cases:
|
|
167
|
+
for case_name in st_cases.keys():
|
|
168
|
+
bgcname = "UNCHANGED" # Default value
|
|
169
|
+
|
|
170
|
+
# If user provided specific assignment for this load case
|
|
171
|
+
if st_assignments_dict and case_name in st_assignments_dict:
|
|
172
|
+
bgcname = st_assignments_dict[case_name]
|
|
173
|
+
|
|
174
|
+
load_anal_list.append({
|
|
175
|
+
"TYPE": "ST",
|
|
176
|
+
"BGCNAME": bgcname,
|
|
177
|
+
"LCNAME": case_name
|
|
178
|
+
})
|
|
179
|
+
|
|
180
|
+
# Process other load analysis types
|
|
181
|
+
analysis_types = {
|
|
182
|
+
"MV": MV,
|
|
183
|
+
"SM": SM,
|
|
184
|
+
"THRSEV": THRSEV,
|
|
185
|
+
"PO": PO,
|
|
186
|
+
"THNS": THNS,
|
|
187
|
+
"ULAT": ULAT
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
for analysis_type, bgcname in analysis_types.items():
|
|
191
|
+
load_anal_entry = {
|
|
192
|
+
"TYPE": analysis_type,
|
|
193
|
+
"BGCNAME": bgcname if bgcname is not None else "UNCHANGED"
|
|
194
|
+
}
|
|
195
|
+
load_anal_list.append(load_anal_entry)
|
|
196
|
+
|
|
197
|
+
return load_anal_list
|
|
198
|
+
|
|
199
|
+
def _execute(self):
|
|
200
|
+
"""
|
|
201
|
+
Automatically sends the BoundaryChangeAssignment to the system when created.
|
|
202
|
+
"""
|
|
203
|
+
json_data = {"Assign": {}}
|
|
204
|
+
|
|
205
|
+
boundary_data = {
|
|
206
|
+
"bSPT": self.bSPT,
|
|
207
|
+
"bSPR": self.bSPR,
|
|
208
|
+
"bGSPR": self.bGSPR,
|
|
209
|
+
"bCGLINK": self.bCGLINK,
|
|
210
|
+
"bSSSF": self.bSSSF,
|
|
211
|
+
"bPSSF": self.bPSSF,
|
|
212
|
+
"bRLS": self.bRLS,
|
|
213
|
+
"bWSSF": self.bWSSF,
|
|
214
|
+
"bESSF": self.bESSF,
|
|
215
|
+
"bCDOF": self.bCDOF,
|
|
216
|
+
"vBOUNDARY": self.vBOUNDARY,
|
|
217
|
+
"vLOADANAL": self.vLOADANAL
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
json_data["Assign"][str(self.ID)] = boundary_data
|
|
221
|
+
|
|
222
|
+
# Execute the API call
|
|
223
|
+
MidasAPI("PUT", "/db/bcct", json_data)
|
|
224
|
+
|
|
225
|
+
def __str__(self):
|
|
226
|
+
"""
|
|
227
|
+
String representation of the BoundaryChangeAssignment.
|
|
228
|
+
"""
|
|
229
|
+
return f"BoundaryChangeAssignment(ID={self.ID}, Boundaries={len(self.vBOUNDARY)}, LoadAnalyses={len(self.vLOADANAL)})"
|
|
230
|
+
|
|
231
|
+
def __repr__(self):
|
|
232
|
+
"""
|
|
233
|
+
Detailed representation of the BoundaryChangeAssignment.
|
|
234
|
+
"""
|
|
235
|
+
return (f"BoundaryChangeAssignment(ID={self.ID}, "
|
|
236
|
+
f"bSPT={self.bSPT}, bCDOF={self.bCDOF}, "
|
|
237
|
+
f"Boundaries={self.vBOUNDARY}, "
|
|
238
|
+
f"LoadAnalyses={self.vLOADANAL})")
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
# Example usage:
|
|
243
|
+
"""
|
|
244
|
+
# Example 1: Basic boundary change assignment
|
|
245
|
+
boundary_assignment = BoundaryChangeAssignment(
|
|
246
|
+
bSPT=True,
|
|
247
|
+
bCDOF=True,
|
|
248
|
+
vBOUNDARY=[["L1", "BG2"], ["L2", "BG1"]],
|
|
249
|
+
ST_load_assignments=[["Self-weight", "L1"]],
|
|
250
|
+
MV="L1"
|
|
251
|
+
)
|
|
252
|
+
|
|
253
|
+
# Example 2: Complex assignment with multiple settings
|
|
254
|
+
complex_assignment = BoundaryChangeAssignment(
|
|
255
|
+
bSPT=True,
|
|
256
|
+
bSPR=False,
|
|
257
|
+
bGSPR=False,
|
|
258
|
+
bCGLINK=False,
|
|
259
|
+
bSSSF=False,
|
|
260
|
+
bPSSF=False,
|
|
261
|
+
bRLS=False,
|
|
262
|
+
bCDOF=True,
|
|
263
|
+
vBOUNDARY=[["L1", "BG2"], ["L2", "BG1"]],
|
|
264
|
+
ST_load_assignments=[["Self-weight", "L1"], ["SIDL", "UNCHANGED"]],
|
|
265
|
+
MV="UNCHANGED",
|
|
266
|
+
SM="L2",
|
|
267
|
+
THRSEV="L1",
|
|
268
|
+
PO="UNCHANGED",
|
|
269
|
+
THNS="UNCHANGED",
|
|
270
|
+
ULAT="UNCHANGED"
|
|
271
|
+
)
|
|
272
|
+
|
|
273
|
+
# Example 3: Minimal assignment with defaults
|
|
274
|
+
minimal_assignment = BoundaryChangeAssignment(
|
|
275
|
+
bSPT=True,
|
|
276
|
+
vBOUNDARY=[["L1", "BG2"]]
|
|
277
|
+
)
|
|
278
|
+
"""
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import requests
|
|
2
2
|
from ._mapi import *
|
|
3
|
-
_version_ = "1.0.
|
|
3
|
+
_version_ = "1.0.8"
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
print('')
|
|
@@ -42,8 +42,8 @@ from ._temperature import *
|
|
|
42
42
|
from ._tendon import *
|
|
43
43
|
from ._view import *
|
|
44
44
|
|
|
45
|
-
from ._movingload import*
|
|
46
|
-
from ._settlement import*
|
|
47
|
-
from ._analysiscontrol import*
|
|
48
|
-
|
|
45
|
+
from ._movingload import *
|
|
46
|
+
from ._settlement import *
|
|
47
|
+
from ._analysiscontrol import *
|
|
48
|
+
from ._BoundaryChangeAssignment import*
|
|
49
49
|
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
from ._mapi import *
|
|
2
2
|
from ._node import *
|
|
3
3
|
from ._group import _add_elem_2_stGroup
|
|
4
|
-
from ._group import _add_node_2_stGroup
|
|
4
|
+
from ._group import _add_node_2_stGroup,Group
|
|
5
5
|
import numpy as np
|
|
6
6
|
from scipy.interpolate import splev, splprep
|
|
7
7
|
from math import hypot
|
|
8
8
|
import math
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
def _interpolateAlignment(pointsArray,n_seg=10,deg=1,mSize=0,includePoint:bool=True) -> list:
|
|
11
|
+
def _interpolateAlignment(pointsArray,n_seg=10,deg=1,mSize=0,includePoint:bool=True,yEcc=0,zEcc=0) -> list:
|
|
12
12
|
''' Returns point list and beta angle list'''
|
|
13
13
|
pointsArray = np.array(pointsArray)
|
|
14
14
|
x_p, y_p , z_p = pointsArray[:,0] , pointsArray[:,1] , pointsArray[:,2]
|
|
@@ -84,6 +84,7 @@ def _interpolateAlignment(pointsArray,n_seg=10,deg=1,mSize=0,includePoint:bool=T
|
|
|
84
84
|
return align_fine_points
|
|
85
85
|
|
|
86
86
|
|
|
87
|
+
|
|
87
88
|
def _nodeDIST(a:Node,b:Node):
|
|
88
89
|
return round(hypot((a.X-b.X),(a.Y-b.Y),(a.Z-b.Z)),6)
|
|
89
90
|
|
|
@@ -109,6 +110,43 @@ def _triangleAREA(a:Node,b:Node,c:Node):
|
|
|
109
110
|
mag = np.linalg.norm(np.cross(v1, v2))
|
|
110
111
|
return float(0.5 * mag) , np.cross(v1, v2)/mag
|
|
111
112
|
|
|
113
|
+
def _calcVector(deltaLocation):
|
|
114
|
+
Z_new = np.array([0.000001,0,1])
|
|
115
|
+
X_new = np.array(deltaLocation)
|
|
116
|
+
Y_new = np.cross(Z_new, X_new)
|
|
117
|
+
|
|
118
|
+
Z_new = np.cross(X_new, Y_new) # Recomputing
|
|
119
|
+
|
|
120
|
+
X_new = X_new / (np.linalg.norm(X_new)+0.000001)
|
|
121
|
+
Y_new = Y_new / (np.linalg.norm(Y_new)+0.000001)
|
|
122
|
+
Z_new = Z_new / (np.linalg.norm(Z_new)+0.000001)
|
|
123
|
+
|
|
124
|
+
return [X_new,Y_new,Z_new]
|
|
125
|
+
|
|
126
|
+
def _pointOffset(pts,yEcc,zEcc):
|
|
127
|
+
norm = []
|
|
128
|
+
norm.append(_calcVector(np.subtract(pts[1],pts[0])))
|
|
129
|
+
|
|
130
|
+
for i in range(len(pts)-2):
|
|
131
|
+
X_new1 = np.array(np.subtract(pts[i+1],pts[i]))
|
|
132
|
+
X_new2 = np.array(np.subtract(pts[i+2],pts[i+1]))
|
|
133
|
+
|
|
134
|
+
X_new1 = X_new1 / (np.linalg.norm(X_new1)+0.000001)
|
|
135
|
+
X_new2 = X_new2 / (np.linalg.norm(X_new2)+0.000001)
|
|
136
|
+
|
|
137
|
+
norm.append(_calcVector(np.add(X_new1,X_new2)))
|
|
138
|
+
|
|
139
|
+
norm.append(_calcVector(np.subtract(pts[-1],pts[-2])))
|
|
140
|
+
|
|
141
|
+
# print(norm)
|
|
142
|
+
|
|
143
|
+
pt_new = []
|
|
144
|
+
for i in range(len(pts)):
|
|
145
|
+
pt_new.append(pts[i]+yEcc*norm[i][1]+zEcc*norm[i][2])
|
|
146
|
+
|
|
147
|
+
return pt_new
|
|
148
|
+
|
|
149
|
+
|
|
112
150
|
def _ADD(self):
|
|
113
151
|
"""
|
|
114
152
|
Adds an element to the main list. If the ID is 0, it auto-increments.
|
|
@@ -412,6 +450,28 @@ class Element:
|
|
|
412
450
|
beam_obj.append(Element.Beam(beam_nodes[i],beam_nodes[i+1],mat,sect,angle,group,id_new,bLocalAxis))
|
|
413
451
|
|
|
414
452
|
return beam_obj
|
|
453
|
+
|
|
454
|
+
@staticmethod
|
|
455
|
+
def PLine2(points_loc:list,n_div:int=0,deg:int=1,includePoint:bool=True,mat:int=1,sect:int=1,angle:float=0, group = "" , id: int = 0,bLocalAxis=False,yEcc=0,zEcc=0):
|
|
456
|
+
|
|
457
|
+
beam_nodes =[]
|
|
458
|
+
beam_obj = []
|
|
459
|
+
if n_div == 0 :
|
|
460
|
+
i_loc = points_loc
|
|
461
|
+
else:
|
|
462
|
+
i_loc = _interpolateAlignment(points_loc,n_div,deg,0,includePoint,yEcc,zEcc)
|
|
463
|
+
|
|
464
|
+
i_loc2 = _pointOffset(i_loc,yEcc,zEcc)
|
|
465
|
+
for i in i_loc2:
|
|
466
|
+
Enode=Node(i[0],i[1],i[2])
|
|
467
|
+
beam_nodes.append(Enode.ID)
|
|
468
|
+
|
|
469
|
+
for i in range(len(i_loc2)-1):
|
|
470
|
+
if id == 0 : id_new = 0
|
|
471
|
+
else: id_new = id+i
|
|
472
|
+
beam_obj.append(Element.Beam(beam_nodes[i],beam_nodes[i+1],mat,sect,angle,group,id_new,bLocalAxis))
|
|
473
|
+
|
|
474
|
+
return beam_obj
|
|
415
475
|
|
|
416
476
|
class Truss(_common):
|
|
417
477
|
def __init__(self, i: int, j: int, mat: int = 1, sect: int = 1, angle: float = 0, group = "" , id: int = 0):
|
|
@@ -195,46 +195,46 @@ class Model:
|
|
|
195
195
|
|
|
196
196
|
|
|
197
197
|
|
|
198
|
-
@staticmethod
|
|
199
|
-
def _create2(request = "update", set = 1, force = "KN", length = "M", heat = "BTU", temp = "C"):
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
198
|
+
# @staticmethod
|
|
199
|
+
# def _create2(request = "update", set = 1, force = "KN", length = "M", heat = "BTU", temp = "C"):
|
|
200
|
+
# """request["update" to update a model, "call" to get details of existing model], \nforce[Optional], length[Optional], heat[Optional], temp[Optional].
|
|
201
|
+
# \nSample: model() to update/create model. model("call") to get details of existing model and update classes.\n
|
|
202
|
+
# set = 1 => Functions that don't need to call data from connected model file.\n
|
|
203
|
+
# set = 2 => Functions that may need to call data from connected model file."""
|
|
204
|
+
# Model.units(force, length, heat, temp)
|
|
205
|
+
# if MAPI_KEY.data == []: print(f"Enter the MAPI key using the MAPI_KEY command.")
|
|
206
|
+
# if MAPI_KEY.data != []:
|
|
207
|
+
# if set == 1:
|
|
208
|
+
# if request == "update" or request == "create" or request == "PUT":
|
|
209
|
+
# if Node.json() != {"Assign":{}}: Node.create()
|
|
210
|
+
# if Element.json() != {"Assign":{}}: Element.create()
|
|
211
|
+
# if Section.json() != {"Assign":{}}: Section.create()
|
|
212
|
+
# if Group.json_BG() != {"Assign":{}}: Group.create_BG()
|
|
213
|
+
# if Group.json_LG() != {"Assign":{}}: Group.create_LG()
|
|
214
|
+
# if Group.json_TG() != {"Assign":{}}: Group.create_TG()
|
|
215
|
+
# if Material.json() != {"Assign":{}}: Material.create()
|
|
216
|
+
# if request == "call" or request == "GET":
|
|
217
|
+
# Node.sync()
|
|
218
|
+
# Element.sync()
|
|
219
|
+
# Section.sync()
|
|
220
|
+
# Group.sync()
|
|
221
|
+
# Material.sync()
|
|
222
|
+
# if set == 2:
|
|
223
|
+
# if request == "update" or request == "create" or request == "PUT":
|
|
224
|
+
# if Node.json() != {"Assign":{}}: Node.create()
|
|
225
|
+
# if Element.json() != {"Assign":{}}: Element.create()
|
|
226
|
+
# if Section.json() != {"Assign":{}}: Section.create()
|
|
227
|
+
# if Group.json_BG() != {"Assign":{}}: Group.create_BG()
|
|
228
|
+
# if Group.json_LG() != {"Assign":{}}: Group.create_LG()
|
|
229
|
+
# if Group.json_TG() != {"Assign":{}}: Group.create_TG()
|
|
230
|
+
# if Material.json() != {"Assign":{}}: Material.create()
|
|
231
|
+
# if Group.json_SG() != {"Assign":{}}: Group.create_SG()
|
|
232
|
+
# if request == "call" or request == "GET":
|
|
233
|
+
# Node.update_class()
|
|
234
|
+
# Element.update_class()
|
|
235
|
+
# Section.update_class()
|
|
236
|
+
# Group.update_class()
|
|
237
|
+
# Material.update_class()
|
|
238
238
|
|
|
239
239
|
|
|
240
240
|
|
|
@@ -403,4 +403,3 @@ class Model:
|
|
|
403
403
|
|
|
404
404
|
|
|
405
405
|
|
|
406
|
-
|
|
@@ -289,4 +289,4 @@ class NodeLocalAxis:
|
|
|
289
289
|
|
|
290
290
|
# for j in a['NODE'].keys():
|
|
291
291
|
|
|
292
|
-
# Node(round(a['NODE'][j]['X'],6), round(a['NODE'][j]['Y'],6), round(a['NODE'][j]['Z'],6), id=int(j), group='', merge=0)
|
|
292
|
+
# Node(round(a['NODE'][j]['X'],6), round(a['NODE'][j]['Y'],6), round(a['NODE'][j]['Z'],6), id=int(j), group='', merge=0)
|
|
@@ -151,5 +151,4 @@ class LoadCombination:
|
|
|
151
151
|
print("No load combinations are defined to delete.")
|
|
152
152
|
for i in list(json.keys()):
|
|
153
153
|
MidasAPI("DELETE",LoadCombination.com_map.get(i) + a)
|
|
154
|
-
#---------------------------------------------------------------------------------------------------------------
|
|
155
|
-
|
|
154
|
+
#---------------------------------------------------------------------------------------------------------------
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
from ._offsetSS import Offset
|
|
2
|
+
from ._offsetSS import _common
|
|
3
|
+
|
|
4
|
+
class _SS_TAPERED_DBUSER(_common):
|
|
5
|
+
|
|
6
|
+
""" Create Standard USER DEFINED sections"""
|
|
7
|
+
|
|
8
|
+
def __init__(self,Name='',Shape='',params_I:list=[],params_J: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 = 'TAPERED'
|
|
13
|
+
self.SHAPE = Shape
|
|
14
|
+
self.PARAMS_I = params_I
|
|
15
|
+
self.PARAMS_J = params_J
|
|
16
|
+
self.OFFSET = Offset
|
|
17
|
+
self.USESHEAR = useShear
|
|
18
|
+
self.USE7DOF = use7Dof
|
|
19
|
+
self.DATATYPE = 2
|
|
20
|
+
|
|
21
|
+
def __str__(self):
|
|
22
|
+
return f' > ID = {self.ID} | USER DEFINED STANDARD SECTION \nJSON = {self.toJSON()}\n'
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def toJSON(sect):
|
|
26
|
+
js = {
|
|
27
|
+
"SECTTYPE": sect.TYPE,
|
|
28
|
+
"SECT_NAME": sect.NAME,
|
|
29
|
+
"SECT_BEFORE": {
|
|
30
|
+
"SHAPE": sect.SHAPE,
|
|
31
|
+
"TYPE": sect.DATATYPE,
|
|
32
|
+
"SECT_I": {
|
|
33
|
+
"vSIZE": sect.PARAMS_I
|
|
34
|
+
},
|
|
35
|
+
"SECT_J": {
|
|
36
|
+
"vSIZE": sect.PARAMS_J
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
js['SECT_BEFORE'].update(sect.OFFSET.JS)
|
|
41
|
+
js['SECT_BEFORE']['USE_SHEAR_DEFORM'] = sect.USESHEAR
|
|
42
|
+
js['SECT_BEFORE']['USE_WARPING_EFFECT'] = sect.USE7DOF
|
|
43
|
+
return js
|
|
44
|
+
|
|
45
|
+
@staticmethod
|
|
46
|
+
def _objectify(id,name,type,shape,offset,uShear,u7DOF,js):
|
|
47
|
+
return _SS_TAPERED_DBUSER(name,shape,js['SECT_BEFORE']['SECT_I']['vSIZE'],js['SECT_BEFORE']['SECT_J']['vSIZE'],offset,uShear,u7DOF,id)
|
|
@@ -3,12 +3,15 @@ from ._dbSecSS import _SS_DBUSER
|
|
|
3
3
|
from ._offsetSS import Offset
|
|
4
4
|
from ._unSupp import _SS_UNSUPP,_SS_STD_DB
|
|
5
5
|
from ._compositeSS import _SS_COMP_PSC_I,_SS_COMP_STEEL_I_TYPE1
|
|
6
|
+
from ._TapdbSecSS import _SS_TAPERED_DBUSER
|
|
7
|
+
|
|
8
|
+
from ._tapPSC1CellSS import _SS_TAP_PSC_1CELL
|
|
6
9
|
|
|
7
10
|
from midas_civil import MidasAPI
|
|
8
11
|
|
|
9
12
|
|
|
10
13
|
class _helperSECTION:
|
|
11
|
-
NAME, SHAPE, TYPE, OFFSET, USESHEAR, USE7DOF = 0,0,0,0,0,0
|
|
14
|
+
ID, NAME, SHAPE, TYPE, OFFSET, USESHEAR, USE7DOF = 0,0,0,0,0,0,0
|
|
12
15
|
def update():
|
|
13
16
|
pass
|
|
14
17
|
def toJSON():
|
|
@@ -85,6 +88,12 @@ def _JS2OBJ(id,js):
|
|
|
85
88
|
if shape in ['CI']: obj = _SS_COMP_PSC_I._objectify(id,name,type,shape,offset,uShear,u7DOF,js)
|
|
86
89
|
elif shape in ['I']: obj = _SS_COMP_STEEL_I_TYPE1._objectify(id,name,type,shape,offset,uShear,u7DOF,js)
|
|
87
90
|
else: obj = _SS_UNSUPP(id,name,type,shape,offset,uShear,u7DOF,js)
|
|
91
|
+
|
|
92
|
+
elif type == 'TAPERED' :
|
|
93
|
+
if js['SECT_BEFORE']['TYPE'] ==2: obj = _SS_TAPERED_DBUSER._objectify(id,name,type,shape,offset,uShear,u7DOF,js)
|
|
94
|
+
elif shape in ['1CEL']: obj = _SS_TAP_PSC_1CELL._objectify(id,name,type,shape,offset,uShear,u7DOF,js)
|
|
95
|
+
else: obj = _SS_UNSUPP(id,name,type,shape,offset,uShear,u7DOF,js)
|
|
96
|
+
|
|
88
97
|
else :
|
|
89
98
|
obj = _SS_UNSUPP(id,name,type,shape,offset,uShear,u7DOF,js)
|
|
90
99
|
|
|
@@ -106,7 +115,7 @@ class Section:
|
|
|
106
115
|
json = {"Assign":{}}
|
|
107
116
|
for sect in cls.sect:
|
|
108
117
|
js = sect.toJSON()
|
|
109
|
-
json["Assign"][sect.ID] = js
|
|
118
|
+
json["Assign"][str(sect.ID)] = js
|
|
110
119
|
return json
|
|
111
120
|
|
|
112
121
|
@staticmethod
|
|
@@ -216,6 +225,36 @@ class Section:
|
|
|
216
225
|
|
|
217
226
|
_SectionADD(sect_Obj)
|
|
218
227
|
return sect_Obj
|
|
228
|
+
|
|
229
|
+
class Tapered:
|
|
230
|
+
|
|
231
|
+
@staticmethod
|
|
232
|
+
def DBUSER(Name='',Shape='',params_I:list=[],params_J:list=[],Offset=Offset(),useShear=True,use7Dof=False,id:int=0):
|
|
233
|
+
args = locals()
|
|
234
|
+
sect_Obj = _SS_TAPERED_DBUSER(**args)
|
|
235
|
+
|
|
236
|
+
_SectionADD(sect_Obj)
|
|
237
|
+
return sect_Obj
|
|
238
|
+
|
|
239
|
+
@staticmethod
|
|
240
|
+
def PSC1CEL(Name='',Joint=[0,0,0,0,0,0,0,0],
|
|
241
|
+
HO1_I=0,HO2_I=0,HO21_I=0,HO22_I=0,HO3_I=0,HO31_I=0,
|
|
242
|
+
BO1_I=0,BO11_I=0,BO12_I=0,BO2_I=0,BO21_I=0,BO3_I=0,
|
|
243
|
+
HI1_I=0,HI2_I=0,HI21_I=0,HI22_I=0,HI3_I=0,HI31_I=0,HI4_I=0,HI41_I=0,HI42_I=0,HI5_I=0,
|
|
244
|
+
BI1_I=0,BI11_I=0,BI12_I=0,BI21_I=0,BI3_I=0,BI31_I=0,BI32_I=0,BI4_I=0,
|
|
245
|
+
|
|
246
|
+
HO1_J=0,HO2_J=0,HO21_J=0,HO22_J=0,HO3_J=0,HO31_J=0,
|
|
247
|
+
BO1_J=0,BO11_J=0,BO12_J=0,BO2_J=0,BO21_J=0,BO3_J=0,
|
|
248
|
+
HI1_J=0,HI2_J=0,HI21_J=0,HI22_J=0,HI3_J=0,HI31_J=0,HI4_J=0,HI41_J=0,HI42_J=0,HI5_J=0,
|
|
249
|
+
BI1_J=0,BI11_J=0,BI12_J=0,BI21_J=0,BI3_J=0,BI31_J=0,BI32_J=0,BI4_J=0,
|
|
250
|
+
|
|
251
|
+
Offset:Offset=Offset.CC(),useShear=True,use7Dof=False,id:int=0):
|
|
252
|
+
args = locals()
|
|
253
|
+
sect_Obj = _SS_TAP_PSC_1CELL(**args)
|
|
254
|
+
|
|
255
|
+
_SectionADD(sect_Obj)
|
|
256
|
+
return sect_Obj
|
|
257
|
+
|
|
219
258
|
|
|
220
259
|
|
|
221
260
|
|
|
@@ -40,4 +40,18 @@ class _SS_DBUSER(_common):
|
|
|
40
40
|
|
|
41
41
|
@staticmethod
|
|
42
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)
|
|
43
|
+
return _SS_DBUSER(name,shape,js['SECT_BEFORE']['SECT_I']['vSIZE'],offset,uShear,u7DOF,id)
|
|
44
|
+
|
|
45
|
+
def _centerLine(shape):
|
|
46
|
+
H = shape.PARAMS[0]
|
|
47
|
+
B = shape.PARAMS[1]
|
|
48
|
+
tw = shape.PARAMS[2]
|
|
49
|
+
tf = shape.PARAMS[3]
|
|
50
|
+
|
|
51
|
+
sect_lin_con = [[1,2],[3,1]]
|
|
52
|
+
|
|
53
|
+
sect_cg = [0,0]
|
|
54
|
+
|
|
55
|
+
sect_shape = [[0,0],[B,0],[0,-H]]
|
|
56
|
+
sect_thk = [tf,tw]
|
|
57
|
+
sect_thk_off = [-tf/2,-tw/2]
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
from ._offsetSS import Offset
|
|
2
|
+
from ._offsetSS import _common
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class _SS_TAP_PSC_1CELL(_common):
|
|
7
|
+
def __init__(self,Name='',Joint=[0,0,0,0,0,0,0,0],
|
|
8
|
+
HO1_I=0,HO2_I=0,HO21_I=0,HO22_I=0,HO3_I=0,HO31_I=0,
|
|
9
|
+
BO1_I=0,BO11_I=0,BO12_I=0,BO2_I=0,BO21_I=0,BO3_I=0,
|
|
10
|
+
HI1_I=0,HI2_I=0,HI21_I=0,HI22_I=0,HI3_I=0,HI31_I=0,HI4_I=0,HI41_I=0,HI42_I=0,HI5_I=0,
|
|
11
|
+
BI1_I=0,BI11_I=0,BI12_I=0,BI21_I=0,BI3_I=0,BI31_I=0,BI32_I=0,BI4_I=0,
|
|
12
|
+
|
|
13
|
+
HO1_J=0,HO2_J=0,HO21_J=0,HO22_J=0,HO3_J=0,HO31_J=0,
|
|
14
|
+
BO1_J=0,BO11_J=0,BO12_J=0,BO2_J=0,BO21_J=0,BO3_J=0,
|
|
15
|
+
HI1_J=0,HI2_J=0,HI21_J=0,HI22_J=0,HI3_J=0,HI31_J=0,HI4_J=0,HI41_J=0,HI42_J=0,HI5_J=0,
|
|
16
|
+
BI1_J=0,BI11_J=0,BI12_J=0,BI21_J=0,BI3_J=0,BI31_J=0,BI32_J=0,BI4_J=0,
|
|
17
|
+
|
|
18
|
+
Offset:Offset=Offset.CC(),useShear=True,use7Dof=False,id:int=0):
|
|
19
|
+
|
|
20
|
+
self.ID = id
|
|
21
|
+
self.NAME = Name
|
|
22
|
+
self.SHAPE = '1CEL'
|
|
23
|
+
self.TYPE = 'TAPERED'
|
|
24
|
+
|
|
25
|
+
self.JO1=bool(Joint[0])
|
|
26
|
+
self.JO2=bool(Joint[1])
|
|
27
|
+
self.JO3=bool(Joint[2])
|
|
28
|
+
self.JI1=bool(Joint[3])
|
|
29
|
+
self.JI2=bool(Joint[4])
|
|
30
|
+
self.JI3=bool(Joint[5])
|
|
31
|
+
self.JI4=bool(Joint[6])
|
|
32
|
+
self.JI5=bool(Joint[7])
|
|
33
|
+
|
|
34
|
+
self.OFFSET = Offset
|
|
35
|
+
self.USESHEAR = bool(useShear)
|
|
36
|
+
self.USE7DOF = bool(use7Dof)
|
|
37
|
+
|
|
38
|
+
self.HO1_I = HO1_I
|
|
39
|
+
self.HO2_I = HO2_I
|
|
40
|
+
self.HO21_I = HO21_I
|
|
41
|
+
self.HO22_I= HO22_I
|
|
42
|
+
self.HO3_I = HO3_I
|
|
43
|
+
self.HO31_I = HO31_I
|
|
44
|
+
|
|
45
|
+
self.BO1_I = BO1_I
|
|
46
|
+
self.BO11_I = BO11_I
|
|
47
|
+
self.BO12_I = BO12_I
|
|
48
|
+
self.BO2_I = BO2_I
|
|
49
|
+
self.BO21_I = BO21_I
|
|
50
|
+
self.BO3_I = BO3_I
|
|
51
|
+
|
|
52
|
+
self.HI1_I = HI1_I
|
|
53
|
+
self.HI2_I = HI2_I
|
|
54
|
+
self.HI21_I = HI21_I
|
|
55
|
+
self.HI22_I = HI22_I
|
|
56
|
+
self.HI3_I = HI3_I
|
|
57
|
+
self.HI31_I = HI31_I
|
|
58
|
+
self.HI4_I = HI4_I
|
|
59
|
+
self.HI41_I = HI41_I
|
|
60
|
+
self.HI42_I = HI42_I
|
|
61
|
+
self.HI5_I = HI5_I
|
|
62
|
+
|
|
63
|
+
self.BI1_I = BI1_I
|
|
64
|
+
self.BI11_I = BI11_I
|
|
65
|
+
self.BI12_I = BI12_I
|
|
66
|
+
self.BI21_I = BI21_I
|
|
67
|
+
self.BI3_I = BI3_I
|
|
68
|
+
self.BI31_I = BI31_I
|
|
69
|
+
self.BI32_I = BI32_I
|
|
70
|
+
self.BI4_I = BI4_I
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
self.HO1_J = HO1_J
|
|
76
|
+
self.HO2_J = HO2_J
|
|
77
|
+
self.HO21_J = HO21_J
|
|
78
|
+
self.HO22_J= HO22_J
|
|
79
|
+
self.HO3_J = HO3_J
|
|
80
|
+
self.HO31_J = HO31_J
|
|
81
|
+
|
|
82
|
+
self.BO1_J = BO1_J
|
|
83
|
+
self.BO11_J = BO11_J
|
|
84
|
+
self.BO12_J = BO12_J
|
|
85
|
+
self.BO2_J = BO2_J
|
|
86
|
+
self.BO21_J = BO21_J
|
|
87
|
+
self.BO3_J = BO3_J
|
|
88
|
+
|
|
89
|
+
self.HI1_J = HI1_J
|
|
90
|
+
self.HI2_J = HI2_J
|
|
91
|
+
self.HI21_J = HI21_J
|
|
92
|
+
self.HI22_J = HI22_J
|
|
93
|
+
self.HI3_J = HI3_J
|
|
94
|
+
self.HI31_J = HI31_J
|
|
95
|
+
self.HI4_J = HI4_J
|
|
96
|
+
self.HI41_J = HI41_J
|
|
97
|
+
self.HI42_J = HI42_J
|
|
98
|
+
self.HI5_J = HI5_J
|
|
99
|
+
|
|
100
|
+
self.BI1_J = BI1_J
|
|
101
|
+
self.BI11_J = BI11_J
|
|
102
|
+
self.BI12_J = BI12_J
|
|
103
|
+
self.BI21_J = BI21_J
|
|
104
|
+
self.BI3_J = BI3_J
|
|
105
|
+
self.BI31_J = BI31_J
|
|
106
|
+
self.BI32_J = BI32_J
|
|
107
|
+
self.BI4_J = BI4_J
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def __str__(self):
|
|
111
|
+
return f' > ID = {self.ID} | PSC 1-2 CELL SECTION \nJSON = {self.toJSON()}\n'
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def toJSON(sect):
|
|
115
|
+
js = {
|
|
116
|
+
"SECTTYPE": "TAPERED",
|
|
117
|
+
"SECT_NAME": sect.NAME,
|
|
118
|
+
"SECT_BEFORE": {
|
|
119
|
+
"SHAPE": sect.SHAPE,
|
|
120
|
+
"TYPE" : 11,
|
|
121
|
+
"SECT_I": {
|
|
122
|
+
"vSIZE_PSC_A": [sect.HO1_I,sect.HO2_I,sect.HO21_I,sect.HO22_I,sect.HO3_I,sect.HO31_I],
|
|
123
|
+
"vSIZE_PSC_B": [sect.BO1_I,sect.BO11_I,sect.BO12_I,sect.BO2_I,sect.BO21_I,sect.BO3_I,],
|
|
124
|
+
"vSIZE_PSC_C": [sect.HI1_I,sect.HI2_I,sect.HI21_I,sect.HI22_I,sect.HI3_I,sect.HI31_I,sect.HI4_I,sect.HI41_I,sect.HI42_I,sect.HI5_I],
|
|
125
|
+
"vSIZE_PSC_D": [sect.BI1_I,sect.BI11_I,sect.BI12_I,sect.BI21_I,sect.BI3_I,sect.BI31_I,sect.BI32_I,sect.BI4_I],
|
|
126
|
+
"S_WIDTH" : sect.HO1_I
|
|
127
|
+
},
|
|
128
|
+
"SECT_J": {
|
|
129
|
+
"vSIZE_PSC_A": [sect.HO1_J,sect.HO2_J,sect.HO21_J,sect.HO22_J,sect.HO3_J,sect.HO31_J],
|
|
130
|
+
"vSIZE_PSC_B": [sect.BO1_J,sect.BO11_J,sect.BO12_J,sect.BO2_J,sect.BO21_J,sect.BO3_J,],
|
|
131
|
+
"vSIZE_PSC_C": [sect.HI1_J,sect.HI2_J,sect.HI21_J,sect.HI22_J,sect.HI3_J,sect.HI31_J,sect.HI4_J,sect.HI41_J,sect.HI42_J,sect.HI5_J],
|
|
132
|
+
"vSIZE_PSC_D": [sect.BI1_J,sect.BI11_J,sect.BI12_J,sect.BI21_J,sect.BI3_J,sect.BI31_J,sect.BI32_J,sect.BI4_J],
|
|
133
|
+
"S_WIDTH" : sect.HO1_J
|
|
134
|
+
},
|
|
135
|
+
"Y_VAR": 1,
|
|
136
|
+
"Z_VAR": 1,
|
|
137
|
+
"WARPING_CHK_AUTO_I": True,
|
|
138
|
+
"WARPING_CHK_AUTO_J": True,
|
|
139
|
+
"SHEAR_CHK": False,
|
|
140
|
+
"WARPING_CHK_POS_I": [[0,0,0,0,0,0],[0,0,0,0,0,0]],
|
|
141
|
+
"WARPING_CHK_POS_J": [[0,0,0,0,0,0],[0,0,0,0,0,0]],
|
|
142
|
+
"USE_WEB_THICK_SHEAR": [[True, True,True],[True,True,True]],
|
|
143
|
+
"WEB_THICK_SHEAR": [[0,0,0],[0,0,0]],
|
|
144
|
+
"USE_WEB_THICK": [True,True],
|
|
145
|
+
"WEB_THICK": [0,0],
|
|
146
|
+
"USE_SYMMETRIC": False,
|
|
147
|
+
"USE_SMALL_HOLE": False,
|
|
148
|
+
"USE_USER_DEF_MESHSIZE": False,
|
|
149
|
+
"USE_USER_INTPUT_STIFF": False,
|
|
150
|
+
"PSC_OPT1": "",
|
|
151
|
+
"PSC_OPT2": "",
|
|
152
|
+
"JOINT": [sect.JO1,sect.JO2,sect.JO3,sect.JI1,sect.JI2,sect.JI3,sect.JI4,sect.JI5]
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
js['SECT_BEFORE'].update(sect.OFFSET.JS)
|
|
156
|
+
js['SECT_BEFORE']['USE_SHEAR_DEFORM'] = sect.USESHEAR
|
|
157
|
+
js['SECT_BEFORE']['USE_WARPING_EFFECT'] = sect.USE7DOF
|
|
158
|
+
return js
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
@staticmethod
|
|
162
|
+
def _objectify(id,name,type,shape,offset,uShear,u7DOF,js):
|
|
163
|
+
#--- PSC 1,2 CELL -------------------
|
|
164
|
+
vA_I = js['SECT_BEFORE']['SECT_I']['vSIZE_PSC_A']
|
|
165
|
+
vB_I = js['SECT_BEFORE']['SECT_I']['vSIZE_PSC_B']
|
|
166
|
+
vC_I = js['SECT_BEFORE']['SECT_I']['vSIZE_PSC_C']
|
|
167
|
+
vD_I = js['SECT_BEFORE']['SECT_I']['vSIZE_PSC_D']
|
|
168
|
+
|
|
169
|
+
vA_J = js['SECT_BEFORE']['SECT_J']['vSIZE_PSC_A']
|
|
170
|
+
vB_J = js['SECT_BEFORE']['SECT_J']['vSIZE_PSC_B']
|
|
171
|
+
vC_J = js['SECT_BEFORE']['SECT_J']['vSIZE_PSC_C']
|
|
172
|
+
vD_J = js['SECT_BEFORE']['SECT_J']['vSIZE_PSC_D']
|
|
173
|
+
|
|
174
|
+
joint = js['SECT_BEFORE']['JOINT']
|
|
175
|
+
return _SS_TAP_PSC_1CELL(name,joint,
|
|
176
|
+
*vA_I,*vB_I,*vC_I,*vD_I,
|
|
177
|
+
*vA_J,*vB_J,*vC_J,*vD_J,
|
|
178
|
+
offset,uShear,u7DOF,id)
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
from ._model import *
|
|
2
|
-
from ._mapi import *
|
|
1
|
+
# from ._model import *
|
|
2
|
+
# from ._mapi import *
|
|
3
3
|
|
|
4
4
|
#Function to remove duplicate set of values from 2 lists
|
|
5
5
|
# def unique_lists(li1, li2):
|
|
@@ -86,4 +86,4 @@ def zz_add_to_dict(dictionary, key, value):
|
|
|
86
86
|
def _convItem2List(item):
|
|
87
87
|
if isinstance(item,list):
|
|
88
88
|
return item
|
|
89
|
-
return [item]
|
|
89
|
+
return [item]
|
|
@@ -2,6 +2,7 @@ LICENSE
|
|
|
2
2
|
README.md
|
|
3
3
|
setup.cfg
|
|
4
4
|
setup.py
|
|
5
|
+
midas_civil/_BoundaryChangeAssignment.py
|
|
5
6
|
midas_civil/__init__.py
|
|
6
7
|
midas_civil/_analysiscontrol.py
|
|
7
8
|
midas_civil/_boundary.py
|
|
@@ -29,9 +30,11 @@ midas_civil.egg-info/SOURCES.txt
|
|
|
29
30
|
midas_civil.egg-info/dependency_links.txt
|
|
30
31
|
midas_civil.egg-info/requires.txt
|
|
31
32
|
midas_civil.egg-info/top_level.txt
|
|
33
|
+
midas_civil/_section/_TapdbSecSS.py
|
|
32
34
|
midas_civil/_section/__init__.py
|
|
33
35
|
midas_civil/_section/_compositeSS.py
|
|
34
36
|
midas_civil/_section/_dbSecSS.py
|
|
35
37
|
midas_civil/_section/_offsetSS.py
|
|
36
38
|
midas_civil/_section/_pscSS.py
|
|
39
|
+
midas_civil/_section/_tapPSC1CellSS.py
|
|
37
40
|
midas_civil/_section/_unSupp.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|