ourocode 2.1.2__tar.gz → 2.1.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.

Potentially problematic release.


This version of ourocode might be problematic. Click here for more details.

Files changed (129) hide show
  1. {ourocode-2.1.2/ourocode.egg-info → ourocode-2.1.3}/PKG-INFO +1 -1
  2. ourocode-2.1.3/ourocode/data/profil_acier.csv +21 -0
  3. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/core/objet.py +3 -3
  4. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec1/exploitation.py +1 -1
  5. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec1/neige.py +1 -1
  6. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec1/vent.py +14 -29
  7. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec3/assemblage/platine.py +1 -1
  8. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec3/assemblage/soudure.py +1 -1
  9. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec3/assemblage/tige.py +1 -1
  10. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec3/element_droit/__init__.py +2 -1
  11. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec3/element_droit/cisaillement.py +1 -1
  12. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec3/element_droit/compression.py +20 -12
  13. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec3/element_droit/flexion.py +1 -1
  14. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec3/element_droit/plat.py +1 -1
  15. ourocode-2.1.3/ourocode/eurocode/ec3/element_droit/profil.py +125 -0
  16. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec3/element_droit/traction.py +1 -1
  17. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec3/feu.py +1 -1
  18. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec5/assemblage/agrafe.py +1 -1
  19. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec5/assemblage/assemblage.py +1 -1
  20. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec5/assemblage/boulon.py +1 -1
  21. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec5/assemblage/broche.py +1 -1
  22. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec5/assemblage/embrevement.py +1 -1
  23. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec5/assemblage/pointe.py +1 -1
  24. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec5/assemblage/tirefond.py +1 -1
  25. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec5/cvt.py +1 -1
  26. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec5/element_droit/barre.py +1 -1
  27. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec5/element_droit/cisaillement.py +1 -1
  28. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec5/element_droit/compression.py +1 -1
  29. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec5/element_droit/flexion.py +1 -1
  30. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec5/element_droit/traction.py +1 -1
  31. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec5/element_droit/verification_EC5.py +174 -47
  32. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec5/feu/cisaillement_feu.py +1 -1
  33. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec5/feu/compression_feu.py +4 -3
  34. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec5/feu/feu.py +5 -10
  35. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec5/feu/flexion_feu.py +1 -1
  36. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec5/feu/traction_feu.py +1 -1
  37. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec8/sismique.py +1 -1
  38. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/mixins/math_utils.py +38 -0
  39. {ourocode-2.1.2 → ourocode-2.1.3/ourocode.egg-info}/PKG-INFO +1 -1
  40. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode.egg-info/SOURCES.txt +3 -1
  41. {ourocode-2.1.2 → ourocode-2.1.3}/pyproject.toml +1 -1
  42. {ourocode-2.1.2 → ourocode-2.1.3}/tests/test_EC3_Element_droit.py +97 -1
  43. {ourocode-2.1.2 → ourocode-2.1.3}/tests/test_EC5_Verification.py +76 -0
  44. {ourocode-2.1.2 → ourocode-2.1.3}/LICENSE +0 -0
  45. {ourocode-2.1.2 → ourocode-2.1.3}/MANIFEST.in +0 -0
  46. {ourocode-2.1.2 → ourocode-2.1.3}/README.md +0 -0
  47. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/__init__.py +0 -0
  48. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/__version__.py +0 -0
  49. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/caracteristique_meca_acier.csv +0 -0
  50. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/caracteristique_meca_beton.csv +0 -0
  51. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/caracteristique_meca_bois.csv +0 -0
  52. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/caracteristique_meca_panel.csv +0 -0
  53. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/carte_action_region.csv +0 -0
  54. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/coeff_psy.csv +0 -0
  55. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/exploitation.csv +0 -0
  56. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/gammaM.csv +0 -0
  57. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/kdef.csv +0 -0
  58. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/kfi.csv +0 -0
  59. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/kmod.csv +0 -0
  60. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/limite_fleche.csv +0 -0
  61. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/qualite_acier.csv +0 -0
  62. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/screenshot/C90_def.png +0 -0
  63. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/screenshot/CNC2M_4.3.3_tab15.png +0 -0
  64. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/screenshot/CNC2M_4.3.3_tab16.png +0 -0
  65. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/screenshot/EN1993-1-8_fig6_11.png +0 -0
  66. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/screenshot/Kv_def.png +0 -0
  67. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/screenshot/sign_convention.png +0 -0
  68. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/section_boulon.csv +0 -0
  69. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/sismique/categorie_importance.csv +0 -0
  70. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/sismique/categorie_importance_ns.csv +0 -0
  71. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/sismique/classe_sol.csv +0 -0
  72. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/sismique/spectre_eleastique_h_type1.csv +0 -0
  73. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/sismique/spectre_eleastique_h_type2.csv +0 -0
  74. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/vent/vent_Cp_toiture_isolee_1_versant.csv +0 -0
  75. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/vent/vent_Cp_toiture_isolee_1_versant.png +0 -0
  76. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/vent/vent_Cp_toiture_isolee_2_versants.csv +0 -0
  77. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/vent/vent_Cp_toiture_isolee_2_versants.png +0 -0
  78. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/vent/vent_Cpe_mur_verticaux.csv +0 -0
  79. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/vent/vent_Cpe_mur_verticaux.png +0 -0
  80. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/vent/vent_Cpe_toiture_1_versant.png +0 -0
  81. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/vent/vent_Cpe_toiture_1_versant_0_degres.csv +0 -0
  82. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/vent/vent_Cpe_toiture_1_versant_180_degres.csv +0 -0
  83. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/vent/vent_Cpe_toiture_1_versant_90_degres.csv +0 -0
  84. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/vent/vent_Cpe_toiture_2_versants.png +0 -0
  85. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/vent/vent_Cpe_toiture_2_versants_0_degres.csv +0 -0
  86. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/vent/vent_Cpe_toiture_2_versants_90_degres.csv +0 -0
  87. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/vent/vent_Cpe_toiture_terrasse.csv +0 -0
  88. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/vent/vent_Cpe_toiture_terrasse.png +0 -0
  89. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/data/vent/vent_Ffr.png +0 -0
  90. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/__init__.py +0 -0
  91. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/core/__init__.py +0 -0
  92. /ourocode-2.1.2/ourocode/eurocode/core/renderer.py → /ourocode-2.1.3/ourocode/eurocode/core/_renderer.py +0 -0
  93. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/core/batiment.py +0 -0
  94. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/core/combinaison.py +0 -0
  95. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/core/model_generator.py +0 -0
  96. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/core/model_result.py +0 -0
  97. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/core/projet.py +0 -0
  98. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec1/__init__.py +0 -0
  99. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec3/__init__.py +0 -0
  100. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec3/assemblage/__init__.py +0 -0
  101. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec5/__init__.py +0 -0
  102. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec5/assemblage/__init__.py +0 -0
  103. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec5/blc.py +0 -0
  104. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec5/element_droit/__init__.py +0 -0
  105. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec5/feu/__init__.py +0 -0
  106. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/ec8/__init__.py +0 -0
  107. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/mixins/__init__.py +0 -0
  108. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/mixins/data_loader.py +0 -0
  109. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/mixins/serialization.py +0 -0
  110. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode/eurocode/mixins/synthese.py +0 -0
  111. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode.egg-info/dependency_links.txt +0 -0
  112. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode.egg-info/requires.txt +0 -0
  113. {ourocode-2.1.2 → ourocode-2.1.3}/ourocode.egg-info/top_level.txt +0 -0
  114. {ourocode-2.1.2 → ourocode-2.1.3}/setup.cfg +0 -0
  115. {ourocode-2.1.2 → ourocode-2.1.3}/tests/test_A0_Projet.py +0 -0
  116. {ourocode-2.1.2 → ourocode-2.1.3}/tests/test_EC0_Combinaison.py +0 -0
  117. {ourocode-2.1.2 → ourocode-2.1.3}/tests/test_EC1_Exploitation.py +0 -0
  118. {ourocode-2.1.2 → ourocode-2.1.3}/tests/test_EC1_Neige.py +0 -0
  119. {ourocode-2.1.2 → ourocode-2.1.3}/tests/test_EC3_Assemblage.py +0 -0
  120. {ourocode-2.1.2 → ourocode-2.1.3}/tests/test_EC3_Feu.py +0 -0
  121. {ourocode-2.1.2 → ourocode-2.1.3}/tests/test_EC3_Platine.py +0 -0
  122. {ourocode-2.1.2 → ourocode-2.1.3}/tests/test_EC5_Assemblage.py +0 -0
  123. {ourocode-2.1.2 → ourocode-2.1.3}/tests/test_EC5_BLC.py +0 -0
  124. {ourocode-2.1.2 → ourocode-2.1.3}/tests/test_EC5_CVT.py +0 -0
  125. {ourocode-2.1.2 → ourocode-2.1.3}/tests/test_EC5_Element_droit.py +0 -0
  126. {ourocode-2.1.2 → ourocode-2.1.3}/tests/test_EC5_Embrevement.py +0 -0
  127. {ourocode-2.1.2 → ourocode-2.1.3}/tests/test_EC5_Feu.py +0 -0
  128. {ourocode-2.1.2 → ourocode-2.1.3}/tests/test_EC8_Sismique.py +0 -0
  129. {ourocode-2.1.2 → ourocode-2.1.3}/tests/test_model_generator.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ourocode
