ourocode 1.7.1__tar.gz → 1.7.3__tar.gz

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.
Files changed (73) hide show
  1. {ourocode-1.7.1/ourocode.egg-info → ourocode-1.7.3}/PKG-INFO +1 -1
  2. ourocode-1.7.3/ourocode/__version__.py +1 -0
  3. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/eurocode/EC1_Vent.py +91 -42
  4. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/eurocode/EC5_Assemblage.py +38 -37
  5. ourocode-1.7.3/ourocode/eurocode/EC5_CVT.py +819 -0
  6. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/eurocode/EC5_Element_droit.py +14 -4
  7. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/eurocode/EC8_Sismique.py +73 -25
  8. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/eurocode/objet.py +86 -12
  9. {ourocode-1.7.1 → ourocode-1.7.3/ourocode.egg-info}/PKG-INFO +1 -1
  10. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode.egg-info/SOURCES.txt +1 -0
  11. {ourocode-1.7.1 → ourocode-1.7.3}/pyproject.toml +1 -1
  12. {ourocode-1.7.1 → ourocode-1.7.3}/tests/test_EC5_Assemblage.py +2 -2
  13. ourocode-1.7.3/tests/test_EC5_CVT.py +524 -0
  14. {ourocode-1.7.1 → ourocode-1.7.3}/tests/test_EC5_Element_droit.py +3 -0
  15. ourocode-1.7.1/ourocode/__version__.py +0 -1
  16. ourocode-1.7.1/tests/test_EC5_CVT.py +0 -309
  17. {ourocode-1.7.1 → ourocode-1.7.3}/LICENSE +0 -0
  18. {ourocode-1.7.1 → ourocode-1.7.3}/MANIFEST.in +0 -0
  19. {ourocode-1.7.1 → ourocode-1.7.3}/README.md +0 -0
  20. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/__init__.py +0 -0
  21. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/caracteristique_meca_acier.csv +0 -0
  22. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/caracteristique_meca_bois.csv +0 -0
  23. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/caracteristique_meca_panel.csv +0 -0
  24. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/carte_action_region.csv +0 -0
  25. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/coeff_psy.csv +0 -0
  26. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/exploitation.csv +0 -0
  27. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/gammaM.csv +0 -0
  28. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/kdef.csv +0 -0
  29. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/kfi.csv +0 -0
  30. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/kmod.csv +0 -0
  31. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/limite_fleche.csv +0 -0
  32. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/qualite_acier.csv +0 -0
  33. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/screenshot/C90_def.png +0 -0
  34. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/screenshot/Kv_def.png +0 -0
  35. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/screenshot/sign_convention.png +0 -0
  36. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/section_boulon.csv +0 -0
  37. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/sismique/categorie_importance.csv +0 -0
  38. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/sismique/categorie_importance_ns.csv +0 -0
  39. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/sismique/classe_sol.csv +0 -0
  40. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/sismique/spectre_eleastique_h_type1.csv +0 -0
  41. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/sismique/spectre_eleastique_h_type2.csv +0 -0
  42. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/vent/vent_Cp_toiture_isolee_1_versant.csv +0 -0
  43. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/vent/vent_Cp_toiture_isolee_1_versant.png +0 -0
  44. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/vent/vent_Cp_toiture_isolee_2_versants.csv +0 -0
  45. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/vent/vent_Cp_toiture_isolee_2_versants.png +0 -0
  46. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/vent/vent_Cpe_mur_verticaux.csv +0 -0
  47. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/vent/vent_Cpe_mur_verticaux.png +0 -0
  48. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/vent/vent_Cpe_toiture_1_versant.png +0 -0
  49. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/vent/vent_Cpe_toiture_1_versant_0_degres.csv +0 -0
  50. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/vent/vent_Cpe_toiture_1_versant_180_degres.csv +0 -0
  51. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/vent/vent_Cpe_toiture_1_versant_90_degres.csv +0 -0
  52. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/vent/vent_Cpe_toiture_2_versants.png +0 -0
  53. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/vent/vent_Cpe_toiture_2_versants_0_degres.csv +0 -0
  54. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/vent/vent_Cpe_toiture_2_versants_90_degres.csv +0 -0
  55. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/vent/vent_Cpe_toiture_terrasse.csv +0 -0
  56. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/vent/vent_Cpe_toiture_terrasse.png +0 -0
  57. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/data/vent/vent_Ffr.png +0 -0
  58. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/eurocode/A0_Projet.py +0 -0
  59. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/eurocode/EC0_Combinaison.py +0 -0
  60. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/eurocode/EC1_Neige.py +0 -0
  61. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/eurocode/EC3_Assemblage.py +0 -0
  62. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/eurocode/EC3_Element_droit.py +0 -0
  63. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/eurocode/EC5_Feu.py +0 -0
  64. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode/eurocode/__init__.py +0 -0
  65. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode.egg-info/dependency_links.txt +0 -0
  66. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode.egg-info/requires.txt +0 -0
  67. {ourocode-1.7.1 → ourocode-1.7.3}/ourocode.egg-info/top_level.txt +0 -0
  68. {ourocode-1.7.1 → ourocode-1.7.3}/setup.cfg +0 -0
  69. {ourocode-1.7.1 → ourocode-1.7.3}/tests/test_A0_Projet.py +0 -0
  70. {ourocode-1.7.1 → ourocode-1.7.3}/tests/test_EC0_Combinaison.py +0 -0
  71. {ourocode-1.7.1 → ourocode-1.7.3}/tests/test_EC1_Neige.py +0 -0
  72. {ourocode-1.7.1 → ourocode-1.7.3}/tests/test_EC5_Feu.py +0 -0
  73. {ourocode-1.7.1 → ourocode-1.7.3}/tests/test_EC8_Sismique.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ourocode
