From 49265e2527bf81573bb3e17931d2fb1f730ecb6f Mon Sep 17 00:00:00 2001 From: Benoit LELANDAIS Date: Mon, 6 Jan 2025 15:32:42 +0100 Subject: [PATCH] Fix bug when split on a single block/face --- src/Core/Topo/CommandSplitBlocksWithOgrid.cpp | 13 ++++++++++++- src/Core/Topo/CommandSplitFacesWithOgrid.cpp | 14 +++++++++++++- test_link/test_issue35.py | 12 +++++++++++- 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/Core/Topo/CommandSplitBlocksWithOgrid.cpp b/src/Core/Topo/CommandSplitBlocksWithOgrid.cpp index 1d1d5eb..787ae5e 100644 --- a/src/Core/Topo/CommandSplitBlocksWithOgrid.cpp +++ b/src/Core/Topo/CommandSplitBlocksWithOgrid.cpp @@ -677,15 +677,26 @@ createVertices(std::map & filtre_vertex, #endif if (nb_face_int == 0){ + // ce cas n'est valide que si le sommet n'est relié qu'à un seul bloc sélectionné + // pas valide en cas de sommet commun à 2 blocs sans arête commune + // => récupération des blocs du sommet pour compter le nombre de blocs candidats à l'ogrid std::vector blocks; sommet->getBlocks(blocks); - if (blocks.size() > 1) { + int nb_selected = 0; + for (auto b1 : blocks) { + for (auto b2 : m_blocs) { + if (b1 == b2) nb_selected++; + } + } + + if (nb_selected > 1) { // sommets relié à 2 blocs ayant une arête commune sans face commune // => pas de ogrid possible TkUtil::UTF8String message (TkUtil::Charset::UTF_8); message << "Le ogrid n'est pas réalisable car 2 des blocs sélectionnés ont un sommet en commun (" << sommet->getName() << ") mais pas de face commune."; throw TkUtil::Exception (message); } + // il n'est relié qu'à un seul bloc sélectionné Utils::Math::Point pt = (barycentre_blk + (sommet->getCoord() - barycentre_blk)*m_ratio_ogrid); newVtx = new Topo::Vertex(getContext(), pt); diff --git a/src/Core/Topo/CommandSplitFacesWithOgrid.cpp b/src/Core/Topo/CommandSplitFacesWithOgrid.cpp index ddf8c2f..e83c988 100644 --- a/src/Core/Topo/CommandSplitFacesWithOgrid.cpp +++ b/src/Core/Topo/CommandSplitFacesWithOgrid.cpp @@ -544,15 +544,27 @@ createVertices(std::map & filtre_vertex, #ifdef _DEBUG_SPLIT_OGRID std::cout<<"il n'est relié à aucune arête sélectionnée"< récupération des faces du sommet pour compter le nombre de faces candidates à l'ogrid std::vector cofaces; sommet->getCoFaces(cofaces); - if (cofaces.size() > 1) { + int nb_selected = 0; + for (auto f1 : cofaces) { + for (auto f2 : m_cofaces) { + if (f1 == f2) nb_selected++; + } + } + + if (nb_selected > 1) { // sommets relié à 2 faces n'ayant aucune arête commune // => pas de ogrid possible TkUtil::UTF8String message (TkUtil::Charset::UTF_8); message << "Le ogrid n'est pas réalisable car 2 des faces sélectionnées ont un sommet en commun (" << sommet->getName() << ") mais pas d'arête commune."; throw TkUtil::Exception (message); } + + // il n'est relié qu'à une seule face sélectionnée Utils::Math::Point pt = (barycentre_cf + (sommet->getCoord() - barycentre_cf)*m_ratio_ogrid); newVtx = new Topo::Vertex(getContext(), pt); getInfoCommand().addTopoInfoEntity(newVtx, Internal::InfoCommand::CREATED); diff --git a/test_link/test_issue35.py b/test_link/test_issue35.py index 57ca223..5537a3f 100644 --- a/test_link/test_issue35.py +++ b/test_link/test_issue35.py @@ -58,6 +58,11 @@ def test_issue35(): tm.splitBlocksWithOgridV2 (["Bl0006", "Bl0003"], [], .5, 10) # Split non réalisé => toujours que 4 blocs assert(tm.getNbBlocks() == 4) + # Il faut vérifier que ça fonctionne toujours avec 1 seul bloc + # Découpage en O-grid du bloc structuré Bl0006 + tm.splitBlocksWithOgridV2 (["Bl0006"], [], .5, 10) + # Split réalisé => 10 blocs + assert(tm.getNbBlocks() == 10) # [3D] Test 4 : avec des splits d'arêtes # -------------------------------------- @@ -144,6 +149,11 @@ def test_issue35(): tm.splitFace("Fa0000", "Ar0001", .2, True) tm.splitAllFaces("Ar0000", .5, .5) assert(tm.getNbFaces() == 4) - # Création du ogrid non réalisé => toujours que 4 blocs + # Création du ogrid non réalisé => toujours que 4 faces tm.splitFacesWithOgrid(["Fa0003", "Fa0006"], ["Ar0004", "Ar0010", "Ar0006", "Ar0015"], .5, 10) assert(tm.getNbFaces() == 4) + # Il faut vérifier que ça fonctionne toujours avec 1 seule face + # Création du ogrid sur une seule face + tm.splitFacesWithOgrid(["Fa0003"], [], .5, 10) + # Split réalisé => 8 faces + assert(tm.getNbFaces() == 8)