3
- Version: 2.1.2
3
+ Version: 2.1.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,21 @@
1
+ type;designation;h;b;tw;tf;r1;A;Av;Avz;Iy;Iz;Wely;Welz;Wply;Wplz;iy;iz;masse
2
+ A refaire complètement !
3
+ HEA;HEA 100;96;100;5.0;8.0;12;21.24;12.0;12.0;349;133.5;69.8;26.7;80.1;41.3;4.06;2.51
4
+ HEA;HEA 120;120;120;5.0;8.0;12;25.34;14.0;14.0;606;229.3;101.1;38.2;116.5;59.9;4.90;3.01
5
+ HEA;HEA 140;140;140;5.5;8.5;12;31.42;16.8;16.8;1033;389.2;147.6;55.6;172.5;89.3;5.74;3.52
6
+ HEA;HEA 160;160;160;6.0;9.0;15;38.77;20.2;20.2;1670;623.9;208.7;78.0;249.3;130.7;6.57;4.02
7
+ HEA;HEA 180;180;180;6.5;9.5;15;45.25;23.8;23.8;2510;924.6;278.9;102.7;329.8;171.7;7.45;4.52
8
+ HEA;HEA 200;200;200;7.0;10.0;18;53.83;27.6;27.6;3692;1335.6;369.2;133.6;431.6;222.8;8.28;4.98
9
+ HEA;HEA 220;220;220;7.5;10.5;18;63.53;31.6;31.6;5409;1955.4;492.6;177.8;571.8;294.4;9.23;5.55
10
+ HEA;HEA 240;240;240;7.5;11.0;21;73.85;36.0;36.0;7762;2768.7;646.8;230.7;773.2;391.2;10.27;6.13
11
+ HEA;HEA 260;260;260;8.0;11.5;21;84.37;40.6;40.6;10455;3667.6;804.3;282.1;959.1;507.6;11.11;6.60
12
+ HEA;HEA 280;280;280;8.5;12.0;24;97.30;46.2;46.2;13670;4762.8;976.4;339.9;1165.8;626.5;11.86;7.00
13
+ HEA;HEA 300;300;300;9.0;12.0;24;111.78;51.6;51.6;18262;6310.4;1217.5;420.7;1431.8;836.2;12.78;7.52
14
+ HEA;HEA 320;320;320;10.0;13.5;27;131.13;59.0;59.0;24529;8172.7;1533.0;510.8;1798.8;1072.3;13.70;7.89
15
+ HEA;HEA 340;340;340;10.0;14.5;27;142.94;65.4;65.4;31533;10474.3;1855.0;616.1;2158.9;1308.9;14.85;8.56
16
+ HEA;HEA 360;360;360;12.5;16.5;27;171.18;75.6;75.6;43191;14178.6;2399.5;787.7;2849.2;1674.9;15.88;9.10
17
+ HEA;HEA 400;400;400;13.5;18.0;27;198.58;86.2;86.2;63222;20580.3;3161.1;1029.0;3765.8;2191.2;17.85;10.19
18
+ HEA;HEA 450;450;450;14.0;20.0;27;237.66;100.2;100.2;93819;29798.3;4170.0;1324.4;4880.9;2816.3;19.88;11.19
19
+ HEA;HEA 500;500;500;16.0;23.0;27;298.31;123.4;123.4;131932;42385.5;5277.3;1695.4;6208.0;3616.8;21.04;11.93
20
+ HEA;HEA 550;550;550;16.5;24.5;27;354.41;143.8;143.8;178830;56837.2;6502.9;2066.8;7648.2;4388.9;22.44;12.67
21
+ HEA;HEA 600;600;600;18.0;28.0;27;428.31;170.4;170.4;238620;78762.8;7954.0;2625.4;9370.9;5318.6;23.63;13.57
@@ -115,7 +115,7 @@ class Objet(SerializationMixin, DataLoaderMixin, MathUtilsMixin, SyntheseMixin):
115
115
 
