Skip to content

Commit

Permalink
Fix bug when split on a single block/face
Browse files Browse the repository at this point in the history
  • Loading branch information
lelandaisb committed Jan 6, 2025
1 parent f96eb46 commit 49265e2
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 3 deletions.
13 changes: 12 additions & 1 deletion src/Core/Topo/CommandSplitBlocksWithOgrid.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -677,15 +677,26 @@ createVertices(std::map<Vertex*, uint> & 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<Block* > 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);
Expand Down
14 changes: 13 additions & 1 deletion src/Core/Topo/CommandSplitFacesWithOgrid.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -544,15 +544,27 @@ createVertices(std::map<Vertex*, uint> & filtre_vertex,
#ifdef _DEBUG_SPLIT_OGRID
std::cout<<"il n'est relié à aucune arête sélectionnée"<<std::endl;
#endif
// ce cas n'est valide que si le sommet n'est relié qu'à une seule face sélectionnée
// pas valide en cas de sommet commun à 2 faces sans arête commune
// => récupération des faces du sommet pour compter le nombre de faces candidates à l'ogrid
std::vector<CoFace* > 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);
Expand Down
12 changes: 11 additions & 1 deletion test_link/test_issue35.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
# --------------------------------------
Expand Down Expand Up @@ -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)

0 comments on commit 49265e2

Please sign in to comment.