3
- Version: 1.7.1
3
+ Version: 1.7.3
4
4
  Summary: Ceci est un catalogue de fonction permettant une utilisation rapide pour la réalisation de note de calcul personnalisée.
5
5
  Author-email: Anthony PARISOT <contact@ourea-structure.fr>
6
6
  License-Expression: Apache-2.0
@@ -0,0 +1 @@
1
+ __version__ = "1.7.3"
@@ -11,6 +11,8 @@ from copy import copy
11
11
  import pandas as pd
12
12
  import forallpeople as si
13
13
  from handcalcs.decorator import handcalc
14
+ from PySide6.QtWidgets import QApplication, QInputDialog
15
+ from PySide6.QtCore import Qt
14
16
 
15
17
  # sys.path.append(os.path.join(os.getcwd(), "ourocode"))
16
18
  # from eurocode.A0_Projet import Batiment
@@ -71,20 +73,87 @@ class Vent(Batiment):
71
73
  alt (int): altitude du batiment étudié en m.
72
74
  cat_terrain (str): Catégorie de terrain du projet.
73
75
  cat_oro (str): Catégorie orographique. Default to "Aucun".
76
+ cas 1 : orographie constituée d'obstacles de hauteurs et de formes variées. Ce type d'orographie est le plus
77
+ fréquemment rencontré.
78
+ cas 2 : Non traité dans ce logiciel ! Orographie constituée d'obstacles bien individualisés. Une falaise ou une colline isolée appartiennent à
79
+ cette catégorie d'orographie, plus rarement rencontrée.
74
80
  """
75
81
  super().__init__(**kwargs)
76
82
  self.terrain = terrain
77
83
  self.oro = oro
84
+ if oro == "Cas 1":
85
+ self._calc_delta_AC()
86
+ elif oro == "Cas 2":
87
+ raise ValueError("Cas 2 non traité dans ce logiciel !")
78
88
  self.z = z * si.m
79
89
  self.CsCd = CsCd
80
90
 
81
91
  @property
82
92
  def cat_terrain(self):
83
- return __class__.CAT_TERRAIN[self.terrain]
93
+ return self.CAT_TERRAIN[self.terrain]
84
94
 
85
95
  @property
86
96
  def cat_oro(self):
87
- return __class__.CAT_ORO[self.oro]
97
+ return self.CAT_ORO[self.oro]
98
+
99
+ def _calc_delta_AC(self):
100
+ """
101
+ Calcule le delta AC en fonction des altitudes des obstacles environnants.
102
+ """
103
+ if not hasattr(self, "dict_alti_oro"):
104
+ self.dict_alti_oro = {
105
+ "An1": "",
106
+ "An2": "",
107
+ "Ae1": "",
108
+ "Ae2": "",
109
+ "As1": "",
110
+ "As2": "",
111
+ "Ao1": "",
112
+ "Ao2": "",
113
+ }
114
+ # Demande des altitudes via des boîtes de dialogue QInputDialog (PySide6), autonome si aucune QApplication n'existe
115
+ app = QApplication.instance()
116
+ owns_app = False
117
+ if app is None:
118
+ app = QApplication(sys.argv)
119
+ owns_app = True
120
+ try:
121
+ for cle, value in self.dict_alti_oro.items():
122
+ if cle.endswith("1"):
123
+ dist_msg = "à une distance de 500m"
124
+ else:
125
+ dist_msg = "à une distance de 1000m"
126
+ val, ok = QInputDialog.getInt(
127
+ None,
128
+ "Altitude orographique",
129
+ f"Altitude {cle} en m {dist_msg}:",
130
+ 0,
131
+ -300,
132
+ 3000,
133
+ 1,
134
+ flags=Qt.WindowSystemMenuHint | Qt.WindowTitleHint,
135
+ )
136
+ if not ok:
137
+ raise RuntimeError("Saisie des altitudes annulée par l'utilisateur.")
138
+ self.dict_alti_oro[cle] = int(val) * si.m
139
+ finally:
140
+ if owns_app:
141
+ app.quit()
142
+
143
+ Am = (
144
+ 2 * self.alt
145
+ + self.dict_alti_oro["An1"]
146
+ + self.dict_alti_oro["An2"]
147
+ + self.dict_alti_oro["Ae1"]
148
+ + self.dict_alti_oro["Ae2"]
149
+ + self.dict_alti_oro["As1"]
150
+ + self.dict_alti_oro["As2"]
151
+ + self.dict_alti_oro["Ao1"]
152
+ + self.dict_alti_oro["Ao2"]
153
+ ) / 10
154
+
155
+ self.delta_AC = self.alt - Am
156
+ return self.delta_AC
88
157
 
89
158
  @property
90
159
  def zone_vent(self):
@@ -178,45 +247,28 @@ class Vent(Batiment):
178
247
 
179
248
  match self.cat_oro:
180
249
  case "1":
181
- dict_alti = {
182
- "An1": "",
183
- "An2": "",
184
- "Ae1": "",
185
- "Ae2": "",
186
- "As1": "",
187
- "As2": "",
188
- "Ao1": "",
189
- "Ao2": "",
190
- }
191
-
192
- for cle, value in dict_alti.items():
193
- dict_alti[cle] = int(input("Altitude {0} en m: ".format(cle)))
194
-
195
- Am = (
196
- 2 * self.alt
197
- + dict_alti["An1"]
198
- + dict_alti["An2"]
199
- + dict_alti["Ae1"]
200
- + dict_alti["Ae2"]
201
- + dict_alti["As1"]
202
- + dict_alti["As2"]
203
- + dict_alti["Ao1"]
204
- + dict_alti["Ao2"]
205
- ) / 10
206
-
207
- delta_AC = self.alt - Am
208
-
250
+ Delta_A_C = self.delta_AC.value
209
251
  if self.z.value >= 10:
210
- C0_z = 1 + 0.004 * delta_AC * mt.exp(z - 10)
252
+ @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
253
+ def val():
254
+ C0_z = 1 + 0.004 * Delta_A_C * mt.exp(z - 10)
255
+ res = max(C0_z, 1)
256
+ return res
211
257
  else:
212
- C0_z = 1 + 0.004 * delta_AC * mt.exp(0)
258
+ @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
259
+ def val():
260
+ C0_z = 1 + 0.004 * Delta_A_C * mt.exp(0)
261
+ res = max(C0_z, 1)
262
+ return res
213
263
 
214
264
  case "2":
215
- pass
265
+ raise ValueError("Erreur la catégorie orographique 2 n'est pas encore implémentée")
216
266
  case _:
217
- C0_z = 1
218
- # print("C0_z :", C0_z)
219
- return max(C0_z, 1)
267
+ @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
268
+ def val():
269
+ C0_z = 1
270
+ return C0_z
271
+ return val()
220
272
 
221
273
  @property
222
274
  # @handcalc(override="params", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
@@ -228,7 +280,7 @@ class Vent(Batiment):
228
280
  float: vitesse moyenne du vent en m/s
229
281
  """
