00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "g-map-vertex.hh"
00026 #include "controler-gmap.hh"
00027 #include <cassert>
00028
00029 using namespace GMap3d;
00030
00031 bool CControlerGMap::merge(int ADimension)
00032 {
00033 assert(1 <= ADimension && ADimension <= 3);
00034
00035 bool res = false;
00036
00037 if (canApplyOperation(COperation(OPERATION_MERGE,
00038 SUB_OPERATION_TOPO, ADimension)))
00039 {
00040 undoRedoPreSave();
00041
00042 int nb = FMap->mergeMarkedCells(getSelectionMark(), ADimension, true);
00043
00044 if (nb == 0)
00045 {
00046 setMessage(ADimension, "-fusion impossible");
00047 undoRedoPostSaveFailed();
00048 }
00049 else
00050 {
00051 undoRedoPostSaveOk();
00052 unsetLastSelectedDart();
00053 setModelChanged();
00054 setMessage(nb, ADimension, (nb == 1 ? "-fusion effectuée" :
00055 "-fusions effectuées"));
00056 res = true;
00057 }
00058 }
00059
00060 return res;
00061 }
00062
00063 bool CControlerGMap::intuitiveMerge()
00064 {
00065 bool res = false;
00066 if (canApplyOperation(COperation(OPERATION_MERGE,
00067 SUB_OPERATION_INTUITIVE_TOPO, -1)))
00068 {
00069 undoRedoPreSave();
00070
00071 int nb = FMap->intuitiveMergeMarkedCells(getSelectionMark(), true);
00072
00073 if (nb == 0)
00074 {
00075 setMessage("Fusion intuitive impossible");
00076 undoRedoPostSaveFailed();
00077 }
00078 else
00079 {
00080 undoRedoPostSaveOk();
00081 unsetLastSelectedDart();
00082 setModelChanged();
00083 setMessage(nb, (nb == 1 ? " fusion effectuée" :
00084 " fusions effectuées"));
00085 res = true;
00086 }
00087 }
00088
00089 return res;
00090 }
00091
00092 bool CControlerGMap::mergeColinearEdges()
00093 {
00094 bool res = false;
00095
00096 if (canApplyOperation(COperation(OPERATION_MERGE_COLINEAR, 1)))
00097 {
00098 undoRedoPreSave();
00099
00100 int nb = FMap->mergeMarkedColinearEdges(getSelectionMark(), true);
00101
00102 if (nb == 0)
00103 {
00104 setMessage("Fusion d'arêtes alignées impossible");
00105 undoRedoPostSaveFailed();
00106 }
00107 else
00108 {
00109 undoRedoPostSaveOk();
00110 unsetLastSelectedDart();
00111 setModelChanged();
00112 setMessage(nb, (nb == 1 ?
00113 " fusion d'arêtes alignées effectuée" :
00114 " fusions d'arêtes alignées effectuées"));
00115 res = true;
00116 }
00117 }
00118
00119 return res;
00120 }
00121
00122 bool CControlerGMap::mergeCoplanarFaces()
00123 {
00124 bool res = false;
00125 if (canApplyOperation(COperation(OPERATION_MERGE_COLINEAR, 2)))
00126 {
00127 undoRedoPreSave();
00128
00129 int nb = FMap->mergeMarkedCoplanarFaces(getSelectionMark(), true);
00130
00131 if (nb == 0)
00132 {
00133 setMessage("Fusion de faces coplanaires impossible");
00134 undoRedoPostSaveFailed();
00135 }
00136 else
00137 {
00138 undoRedoPostSaveOk();
00139 unsetLastSelectedDart();
00140 setModelChanged();
00141 setMessage(nb, (nb == 1 ?
00142 " fusion de faces coplanaires effectuée" :
00143 " fusions de faces coplanaires effectuées"));
00144 res = true;
00145 }
00146 }
00147
00148 return res;
00149 }
00150
00151 bool CControlerGMap::delNullEdges()
00152 {
00153 bool res = false;
00154 if (canApplyOperation(COperation(OPERATION_DEL_NULL_EDGE)))
00155 {
00156 undoRedoPreSave();
00157
00158 int nb = FMap->deleteNullLengthEdges();
00159
00160 if (nb == 0)
00161 {
00162 setMessage("Pas d'arête de longueur nulle");
00163 undoRedoPostSaveFailed();
00164 }
00165 else
00166 {
00167 undoRedoPostSaveOk();
00168 setModelChanged();
00169 setMessage(nb, nb == 1 ?
00170 " arête de longueur nulle supprimée" :
00171 " arêtes de longueur nulle supprimées");
00172 res = true;
00173 }
00174 }
00175
00176 return res;
00177 }
00178
00179 bool CControlerGMap::delFlatFaces()
00180 {
00181 bool res = false;
00182 if (canApplyOperation(COperation(OPERATION_DEL_FLAT_FACES)))
00183 {
00184 undoRedoPreSave();
00185
00186 int nb = FMap->deleteFlatFaces();
00187
00188 if (nb == 0)
00189 {
00190 setMessage("Pas de face composée uniquement de deux arêtes");
00191 undoRedoPostSaveFailed();
00192 }
00193 else
00194 {
00195 undoRedoPostSaveOk();
00196 setModelChanged();
00197 setMessage(nb, nb == 1 ?
00198 " face composée uniquement de deux arêtes supprimée" :
00199 " face composée uniquement de deux arêtes supprimées");
00200 res = true;
00201 }
00202 }
00203
00204 return res;
00205 }
00206
00207 bool CControlerGMap::delFlatVolumes()
00208 {
00209 bool res = false;
00210 if (canApplyOperation(COperation(OPERATION_DEL_FLAT_VOLUMES)))
00211 {
00212 undoRedoPreSave();
00213
00214 int nb = FMap->deleteFlatVolumes();
00215
00216 if (nb == 0)
00217 {
00218 setMessage("Pas de volume composé uniquement de deux faces");
00219 undoRedoPostSaveFailed();
00220 }
00221 else
00222 {
00223 undoRedoPostSaveOk();
00224 setModelChanged();
00225 setMessage(nb, nb == 1 ?
00226 " volume composé uniquement de deux faces supprimée" :
00227 " volume composé uniquement de deux faces supprimées");
00228 res = true;
00229 }
00230 }
00231
00232 return res;
00233 }
00234
00235 bool CControlerGMap::removeMarkedEdgesWithoutDisconnection()
00236 {
00237 bool res = false;
00238
00239 if (canApplyOperation(COperation(OPERATION_MERGE_FACE_NODISCONNECTION,
00240 1)))
00241 {
00242 undoRedoPreSave();
00243
00244 int nb = FMap->removeMarkedEdgesWithoutDisconnection(getSelectionMark());
00245
00246 if (nb == 0)
00247 {
00248 setMessage("Aucune 1-suppression possible");
00249 undoRedoPostSaveFailed();
00250 }
00251 else
00252 {
00253 undoRedoPostSaveOk();
00254 unsetLastSelectedDart();
00255 setModelChanged();
00256 setMessage(nb, (nb == 1 ? " 1-suppression effectuée" :
00257 " 1-suppressions effectuées"));
00258 res = true;
00259 }
00260 }
00261
00262 return res;
00263 }
00264
00265 bool CControlerGMap::removeMarkedFacesButKeepBalls()
00266 {
00267 bool res = false;
00268
00269 if (canApplyOperation(COperation(OPERATION_REMOVE_FACES_KEEP_BALLS,
00270 1)))
00271 {
00272 undoRedoPreSave();
00273
00274 int nb = FMap->removeMarkedFacesButKeepBalls(getSelectionMark());
00275
00276 if (nb == 0)
00277 {
00278 setMessage("Aucune 2-suppression possible");
00279 undoRedoPostSaveFailed();
00280 }
00281 else
00282 {
00283 undoRedoPostSaveOk();
00284 unsetLastSelectedDart();
00285 setModelChanged();
00286 setMessage(nb, (nb == 1 ? " 2-suppression effectuée" :
00287 " 2-suppressions effectuées"));
00288 res = true;
00289 }
00290 }
00291
00292 return res;
00293 }
00294
00295 bool CControlerGMap::shiftAllEdgesIncidentToVertex()
00296 {
00297 bool res = false;
00298
00299 if (getLastSelectedDart() == NULL)
00300 {
00301 setMessage("Dernier brin sélectionné introuvable");
00302 return false;
00303 }
00304
00305 if (canApplyOperation(COperation(OPERATION_SHIFT_EDGES_INCIDENT_TO_VERTEX)))
00306 {
00307 undoRedoPreSave();
00308
00309 unsigned int nb =
00310 FMap->shiftAllEdgesIncidentToVertex(getLastSelectedDart());
00311
00312 deselectDart(getLastSelectedDart());
00313
00314 undoRedoPostSaveOk();
00315
00316 setModelChanged();
00317 setMessage(nb, (nb == 1 ? " arête décallée." :
00318 " arêtes décallées."));
00319 res = true;
00320 }
00321
00322 return res;
00323 }
00324
00325 bool CControlerGMap::removeDanglingEdges()
00326 {
00327 bool res = false;
00328
00329 if (canApplyOperation(COperation(OPERATION_REMOVE_DANGLING_EDGES)))
00330 {
00331 undoRedoPreSave();
00332
00333 int nb = FMap->removeDanglingEdges();
00334
00335 if (nb == 0)
00336 {
00337 setMessage("Aucune arête pendante supprimée");
00338 undoRedoPostSaveFailed();
00339 }
00340 else
00341 {
00342 undoRedoPostSaveOk();
00343 unsetLastSelectedDart();
00344 setModelChanged();
00345 setMessage(nb, (nb == 1 ? " arête pendante supprimée" :
00346 " arêtes pendantes supprimées"));
00347 res = true;
00348 }
00349 }
00350
00351 return res;
00352 }
00353
00354 bool CControlerGMap::contract(int ADimension)
00355 {
00356 assert(1 <= ADimension && ADimension <= 3);
00357
00358 bool res = false;
00359
00360 if (canApplyOperation(COperation(OPERATION_MERGE,
00361 SUB_OPERATION_TOPO, ADimension)))
00362 {
00363 undoRedoPreSave();
00364
00365 int nb = FMap->contractMarkedCells(getSelectionMark(), ADimension, true);
00366
00367 if (nb == 0)
00368 {
00369 setMessage(ADimension, "-contraction impossible");
00370 undoRedoPostSaveFailed();
00371 }
00372 else
00373 {
00374 undoRedoPostSaveOk();
00375 unsetLastSelectedDart();
00376 setModelChanged();
00377 setMessage(nb, ADimension, (nb == 1 ? "-contraction effectuée" :
00378 "-contractions effectuées"));
00379 res = true;
00380 }
00381 }
00382
00383 return res;
00384 }
00385
00386 bool CControlerGMap::contextContract()
00387 {
00388 bool res = false;
00389 if (canApplyOperation(COperation(OPERATION_CONTRACT,
00390 SUB_OPERATION_INTUITIVE_TOPO, -1)))
00391 {
00392 undoRedoPreSave();
00393
00394 int dim = 0;
00395 switch (getSelectionOrbit())
00396 {
00397 case ORBIT_EDGE : dim = 1; break;
00398 case ORBIT_FACE : dim = 2; break;
00399 case ORBIT_VOLUME : dim = 3; break;
00400 default: setMessage("Orbite de sélection incohérente"); return false;
00401 }
00402
00403 int nb = FMap->contractMarkedCells(getSelectionMark(), dim, true);
00404
00405 if (nb == 0)
00406 {
00407 setMessage(dim, "-contraction impossible");
00408 undoRedoPostSaveFailed();
00409 }
00410 else
00411 {
00412 undoRedoPostSaveOk();
00413 unsetLastSelectedDart();
00414 setModelChanged();
00415 setMessage(nb, dim, (nb == 1 ? "-contraction effectuée" :
00416 "-contractions effectuées"));
00417 res = true;
00418 }
00419 }
00420
00421 return res;
00422 }
00423
00424 bool CControlerGMap::insertVertex()
00425 {
00426 bool res = false;
00427 if (canApplyOperation(COperation(OPERATION_INSERT, 0)))
00428 {
00429 undoRedoPreSave();
00430
00431 int nb = FMap->insertVertexOnMarkedEdges(getSelectionMark());
00432
00433 if (nb == 0)
00434 {
00435 setMessage("Aucun sommet inséré");
00436 undoRedoPostSaveFailed();
00437 }
00438 else
00439 {
00440 undoRedoPostSaveOk();
00441 setModelChanged();
00442 setMessage(nb, nb == 1 ? " sommet inséré" : " sommets insérés");
00443 res = true;
00444 }
00445 }
00446
00447 return res;
00448 }
00449
00450 bool CControlerGMap::insertEdge()
00451 {
00452 bool res = false;
00453 if (canApplyOperation(COperation(OPERATION_INSERT, 1)))
00454 {
00455 undoRedoPreSave();
00456
00457 CDart* dart1;
00458 CDart* dart2;
00459
00460 int nb = 0;
00461
00462 if (FMap->getMarkedCells(ORBIT_SELF, getSelectionMark(),
00463 NULL, &dart1, &dart2) == 2)
00464 {
00465 if (!FMap->isSameOrbit(dart1, dart2, ORBIT_VERTEX))
00466 {
00467 nb = 1;
00468 FMap->insertEdge(dart1, dart2);
00469 }
00470 }
00471 else
00472 nb = FMap->insertEdgeOnMarkedFaces(getSelectionMark(), true, true);
00473
00474 if (nb == 0)
00475 {
00476 setMessage("Aucune arête insérée");
00477 undoRedoPostSaveFailed();
00478 }
00479 else
00480 {
00481 undoRedoPostSaveOk();
00482 setModelChanged();
00483 setMessage(nb, nb == 1 ? " arête insérée" : " arêtes insérées");
00484 res = true;
00485 }
00486 }
00487
00488 return res;
00489 }
00490
00491 bool CControlerGMap::insertFace()
00492 {
00493 bool res = false;
00494 if (canApplyOperation(COperation(OPERATION_INSERT, 2)))
00495 {
00496 undoRedoPreSave();
00497
00498 int nb =
00499 FMap->insertFaceOnMarkedVolumes(getSelectionMark(), true, true, true);
00500
00501 if (nb == 0)
00502 {
00503 setMessage("Aucune face insérée");
00504 undoRedoPostSaveFailed();
00505 }
00506 else
00507 {
00508 undoRedoPostSaveOk();
00509 setModelChanged();
00510 setMessage(nb, nb == 1 ? " face insérée" : " faces insérées");
00511 res = true;
00512 }
00513 }
00514
00515 return res;
00516 }
00517
00518 bool CControlerGMap::intuitiveStopUp()
00519 {
00520 bool res = false;
00521 if (canApplyOperation(COperation(OPERATION_STOP_UP,
00522 SUB_OPERATION_INTUITIVE_TOPO, -1)))
00523 {
00524 undoRedoPreSave();
00525
00526 int nb = FMap->intuitiveStopUpMarkedBorders(getSelectionMark());
00527
00528 if (nb == 0)
00529 {
00530 setMessage("Aucun bord fermé");
00531 undoRedoPostSaveFailed();
00532 }
00533 else
00534 {
00535 undoRedoPostSaveOk();
00536 setModelChanged();
00537 setMessage(nb, nb == 1 ? " bord fermé" : " bords fermés");
00538 res = true;
00539 }
00540 }
00541
00542 return res;
00543 }
00544
00545 bool CControlerGMap::stopUp(int ADimension)
00546 {
00547 bool res = false;
00548 if (canApplyOperation(COperation(OPERATION_STOP_UP, ADimension)))
00549 {
00550 undoRedoPreSave();
00551
00552 int nb = FMap->stopUpMarkedBorders(getSelectionMark(), ADimension);
00553
00554 if (nb == 0)
00555 {
00556 setMessage("Aucun ", ADimension, "-bord bouché");
00557 undoRedoPostSaveFailed();
00558 }
00559 else
00560 {
00561 undoRedoPostSaveOk();
00562 setModelChanged();
00563 setMessage(nb, ADimension, nb == 1 ? "-bord bouché" :
00564 "-bords bouchés");
00565 res = true;
00566 }
00567 }
00568
00569 return res;
00570 }
00571
00572