diff --git a/CHANGELOG.md b/CHANGELOG.md index 23013a5..dbed2a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,13 @@ Toutes les modifications notables de ce projet seront documentées dans ce fichi Le format est basé sur [Keep a Changelog](https://keepachangelog.com/fr/1.1.0/), et ce projet adhère au [Semantic Versioning](https://semver.org/lang/fr/). +## [2.1.5] + +### Fixed +- **`ec5/cvt.py` (`MOB._k_panel`, `MOB._get_Kser_panel`)** : sécurisation du calcul de raideur des panneaux contre les divisions par zéro. + - Validation explicite des dimensions de panneau (`b`, `h`) et de la raideur linéique de rive (`k_ser_r`) avant application de la formule de `K_p`. + - Remplacement des tests implicites de présence (`if wall.get('Kser ...')`) par des tests explicites `is not None` pour éviter les comportements ambigus avec les objets `forallpeople.Physical`. + ## [2.1.4] ### Added diff --git a/ourocode/eurocode/core/model_result.py b/ourocode/eurocode/core/model_result.py index b29f172..db28fb7 100644 --- a/ourocode/eurocode/core/model_result.py +++ b/ourocode/eurocode/core/model_result.py @@ -834,9 +834,10 @@ def get_supports_reactions(self, combination: str) -> dict: Un glisseur retournera une force nulle dans la direction libre. """ reaction = {} - supports = self._model_generator.get_all_supports() - for support_id, support in supports.items(): - node_id = support["Noeud"] - reaction[support_id] = self._get_node_reaction(node_id, combination) + all_supports = self._model_generator.get_all_supports() + for support_type, supports in all_supports.items(): + for support_id, support in supports.items(): + node_id = support["Noeud"] + reaction[support_id] = self._get_node_reaction(node_id, combination) return reaction diff --git a/ourocode/eurocode/ec5/cvt.py b/ourocode/eurocode/ec5/cvt.py index cdde323..95ab19d 100644 --- a/ourocode/eurocode/ec5/cvt.py +++ b/ourocode/eurocode/ec5/cvt.py @@ -379,11 +379,11 @@ def add_wall_to_sys(self, if couturage_ext_rive: wall['Couturage ext. rive'] = couturage_ext_rive * si.mm wall['Couturage ext. intermédiaire'] = couturage_ext_inter * si.mm - if Ff_Rk_ext is None: + if Ff_Rk_ext is None or Ff_Rk_ext == 0 * si.N: wall['Ff,Rk ext'] = self._data_connecteurs['Extérieur']['Ff,Rk'] else: wall['Ff,Rk ext'] = Ff_Rk_ext * si.N - if Kser_ext is None: + if Kser_ext is None or Kser_ext == 0 * si.N/si.mm: wall['Kser ext'] = self._data_connecteurs['Extérieur']['Kser'] else: wall['Kser ext'] = Kser_ext * si.N / si.mm @@ -391,11 +391,11 @@ def add_wall_to_sys(self, if couturage_int_rive: wall['Couturage int. rive'] = couturage_int_rive * si.mm wall['Couturage int. intermédiaire'] = couturage_int_inter * si.mm - if Ff_Rk_int is None: + if Ff_Rk_int is None or Ff_Rk_int == 0 * si.N: wall['Ff,Rk int'] = self._data_connecteurs['Intérieur']['Ff,Rk'] else: wall['Ff,Rk int'] = Ff_Rk_int * si.N - if Kser_int is None: + if Kser_int is None or Kser_int == 0 * si.N/si.mm: wall['Kser int'] = self._data_connecteurs['Intérieur']['Kser'] else: wall['Kser int'] = Kser_int * si.N / si.mm @@ -529,6 +529,10 @@ def _get_Kser_panel(self, b: float, h: float, k_ser_r: float, k_ser_i: float): k_ser_r (float): raideur du panneau. k_ser_i (float): raideur du panneau. """ + if b == 0 * si.mm or h == 0 * si.mm: + raise ValueError("Dimensions de panneau invalides: b et h doivent être non nulles.") + if k_ser_r == 0 * si.N / si.mm**2: + raise ValueError("Raideur linéique de rive nulle (k_ser_r): vérifier Kser et les couturages de rive.") K_p = (2 / (k_ser_r * (b + h/3) + k_ser_i * h/6) + 2*h**2 / (k_ser_r * b**2 * (h + b/3)))**-1 return K_p @@ -556,11 +560,11 @@ def _k_panel(self): for sys_name, sys_wall in sys.items(): h_sys = sys_wall['Hauteur du système de mur'] for wall_name, wall in sys_wall['Murs'].items(): - if wall.get('Kser ext', None): + if wall.get('Kser ext', None) is not None: kser_ext = wall['Kser ext'] couturage_ext_rive = wall['Couturage ext. rive'] couturage_ext_inter = wall['Couturage ext. intermédiaire'] - if wall.get('Kser int', None): + if wall.get('Kser int', None) is not None: kser_int = wall['Kser int'] couturage_int_rive = wall['Couturage int. rive'] couturage_int_inter = wall['Couturage int. intermédiaire'] diff --git a/pyproject.toml b/pyproject.toml index 95a36cb..ee24907 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,7 +8,7 @@ include = ["ourocode*"] [project] name = "ourocode" -version = "2.1.4" +version = "2.1.5" description = "Ceci est un catalogue de fonction permettant une utilisation rapide pour la réalisation de note de calcul personnalisée." readme = "README.md" authors = [{name = "Anthony PARISOT", email = "contact@ourea-structure.fr"}]