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::thicken()
00032 {
00033 bool res = false;
00034 if (canApplyOperation(COperation(OPERATION_THICKEN)))
00035 {
00036 undoRedoPreSave();
00037
00038 float coef = getParameterOperations()->getExtrusionCoef();
00039
00040 int nb = FMap->thickenMarkedDarts(getSelectionMark(), coef);
00041
00042 if (nb==0)
00043 {
00044 setMessage("Aucun objet à épaissir");
00045 undoRedoPostSaveFailed();
00046 }
00047 else
00048 {
00049 undoRedoPostSaveOk();
00050 setModelChanged();
00051 setMessage(nb, nb==1 ? " brin épaissi" : " brins épaissis");
00052 res = true;
00053 }
00054 }
00055
00056 return res;
00057 }
00058
00059 bool CControlerGMap::extrudeByNormal(int ADim)
00060 {
00061 bool res = false;
00062 if (canApplyOperation(COperation(OPERATION_EXTRUDE,
00063 SUB_OPERATION_EXTRUDE_BY_NORMAL, ADim)))
00064 {
00065 undoRedoPreSave();
00066
00067 float coef = getParameterOperations()->getExtrusionCoef();
00068
00069 int nb =
00070 FMap->extrudeByNormalMarkedCells(getSelectionMark(), ADim,
00071 getParameterOperations()
00072 ->getExtrusionAdjacentSews(),
00073 coef);
00074
00075 if (nb==0)
00076 {
00077 setMessage("Aucune extrusion effectuée");
00078 undoRedoPostSaveFailed();
00079 }
00080 else
00081 {
00082 undoRedoPostSaveOk();
00083
00084 switch (ADim)
00085 {
00086 case 0:
00087 setMessage(nb, nb==1 ? " sommet extrudé" : " sommets extrudés");
00088 break;
00089 case 1:
00090 setMessage(nb, nb==1 ? " arête extrudée" : " arêtes extrudées");
00091 break;
00092 case 2:
00093 setMessage(nb, nb==1 ? " face extrudée" : " faces extrudées" );
00094 break;
00095 }
00096
00097 setModelChanged();
00098 res = true;
00099 }
00100 }
00101
00102 return res;
00103 }
00104
00105 bool CControlerGMap::intuitiveExtrudeByNormal()
00106 {
00107 bool res = false;
00108 if (canApplyOperation(COperation(OPERATION_EXTRUDE,
00109 SUB_OPERATION_INTUITIVE_EXTRUDE_BY_NORMAL, -1)))
00110 {
00111 undoRedoPreSave();
00112
00113 float coef = getParameterOperations()->getExtrusionCoef();
00114
00115 int nb =
00116 FMap->intuitiveExtrudeByNormalMarkedCells(getSelectionMark(),
00117 getParameterOperations()
00118 ->getExtrusionAdjacentSews(),
00119 coef);
00120
00121 if (nb==0)
00122 {
00123 setMessage("Aucune extrusion effectuée");
00124 undoRedoPostSaveFailed();
00125 }
00126 else
00127 {
00128 undoRedoPostSaveOk();
00129
00130 setModelChanged();
00131 setMessage(nb, nb==1 ? " cellule extrudée" : " cellules extrudées" );
00132 res = true;
00133 }
00134 }
00135
00136 return res;
00137 }
00138
00139 bool CControlerGMap::extrudeByPath(int ADim)
00140 {
00141 bool res = false;
00142
00143 if (canApplyOperation(COperation(OPERATION_EXTRUDE,
00144 SUB_OPERATION_EXTRUDE_BY_PATH, ADim)))
00145 {
00146 CDart * pathStart = getNextLastSelectedDart(1);
00147 CDart * pathPonderation = NULL;
00148
00149 bool ok = true;
00150
00151 if (getParameterOperations()->getExtrusionPonderateSection())
00152 {
00153 CDart * last2 = getNextLastSelectedDart(2);
00154
00155 int n = FMap->getMarkedCells(ORBIT_SELF, getNextSelectionMark(2),
00156 last2, &pathPonderation);
00157
00158 if (last2==NULL && n>1)
00159 {
00160 ok = false;
00161 setMessage("Extrusion impossible: Ambiguïté sur l'origine du chemin de pondération");
00162 }
00163
00164 if (ok && pathPonderation!=NULL &&
00165 FMap->isClosedPolyline(pathPonderation))
00166 {
00167 ok = false;
00168 setMessage("Extrusion impossible: Le chemin de pondération est fermé");
00169 }
00170 }
00171
00172 if (ok)
00173 {
00174 if (pathStart==NULL &&
00175 FMap->getMarkedCells(ORBIT_SELF, getNextSelectionMark(1),
00176 NULL, &pathStart) != 1)
00177 setMessage("Extrusion impossible: Aucun chemin sélectionné");
00178 else
00179 {
00180 undoRedoPreSave();
00181
00182 int nb =
00183 FMap->extrudeByPathMarkedCells(getSelectionMark(), ADim, pathStart,
00184 getParameterOperations()->getExtrusionAdjacentSews(),
00185 getParameterOperations()->getExtrusionInitialPositionMode(),
00186 getParameterOperations()->getExtrusionInitialDirectionMode(),
00187 getParameterOperations()->getExtrusionDirection(),
00188 getParameterOperations()->getExtrusionScale(),
00189 pathPonderation);
00190
00191 if (nb==0)
00192 {
00193 setMessage("Aucune extrusion effectuée");
00194 undoRedoPostSaveFailed();
00195 }
00196 else
00197 {
00198 undoRedoPostSaveOk();
00199
00200 switch (ADim)
00201 {
00202 case 1:
00203 setMessage(nb, nb==1 ?
00204 " arête extrudée" :
00205 " arêtes extrudées");
00206 break;
00207 case 2:
00208 setMessage(nb, nb==1 ?
00209 " face extrudée" :
00210 " faces extrudées" );
00211 break;
00212 }
00213
00214 setModelChanged();
00215 res = true;
00216 }
00217 }
00218 }
00219 }
00220
00221 return res;
00222 }
00223
00224 bool CControlerGMap::extrudeByRevolution(int ADim)
00225 {
00226 bool res = false;
00227 if (canApplyOperation(COperation(OPERATION_EXTRUDE,
00228 SUB_OPERATION_EXTRUDE_BY_NORMAL, ADim)))
00229 {
00230 bool ok = true;
00231
00232 CDart * d1, * d2;
00233 CDart * pathPonderation = NULL;
00234
00235 int found = FMap->getMarkedCells(ORBIT_VERTEX, getNextSelectionMark(1),
00236 getNextLastSelectedDart(1), &d2,&d1);
00237
00238 if (found!=2 && (found!=1 || FMap->isFree0(d2)))
00239 {
00240 setMessage("Désignation de l'axe incohérente");
00241 ok = false;
00242 }
00243
00244 if (ok && d1==NULL)
00245 {
00246 assert(d2!=NULL);
00247 assert(!FMap->isFree0(d2));
00248 d1 = FMap->alpha0(d2);
00249 }
00250
00251 CVertex axeVertex, axeDirection;
00252
00253 if (ok)
00254 {
00255 axeVertex = * FMap->findVertex(d1);
00256 axeDirection = * FMap->findVertex(d2) - axeVertex;
00257
00258 if (axeDirection.isNull())
00259 {
00260 setMessage("Extrusion impossible: Axe de longueur nulle");
00261 ok = false;
00262 }
00263 }
00264
00265 if (ok && getParameterOperations()->getExtrusionPonderateSection())
00266 {
00267 CDart * last2 = getNextLastSelectedDart(2);
00268
00269 int n = FMap->getMarkedCells(ORBIT_SELF, getNextSelectionMark(2),
00270 last2, &pathPonderation);
00271
00272 if (last2==NULL && n>1)
00273 {
00274 ok = false;
00275 setMessage("Extrusion impossible: Ambiguïté sur l'origine du chemin de pondération");
00276 }
00277
00278 if (ok && pathPonderation!=NULL && FMap->isClosedPolyline(pathPonderation))
00279 {
00280 ok = false;
00281 setMessage("Extrusion impossible: Le chemin de pondération est fermé");
00282 }
00283 }
00284
00285 if (ok)
00286 {
00287 undoRedoPreSave();
00288
00289 float angle =
00290 getParameterOperations()->getExtrusionRevolutionAngle();
00291
00292 int nb =
00293 FMap->extrudeByRevolutionMarkedCells(getSelectionMark(),
00294 ADim, axeVertex, axeDirection,
00295 angle,
00296 getParameterOperations()->getExtrusionRevolutionNbEdges(),
00297 getParameterOperations()->getExtrusionAdjacentSews(),
00298 getParameterOperations()->getExtrusionInitialPositionMode(),
00299 getParameterOperations()->getExtrusionInitialDirectionMode(),
00300 getParameterOperations()->getExtrusionDirection(),
00301 getParameterOperations()->getExtrusionScale(),
00302 pathPonderation);
00303
00304 if (nb==0)
00305 {
00306 setMessage("Aucune extrusion effectuée");
00307 undoRedoPostSaveFailed();
00308 }
00309 else
00310 {
00311 undoRedoPostSaveOk();
00312
00313 switch (ADim)
00314 {
00315 case 1:
00316 setMessage(nb, nb==1
00317 ? " arête extrudée" : " arêtes extrudées");
00318 break;
00319 case 2:
00320 setMessage(nb, nb==1
00321 ? " face extrudée" : " faces extrudées" );
00322 break;
00323 }
00324
00325 setModelChanged();
00326 res = true;
00327 }
00328 }
00329 }
00330
00331 return res;
00332 }
00333