230
282
  C_r_z = self._Cr_z
231
- C_o_z = self.Co_z
283
+ C_o_z = self.Co_z[1]
232
284
  V_b = self.Vb[1]
233
285
 
234
286
  @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
@@ -246,7 +298,7 @@ class Vent(Batiment):
246
298
  """
247
299
  match self.cat_oro:
248
300
  case "1":
249
- return self.Co_z * (
301
+ return self.Co_z[1] * (
250
302
  1 - 2 * 10**-4 * (mt.log10(self.cat_terrain["Z0"]) + 3) ** 6
251
303
  ) # 4.19NA
252
304
  case _:
@@ -276,10 +328,7 @@ class Vent(Batiment):
276
328
  ):
277
329
  return self._sigma_v / self.Vm_z[1] # 4.7
278
330
  else:
279
- print(
280
- """Erreur la hauteur max du bâtiment ne peut dépasser 200m,
281
- impossible de calculer l'intensité de turbulence Iv"""
282
- )
331
+ raise ValueError("Erreur la hauteur max du bâtiment ne peut dépasser 200m, impossible de calculer l'intensité de turbulence Iv")
283
332
 
284
333
  @property
285
334
  def Qb(self):
@@ -252,14 +252,14 @@ class Assemblage(Projet):
252
252
  beta = f_h2k / f_h1k
