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.

Files changed (53) hide show
  1. ourocode/__init__.py +0 -0
  2. ourocode/__version__.py +1 -0
  3. ourocode/data/caracteristique_meca_acier.csv +33 -0
  4. ourocode/data/caracteristique_meca_bois.csv +59 -0
  5. ourocode/data/carte_action_region.csv +36722 -0
  6. ourocode/data/coeff_psy.csv +13 -0
  7. ourocode/data/exploitation.csv +17 -0
  8. ourocode/data/gammaM.csv +14 -0
  9. ourocode/data/kdef.csv +11 -0
  10. ourocode/data/kfi.csv +10 -0
  11. ourocode/data/kmod.csv +16 -0
  12. ourocode/data/limite_fleche.csv +9 -0
  13. ourocode/data/qualite_acier.csv +18 -0
  14. ourocode/data/screenshot/C90_def.png +0 -0
  15. ourocode/data/screenshot/Kv_def.png +0 -0
  16. ourocode/data/screenshot/fleche.png +0 -0
  17. ourocode/data/screenshot/sign_convention.png +0 -0
  18. ourocode/data/section_boulon.csv +12 -0
  19. ourocode/data/vent/vent_Cp_toiture_isolee_1_versant.csv +22 -0
  20. ourocode/data/vent/vent_Cp_toiture_isolee_1_versant.png +0 -0
  21. ourocode/data/vent/vent_Cp_toiture_isolee_2_versants.csv +31 -0
  22. ourocode/data/vent/vent_Cp_toiture_isolee_2_versants.png +0 -0
  23. ourocode/data/vent/vent_Cpe_mur_verticaux.csv +11 -0
  24. ourocode/data/vent/vent_Cpe_mur_verticaux.png +0 -0
  25. ourocode/data/vent/vent_Cpe_toiture_1_versant.png +0 -0
  26. ourocode/data/vent/vent_Cpe_toiture_1_versant_0_degres.csv +13 -0
  27. ourocode/data/vent/vent_Cpe_toiture_1_versant_180_degres.csv +13 -0
  28. ourocode/data/vent/vent_Cpe_toiture_1_versant_90_degres.csv +13 -0
  29. ourocode/data/vent/vent_Cpe_toiture_2_versants.png +0 -0
  30. ourocode/data/vent/vent_Cpe_toiture_2_versants_0_degres.csv +21 -0
  31. ourocode/data/vent/vent_Cpe_toiture_2_versants_90_degres.csv +21 -0
  32. ourocode/data/vent/vent_Cpe_toiture_terrasse.csv +21 -0
  33. ourocode/data/vent/vent_Cpe_toiture_terrasse.png +0 -0
  34. ourocode/data/vent/vent_Ffr.png +0 -0
  35. ourocode/eurocode/A0_Projet.py +1408 -0
  36. ourocode/eurocode/EC0_Combinaison.py +1763 -0
  37. ourocode/eurocode/EC1_Exploitation.py +103 -0
  38. ourocode/eurocode/EC1_Neige.py +385 -0
  39. ourocode/eurocode/EC1_Vent.py +1388 -0
  40. ourocode/eurocode/EC3_Assemblage.py +466 -0
  41. ourocode/eurocode/EC3_Element_droit.py +302 -0
  42. ourocode/eurocode/EC5_Assemblage.py +1760 -0
  43. ourocode/eurocode/EC5_Element_droit.py +1740 -0
  44. ourocode/eurocode/EC5_Feu.py +922 -0
  45. ourocode/eurocode/EC8_Sismique.py +2 -0
  46. ourocode/eurocode/__init__.py +0 -0
  47. ourocode/eurocode/logical.py +83 -0
  48. ourocode/eurocode/objet.py +263 -0
  49. ourocode-1.6.0.dist-info/METADATA +331 -0
  50. ourocode-1.6.0.dist-info/RECORD +53 -0
  51. ourocode-1.6.0.dist-info/WHEEL +5 -0
  52. ourocode-1.6.0.dist-info/licenses/LICENSE +201 -0
  53. ourocode-1.6.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,922 @@
