structuralcodes 0.5.0__py3-none-any.whl → 0.6.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of structuralcodes might be problematic. Click here for more details.

Files changed (48) hide show
  1. structuralcodes/__init__.py +1 -1
  2. structuralcodes/codes/ec2_2004/shear.py +3 -2
  3. structuralcodes/codes/mc2010/_concrete_creep_and_shrinkage.py +2 -2
  4. structuralcodes/core/base.py +138 -12
  5. structuralcodes/geometry/__init__.py +2 -8
  6. structuralcodes/geometry/_geometry.py +103 -19
  7. structuralcodes/geometry/_reinforcement.py +1 -3
  8. structuralcodes/geometry/profiles/__init__.py +33 -0
  9. structuralcodes/geometry/profiles/_base_profile.py +305 -0
  10. structuralcodes/geometry/profiles/_common_functions.py +307 -0
  11. structuralcodes/geometry/profiles/_hd.py +374 -0
  12. structuralcodes/geometry/profiles/_he.py +192 -0
  13. structuralcodes/geometry/profiles/_hp.py +319 -0
  14. structuralcodes/geometry/profiles/_ipe.py +130 -0
  15. structuralcodes/geometry/profiles/_ipn.py +329 -0
  16. structuralcodes/geometry/profiles/_l.py +528 -0
  17. structuralcodes/geometry/profiles/_li.py +217 -0
  18. structuralcodes/geometry/profiles/_u.py +173 -0
  19. structuralcodes/geometry/profiles/_ub.py +1356 -0
  20. structuralcodes/geometry/profiles/_ubp.py +227 -0
  21. structuralcodes/geometry/profiles/_uc.py +276 -0
  22. structuralcodes/geometry/profiles/_upe.py +133 -0
  23. structuralcodes/geometry/profiles/_upn.py +315 -0
  24. structuralcodes/geometry/profiles/_w.py +2157 -0
  25. structuralcodes/materials/basic/_elastic.py +18 -1
  26. structuralcodes/materials/basic/_elasticplastic.py +18 -1
  27. structuralcodes/materials/basic/_generic.py +18 -1
  28. structuralcodes/materials/concrete/__init__.py +3 -0
  29. structuralcodes/materials/concrete/_concrete.py +10 -1
  30. structuralcodes/materials/concrete/_concreteEC2_2004.py +15 -1
  31. structuralcodes/materials/concrete/_concreteEC2_2023.py +15 -1
  32. structuralcodes/materials/concrete/_concreteMC2010.py +20 -1
  33. structuralcodes/materials/constitutive_laws/__init__.py +3 -0
  34. structuralcodes/materials/constitutive_laws/_elasticplastic.py +2 -2
  35. structuralcodes/materials/constitutive_laws/_initial_strain.py +130 -0
  36. structuralcodes/materials/reinforcement/__init__.py +6 -0
  37. structuralcodes/materials/reinforcement/_reinforcement.py +10 -1
  38. structuralcodes/materials/reinforcement/_reinforcementEC2_2004.py +14 -0
  39. structuralcodes/materials/reinforcement/_reinforcementEC2_2023.py +14 -0
  40. structuralcodes/materials/reinforcement/_reinforcementMC2010.py +14 -0
  41. structuralcodes/sections/section_integrators/__init__.py +3 -1
  42. structuralcodes/sections/section_integrators/_marin_integrator.py +1 -1
  43. {structuralcodes-0.5.0.dist-info → structuralcodes-0.6.1.dist-info}/METADATA +2 -2
  44. {structuralcodes-0.5.0.dist-info → structuralcodes-0.6.1.dist-info}/RECORD +47 -30
  45. structuralcodes/geometry/_steel_sections.py +0 -2155
  46. /structuralcodes/{sections/section_integrators → core}/_marin_integration.py +0 -0
  47. {structuralcodes-0.5.0.dist-info → structuralcodes-0.6.1.dist-info}/WHEEL +0 -0
  48. {structuralcodes-0.5.0.dist-info → structuralcodes-0.6.1.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,315 @@
1
+ """UPN profiles."""
2
+
3
+ from shapely import (
4
+ Polygon,
5
+ )
6
+
7
+ from ._base_profile import BaseProfile
8
+ from ._common_functions import (
9
+ _create_taper_U_section,
10
+ )
11
+
12
+
13
+ class UPN(BaseProfile):
14
+ """Simple class for representing an UPN profile.
15
+
16
+ European standard channels UPN 50 - 400.
17
+
18
+ Taper flange Channels.
19
+
20
+ 14% slope in flange.
21
+ """
22
+
23
+ parameters = {
24
+ 'UPN50': {
25
+ 'h': 50.0,
26
+ 'b': 38.0,
27
+ 'tw': 5.0,
28
+ 'tf': 7.0,
29
+ 'r1': 7.0,
30
+ 'r2': 4.0,
31
+ 'd': 21.0,
32
+ },
33
+ 'UPN65': {
34
+ 'h': 65.0,
35
+ 'b': 42.0,
36
+ 'tw': 5.5,
37
+ 'tf': 7.5,
38
+ 'r1': 8.0,
39
+ 'r2': 4.0,
40
+ 'd': 34.0,
41
+ },
42
+ 'UPN80': {
43
+ 'h': 80.0,
44
+ 'b': 45.0,
45
+ 'tw': 6.0,
46
+ 'tf': 8.0,
47
+ 'r1': 8.0,
48
+ 'r2': 4.0,
49
+ 'd': 47.0,
50
+ },
51
+ 'UPN100': {
52
+ 'h': 100.0,
53
+ 'b': 50.0,
54
+ 'tw': 6.0,
55
+ 'tf': 8.5,
56
+ 'r1': 9.0,
57
+ 'r2': 5.0,
58
+ 'd': 64.0,
59
+ },
60
+ 'UPN120': {
61
+ 'h': 120.0,
62
+ 'b': 55.0,
63
+ 'tw': 7.0,
64
+ 'tf': 9.0,
65
+ 'r1': 9.0,
66
+ 'r2': 5.0,
67
+ 'd': 82.0,
68
+ },
69
+ 'UPN140': {
70
+ 'h': 140.0,
71
+ 'b': 60.0,
72
+ 'tw': 7.0,
73
+ 'tf': 10.0,
74
+ 'r1': 10.0,
75
+ 'r2': 5.0,
76
+ 'd': 98.0,
77
+ },
78
+ 'UPN160': {
79
+ 'h': 160.0,
80
+ 'b': 65.0,
81
+ 'tw': 7.5,
82
+ 'tf': 10.5,
83
+ 'r1': 11.0,
84
+ 'r2': 6.0,
85
+ 'd': 115.0,
86
+ },
87
+ 'UPN180': {
88
+ 'h': 180.0,
89
+ 'b': 70.0,
90
+ 'tw': 8.0,
91
+ 'tf': 11.0,
92
+ 'r1': 11.0,
93
+ 'r2': 6.0,
94
+ 'd': 133.0,
95
+ },
96
+ 'UPN200': {
97
+ 'h': 200.0,
98
+ 'b': 75.0,
99
+ 'tw': 8.5,
100
+ 'tf': 11.5,
101
+ 'r1': 12.0,
102
+ 'r2': 6.0,
103
+ 'd': 151.0,
104
+ },
105
+ 'UPN220': {
106
+ 'h': 220.0,
107
+ 'b': 80.0,
108
+ 'tw': 9.0,
109
+ 'tf': 12.5,
110
+ 'r1': 13.0,
111
+ 'r2': 7.0,
112
+ 'd': 167.0,
113
+ },
114
+ 'UPN240': {
115
+ 'h': 240.0,
116
+ 'b': 85.0,
117
+ 'tw': 9.5,
118
+ 'tf': 13.0,
119
+ 'r1': 13.0,
120
+ 'r2': 7.0,
121
+ 'd': 184.0,
122
+ },
123
+ 'UPN260': {
124
+ 'h': 260.0,
125
+ 'b': 90.0,
126
+ 'tw': 10.0,
127
+ 'tf': 14.0,
128
+ 'r1': 14.0,
129
+ 'r2': 7.0,
130
+ 'd': 200.0,
131
+ },
132
+ 'UPN280': {
133
+ 'h': 280.0,
134
+ 'b': 95.0,
135
+ 'tw': 10.0,
136
+ 'tf': 15.0,
137
+ 'r1': 15.0,
138
+ 'r2': 8.0,
139
+ 'd': 216.0,
140
+ },
141
+ 'UPN300': {
142
+ 'h': 300.0,
143
+ 'b': 100.0,
144
+ 'tw': 10.0,
145
+ 'tf': 16.0,
146
+ 'r1': 16.0,
147
+ 'r2': 8.0,
148
+ 'd': 232.0,
149
+ },
150
+ 'UPN320': {
151
+ 'h': 320.0,
152
+ 'b': 100.0,
153
+ 'tw': 14.0,
154
+ 'tf': 17.5,
155
+ 'r1': 18.0,
156
+ 'r2': 9.0,
157
+ 'd': 246.0,
158
+ },
159
+ 'UPN350': {
160
+ 'h': 350.0,
161
+ 'b': 100.0,
162
+ 'tw': 14.0,
163
+ 'tf': 16.0,
164
+ 'r1': 16.0,
165
+ 'r2': 8.0,
166
+ 'd': 282.0,
167
+ },
168
+ 'UPN380': {
169
+ 'h': 380.0,
170
+ 'b': 102.0,
171
+ 'tw': 13.5,
172
+ 'tf': 16.0,
173
+ 'r1': 16.0,
174
+ 'r2': 8.0,
175
+ 'd': 313.0,
176
+ },
177
+ 'UPN400': {
178
+ 'h': 400.0,
179
+ 'b': 110.0,
180
+ 'tw': 14.0,
181
+ 'tf': 18.0,
182
+ 'r1': 18.0,
183
+ 'r2': 9.0,
184
+ 'd': 324.0,
185
+ },
186
+ }
187
+
188
+ @classmethod
189
+ def get_polygon(cls, name: str) -> Polygon:
190
+ """Returns a shapely polygon representing an UPN section."""
191
+ if isinstance(name, (float, int)):
192
+ name = f'UPN{int(name):0d}'
193
+ parameters = cls.parameters.get(name)
194
+ if parameters is None:
195
+ raise ValueError(
196
+ f"Profile '{name}' not found in UPN sections. "
197
+ "Select a valid profile (available ones: "
198
+ f"{cls.profiles()})"
199
+ )
200
+ if parameters['h'] <= 300:
201
+ parameters['slope'] = 0.08
202
+ parameters['u'] = parameters['b'] / 2.0
203
+ else:
204
+ parameters['slope'] = 0.05
205
+ parameters['u'] = (parameters['b'] - parameters['tw']) / 2.0
206
+ return _create_taper_U_section(
207
+ **{
208
+ key: parameters[key]
209
+ for key in parameters
210
+ if key in ['h', 'b', 'tw', 'tf', 'r1', 'r2', 'slope', 'u']
211
+ }
212
+ )
213
+
214
+ @classmethod
215
+ def profiles(cls) -> list:
216
+ """Returns a list containing all available profiles."""
217
+ return list(cls.parameters.keys())
218
+
219
+ def __init__(self, name: str) -> None:
220
+ """Creates a new UPN object."""
221
+ if isinstance(name, (float, int)):
222
+ name = f'UPN{int(name):0d}'
223
+ parameters = self.parameters.get(name)
224
+ if parameters is None:
225
+ raise ValueError(
226
+ f"Profile '{name}' not found in UPN sections. "
227
+ "Select a valid profile (available ones: "
228
+ f"{self.profiles()})"
229
+ )
230
+ super().__init__()
231
+ self._h = parameters.get('h')
232
+ self._b = parameters.get('b')
233
+ self._tw = parameters.get('tw')
234
+ self._tf = parameters.get('tf')
235
+ self._r1 = parameters.get('r1')
236
+ self._r2 = parameters.get('r2')
237
+ if self._h <= 300:
238
+ self._flange_slope = 0.08
239
+ self._u = self._b / 2.0
240
+ else:
241
+ self._flange_slope = 0.05
242
+ self._u = (self._b - self._tw) / 2.0
243
+ self._polygon = _create_taper_U_section(
244
+ h=self._h,
245
+ b=self._b,
246
+ tw=self._tw,
247
+ tf=self._tf,
248
+ r1=self._r1,
249
+ r2=self._r2,
250
+ slope=self._flange_slope,
251
+ u=self._u,
252
+ )
253
+
254
+ @property
255
+ def polygon(self) -> Polygon:
256
+ """Returns shapely Polygon of section.
257
+
258
+ Returns:
259
+ Polygon: The represention of the UPN section.
260
+ """
261
+ return self._polygon
262
+
263
+ @property
264
+ def h(self) -> float:
265
+ """Returns height of UPN section.
266
+
267
+ Returns:
268
+ float: Height h of UPN section.
269
+ """
270
+ return self._h
271
+
272
+ @property
273
+ def b(self) -> float:
274
+ """Returns width of UPN section.
275
+
276
+ Returns:
277
+ float: Width b of UPN section.
278
+ """
279
+ return self._b
280
+
281
+ @property
282
+ def tw(self) -> float:
283
+ """Returns thickness of web of UPN section.
284
+
285
+ Returns:
286
+ float: Web thickness tw of UPN section.
287
+ """
288
+ return self._tw
289
+
290
+ @property
291
+ def tf(self) -> float:
292
+ """Returns thickness of flange of UPN section.
293
+
294
+ Returns:
295
+ float: Flange thickness tw of UPN section.
296
+ """
297
+ return self._tf
298
+
299
+ @property
300
+ def r1(self) -> float:
301
+ """Returns fillet radius of UPN section.
302
+
303
+ Returns:
304
+ float: Fillet radius r1 of UPN section.
305
+ """
306
+ return self._r1
307
+
308
+ @property
309
+ def r2(self) -> float:
310
+ """Returns fillet radius of UPN section.
311
+
312
+ Returns:
313
+ float: Fillet radius r2 of UPN section.
314
+ """
315
+ return self._r2