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 "controler-gmap.hh"
00026 #include "g-map-vertex.hh"
00027 #include "parameter-selection.hh"
00028 #include "view-precompile.hh"
00029 using namespace std;
00030 using namespace GMap3d;
00031
00032 static string textOrbit[16] =
00033 {
00034 "Brin", "0", "1", "01",
00035 "2", "02", "12", "Volume",
00036 "3", "03", "13", "Face",
00037 "23", "Arête", "Sommet", "Composante connexe"
00038 };
00039
00040 int CControlerGMap::getNbSelectionLevels() const
00041 { return FParameterSelection->getNbSelectionLevels(); }
00042
00043 int CControlerGMap::getSelectionLevel() const
00044 { return FParameterSelection->getSelectionLevel(); }
00045
00046 int CControlerGMap::getNextSelectionLevel(int AIndex) const
00047 { return FParameterSelection->getNextSelectionLevel(AIndex); }
00048
00049 TOrbit CControlerGMap::getSelectionOrbit() const
00050 { return FParameterSelection->getSelectionOrbit(); }
00051
00052 void CControlerGMap::setSelectionOrbit(TOrbit AOrbit)
00053 {
00054 FParameterSelection->setSelectionOrbit(AOrbit);
00055
00056 string message("Orbite sélectionnée : Orbite ");
00057 setMessage(message + textOrbit[getSelectionOrbit()]);
00058 }
00059
00060 void CControlerGMap::setNextSelectionOrbit()
00061 {
00062 FParameterSelection->setNextSelectionOrbit();
00063
00064 string message("Orbite sélectionnée : Orbite ");
00065 setMessage(message + textOrbit[getSelectionOrbit()]);
00066 }
00067
00068 bool CControlerGMap::getHalfSelectionOrbit() const
00069 { return FParameterSelection->getHalfSelection(); }
00070
00071 void CControlerGMap::setHalfSelectionOrbit(bool ABool)
00072 { FParameterSelection->setHalfSelection(ABool); }
00073
00074 int CControlerGMap::getSelectionMark() const
00075 { return FParameterSelection->getSelectionMark(); }
00076
00077 int CControlerGMap::getSelectionMark(int ALevel) const
00078 { return FParameterSelection->getSelectionMark(ALevel); }
00079
00080 int CControlerGMap::getNextSelectionMark(int AIndex) const
00081 { return FParameterSelection->getNextSelectionMark(AIndex); }
00082
00083 CDart* CControlerGMap::getLastSelectedDart() const
00084 { return FParameterSelection->getLastSelectedDart(); }
00085
00086 CDart* CControlerGMap::getLastSelectedDart(int ALevel) const
00087 { return FParameterSelection->getLastSelectedDart(ALevel); }
00088
00089 CDart* CControlerGMap::getNextLastSelectedDart(int AIndex) const
00090 { return FParameterSelection->getNextLastSelectedDart(AIndex); }
00091
00092 void CControlerGMap::unsetLastSelectedDart()
00093 { FParameterSelection->unsetLastSelectedDart(); }
00094
00095 void CControlerGMap::unsetLastSelectedDart(int ALevel)
00096 { FParameterSelection->unsetLastSelectedDart(ALevel); }
00097
00098 void CControlerGMap::unsetNextLastSelectedDart(int AIndex)
00099 { FParameterSelection->unsetNextLastSelectedDart(AIndex); }
00100
00101 void CControlerGMap::unsetAllLastSelectedDarts()
00102 { FParameterSelection->unsetAllLastSelectedDarts(); }
00103
00104 bool CControlerGMap::isDartSelected(CDart* ADart) const
00105 { return FMap->isMarked(ADart, getSelectionMark()); }
00106
00107 bool CControlerGMap::isDartSelected(CDart* ADart, int ALevel) const
00108 { return FMap->isMarked(ADart, getSelectionMark(ALevel)); }
00109
00110 bool CControlerGMap::isDartNextSelected(CDart* ADart, int AIndex) const
00111 { return FMap->isMarked(ADart, getNextSelectionMark(AIndex)); }
00112
00113 void CControlerGMap::selectDart(CDart* ADart)
00114 { selectDart(ADart, getSelectionLevel()); }
00115
00116 void CControlerGMap::selectDart(CDart* ADart, int ALevel)
00117 {
00118 assert(0 <= ALevel && ALevel < getNbSelectionLevels());
00119 assert(ADart != NULL);
00120
00121 if (!isDartSelected(ADart, ALevel))
00122 {
00123 FMap->setMark(ADart, getSelectionMark(ALevel));
00124 setSelectionChanged();
00125 }
00126
00127 FParameterSelection->setLastSelectedDart(ALevel, ADart);
00128 }
00129
00130 void CControlerGMap::selectNextDart(CDart* ADart, int AIndex)
00131 { selectDart(ADart, getNextSelectionLevel(AIndex)); }
00132
00133 void CControlerGMap::deselectDart(CDart* ADart)
00134 { deselectDart(ADart, getSelectionLevel()); }
00135
00136 void CControlerGMap::deselectDart(CDart* ADart, int ALevel)
00137 {
00138 assert(0 <= ALevel && ALevel < getNbSelectionLevels());
00139 assert(ADart != NULL);
00140
00141 if (isDartSelected(ADart, ALevel))
00142 {
00143 FMap->unsetMark(ADart, getSelectionMark(ALevel));
00144 setSelectionChanged();
00145
00146 if (ADart == getLastSelectedDart(ALevel))
00147 FParameterSelection->unsetLastSelectedDart(ALevel);
00148 }
00149 }
00150
00151 void CControlerGMap::deselectNextDart(CDart* ADart, int AIndex)
00152 { deselectDart(ADart, getNextSelectionLevel(AIndex)); }
00153
00154 void CControlerGMap::toggleDartSelection(CDart* ADart)
00155 { toggleDartSelection(ADart, getSelectionLevel()); }
00156
00157 void CControlerGMap::toggleDartSelection(CDart* ADart, int ALevel)
00158 {
00159 assert(0 <= ALevel && ALevel < getNbSelectionLevels());
00160 assert(ADart != NULL);
00161
00162 if (isDartSelected(ADart, ALevel)) deselectDart(ADart, ALevel);
00163 else selectDart(ADart, ALevel);
00164 }
00165
00166 void CControlerGMap::toggleDartNextSelection(CDart* ADart, int AIndex)
00167 { toggleDartSelection(ADart, getNextSelectionLevel(AIndex)); }
00168
00169 void CControlerGMap::selectOrbit(CDart* ADart)
00170 { selectOrbit(ADart, getSelectionLevel()); }
00171
00172 void CControlerGMap::selectOrbit(CDart* ADart, int ALevel)
00173 {
00174 assert(0 <= ALevel && ALevel < getNbSelectionLevels());
00175 assert(ADart != NULL);
00176
00177 if (FParameterSelection->getHalfSelection() &&
00178 FMap->isOrientable(ADart, getSelectionOrbit()))
00179 FMap->halfMarkOrbit(ADart,getSelectionOrbit(),getSelectionMark(ALevel));
00180 else
00181 FMap->markOrbit(ADart, getSelectionOrbit(), getSelectionMark(ALevel));
00182
00183 FParameterSelection->setLastSelectedDart(ALevel, ADart);
00184 setSelectionChanged();
00185 }
00186
00187 void CControlerGMap::selectNextOrbit(CDart* ADart, int AIndex)
00188 { selectOrbit(ADart, getNextSelectionLevel(AIndex)); }
00189
00190 void CControlerGMap::deselectOrbit(CDart* ADart)
00191 { deselectOrbit(ADart, getSelectionLevel()); }
00192
00193 void CControlerGMap::deselectOrbit(CDart* ADart, int ALevel)
00194 {
00195 assert(0 <= ALevel && ALevel < getNbSelectionLevels());
00196 assert(ADart != NULL);
00197
00198 if (FParameterSelection->getHalfSelection() &&
00199 FMap->isOrientable(ADart, getSelectionOrbit()))
00200 FMap->halfUnmarkOrbit(ADart, getSelectionOrbit(),
00201 getSelectionMark(ALevel));
00202 else
00203 FMap->unmarkOrbit(ADart, getSelectionOrbit(), getSelectionMark(ALevel));
00204
00205 if (getLastSelectedDart(ALevel) != NULL &&
00206 !isDartSelected(getLastSelectedDart(ALevel), ALevel))
00207 FParameterSelection->unsetLastSelectedDart(ALevel);
00208
00209 setSelectionChanged();
00210 }
00211
00212 void CControlerGMap::deselectNextOrbit(CDart* ADart, int AIndex)
00213 { deselectOrbit(ADart, getNextSelectionLevel(AIndex)); }
00214
00215 void CControlerGMap::toggleOrbitSelection(CDart* ADart)
00216 { toggleOrbitSelection(ADart, getSelectionLevel()); }
00217
00218 void CControlerGMap::toggleOrbitSelection(CDart* ADart, int ALevel)
00219 {
00220 assert(0 <= ALevel && ALevel < getNbSelectionLevels());
00221 assert(ADart != NULL);
00222
00223 if (isDartSelected(ADart, ALevel)) deselectOrbit(ADart, ALevel);
00224 else selectOrbit(ADart, ALevel);
00225 }
00226
00227 void CControlerGMap::toggleOrbitNextSelection(CDart* ADart, int AIndex)
00228 { toggleOrbitSelection(ADart, getNextSelectionLevel(AIndex)); }
00229
00230 bool CControlerGMap::takeCenter(CVertex & AResult)
00231 {
00232 int sel = getNextSelectionMark(1);
00233 CDart* last = getNextLastSelectedDart(1);
00234
00235 if (last == NULL)
00236 if (FMap->getMarkedCells(ORBIT_VERTEX, sel, NULL, &last) != 1)
00237 return false;
00238
00239 AResult = * FMap->findVertex(last);
00240 return true;
00241 }
00242
00243 bool CControlerGMap::takeVector(CVertex & AResult)
00244 {
00245 int sel = getNextSelectionMark(1);
00246 CDart* last = getNextLastSelectedDart(1);
00247
00248 if (last == NULL)
00249 return false;
00250
00251 CDart* d1;
00252 CDart* d2;
00253
00254 int nb = FMap->getMarkedCells(ORBIT_VERTEX, sel, last, &d1, &d2);
00255
00256 if (nb != 1 && nb != 2)
00257 return false;
00258
00259 if (nb == 1)
00260 {
00261 if (FMap->isFree1(last))
00262 return false;
00263
00264 d2 = FMap->alpha0(d1);
00265 }
00266
00267
00268 AResult = * FMap->findVertex(d1) - * FMap->findVertex(d2);
00269 return true;
00270 }
00271
00272 void CControlerGMap::setModeDeselectionAtStop()
00273 { FDeselectMode = true; }
00274
00275 bool CControlerGMap::getModeDeselectionAtStop() const
00276 { return FDeselectMode; }
00277
00278 void CControlerGMap::modeSelectionOperationStop()
00279 {
00280 CViewPrecompile* view = FViews[FCurrentViewId];
00281
00282 if (view != NULL && FFirstX != FLastX && FFirstY != FLastY)
00283 {
00284 CDart * dart;
00285 float screen1[3], screen2[3];
00286 int xmin, ymin, xmax, ymax;
00287 CVertex v1, v2;
00288
00289 if (FFirstX < FLastX){ xmin = FFirstX; xmax = FLastX; }
00290 else { xmin = FLastX; xmax = FFirstX; }
00291 if (FFirstY < FLastY){ ymin = FFirstY; ymax = FLastY; }
00292 else { ymin = FLastY; ymax = FFirstY; }
00293
00294
00295
00296 void (CControlerGMap::*f)(CDart*);
00297 if (FDeselectMode) f = &CControlerGMap::deselectDart;
00298 else f = &CControlerGMap::selectDart;
00299
00300
00301 for (CDynamicCoverageAll coverage(FMap); coverage.cont(); ++coverage)
00302 {
00303 dart = *coverage;
00304
00305 v1 = FMap -> getBurstVertex(dart);
00306 view -> project(v1.getX(), v1.getY(), v1.getZ(), screen1);
00307
00308 if (screen1[0] >= xmin && screen1[1] >= ymin &&
00309 screen1[0] <= xmax && screen1[1] <= ymax)
00310 (this->*f)(dart);
00311 else
00312 {
00313 v2 = FMap -> computeBurstExtremity(dart);
00314 view -> project(v2.getX(), v2.getY(), v2.getZ(), screen2);
00315
00316 if (screen2[0] >= xmin && screen2[1] >= ymin &&
00317 screen2[0] <= xmax && screen2[1] <= ymax)
00318 (this->*f)(dart);
00319 }
00320 }
00321 }
00322 FDeselectMode = false;
00323 }
00324