ourocode 1.7.2__tar.gz → 1.7.4__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 (72) hide show
  1. {ourocode-1.7.2/ourocode.egg-info → ourocode-1.7.4}/PKG-INFO +1 -1
  2. ourocode-1.7.4/ourocode/__version__.py +1 -0
  3. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/eurocode/EC1_Vent.py +4 -2
  4. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/eurocode/EC3_Assemblage.py +57 -16
  5. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/eurocode/EC5_Assemblage.py +91 -52
  6. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/eurocode/EC5_CVT.py +15 -9
  7. {ourocode-1.7.2 → ourocode-1.7.4/ourocode.egg-info}/PKG-INFO +1 -1
  8. {ourocode-1.7.2 → ourocode-1.7.4}/pyproject.toml +1 -1
  9. ourocode-1.7.2/ourocode/__version__.py +0 -1
  10. {ourocode-1.7.2 → ourocode-1.7.4}/LICENSE +0 -0
  11. {ourocode-1.7.2 → ourocode-1.7.4}/MANIFEST.in +0 -0
  12. {ourocode-1.7.2 → ourocode-1.7.4}/README.md +0 -0
  13. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/__init__.py +0 -0
  14. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/caracteristique_meca_acier.csv +0 -0
  15. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/caracteristique_meca_bois.csv +0 -0
  16. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/caracteristique_meca_panel.csv +0 -0
  17. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/carte_action_region.csv +0 -0
  18. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/coeff_psy.csv +0 -0
  19. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/exploitation.csv +0 -0
  20. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/gammaM.csv +0 -0
  21. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/kdef.csv +0 -0
  22. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/kfi.csv +0 -0
  23. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/kmod.csv +0 -0
  24. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/limite_fleche.csv +0 -0
  25. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/qualite_acier.csv +0 -0
  26. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/screenshot/C90_def.png +0 -0
  27. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/screenshot/Kv_def.png +0 -0
  28. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/screenshot/sign_convention.png +0 -0
  29. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/section_boulon.csv +0 -0
  30. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/sismique/categorie_importance.csv +0 -0
  31. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/sismique/categorie_importance_ns.csv +0 -0
  32. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/sismique/classe_sol.csv +0 -0
  33. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/sismique/spectre_eleastique_h_type1.csv +0 -0
  34. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/sismique/spectre_eleastique_h_type2.csv +0 -0
  35. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/vent/vent_Cp_toiture_isolee_1_versant.csv +0 -0
  36. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/vent/vent_Cp_toiture_isolee_1_versant.png +0 -0
  37. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/vent/vent_Cp_toiture_isolee_2_versants.csv +0 -0
  38. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/vent/vent_Cp_toiture_isolee_2_versants.png +0 -0
  39. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/vent/vent_Cpe_mur_verticaux.csv +0 -0
  40. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/vent/vent_Cpe_mur_verticaux.png +0 -0
  41. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/vent/vent_Cpe_toiture_1_versant.png +0 -0
  42. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/vent/vent_Cpe_toiture_1_versant_0_degres.csv +0 -0
  43. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/vent/vent_Cpe_toiture_1_versant_180_degres.csv +0 -0
  44. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/vent/vent_Cpe_toiture_1_versant_90_degres.csv +0 -0
  45. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/vent/vent_Cpe_toiture_2_versants.png +0 -0
  46. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/vent/vent_Cpe_toiture_2_versants_0_degres.csv +0 -0
  47. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/vent/vent_Cpe_toiture_2_versants_90_degres.csv +0 -0
  48. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/vent/vent_Cpe_toiture_terrasse.csv +0 -0
  49. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/vent/vent_Cpe_toiture_terrasse.png +0 -0
  50. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/data/vent/vent_Ffr.png +0 -0
  51. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/eurocode/A0_Projet.py +0 -0
  52. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/eurocode/EC0_Combinaison.py +0 -0
  53. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/eurocode/EC1_Neige.py +0 -0
  54. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/eurocode/EC3_Element_droit.py +0 -0
  55. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/eurocode/EC5_Element_droit.py +0 -0
  56. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/eurocode/EC5_Feu.py +0 -0
  57. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/eurocode/EC8_Sismique.py +0 -0
  58. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/eurocode/__init__.py +0 -0
  59. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode/eurocode/objet.py +0 -0
  60. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode.egg-info/SOURCES.txt +0 -0
  61. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode.egg-info/dependency_links.txt +0 -0
  62. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode.egg-info/requires.txt +0 -0
  63. {ourocode-1.7.2 → ourocode-1.7.4}/ourocode.egg-info/top_level.txt +0 -0
  64. {ourocode-1.7.2 → ourocode-1.7.4}/setup.cfg +0 -0
  65. {ourocode-1.7.2 → ourocode-1.7.4}/tests/test_A0_Projet.py +0 -0
  66. {ourocode-1.7.2 → ourocode-1.7.4}/tests/test_EC0_Combinaison.py +0 -0
  67. {ourocode-1.7.2 → ourocode-1.7.4}/tests/test_EC1_Neige.py +0 -0
  68. {ourocode-1.7.2 → ourocode-1.7.4}/tests/test_EC5_Assemblage.py +0 -0
  69. {ourocode-1.7.2 → ourocode-1.7.4}/tests/test_EC5_CVT.py +0 -0
  70. {ourocode-1.7.2 → ourocode-1.7.4}/tests/test_EC5_Element_droit.py +0 -0
  71. {ourocode-1.7.2 → ourocode-1.7.4}/tests/test_EC5_Feu.py +0 -0
  72. {ourocode-1.7.2 → ourocode-1.7.4}/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.2
