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 void CControlerGMap::setSelectionLevel(int ALevel)
00032 {
00033 assert(0 <= ALevel && ALevel < getNbSelectionLevels());
00034
00035 if (ALevel != getSelectionLevel() &&
00036 canApplyOperation(COperation(OPERATION_SELECT,
00037 SUB_OPERATION_SET_SELECTION_LEVEL, -1)))
00038 {
00039 FParameterSelection->setSelectionLevel(ALevel);
00040 char message[64];
00041 sprintf(message, "Niveau de sélection : %d", ALevel + 1);
00042 setSelectionChanged();
00043 setMessage(message);
00044 }
00045 }
00046
00047 void CControlerGMap::setNextSelectionLevel(int AIndex)
00048 {
00049 setSelectionLevel(getNextSelectionLevel(AIndex));
00050 }
00051
00052 bool CControlerGMap::unmarkAllCurrentSelectionLevel()
00053 {
00054 if (canApplyOperation(COperation(OPERATION_SELECT,
00055 SUB_OPERATION_REINIT_SELECTION, -1)))
00056 {
00057 FMap->unmarkAll(getSelectionMark());
00058 unsetLastSelectedDart();
00059 setSelectionChanged();
00060 setMessage("Brins démarqués");
00061 return true;
00062 }
00063
00064 return false;
00065 }
00066
00067 bool CControlerGMap::negateAllCurrentSelectionLevel()
00068 {
00069 if (canApplyOperation(COperation(OPERATION_SELECT,
00070 SUB_OPERATION_NEGATE_SELECTION, -1)))
00071 {
00072 int mark = getSelectionMark();
00073
00074 FMap->negateMaskMark(mark);
00075
00076 CDart* last = getLastSelectedDart();
00077 if (last != NULL)
00078 unsetLastSelectedDart();
00079
00080 setSelectionChanged();
00081 setMessage("Marque inversée");
00082 return true;
00083 }
00084
00085 return false;
00086 }
00087
00088 bool CControlerGMap::swapSelectionLevels(int ALevel1, int ALevel2)
00089 {
00090 if (canApplyOperation(COperation(OPERATION_SELECT,
00091 SUB_OPERATION_SWAP_SELECTIONS, -1)))
00092 {
00093
00094
00095 int mark1 = getSelectionMark(ALevel1);
00096 int mark2 = getSelectionMark(ALevel2);
00097 CDynamicCoverageAll it(FMap);
00098 while (it.cont())
00099 {
00100 bool t = FMap->isMarked(*it, mark1);
00101 FMap->setMarkTo(*it, mark1, FMap->isMarked(*it, mark2));
00102 FMap->setMarkTo(*it, mark2, t);
00103 ++it;
00104 }
00105
00106
00107 FParameterSelection->swapLevels(ALevel1, ALevel2);
00108 setSelectionChanged();
00109
00110 char message[64];
00111 sprintf(message, "Échange des niveaux de sélection %d et %d",
00112 ALevel1, ALevel2);
00113 setMessage(message);
00114 return true;
00115 }
00116
00117 return false;
00118 }
00119
00120 bool CControlerGMap::swapCurrentSelectionLevelWithNext()
00121 {
00122 return swapSelectionLevels(getSelectionLevel(), getNextSelectionLevel(1));
00123 }
00124
00125 bool CControlerGMap::selectIncidents()
00126 {
00127 if (canApplyOperation(COperation(OPERATION_SELECT,
00128 SUB_OPERATION_SELECT_INCIDENTS, -1)))
00129 {
00130 FMap->markIncidentCells(getSelectionOrbit(), getSelectionMark());
00131 setMessage("Cellules incidentes marquées");
00132 setSelectionChanged();
00133 return true;
00134 }
00135
00136 return false;
00137 }
00138
00139 bool CControlerGMap::selectBorders(int ADimension)
00140 {
00141 assert(0 <= ADimension && ADimension <= 3);
00142
00143 if (canApplyOperation(COperation(OPERATION_SELECT,
00144 SUB_OPERATION_BORDERS, ADimension)))
00145 {
00146 if (FMap->markBorders(getSelectionMark(), ADimension))
00147 {
00148 setSelectionChanged();
00149 setMessage(ADimension,
00150 "-bords incidents aux brins sélectionnés marqués");
00151 return true;
00152 }
00153 else
00154 {
00155 setMessage("Aucun bord marqué");
00156 return false;
00157 }
00158 }
00159
00160 return false;
00161 }
00162
00163 bool CControlerGMap::intuitiveSelectBorders()
00164 {
00165 if (canApplyOperation(COperation(OPERATION_SELECT,
00166 SUB_OPERATION_BORDERS, -1)))
00167 {
00168 if (FMap->markBorders(getSelectionMark()))
00169 {
00170 setSelectionChanged();
00171 setMessage("Bords incidents aux brins sélectionnés marqués");
00172 return true;
00173 }
00174 else
00175 {
00176 setMessage("Aucun bord marqué");
00177 return false;
00178 }
00179 }
00180
00181 return false;
00182 }
00183
00184 bool CControlerGMap::selectNonPlanarFaces()
00185 {
00186 if (canApplyOperation(COperation(OPERATION_SELECT,
00187 SUB_OPERATION_SELECT_NON_PLANAR_FACES,
00188 -1)))
00189 {
00190 if (FMap->markNonPlanarPolylines(getSelectionMark()))
00191 {
00192 setMessage("Faces non planes ajoutées à la sélection");
00193 setSelectionChanged();
00194 return true;
00195 }
00196 else
00197 {
00198 setMessage("Pas de face non plane");
00199 return false;
00200 }
00201 }
00202
00203 return false;
00204 }
00205
00206 bool CControlerGMap::markInterior(int ADimension)
00207 {
00208 if (canApplyOperation(COperation(OPERATION_SELECT,
00209 SUB_OPERATION_SELECT_INTERIOR,
00210 ADimension)))
00211 {
00212 if (getLastSelectedDart() == NULL)
00213 {
00214 setMessage("Un brin 'last' doit être sélectionné");
00215 return false;
00216 }
00217
00218 FMap->markInterior(getLastSelectedDart(),
00219 ADimension, getSelectionMark());
00220
00221 setSelectionChanged();
00222 setMessage("Intérieur sélectionné");
00223 return true;
00224 }
00225
00226 return false;
00227 }
00228
00229 bool CControlerGMap::markIntersection(int AInitialDim, int AFinalDim)
00230 {
00231 if (canApplyOperation(COperation(OPERATION_SELECT,
00232 SUB_OPERATION_SELECT_INTERSECTION, -1)))
00233 {
00234 if (!((1 <= AInitialDim && AInitialDim <= 3) &&
00235 (0 <= AFinalDim && AFinalDim <= 2) &&
00236 (AInitialDim != AFinalDim)))
00237 {
00238 setMessage("Sélection de l'intersection impossible");
00239 return false;
00240 }
00241
00242 int mark1 = getSelectionMark();
00243 int mark2 = getNextSelectionMark(1);
00244 int markR = FMap->getNewMark();
00245
00246 TOrbit orbit1 = ORBIT_CELL[AInitialDim];
00247 TOrbit orbit2 = ORBIT_CELL[AFinalDim ];
00248
00249 undoRedoPreSave();
00250 FMap->markIntersection(mark1, mark2, orbit1, orbit2, markR, true);
00251 FMap->markCopy(markR, mark1);
00252 undoRedoPostSaveOk();
00253
00254 setSelectionChanged();
00255 setMessage("Intersection sélectionnée");
00256 return true;
00257 }
00258
00259 return false;
00260 }
00261
00262 bool CControlerGMap::findMotifOff(const char* AFilename)
00263 {
00264 if (canApplyOperation(COperation(OPERATION_FIND_MOTIF_OFF)))
00265 {
00266 CGMapVertex motif;
00267 if (!motif.importOff(AFilename))
00268 {
00269 setMessage("Erreur de chargement du fichier Off.");
00270 return false;
00271 }
00272 undoRedoPreSave();
00273 int index = motif.findMotif(FMap);
00274 undoRedoPostSaveOk();
00275
00276 if (index == -1)
00277 setMessage("Motif non trouvé dans la carte courante.");
00278 else
00279 {
00280 setMessage("Motif trouvé.");
00281 for (CDynamicCoverageAll it(&motif); it.cont(); ++it)
00282 {
00283 assert(motif.getDirectInfo(*it, index) != NULL);
00284 FMap->setMark(motif.getDirectInfoAsDart(*it, index),
00285 getSelectionMark());
00286 }
00287 motif.freeDirectInfo(index);
00288 setSelectionChanged();
00289 }
00290 return true;
00291 }
00292 return false;
00293 }
00294
00295 bool CControlerGMap::findMotifMoka(const char* AFilename)
00296 {
00297 if (canApplyOperation(COperation(OPERATION_FIND_MOTIF_MOKA)))
00298 {
00299 CGMapVertex motif;
00300 TSaveFormat format = CGMapVertex::getFileFormat(AFilename);
00301 if (motif.load(AFilename, format)==NULL)
00302 {
00303 setMessage("Erreur de chargement du fichier.");
00304 return false;
00305 }
00306 undoRedoPreSave();
00307 int index = motif.findMotif(FMap);
00308 undoRedoPostSaveOk();
00309
00310 if (index == -1)
00311 setMessage("Motif non trouvé dans la carte courante.");
00312 else
00313 {
00314 setMessage("Motif trouvé.");
00315 for (CDynamicCoverageAll it(&motif); it.cont(); ++it)
00316 {
00317 assert(motif.getDirectInfo(*it, index) != NULL);
00318 FMap->setMark(motif.getDirectInfoAsDart(*it, index),
00319 getSelectionMark());
00320 }
00321 motif.freeDirectInfo(index);
00322 setSelectionChanged();
00323 }
00324 return true;
00325 }
00326 return false;
00327 }
00328
00329 bool CControlerGMap::countNumberOfMotifsMoka(const char* AFilename)
00330 {
00331 if (canApplyOperation(COperation(OPERATION_FIND_MOTIF_MOKA)))
00332 {
00333 CGMapVertex motif;
00334 TSaveFormat format = CGMapVertex::getFileFormat(AFilename);
00335 if (motif.load(AFilename, format)==NULL)
00336 {
00337 setMessage("Erreur de chargement du fichier.");
00338 return false;
00339 }
00340 undoRedoPreSave();
00341 unsigned int res = motif.countNumberOfMotifs(FMap);
00342 undoRedoPostSaveOk();
00343
00344 if (res == 0)
00345 setMessage("Motif non trouvé dans la carte courante.");
00346 else
00347 {
00348 setMessage("Motif trouvé ", res, " fois.");
00349 }
00350 return true;
00351 }
00352 return false;
00353 }
00354
00355 bool CControlerGMap::countNumberOfMotifsOff(const char* AFilename)
00356 {
00357 if (canApplyOperation(COperation(OPERATION_FIND_MOTIF_OFF)))
00358 {
00359 CGMapVertex motif;
00360 if (!motif.importOff(AFilename))
00361 {
00362 setMessage("Erreur de chargement du fichier Off.");
00363 return false;
00364 }
00365 undoRedoPreSave();
00366 unsigned int res = motif.countNumberOfMotifs(FMap);
00367 undoRedoPostSaveOk();
00368
00369 if (res == 0)
00370 setMessage("Motif non trouvé dans la carte courante.");
00371 else
00372 {
00373 setMessage("Motif trouvé ", res, " fois.");
00374 }
00375 return true;
00376 }
00377 return false;
00378 }
00379