Skip to content

Commit 8932fce

Browse files
committed
Revert Fix issue#35
The Euler characteristic check seems to produce false positive; we rollback this dev
1 parent f1018b9 commit 8932fce

File tree

3 files changed

+19
-187
lines changed

3 files changed

+19
-187
lines changed

src/Core/Topo/CommandSplitBlocksWithOgrid.cpp

Lines changed: 19 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,25 @@ CommandSplitBlocksWithOgrid(Internal::Context& c,
4444
, m_create_internal_vertices(create_internal_vertices)
4545
, m_propagate_neighbor_block(propagate_neighbor_block)
4646
{
47-
// la validité de la sélection se fera dans le preExecute
48-
m_blocs.insert(m_blocs.end(), blocs.begin(), blocs.end());
47+
if (ratio_ogrid<=0.0 || ratio_ogrid>=1.0)
48+
throw TkUtil::Exception (TkUtil::UTF8String ("Le ratio doit être dans l'interval ]0 1[", TkUtil::Charset::UTF_8));
49+
50+
if (nb_bras<=0)
51+
throw TkUtil::Exception (TkUtil::UTF8String ("Le nombre de bras doit être d'au moins 1", TkUtil::Charset::UTF_8));
52+
53+
// on ne conserve que les blocs structurés et non dégénérés
54+
for (std::vector<Topo::Block* >::iterator iter = blocs.begin();
55+
iter != blocs.end(); ++iter){
56+
Topo::Block* hb = *iter;
57+
if (hb->isStructured() && hb->getNbVertices() == 8)
58+
m_blocs.push_back(hb);
59+
else{
60+
TkUtil::UTF8String message (TkUtil::Charset::UTF_8);
61+
message <<"Il n'est pas prévu de faire un découpage en o-grid dans un bloc non structuré ou dégénéré\n";
62+
message << "("<<hb->getName()<<" n'est pas structuré)";
63+
throw TkUtil::Exception(message);
64+
}
65+
}
4966

5067
// la validité de la sélection se fera lors de la création des filtres
5168
m_cofaces.insert(m_cofaces.end(), cofaces.begin(), cofaces.end());
@@ -66,125 +83,6 @@ CommandSplitBlocksWithOgrid::
6683
{
6784
}
6885
/*----------------------------------------------------------------------------*/
69-
/* Les traitements de la méthode preExecute étaient auparavant faits dans le */
70-
/* constructeur. Or, lever une exception dans le constructeur ne permet pas */
71-
/* de récupérer le message d'erreur si la commande a été déclenchée en Python */
72-
/* (fonctionne depuis l'IHM). */
73-
void CommandSplitBlocksWithOgrid::
74-
preExecute()
75-
{
76-
if (m_ratio_ogrid<=0.0 || m_ratio_ogrid>=1.0)
77-
throw TkUtil::Exception (TkUtil::UTF8String ("Le ratio doit être dans l'interval ]0 1[", TkUtil::Charset::UTF_8));
78-
79-
if (m_nb_meshing_edges<=0)
80-
throw TkUtil::Exception (TkUtil::UTF8String ("Le nombre de bras doit être d'au moins 1", TkUtil::Charset::UTF_8));
81-
82-
// on vérifie que les blocs sont structurés et non dégénérés
83-
for (std::vector<Topo::Block* >::iterator iter = m_blocs.begin();
84-
iter != m_blocs.end(); ++iter){
85-
Topo::Block* hb = *iter;
86-
if (!(hb->isStructured() && hb->getNbVertices() == 8)){
87-
TkUtil::UTF8String message (TkUtil::Charset::UTF_8);
88-
message <<"Il n'est pas prévu de faire un découpage en o-grid dans un bloc non structuré ou dégénéré\n";
89-
message << "("<<hb->getName()<<" n'est pas structuré)";
90-
throw TkUtil::Exception(message);
91-
}
92-
}
93-
94-
// Vérification de la contrainte d'Euler sur les blocs
95-
// https://fr.wikipedia.org/wiki/Caract%C3%A9ristique_d%27Euler
96-
// Pour tout sommet s d'un bloc, on considère tous les blocs adjacents à s
97-
// comme un unique polyhèdre sur lequel on vérifie la contrainte d'Euler
98-
// cad : S - A + F = 2
99-
100-
// Recherche de tous les sommets des blocs à découper (en enlevant les doublons)
101-
std::set<Topo::Vertex*> all_vertices;
102-
for (auto bi = m_blocs.begin(); bi != m_blocs.end(); ++bi){
103-
Topo::Block* b = *bi;
104-
std::vector<Topo::Vertex* > vertices;
105-
b->getVertices(vertices);
106-
for (auto vi = vertices.begin(); vi != vertices.end(); ++vi)
107-
all_vertices.insert(*vi);
108-
}
109-
110-
// Parcours des blocs adjacents à chacun des sommets (parmi les blocs sélectionnés).
111-
// Ils sont considérés comme un unique polyhèdre
112-
// pour le calcul de la contrainte d'Euler.
113-
for (auto vi = all_vertices.begin(); vi != all_vertices.end(); ++vi){
114-
Topo::Vertex* v = *vi;
115-
// recherche de tous les blocs adjacents à v
116-
std::vector<Topo::Block* > adjacent_blocks;
117-
v->getBlocks(adjacent_blocks);
118-
// filtrage pour ne laisser que les blocs de la liste des blocs sélectionnés (m_blocs)
119-
adjacent_blocks.erase(std::remove_if(adjacent_blocks.begin(), adjacent_blocks.end(), [&](Topo::Block* b){
120-
return std::find(m_blocs.begin(), m_blocs.end(), b) == m_blocs.end();
121-
}), adjacent_blocks.end());
122-
123-
// Recherche des faces externes des blocs adjacents (= du polyhèdre)
124-
// Pour cela, effacement des faces communes
125-
std::set<Topo::CoFace*> external_faces;
126-
for (auto bi = adjacent_blocks.begin(); bi != adjacent_blocks.end(); ++bi){
127-
Topo::Block* hb = *bi;
128-
129-
std::vector<Topo::CoFace* > faces;
130-
hb->getCoFaces(faces);
131-
for (auto fi = faces.begin(); fi != faces.end(); ++fi){
132-
Topo::CoFace* f = *fi;
133-
if (external_faces.find(f) == external_faces.end())
134-
// not found
135-
external_faces.insert(f);
136-
else
137-
// found => common internal face
138-
external_faces.erase(f);
139-
}
140-
}
141-
142-
// Recherche des aretes et sommets des faces externes.
143-
// On utilise un set pour éviter les doublons.
144-
std::set<Topo::CoEdge*> external_edges;
145-
std::set<Topo::Vertex*> external_vertices;
146-
for (auto fi = external_faces.begin(); fi != external_faces.end(); ++fi){
147-
Topo::CoFace* f = *fi;
148-
149-
std::vector<Topo::CoEdge* > edges;
150-
f->getCoEdges(edges);
151-
for (auto ei = edges.begin(); ei != edges.end() ; ++ei)
152-
external_edges.insert(*ei);
153-
154-
std::vector<Topo::Vertex* > vertices;
155-
f->getVertices(vertices);
156-
for (auto vi = vertices.begin(); vi != vertices.end(); ++vi)
157-
external_vertices.insert(*vi);
158-
}
159-
160-
// Calcul de khi = S - A + F
161-
const int S = external_vertices.size();
162-
const int A = external_edges.size();
163-
const int F = external_faces.size();
164-
const int khi = S - A + F;
165-
166-
#ifdef _DEBUG_SPLIT_OGRID
167-
std::cout << "Pour " << v->getName() << std::endl;
168-
std::cout << " Faces externes des blocs adjacents :";
169-
for (auto fi = external_faces.begin(); fi != external_faces.end(); ++fi)
170-
std::cout << " " << (*fi)->getName();
171-
std::cout << std::endl;
172-
std::cout << " S=" << S << ", A=" << A << ", F=" << F << " => Khi=" << khi << std::endl;
173-
#endif
174-
175-
if (khi != 2) {
176-
TkUtil::UTF8String message (TkUtil::Charset::UTF_8);
177-
message << "La caractéristique d'Euler (S-A+F) n'est pas respectée pour les blocs adjacents à ";
178-
message << v->getName();
179-
message <<" c'est à dire le polyhèdre représenté par [";
180-
for (auto bi = adjacent_blocks.begin(); bi != adjacent_blocks.end(); ++bi)
181-
message << " " << (*bi)->getName();
182-
message << " ]. Par conséquent, réaliser un O-grid global n'est pas possible.";
183-
throw TkUtil::Exception(message);
184-
}
185-
}
186-
}
187-
/*----------------------------------------------------------------------------*/
18886
void CommandSplitBlocksWithOgrid::
18987
internalExecute()
19088
{
@@ -196,9 +94,6 @@ internalExecute()
19694
std::cout<<"CommandSplitBlocksWithOgrid::internalExecute"<<std::endl;
19795
#endif
19896

199-
// vérifications avant exécution
200-
preExecute();
201-
20297
// Filtres: à 1 pour ce qui est sur le bord et à 2 ce qui est à l'intérieur
20398
std::map<Vertex*, uint> filtre_vertex;
20499
std::map<CoEdge*, uint> filtre_coedge;

src/Core/protected/Topo/CommandSplitBlocksWithOgrid.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -70,13 +70,6 @@ class CommandSplitBlocksWithOgrid: public Topo::CommandEditTopo {
7070
virtual void getPreviewRepresentation(Utils::DisplayRepresentation& dr);
7171

7272
private:
73-
/** Les traitements de la méthode preExecute étaient auparavant faits dans le
74-
* constructeur. Or, lever une exception dans le constructeur ne permet pas
75-
* de récupérer le message d'erreur si la commande a été déclenchée en Python
76-
* (fonctionne depuis l'IHM).
77-
*/
78-
void preExecute();
79-
8073
/** Remplissage des filtres pour les sommets, arêtes communes,
8174
* faces communes et les blocs
8275
* On met à 1 ce qui est sur le bord et

test_link/test_issue35.py

Lines changed: 0 additions & 56 deletions
This file was deleted.

0 commit comments

Comments
 (0)