@@ -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- /* ----------------------------------------------------------------------------*/
18886void CommandSplitBlocksWithOgrid::
18987internalExecute ()
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;
0 commit comments