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 using namespace std;
00031
00032 bool CControlerGMap::createObject()
00033 {
00034 switch (getMode())
00035 {
00036 case MODE_CREATION_POLYLINE: return createPolyline (); break;
00037 case MODE_CREATION_POLYGON : return createPolygon (); break;
00038 case MODE_CREATION_MESH : return createMesh (); break;
00039 case MODE_CREATION_SPHERE : return createSphere (); break;
00040 case MODE_CREATION_CYLINDER: return createCylinder (); break;
00041 case MODE_CREATION_PYRAMID : return createPyramid (); break;
00042 case MODE_CREATION_TORUS : return createTorus (); break;
00043 }
00044 return false;
00045 }
00046
00047 bool CControlerGMap::createPolyline()
00048 {
00049 if (!canApplyOperation(COperation(OPERATION_CREATE,
00050 SUB_OPERATION_CREATE_POLYLINE, -1)) ||
00051 FParameterPolylinePosition->getNbVertices()==0 )
00052 return false;
00053
00054 undoRedoPreSave();
00055 FMap->createPolyline(FParameterPolylinePosition->getVertices());
00056 undoRedoPostSaveOk();
00057
00058 setModelChanged();
00059 setMessage("Polyline créé");
00060 return true;
00061 }
00062
00063 bool CControlerGMap::createPolygon()
00064 {
00065 if (!canApplyOperation(COperation(OPERATION_CREATE,
00066 SUB_OPERATION_CREATE_POLYGON, -1)))
00067 return false;
00068
00069 CTransformationMatrix matrix =
00070 FParameterObjectPosition[OBJECT_POLYGON]->getTransformationMatrix();
00071
00072 int n = getParameterCreation()->getPolygonNbEdges();
00073
00074 undoRedoPreSave();
00075 FMap->applyMatrix(matrix, FMap->createRegularPolygon(n), ORBIT_CC);
00076 undoRedoPostSaveOk();
00077
00078 setModelChanged();
00079 setMessage("Polygone créé");
00080 return true;
00081 }
00082
00083 bool CControlerGMap::createMesh()
00084 {
00085 if (!canApplyOperation(COperation(OPERATION_CREATE,
00086 SUB_OPERATION_CREATE_MESH, -1)))
00087 return false;
00088
00089 CTransformationMatrix matrix =
00090 FParameterObjectPosition[OBJECT_MESH]->getTransformationMatrix();
00091
00092 int SX = getParameterCreation()->getMeshNbSubdivisionsX();
00093 int SY = getParameterCreation()->getMeshNbSubdivisionsY();
00094 int SZ = getParameterCreation()->getMeshNbSubdivisionsZ();
00095
00096 int SD = getParameterCreation()->getMeshSubdivisionDimension();
00097
00098 CDart * handle1, * handle2;
00099
00100 undoRedoPreSave();
00101
00102 switch (getParameterCreation()->getMeshDimension())
00103 {
00104 case 1:
00105 handle1 = FMap->createMesh1(SD==0 ? 1 : SX);
00106 FMap->applyMatrix(matrix, handle1, ORBIT_CC);
00107
00108 switch (SD)
00109 {
00110 case 0: setMessage("Arête simple créée"); break;
00111 case 1: setMessage("Arête 1-maillée créée"); break;
00112 default: return false;
00113 }
00114
00115 break;
00116
00117 case 2:
00118 handle1 = FMap->createSquareIMeshed(SX, SY, SD);
00119 FMap->applyMatrix(matrix, handle1, ORBIT_CC);
00120
00121 switch (SD)
00122 {
00123 case 0: setMessage("Carré simple créé"); break;
00124 case 1: setMessage("Carré 1-maillé créé"); break;
00125 case 2: setMessage("Carré 2-maillé créé"); break;
00126 default: return false;
00127 }
00128
00129 break;
00130
00131 case 3:
00132 if (SD==3)
00133 {
00134 handle1 = FMap->createMesh3(SX, SY, SZ);
00135 handle2 = NULL;
00136 setMessage("Cube 3-maillé créé");
00137 }
00138 else
00139 {
00140 unsigned char F = getParameterCreation()->getMeshCreatedFaces();
00141
00142 bool created[3][2] =
00143 {
00144 { F & CUBE_X1, F & CUBE_X2 },
00145 { F & CUBE_Y1, F & CUBE_Y2 },
00146 { F & CUBE_Z1, F & CUBE_Z2 }
00147 };
00148
00149 FMap->createCubeIMeshed(SX,SY,SZ, SD, created, & handle1, & handle2);
00150
00151 switch (SD)
00152 {
00153 case 0: setMessage("Cube simple créé"); break;
00154 case 1: setMessage("Cube 1-maillé créé"); break;
00155 case 2: setMessage("Cube 2-maillé créé"); break;
00156 default: return false;
00157 }
00158 }
00159
00160 FMap->applyMatrix(matrix, handle1, ORBIT_CC);
00161
00162 if (handle2 != NULL)
00163 FMap->applyMatrix(matrix, handle2, ORBIT_CC);
00164
00165 break;
00166
00167 default: return false;
00168 }
00169
00170 undoRedoPostSaveOk();
00171 setModelChanged();
00172 return true;
00173 }
00174
00175 bool CControlerGMap::createCylinder()
00176 {
00177 if (!canApplyOperation(COperation(OPERATION_CREATE,
00178 SUB_OPERATION_CREATE_CYLINDER, -1)))
00179 return false;
00180
00181 CTransformationMatrix matrix =
00182 FParameterObjectPosition[OBJECT_CYLINDER]->getTransformationMatrix();
00183
00184 int M = getParameterCreation()->getCylinderNbMeridians();
00185 int P = getParameterCreation()->getCylinderNbParallels();
00186 bool C1 = getParameterCreation()->getCylinderClosedUp();
00187 bool C2 = getParameterCreation()->getCylinderClosedDown();
00188
00189 undoRedoPreSave();
00190 FMap->applyMatrix(matrix, FMap->createCylinder(M, P, C1, C2), ORBIT_CC);
00191 undoRedoPostSaveOk();
00192
00193 setModelChanged();
00194 setMessage("Cylindre créé");
00195 return true;
00196 }
00197
00198 bool CControlerGMap::createPyramid()
00199 {
00200 if (!canApplyOperation(COperation(OPERATION_CREATE,
00201 SUB_OPERATION_CREATE_PYRAMID, -1)))
00202 return false;
00203
00204 CTransformationMatrix matrix =
00205 FParameterObjectPosition[OBJECT_PYRAMID]->getTransformationMatrix();
00206
00207 int M = getParameterCreation()->getPyramidNbMeridians();
00208 int P = getParameterCreation()->getPyramidNbParallels();
00209 bool C = getParameterCreation()->getPyramidClosed();
00210
00211 undoRedoPreSave();
00212 FMap->applyMatrix(matrix, FMap->createPyramid(M, P, C), ORBIT_CC);
00213 undoRedoPostSaveOk();
00214
00215 setModelChanged();
00216 setMessage("Pyramide créée");
00217 return true;
00218 }
00219
00220 bool CControlerGMap::createSphere()
00221 {
00222 if (!canApplyOperation(COperation(OPERATION_CREATE,
00223 SUB_OPERATION_CREATE_SPHERE, -1)))
00224 return false;
00225
00226 CTransformationMatrix matrix =
00227 FParameterObjectPosition[OBJECT_SPHERE]->getTransformationMatrix();
00228
00229 int M = getParameterCreation()->getSphereNbMeridians();
00230 int P = getParameterCreation()->getSphereNbParallels();
00231
00232 undoRedoPreSave();
00233 FMap->applyMatrix(matrix, FMap->createSphere(M, P), ORBIT_CC);
00234 undoRedoPostSaveOk();
00235
00236 setModelChanged();
00237 setMessage("Sphère créée");
00238 return true;
00239 }
00240
00241 bool CControlerGMap::createTorus()
00242 {
00243 if (!canApplyOperation(COperation(OPERATION_CREATE,
00244 SUB_OPERATION_CREATE_TORUS, -1)))
00245 return false;
00246
00247 CTransformationMatrix matrix =
00248 FParameterObjectPosition[OBJECT_TORUS]->getTransformationMatrix();
00249
00250 int M = getParameterCreation()->getTorusNbMeridians();
00251 int P = getParameterCreation()->getTorusNbParallels();
00252 float R = getParameterCreation()->getTorusRadiusRapport();
00253
00254 undoRedoPreSave();
00255 FMap->applyMatrix(matrix, FMap->createTorus(M, P, R), ORBIT_CC);
00256 undoRedoPostSaveOk();
00257
00258 setModelChanged();
00259 setMessage("Tore créé");
00260 return true;
00261 }
00262
00263 float CControlerGMap::getPolygonEdgesLength() const
00264 {
00265 return FParameterObjectPosition[OBJECT_POLYGON]->getScale()
00266 *dSin(180.0/FParameterCreation->getPolygonNbEdges());
00267 }
00268
00269 void CControlerGMap::setPolygonEdgesLength(float AValue)
00270 {
00271
00272 CParameterObjectPosition* param = FParameterObjectPosition[OBJECT_POLYGON];
00273
00274 TCoordinate s = AValue/dSin(180.0/FParameterCreation->getPolygonNbEdges());
00275 param->setScale(s);
00276 param->setDimensions(2*s*param->getProportions());
00277 }
00278
00279 void CControlerGMap::setPolygonEdgesNumber(int AValue)
00280 {
00281 FParameterCreation->setPolygonNbEdges(AValue);
00282 setPolygonEdgesLength(FParameterObjectPosition[OBJECT_POLYGON]->getScale()*
00283 dSin(180.0/AValue));
00284 }
00285
00286 bool CControlerGMap::randomizeDarts()
00287 {
00288 FMap->randomizeDarts();
00289 setMessage("Ordre des brins mélangé");
00290 return true;
00291 }
00292