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,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)