3
+ Version: 1.7.4
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.4"
@@ -252,12 +252,14 @@ class Vent(Batiment):
252
252
  @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
253
253
  def val():
254
254
  C0_z = 1 + 0.004 * Delta_A_C * mt.exp(z - 10)
255
- return C0_z
255
+ res = max(C0_z, 1)
256
+ return res
256
257
  else:
257
258
  @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
258
259
  def val():
259
260
  C0_z = 1 + 0.004 * Delta_A_C * mt.exp(0)
260
- return C0_z
261
+ res = max(C0_z, 1)
262
+ return res
261
263
 
262
264
  case "2":
263
265
  raise ValueError("Erreur la catégorie orographique 2 n'est pas encore implémentée")
@@ -175,22 +175,27 @@ class Tige(Element):
175
175
  return self.taux_bl
176
176
 
177
177
 
178
- def Bp_Rd(self, d_ecrou: int, d_head_bl: int, *args):
178
+ def Bp_Rd(self, d_ecrou: int, d_head_bl: int):
179
179
  """Retourne la résistance au poinçonnement de la plaque en N
180
180
 
181
181
  Args:
182
182
  d_ecrou (int): diamètre extérieur de l'écrou en mm
183
183
  d_head_bl (int): diamètre de la tête de boulon en mm
184
- tp, i (int, args): épaisseur des plaques dans l'assemblage, sinon récupère le t de la classe Element
185
184
 
186
185
  Returns:
187
186
  float: résistance de calcul en N
188
187
  """
189
188
  d_ecrou = d_ecrou * si.mm
190
189
  d_head_bl = d_head_bl * si.mm
191
- dm = (d_ecrou + d_head_bl) / 2
192
- tp = min(self.t.value*10**3, *args) * si.mm
193
- return (0.6 * pi * dm * tp * self.fu) / __class__.GAMMA_M["gamma_M2"]
190
+ d_m = (d_ecrou + d_head_bl) / 2
191
+ t_p = self.t
192
+ gamma_M2 = self.GAMMA_M["gamma_M2"]
193
+ f_u = self.fu
194
+ @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\[", right="\]")
195
+ def val():
196
+ B_p_Rd = (0.6 * pi * d_m * t_p * f_u) / gamma_M2
197
+ return B_p_Rd
198
+ return val()
194
199
 
195
200
 
196
201
  def Fb_Rd(self, e1: float ,e2: float , p1: float, p2: float):
@@ -218,7 +223,7 @@ class Tige(Element):
218
223
  d_0 = self.d0
219
224
  d = self.d