253
253
  a = f_h1k * t_1 * diam # N
254
254
  b = f_h2k * t_2 * diam # N
255
- c = a/(1 + beta) * (sqrt(beta + 2 * beta**2 * (1 + t_2 / t_1 + (t_2 / t_1)**2) + beta**3 * (t_2 / t_1)**2) - beta * (1 + t_2 / t_1)) # N
256
- c = c + min(effet_corde, c*coef_limit_Johansen) # N
257
- d = 1.05 * a / (2 + beta) * (sqrt(2 * beta * (1 + beta) + (4 * beta * (2 + beta) * M_y_Rk)/(f_h1k * t_1**2 * diam)) - beta) # N
258
- d = d + min(effet_corde, d*coef_limit_Johansen) # N
259
- e = 1.05 * (f_h1k * t_2 * diam) / (1 + 2 * beta) * (sqrt(2 * beta**2 * (1 + beta) + (4 * beta * (1 + 2 * beta) * M_y_Rk)/(f_h1k * t_2**2 * diam)) - beta) # N
260
- e = e + min(effet_corde, e*coef_limit_Johansen) # N
261
- f = 1.15 * sqrt((2 * beta)/(1 + beta)) * sqrt(2 * M_y_Rk * f_h1k * diam) # N
262
- f = f + min(effet_corde, f*coef_limit_Johansen) # N
255
+ c_johansen = a/(1 + beta) * (sqrt(beta + 2 * beta**2 * (1 + t_2 / t_1 + (t_2 / t_1)**2) + beta**3 * (t_2 / t_1)**2) - beta * (1 + t_2 / t_1)) # N
256
+ c = c_johansen + min(effet_corde, c_johansen*coef_limit_Johansen) # N
257
+ d_johansen = 1.05 * a / (2 + beta) * (sqrt(2 * beta * (1 + beta) + (4 * beta * (2 + beta) * M_y_Rk)/(f_h1k * t_1**2 * diam)) - beta) # N
258
+ d = d_johansen + min(effet_corde, d_johansen*coef_limit_Johansen) # N
259
+ e_johansen = 1.05 * (f_h1k * t_2 * diam) / (1 + 2 * beta) * (sqrt(2 * beta**2 * (1 + beta) + (4 * beta * (1 + 2 * beta) * M_y_Rk)/(f_h1k * t_2**2 * diam)) - beta) # N
260
+ e = e_johansen + min(effet_corde, e_johansen*coef_limit_Johansen) # N
261
+ f_johansen = 1.15 * sqrt((2 * beta)/(1 + beta)) * sqrt(2 * M_y_Rk * f_h1k * diam) # N
262
+ f = f_johansen + min(effet_corde, f_johansen*coef_limit_Johansen) # N
263
263
  return a, b, c, d, e, f
