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::contextTriangulate()
00032 {
00033 switch (getSelectionOrbit())
00034 {
00035 case ORBIT_EDGE : return triangulate(1); break;
00036 case ORBIT_FACE : return triangulate(2); break;
00037 case ORBIT_VOLUME : return triangulate(3); break;
00038 default: setMessage("Orbite de sélection incohérente");
00039 }
00040 return false;
00041 }
00042
00043 bool CControlerGMap::triangulate(int ADimension)
00044 {
00045 bool res = false;
00046
00047 if (canApplyOperation(COperation(OPERATION_TRIANGULATE, ADimension)))
00048 {
00049 undoRedoPreSave();
00050
00051 int nb = FMap->triangulateMarkedCells(getSelectionMark(), ADimension);
00052
00053 if (nb==0)
00054 {
00055 setMessage("Aucune ",ADimension,"-cellule triangulée");
00056 undoRedoPostSaveFailed();
00057 }
00058 else
00059 {
00060 undoRedoPostSaveOk();
00061
00062 setModelChanged();
00063 setMessage(nb, ADimension, nb==1 ?
00064 "-cellule triangulée" :
00065 "-cellules triangulées");
00066 res = true;
00067 }
00068 }
00069
00070 return res;
00071 }
00072
00073 bool CControlerGMap::quadrangulateFaces()
00074 {
00075 bool res = false;
00076
00077 if (canApplyOperation(COperation(OPERATION_QUADRANGULATE,
00078 SUB_OPERATION_QUADRANGULATE_FACES, -1)))
00079 {
00080 undoRedoPreSave();
00081
00082 int nb = FMap->quadrangulateMarkedFaces(getSelectionMark());
00083
00084 if (nb==0)
00085 {
00086 setMessage("Aucune face quadrangulée");
00087 undoRedoPostSaveFailed();
00088 }
00089 else
00090 {
00091 undoRedoPostSaveOk();
00092
00093 setModelChanged();
00094 setMessage(nb, nb==1 ? " face quadrangulée" : " faces quadrangulées");
00095 res = true;
00096 }
00097 }
00098
00099 return res;
00100 }
00101
00102 bool CControlerGMap::basicQuadrangulateFaces()
00103 {
00104 bool res = false;
00105
00106 if (canApplyOperation(COperation(OPERATION_QUADRANGULATE,
00107 SUB_OPERATION_QUADRANGULATE_FACES_BASIC, -1)))
00108 {
00109 undoRedoPreSave();
00110
00111 int nb = FMap->quadrangulateMarkedFaces(getSelectionMark(), false);
00112
00113 if (nb==0)
00114 {
00115 setMessage("Aucune face quadrangulée");
00116 undoRedoPostSaveFailed();
00117 }
00118 else
00119 {
00120 undoRedoPostSaveOk();
00121
00122 setModelChanged();
00123 setMessage(nb, nb==1 ? " face quandrangulée" : " faces quadrangulées");
00124 res = true;
00125 }
00126 }
00127
00128 return res;
00129 }
00130
00131 bool CControlerGMap::swapEdge()
00132 {
00133 bool res = false;
00134
00135 if (canApplyOperation(COperation(OPERATION_TRIANGULATION,
00136 SUB_OPERATION_TRIANGULATION_SWAP_EDGE, -1))) {
00137 CDart *d;
00138
00139 if (FMap->getMarkedCells(ORBIT_EDGE, getSelectionMark(), NULL, &d) != 1) {
00140 setMessage("Sélection d'arête incohérente");
00141 return false;
00142 }
00143
00144 undoRedoPreSave();
00145
00146 if (FMap->swapEdge(d)) {
00147 undoRedoPostSaveOk();
00148 setModelChanged();
00149 setMessage("Arête tournée");
00150 res = true;
00151 }
00152 else {
00153 undoRedoPostSaveFailed();
00154 setMessage("Impossible de tourner l'arête");
00155 }
00156
00157 assert(isMapOk());
00158 }
00159
00160 return res;
00161 }
00162
00163 bool CControlerGMap::triangulateGeoFaces()
00164 {
00165 if (canApplyOperation(COperation(OPERATION_TRIANGULATION,
00166 SUB_OPERATION_TRIANGULATION_GEO_FACES, -1)))
00167 {
00168
00169
00170
00171 undoRedoPreSave();
00172 FMap->triangulateMarkedFaces(getSelectionMark());
00173 undoRedoPostSaveOk();
00174
00175
00176
00177 setModelChanged();
00178 setMessage("Faces triangulées");
00179 return true;
00180 }
00181
00182 return false;
00183 }
00184