116
116
  return numeric * self._PHYSICAL_UNITS[unit]
117
117
 
118
- def get_value(self, value: dict|list|str, index: int=None, key: str=None, get_keys: bool=("False", "True"),):
118
+ def get_value(self, value: dict|list|str, index: int|None=None, key: str=None, get_keys: bool=("False", "True"),):
119
119
  """Extrait et retourne une valeur depuis une structure de données complexe.
120
120
 
121
121
  Cette méthode utilitaire permet de naviguer dans les dictionnaires,
@@ -141,9 +141,9 @@ class Objet(SerializationMixin, DataLoaderMixin, MathUtilsMixin, SyntheseMixin):
141
141
  >>> obj.get_value({"x": 1, "y": 2}, get_keys=True)
142
142
  ["x", "y"]
143
143
  """
144
- if index and isinstance(value, list):
144
+ if index is not None and isinstance(value, list):
145
145
  value = value[index]
146
- elif index and isinstance(value, str):
146
+ elif index is not None and isinstance(value, str):
147
147
  value = list(value)[index]
148
148
  elif get_keys and isinstance(value, dict):
149
149
  value = list(value.keys())
@@ -1,7 +1,7 @@
1
1
  from math import *
2
2
 
3
3
  import forallpeople as si
4
- from ourocode.eurocode.core.renderer import handcalc
4
+ from ourocode.eurocode.core._renderer import handcalc
5
5
 
6
6
  from ourocode.eurocode.core.projet import Projet
7
7
 
@@ -5,7 +5,7 @@ import pandas as pd
5
5
  import warnings
6
6
 
7
7
  import forallpeople as si
8
- from ourocode.eurocode.core.renderer import handcalc
8
+ from ourocode.eurocode.core._renderer import handcalc
9
9
 
10
10
  from ourocode.eurocode.core.batiment import Batiment
11
11
 
@@ -9,7 +9,8 @@ from copy import copy
9
9
 
10
10
  import pandas as pd
11
11
  import forallpeople as si
12
- from ourocode.eurocode.core.renderer import handcalc
12
+ from ourocode.eurocode.core._renderer import handcalc
13
+ from ourocode.eurocode.mixins.math_utils import MathUtilsMixin
13
14
 
14
15
  # sys.path.append(os.path.join(os.getcwd(), "ourocode"))
15
16
  # from eurocode.A0_Projet import Batiment
@@ -18,22 +19,6 @@ from ourocode.eurocode.core.batiment import Batiment
18
19
  si.environment("structural")