220
225
  t = self.t
221
- gamma_M_2 = __class__.GAMMA_M["gamma_M2"]
226
+ gamma_M_2 = self.GAMMA_M["gamma_M2"]
222
227
 
223
228
  @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\[", right="\]")
224
229
  def val():
@@ -246,7 +251,7 @@ class Tige(Element):
246
251
  f_y = self.fy
247
252
  f_u = self.fu
248
253
  k_ex = 1
249
- gamma_M_2 = __class__.GAMMA_M["gamma_M2"]
254
+ gamma_M_2 = self.GAMMA_M["gamma_M2"]
250
255
 
251
256
  if effort == "Excentré":
252
257
  k_ex = 0.5
@@ -369,7 +374,16 @@ class Soudure(Element):
369
374
  N_Ed (float): Effort de traction en kN.
370
375
  """
371
376
  N_Ed = N_Ed * si.kN
372
- return (self.beta_w * self.GAMMA_M["gamma_M2"] * (N_Ed * sqrt(2)) / self.fu) / (self.gorge * self.lef)
377
+ gamma_M_2 = self.GAMMA_M["gamma_M2"]
378
+ beta_w = self.beta_w
379
+ a = self.gorge
380
+ l_ef = self.lef
381
+ fu = self.fu
382
+ @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\[", right="\]")
383
+ def val():
384
+ cordon_frontal = (beta_w * gamma_M_2 * (N_Ed * sqrt(2)) / fu) / (a * l_ef)
385
+ return cordon_frontal
386
+ return val()
373
387
 
374
388
 
375
389
  def cordon_laterale(self, V_Ed: float):
@@ -379,7 +393,16 @@ class Soudure(Element):
379
393
  V_Ed (float): Effort de cisaillement du cordon en kN.
380
394
  """
381
395
  V_Ed = V_Ed * si.kN
382
- return (self.beta_w * self.GAMMA_M["gamma_M2"] * (V_Ed * sqrt(3)) / self.fu) / (self.gorge * self.lef)
396
+ gamma_M_2 = self.GAMMA_M["gamma_M2"]
397
+ beta_w = self.beta_w
398
+ a = self.gorge
399
+ l_ef = self.lef
400
+ fu = self.fu
401
+ @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\[", right="\]")
402
+ def val():
403
+ cordon_laterale = (beta_w * gamma_M_2 * (V_Ed * sqrt(3)) / fu) / (a * l_ef)
404
+ return cordon_laterale
405
+ return val()
383
406
 
384
407
 
385
408
  def cordon_oblique(self, alpha_cordon: float, N_Ed: float):
@@ -390,7 +413,16 @@ class Soudure(Element):
390
413
  """
391
414
  self.alpha_cordon = alpha_cordon
392
415
  N_Ed = N_Ed * si.kN
393
- 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)
416
+ gamma_M_2 = self.GAMMA_M["gamma_M2"]
417
+ beta_w = self.beta_w
418
+ a = self.gorge
419
+ l_ef = self.lef
420
+ fu = self.fu
421
+ @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\[", right="\]")
422
+ def val():
423
+ cordon_oblique = (beta_w * gamma_M_2 * (N_Ed * sqrt(3 - sin(radians(self.alpha_cordon))**2)) / fu) / (a * l_ef)
424
+ return cordon_oblique
425
+ return val()
394
426
 
395
427
 
396
428
  def cordon_pieces_obliques(self, N_Ed: float):
@@ -400,10 +432,19 @@ class Soudure(Element):
400
432
  N_Ed (float): Effort de traction en kN.
401
433
  """
402
434
  N_Ed = N_Ed * si.kN
