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 "precompile.hh"
00027 #include "view-precompile.hh"
00028 #include "g-map-vertex.hh"
00029 #include "parameter-selection.hh"
00030 #include "math-extension.hh"
00031
00032 #include "precompile-dart.hh"
00033 #include "precompile-face.hh"
00034 #include "precompile-preview.hh"
00035 #include "precompile-normal-vector.hh"
00036 #include "precompile-object-transformation.hh"
00037 #include "precompile-sew.hh"
00038 #include "precompile-vertex.hh"
00039 #ifdef MODULE_SPAMOD
00040 #include "precompile-spamod.hh"
00041 #endif // MODULE_SPAMOD
00042
00043 #include <cassert>
00044 #include <string>
00045 using namespace std;
00046 using namespace GMap3d;
00047
00048 bool CControlerGMap::isMapOk() const
00049 {
00050 if ( !FMap->checkTopology() )
00051 return false;
00052
00053 if ( !FMap->checkEmbeddings(ORBIT_VERTEX, ATTRIBUTE_VERTEX, true) )
00054 return false;
00055
00056 return true;
00057 }
00058
00059 bool CControlerGMap::isModelChanged() const
00060 {
00061 assert( getParameterGMapVertex()!=NULL );
00062 return getParameterGMapVertex()->getChanged();
00063 }
00064
00065 void CControlerGMap::setModelChanged()
00066 {
00067 assert( getParameterGMapVertex()!=NULL );
00068 getParameterGMapVertex()->setChanged();
00069 setSelectionChanged();
00070 }
00071
00072 void CControlerGMap::unsetModelChanged()
00073 {
00074 assert( getParameterGMapVertex()!=NULL );
00075 getParameterGMapVertex()->unsetChanged();
00076 unsetSelectionChanged();
00077 }
00078
00079 bool CControlerGMap::isPartialModelChanged() const
00080 {
00081 assert( getParameterGMapVertex()!=NULL );
00082 return getParameterGMapVertex()->getPartialChanged();
00083 }
00084
00085 void CControlerGMap::setPartialModelChanged()
00086 {
00087 assert( getParameterGMapVertex()!=NULL );
00088 getParameterGMapVertex()->setPartialChanged();
00089 }
00090
00091 void CControlerGMap::unsetPartialModelChanged()
00092 {
00093 assert( getParameterGMapVertex()!=NULL );
00094 getParameterGMapVertex()->unsetPartialChanged();
00095 }
00096
00097 void CControlerGMap::updateModelIfNeeded()
00098 {
00099
00100
00101 if ( isModelBlocked() ) return;
00102
00103 updateSelectionIfNeeded();
00104
00105 if ( isModelChanged() )
00106 {
00107 FMap->updateAllBurstDarts();
00108 unsetModelChanged();
00109 }
00110 else if ( isPartialModelChanged() )
00111 {
00112 if ( getParameterGMapVertex()->getMarkPartialChanged()!=-1 )
00113 FMap->updateMarkedBurstDarts(getParameterGMapVertex()->
00114 getMarkPartialChanged(),
00115 false);
00116 else
00117 FMap->updateAllBurstDarts();
00118
00119 unsetPartialModelChanged();
00120 }
00121 }
00122
00123 bool CControlerGMap::isSelectionChanged() const
00124 {
00125 assert( getParameterSelection()!=NULL );
00126 return getParameterSelection()->getChanged();
00127 }
00128
00129 void CControlerGMap::setSelectionChanged()
00130 {
00131 assert( getParameterSelection()!=NULL );
00132 getParameterSelection()->setChanged();
00133 }
00134
00135 void CControlerGMap::unsetSelectionChanged()
00136 {
00137 assert( getParameterSelection()!=NULL );
00138 getParameterSelection()->unsetChanged();
00139 }
00140
00141 void CControlerGMap::updateSelectionIfNeeded()
00142 {
00143
00144
00145
00146 if ( isSelectionChanged() )
00147 {
00148 int nbLevels = getNbSelectionLevels();
00149 bool validLast[nbLevels];
00150
00151 for (int i=0; i<nbLevels; ++i)
00152 validLast[i] = false;
00153
00154 FNbDarts = 0;
00155 FNbSelectedDarts = 0;
00156 FNbVertices = 0;
00157
00158 for (CDynamicCoverageAll it(FMap); it.cont(); ++it)
00159 {
00160 ++FNbDarts;
00161
00162 if (isDartSelected(*it)) ++FNbSelectedDarts;
00163
00164 if (FMap->getVertex(*it)!=NULL) ++FNbVertices;
00165
00166 for (int j=0; j<nbLevels; ++j)
00167 if (*it == getLastSelectedDart(j))
00168 validLast[j] = true;
00169 }
00170
00171 for (int k=0; k<nbLevels; ++k)
00172 if (!validLast[k])
00173 unsetLastSelectedDart(k);
00174
00175 unsetSelectionChanged();
00176 }
00177 }
00178
00179 CPrecompile* CControlerGMap::newPrecompile(TViewId AViewId,
00180 TPrecompile APrecompileType)
00181 {
00182 CPrecompile* precompile = NULL;
00183 int n;
00184
00185 switch (APrecompileType)
00186 {
00187 case PRECOMPILE_DART:
00188 n = FParameterSelection->getNbSelectionLevels();
00189 precompile =
00190 new CPrecompileDart(FParameterGMapVertex, new CParameterDart(n),
00191 FParameterSelection);
00192 break;
00193 case PRECOMPILE_FACE:
00194 precompile = new CPrecompileFace(FParameterGMapVertex,
00195 new CParameterFace);
00196 break;
00197 case PRECOMPILE_NORMAL_VECTOR:
00198 precompile = new CPrecompileNormalVector(FParameterGMapVertex,
00199 new CParameterNormalVector,
00200 FParameterSelection);
00201 break;
00202 case PRECOMPILE_OBJECT_TRANSFORMATION:
00203 precompile =
00204 new CPrecompileObjectTransformation(new CParameterObjectTransformation,
00205 FParameterTranslation,
00206 FParameterRotation,
00207 FParameterScale,
00208 FParameterPonderation);
00209 break;
00210 case PRECOMPILE_PREVIEW:
00211 precompile = new CPrecompilePreview(new CParameterPreview,
00212 FParameterObjectPosition[0],
00213 FParameterCreation,
00214 FParameterPolylinePosition);
00215 break;
00216 case PRECOMPILE_SEW:
00217 precompile = new CPrecompileSew(FParameterGMapVertex,
00218 new CParameterSew);
00219 break;
00220 #ifdef MODULE_SPAMOD
00221 case PRECOMPILE_SPAMOD:
00222 precompile = new CPrecompileSpamod(FParameterGMapVertex,
00223 new CParameterSpamod);
00224 break;
00225 #endif // MODULE_SPAMOD
00226 case PRECOMPILE_VERTEX:
00227 precompile = new CPrecompileVertex(FParameterGMapVertex,
00228 new CParameterVertex);
00229 break;
00230 default:
00231 precompile = CControler::newPrecompile(AViewId, APrecompileType);
00232 break;
00233 }
00234
00235 return precompile;
00236 }
00237
00238 bool CControlerGMap::getDartsForSew(CDart** ADart1, CDart** ADart2)
00239 {
00240 assert(ADart1 != NULL);
00241 assert(ADart2 != NULL);
00242
00243 CDart* last = getLastSelectedDart();
00244 int mark = getSelectionMark();
00245
00246 if (last == NULL ||
00247 FMap->getMarkedCells(ORBIT_SELF, mark, last, ADart2, ADart1) != 2)
00248 {
00249 setMessage("Sélection incohérente");
00250 return false;
00251 }
00252
00253 return true;
00254 }
00255