19
20
 
20
21
 
21
- def interpolation_lineaire(x, xa, xb, ya, yb):
22
- """Fait une interpolation linéaire pour trouver un résultat y entre deux valeur xa et xb"""
23
- y = ya + (x - xa) * ((yb - ya) / (xb - xa))
24
- return y
25
-
26
-
27
- def interpolation_logarithmique(x, xa, xb, ya, yb):
28
- """Fait une interpolation linéaire pour trouver un résultat y entre deux valeur xa et xb"""
29
- y = (
30
- (x > xb) * yb
31
- + (x < xa) * ya
32
- + (x <= xb) * (x >= 1) * (ya - (ya - yb) * mt.log10(x))
33
- )
34
- return y
35
-
36
-
37
22
  class Vent(Batiment):
38
23
  RHO_AIR = 1.225 * si.kg / si.m**3
39
24
  CPI = [0.2, -0.3]
@@ -581,7 +566,7 @@ class Murs_verticaux(Vent):
581
566
  if borne_inf:
582
567
  for i in range(self._df.shape[0]):
583
568
  list_CPE_line.append(
584
- interpolation_lineaire(
569
+ MathUtilsMixin.interpolation_lineaire(
585
570
  h_d,
586
571
  borne_inf,
587
572
  borne_sup,
@@ -598,7 +583,7 @@ class Murs_verticaux(Vent):
598
583
  self._df.loc[self._df.shape[0]] = [
599
584
  self._df.iloc[i, 0],
600
585
  "CPE " + str(round(self.load_area, 2)),
601
- interpolation_logarithmique(
586
+ MathUtilsMixin.interpolation_logarithmique(
602
587
  self.load_area,
603
588
  1,
604
589
  10,
@@ -734,7 +719,7 @@ class Toiture_terrasse_acrotere(Vent):
734
719
  row = [round(self._hp_h, 3), cpe]
735
720
  for j in range(2, num_columns):
736
721
  row.append(
737
- interpolation_lineaire(
722
+ MathUtilsMixin.interpolation_lineaire(
738
723
  self._hp_h,
739
724
  minimum,
740
725
  maximum,
@@ -750,7 +735,7 @@ class Toiture_terrasse_acrotere(Vent):
750
735
  row = [df.iloc[i, 0], "CPE " + str(round(self.load_area, 2))]
751
736
  for j in range(2, num_columns):
752
737
  row.append(
753
- interpolation_logarithmique(
738
+ MathUtilsMixin.interpolation_logarithmique(
754
739
  self.load_area, 1, 10, df.iloc[i + 1, j], df.iloc[i, j]
755
740
  )
756
741
  )
@@ -941,7 +926,7 @@ class Toiture_1_pant(Vent):
941
926
  row.append(df_max.iloc[i, j])
942
927
  else:
943
928
  row.append(
944
- interpolation_lineaire(
929
+ MathUtilsMixin.interpolation_lineaire(
945
930
  self.alpha_toit,
946
931
  minimum,
947
932
  maximum,
@@ -957,7 +942,7 @@ class Toiture_1_pant(Vent):
957
942
  row = [df.iloc[i, 0], "CPE " + str(round(self.load_area, 2))]
958
943
  for j in range(2, num_columns):
959
944
  row.append(
960
- interpolation_logarithmique(
945
+ MathUtilsMixin.interpolation_logarithmique(
961
946
  self.load_area, 1, 10, df.iloc[i + 1, j], df.iloc[i, j]
962
947
  )
963
948
  )
@@ -1166,7 +1151,7 @@ class Toiture_2_pants(Vent):
1166
1151
  row.append(df_max.iloc[i, j])
1167
1152
  else:
1168
1153
  row.append(
1169
- interpolation_lineaire(
1154
+ MathUtilsMixin.interpolation_lineaire(
1170
1155
  self.alpha_toit,
1171
1156
  minimum,
1172
1157
  maximum,
@@ -1182,7 +1167,7 @@ class Toiture_2_pants(Vent):
1182
1167
  row = [df.iloc[i, 0], "CPE " + str(round(self.load_area, 2))]
1183
1168
  for j in range(2, num_columns):
1184
1169
  row.append(
1185
- interpolation_logarithmique(
1170
+ MathUtilsMixin.interpolation_logarithmique(
1186
1171
  self.load_area, 1, 10, df.iloc[i + 1, j], df.iloc[i, j]
1187
1172
  )
1188
1173
  )
@@ -1304,7 +1289,7 @@ class Toiture_isolee_1_pant(Vent):
1304
1289
  row = [self._df.iloc[i, 0], self.phi]
1305
1290
  for j in range(2, 6):
1306
1291
  row.append(
1307
- interpolation_lineaire(
1292
+ MathUtilsMixin.interpolation_lineaire(
1308
1293
  self.phi,
1309
1294
  0,
1310
1295
  1,
@@ -1346,7 +1331,7 @@ class Toiture_isolee_1_pant(Vent):
1346
1331
  row.append(df_max.iloc[i, j])
1347
1332
  else:
1348
1333
  row.append(
1349
- interpolation_lineaire(
1334
+ MathUtilsMixin.interpolation_lineaire(
1350
1335
  self.alpha_toit,
1351
1336
  minimum,
1352
1337
  maximum,
@@ -1480,7 +1465,7 @@ class Toiture_isolee_2_pants(Vent):
1480
1465
  row = [self._df.iloc[i, 0], self.phi]
1481
1466
  for j in range(2, 7):
1482
1467
  row.append(
1483
- interpolation_lineaire(
1468
+ MathUtilsMixin.interpolation_lineaire(
1484
1469
  self.phi,
1485
1470
  0,
1486
1471
  1,
@@ -1522,7 +1507,7 @@ class Toiture_isolee_2_pants(Vent):
1522
1507
  row.append(df_max.iloc[i, j])
1523
1508
  else:
1524
1509
  row.append(
1525
- interpolation_lineaire(
1510
+ MathUtilsMixin.interpolation_lineaire(
1526
1511
  self.alpha_toit,
1527
1512
  minimum,
1528
1513
  maximum,
@@ -6,7 +6,7 @@ import pandas as pd
6
6
 
7
7
  import forallpeople as si
8
8
  si.environment("structural")
9
- from ourocode.eurocode.core.renderer import handcalc
9
+ from ourocode.eurocode.core._renderer import handcalc
10
10
 
11
11
  from ourocode.eurocode.ec3.assemblage.tige import Tige
12
12
  from ourocode.eurocode.ec3.element_droit.plat import Plat
@@ -9,7 +9,7 @@ import matplotlib.pyplot as plt
9
9
  from matplotlib.patches import Rectangle, Circle
10
10
  import forallpeople as si
11
11
  si.environment("structural")
12
- from ourocode.eurocode.core.renderer import handcalc
12
+ from ourocode.eurocode.core._renderer import handcalc
13
13
 
14
14
  from ourocode.eurocode.ec3.element_droit.plat import Plat
15
15
 
@@ -7,7 +7,7 @@ import pandas as pd
7
7
 
8
8
  import forallpeople as si
9
9
  si.environment("structural")
10
- from ourocode.eurocode.core.renderer import handcalc
10
+ from ourocode.eurocode.core._renderer import handcalc
11
11
 
12
12
  from ourocode.eurocode.ec3.element_droit.plat import Plat
13
13
 
@@ -1,7 +1,8 @@
1
1
  from ourocode.eurocode.ec3.element_droit.plat import Plat
2
+ from ourocode.eurocode.ec3.element_droit.profil import Profil
2
3
  from ourocode.eurocode.ec3.element_droit.traction import Traction
3
4
  from ourocode.eurocode.ec3.element_droit.compression import Compression
4
5
  from ourocode.eurocode.ec3.element_droit.cisaillement import Cisaillement
5
6
  from ourocode.eurocode.ec3.element_droit.flexion import Flexion
6
7
 
7
- __all__ = ["Plat", "Traction", "Compression", "Cisaillement", "Flexion"]
8
+ __all__ = ["Plat", "Profil", "Traction", "Compression", "Cisaillement", "Flexion"]
@@ -5,7 +5,7 @@ from math import sqrt
5
5
 
6
6
  import forallpeople as si
7
7
  si.environment("structural")
8
- from ourocode.eurocode.core.renderer import handcalc
8
+ from ourocode.eurocode.core._renderer import handcalc
9
9
 
10
10
  from ourocode.eurocode.ec3.element_droit.plat import Plat
11
11
 
@@ -5,7 +5,7 @@ from math import sqrt
5
5
 
6
6
  import forallpeople as si
7
7
  si.environment("structural")
8
- from ourocode.eurocode.core.renderer import handcalc
8
+ from ourocode.eurocode.core._renderer import handcalc
9
9
 
10
10
  from ourocode.eurocode.ec3.element_droit.plat import Plat
11
11
 
@@ -17,7 +17,7 @@ class Compression(Plat):
17
17
  "Encastré - Rotule" : 0.7,
18
18
  "Encastré - Encastré" : 0.5,
19
19
  "Encastré - Rouleau" : 1}
20
- def __init__(self, A: si.mm**2, Iy:si.mm**4, Iz:si.mm**4, lo_y: si.mm=0, lo_z: si.mm=0, courbe_flamb: dict="{'y':'c', 'z':'c'}", type_appuis: str=COEF_LF, *args, **kwargs):
20
+ def __init__(self, A: si.mm**2, Iy:si.mm**4, Iz:si.mm**4, lo_y: si.mm=0, lo_z: si.mm=0, courbe_flamb: dict="{'y':'c', 'z':'c'}", type_appuis_y: str=COEF_LF, type_appuis_z: str=COEF_LF, *args, **kwargs):
21
21
  """
22
22
  Classe intégrant les formules de compression et d'instabilité au flambement à l'EC3.
23
23
  Cette classe est hérité de la classe Plat du module EC3_Element_droit.py.
@@ -28,12 +28,18 @@ class Compression(Plat):
28
28
  Iz (float): Moment quadratique suivant l'axe de rotation z en mm4
29
29
  lo_y (float): Longueur de flambement suivant l'axe de rotation y en mm. Defaults to 0.
30
30
  lo_z (float): Longueur de flambement suivant l'axe de rotation z en mm. Defaults to 0.
31
- type_appuis (str): Permet de déterminé la forme du flambement en fonction des types d'appui:
32
- Encastré 1 côté : 2
33
- Rotule - Rotule : 1
34
- Encastré - Rotule : 0.7
35
- Encastré - Encastré : 0.5
36
- Encastré - Rouleau : 1
31
+ type_appuis_y (str): Conditions d'appui pour le flambement selon l'axe de rotation y.
32
+ Détermine β_y dans lf_y = β_y · lo_y.
33
+ Valeurs possibles (voir COEF_LF):
34
+ - "Encastré 1 côté" : β = 2.0 (console)
35
+ - "Rotule - Rotule" : β = 1.0 (articulé-articulé)
36
+ - "Encastré - Rotule" : β = 0.7
37
+ - "Encastré - Encastré" : β = 0.5
38
+ - "Encastré - Rouleau" : β = 1.0 (encastré-glissière)
39
+ Defaults to "Rotule - Rotule".
40
+ type_appuis_z (str, optional): Conditions d'appui pour le flambement
41
+ selon l'axe de rotation z.
42
+
37
43
  """
38
44
  super().__init__(*args, **kwargs)
39
45
  self.A = A * si.mm**2
@@ -41,8 +47,10 @@ class Compression(Plat):
41
47
  self.Iz = Iz * si.mm**4
42
48
  self.lo ={'y': lo_y*si.mm, 'z': lo_z*si.mm}
43
49
  self.courbe_flamb = courbe_flamb
44
- self.type_appuis = type_appuis
45
- self.coef_lef = self.COEF_LF[type_appuis]
50
+ self.type_appuis_y = type_appuis_y
51
+ self.type_appuis_z = type_appuis_z
52
+ self.coef_lef_y = self.COEF_LF[type_appuis_y]
53
+ self.coef_lef_z = self.COEF_LF[type_appuis_z]
46
54
 
47
55
 
48
56
 
@@ -76,8 +84,8 @@ class Compression(Plat):
76
84
  dict: {"y": λ_y, "z": λ_z} (élancements sans unité).
77
85
  """
78
86
  lamb = {'y':0, 'z':0}
79
- lamb['y'] = (self.lo['y'].value * 10**3 * self.coef_lef) / mt.sqrt(self.Iy / (self.A))
80
- lamb['z'] = (self.lo['z'].value * 10**3 * self.coef_lef) / mt.sqrt(self.Iz / (self.A))
87
+ lamb['y'] = (self.lo['y'].value * 10**3 * self.coef_lef_y) / mt.sqrt(self.Iy / (self.A))
88
+ lamb['z'] = (self.lo['z'].value * 10**3 * self.coef_lef_z) / mt.sqrt(self.Iz / (self.A))
81
89
  return lamb
82
90
 
83
91
  @property
@@ -5,7 +5,7 @@ from math import sqrt
5
5
 
6
6
  import forallpeople as si
7
7
  si.environment("structural")
8
- from ourocode.eurocode.core.renderer import handcalc
8
+ from ourocode.eurocode.core._renderer import handcalc
9
9
 
10
10
  from ourocode.eurocode.ec3.element_droit.plat import Plat
11
11
  from ourocode.eurocode.ec3.element_droit.cisaillement import Cisaillement
@@ -6,7 +6,7 @@ import pandas as pd
6
6
 
7
7
  import forallpeople as si
8
8
  si.environment("structural")
9
- from ourocode.eurocode.core.renderer import handcalc
9
+ from ourocode.eurocode.core._renderer import handcalc
10
10
 
11
11
  from ourocode.eurocode.core.projet import Projet
12
12
 
@@ -0,0 +1,125 @@
1
+ # coding in UTF-8
2
+ # by Anthony PARISOT
3
+ import pandas as pd
4
+
5
+ import forallpeople as si
6
+ si.environment("structural")
7
+
8
+ from ourocode.eurocode.ec3.element_droit.plat import Plat
9
+
10
+
11
+ class _Profil(Plat):
12
+ """Classe pour les profilés laminés acier selon EN 1993-1-1.
13
+
14
+ Permet de générer des poutres en I ou H (IPE, HEA, HEB, UPN, etc.)
15
+ à partir de désignations normalisées selon EN 10365.
16
+
17
+ Les caractéristiques géométriques sont chargées depuis le CSV
18
+ `profil_acier.csv` et les propriétés mécaniques (fy, fu) sont
19
+ déterminées selon la classe d'acier et l'épaisseur maximale.
20
+
21
+ Hérite de Plat pour être compatible avec les classes de vérification
22
+ (Compression, Traction, Flexion, Cisaillement) via _from_parent_class.
23
+ """
24
+ # Chargement des données de profils
25
+ _PROFIL_DATA = Plat._data_from_csv(Plat, "profil_acier.csv", index_col=None)
26
+ TYPES_PROFIL = tuple(_PROFIL_DATA["type"].unique())
27
+ DESIGNATIONS = tuple(_PROFIL_DATA["designation"])
28
+
29
+ def __init__(self, designation: str, classe_acier: str = "S235",
30
+ classe_transv: int = 1, **kwargs):
31
+ """Initialise un profilé laminé acier.
32
+
33
+ Args:
34
+ designation (str): Désignation du profil (ex: "IPE 300", "HEA 200", "HEB 260")
35
+ classe_acier (str, optional): Classe d'acier selon EN 1993-1-1 Tableau 3.1
36
+ (ex: "S235", "S275", "S355"). Defaults to "S235".
37
+ classe_transv (int, optional): Classe transversale de la section (1, 2 ou 3)
38
+ selon EN 1993-1-1 §5.5. Defaults to 1.
39
+ **kwargs: Arguments transmis à la classe parent Plat.
40
+
41
+ Raises:
42
+ ValueError: Si designation n'est pas dans DESIGNATIONS.
43
+ """
44
+ # Validation de la désignation avant appel du parent
45
+ if designation not in self.DESIGNATIONS:
46
+ raise ValueError(
47
+ f"Désignation '{designation}' invalide. Valeurs acceptées : {self.DESIGNATIONS}"
48
+ )
49
+
50
+ self.designation = designation
51
+
52
+ # Chargement des données géométriques depuis le CSV
53
+ self._load_profil_data()
54
+
55
+ # Appel du parent Plat avec t=tw (épaisseur âme)
56
+ # h et b ne sont pas passés car ils seraient écrasés par Plat
57
+ super().__init__(t=self.tw.value*10**3, h=self.h.value*10**3, b=self.b.value*10**3,
58
+ classe_acier=classe_acier, classe_transv=classe_transv,
59
+ **kwargs)
60
+
61
+ # Restauration des valeurs de h et b après l'appel du parent
62
+ self.h = self._h_backup
63
+ self.b = self._b_backup
64
+
65
+ # Surcharge de fy et fu selon l'épaisseur maximale (max(tw, tf))
66
+ self.__fy_fu()
67
+
68
+ def _load_profil_data(self):
69
+ """Charge les caractéristiques géométriques du profil depuis le CSV."""
70
+ df = self._PROFIL_DATA
71
+ profil = df[df["designation"] == self.designation].iloc[0]
72
+
73
+ # Dimensions géométriques
74
+ self.h = profil["h"] * si.mm
75
+ self.b = profil["b"] * si.mm
76
+ self.tw = profil["tw"] * si.mm # épaisseur âme
77
+ self.tf = profil["tf"] * si.mm # épaisseur semelle
78
+ self.r = profil["r"] * si.mm # rayon congé
79
+
80
+ # Sauvegarde pour restauration après appel super().__init__
81
+ self._h_backup = self.h
82
+ self._b_backup = self.b
83
+
84
+ # Caractéristiques de section
85
+ self.A = profil["A"] * si.mm**2
86
+ self.Av = profil["Av"] * si.mm**2
87
+ self.Avz = profil["Avz"] * si.mm**2 if pd.notna(profil["Avz"]) else None
88
+
89
+ # Moments quadratiques
90
+ self.Iy = profil["Iy"] * si.mm**4
91
+ self.Iz = profil["Iz"] * si.mm**4
92
+
93
+ # Modules de flexion
94
+ self.Wely = profil["Wely"] * si.mm**3
95
+ self.Welz = profil["Welz"] * si.mm**3
96
+ self.Wply = profil["Wply"] * si.mm**3
97
+ self.Wplz = profil["Wplz"] * si.mm**3
98
+
99
+ # Rayons de giration
100
+ self.iy = profil["iy"] * si.mm
101
+ self.iz = profil["iz"] * si.mm
102
+
103
+ # Masse linéique
104
+ self.masse = profil["masse"] * si.kg / si.m
105
+
106
+ def __fy_fu(self):
107
+ """Définit fy et fu en fonction de la classe d'acier et de l'épaisseur maximale.
108
+
109
+ Surcharge la méthode de Plat pour utiliser max(tw, tf) au lieu de t uniquement,
110
+ car les profilés ont deux épaisseurs différentes (âme et semelle).
111
+ """
112
+ t_max = max(self.tw, self.tf)
113
+
114
+ if t_max <= 40 * si.mm:
115
+ self.fy = self._Plat__classe_acier.loc["t<= 40 fy"] * si.MPa
116
+ self.fu = self._Plat__classe_acier.loc["t<= 40 fu"] * si.MPa
117
+ elif 40 * si.mm < t_max <= 80 * si.mm:
118
+ self.fy = self._Plat__classe_acier.loc["40<t<= 80 fy"] * si.MPa
119
+ self.fu = self._Plat__classe_acier.loc["40<t<= 80 fu"] * si.MPa
120
+
121
+ @property
122
+ def type_profil(self):
123
+ """Retourne le type de profil (IPE, HEA, HEB, etc.)."""
124
+ df = self._PROFIL_DATA
125
+ return df[df["designation"] == self.designation].iloc[0]["type"]
@@ -5,7 +5,7 @@ from math import sqrt
5
5
 
6
6
  import forallpeople as si
7
7
  si.environment("structural")
8
- from ourocode.eurocode.core.renderer import handcalc
8
+ from ourocode.eurocode.core._renderer import handcalc
9
9
 
10
10
  from ourocode.eurocode.ec3.element_droit.plat import Plat
11
11
 
@@ -6,7 +6,7 @@ from matplotlib import pyplot as plt
6
6
 
7
7
  import forallpeople as si
8
8
  si.environment("structural")
9
- from ourocode.eurocode.core.renderer import handcalc
9
+ from ourocode.eurocode.core._renderer import handcalc
10
10
 
11
11
  # sys.path.append(os.path.join(os.getcwd(), "ourocode"))
12
12
  # from eurocode.EC3_Element_droit import Plat
@@ -7,7 +7,7 @@ from math import sin, cos, radians, sqrt, pi
7
7
 
8
8
  import forallpeople as si
9
9
  si.environment("structural")
10
- from ourocode.eurocode.core.renderer import handcalc
10
+ from ourocode.eurocode.core._renderer import handcalc
11
11
 
12
12
  from ourocode.eurocode.ec5.assemblage.pointe import Pointe
13
13
 
@@ -7,7 +7,7 @@ from math import sin, cos, radians, sqrt, pi
7
7
 
8
8
  import forallpeople as si
9
9
  si.environment("structural")
10
- from ourocode.eurocode.core.renderer import handcalc
10
+ from ourocode.eurocode.core._renderer import handcalc
11
11
 
12
12
  from ourocode.eurocode.core.projet import Projet
13
13
  from ourocode.eurocode.ec5.element_droit.barre import Barre
@@ -7,7 +7,7 @@ from math import sin, cos, radians, sqrt, pi
7
7
 
8
8
  import forallpeople as si
9
9
  si.environment("structural")
10
- from ourocode.eurocode.core.renderer import handcalc
10
+ from ourocode.eurocode.core._renderer import handcalc
11
11
 
12
12
  from ourocode.eurocode.ec5.assemblage.assemblage import Assemblage
13
13
 
@@ -7,7 +7,7 @@ from math import sin, cos, radians, sqrt, pi
7
7
 
8
8
  import forallpeople as si
9
9
  si.environment("structural")
10
- from ourocode.eurocode.core.renderer import handcalc
10
+ from ourocode.eurocode.core._renderer import handcalc
11
11
 
12
12
  from ourocode.eurocode.ec5.assemblage.boulon import Boulon
13
13
 
@@ -7,7 +7,7 @@ from math import sin, cos, radians, sqrt, pi
7
7
 
8
8
  import forallpeople as si
9
9
  si.environment("structural")
10
- from ourocode.eurocode.core.renderer import handcalc
10
+ from ourocode.eurocode.core._renderer import handcalc
11
11
 
12
12
  from ourocode.eurocode.ec5.assemblage.assemblage import Assemblage
13
13
  from ourocode.eurocode.ec5.element_droit.barre import Barre
@@ -7,7 +7,7 @@ from math import sin, cos, radians, sqrt, pi
7
7
 
8
8
  import forallpeople as si
9
9
  si.environment("structural")
10
- from ourocode.eurocode.core.renderer import handcalc
10
+ from ourocode.eurocode.core._renderer import handcalc
11
11
 
12
12
  from ourocode.eurocode.ec5.assemblage.assemblage import Assemblage, interpolationLineaire
13
13
 
@@ -7,7 +7,7 @@ from math import sin, cos, radians, sqrt, pi
7
7
 
8
8
  import forallpeople as si
9
9
  si.environment("structural")
10
- from ourocode.eurocode.core.renderer import handcalc
10
+ from ourocode.eurocode.core._renderer import handcalc
11
11
 
12
12
  from ourocode.eurocode.ec5.assemblage.pointe import Pointe
13
13
  from ourocode.eurocode.ec5.assemblage.boulon import Boulon
@@ -7,7 +7,7 @@ import numpy as np
7
7
  import forallpeople as si
8
8
 
9
9
  si.environment("structural")
10
- from ourocode.eurocode.core.renderer import handcalc
10
+ from ourocode.eurocode.core._renderer import handcalc
11
11
 
12
12
  from ourocode.eurocode.core.batiment import Batiment
13
13
  from ourocode.eurocode.ec5.assemblage import Assemblage
@@ -11,7 +11,7 @@ import pandas as pd
11
11
 
12
12
  import forallpeople as si
13
13
  si.environment("structural")
14
- from ourocode.eurocode.core.renderer import handcalc
14
+ from ourocode.eurocode.core._renderer import handcalc
15
15
 
16
16
  from ourocode.eurocode.core.projet import Projet
17
17
 
@@ -10,7 +10,7 @@ import numpy as np
10
10
 
11
11
  import forallpeople as si
12
12
  si.environment("structural")
13
- from ourocode.eurocode.core.renderer import handcalc
13
+ from ourocode.eurocode.core._renderer import handcalc
14
14
 
15
15
  from ourocode.eurocode.ec5.element_droit.barre import Barre
16
16
 
@@ -10,7 +10,7 @@ import numpy as np
10
10
 
11
11
  import forallpeople as si
12
12
  si.environment("structural")
13
- from ourocode.eurocode.core.renderer import handcalc
13
+ from ourocode.eurocode.core._renderer import handcalc
14
14
 
15
15
  from ourocode.eurocode.ec5.element_droit.barre import Barre
16
16
 
@@ -10,7 +10,7 @@ import numpy as np
10
10
 
11
11
  import forallpeople as si
12
12
  si.environment("structural")
13
- from ourocode.eurocode.core.renderer import handcalc
13
+ from ourocode.eurocode.core._renderer import handcalc
14
14
 
15
15
  from ourocode.eurocode.ec5.element_droit.barre import Barre
16
16
  from ourocode.eurocode.ec5.element_droit.compression import Compression
@@ -10,7 +10,7 @@ import numpy as np
10
10
 
11
11
  import forallpeople as si
12
12
  si.environment("structural")
13
- from ourocode.eurocode.core.renderer import handcalc
13
+ from ourocode.eurocode.core._renderer import handcalc
14
14
 
15
15
  from ourocode.eurocode.ec5.element_droit.barre import Barre
16
16