264
264
 
265
265
  calcul = val()
@@ -287,10 +287,10 @@ class Assemblage(Projet):
287
287
  beta = f_h2k / f_h1k
288
288
  g = f_h1k * t_1 * diam # N
289
289
  h = 0.5 * f_h2k * t_2 * diam # N
290
- j = 1.05 * g / (2 + beta) * (sqrt(2 * beta * (1 + beta) + (4 * beta * (2 + beta) * M_y_Rk)/ (f_h1k * t_1**2 * diam)) - beta) # N
291
- j = j + min(effet_corde, j*coef_limit_Johansen) # N
292
- k = 1.15 * sqrt((2 * beta)/(1 + beta)) * sqrt(2 * M_y_Rk * f_h1k * diam) # N
293
- k = k + min(effet_corde, k*coef_limit_Johansen) # N
290
+ j_johansen = 1.05 * g / (2 + beta) * (sqrt(2 * beta * (1 + beta) + (4 * beta * (2 + beta) * M_y_Rk)/ (f_h1k * t_1**2 * diam)) - beta) # N
291
+ j = j_johansen + min(effet_corde, j_johansen*coef_limit_Johansen) # N
292
+ k_johansen = 1.15 * sqrt((2 * beta)/(1 + beta)) * sqrt(2 * M_y_Rk * f_h1k * diam) # N
293
+ k = k_johansen + min(effet_corde, k_johansen*coef_limit_Johansen) # N
294
294
  return g, h, j, k
295
295
 
296
296
  calcul = val()
@@ -355,16 +355,16 @@ class Assemblage(Projet):
355
355
  def val():
356
356
  effet_corde = F_ax_Rk/4 # N
357
357
  a = 0.4 * f_h2k * t_2 * diam # N
358
- b = 1.15 * sqrt(2 * M_y_Rk * f_h2k * diam) # N
359
- b = b + min(effet_corde, b*coef_limit_Johansen) # N
358
+ b_johansen = 1.15 * sqrt(2 * M_y_Rk * f_h2k * diam) # N
359
+ b = b_johansen + min(effet_corde, b_johansen*coef_limit_Johansen) # N
360
360
  return a, b
361
361
  else:
362
362
  @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
363
363
  def val():
364
364
  effet_corde = F_ax_Rk/4 # N
365
365
  a = 0.4 * f_h1k * t_1 * diam # N
366
- b = 1.15 * sqrt(2 * M_y_Rk * f_h1k * diam) # N
367
- b = b + min(effet_corde, b*coef_limit_Johansen) # N
366
+ b_johansen = 1.15 * sqrt(2 * M_y_Rk * f_h1k * diam) # N
367
+ b = b_johansen + min(effet_corde, b_johansen*coef_limit_Johansen) # N
368
368
  return a, b
369
369
 
370
370
  calcul = val()
