ourocode 1.6.0__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 ourocode might be problematic. Click here for more details.
- ourocode/__init__.py +0 -0
- ourocode/__version__.py +1 -0
- ourocode/data/caracteristique_meca_acier.csv +33 -0
- ourocode/data/caracteristique_meca_bois.csv +59 -0
- ourocode/data/carte_action_region.csv +36722 -0
- ourocode/data/coeff_psy.csv +13 -0
- ourocode/data/exploitation.csv +17 -0
- ourocode/data/gammaM.csv +14 -0
- ourocode/data/kdef.csv +11 -0
- ourocode/data/kfi.csv +10 -0
- ourocode/data/kmod.csv +16 -0
- ourocode/data/limite_fleche.csv +9 -0
- ourocode/data/qualite_acier.csv +18 -0
- ourocode/data/screenshot/C90_def.png +0 -0
- ourocode/data/screenshot/Kv_def.png +0 -0
- ourocode/data/screenshot/fleche.png +0 -0
- ourocode/data/screenshot/sign_convention.png +0 -0
- ourocode/data/section_boulon.csv +12 -0
- ourocode/data/vent/vent_Cp_toiture_isolee_1_versant.csv +22 -0
- ourocode/data/vent/vent_Cp_toiture_isolee_1_versant.png +0 -0
- ourocode/data/vent/vent_Cp_toiture_isolee_2_versants.csv +31 -0
- ourocode/data/vent/vent_Cp_toiture_isolee_2_versants.png +0 -0
- ourocode/data/vent/vent_Cpe_mur_verticaux.csv +11 -0
- ourocode/data/vent/vent_Cpe_mur_verticaux.png +0 -0
- ourocode/data/vent/vent_Cpe_toiture_1_versant.png +0 -0
- ourocode/data/vent/vent_Cpe_toiture_1_versant_0_degres.csv +13 -0
- ourocode/data/vent/vent_Cpe_toiture_1_versant_180_degres.csv +13 -0
- ourocode/data/vent/vent_Cpe_toiture_1_versant_90_degres.csv +13 -0
- ourocode/data/vent/vent_Cpe_toiture_2_versants.png +0 -0
- ourocode/data/vent/vent_Cpe_toiture_2_versants_0_degres.csv +21 -0
- ourocode/data/vent/vent_Cpe_toiture_2_versants_90_degres.csv +21 -0
- ourocode/data/vent/vent_Cpe_toiture_terrasse.csv +21 -0
- ourocode/data/vent/vent_Cpe_toiture_terrasse.png +0 -0
- ourocode/data/vent/vent_Ffr.png +0 -0
- ourocode/eurocode/A0_Projet.py +1408 -0
- ourocode/eurocode/EC0_Combinaison.py +1763 -0
- ourocode/eurocode/EC1_Exploitation.py +103 -0
- ourocode/eurocode/EC1_Neige.py +385 -0
- ourocode/eurocode/EC1_Vent.py +1388 -0
- ourocode/eurocode/EC3_Assemblage.py +466 -0
- ourocode/eurocode/EC3_Element_droit.py +302 -0
- ourocode/eurocode/EC5_Assemblage.py +1760 -0
- ourocode/eurocode/EC5_Element_droit.py +1740 -0
- ourocode/eurocode/EC5_Feu.py +922 -0
- ourocode/eurocode/EC8_Sismique.py +2 -0
- ourocode/eurocode/__init__.py +0 -0
- ourocode/eurocode/logical.py +83 -0
- ourocode/eurocode/objet.py +263 -0
- ourocode-1.6.0.dist-info/METADATA +331 -0
- ourocode-1.6.0.dist-info/RECORD +53 -0
- ourocode-1.6.0.dist-info/WHEEL +5 -0
- ourocode-1.6.0.dist-info/licenses/LICENSE +201 -0
- ourocode-1.6.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
#! env\Scripts\python.exe
|
|
2
|
+
# Encoding in UTF-8 by Anthony PARISOT
|
|
3
|
+
import math as mt
|
|
4
|
+
from math import sqrt
|
|
5
|
+
import pandas as pd
|
|
6
|
+
|
|
7
|
+
import forallpeople as si
|
|
8
|
+
si.environment("structural")
|
|
9
|
+
from handcalcs.decorator import handcalc
|
|
10
|
+
|
|
11
|
+
from ourocode.eurocode.A0_Projet import Projet
|
|
12
|
+
|
|
13
|
+
class Element(Projet):
|
|
14
|
+
|
|
15
|
+
GAMMA_M = {"gamma_M0": 1, "gamma_M1": 1, "gamma_M2": 1.25, "gamma_M3": 1.1, "gamma_M3_ser": 1.25,
|
|
16
|
+
"gamma_M4": 1, "gamma_M5": 1, "gamma_M6_ser": 1, "gamma_M7": 1.1}
|
|
17
|
+
E = 210000 * si.MPa
|
|
18
|
+
CLASSE_STEEL = tuple(Projet._data_from_csv(Projet, "caracteristique_meca_acier.csv").index)
|
|
19
|
+
|
|
20
|
+
def __init__(self, t: si.mm=0, h: si.mm=0, classe_acier: str=CLASSE_STEEL, classe_transv: int=("1","2","3","4"), **kwargs):
|
|
21
|
+
"""Configure un objet Element pour vérifier un élément acier suivant l'EN 1993-1-1.
|
|
22
|
+
|
|
23
|
+
Args:
|
|
24
|
+
t (int, optional): épaisseur de la plaque en mm. Defaults to 0.
|
|
25
|
+
h (int, optional): hauteur de la plaque en mm. Defaults to 0.
|
|
26
|
+
classe_acier (str, optional): classe d'acier. Defaults to "S235".
|
|
27
|
+
classe_transv (int, optional): classe transversale de la section en fonction de sa capacité de plastification. Defaults to 1.
|
|
28
|
+
"""
|
|
29
|
+
super().__init__(**kwargs)
|
|
30
|
+
self.t = t * si.mm
|
|
31
|
+
self.h = h * si.mm
|
|
32
|
+
self.classe_acier = classe_acier
|
|
33
|
+
self.classe_transv = classe_transv
|
|
34
|
+
self.__fy_fu()
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@property
|
|
38
|
+
def __classe_acier(self):
|
|
39
|
+
"""Retourne le dataframe de la classe d'acier définit
|
|
40
|
+
"""
|
|
41
|
+
df = self._data_from_csv("caracteristique_meca_acier.csv")
|
|
42
|
+
df = df.loc[self.classe_acier]
|
|
43
|
+
return df
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def __fy_fu(self):
|
|
47
|
+
"""Défini fy (résistance élastique) et fu (résistance plastique) en MPa fonction de la classe d'acier choisi
|
|
48
|
+
"""
|
|
49
|
+
print(self.t)
|
|
50
|
+
if self.t <= 40*si.mm:
|
|
51
|
+
self.fy = self.__classe_acier.loc["t<= 40 fy"] * si.MPa
|
|
52
|
+
self.fu = self.__classe_acier.loc["t<= 40 fu"] * si.MPa
|
|
53
|
+
elif self.t > 40*si.mm and self.t<= 80*si.mm:
|
|
54
|
+
self.fy = self.__classe_acier.loc["40<t<= 80 fy"] * si.MPa
|
|
55
|
+
self.fu = self.__classe_acier.loc["40<t<= 80 fu"] * si.MPa
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
@property
|
|
59
|
+
def _inertie(self):
|
|
60
|
+
""" Retourne le moment quadratique d'une section rectangulaire en mm4 avec pour argument :
|
|
61
|
+
b ou d : Largeur ou diamètre de la poutre en mm
|
|
62
|
+
h : Hauteur de la poutre en mm """
|
|
63
|
+
if self.t and self.h:
|
|
64
|
+
self.Iy = (self.t * self.h**3)/12
|
|
65
|
+
self.Iz = (self.h * self.t**3)/12
|
|
66
|
+
return [self.Iy, self.Iz]
|
|
67
|
+
|
|
68
|
+
elif self.Iy and self.Iz:
|
|
69
|
+
return [self.Iy, self.Iz]
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class Traction(Element):
|
|
74
|
+
def __init__(self, A: si.mm*2, Anet: si.mm*2=0, ass_cat_C: bool=("False", "True"), *args, **kwargs):
|
|
75
|
+
"""Défini une classe traction permettant le calcul d'un élément métallique à l'EN 1993-1-1 §6.2.3.
|
|
76
|
+
Cette classe est hérité de la classe Element du module EC3_Element_droit.py.
|
|
77
|
+
|
|
78
|
+
Args:
|
|
79
|
+
A (float): Aire brute de la section en mm².
|
|
80
|
+
Anet (float, optional): Aire nette au droit droit des trous de fixation selon §6.2.2.2 en mm². Defaults to 0.
|
|
81
|
+
ass_cat_C (bool, optional): Si assemblage de catégorie C alors True sinon False, voir EN 1993-1-8 §3.4.1.(1). Defaults to ("False", "True").
|
|
82
|
+
"""
|
|
83
|
+
super().__init__(*args, **kwargs)
|
|
84
|
+
self.A = A * si.mm*2
|
|
85
|
+
self.Anet = Anet * si.mm*2
|
|
86
|
+
self.ass_cat_C = ass_cat_C
|
|
87
|
+
|
|
88
|
+
@property
|
|
89
|
+
def _Npl_Rd(self):
|
|
90
|
+
"""Calcul la résistance plastique en traction de la section transversale brute en N (équa 6.6)
|
|
91
|
+
"""
|
|
92
|
+
return (self.A * self.fy)/__class__.GAMMA_M["gamma_M0"] #(équa 6.6)
|
|
93
|
+
|
|
94
|
+
@property
|
|
95
|
+
def _Nu_Rd(self):
|
|
96
|
+
"""Calcul la résistance ultime en traction de la section transversale nette en N (équa 6.7)
|
|
97
|
+
"""
|
|
98
|
+
return 0.9*(self.Anet * self.fu)/__class__.GAMMA_M["gamma_M2"] #(équa 6.7)
|
|
99
|
+
|
|
100
|
+
@property
|
|
101
|
+
def _Nnet_Rd(self):
|
|
102
|
+
"""Calcul la résistance ultime en traction de la section transversale nette en N
|
|
103
|
+
lorsque l'assemblage est de catégorie C (équa 6.8)
|
|
104
|
+
"""
|
|
105
|
+
return (self.Anet * self.fy)/__class__.GAMMA_M["gamma_M0"] #(équa 6.8)
|
|
106
|
+
|
|
107
|
+
@property
|
|
108
|
+
def Nt_Rd (self):
|
|
109
|
+
if self.ass_cat_C:
|
|
110
|
+
return self._Nnet_Rd
|
|
111
|
+
if self.Anet:
|
|
112
|
+
return min(self._Npl_Rd, self._Nu_Rd)
|
|
113
|
+
else:
|
|
114
|
+
return self._Npl_Rd
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
class Compression(Element):
|
|
119
|
+
"""Classe intégrant les formules de compression et d'instabilité au flambement à l'EC3
|
|
120
|
+
|
|
121
|
+
Args:
|
|
122
|
+
Element (class): hérite des propriétés de la classe Element à l'EC3
|
|
123
|
+
"""
|
|
124
|
+
|
|
125
|
+
FACTEUR_ALPHA = {"a0": 0.13, "a": 0.21, "b": 0.34, "c": 0.49, "d": 0.76}
|
|
126
|
+
def __init__(self, A: si.mm**2, lo_y: si.mm=0, lo_z: si.mm=0, courbe_flamb: dict="{'y':'c', 'z':'c'}", coeflf: float=1, *args, **kwargs):
|
|
127
|
+
"""
|
|
128
|
+
Args:
|
|
129
|
+
A (float | int): Aire brute si classe 1,2 ou 3 et Aeff si classe 4 en mm²
|
|
130
|
+
lo (int, optional): Longueur de flambement suivant l'axe de rotation (y ou z) en mm. Defaults to {'y':0, 'z':0}.
|
|
131
|
+
coeflf (float, optional): Coefficient multiplicateur de la longueur pour obtenir la longeur efficace de flambement en
|
|
132
|
+
fonction des du type d'appuis :
|
|
133
|
+
Encastré 1 côté : 2
|
|
134
|
+
Rotule - Rotule : 1
|
|
135
|
+
Encastré - Rotule : 0.7
|
|
136
|
+
Encastré - Encastré : 0.5
|
|
137
|
+
Encastré - Rouleau : 1. Defaults to 1.
|
|
138
|
+
"""
|
|
139
|
+
super().__init__(*args, **kwargs)
|
|
140
|
+
self.A = A * si.mm**2
|
|
141
|
+
self.lo ={'y': lo_y*si.mm, 'z': lo_z*si.mm}
|
|
142
|
+
self.courbe_flamb = courbe_flamb
|
|
143
|
+
self.coeflf = coeflf
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
@property
|
|
148
|
+
def Nc_Rd(self):
|
|
149
|
+
"""Calcul la résistance en compression de la section transversale en N (équa 6.10 et 6.11)
|
|
150
|
+
"""
|
|
151
|
+
return (self.A * self.fy)/__class__.GAMMA_M["gamma_M0"]
|
|
152
|
+
|
|
153
|
+
@property
|
|
154
|
+
def lamb(self):
|
|
155
|
+
""" Retourne l'élancement d'un poteau en compression avec risque de flambement suivant son axe de rotation """
|
|
156
|
+
lamb = {'y':0, 'z':0}
|
|
157
|
+
lamb['y'] = (self.lo['y'].value * 10**3 * self.coeflf) / mt.sqrt(self._inertie[0] / (self.A))
|
|
158
|
+
lamb['z'] = (self.lo['z'].value * 10**3 * self.coeflf) / mt.sqrt(self._inertie[1] / (self.A))
|
|
159
|
+
return lamb
|
|
160
|
+
|
|
161
|
+
@property
|
|
162
|
+
def _lamb_rel_Axe(self):
|
|
163
|
+
""" Retourne l'élancement relatif d'un poteau en compression avec risque de flambement suivant son axe de rotation """
|
|
164
|
+
lamb_rel_Axe = {'y':0, 'z':0}
|
|
165
|
+
for cle, value in lamb_rel_Axe.items():
|
|
166
|
+
lamb_rel_Axe[cle] = (self.lamb[cle] / mt.pi) * mt.sqrt(self.fy / __class__.E)
|
|
167
|
+
return lamb_rel_Axe
|
|
168
|
+
|
|
169
|
+
@property
|
|
170
|
+
def _alpha(self):
|
|
171
|
+
"""Détermine le facteur d'imperfection fonction des courbes de flambement
|
|
172
|
+
"""
|
|
173
|
+
a = {}
|
|
174
|
+
for key, value in self.courbe_flamb.items():
|
|
175
|
+
a[key] = __class__.FACTEUR_ALPHA[value]
|
|
176
|
+
return a
|
|
177
|
+
|
|
178
|
+
@property
|
|
179
|
+
def _phi(self):
|
|
180
|
+
"""Détermine le facteur phi (fonction de l'axe de flambement)
|
|
181
|
+
"""
|
|
182
|
+
phi = {'y':0, 'z':0}
|
|
183
|
+
for key in phi.keys():
|
|
184
|
+
phi[key] = 0.5 * (1 + self._alpha[key] * (self._lamb_rel_Axe[key] - 0.2) + self._lamb_rel_Axe[key]**2)
|
|
185
|
+
return phi
|
|
186
|
+
|
|
187
|
+
@property
|
|
188
|
+
def _chi(self):
|
|
189
|
+
"""Détermine le facteur ki (fonction de l'axe de flambement)
|
|
190
|
+
"""
|
|
191
|
+
ki = {'y':0, 'z':0}
|
|
192
|
+
for key in ki.keys():
|
|
193
|
+
ki[key] = 1 / (self._phi[key] + mt.sqrt(self._phi[key]**2 - self._lamb_rel_Axe[key]**2))
|
|
194
|
+
return ki
|
|
195
|
+
|
|
196
|
+
@property
|
|
197
|
+
def Nb_Rd(self):
|
|
198
|
+
"""Renvoie la capacité résitante en compression avec flambement en N (fonction de l'axe de flambement)
|
|
199
|
+
"""
|
|
200
|
+
NbRd = {'y':0, 'z':0}
|
|
201
|
+
for key in NbRd.keys():
|
|
202
|
+
NbRd[key] = (self._chi[key] * self.A * self.fy)/__class__.GAMMA_M["gamma_M0"]
|
|
203
|
+
return NbRd
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
class Cisaillement(Element):
|
|
208
|
+
def __init__(self, Av: si.mm**2, *args, **kwargs):
|
|
209
|
+
"""Defini une classe permettant le calcul d'un élément métalique en cisaillement selon l'EN 1993-1-1 §6.2.6.
|
|
210
|
+
Cette classe est hérité de la classe Element du module E3_Element_droit.py.
|
|
211
|
+
|
|
212
|
+
Args:
|
|
213
|
+
Av (float): Aire de cisaillemment en mm²
|
|
214
|
+
"""
|
|
215
|
+
super().__init__(*args, **kwargs)
|
|
216
|
+
self.Av = Av * si.mm**2
|
|
217
|
+
|
|
218
|
+
@property
|
|
219
|
+
def Vpl_Rd(self):
|
|
220
|
+
"""Calcul la résistance du cisaillment plastique en N (équa 6.18)
|
|
221
|
+
"""
|
|
222
|
+
A_v = self.Av
|
|
223
|
+
f_y = self.fy
|
|
224
|
+
gamma_M0 = self.GAMMA_M["gamma_M0"]
|
|
225
|
+
@handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
|
|
226
|
+
def val():
|
|
227
|
+
Vpl_Rd = (A_v * f_y/sqrt(3)) / gamma_M0 #(équa 6.18)
|
|
228
|
+
return Vpl_Rd
|
|
229
|
+
return val()
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
class Flexion(Element):
|
|
233
|
+
def __init__(self, W: si.mm**3, *args, **kwargs):
|
|
234
|
+
"""Defini une classe permettant le calcul en flexion d'un élément acier suivant l'EN 1993-1-1 §6.2.5.
|
|
235
|
+
Cette classe est hérité de la classe Element du module EC3_Element_droit.py.
|
|
236
|
+
|
|
237
|
+
Args:
|
|
238
|
+
Wpl (float, optional): Module de flexion plastique (pour les sections transversales de classe 1 et 2) de la section en mm3.
|
|
239
|
+
Wel_min (float, optional): Module de flexion élastique (pour les sections transversales de classe 3) de la section en mm3.
|
|
240
|
+
Weff_min (float, optional): Module de flexion efficace (pour les sections transversales de classe 4) de la section en mm3.
|
|
241
|
+
"""
|
|
242
|
+
super().__init__(*args, **kwargs)
|
|
243
|
+
self.W = W * si.mm**3
|
|
244
|
+
|
|
245
|
+
@property
|
|
246
|
+
def Mc_Rd(self):
|
|
247
|
+
"""Calcul la résistance du moment fléchissant de la section transversale en N.mm (équa 6.13, 6.14, et 6.15)
|
|
248
|
+
"""
|
|
249
|
+
gamma_M0 = self.GAMMA_M["gamma_M0"]
|
|
250
|
+
f_y = self.fy
|
|
251
|
+
match self.classe_transv:
|
|
252
|
+
case 1|2:
|
|
253
|
+
W_pl = self.W
|
|
254
|
+
@handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
|
|
255
|
+
def val():
|
|
256
|
+
M_pl_Rd = W_pl * f_y/ gamma_M0 #équa 6.13
|
|
257
|
+
return M_pl_Rd
|
|
258
|
+
case 3:
|
|
259
|
+
W_el_min = self.W
|
|
260
|
+
@handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
|
|
261
|
+
def val():
|
|
262
|
+
M_el_Rd = W_el_min * f_y/ gamma_M0 #équa 6.14
|
|
263
|
+
return M_el_Rd
|
|
264
|
+
case 4:
|
|
265
|
+
W_eff_min = self.W
|
|
266
|
+
@handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
|
|
267
|
+
def val():
|
|
268
|
+
M_c_Rd = W_eff_min * f_y/ gamma_M0 #équa 6.15
|
|
269
|
+
return M_c_Rd
|
|
270
|
+
return val()
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
def Mc_V_Rd(self, Av: float, V_Ed: float):
|
|
274
|
+
"""Calcul la résistance du moment fléchissant avec prise en compte de l'incidence du cisaillement sur ce dernier EN 1993-1-1 §6.2.8
|
|
275
|
+
(équa 6.29)
|
|
276
|
+
|
|
277
|
+
Args:
|
|
278
|
+
Av (float): Aire de cisaillemment en mm².
|
|
279
|
+
V_Ed (float): Effort de cisaillement en kN.
|
|
280
|
+
"""
|
|
281
|
+
A_v = Av * si.mm**2
|
|
282
|
+
V_Ed = V_Ed * si.kN
|
|
283
|
+
cis = Cisaillement._from_parent_class(self, Av=Av)
|
|
284
|
+
Vpl_Rd = cis.Vpl_Rd[1]
|
|
285
|
+
Mc_Rd = self.Mc_Rd[1]
|
|
286
|
+
@handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\[", right="\]")
|
|
287
|
+
def val():
|
|
288
|
+
if V_Ed/Vpl_Rd > 0.5:
|
|
289
|
+
rho = ((2*V_Ed) / Vpl_Rd-1)**2
|
|
290
|
+
My_V_Rd = rho * Mc_Rd
|
|
291
|
+
elif V_Ed/Vpl_Rd <= 0.5:
|
|
292
|
+
My_V_Rd = Mc_Rd
|
|
293
|
+
return My_V_Rd
|
|
294
|
+
return val()
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
if __name__ == "__main__":
|
|
298
|
+
aire = 10*112
|
|
299
|
+
calcul = Flexion(t=10, h=112, classe_acier="S235", classe_transv=1, W=2000000)
|
|
300
|
+
print(calcul.Mc_V_Rd(200, 12000))
|
|
301
|
+
val =10* si.mm
|
|
302
|
+
print(val.value)
|