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 #ifdef MODULE_COREFINEMENT
00026
00027 #include "g-map-vertex.hh"
00028 #include "controler-gmap.hh"
00029 #include <cassert>
00030
00031 #include "corefinement-api.hh"
00032 #include "geometry.hh"
00033
00034 using namespace GMap3d;
00035
00036
00037 bool CControlerGMap::check2dCorefinability(CDart ** d1, CDart ** d2,
00038 CVertex * normal)
00039 {
00040 assert(d1 != NULL);
00041 assert(d2 != NULL);
00042 assert(normal != NULL);
00043
00044 if (FMap->getMarkedCells(ORBIT_CC, getSelectionMark(), NULL, d1) != 1)
00045 {
00046 setMessage("Sélection maillage 1 incohérente");
00047 return false;
00048 }
00049
00050 if (!FMap->isIFreeOrbit(*d1, 3, ORBIT_CC))
00051 {
00052 setMessage("Maillage 1 invalide: tous les brins doivent être 3-libres");
00053 return false;
00054 }
00055
00056 if (FMap->getMarkedCells(ORBIT_CC, getNextSelectionMark(1), NULL, d2) != 1)
00057 {
00058 setMessage("Sélection maillage 2 incohérente");
00059 return false;
00060 }
00061
00062 if (!FMap->isIFreeOrbit(*d2, 3, ORBIT_CC))
00063 {
00064 setMessage("Maillage 2 invalide: tous les brins doivent être 3-libres");
00065 return false;
00066 }
00067
00068 CVertex n1 = FMap->cellDimensionNormalVector(*d1, 3);
00069 CVertex n2 = FMap->cellDimensionNormalVector(*d2, 3);
00070
00071 TCoordinate angle = CGeometry::getAngle(n1,n2);
00072
00073 if (angle>90)
00074 angle = 180 - angle;
00075
00076 if (fabs(angle) > 0.5)
00077 {
00078 setMessage("Les deux maillages ne sont pas parallèles");
00079 return false;
00080 }
00081
00082 CVertex bary1 = FMap->barycenter(*d1, ORBIT_CC);
00083 CVertex bary2 = FMap->barycenter(*d2, ORBIT_CC);
00084
00085 if (!(bary1 - CGeometry::orthoProjectVertexOnPlane(bary1, bary2,n2)).isNull())
00086 {
00087 setMessage("Les deux maillages ne sont pas coplanaires");
00088 return false;
00089 }
00090
00091 if (angle > 90)
00092 n2 = - n2;
00093
00094 * normal = n1 + n2;
00095
00096 if (normal->isNull())
00097 * normal = OZ;
00098 else
00099 * normal /= normal->norm();
00100
00101 return true;
00102 }
00103
00104 bool CControlerGMap::corefine2dSegmentsSweeping()
00105 {
00106 if (canApplyOperation(COperation(OPERATION_COREFINE,
00107 SUB_OPERATION_COREFINE2D_SWEEPING, -1)))
00108 {
00109 CDart * d1, * d2;
00110 CVertex normal;
00111
00112
00113 if (!check2dCorefinability(& d1, & d2, & normal))
00114 return false;
00115
00116 undoRedoPreSave();
00117 CCorefinementAPI(FMap).corefine2dMeshesSweeping(d1,d2, normal);
00118 undoRedoPostSaveOk();
00119
00120 setModelChanged();
00121 setMessage("Co-raffinement 2D par balayage effectué");
00122 return true;
00123 }
00124
00125 return false;
00126 }
00127
00128 bool CControlerGMap::corefine2dSegmentsPropagation()
00129 {
00130 if (canApplyOperation(COperation(OPERATION_COREFINE,
00131 SUB_OPERATION_COREFINE2D_PROPAGATION, -1)))
00132 {
00133 CCorefinementAPI corefinator(FMap);
00134 CDart * d1, * d2;
00135 CVertex normal;
00136
00137 if (!check2dCorefinability(& d1, & d2, & normal))
00138 return false;
00139
00140 undoRedoPreSave();
00141 corefinator.corefine2dMeshesPropagation(d1, d2, normal);
00142 undoRedoPostSaveOk();
00143
00144 setModelChanged();
00145 setMessage("Co-raffinement 2D par propagation effectué");
00146 return true;
00147 }
00148
00149 return false;
00150 }
00151
00152 bool CControlerGMap::booleanOperations2d()
00153 {
00154 if (canApplyOperation(COperation(OPERATION_COREFINE,
00155 SUB_OPERATION_COREFINE_BOOL_OPS2D, -1))) {
00156 CCorefinementAPI coref(FMap);
00157 CDart *d1, *d2;
00158 CVertex normal;
00159
00160 if (FMap->getMarkedCells(ORBIT_CC, getSelectionMark(), NULL, &d1) != 1) {
00161 setMessage("Sélection maillage 1 incohérente");
00162 return false;
00163 }
00164
00165 if (FMap->getMarkedCells(ORBIT_CC, getNextSelectionMark(1),
00166 NULL, &d2) != 1) {
00167 setMessage("Sélection maillage 2 incohérente");
00168 return false;
00169 }
00170
00171 if (!check2dCorefinability(& d1, & d2, & normal))
00172 return false;
00173
00174 undoRedoPreSave();
00175 coref.booleanOperations2d(d1, d2, normal,
00176 getSelectionMark(),
00177 getNextSelectionMark(1),
00178 getNextSelectionMark(2));
00179 undoRedoPostSaveOk();
00180
00181 setModelChanged();
00182 setMessage("Opérations booléennes 2D effectuées");
00183 return true;
00184 }
00185
00186 return false;
00187 }
00188
00189 bool CControlerGMap::corefine3dFaces()
00190 {
00191 if (canApplyOperation(COperation(OPERATION_COREFINE,
00192 SUB_OPERATION_COREFINE3D, -1)))
00193 {
00194 CCorefinementAPI corefinator(FMap);
00195 CDart * d1, * d2;
00196
00197 if (FMap->getMarkedCells(ORBIT_CC, getSelectionMark(), NULL, &d1) != 1)
00198 {
00199 setMessage("Sélection maillage 1 incohérente");
00200 return false;
00201 }
00202
00203 if (FMap->getMarkedCells(ORBIT_CC, getNextSelectionMark(1),
00204 NULL, &d2) != 1)
00205 {
00206 setMessage("Sélection maillage 2 incohérente");
00207 return false;
00208 }
00209
00210 undoRedoPreSave();
00211 corefinator.corefine3dMeshes(d1, d2);
00212 undoRedoPostSaveOk();
00213
00214 setModelChanged();
00215 setMessage("Co-raffinement 3D effectué");
00216 return true;
00217 }
00218
00219 return false;
00220 }
00221
00222 bool CControlerGMap::corefineMarked3dMeshesWith()
00223 {
00224 if (canApplyOperation(COperation(OPERATION_COREFINE,
00225 SUB_OPERATION_COREFINE3D_MARKED_MESHES, -1)))
00226 {
00227 CCorefinementAPI corefinator(FMap);
00228 CDart *d;
00229
00230 if (FMap->getMarkedCells(ORBIT_CC, getNextSelectionMark(1),
00231 NULL, &d) != 1)
00232 {
00233 setMessage("Sélection maillage 2 incohérente");
00234 return false;
00235 }
00236
00237 undoRedoPreSave();
00238 corefinator.corefineMarked3dMeshesWith(getSelectionMark(), d);
00239 undoRedoPostSaveOk();
00240
00241 setModelChanged();
00242 setMessage("Co-raffinement 3D effectué");
00243 return true;
00244 }
00245
00246 return false;
00247 }
00248
00249 bool CControlerGMap::booleanOperations3d()
00250 {
00251 if (canApplyOperation(COperation(OPERATION_COREFINE,
00252 SUB_OPERATION_COREFINE_BOOL_OPS3D, -1))) {
00253 CCorefinementAPI coref(FMap);
00254 CDart *d1, *d2;
00255
00256 if (FMap->getMarkedCells(ORBIT_CC, getSelectionMark(), NULL, &d1) != 1) {
00257 setMessage("Sélection maillage 1 incohérente");
00258 return false;
00259 }
00260
00261 if (FMap->getMarkedCells(ORBIT_CC, getNextSelectionMark(1),
00262 NULL, &d2) != 1) {
00263 setMessage("Sélection maillage 2 incohérente");
00264 return false;
00265 }
00266
00267 undoRedoPreSave();
00268 coref.booleanOperations3d(d1, d2,
00269 getSelectionMark(),
00270 getNextSelectionMark(1),
00271 getNextSelectionMark(2));
00272 undoRedoPostSaveOk();
00273
00274 setModelChanged();
00275 setMessage("Opérations booléennes 3D effectuées");
00276 return true;
00277 }
00278
00279 return false;
00280 }
00281
00282 bool CControlerGMap::corefine3dMeshes()
00283 {
00284 if (canApplyOperation(COperation(OPERATION_COREFINE,
00285 SUB_OPERATION_COREFINE3D, -1)))
00286 {
00287 CCorefinementAPI corefinator(FMap);
00288 CDart * d1, * d2;
00289
00290 if (FMap->getMarkedCells(ORBIT_CC, getSelectionMark(), NULL, &d1) != 1)
00291 {
00292 setMessage("Sélection maillage 1 incohérente");
00293 return false;
00294 }
00295
00296 if (FMap->getMarkedCells(ORBIT_CC, getNextSelectionMark(1),
00297 NULL, &d2) != 1)
00298 {
00299 setMessage("Sélection maillage 2 incohérente");
00300 return false;
00301 }
00302
00303 undoRedoPreSave();
00304 corefinator.corefine3dMeshes(d1, d2);
00305 undoRedoPostSaveOk();
00306
00307 setModelChanged();
00308 setMessage("Co-raffinement 3D effectué");
00309 return true;
00310 }
00311
00312 return false;
00313 }
00314
00315 bool CControlerGMap::corefineMarked3dFaces()
00316 {
00317 if (canApplyOperation(COperation(OPERATION_COREFINE,
00318 SUB_OPERATION_COREFINE3D_MARKED_FACES, -1)))
00319 {
00320 CCorefinementAPI corefinator(FMap);
00321
00322 undoRedoPreSave();
00323 corefinator.corefineMarked3dFaces(getSelectionMark(),
00324 getNextSelectionMark(1));
00325 undoRedoPostSaveOk();
00326
00327 setModelChanged();
00328 setMessage("Co-raffinement 3D effectué");
00329 return true;
00330 }
00331
00332 return false;
00333 }
00334
00335 #endif // COREFINEMENT
00336