1
+ #! env\Scripts\python.exe
2
+ # Encoding in UTF-8 by Anthony PARISOT
3
+ import sys
4
+ import os
5
+ import math as mt
6
+ from math import sqrt, pi
7
+ import pandas as pd
8
+
9
+ import forallpeople as si
10
+
11
+ si.environment("structural")
12
+ from handcalcs.decorator import handcalc
13
+
14
+ sys.path.append(os.path.join(os.getcwd()))
15
+ from ourocode.eurocode.EC5_Element_droit import (
16
+ Barre,
17
+ Flexion,
18
+ Traction,
19
+ Compression,
20
+ Cisaillement,
21
+ )
22
+
23
+
24
+ def interpolation_lineaire(x, xa, xb, ya, yb):
25
+ """Fait une interpolation linéaire pour trouver un résultat y entre deux valeur xa et xb"""
26
+ y = ya + (x - xa) * ((yb - ya) / (xb - xa))
27
+ return y
28
+
29
+
30
+ # ================================ GLOBAL ==================================
31
+
32
+
33
+ class Feu(Barre):
34
+ EXPOSITION = (
35
+ "Pas d'exposition",
36
+ "Aucune protection",
37
+ "1 plaque de platre type A joints comblés",
38
+ "1 plaque de platre type A joints vides",
39
+ "1 plaque de platre type F joints comblés",
40
+ "1 plaque de platre type F joints vides",
41
+ "1 plaque de platre type H joints comblés",
42
+ "1 plaque de platre type H joints vides",
43
+ "Fibre de roche",
44
+ "Panneautage bois",
45
+ "Contreplaqué",
46
+ "Panneaux de fibres ou de particules",
47
+ )
48
+ D0 = 7 * si.mm
49
+ KMOD_FI = 1
50
+ ORIENTATION = ("Haut", "Bas", "Gauche", "Droite")
51
+
52
+ def __init__(
53
+ self,
54
+ t_expo: int = 30,
55
+ haut: str = EXPOSITION,
56
+ bas: str = EXPOSITION,
57
+ gauche: str = EXPOSITION,
58
+ droite: str = EXPOSITION,
59
+ double_couches: bool = ("False", "True"),
60
+ hp: si.mm = 0,
61
+ rho_k_protect: float = 0,
62
+ tf: int = None,
63
+ **kwargs,
64
+ ):
65
+ """Classe qui définit les caractéristiques d'un élément droit au feu.
66
+ Cette classe est hérité de la classe Barre du module EC5_Element_droit.py.
67
+
68
+ Args:
69
+ t_expo (int, optional): Durée d'exposition au feu en minutes. Defaults to 30.
70
+
71
+ Attention :
72
+ Pour la détermination des joints vides ou comblés en cas de protection rapportée:
73
+ un joint est considéré comme comblé si le vide est <= à 2mm.
74
+
75
+ haut (str): Type d'expostion ou de protection au feu sur le haut de l'élément.
76
+ bas (str): Type d'expostion ou de protection au feu sur le bas de l'élément.
77
+ gauche (str): Type d'expostion ou de protection au feu sur le gauche de l'élément.
78
+ droite (str): Type d'expostion ou de protection au feu sur le droite de l'élément.
79
+ hp (int)): épaisseur totale (si double couches) des panneaux de protection en mm. Defaults to 0.
80
+ rho_k_protect (float): A définir uniquement si il y a un ou des panneaux de protection bois ou en fibre de roche.
81
+ Masse volumique des panneaux de protection en kg/m3. Defaults to 0.
82
+ tf (int, optional): Durée avant rupture du matériaux de protection au feu en minutes. Defaults to None.
83
+ Attention uniquement pour les plaques de platre de type F ou les panneaux de fibres de roche.
84
+ On ne peut par conséquent pas définir des plaques de platre de type F en même temps que des panneaux de fibres de roche.
85
+ """
86
+ super().__init__(**kwargs)
87
+ self.t_expo = t_expo
88
+ self.haut = haut
89
+ self.bas = bas
90
+ self.gauche = gauche
91
+ self.droite = droite
92
+ self.protection = {
93
+ "Haut": haut,
94
+ "Bas": bas,
95
+ "Gauche": gauche,
96
+ "Droite": droite,
97
+ }
98
+ self.double_couches = double_couches
99
+ self.hp = hp * si.mm
100
+ self.rho_k_protect = rho_k_protect
101
+ self.tf = tf
102
+ self._get_section_reduction()
103
+
104
+ def __convert_latex_ftyped(self, latex: str, type_caract: str):
105
+ end_index_rk = type_caract.find("k")
106
+ type_caract = type_caract[1:end_index_rk]
107
+ latex = latex.replace("f_{type_{Rd}", "f_{" + type_caract + "_{" + "d_fi}")
108
+ latex = latex.replace("f_{type_{k}", "f_{" + type_caract + "_{" + "k_fi}")
109
+ return latex
110
+
111
+ @property
112
+ def K_fi(self):
113
+ data_csv_kfi = self._data_from_csv("kfi.csv")
114
+ return float(data_csv_kfi.loc[self.type_bois]["kfi"])
115
+
116
+ def _get_bar_beta0_and_betan(self):
117
+ beta_0 = None
118
+ beta_n = None
119
+ rho_k = int(self.caract_meca.loc["rhok"])
120
+ if self.classe[0:1] == "C" and rho_k >= 290:
121
+ beta_0 = 0.65
122
+ beta_n = 0.8
123
+ elif self.classe[0:2] == "GL" and rho_k >= 290:
124
+ beta_0 = 0.65
125
+ beta_n = 0.7
126
+ elif self.classe[0:1] == "D":
127
+ if rho_k >= 290 and rho_k < 450:
128
+ beta_0 = interpolation_lineaire(rho_k, 290, 450, 0.65, 0.5)
129
+ beta_n = interpolation_lineaire(rho_k, 290, 450, 0.7, 0.55)
130
+ elif rho_k >= 450:
131
+ beta_0 = 0.5
132
+ beta_n = 0.55
133
+ elif self.type_bois == "LVL" and rho_k >= 480:
134
+ beta_0 = 0.65
135
+ beta_n = 0.7
136
+ elif self.b_calcul.value * 10**3 >= 20 and rho_k >= 450:
137
+ if self.type_bois == "CP":
138
+ beta_0 = 1
139
+ else:
140
+ beta_0 = 0.9
141
+ elif self.b_calcul.value * 10**3 < 20 or rho_k < 450:
142
+ kp = mt.sqrt(450 / rho_k)
143
+ kh = mt.sqrt(20 / self.b_calcul.value * 10**3)
144
+ if self.type_bois == "CP":
145
+ beta_0 = 1
146
+ else:
147
+ beta_0 = 0.9
148
+ beta_0 = beta_0 * kp * kh
149
+ return beta_0, beta_n
150
+
151
+ def _get_wood_protect_beta0_and_betan(self, type_wood_protect: str):
152
+ beta_0 = None
153
+ beta_n = None
154
+ if type_wood_protect in (
155
+ "Panneautage bois",
156
+ "Contreplaqué",
157
+ "Panneaux de fibres ou de particules",
158
+ ):
159
+ if self.hp.value * 10**3 >= 20 and self.rho_k_protect >= 450:
160
+ if type_wood_protect == "Contreplaqué":
161
+ beta_0 = 1
162
+ else:
163
+ beta_0 = 0.9
164
+ elif self.hp.value * 10**3 < 20 or self.rho_k_protect < 450:
165
+ kp = mt.sqrt(450 / self.rho_k_protect)
166
+ kh = mt.sqrt(20 / self.hp.value * 10**3)
167
+ if type_wood_protect == "Contreplaqué":
168
+ beta_0 = 1
169
+ else:
170
+ beta_0 = 0.9
171
+ beta_0 = beta_0 * kp * kh
172
+ return beta_0, beta_n
173
+
174
+ def d_char_0(self, t: int, beta_0: float):
175
+ """Retourne la valeur de la profondeur de carbonisation en mm pour une carbonisation uni-dimensionnelle
176
+ Args:
177
+ t (int): le temps approprié d'exposition au feu en minutes.
178
+ """
179
+
180
+ @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
181
+ def val():
182
+ d_char_0 = beta_0 * t
183
+ return d_char_0
184
+
185
+ return val()
186
+
187
+ def _d_char_n(self, t: int, beta_n: float):
188
+ """Retourne la valeur de la profondeur de carbonisation fictive qui tient compte de l'effet des arrondis en coins
189
+ Args:
190
+ t (int): le temps approprié d'exposition au feu en minutes.
191
+ """
192
+ return beta_n * t * si.mm
193
+
194
+ def _k0(self, t: int):
195
+ if t < 20:
196
+ return t / 20
197
+ else:
198
+ return 1
199
+
200
+ def _d_ef(self, d_char_n: si.mm, t: int):
201
+ """Retourne la valeur de la profondeur de carbonisation effective en mm
202
+ Args:
203
+ d_char_n (si.mm): profondeur de carbonisation fictive
204
+ t (int): le temps approprié d'exposition au feu en minutes.
205
+ """
206
+ d_0 = self.D0
207
+ k_0 = self._k0(t)
208
+
209
+ @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
210
+ def val():
211
+ d_ef = d_char_n + k_0 * d_0
212
+ return d_ef
213
+ return val()
214
+
215
+ def _get_tch_and_tf(self, orientation: str, beta_0: float):
216
+ """Retorune le temps de démarrage de la carbonisation en minute (tch) et le temps de rupture de la protection (tf) en minute
217
+
218
+ Args:
219
+ orientation (str, optional): Orientation sur la barre. Defaults to "Bas".
220
+ """
221
+ h_p = self.hp.value * 10**3
222
+ t_f = self.tf
223
+
224
+ if self.protection[orientation] in (
225
+ "Panneautage bois",
226
+ "Contreplaqué",
227
+ "Panneaux de fibres ou de particules",
228
+ ):
229
+
230
+ @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
231
+ def val():
232
+ t_ch = self.hp.value * 10**3 / beta_0 # en min/equa3.10
233
+ t_f = t_ch # en min/equa3.14
234
+ return t_ch, t_f
235
+
236
+ # platre à joint vide A,H,F
237
+ elif "joints comblés" in self.protection[orientation]:
238
+ if self.double_couches:
239
+ if "type F" in self.protection[orientation]:
240
+ h_p = (h_p / 2) * 1.8
241
+ else:
242
+ h_p = (h_p / 2) * 1.5
243
+
244
+ if (
245
+ "type A" in self.protection[orientation]
246
+ or "type H" in self.protection[orientation]
247
+ ):
248
+
249
+ @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
250
+ def val():
251
+ t_ch = 2.8 * h_p - 14 # en min/equa3.11
252
+ t_f = t_ch # en min/equa3.15
253
+ return t_ch, t_f
254
+
255
+ else:
256
+ @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
257
+ def val():
258
+ t_ch = 2.8 * h_p - 14 # en min/equa3.11
259
+ t_f # Temps de rupture de la plaque de platre type F
260
+ return t_ch, t_f
261
+
262
+ # platre à joint comblé A,H,F
263
+ elif "joints vides" in self.protection[orientation]:
264
+ if (
265
+ "type A" in self.protection[orientation]
266
+ or "type H" in self.protection[orientation]
267
+ ):
268
+ @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
269
+ def val():
270
+ t_ch = 2.8 * h_p - 23 # en min/equa3.12
271
+ t_f = t_ch # en min/equa3.15
272
+ return t_ch, t_f
273
+
274
+ else:
275
+ @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
276
+ def val():
277
+ t_ch = 2.8 * h_p - 23 # en min/equa3.12
278
+ t_f # Temps de rupture de la plaque de platre type F
279
+ return t_ch, t_f
280
+
281
+ # Fibre de roche
282
+ elif self.protection[orientation] == "Fibre de roche":
283
+ rho_k_protect = self.rho_k_protect
284
+
285
+ @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
286
+ def val():
287
+ t_ch = 0.07 * (h_p - 20) * sqrt(rho_k_protect) # en min/equa3.13
288
+ t_f # Temps de rupture de la plaque en fibre de roche
289
+ return t_ch, t_f
290
+
291
+ # Aucune protection
292
+ else:
293
+
294
+ @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
295
+ def val():
296
+ t_ch = 0 # en min/equa3.12
297
+ t_f = t_ch # en min/equa3.15
298
+ return t_ch, t_f
299
+
300
+ return val()
301
+
302
+ def _get_k2(self, orientation: str):
303
+ k2 = 1
304
+ hp = self.hp.value * 10**3
305
+ if "type F" in self.protection[orientation]:
306
+ if self.double_couches:
307
+ hp = self.hp.value * 10**3 / 2
308
+ k2 = 1 - 0.018 * hp # 3.7
309
+ elif self.protection[orientation] == "Fibre de roche":
310
+ if 45 > hp >= 20:
311
+ k2 = interpolation_lineaire(hp, 20, 45, 1, 0.6)
312
+ elif hp >= 45:
313
+ k2 = 0.6
314
+ return k2
315
+
316
+ def _get_ta(self, t_ch: int, t_f: int, beta_n: float, k_2: float):
317
+ """Retourne le temps de rupture de la protection en minutes (ta)
318
+ Args:
319
+ t_ch (int): Temps de démarrage de la carbonisation en minutes
320
+ t_f (int): Temps de rupture de la protection en minutes
321
+ beta_n (float): Coefficient de carbonisation fictif
322
+ k_2 (float): Coefficient d'accelération de la carbonisation'"""
323
+ if t_f:
324
+ if t_ch < t_f:
325
+
326
+ @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
327
+ def val():
328
+ t_a = (25 - (t_f - t_ch) * k_2 * beta_n) / (2 * beta_n) + t_f # en min/equa3.9
329
+ return t_a
330
+
331
+ else:
332
+ @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
333
+ def val():
334
+ t_a = min(2 * t_f, 12.5 / beta_n + t_f) # en min/equa3.8
335
+ return t_a
336
+
337
+ return val()
338
+ else:
339
+ return ("", 0)
340
+
341
+ def _get_section_reduction(self):
342
+ self._base_b_calcul = self.b_calcul
343
+ self._base_h_calcul = self.h_calcul
344
+ self._def = {}
345
+ # Index des lignes
346
+ index = ["0", "tch", "tf", "ta", "t_expo", "d_ef"]
347
+ # Colonnes multi-index : (orientation, type de valeur)
348
+ cols = pd.MultiIndex.from_product(
349
+ [("Haut", "Bas", "Gauche", "Droite"), ("Temps(min)", "d_char_n(mm)")],
350
+ names=["Orientation", "Type"],
351
+ )
352
+ # DataFrame vide
353
+ self.d_ef = pd.DataFrame(index=index, columns=cols)
354
+
355
+ for orientation, protection in self.protection.items():
356
+ if protection != "Pas d'exposition":
357
+ d_char_n = 0
358
+ d_char_n_values = {"0": 0, "tch": 0, "tf": 0, "ta": 0, "t_expo": 0}
359
+
360
+ beta_0, beta_n = self._get_bar_beta0_and_betan()
361
+ beta_0_protect, beta_n_protect = self._get_wood_protect_beta0_and_betan(
362
+ orientation
363
+ )
364
+ latex_tch_tf, res_tch_tf = self._get_tch_and_tf(
365
+ orientation, beta_0_protect
366
+ )
367
+ tch = res_tch_tf[0]
368
+ tf = res_tch_tf[1]
369
+ k2 = self._get_k2(orientation)
370
+ latex_ta, ta = self._get_ta(tch, tf, beta_n, k2)
371
+
372
+ # Insertion des temps
373
+ self.d_ef.loc["0", (orientation, "Temps(min)")] = 0
374
+ self.d_ef.loc["tch", (orientation, "Temps(min)")] = tch
375
+ self.d_ef.loc["tf", (orientation, "Temps(min)")] = tf
376
+ self.d_ef.loc["ta", (orientation, "Temps(min)")] = ta
377
+ self.d_ef.loc["t_expo", (orientation, "Temps(min)")] = self.t_expo
378
+
379
+ # Calcul de d_char_n sur chaque phase
380
+ if self.t_expo > tf:
381
+ if tch < tf:
382
+ d1 = self._d_char_n(tf - tch, beta_n * k2)
383
+ d_char_n = d_char_n + d1
384
+ d_char_n_values["tf"] = d_char_n
385
+
386
+ k3 = 2
387
+ if ta < self.t_expo:
388
+ d2 = self._d_char_n(ta - tf, beta_n * k3)
389
+ d_char_n = d_char_n + d2
390
+ d_char_n_values["ta"] = d_char_n
391
+
392
+ d3 = self._d_char_n(self.t_expo - ta, beta_n)
393
+ d_char_n = d_char_n + d3
394
+ d_char_n_values["t_expo"] = d_char_n
395
+ else:
396
+ d2 = self._d_char_n(ta - tf, beta_n * k3)
397
+ d_charn_sup_texpo = d_char_n + d2
398
+ d_char_n_values["ta"] = d_charn_sup_texpo
399
+
400
+ d3 = self._d_char_n(self.t_expo - tf, beta_n * k3)
401
+ d_char_n = d_char_n + d3
402
+ d_char_n_values["t_expo"] = d_char_n
403
+
404
+ # Stockage dans le DataFrame des d_char_n
405
+ for key, dcharn in d_char_n_values.items():
406
+ self.d_ef.loc[key, (orientation, "d_char_n(mm)")] = dcharn
407
+
408
+ # Calcul de d_ef final
409
+ d_ef = self._d_ef(d_char_n, self.t_expo)
410
+ self.d_ef.loc["d_ef", (orientation, "Temps(min)")] = self.t_expo
411
+ self.d_ef.loc["d_ef", (orientation, "d_char_n(mm)")] = d_ef[1]
412
+ self._def[orientation] = (latex_tch_tf + latex_ta + d_ef[0], d_ef[1])
413
+ else:
414
+ self._def[orientation] = ("\\[\text{Pas d'exposition}\\]", 0 * si.mm)
415
+
416
+ self.b_calcul = self.b_calcul - self._def["Gauche"][1] - self._def["Droite"][1] # Réduction de la section
417
+ self.h_calcul = self.h_calcul - self._def["Haut"][1] - self._def["Bas"][1] # Réduction de la section
418
+
419
+ def get_def(self, orientation: str = ORIENTATION):
420
+ """Retourne la profondeur de carbonisation effective en mm suivant l'orientation donnée"""
421
+ return self._def[orientation]
422
+
423
+ def _f_type_d(self, typeCarac=Barre.CARACTERISTIQUE[0:6]):
424
+ """Méthode donnant la résistance de calcul de l'élément fonction de la vérification
425
+
426
+ Args:
427
+ typeCarac (str, optional): type de résistance caractéristique (flexion = "fm0k", compression = "fc0k" etc.). Defaults to "fm0k".
428
+ loadtype (str, optional): Durée de chargement (Permanente, Court terme etc.). Defaults to "Permanente".
429
+ typecombi (str, optional): type de combinaison étudiée ("Fondamentales" ou " Accidentelles"). Defaults to "Fondamentales".
430
+
431
+ Returns:
432
+ float: Résistance de calcul en N/mm2 du type de vérification étudié.
433
+ """
434
+ gamma_M_fi = self._get_gamma_M("Accidentelles")
435
+ K_mod_fi = self.KMOD_FI # en situation à chaud
436
+ K_fi = self.K_fi
437
+ f_type_k = float(self.caract_meca.loc[typeCarac]) * si.MPa
438
+
439
+ if typeCarac == "fm0k" and self.k_sys > 1:
440
+ k_sys = self.k_sys
441
+
442
+ @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
443
+ def val():
444
+ f_type_Rd = k_sys * f_type_k * K_fi * K_mod_fi / gamma_M_fi
445
+ return f_type_Rd
446
+
447
+ else:
448
+
449
+ @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
450
+ def val():
451
+ f_type_Rd = f_type_k * K_fi * K_mod_fi / gamma_M_fi
452
+ return f_type_Rd
453
+
454
+ value = val()
455
+ latex = self.__convert_latex_ftyped(value[0], typeCarac)
456
+ self.f_type_rd = value[1]
457
+ return (latex, value[1])
458
+
459
+ def _K_h(self):
460
+ """Retourne le coef. Kh qui peut augmenter la resistance caractéristique fm,k et ft,k"""
461
+ kh = {}
462
+ dim = {"y": self._base_h_calcul.value * 10**3, "z": self._base_b_calcul.value * 10**3}
463
+
464
+ for cle, valeur in dim.items():
465
+ if self.type_bois == "Massif":
466
+ if valeur < 150:
467
+ kh[cle] = min((150 / valeur) ** 0.2, 1.3)
468
+ else:
469
+ kh[cle] = 1
470
+ elif self.type_bois == "BLC":
471
+ if valeur < 600:
472
+ kh[cle] = min((600 / valeur) ** 0.1, 1.1)
473
+ else:
474
+ kh[cle] = 1
475
+ else:
476
+ print("LVL non pris en compte dans cette fonction")
477
+ kh[cle] = 1
478
+ return kh
479
+
480
+ def Emean_fin(self, psy_2: float):
481
+ """Renvoie le E,mean,fin en fonction du Kdef et du psy2"""
482
+ self.psy_2 = psy_2
483
+ E0_mean = int(self.caract_meca.loc["E0mean"]) * si.MPa
484
+ K_fi = self.K_fi
485
+ K_def = self.K_def
486
+
487
+ @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
488
+ def val():
489
+ E_mean_fin_fi = E0_mean * K_fi / (1 + psy_2 * K_def)
490
+ return E_mean_fin_fi
491
+
492
+ value = val()
493
+ self.E_mean_fin = value[1]
494
+ return value
495
+
496
+
497
+ # ================================ FLEXION ==================================
498
+
499
+
500
+ class Flexion_feu(Feu, Flexion):
501
+ def __init__(
502
+ self,
503
+ lo: si.mm,
504
+ coeflef: float = Flexion.COEF_LEF["Appuis simple"][1],
505
+ pos: str = Flexion.LOAD_POS,
506
+ **kwargs,
507
+ ):
508
+ """Classe permettant le calcul de la flexion d'une poutre bois selon l'EN 1995 §6.1.6, §6.2.3, §6.2.4 et §6.3.3.
509
+ Cette classe est hérité de la classe Barre, provenant du module EC5_Element_droit.py.
510
+
511
+ Args:
512
+ lo (int): longueur de déversemment en mm
513
+ coeflef (float): appuis simple :
514
+ Moment constant : 1
515
+ Charge répartie constante : 0.9
516
+ Charge concentrée au milieu de la portée : 0.8
517
+ porte à faux :
518
+ Charge répartie constante : 0.5
519
+ Charge concentrée agissant à l'extrémité libre : 0.8.
520
+
521
+ pos (str): positionnement de la charge sur la hauteur de poutre
522
+ """
523
+ super().__init__(lo=lo, coeflef=coeflef, pos=pos, **kwargs)
524
+
525
+ @property
526
+ def sigma_m_crit(self):
527
+ """Retourne sigma m,crit pour la prise en compte du déversement d'une poutre"""
528
+ self.l_ef = self.lo * self.coeflef
529
+ if self.pos == "Charge sur fibre comprimée":
530
+ self.l_ef = self.l_ef + 2 * self.h_calcul
531
+ elif self.pos == "Charge sur fibre tendue":
532
+ self.l_ef = self.l_ef - 0.5 * self.h_calcul
533
+
534
+ b_calcul = self.b_calcul
535
+ h_calcul = self.h_calcul
536
+ l_ef = self.l_ef
537
+ E_0_05 = int(self.caract_meca.loc["E005"]) * si.MPa
538
+ K_fi = self.K_fi
539
+
540
+ @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
541
+ def val():
542
+ sigma_m_crit_fi = (0.78 * b_calcul**2 * E_0_05 * K_fi) / (h_calcul * l_ef)
543
+ return sigma_m_crit_fi
544
+
545
+ return val()
546
+
547
+ @property
548
+ def lamb_rel_m(self):
549
+ """Retourne l'élancement relatif de la section avec pour argument"""
550
+ f_m0k = float(self.caract_meca.loc["fm0k"]) * si.MPa
551
+ K_fi = self.K_fi
552
+ sigma_m_crit = self.sigma_m_crit[1]
553
+
554
+ @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
555
+ def val():
556
+ lamb_rel_m_fi = sqrt(f_m0k * K_fi / sigma_m_crit)
557
+ return lamb_rel_m_fi
558
+
559
+ return val()
560
+
561
+ @property
562
+ def K_crit(self):
563
+ """Retourne K,crit le coef. de minoration de la résistance en flexion au déversement"""
564
+ lamb_rel_m_fi = self.lamb_rel_m[1]
565
+
566
+ if lamb_rel_m_fi <= 0.75:
567
+
568
+ @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
569
+ def val():
570
+ K_crit_fi = 1
571
+ return K_crit_fi
572
+
573
+ elif 0.75 < lamb_rel_m_fi <= 1.4:
574
+
575
+ @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
576
+ def val():
577
+ K_crit_fi = 1.56 - 0.75 * lamb_rel_m_fi
578
+ return K_crit_fi
579
+
580
+ else:
581
+
582
+ @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
583
+ def val():
584
+ K_crit_fi = 1 / (lamb_rel_m_fi**2)
585
+ return K_crit_fi
586
+
587
+ return val()
588
+
589
+ def f_m_d(self):
590
+ """Retourne la résistance f,m,d au feu de l'élément en MPa
591
+ """
592
+ return super()._f_type_d("fm0k")
593
+
594
+ def taux_m_d(self, compression: object = None, traction: object = None):
595
+ """Retourne les différents taux de travaux en flexion.
596
+ Si l'élement est une poutre (donc avec un travail principalement en flexion) et de la compression (EN 1995-1-1 §6.3.3) ou de la traction (EN 1995-1-1 §6.2.3) combinée,
597
+ il est possible d'ajouter l'objet Compression et Traction et de vérifier ces combinaisons.
598
+
599
+ Args:
600
+ compression (object, optional): L'objet Compression avec ces taux de travaux préalablement calculés. Defaults to None.
601
+ traction (object, optional): L'objet Traction avec ces taux de travaux préalablement calculés. Defaults to None.
602
+
603
+ Returns:
604
+ list: retourne la liste des taux de travaux en %"""
605
+ self.taux_m_rd = {}
606
+
607
+ sigma_my_d_fi = self.sigma_m_rd["y"]
608
+ sigma_mz_d_fi = self.sigma_m_rd["z"]
609
+ f_m_d_fi = self.f_type_rd
610
+ K_h_y = self.K_h["y"]
611
+ K_h_z = self.K_h["z"]
612
+ K_m = self.K_m
613
+ K_crit_fi = self.K_crit[1]
614
+
615
+ @handcalc(override="short", precision=3, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
616
+ def base():
617
+ taux_6_11 = sigma_my_d_fi / (f_m_d_fi * K_h_y) + K_m * sigma_mz_d_fi / (f_m_d_fi * K_h_z) # equ6.11
618
+ taux_6_12 = K_m * sigma_my_d_fi / (f_m_d_fi * K_h_y) + sigma_mz_d_fi / (f_m_d_fi * K_h_z) # equ6.12
619
+ taux_6_33y = sigma_my_d_fi / (f_m_d_fi * K_h_y * K_crit_fi) # equ6.33
620
+ taux_6_33z = sigma_mz_d_fi / (f_m_d_fi * K_h_z * K_crit_fi) # equ6.33
621
+ return taux_6_11, taux_6_12, taux_6_33y, taux_6_33z
622
+
623
+ base_val = base()
624
+ latex = base_val[0]
625
+ self.taux_m_rd["equ6.11"] = base_val[1][0]
626
+ self.taux_m_rd["equ6.12"] = base_val[1][1]
627
+ self.taux_m_rd["equ6.33y"] = base_val[1][2]
628
+ self.taux_m_rd["equ6.33z"] = base_val[1][3]
629
+
630
+ if compression and isinstance(compression, Compression):
631
+ sigma_c_0_d = compression.sigma_c_0_rd
632
+ f_c_0_d = compression.f_type_rd
633
+ K_c_y = compression.kc_Axe[1]["y"]
634
+ K_c_z = compression.kc_Axe[1]["z"]
635
+ taux_6_2 = compression.taux_c_0_rd["equ6.2"]
636
+
637
+ # taux_6_23 = compression.taux_c_0_rd['equ6.23']
638
+ # taux_6_24 = compression.taux_c_0_rd['equ6.24']
639
+ @handcalc(override="short", precision=3, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
640
+ def comp(taux_6_11, taux_6_12, taux_6_2, taux_6_33y, taux_6_33z):
641
+ taux_6_19 = taux_6_2**2 + taux_6_11 # equ6.19
642
+ taux_6_20 = taux_6_2**2 + taux_6_12 # equ6.20
643
+ taux_6_23 = sigma_c_0_d / (f_c_0_d * K_c_y) # equ6.23
644
+ taux_6_24 = sigma_c_0_d / (f_c_0_d * K_c_z) # equ6.24
645
+ taux_6_35zyz = (taux_6_33y**2 + (sigma_mz_d_fi / (f_m_d_fi * K_h_z)) + taux_6_24) # equ6.35
646
+ taux_6_35yzz = (taux_6_33y + (sigma_mz_d_fi / (f_m_d_fi * K_h_z)) ** 2 + taux_6_24) # equ6.35 interprétation
647
+ taux_6_35yzy = (taux_6_33z**2 + (sigma_my_d_fi / (f_m_d_fi * K_h_y)) + taux_6_23) # equ6.35
648
+ taux_6_35zyy = (taux_6_33z + (sigma_my_d_fi / (f_m_d_fi * K_h_y)) ** 2 + taux_6_23) # equ6.35 interprétation
649
+ return (
650
+ taux_6_19,
651
+ taux_6_20,
652
+ taux_6_35zyz,
653
+ taux_6_35yzz,
654
+ taux_6_35yzy,
655
+ taux_6_35zyy,
656
+ )
657
+
658
+ compression_val = comp(
659
+ self.taux_m_rd["equ6.11"],
660
+ self.taux_m_rd["equ6.12"],
661
+ taux_6_2,
662
+ self.taux_m_rd["equ6.33y"],
663
+ self.taux_m_rd["equ6.33z"],
664
+ )
665
+ latex = latex + compression_val[0]
666
+ self.taux_m_rd["equ6.19"] = compression_val[1][0]
667
+ self.taux_m_rd["equ6.20"] = compression_val[1][1]
668
+ self.taux_m_rd["equ6.35zyz"] = compression_val[1][2] # 1er item axe de flexion pas au carré, 2eme item axe de flexion au carré, 3eme axe de compression
669
+ self.taux_m_rd["equ6.35yzz"] = compression_val[1][3]
670
+ self.taux_m_rd["equ6.35yzy"] = compression_val[1][4]
671
+ self.taux_m_rd["equ6.35zyy"] = compression_val[1][5]
672
+
673
+ if traction and isinstance(traction, Traction):
674
+ taux_6_1 = traction.taux_t_0_rd["equ6.1"]
675
+
676
+ @handcalc(override="short", precision=3, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
677
+ def tract(taux_6_11, taux_6_12):
678
+ taux_6_17 = taux_6_11 + taux_6_1 # equ6.17
679
+ taux_6_18 = taux_6_12 + taux_6_1 # equ6.18
680
+ return taux_6_17, taux_6_18
681
+
682
+ traction_val = tract(self.taux_m_rd["equ6.11"], self.taux_m_rd["equ6.12"])
683
+ latex = latex + traction_val[0]
684
+ self.taux_m_rd["equ6.11"] = traction_val[1][0]
685
+ self.taux_m_rd["equ6.12"] = traction_val[1][1]
686
+
687
+ return (latex, self.taux_m_rd)
688
+
689
+
690
+ # ================================ Traction ==================================
691
+
692
+
693
+ class Traction_feu(Feu, Traction):
694
+ def __init__(self, **kwargs):
695
+ """Classe permettant le calcul de la Traction d'un élément bois selon l'EN 1995.
696
+ Cette classe est hérité de la classe Barre, provenant du module EC5_Element_droit.py.
697
+ """
698
+ super().__init__(**kwargs)
699
+
700
+ def f_t_0_d(self):
701
+ """Retourne la résistance f,t,0,d au feu de l'élément en MPa
702
+ """
703
+ return super()._f_type_d("ft0k")
704
+
705
+ def taux_t_0_d(self):
706
+ """Retourne le taux de travail en traction axial.
707
+
708
+ Returns:
709
+ float: taux de travail en %
710
+ """
711
+ self.taux_t_0_rd = {}
712
+ K_h_y = self.K_h["y"]
713
+ K_h_z = self.K_h["z"]
714
+ sigma_t_0_d_fi = self.sigma_t_0_rd
715
+ f_t_0_d_fi = self.f_type_rd
716
+
717
+ @handcalc(override="short", precision=3, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
718
+ def val():
719
+ K_h = min(K_h_y, K_h_z)
720
+ taux_6_1 = sigma_t_0_d_fi / (K_h * f_t_0_d_fi) # equ6.1
721
+ return taux_6_1
722
+
723
+ value = val()
724
+
725
+ self.taux_t_0_rd["equ6.1"] = value[1]
726
+ return value
727
+
728
+
729
+ # ================================ Compression ==================================
730
+
731
+
732
+ class Compression_feu(Feu, Compression):
733
+ def __init__(self, lo_y: si.mm, lo_z: si.mm, type_appuis: str = Compression.COEF_LF, **kwargs):
734
+ """Classe permettant le calcul de la Compression d'un élément bois selon l'EN 1995.
735
+ Cette classe est hérité de la classe Barre, provenant du module EC5_Element_droit.py.
736
+
737
+ Args:
738
+ lo : Longueur de flambement suivant l'axe de rotation (y ou z) en mm si pas de flambement alors 0
739
+ type_appuis : Coefficient multiplicateur de la longueur pour obtenir la longeur efficace de flambement en
740
+ fonction des du type d'appuis :
741
+ Encastré 1 côté : 2
742
+ Rotule - Rotule : 1
743
+ Encastré - Rotule : 0.7
744
+ Encastré - Encastré : 0.5
745
+ Encastré - Rouleau : 1
746
+ """
747
+ super().__init__(lo_y=lo_y, lo_z=lo_z, type_appuis=type_appuis, **kwargs)
748
+
749
+ @property
750
+ def lamb_rel_Axe(self):
751
+ """Retourne l'élancement relatif d'un poteau en compression avec risque de flambement suivant son axe de rotation"""
752
+ lamb_y = self.lamb[1]["y"]
753
+ lamb_z = self.lamb[1]["z"]
754
+ f_c0k = float(self.caract_meca.loc["fc0k"]) * si.MPa
755
+ E_0_05 = int(self.caract_meca.loc["E005"]) * si.MPa
756
+ K_fi = self.K_fi
757
+
758
+ @handcalc(override="short", precision=3, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
759
+ def val():
760
+ lamb_rel_y_fi = (lamb_y / pi) * sqrt(f_c0k * K_fi / (E_0_05 * K_fi))
761
+ lamb_rel_z_fi = (lamb_z / pi) * sqrt(f_c0k * K_fi / (E_0_05 * K_fi))
762
+ return {"y": lamb_rel_y_fi, "z": lamb_rel_z_fi}
763
+
764
+ return val()
765
+
766
+ @property
767
+ def k_Axe(self):
768
+ """Retourne le facteur Ky ou Kz (fonction de l'axe de flambement)"""
769
+ beta_C = self.beta_C
770
+ lamb_rel_y_fi = self.lamb_rel_Axe[1]["y"]
771
+ lamb_rel_z_fi = self.lamb_rel_Axe[1]["z"]
772
+
773
+ @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
774
+ def val():
775
+ k_y_fi = 0.5 * (1 + beta_C * (lamb_rel_y_fi - 0.3) + lamb_rel_y_fi**2)
776
+ k_z_fi = 0.5 * (1 + beta_C * (lamb_rel_z_fi - 0.3) + lamb_rel_z_fi**2)
777
+ return {"y": k_y_fi, "z": k_z_fi}
778
+
779
+ return val()
780
+
781
+ @property
782
+ def kc_Axe(self):
783
+ """Retourne le coefficient multiplicateur KcAxe (axe = y ou z suivant axe de rotation en flambement) de fc,0,d"""
784
+ k_y_fi = self.k_Axe[1]["y"]
785
+ k_z_fi = self.k_Axe[1]["z"]
786
+ lamb_rel_y_fi = self.lamb_rel_Axe[1]["y"]
787
+ lamb_rel_z_fi = self.lamb_rel_Axe[1]["z"]
788
+
789
+ @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
790
+ def val():
791
+ k_c_y = 1 / (k_y_fi + sqrt(k_y_fi**2 - lamb_rel_y_fi**2))
792
+ k_c_z = 1 / (k_z_fi + sqrt(k_z_fi**2 - lamb_rel_z_fi**2))
793
+ return {"y": min(k_c_y, 1), "z": min(k_c_z, 1)}
794
+
795
+ return val()
796
+
797
+ def f_c_0_d(self):
798
+ """Retourne la résistance f,c,0,d au feu de l'élément en MPa
799
+ """
800
+ return super()._f_type_d("fc0k")
801
+
802
+ def taux_c_0_d(self, flexion: object = None):
803
+ """Retourne les taux de travaux de la compression axial.
804
+ Si l'élement est un poteau (donc avec un travail principalement en compression) et de la flexion combinée (EN 1995-1-1 §6.3.2),
805
+ il est possible d'ajouter l'objet flexion et de vérifier cette combinaison.
806
+
807
+ Args:
808
+ flexion (object, optional): L'objet Flexion avec ces taux de travaux préalablement calculés. Default to None.
809
+
810
+ Returns:
811
+ list: retourne la liste des taux de travaux en %
812
+ """
813
+ self.taux_c_0_rd = {}
814
+ sigma_c_0_d_fi = self.sigma_c_0_rd
815
+ f_c_0_d_fi = self.f_type_rd
816
+ lamb_rel_y = self.lamb_rel_Axe[1]["y"]
817
+ lamb_rel_z = self.lamb_rel_Axe[1]["z"]
818
+ K_c_y_fi = self.kc_Axe[1]["y"]
819
+ K_c_z_fi = self.kc_Axe[1]["z"]
820
+
821
+ if flexion and isinstance(flexion, Flexion):
822
+ taux_6_11 = flexion.taux_m_rd["equ6.11"]
823
+ taux_6_12 = flexion.taux_m_rd["equ6.12"]
824
+ else:
825
+ taux_6_11 = 0
826
+ taux_6_12 = 0
827
+
828
+ if lamb_rel_y < 0.3 and lamb_rel_z < 0.3:
829
+
830
+ @handcalc(override="short", precision=3, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
831
+ def val():
832
+ taux_6_2 = sigma_c_0_d_fi / f_c_0_d_fi # equ6.2
833
+ taux_6_19 = (sigma_c_0_d_fi / (f_c_0_d_fi * K_c_y_fi)) ** 2 + taux_6_11 # equ6.19
834
+ taux_6_20 = (sigma_c_0_d_fi / (f_c_0_d_fi * K_c_z_fi)) ** 2 + taux_6_12 # equ6.20
835
+ return taux_6_2, taux_6_19, taux_6_20
836
+
837
+ value = val()
838
+ self.taux_c_0_rd["equ6.19"] = value[1][1]
839
+ self.taux_c_0_rd["equ6.20"] = value[1][2]
840
+ else:
841
+
842
+ @handcalc(override="short", precision=3, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
843
+ def val():
844
+ taux_6_2 = sigma_c_0_d_fi / f_c_0_d_fi # equ6.2
845
+ taux_6_23 = (sigma_c_0_d_fi / (f_c_0_d_fi * K_c_y_fi) + taux_6_11) # equ6.23
846
+ taux_6_24 = (sigma_c_0_d_fi / (f_c_0_d_fi * K_c_z_fi) + taux_6_12) # equ6.24
847
+ return taux_6_2, taux_6_23, taux_6_24
848
+
849
+ value = val()
850
+ self.taux_c_0_rd["equ6.23"] = value[1][1]
851
+ self.taux_c_0_rd["equ6.24"] = value[1][2]
852
+
853
+ self.taux_c_0_rd["equ6.2"] = value[1][0]
854
+ return value
855
+
856
+
857
+ # ================================ CISAILLEMENT ==================================
858
+
859
+ class Cisaillement_feu(Cisaillement, Feu):
860
+ def __init__(self, **kwargs):
861
+ """Classe qui permet de calculer le cisaillement d'une poutre comme décrit à l'EN 1995 §6.1.7 et §6.5.
862
+ Cette classe est hérité de la classe Barre, provenant du module EC5_Element_droit.py.
863
+ """
864
+ super().__init__(**kwargs)
865
+
866
+ def Kv(self, hef: si.mm, x: si.mm, i_lo: si.mm, ent=("Dessous", "Dessus")):
867
+ """Retourne le facteur d'entaille Kv pour une entaille au niveau d'un appuis
868
+
869
+ Args:
870
+ hef (int): Hauteur efficace à froid de la poutre (hauteur - hauteur de l'entaille) en mm
871
+ x (int):Distance entre le centre de réaction à l'appuis et le coin de l'entaille en mm
872
+ i_lo (float): longueur horizontal de l'entaille en mm
873
+ ent (tuple, optional): Entaille sur le dessus ou dessous de la poutre.
874
+
875
+ Returns:
876
+ float: facteur Kv
877
+ """
878
+ h_ef = hef*si.mm - self._def["Bas"][1] - self._def["Haut"][1] # Réduction de la section
879
+ return super().Kv(h_ef.value*10**3, x, i_lo, ent)
880
+
881
+ def f_v_d(self):
882
+ """Retourne la résistance f,v,d au feu de l'élément en MPa
883
+ """
884
+ return super()._f_type_d("fvk")
885
+
886
+ def taux_tau_d(self):
887
+ """Retourne le taux de travail en cisaillement en %"""
888
+ self.taux_tau_rd = {}
889
+ tau_d_fi = self.tau_rd
890
+ f_v_d_fi = self.f_type_rd
891
+ K_v = self.K_v
892
+
893
+ @handcalc(override="short", precision=3, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
894
+ def val():
895
+ taux_6_13 = tau_d_fi / f_v_d_fi
896
+ taux_6_60 = tau_d_fi / (K_v * f_v_d_fi)
897
+ return taux_6_13, taux_6_60
898
+
899
+ value = val()
900
+ self.taux_tau_rd["equ6.13"] = value[1][0]
901
+ self.taux_tau_rd["equ6.60"] = value[1][1]
902
+ return value
903
+
904
+
905
+ # if __name__ == "__main__":
906
+ # beam = Barre(b=100, h=200, section="Rectangulaire", classe="C24", cs=1)
907
+ # feu = Feu._from_parent_class(
908
+ # beam,
909
+ # t_expo= 30,
910
+ # haut="Aucune protection",
911
+ # bas="Aucune protection",
912
+ # gauche="1 plaque de platre type A joints comblés",
913
+ # droite="Pas d'exposition",
914
+ # double_couches=False,
915
+ # hp= 12,
916
+ # )
917
+ # print(feu.d_ef)
918
+ # print("Feu", feu.b_calcul, feu.h_calcul)
919
+ # cisai = Cisaillement_feu._from_parent_class(feu)
920
+ # print(cisai.Kv(140, 50, 0))
921
+ # print(cisai.tau_d(5))
922
+ # print("Cisailllemnt", cisai.b_calcul, cisai.h_calcul)