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,466 @@
|
|
|
1
|
+
# coding in UTF-8
|
|
2
|
+
|
|
3
|
+
############# Le but de ce fichier est de regrouper toute les fonctions d'assemblage par organe métalique dans l'EN-1993 #############
|
|
4
|
+
from math import *
|
|
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.EC3_Element_droit import Element
|
|
12
|
+
|
|
13
|
+
#======================================================= Tige =========================================================
|
|
14
|
+
|
|
15
|
+
class Tige(Element):
|
|
16
|
+
QUALITE_ACIER = tuple(str(key) for key in Element._data_from_csv(Element, "qualite_acier.csv").index)
|
|
17
|
+
|
|
18
|
+
def __init__(self, d:si.mm, d0:si.mm, qualite: str=QUALITE_ACIER, verif_filetage: bool=("False", "True"), filetage_EN1090: bool=("True", "False"), *args, **kwargs):
|
|
19
|
+
"""Configure un objet Tige permettant les vérification suivant l'EN 1993-1-8. Cette classe est hérité de la classe Element du fichier EC3_Element_droit.py.
|
|
20
|
+
|
|
21
|
+
Args:
|
|
22
|
+
d (int): le diamètre de la tige en mm
|
|
23
|
+
d0 (int): le diamètre de percage en mm
|
|
24
|
+
qualite (float): classe d'acier de la tige (ex: 4.8)
|
|
25
|
+
verif_filetage (bool, optional): définit si le filetage du boulon doit être vérifier, si c'est le cas alors True. Defaults to False.
|
|
26
|
+
filetage_EN1090 (bool, optional): définit si le filetage est conforme à l'EN 1090, soit matricé. Si filetage usiné alors False. Defaults to True.
|
|
27
|
+
"""
|
|
28
|
+
super().__init__(*args, **kwargs)
|
|
29
|
+
self.d = d * si.mm
|
|
30
|
+
self.d0 = d0 * si.mm
|
|
31
|
+
self.qualite = qualite
|
|
32
|
+
self.verif_filetage = verif_filetage
|
|
33
|
+
|
|
34
|
+
if filetage_EN1090:
|
|
35
|
+
self.filetage_EN1090 = 1
|
|
36
|
+
else:
|
|
37
|
+
self.filetage_EN1090 = 0.85
|
|
38
|
+
|
|
39
|
+
self.fyb = self.__qualite_acier.loc["fyb"] * si.MPa
|
|
40
|
+
self.fub = self.__qualite_acier.loc["fub"] * si.MPa
|
|
41
|
+
|
|
42
|
+
if type(self.__section_boulon) is pd.core.series.Series:
|
|
43
|
+
self.As = self.__section_boulon.loc["As"] * si.mm**2
|
|
44
|
+
self.An = self.__section_boulon.loc["An"] * si.mm**2
|
|
45
|
+
else:
|
|
46
|
+
self.As = 0 * si.mm**2
|
|
47
|
+
self.An = pi * (self.d.value*10**3/2)**2 * si.mm**2
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
@property
|
|
51
|
+
def __qualite_acier(self):
|
|
52
|
+
df = self._data_from_csv("qualite_acier.csv")
|
|
53
|
+
df = df.loc[self.qualite]
|
|
54
|
+
return df
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
@property
|
|
58
|
+
def __section_boulon(self):
|
|
59
|
+
try:
|
|
60
|
+
df = self._data_from_csv("section_boulon.csv")
|
|
61
|
+
df = df.loc[self.d.value*10**3]
|
|
62
|
+
return df
|
|
63
|
+
except KeyError:
|
|
64
|
+
print("Le diamètre ne peut pas être celui d'un boulon, vérifier As = 0, An = aire de d")
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def pince_metal_boulon(self, trous_oblongs: bool=("False", "True"), corrosion: bool=("False", "True")):
|
|
69
|
+
""" Retourne les pinces du métal minimum dans un assemblage constitué de tige (EN 1993-1-8 §3.5) avec:
|
|
70
|
+
trous_oblongs : si les trous oblongs True sinon False
|
|
71
|
+
corrosion : assemblage exposé à la corrosion = True sinon False
|
|
72
|
+
en_10025_5 : structure réalisées en acier conformes à l'EN 10025-5, True si vrai sinon False
|
|
73
|
+
|
|
74
|
+
NE PRENDS PAS EN COMPTE P1,0 ou P1,i ou P2 diminué quand les boulons sont en quinconce (voir §3.5 -5)
|
|
75
|
+
"""
|
|
76
|
+
|
|
77
|
+
en_10025_5 = False
|
|
78
|
+
|
|
79
|
+
if self._Element__classe_acier.loc["norme"] == "EN 10025-5":
|
|
80
|
+
en_10025_5 = True
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
pince = {}
|
|
84
|
+
|
|
85
|
+
e1 = {"e1_min": round(1.2 * self.d0.value*10**3, 1)}
|
|
86
|
+
e2 = {"e2_min": e1["e1_min"]}
|
|
87
|
+
e3 = round(1.5 * self.d0.value*10**3, 1)
|
|
88
|
+
e4 = e3
|
|
89
|
+
p1 = {"p1_min": round(2.2 * self.d0.value*10**3 , 1)}
|
|
90
|
+
p2 = {"p2_min": round(2.4 * self.d0.value*10**3, 1)}
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
if not en_10025_5:
|
|
94
|
+
p1["p1_max"] = round(min(14 * self.t.value*10**3, 200))
|
|
95
|
+
p2["p2_max"] = p1["p1_max"]
|
|
96
|
+
|
|
97
|
+
if corrosion:
|
|
98
|
+
e1["e1_max_corro"] = round(4 * self.t.value*10**3 + 40)
|
|
99
|
+
e2["e2_max_corro"] = e1["e1_max_corro"]
|
|
100
|
+
|
|
101
|
+
else:
|
|
102
|
+
e1["e1_max"] = round(max(8 * self.t.value*10**3, 125))
|
|
103
|
+
e2["e2_max"] = e1["e1_max"]
|
|
104
|
+
p1["p1_max"] = round(min(14 * self.t.value*10**3, 175))
|
|
105
|
+
p2["p2_max"] = p1["p1_max"]
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
if trous_oblongs :
|
|
109
|
+
pince["e3"] = e3
|
|
110
|
+
pince["e4"] = e4
|
|
111
|
+
else:
|
|
112
|
+
pince["e1"] = e1
|
|
113
|
+
pince["e2"] = e2
|
|
114
|
+
|
|
115
|
+
pince["p1"] = p1
|
|
116
|
+
pince["p2"] = p2
|
|
117
|
+
|
|
118
|
+
return pince
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
@property
|
|
122
|
+
def FvRd(self) -> float:
|
|
123
|
+
"""Retourne la résistance en cisaillement de la partie fileté et lisse d'une tige par plan en N
|
|
124
|
+
"""
|
|
125
|
+
quali_1 = [4.6,5.6,8.8]
|
|
126
|
+
if self.qualite in quali_1:
|
|
127
|
+
fvrd_filete = 0.6 * self.fub * self.As / self.GAMMA_M["gamma_M2"]
|
|
128
|
+
else:
|
|
129
|
+
fvrd_filete = 0.5 * self.fub * self.As / self.GAMMA_M["gamma_M2"]
|
|
130
|
+
|
|
131
|
+
fvrd_lisse = 0.6 * self.fub * self.An / self.GAMMA_M["gamma_M2"]
|
|
132
|
+
return {"filetage": fvrd_filete * self.filetage_EN1090, "lisse": fvrd_lisse * self.filetage_EN1090}
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
@property
|
|
136
|
+
def FtRd(self) -> float:
|
|
137
|
+
"""Retourne la résistance en traction de la tige en N
|
|
138
|
+
"""
|
|
139
|
+
f_ub = self.fub
|
|
140
|
+
A_s = self.As
|
|
141
|
+
gamma_M2 = self.GAMMA_M["gamma_M2"]
|
|
142
|
+
coef_filetage_EN1090 = self.filetage_EN1090
|
|
143
|
+
@handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\[", right="\]")
|
|
144
|
+
def val():
|
|
145
|
+
F_t_Rd = 0.9 * f_ub * A_s / gamma_M2 * coef_filetage_EN1090
|
|
146
|
+
return F_t_Rd
|
|
147
|
+
return val()
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
#Combinaison des efforts
|
|
151
|
+
def taux_FvEd_FtEd(self, FvEd: float=0, FtEd: float=0):
|
|
152
|
+
"""Retourne les taux de travail en cisaillement, en traction et combiné d'une tige
|
|
153
|
+
|
|
154
|
+
Args:
|
|
155
|
+
FvEd (int): effort à reprendre en cisaillment en kN
|
|
156
|
+
FtEd (int): effort de traction à reprendre en kN
|
|
157
|
+
|
|
158
|
+
Returns:
|
|
159
|
+
dict: dictionnaire des taux de travail slon tab. 3.4 de l'EN 1993-1-8
|
|
160
|
+
"""
|
|
161
|
+
self.FvEd = FvEd * si.kN
|
|
162
|
+
self.FtEd = FtEd * si.kN
|
|
163
|
+
self.taux_bl = {}
|
|
164
|
+
|
|
165
|
+
self.taux_bl["taux_t_d"] = self.FtEd / self.FtRd[1]
|
|
166
|
+
|
|
167
|
+
self.taux_bl["taux_v_d_lisse"] = self.FvEd / self.FvRd["lisse"]
|
|
168
|
+
|
|
169
|
+
if self.verif_filetage:
|
|
170
|
+
self.taux_bl["taux_v_d_filetage"] = self.FvEd / self.FvRd["filetage"]
|
|
171
|
+
if FvEd and FtEd:
|
|
172
|
+
self.taux_bl["taux_v_t_d"] = self.FvEd / min(self.FvRd["lisse"], self.FvRd["filetage"]) + self.FtEd / (1.4 * self.FtRd[1])
|
|
173
|
+
else:
|
|
174
|
+
self.taux_bl["taux_v_t_d"] = self.FvEd / self.FvRd["lisse"] + self.FtEd / (1.4 * self.FtRd[1])
|
|
175
|
+
|
|
176
|
+
return self.taux_bl
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def Bp_Rd(self, d_ecrou: int, d_head_bl: int, *args):
|
|
180
|
+
"""Retourne la résistance au poinçonnement de la plaque en N
|
|
181
|
+
|
|
182
|
+
Args:
|
|
183
|
+
d_ecrou (int): diamètre extérieur de l'écrou en mm
|
|
184
|
+
d_head_bl (int): diamètre de la tête de boulon en mm
|
|
185
|
+
tp, i (int, args): épaisseur des plaques dans l'assemblage, sinon récupère le t de la classe Element
|
|
186
|
+
|
|
187
|
+
Returns:
|
|
188
|
+
float: résistance de calcul en N
|
|
189
|
+
"""
|
|
190
|
+
d_ecrou = d_ecrou * si.mm
|
|
191
|
+
d_head_bl = d_head_bl * si.mm
|
|
192
|
+
dm = (d_ecrou + d_head_bl) / 2
|
|
193
|
+
tp = min(self.t.value*10**3, *args) * si.mm
|
|
194
|
+
return (0.6 * pi * dm * tp * self.fu) / __class__.GAMMA_M["gamma_M2"]
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def Fb_Rd(self, e1: float ,e2: float , p1: float, p2: float):
|
|
198
|
+
"""Retourne la pression diamétrale en N.
|
|
199
|
+
ATTENTION: ne prends pas en compte les réductions de résistance lié au critère de l'assemblage (voir §3.6.1-10 et tab 3.4)
|
|
200
|
+
- jeux non normalisés -> 0.8 * Fb,Rd
|
|
201
|
+
- Trous oblongs avec axe perpendiculaire à la direction de la charge -> 0.6 * Fb,Rd
|
|
202
|
+
- Assemblage à une seule rangée de boulon en simple cisaillement -> rondelles + limitation de Fb,Rd <= 1.5*fu*d*t/gamma_M2
|
|
203
|
+
|
|
204
|
+
Args:
|
|
205
|
+
e1 (float): pince e1 en mm
|
|
206
|
+
e2 (float): pince e2 en mm
|
|
207
|
+
p1 (float): pince p1 en mm
|
|
208
|
+
p2 (float): pince p2 en mm
|
|
209
|
+
|
|
210
|
+
Returns:
|
|
211
|
+
float: résistance de calcul en N
|
|
212
|
+
"""
|
|
213
|
+
e_1 = e1 * si.mm
|
|
214
|
+
e_2 = e2 * si.mm
|
|
215
|
+
p_1 = p1 * si.mm
|
|
216
|
+
p_2 = p2 * si.mm
|
|
217
|
+
f_u = self.fu
|
|
218
|
+
f_u_b = self.fub
|
|
219
|
+
d_0 = self.d0
|
|
220
|
+
d = self.d
|
|
221
|
+
t = self.t
|
|
222
|
+
gamma_M_2 = __class__.GAMMA_M["gamma_M2"]
|
|
223
|
+
|
|
224
|
+
@handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\[", right="\]")
|
|
225
|
+
def val():
|
|
226
|
+
alpha_b = min(e_1 / (3 * d_0), (p_1 / (3 * d_0)) - 0.25, f_u_b / f_u, 1)
|
|
227
|
+
k_1 = min(2.8 * e_2 / d_0 - 1.7, 1.4 * p_2 / d_0 - 1.7, 2.5)
|
|
228
|
+
|
|
229
|
+
F_b_Rd = k_1 * alpha_b * f_u_b * d * t / gamma_M_2
|
|
230
|
+
return F_b_Rd
|
|
231
|
+
return val()
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
def Veff_Rd(self, Lnt: float, Lvt: float, effort: str=("Centré", "Excentré")):
|
|
235
|
+
"""Retourne la résistance en cisaillement bloc de l'assemblage selon §3.10.2.
|
|
236
|
+
|
|
237
|
+
Args:
|
|
238
|
+
Lnt (float, optional): longueur nette soumise à la traction déduction faite des trous de boulons en mm.
|
|
239
|
+
Lvt (float, optional): longueur nette soumise au cisaillement déduction faite des trous de boulons en mm.
|
|
240
|
+
effort (str, optional): définit si l'effort est centré ou excentré par rapport au cisaillement de bloc. Defaults to ("Centré", "Excentré").
|
|
241
|
+
|
|
242
|
+
Returns:
|
|
243
|
+
float: résistance de calcul en N
|
|
244
|
+
"""
|
|
245
|
+
A_nt = Lnt * si.mm * self.t
|
|
246
|
+
A_vt = Lvt * si.mm * self.t
|
|
247
|
+
f_y = self.fy
|
|
248
|
+
f_u = self.fu
|
|
249
|
+
k_ex = 1
|
|
250
|
+
gamma_M_2 = __class__.GAMMA_M["gamma_M2"]
|
|
251
|
+
|
|
252
|
+
if effort == "Excentré":
|
|
253
|
+
k_ex = 0.5
|
|
254
|
+
|
|
255
|
+
@handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\[", right="\]")
|
|
256
|
+
def val():
|
|
257
|
+
V_eff_nt_Rd = (A_nt * f_u) / gamma_M_2
|
|
258
|
+
V_eff_nv_Rd = 1/sqrt(3) * (A_vt * f_y) / gamma_M_2
|
|
259
|
+
V_eff_Rd = k_ex * V_eff_nt_Rd + V_eff_nv_Rd
|
|
260
|
+
return V_eff_Rd
|
|
261
|
+
return val()
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
def taux_Veff_d(self, N_Ed: float=0, N_Veff_Rd: float=0, V_Ed: float=0, V_Veff_Rd: float=0):
|
|
265
|
+
"""Retourne le taux de travail du cisaillement bloc avec un effort combiné ou non selon l'EN 1993 §3.10.2 et le CNC2M-N0175-REC §2.1(10).
|
|
266
|
+
|
|
267
|
+
Args:
|
|
268
|
+
N_Ed (float, optional): effort normal en kN. Defaults to 0.
|
|
269
|
+
V_Ed (float, optional): effort de cisaillement en kN. Defaults to 0.
|
|
270
|
+
V_Veff_Rd (float, optional): résistance de l'effort de traction en rupture bloc en kN, si pas d'effort ne rien mettre. Defaults to 0.
|
|
271
|
+
V_Veff_Rd (float, optional): résistance de l'effort de cisaillement en kN ,si pas d'effort ne rien mettre. Defaults to 0.
|
|
272
|
+
|
|
273
|
+
"""
|
|
274
|
+
N_Ed = N_Ed * si.kN
|
|
275
|
+
N_Veff_Rd = N_Veff_Rd * si.kN
|
|
276
|
+
V_Ed = V_Ed * si.kN
|
|
277
|
+
V_Veff_Rd = V_Veff_Rd * si.kN
|
|
278
|
+
|
|
279
|
+
# selon CNC2M §2.1(10)
|
|
280
|
+
if N_Ed.value and V_Ed.value:
|
|
281
|
+
@handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\[", right="\]")
|
|
282
|
+
def val():
|
|
283
|
+
taux = N_Ed / N_Veff_Rd + V_Ed / V_Veff_Rd
|
|
284
|
+
return taux
|
|
285
|
+
return val()
|
|
286
|
+
elif N_Ed.value:
|
|
287
|
+
taux = N_Ed / N_Veff_Rd
|
|
288
|
+
else:
|
|
289
|
+
taux = V_Ed / V_Veff_Rd
|
|
290
|
+
return taux
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
class Soudure(Element):
|
|
295
|
+
def __init__(self, t2: si.mm, gorge: si.mm, l: si.mm, retour_soudure: bool=("False", "True"), alpha: float=90, *args, **kwargs):
|
|
296
|
+
"""Configure un objet soudure permettant les vérification suivant l'EN 1993-1-8. Cette classe est hérité de la classe Element du fichier EC3_Element_droit.py.
|
|
297
|
+
|
|
298
|
+
Args:
|
|
299
|
+
t2 (float): épaisseur de la pièce 2 sur laquelle on soude en mm
|
|
300
|
+
gorge (int): dimension de la gorge "a" en mm
|
|
301
|
+
l (int): longueur de soudure "brute" sans cratère en mm
|
|
302
|
+
retour_soudure (bool, optional): détermine si un retour de la soudure est fait si oui alors True. Defaults to False.
|
|
303
|
+
alpha (int | float, optional): angle en degré de la de la pièce 2 sur la pièce 1. Defaults to 90.
|
|
304
|
+
"""
|
|
305
|
+
|
|
306
|
+
super().__init__(*args, **kwargs)
|
|
307
|
+
self.t2 = t2 * si.mm
|
|
308
|
+
self.gorge = gorge * si.mm
|
|
309
|
+
self.l = l * si.mm
|
|
310
|
+
self.retour_soudure = retour_soudure
|
|
311
|
+
self.alpha = alpha
|
|
312
|
+
|
|
313
|
+
self.verif_soudure()
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
@property
|
|
317
|
+
def beta_w(self):
|
|
318
|
+
return float(self._Element__classe_acier.loc["betaW"])
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
@property
|
|
322
|
+
def lef(self):
|
|
323
|
+
if not self.retour_soudure:
|
|
324
|
+
return self.l - 2 * self.gorge
|
|
325
|
+
else:
|
|
326
|
+
return self.l
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
def verif_soudure(self):
|
|
330
|
+
"""Vérifie que la soudure répond aux critères de l'EC3
|
|
331
|
+
|
|
332
|
+
Returns:
|
|
333
|
+
bool: si la soudure est correctement définie, alors True sinon False
|
|
334
|
+
"""
|
|
335
|
+
if 60 <= self.alpha <= 120:
|
|
336
|
+
# selon CNC2M-N0175-REC §3.3
|
|
337
|
+
tmin = min(self.t, self.t2)
|
|
338
|
+
tmax = max(self.t, self.t2)
|
|
339
|
+
amin = max(3*si.mm, (sqrt(tmax)-0.5)*si.mm)
|
|
340
|
+
amax = 0.7 * tmin
|
|
341
|
+
|
|
342
|
+
if amin <= self.gorge <= amax:
|
|
343
|
+
if self.l > max(30*si.mm, 6*self.gorge):
|
|
344
|
+
return True
|
|
345
|
+
else:
|
|
346
|
+
print(f"La longueur du cordon de soudure est trop petite, elle doit être supérieur à {min(30*si.mm, 6*self.gorge)}")
|
|
347
|
+
return False
|
|
348
|
+
else:
|
|
349
|
+
print(f"La gorge doit être au minimum de {amin} et au maximum de {amax}")
|
|
350
|
+
return False
|
|
351
|
+
else:
|
|
352
|
+
print("L'angle entre les deux pièces à souder doit être compris entre 60° et 120°")
|
|
353
|
+
return False
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
def beta_Lw1(self, Lj: int) -> float:
|
|
357
|
+
"""Calcul le facteur beta_Lw,1 qui dimminue la résistance pour des cordons de soudure des assemblages par recouvrement (à plat)
|
|
358
|
+
|
|
359
|
+
Args:
|
|
360
|
+
Lj (int): Longueur de recouvrement des plats en mm
|
|
361
|
+
"""
|
|
362
|
+
Lj = Lj * si.mm
|
|
363
|
+
return min((1.2 - 0.2 * Lj) / (150 * self.gorge), 1)
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
def cordon_frontal(self, N_Ed: float):
|
|
367
|
+
"""Calcul un cordon de soudure frontale et retourne le taux de travail.
|
|
368
|
+
|
|
369
|
+
Args:
|
|
370
|
+
N_Ed (float): Effort de traction en kN.
|
|
371
|
+
"""
|
|
372
|
+
N_Ed = N_Ed * si.kN
|
|
373
|
+
return (self.beta_w * self.GAMMA_M["gamma_M2"] * (N_Ed * sqrt(2)) / self.fu) / (self.gorge * self.lef)
|
|
374
|
+
|
|
375
|
+
|
|
376
|
+
def cordon_laterale(self, V_Ed: float):
|
|
377
|
+
"""Calcul un cordon de soudure latérale et retourne le taux de travail.
|
|
378
|
+
|
|
379
|
+
Args:
|
|
380
|
+
V_Ed (float): Effort de cisaillement du cordon en kN.
|
|
381
|
+
"""
|
|
382
|
+
V_Ed = V_Ed * si.kN
|
|
383
|
+
return (self.beta_w * self.GAMMA_M["gamma_M2"] * (V_Ed * sqrt(3)) / self.fu) / (self.gorge * self.lef)
|
|
384
|
+
|
|
385
|
+
|
|
386
|
+
def cordon_oblique(self, alpha_cordon: float, N_Ed: float):
|
|
387
|
+
"""Calcul un cordon de soudure oblique et retourne le taux de travail.
|
|
388
|
+
|
|
389
|
+
Args:
|
|
390
|
+
N_Ed (float): Effort de traction en kN.
|
|
391
|
+
"""
|
|
392
|
+
self.alpha_cordon = alpha_cordon
|
|
393
|
+
N_Ed = N_Ed * si.kN
|
|
394
|
+
return (self.beta_w * self.GAMMA_M["gamma_M2"] * (N_Ed * sqrt(3 - sin(radians(self.alpha_cordon))**2)) / self.fu) / (self.gorge * self.lef)
|
|
395
|
+
|
|
396
|
+
|
|
397
|
+
def cordon_pieces_obliques(self, N_Ed: float):
|
|
398
|
+
"""Calcul un cordon de soudure sur des pièces à positionnement obliques et retourne le taux de travail.
|
|
399
|
+
|
|
400
|
+
Args:
|
|
401
|
+
N_Ed (float): Effort de traction en kN.
|
|
402
|
+
"""
|
|
403
|
+
N_Ed = N_Ed * si.kN
|
|
404
|
+
if self.alpha < 90:
|
|
405
|
+
return (self.beta_w * self.GAMMA_M["gamma_M2"] * (N_Ed * sqrt(2 - sin(radians(self.alpha)))) / self.fu) / (self.gorge * self.lef)
|
|
406
|
+
elif self.alpha > 90:
|
|
407
|
+
return (self.beta_w * self.GAMMA_M["gamma_M2"] * (N_Ed * sqrt(2 + sin(radians(self.alpha)))) / self.fu) / (self.gorge * self.lef)
|
|
408
|
+
|
|
409
|
+
|
|
410
|
+
def critere_generale(self, FvEd: float, FaxEd: float):
|
|
411
|
+
"""Calcul le critère générale de Von Mises d'une soudure et retourne le taux.
|
|
412
|
+
|
|
413
|
+
Args:
|
|
414
|
+
FvEd (int | float): Effort de cisaillement sur la en kN
|
|
415
|
+
FaxEd (int | float): Effort de traction sur la soudure en kN
|
|
416
|
+
|
|
417
|
+
Returns:
|
|
418
|
+
(float) : Taux de travail de la soudure
|
|
419
|
+
"""
|
|
420
|
+
Fv_Ed = FvEd * si.kN
|
|
421
|
+
Fax_Ed = FaxEd * si.kN
|
|
422
|
+
self.tau_para = Fv_Ed / (self.gorge * self.lef)
|
|
423
|
+
self.sigma_perpend = (Fax_Ed * cos(radians(self.alpha/2)))/ (self.gorge * self.lef)
|
|
424
|
+
self.tau_perpend = (Fax_Ed * cos(radians(self.alpha/2)))/ (self.gorge * self.lef)
|
|
425
|
+
self.sigma_e = sqrt(self.sigma_perpend**2 + 3 * (self.tau_perpend**2 + self.tau_para**2))
|
|
426
|
+
|
|
427
|
+
self.sigma_Rd = self.fu / (self.beta_w * self.GAMMA_M["gamma_M2"])
|
|
428
|
+
self.sigma_perpend_Rd = (0.9 * self.fu) / self.GAMMA_M["gamma_M2"]
|
|
429
|
+
return max(self.sigma_e / self.sigma_Rd, self.sigma_perpend / self.sigma_perpend_Rd)
|
|
430
|
+
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
def soudure_discontinue(self, b: int, b1: int, t1: int, corrosion: bool=("False", "True")):
|
|
434
|
+
"""_summary_
|
|
435
|
+
|
|
436
|
+
Args:
|
|
437
|
+
b (int): voir EC3 1-8
|
|
438
|
+
b1 (int): hauteur en mm de la pièce 2 soudé sur la pièce 1
|
|
439
|
+
t (int): définit dans la classe Element
|
|
440
|
+
t2 (int): épaisseur en mm de la piece 2 soudé sur pièce 1
|
|
441
|
+
corrosion (bool, optional): _description_. Defaults to False.
|
|
442
|
+
|
|
443
|
+
Returns:
|
|
444
|
+
_type_: _description_
|
|
445
|
+
"""
|
|
446
|
+
if corrosion:
|
|
447
|
+
print("Il n'est pas possible d'avoir une soudure discontinue en ambiance corrosive")
|
|
448
|
+
return False
|
|
449
|
+
b = b * si.mm
|
|
450
|
+
lwe = max(0.75 * b, 0.75 * b1*si.mm)
|
|
451
|
+
l1 = min(16 * self.t, 16 * self.t2, 200)
|
|
452
|
+
l2 = min(12 * self.t, 12 * self.t2, 0.25 * b, 200)
|
|
453
|
+
return {"Lwe": lwe, "L1": l1, "L2": l2}
|
|
454
|
+
|
|
455
|
+
|
|
456
|
+
|
|
457
|
+
|
|
458
|
+
if __name__ == "__main__":
|
|
459
|
+
ele = Element(classe_acier="S235", t=6, h=200, classe_transv=1)
|
|
460
|
+
soudure = Soudure._from_parent_class(ele, t2=6, gorge=4, l=140, retour_soudure=True, alpha=90)
|
|
461
|
+
bl = Tige._from_parent_class(ele, d=12,d0=14,qualite="A2-50",verif_filetage=True, filetage_EN1090=True)
|
|
462
|
+
print(soudure.critere_generale(0, 100135))
|
|
463
|
+
N_rd = bl.Veff_Rd(300, 300, "Centré")
|
|
464
|
+
V_Rd = bl.Veff_Rd(300, 300, "Centré")
|
|
465
|
+
taux = bl.taux_Veff_d(12, N_rd[1], 25, V_Rd[1])
|
|
466
|
+
print(taux)
|