@@ -387,20 +387,20 @@ class Assemblage(Projet):
387
387
  def val():
388
388
  effet_corde = F_ax_Rk/4 # N
389
389
  c = f_h2k * t_2 * diam # N
390
- d = c * (sqrt(2 + (4 * M_y_Rk) / (f_h2k * diam * t_2 ** 2)) - 1) # N
391
- d = d + min(effet_corde, d*coef_limit_Johansen) # N
392
- e = 2.3 * sqrt(M_y_Rk * f_h2k * diam) # N
393
- e = e + min(effet_corde, e*coef_limit_Johansen) # N
390
+ d_johansen = c * (sqrt(2 + (4 * M_y_Rk) / (f_h2k * diam * t_2 ** 2)) - 1) # N
391
+ d = d_johansen + min(effet_corde, d_johansen*coef_limit_Johansen) # N
392
+ e_johansen = 2.3 * sqrt(M_y_Rk * f_h2k * diam) # N
393
+ e = e_johansen + min(effet_corde, e_johansen*coef_limit_Johansen) # N
394
394
  return c, d, e
395
395
  else:
396
396
  @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
397
397
  def val():
398
398
  effet_corde = F_ax_Rk/4 # N
399
399
  c = f_h1k * t_1 * diam # N
400
- d = c * (sqrt(2 + (4 * M_y_Rk) / (f_h1k * diam * t_1 ** 2)) - 1) # N
401
- d = d + min(effet_corde, d*coef_limit_Johansen) # N
402
- e = 2.3 * sqrt(M_y_Rk * f_h1k * diam) # N
403
- e = e + min(effet_corde, e*coef_limit_Johansen) # N
400
+ d_johansen = c * (sqrt(2 + (4 * M_y_Rk) / (f_h1k * diam * t_1 ** 2)) - 1) # N
401
+ d = d_johansen + min(effet_corde, d_johansen*coef_limit_Johansen) # N
402
+ e_johansen = 2.3 * sqrt(M_y_Rk * f_h1k * diam) # N
403
+ e = e_johansen + min(effet_corde, e_johansen*coef_limit_Johansen) # N
404
404
  return c, d, e
405
405
 
406
406
  calcul = val()
@@ -423,10 +423,10 @@ class Assemblage(Projet):
423
423
  def val():
424
424
  effet_corde = F_ax_Rk/4 # N
425
425
  f = f_h1k * t_1 * diam # N
426
- g = f * (sqrt(2 + (4 * M_y_Rk) / (f_h1k * diam * t_1 ** 2)) - 1) # N
427
- g = g + min(effet_corde, g*coef_limit_Johansen) # N
428
- h = 2.3 * sqrt(M_y_Rk * f_h1k * diam) # N
429
- h = h + min(effet_corde, h*coef_limit_Johansen) # N
426
+ g_johansen = f * (sqrt(2 + (4 * M_y_Rk) / (f_h1k * diam * t_1 ** 2)) - 1) # N
427
+ g = g_johansen + min(effet_corde, g_johansen*coef_limit_Johansen) # N
428
+ h_johansen = 2.3 * sqrt(M_y_Rk * f_h1k * diam) # N
429
+ h = h_johansen + min(effet_corde, h_johansen*coef_limit_Johansen) # N
430
430
  return f, g, h
431
431
 
432
432
  calcul = val()
@@ -449,8 +449,8 @@ class Assemblage(Projet):
449
449
  def val():
450
450
  effet_corde = F_ax_Rk/4 # N
451
451
  j = 0.5 * f_h2k * t_2 * diam # N
452
- k = 1.15 * sqrt(2 * M_y_Rk * f_h2k * diam) # N
453
- k = k + min(effet_corde, k*coef_limit_Johansen) # N
452
+ k_johansen = 1.15 * sqrt(2 * M_y_Rk * f_h2k * diam) # N
453
+ k = k_johansen + min(effet_corde, k_johansen*coef_limit_Johansen) # N
454
454
  return j, k
455
455
 
