Moka controlers
 All Classes Namespaces Files Functions Variables Typedefs Enumerator Friends Macros
operations-geology.cc
Go to the documentation of this file.
1 /*
2  * lib-controler-gmap : Le contrôleur de 3-G-cartes, surcouche de lib-controler.
3  * Copyright (C) 2004, Moka Team, Université de Poitiers, Laboratoire SIC
4  * http://www.sic.sp2mi.univ-poitiers.fr/
5  * Copyright (C) 2009, Guillaume Damiand, CNRS, LIRIS,
6  * guillaume.damiand@liris.cnrs.fr, http://liris.cnrs.fr/
7  *
8  * This file is part of lib-controler-gmap
9  *
10  * This program is free software: you can redistribute it and/or modify
11  * it under the terms of the GNU Lesser General Public License as published by
12  * the Free Software Foundation, either version 3 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public License
21  * along with this program. If not, see <http://www.gnu.org/licenses/>.
22  */
23 
24 //******************************************************************************
25 #ifdef MODULE_GEOLOGY
26 
27 #include "g-map-vertex.hh"
28 #include "controler-gmap.hh"
29 #include "operations.hh"
30 #include "parameter-selection.hh"
31 #include "view-precompile.hh"
32 
33 #include "geology-api.hh"
34 #include "geo-tools.hh"
35 #include "corefinement-api.hh"
36 #include "corefine-3d.hh"
37 
38 using namespace GMap3d;
39 
40 //******************************************************************************
41 
43 {
46  CGeologyAPI geo(FMap);
47  CDart *d1, *d2;
48 
49  if (FMap->getMarkedCells(ORBIT_CC, getSelectionMark(), NULL, &d1) != 1) {
50  setMessage("Sélection maillage 1 incohérente");
51  return false;
52  }
53 
54  if (FMap->getMarkedCells(ORBIT_EDGE, getNextSelectionMark(1),
55  NULL, &d2) != 1) {
56  setMessage("Sélection de distance incohérente");
57  return false;
58  }
59 
60  CVertex v = *FMap->findVertex(FMap->alpha0(d2)) - *FMap->findVertex(d2);
61 
63  geo.createUncertainZone(d1, v.norm(), 5);
65 
67  setMessage("Création d'une zone d'incertitude effectuée");
68  return true;
69  }
70 
71  return false;
72 }
73 
74 //******************************************************************************
75 
77 {
80  {
81  CDart *d1, *d2;
82 
83  if (FMap->getMarkedCells(ORBIT_CC, getSelectionMark(), NULL, &d1) != 1)
84  {
85  setMessage("Sélection maillage 1 incohérente");
86  return false;
87  }
88 
89  if (FMap->getMarkedCells(ORBIT_CC, getNextSelectionMark(1),
90  NULL, &d2) != 1)
91  {
92  setMessage("Sélection maillage 2 incohérente");
93  return false;
94  }
95 
97 
98  CCorefine3d *coref = new CCorefine3d(FMap);
99 
100  coref->computeOnlyFirstIntersection(true);
101  coref->splitAndMergeMeshes(d1, d2);
102 
103  delete coref;
104 
106 
107  setModelChanged();
108  setMessage("Co-raffinement 3D effectué");
109  return true;
110  }
111 
112  return false;
113 }
114 
115 //******************************************************************************
116 
118 {
121  CGeologyAPI geo(FMap);
122  CDart *d;
123 
124  if (FMap->getMarkedCells(ORBIT_EDGE, getNextSelectionMark(1),
125  NULL, &d) != 1) {
126  setMessage("Sélection de distance incohérente");
127  return false;
128  }
129 
130  CVertex v = *FMap->findVertex(FMap->alpha0(d)) - *FMap->findVertex(d);
131 
132  undoRedoPreSave();
133  geo.extendSelectedBorders(getSelectionMark(), v.norm());
135 
136  setModelChanged();
137  setMessage("Extensions des bords effectuées");
138  return true;
139  }
140 
141  return false;
142 }
143 
144 //******************************************************************************
145 
147 {
150  CGeologyAPI geo(FMap);
151  CDart *d;
152 
153  if (FMap->getMarkedCells(ORBIT_CC, getNextSelectionMark(1),
154  NULL, &d) != 1) {
155  setMessage("Sélection de la surface incohérente");
156  return false;
157  }
158 
159  undoRedoPreSave();
160  geo.extendSelectedBordersToSurface(getSelectionMark(), d);
162 
163  setModelChanged();
164  setMessage("Extension des bords effectué");
165  return true;
166  }
167 
168  return false;
169 }
170 
171 //******************************************************************************
172 
174 {
177  CGeologyAPI geo(FMap);
178 
179  undoRedoPreSave();
180  geo.smoothSelection(getSelectionMark());
182 
183  setModelChanged();
184  setMessage("Lissage effectué");
185  return true;
186  }
187 
188  return false;
189 }
190 
191 //******************************************************************************
192 
194 {
197  CGeologyAPI geo(FMap, 1E-2);
198 
199  undoRedoPreSave();
200  geo.relaxSelection(getSelectionMark());
202 
203  setModelChanged();
204  setMessage("Relachement effectué");
205  return true;
206  }
207 
208  return false;
209 }
210 
211 //******************************************************************************
212 
214 {
217  CGeologyAPI geo(FMap);
218 // CDart *d;
219 
220 // if (FMap->getMarkedCells(ORBIT_CC, getSelectionMark(), NULL, &d) != 1) {
221 // setMessage("Sélection maillage 1 incohérente");
222 // return false;
223 // }
224 
225  undoRedoPreSave();
226  geo.optimizeSelection(getSelectionMark(), 5);
228 
229  setModelChanged();
230  setMessage("Maillage simplifié");
231  return true;
232  }
233 
234  return false;
235 }
236 
237 //******************************************************************************
238 
240 {
243  CGeoTools tools(FMap);
244 
245  undoRedoPreSave();
246  tools.centerSelectedDarts(getSelectionMark());
248 
249  setModelChanged();
250  setMessage("Centrage effectué");
251  return true;
252  }
253 
254  return false;
255 }
256 
257 //******************************************************************************
258 
260 {
263  CGeologyAPI geo(FMap);
264  CDart *d;
265  CVertex v;
266 
267  int nb = FMap->getMarkedCells(ORBIT_EDGE, getNextSelectionMark(2),
268  NULL, &d);
269 
270  if (nb > 1) {
271  setMessage("Sélection de direction incohérente");
272  return false;
273  }
274 
275  if (nb == 0) v = OZ;
276  else v = *FMap->findVertex(FMap->alpha0(d)) - *FMap->findVertex(d);
277 
278  undoRedoPreSave();
279  geo.plateVerticesOnFaces(getSelectionMark(), getNextSelectionMark(1), v);
281 
282  setModelChanged();
283  setMessage("Plaquage effectué");
284  return true;
285  }
286 
287  return false;
288 }
289 
290 //******************************************************************************
291 
293 {
296  CGeologyAPI geo(FMap);
297  CDart *d;
298  CVertex v;
299 
300  int nb = FMap->getMarkedCells(ORBIT_EDGE, getNextSelectionMark(2),
301  NULL, &d);
302 
303  if (nb != 1) {
304  setMessage("Sélection de direction incohérente");
305  return false;
306  }
307 
308  v = *FMap->findVertex(FMap->alpha0(d)) - *FMap->findVertex(d);
309 
310  undoRedoPreSave();
311  geo.plateVerticesOnEdges(getSelectionMark(), getNextSelectionMark(1), v);
313 
314  setModelChanged();
315  setMessage("Plaquage effectué");
316  return true;
317  }
318 
319  return false;
320 }
321 
322 //******************************************************************************
323 
325 {
328  CGeologyAPI geo(FMap);
329 
330  undoRedoPreSave();
331  geo.plateVerticesOnVertices(getSelectionMark(), getNextSelectionMark(1));
333 
334  setModelChanged();
335  setMessage("Plaquage effectué");
336  return true;
337  }
338 
339  return false;
340 }
341 
342 //******************************************************************************
343 
345 {
348  CGeologyAPI geo(FMap);
349 
350  geo.selectMacroVertices(getSelectionMark());
351 
352  setMessage("Selection effectuée");
354  return true;
355  }
356 
357  return false;
358 }
359 
360 //******************************************************************************
361 
363 {
366  CGeologyAPI geo(FMap);
367 
368  geo.selectAllMacroEdges(getSelectionMark());
369 
370  setMessage("Selection effectuée");
372  return true;
373  }
374 
375  return false;
376 }
377 
378 //******************************************************************************
379 
381 {
384  CGeologyAPI geo(FMap);
385 
386  geo.selectMacroEdges(getSelectionMark(), getNextSelectionMark(1));
387 
388  setMessage("Selection effectuée");
390  return true;
391  }
392 
393  return false;
394 }
395 
396 //******************************************************************************
397 
399 {
402  CGeologyAPI geo(FMap);
403 
404  geo.selectMacroFaces(getSelectionMark(), getNextSelectionMark(1));
405 
406  setMessage("Selection effectuée");
408  return true;
409  }
410 
411  return false;
412 }
413 
414 //******************************************************************************
415 
417 {
420  CGeoTools tools(FMap);
421 
422  tools.selectBordersBetweenSelectedDarts(getSelectionMark());
423 
424  setMessage("Selection des bords effectuée");
426  return true;
427  }
428 
429  return false;
430 }
431 
432 //******************************************************************************
433 bool CControlerGMap::importGr2d(const char * AFileName)
434 {
435  bool res = false;
436 
439  CGeologyAPI geo(FMap);
440 
441  undoRedoPreSave();
442 
443  if (geo.importFile(AFileName, GR2D_Format)) {
445  setModelChanged();
446  setMessage("Chargement effectué");
447  res = true;
448  }
449  else {
451  setMessage("Chargement impossible");
452  }
453 
454  assert(isMapOk());
455  }
456 
457  return res;
458 }
459 
460 //******************************************************************************
461 
462 bool CControlerGMap::importXyz(const char * AFileName)
463 {
464  bool res = false;
465 
468  CGeologyAPI geo(FMap);
469 
470  undoRedoPreSave();
471 
472  if (geo.importFile(AFileName, XYZ_Format)) {
474  setModelChanged();
475  setMessage("Chargement effectué");
476  res = true;
477  }
478  else {
480  setMessage("Chargement impossible");
481  }
482 
483  assert(isMapOk());
484  }
485 
486  return res;
487 }
488 
489 //******************************************************************************
490 
491 bool CControlerGMap::importTs(const char * AFileName)
492 {
493  bool res = false;
494 
497  CGeologyAPI geo(FMap);
498 
499  undoRedoPreSave();
500 
501  if (geo.importFile(AFileName, TS_Format)) {
503  setModelChanged();
504  setMessage("Chargement effectué");
505  res = true;
506  }
507  else {
509  setMessage("Chargement impossible");
510  }
511 
512  assert(isMapOk());
513  }
514 
515  return res;
516 }
517 
518 //******************************************************************************
519 
520 bool CControlerGMap::importCloud(const char * AFileName)
521 {
522  bool res = false;
523 
526  CGeologyAPI geo(FMap);
527 
528  undoRedoPreSave();
529 
530  if (geo.importFile(AFileName, CLOUD_Format)) {
532  setModelChanged();
533  setMessage("Chargement effectué");
534  res = true;
535  }
536  else {
538  setMessage("Chargement impossible");
539  }
540 
541  assert(isMapOk());
542  }
543 
544  return res;
545 }
546 //******************************************************************************
547 #endif // MODULE_GEOLOGY
548 //******************************************************************************