403
- if self.alpha < 90:
404
- return (self.beta_w * self.GAMMA_M["gamma_M2"] * (N_Ed * sqrt(2 - sin(radians(self.alpha)))) / self.fu) / (self.gorge * self.lef)
405
- elif self.alpha > 90:
406
- return (self.beta_w * self.GAMMA_M["gamma_M2"] * (N_Ed * sqrt(2 + sin(radians(self.alpha)))) / self.fu) / (self.gorge * self.lef)
435
+ gamma_M_2 = self.GAMMA_M["gamma_M2"]
436
+ beta_w = self.beta_w
437
+ a = self.gorge
438
+ l_ef = self.lef
439
+ fu = self.fu
440
+ @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\[", right="\]")
441
+ def val():
442
+ if self.alpha < 90:
443
+ cordon_pieces_obliques = (beta_w * gamma_M_2 * (N_Ed * sqrt(2 - sin(radians(self.alpha)))) / fu) / (a * l_ef)
444
+ elif self.alpha > 90:
445
+ cordon_pieces_obliques = (beta_w * gamma_M_2 * (N_Ed * sqrt(2 + sin(radians(self.alpha)))) / fu) / (a * l_ef)
446
+ return cordon_pieces_obliques
447
+ return val()
407
448
 
408
449
 
409
450
  def critere_generale(self, FvEd: float, FaxEd: float):
@@ -430,7 +471,7 @@ class Soudure(Element):
430
471
 
431
472
 
432
473
  def soudure_discontinue(self, b: int, b1: int, t1: int, corrosion: bool=("False", "True")):
433
- """_summary_
474
+ """Détermine les dimensions des cordons de soudure discontinue
434
475
 
435
476
  Args:
436
477
  b (int): voir EC3 1-8
@@ -440,7 +481,7 @@ class Soudure(Element):
440
481
  corrosion (bool, optional): _description_. Defaults to False.
441
482
 
442
483
  Returns:
443
- _type_: _description_
484
+ dict: dimensions des cordons de soudure discontinue
444
485
  """
445
486
  if corrosion:
446
487
  print("Il n'est pas possible d'avoir une soudure discontinue en ambiance corrosive")
@@ -311,9 +311,19 @@ class Assemblage(Projet):
311
311
 
312
312
  return (calcul[0] + calcul2[0], calcul2[1])
313
313
 
314
+ def _type_plaque(self):
315
+ if self.t <= 0.5 * self.d:
316
+ self.type_plaque = "mince"
317
+
318
+ elif self.d <= self.t:
319
+ self.type_plaque = "epaisse"
320
+
321
+ else:
322
+ self.type_plaque = "intermédiaire"
323
+ return self.type_plaque
314
324
 
315
325
  # 8.2.3 Assemblage bois métal
316
- def _FvRk_BoisMetal(self, effet_corde: bool):
326
+ def _FvRk_BoisMetal(self, effet_corde: bool, test_type_plaque:bool=True):
317
327
  """Calcul la capacité résistante en cisaillement de la tige en N par plan de cisaillement avec
318
328
  t1 : valeur minimale entre epaisseur de l'élément bois latéral et la profondeur de pénétration en mm
319
329
  t2 : epaisseur de l'élément bois central en mm
@@ -338,16 +348,29 @@ class Assemblage(Projet):
338
348
  self.t = self.beam_2.t
339
349
  if self.nCis == 2:
340
350
  self.pos_plaq = "centrale"
341
-
342
- if self.t <= 0.5 * self.d:
343
- self.type_plaque = "mince"
344
351
 
345
- elif self.d <= self.t:
352
+ # On détecte le type de plaque
353
+ if test_type_plaque:
354
+ self._type_plaque()
355
+
356
+ # Si la plaque est intermédiaire, alors on fait une interpolation linéaire entre la valeur critique d'une plaque mince et d'une plaque epaisse
357
+ if self.type_plaque == "intermédiaire":
358
+ t = self.t
359
+ t_mince = 0.5 * self.d
360
+ t_epaisse = self.d
361
+ self.type_plaque = "mince"
362
+ FvRk_mince = self._FvRk_BoisMetal(effet_corde,test_type_plaque=False)
363
+ F_v_Rk_mince = FvRk_mince[1][0]
346
364
  self.type_plaque = "epaisse"
347
-
348
- else:
365
+ FvRk_epaisse = self._FvRk_BoisMetal(effet_corde,test_type_plaque=False)
366
+ F_v_Rk_epaisse = FvRk_epaisse[1][0]
349
367
  self.type_plaque = "intermédiaire"