456
456
  calcul = val()
@@ -472,8 +472,8 @@ class Assemblage(Projet):
472
472
  def val():
473
473
  effet_corde = F_ax_Rk/4 # N
474
474
  l = 0.5 * f_h2k * t_2 * diam # N
475
- m = 2.3 * sqrt(M_y_Rk * f_h2k * diam) # N
476
- m = m + min(effet_corde, m*coef_limit_Johansen) # N
475
+ m_johansen = 2.3 * sqrt(M_y_Rk * f_h2k * diam) # N
476
+ m = m_johansen + min(effet_corde, m_johansen*coef_limit_Johansen) # N
477
477
  return l, m
478
478
 
479
479
  calcul = val()
@@ -731,6 +731,7 @@ class Pointe(Assemblage):
731
731
  self.l = l * si.mm #longueur sous tête
732
732
  self.qualite = qualite
733
733
  self.n = n
734
+ self._nef = n
734
735
  self.fu = self.__qualite_acier.loc["fub"] *si.MPa
735
736
  self.alpha = [alpha1, alpha2]
736
737
  self.percage = percage
@@ -851,7 +852,7 @@ class Pointe(Assemblage):
851
852
  float: portance locale en MPa
852
853
  """
853
854
  d = self.d.value * 10**3
854
- b_calcul = beam.b_calcul
855
+ b_calcul = beam.b_calcul.value * 10**3
855
856
  rho_k = beam.rho_k
856
857
  if self.dh >= 2*self.d or self.type_organe == "Agrafe":
857
858
  if beam.type_bois == "CP":
@@ -871,7 +872,7 @@ class Pointe(Assemblage):
871
872
  return fhk * si.MPa
872
873
  return val()
873
874
  else:
874
- raise ValueError(f"La tête de la pointe doit être au moins égale à {2*d} mm")
875
+ raise ValueError(f"La tête de la pointe doit être au moins égale à {2*d} mm selon l'EN 1995-1-1 §8.3.1.3 (3).")
875
876
 
876
877
 
877
878
  def _fhik(self) -> tuple:
@@ -919,7 +920,7 @@ class Pointe(Assemblage):
919
920
  if self.type_organe == "Autres pointes":
920
921
  @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
921
922
  def val():
922
- f_ax_k = 70 * 10**-6 * rho_k_ax**2 * si.MPa
923
+ f_ax_k = 20 * 10**-6 * rho_k_ax**2 * si.MPa
923
924
  F_ax_a_Rk = f_ax_k * d * t_pen
924
925
  f_head_k = 70 * 10**-6 * rho_k_head**2 * si.MPa
925
926
  F_head_Rk = f_head_k * d_h**2
@@ -928,7 +929,7 @@ class Pointe(Assemblage):
928
929
  else:
929
930
  @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
930
931
  def val():
931
- f_ax_k = 70 * 10**-6 * rho_k_ax**2 * si.MPa
932
+ f_ax_k = 20 * 10**-6 * rho_k_ax**2 * si.MPa
932
933
  F_ax_a_Rk = f_ax_k * d * t_pen
933
934
  f_head_k = 70 * 10**-6 * rho_k_head**2 * si.MPa
934
935
  F_head_Rk = f_ax_k * d * t + f_head_k * d_h**2
@@ -1078,7 +1079,7 @@ class Pointe(Assemblage):
1078
1079
  a3c = round(10 * self.d, 1)
1079
1080
  a4c = a2
1080
1081
 
1081
- elif rho_k > 420 and rho_k <= 500:
1082
+ elif (rho_k > 420 and rho_k <= 500) or self._type_beam[i] in self.TYPE_BOIS_ASSEMBLAGE[1:]:
1082
1083
  a1 = round((7 + 8 * mt.cos(mt.radians(alpha))) * self.d, 1)
1083
1084
  a2 = round(7 * self.d, 1)
1084
1085
  a3t = round((15 + 5 * mt.cos(mt.radians(alpha))) * self.d, 1)