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::intuitiveTopoSew()
00032 {
00033 if (canApplyOperation(COperation(OPERATION_SEW,
00034 SUB_OPERATION_INTUITIVE_TOPO, -1)))
00035 {
00036 CDart * dart1, * dart2;
00037
00038 if (getDartsForSew(& dart1, & dart2))
00039 {
00040 int dim = FMap->getSewDimension(dart1, dart2);
00041 if (dim!=4)
00042 {
00043 undoRedoPreSave();
00044 FMap->sew(dart1, dart2, dim);
00045 undoRedoPostSaveOk();
00046 unmarkAllCurrentSelectionLevel();
00047
00048 setModelChanged();
00049 setMessage("Couture intuitive effectuée");
00050 return true;
00051 }
00052 }
00053 }
00054
00055 return false;
00056 }
00057
00058 bool CControlerGMap::topoSew(int ADimension)
00059 {
00060 assert(0 <= ADimension && ADimension <= 3);
00061
00062 if (canApplyOperation(COperation(OPERATION_SEW, SUB_OPERATION_TOPO,
00063 ADimension)))
00064 {
00065 CDart * dart1, * dart2;
00066
00067 if (getDartsForSew(& dart1, & dart2))
00068 {
00069 if (FMap->canSew(dart1, dart2, ADimension))
00070 {
00071 undoRedoPreSave();
00072 FMap->sew(dart1, dart2, ADimension);
00073 undoRedoPostSaveOk();
00074 unmarkAllCurrentSelectionLevel();
00075
00076 setModelChanged();
00077 setMessage("Couture effectuée");
00078 return true;
00079 }
00080 }
00081 }
00082
00083 return false;
00084 }
00085
00086 bool CControlerGMap::intuitiveGeoSew()
00087 {
00088 if (canApplyOperation(COperation(OPERATION_SEW,
00089 SUB_OPERATION_INTUITIVE_GEO, -1)))
00090 {
00091 CDart * dart1, * dart2;
00092
00093 if (getDartsForSew(& dart1, & dart2))
00094 {
00095 int dim = FMap->getSewDimension(dart1, dart2);
00096 if (dim!=4)
00097 {
00098 undoRedoPreSave();
00099 FMap->geoSew(dart1, dart2, dim,
00100 getParameterOperations()->getRotateCells(),
00101 getParameterOperations()->getScaleCells(),
00102 getParameterOperations()->getTranslateCells());
00103 undoRedoPostSaveOk();
00104 unmarkAllCurrentSelectionLevel();
00105
00106 setModelChanged();
00107 setMessage("Couture intuitive avec placage effectuée");
00108 return true;
00109 }
00110 }
00111 }
00112
00113 return false;
00114 }
00115
00116 bool CControlerGMap::geoSew(int ADimension)
00117 {
00118 assert(0 < ADimension && ADimension <= 3);
00119
00120 if (canApplyOperation(COperation(OPERATION_SEW, SUB_OPERATION_GEO,
00121 ADimension)))
00122 {
00123 CDart * dart1, * dart2;
00124
00125 if (getDartsForSew(& dart1, & dart2))
00126 {
00127 if (FMap->canSew(dart1, dart2, ADimension))
00128 {
00129 undoRedoPreSave();
00130 FMap->geoSew(dart1, dart2, ADimension,
00131 getParameterOperations()->getRotateCells(),
00132 getParameterOperations()->getScaleCells(),
00133 getParameterOperations()->getTranslateCells());
00134 undoRedoPostSaveOk();
00135 unmarkAllCurrentSelectionLevel();
00136
00137 setModelChanged();
00138 setMessage("Couture avec placage effectuée");
00139 return true;
00140 }
00141 }
00142 }
00143
00144 return false;
00145 }
00146
00147 bool CControlerGMap::intuitiveUnsew()
00148 {
00149 bool res = false;
00150
00151 if (canApplyOperation(COperation(OPERATION_UNSEW,
00152 SUB_OPERATION_INTUITIVE_TOPO, -1)))
00153 {
00154 undoRedoPreSave();
00155
00156 int nb = FMap->intuitiveUnsewMarkedCells(getSelectionMark());
00157
00158 if (nb==0)
00159 {
00160 setMessage("Aucune décousure effectuée");
00161 undoRedoPostSaveFailed();
00162 }
00163 else
00164 {
00165 undoRedoPostSaveOk();
00166
00167 setModelChanged();
00168 res = true;
00169 setMessage(nb, (nb==1 ?
00170 " décousure intuitive effectuée" :
00171 " décousures intuitive effectuées"));
00172 }
00173 }
00174
00175 return res;
00176 }
00177
00178 bool CControlerGMap::unsew(int ADimension)
00179 {
00180 assert(ADimension>=0 && ADimension<=3);
00181
00182 bool res = false;
00183
00184 if (canApplyOperation(COperation(OPERATION_UNSEW, SUB_OPERATION_TOPO,
00185 ADimension)))
00186 {
00187 undoRedoPreSave();
00188
00189 int nb = FMap->unsewMarkedCells(getSelectionMark(), ADimension);
00190
00191 if (nb==0)
00192 {
00193 setMessage("Aucune décousure effectuée");
00194 undoRedoPostSaveFailed();
00195 }
00196 else
00197 {
00198 undoRedoPostSaveOk();
00199
00200 setModelChanged();
00201 res = true;
00202 setMessage(nb, (nb==1 ?
00203 " décousure effectuée" :
00204 " décousures effectuées"));
00205 }
00206 }
00207
00208 return res;
00209 }
00210
00211 bool CControlerGMap::invertLastOperation()
00212
00213
00214 {
00215 if (!canApplyOperation(COperation(OPERATION_INVERT_LAST_OPERATION)))
00216 return false;
00217
00218 if (FLastOperation.getType()!=OPERATION_SEW &&
00219 FLastOperation.getType()!=OPERATION_PLATE)
00220 {
00221 setMessage("Dernière opération effectuée non inversible");
00222 return false;
00223 }
00224
00225 COperation toReevaluate(FLastOperation);
00226 basicUndo();
00227 CDart *d1, *d2;
00228
00229 if (FMap->getMarkedCells(ORBIT_SELF, getSelectionMark(),
00230 getLastSelectedDart(), &d2,&d1) != 2)
00231 {
00232 setMessage("Sélection incohérente [???]");
00233 basicRedo();
00234 return false;
00235 }
00236
00237 deselectDart(d2);
00238 selectDart(FMap->alpha0(d2));
00239
00240 if (!applyOperation(toReevaluate))
00241 {
00242 setMessage("Inversion de la dernière opération impossible");
00243 return false;
00244 }
00245
00246 setMessage("Inversion de la dernière opération effectuée");
00247 return true;
00248 }
00249
00250 bool CControlerGMap::invertLastOperationGeometry()
00251
00252 {
00253 if (!canApplyOperation(COperation(OPERATION_INVERT_LAST_OPERATION)))
00254 return false;
00255
00256 if (FLastOperation.getType()!=OPERATION_SEW &&
00257 FLastOperation.getType()!=OPERATION_PLATE)
00258 {
00259 setMessage("Dernière opération effectuée non inversible");
00260 return false;
00261 }
00262
00263 COperation toReevaluate(FLastOperation);
00264 basicUndo();
00265 CDart *d1, *d2;
00266
00267 if (FMap->getMarkedCells(ORBIT_SELF, getSelectionMark(),
00268 getLastSelectedDart(), &d2,&d1) != 2)
00269 {
00270 setMessage("Sélection incohérente [???]");
00271 basicRedo();
00272 return false;
00273 }
00274
00275 selectDart(d1);
00276
00277 if (!applyOperation(toReevaluate))
00278 {
00279 setMessage("Inversion de la dernière opération impossible");
00280 return false;
00281 }
00282
00283 setMessage("Inversion de la dernière opération effectuée");
00284 return true;
00285 }
00286
00287 bool CControlerGMap::topoSewBorders(int ADimension)
00288 {
00289 assert( ADimension==1 || ADimension==2 );
00290
00291 if (canApplyOperation(COperation(OPERATION_SEW, SUB_OPERATION_TOPO_BORDERS,
00292 ADimension)))
00293 {
00294 CDart *d1, *d2;
00295
00296 if (FMap->getMarkedCells(ORBIT_SELF, getSelectionMark(),
00297 getLastSelectedDart(), &d2,&d1) != 2)
00298 {
00299 setMessage("Sélection incohérente");
00300 return false;
00301 }
00302
00303 if (FMap->getBorderDimension(d1)!=ADimension ||
00304 !FMap->canSewBorders(d1,d2, ADimension))
00305 {
00306 setMessage("Bords impossible à coudre");
00307 return false;
00308 }
00309
00310 undoRedoPreSave();
00311 FMap->intuitiveBorderSew(d1,d2);
00312 undoRedoPostSaveOk();
00313 unmarkAllCurrentSelectionLevel();
00314
00315 setModelChanged();
00316 setMessage("Bords cousus");
00317 return true;
00318 }
00319
00320 return false;
00321 }
00322
00323 bool CControlerGMap::geoSewBorders(int ADimension)
00324 {
00325 assert( ADimension==1 || ADimension==2 );
00326
00327 if (canApplyOperation(COperation(OPERATION_SEW, SUB_OPERATION_GEO_BORDERS,
00328 ADimension)))
00329 {
00330 CDart *d1, *d2;
00331
00332 if (FMap->getMarkedCells(ORBIT_SELF, getSelectionMark(),
00333 getLastSelectedDart(), &d2,&d1) != 2)
00334 {
00335 setMessage("Sélection incohérente");
00336 return false;
00337 }
00338
00339 if (FMap->getBorderDimension(d1)!=ADimension ||
00340 !FMap->canSewBorders(d1,d2, ADimension))
00341 {
00342 setMessage("Bords impossible à coudre");
00343 return false;
00344 }
00345
00346 undoRedoPreSave();
00347 FMap->intuitiveGeoBorderSew(d1,d2,
00348 getParameterOperations()->getRotateCells(),
00349 getParameterOperations()->getScaleCells(),
00350 getParameterOperations()->getTranslateCells());
00351 undoRedoPostSaveOk();
00352 unmarkAllCurrentSelectionLevel();
00353
00354 setModelChanged();
00355 setMessage("Bords cousus");
00356 return true;
00357 }
00358
00359 return false;
00360 }
00361