350
- print("ATTENTION interpolation linéaire à faire ! EC5-8.2.3.1")
368
+ @handcalc(override="long", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
369
+ def val():
370
+ F_v_Rk_inter = F_v_Rk_mince + (t - t_mince) * ((F_v_Rk_epaisse - F_v_Rk_mince)/(t_epaisse - t_mince)) # interpolation entre plaque mince et épaisse
371
+ return F_v_Rk_inter
372
+ FvRk_inter = val()
373
+ return (FvRk_mince[0] + FvRk_epaisse[0] + FvRk_inter[0], (FvRk_inter[1], (FvRk_mince[1][1], FvRk_epaisse[1][1])))
351
374
 
352
375
  if self.type_plaque == "mince" and self.nCis == 1:
353
376
  if self._type_beam[0] == "Métal":
@@ -618,46 +641,59 @@ class Assemblage(Projet):
618
641
  latex = L_net_value[0]
619
642
  L_net_v, L_net_t = L_net_value[1]
620
643
 
644
+ if not isinstance(mode_rupture, (list, tuple)):
645
+ mode_rupture = [mode_rupture]
646
+
647
+ def _Anet_v(mode: str):
648
+ """ détermine la surface Anet_v en fonction du mode de rupture """
649
+ if mode in ("C", "F", "J", "L", "K", "M"):
650
+ @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
651
+ def a_net_v():
652
+ A_net_v = L_net_v * (t_1 * K_cr)
653
+ return A_net_v
654
+ a_net_v_result = a_net_v()
655
+ return a_net_v_result
656
+ else:
657
+ @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
658
+ def a_net_v(t_ef):
659
+ A_net_v = L_net_v / 2 * (L_net_t + 2 * (t_ef * K_cr))
660
+ return A_net_v
661
+
662
+ match mode:
663
+ case "A":
664
+ @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
665
+ def tef():
666
+ t_ef = 0.4*t_1 # Épaisseur efficace
667
+ return t_ef
668
+ case "B":
669
+ @handcalc(override="long", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
670
+ def tef():
671
+ t_ef = 1.4 * sqrt(M_y_Rk / (f_hk * diam)) # Épaisseur efficace
672
+ return t_ef
673
+ case "D"|"G":
674
+ @handcalc(override="long", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
675
+ def tef():
676
+ t_ef = t_1 * (sqrt(2 + (4 * M_y_Rk ) / (f_hk * diam * t_1**2)-1)) # Épaisseur efficace
677
+ return t_ef
678
+ case "E"|"H":
679
+ @handcalc(override="long", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
680
+ def tef():
681
+ t_ef = 2 * sqrt(M_y_Rk / (f_hk * diam)) # Épaisseur efficace
682
+ return t_ef
683
+ tef_result = tef()
684
+ a_net_v_result = a_net_v(tef_result[1])
685
+ a_net_v_result = (tef_result[0] + a_net_v_result[0], a_net_v_result[1])
686
+ return a_net_v_result
687
+
688
+ list_A_net_v = []
689
+ for mode in mode_rupture:
690
+ a_net_v = _Anet_v(mode)
691
+ list_A_net_v.append(a_net_v)
621
692
 
622
- if mode_rupture in ("C", "F", "J", "L", "K", "M"):
623
- @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
624
- def a_net_v():
625
- A_net_v = L_net_v * (t_1 * K_cr)
626
- return A_net_v
627
- a_net_v_result = a_net_v()
628
- latex = latex + a_net_v_result[0]
629
- A_net_v = a_net_v_result[1]
630
- else:
631
- @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
632
- def a_net_v(t_ef):
633
- A_net_v = L_net_v / 2 * (L_net_t + 2 * (t_ef * K_cr))
634
- return A_net_v
635
-
636
- match mode_rupture:
637
- case "A":
638
- @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
639
- def tef():
640
- t_ef = 0.4*t_1 # Épaisseur efficace
641
- return t_ef
642
- case "B":
643
- @handcalc(override="long", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
644
- def tef():
645
- t_ef = 1.4 * sqrt(M_y_Rk / (f_hk * diam)) # Épaisseur efficace
646
- return t_ef
647
- case "D"|"G":
648
- @handcalc(override="long", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
649
- def tef():
650
- t_ef = t_1 * (sqrt(2 + (4 * M_y_Rk ) / (f_hk * diam * t_1**2)-1)) # Épaisseur efficace
651
- return t_ef
652
- case "E"|"H":
653
- @handcalc(override="long", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
654
- def tef():
655
- t_ef = 2 * sqrt(M_y_Rk / (f_hk * diam)) # Épaisseur efficace
656
- return t_ef
657
- tef_result = tef()
658
- a_net_v_result = a_net_v(tef_result[1])
659
- latex = latex + tef_result[0] + a_net_v_result[0]
660
- A_net_v = a_net_v_result[1]
693
+ a_net_v_result = min(list_A_net_v, key=lambda x: x[1])
694
+
695
+ latex = latex + a_net_v_result[0]
696
+ A_net_v = a_net_v_result[1]
661
697
 
662
698
  @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
663
699
  def f_bs_Rk():
@@ -669,7 +705,7 @@ class Assemblage(Projet):
669
705
  self.F_bs_Rk = result[1]
670
706
  return (latex + result[0], self.F_bs_Rk)
671
707
 
672
- def taux_cisaillement(self, Fv_Ed: si.kN, Fax_Ed: si.kN=0, loadtype=Barre.LOAD_TIME):
708
+ def taux_cisaillement(self, Fv_Ed: si.kN=0, Fax_Ed: si.kN=0, loadtype=Barre.LOAD_TIME):
673
709
  """Détermine le taux de cisaillement ou du chargement combiné de l'assemblage
674
710
 
675
711
  Args:
@@ -1492,8 +1528,11 @@ class Boulon(Assemblage):
1492
1528
 
1493
1529
  if self._type_beam[0] == "Métal":
1494
1530
  FtRd = Tige(self.d.value*10**3, d_int, self.qualite, True, filetage_EN1090, t=self.beam_1.t.value*10**3, h=self.beam_1.h.value*10**3, classe_acier=self.beam_1.classe_acier, classe_transv=self.beam_1.classe_transv).FtRd
1495
- d_ext = min(self.beam_1.t*12, 4*self.d)
1496
1531
  fc_90_k = float(self.beam_2.caract_meca.loc["fc90k"]) * si.MPa
1532
+ if self.nCis == 1:
1533
+ d_ext = min(self.beam_1.t*12, 4*self.d, d_ext)
1534
+ else:
1535
+ d_ext = min(self.beam_1.t*12, 4*self.d)
1497
1536
  else:
1498
1537
  FtRd = Tige(self.d.value*10**3, d_int, self.qualite, True, filetage_EN1090, t=0, h=0, classe_acier="S235", classe_transv=3).FtRd
1499
1538
  fc_90_k = float(self.beam_1.caract_meca.loc["fc90k"]) * si.MPa
@@ -1569,7 +1608,7 @@ class Broche(Boulon):
1569
1608
 
1570
1609
 
1571
1610
  class _Tirefond(object):
1572
- def __init__(self, d:si.mm, d1:si.mm, ds:si.mm, dh:si.mm, l:si.mm, n, rho_a:float, fhead:float, ftensk:float, MyRk:float=0, alpha1: float=0, alpha2: float=0, percage: bool=("False", "True"), **kwargs):
1611
+ def __init__(self, d:si.mm, d1:si.mm, ds:si.mm, dh:si.mm, l:si.mm, n: int, rho_a:float, fhead:float, ftensk:float, MyRk:float=0, alpha1: float=0, alpha2: float=0, percage: bool=("False", "True"), **kwargs):
1573
1612
  """Défini un object tirefond
1574
1613
 
1575
1614
  Args:
@@ -1717,7 +1756,7 @@ class _Tirefond(object):
1717
1756
  else:
1718
1757
  @handcalc(override="long", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
1719
1758
  def val():
1720
- F_head_Rk = mt.inf * si.kN #l'élément 1 est métallique donc infini pour ce calcul
1759
+ F_head_Rk = 10**6 * si.kN #l'élément 1 est métallique donc infini pour ce calcul
1721
1760
  return F_head_Rk
1722
1761
  return val()
1723
1762
 
@@ -1818,7 +1857,7 @@ class Tirefond_inf_7(_Tirefond, Pointe):
1818
1857
 
1819
1858
 
1820
1859
  class Tirefond_sup_6(_Tirefond, Boulon):
1821
- def __init__(self, d:si.mm, d1:float, ds:float, dh:float, l:si.mm, n, rho_a:float, fhead:float, ftensk:float, MyRk:float=0, alpha1: float=0, alpha2: float=0, **kwargs):
1860
+ def __init__(self, d:si.mm, d1:float, ds:float, dh:float, l:si.mm, n: int, rho_a:float, fhead:float, ftensk:float, MyRk:float=0, alpha1: float=0, alpha2: float=0, **kwargs):
1822
1861
  """
1823
1862
  Crée une classe Tirefond_sup_6 pour les tirefonds avec un diamètre efficace supérieur à 6mm
1824
1863
  Cette classe hérite de la classe Assemblage du module EC5_Assemblage.py.
@@ -25,15 +25,23 @@ class MOB(Batiment):
25
25
  Cette classe est hérité de la classe Batiment, provenant du module A0_Projet.py.
26
26
 
27
27
 
28
+
28
29
  Un système de mur à ossature bois est composé de plusieurs murs servant aux contreventements,
29
30
  ces murs sont intérompus par les portes et fenêtres. Ces murs sont eux même composés de plusieurs panneaux.
30
31
 
31
- Il convient donc d'ajouter une classe MOB puis d'ajouter via la méthode "add_wall" chaque système de mur.
32
- Ensuite d'ajouter les murs internes au système de mur via la méthode "add_internal_wall", puis d'ajouter ensuite les panneaux
32
+ Il convient donc d'ajouter une classe MOB puis d'ajouter via la méthode "add_sys_wall" chaque système de mur.
33
+ Ensuite d'ajouter les murs internes au système de mur via la méthode "add_wall_to_sys", puis d'ajouter ensuite les panneaux
33
34
  à chaque murs via la méthode "add_panel_to_wall".
34
-
35
35
  Une méthode plus efficace consiste à écrire dans un fichier JSON les informations pour chaque système de mur,
36
- puis d'utiliser la méthode "load_data" pour charger les informations.
36
+ puis d'utiliser la méthode "load_walls_data" pour charger les informations.
37
+
38
+ Ensuite on peu utiliser la méthode "calculate_loads_and_deformations" pour calculer les efforts de contreventements et les déformations,
39
+ suivant le centre de gravité et la raideur des systèmes de mur.
40
+ Sinon on peux donner directement les efforts Fv_Ed_ELS et Fv_Ed_ELU par système de mur dans la méthode "add_sys_wall".
41
+
42
+ Enfin on utilise les méthodes "taux_walls" et "taux_ancrage" pour récupérer les taux de contreventements et les taux d'ancrage.
43
+ Attention cette classe ne calcule pas les montants bois notamment au flambement, ni la compression perpendiculaire des montants sur la lisse basse.
44
+ Pour réaliser ces calculs, il faut utiliser la classe Barre et les classes de vérification associées du module EC5_Element_droit.py
37
45
 
38
46
  Args:
39
47
  connecteurs_int (Agrafe, Pointe, optional): Objet Agrafe ou Pointe, représentant les connecteurs intérieurs du mur à ossature bois provenant du module EC5_Assemblage.py.
@@ -103,11 +111,11 @@ class MOB(Batiment):
103
111
  alpha_Fw_rad = radians(alpha_Fw)
104
112
  Ks = self.get_Kser_wall()
105
113
  sys_walls_names = self._get_all_sys_walls_names()
114
+ df_sw = pd.DataFrame(index=sys_walls_names, columns=["dn_p_sw", "dn_sw", "a", "b", "c", "d", "e", "C1", "C2", "C3", "C6"])
106
115
  if not hasattr(self, "data_sys_walls_loads"):
107
116
  self.data_sys_walls_loads = pd.DataFrame(index=sys_walls_names, columns=["Étage", "delta,v,Ed,i ELS", "Fv,Ed,i ELU"])
108
117
  self.data_walls_loads = pd.DataFrame(index=self.data_walls.keys(), columns=["Étage", "Fv,Ed,i ELU", "Ft,Ed,i ELU (soulèvement)"])
109
118
  self.data_panels_loads = pd.DataFrame(index=self.data_panels.keys(), columns=["Étage", "Fv,Ed,i ELU"])
110
- df_sw = pd.DataFrame(index=sys_walls_names, columns=["dn_p_sw", "dn_sw", "a", "b", "c", "d", "e", "C1", "C2", "C3", "C6"])
111
119
 
112
120
  for etage_data, sys in self.data.items():
113
121
  if etage_data != etage:
@@ -608,12 +616,10 @@ class MOB(Batiment):
608
616
  k_wall[1] = k_wall[1] + panel['Nombre'] * self.data_Kser_panels.loc[panel_name]['Kser,p unit.']
609
617
  k_wall[2] = k_wall[2] + panel['Nombre'] * self.data_Kser_panels.loc[panel_name]['Coeff. équivalence']
610
618
  k_wall[3] = self.data_Kser_panels.loc[panel_name]['Kser,p,ref']
619
+ k_sys_wall[3] = self.data_Kser_panels.loc[panel_name]['Kser,p,ref']
611
620
  self.data_Kser_walls.loc[wall_name] = k_wall
612
621
  k_sys_wall[1] = k_sys_wall[1] + k_wall[1]
613
622
  k_sys_wall[2] = k_sys_wall[2] + k_wall[2]
614
-
615
- if self.data_Kser_panels.get(panel_name):
616
- k_sys_wall[3] = self.data_Kser_panels.loc[panel_name]['Kser,p,ref']
617
623
  self.data_Kser_sys_walls.loc[sys_name] = k_sys_wall
618
624
 
619
625
  # Trier par index (nommés 'Système de mur' et 'Mur')
@@ -788,7 +794,7 @@ class MOB(Batiment):
788
794
  Fv_Rk_anc_li = Fv_Rk_anc_li * si.kN
789
795
  e_anc_lb = e_anc_lb * si.mm
790
796
  e_anc_li = e_anc_li * si.mm
791
- self.taux_ancr_walls = pd.DataFrame(columns=['Étage', 'Longueur mur', 'Ft,Ed', 'Ft,Rd', 'Taux ancrage soulèvement (%)', 'Fv,anc,Ed', 'Fv,anc,lb,Rd', 'Nbr ancr,lb', 'entraxe anc,lb', 'Taux ancr. lisse basse (%)', 'Fv,anc,li,Rd', 'Nbr ancr,li', 'entraxe anc,li', 'Taux ancr. lisse impl. (%)'])
797
+ self.taux_ancr_walls = pd.DataFrame(columns=['Étage', 'Longueur mur', 'Ft,Ed', 'Ft,Rd', 'Taux ancr. soulèvement (%)', 'Fv,anc,Ed', 'Fv,anc,lb,Rd', 'Nbr ancr,lb', 'entraxe anc,lb', 'Taux ancr. lisse basse (%)', 'Fv,anc,li,Rd', 'Nbr ancr,li', 'entraxe anc,li', 'Taux ancr. lisse impl. (%)'])
792
798
 
793
799
  for wall_name, wall in self.data_walls_loads.iterrows():
794
800
  if etage and wall['Étage'] != etage:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ourocode
3
- Version: 1.7.2
3
+ Version: 1.7.4
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
@@ -8,7 +8,7 @@ include = ["ourocode*"]
8
8
 
9
9
  [project]
10
10
  name = "ourocode"
11
- version = "1.7.2"
11
+ version = "1.7.4"
12
12
  description = "Ceci est un catalogue de fonction permettant une utilisation rapide pour la réalisation de note de calcul personnalisée."
13
13
  readme = "README.md"
14
14
  authors = [{name = "Anthony PARISOT", email = "contact@ourea-structure.fr"}]
@@ -1 +0,0 @@
1
- __version__ = "1.7.2"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes