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_ROUNDING
00026
00027 #include "controler-gmap.hh"
00028 #include "g-map-vertex.hh"
00029 #include "view-precompile.hh"
00030 using namespace GMap3d;
00031
00032 void CControlerGMap::modeRoundingReinitAllCoefs()
00033 {
00034 if (!areRoundingCoefsAllocated())
00035 return;
00036
00037 TCoordinate k0 =
00038 getParameterOperations()->getDefaultRoundingCoefForVertices();
00039
00040 TCoordinate k1 =
00041 getParameterOperations()->getDefaultRoundingCoefForEdges();
00042
00043 int selected = FMap->getNewMark();
00044 FMap->negateMaskMark(selected);
00045 FRounding->setRoundingCoefOfMarkedDarts(selected, 0, k0);
00046 FRounding->setRoundingCoefOfMarkedDarts(selected, 1, k1);
00047 FMap->negateMaskMark(selected);
00048 FMap->freeMark(selected);
00049 }
00050
00051 void CControlerGMap::modeRoundingSetCoefOfMarkedDarts(int ADimension,
00052 TCoordinate ACoef)
00053 {
00054 if (!areRoundingCoefsAllocated() || (ADimension!=0 && ADimension!=1))
00055 return;
00056
00057 FRounding->
00058 setRoundingCoefOfMarkedDarts(getSelectionMark(), ADimension, ACoef);
00059 }
00060
00061 bool CControlerGMap::modeRoundingGetCoefOfMarkedDarts(int ADimension,
00062 TCoordinate& ACoef)
00063 {
00064 if (!areRoundingCoefsAllocated() || (ADimension!=0 && ADimension!=1))
00065 return false;
00066
00067 return FRounding->getRoundingCoefOfMarkedDarts(getSelectionMark(),
00068 ADimension, ACoef);
00069 }
00070
00071 TCoordinate CControlerGMap::modeRoundingSelectNextCoef(int ADimension)
00072 {
00073 if (!areRoundingCoefsAllocated() || (ADimension!=0 && ADimension!=1))
00074 return false;
00075
00076 int mark = getSelectionMark();
00077
00078 TCoordinate coef = FRounding->selectNextRoundingCoef(mark, ADimension);
00079
00080 CDart* last = getLastSelectedDart();
00081 if (last != NULL && !FMap->isMarked(last, mark))
00082 unsetLastSelectedDart();
00083
00084 setSelectionChanged();
00085
00086 return coef;
00087 }
00088
00089 void CControlerGMap::modeRoundingBegin()
00090 {
00091 assert(! areRoundingCoefsAllocated());
00092
00093 FRounding = new CRoundingInterface(FMap);
00094 modeRoundingReinitAllCoefs();
00095 }
00096
00097 void CControlerGMap::modeRoundingEnd()
00098 {
00099 assert(areRoundingCoefsAllocated());
00100
00101 delete FRounding;
00102 FRounding = NULL;
00103 }
00104
00105 bool CControlerGMap::areRoundingCoefsAllocated() const
00106 {
00107 return FRounding != NULL;
00108 }
00109
00110 void CControlerGMap::modeRoundingOperationStart()
00111 {
00112 if ( FViews[FCurrentViewId]!=NULL )
00113 FViews[FCurrentViewId]->pick(FLastX, FLastY);
00114 }
00115
00116 void CControlerGMap::modeRoundingOperationMove()
00117 {
00118 }
00119
00120 void CControlerGMap::modeRoundingOperationStop()
00121 {
00122 }
00123
00124 bool CControlerGMap::modeRoundingRoundVertices(bool ADig, bool )
00125 {
00126 #ifndef MODULE_ROUNDING
00127 if (ASurfacic)
00128 return false;
00129 #endif // MODULE_ROUNDING
00130 assert(areRoundingCoefsAllocated());
00131
00132 if (!canApplyOperation(COperation(OPERATION_ROUND, 0)))
00133 return false;
00134
00135 undoRedoPreSave();
00136
00137 int selected = FMap->getNewMark();
00138 FMap->markIncidentCells(ORBIT_23, getSelectionMark(), selected);
00139
00140 int nb = FRounding->roundMarkedVertices(selected, ADig);
00141
00142 FMap->unmarkAll(selected);
00143 FMap->freeMark(selected);
00144
00145 if (nb==0)
00146 {
00147 setMessage("Aucun sommet arrondi");
00148 undoRedoPostSaveFailed();
00149 return false;
00150 }
00151
00152 undoRedoPostSaveOk();
00153 setModelChanged();
00154 setMessage(nb, nb==1 ? " sommet arrondi" : " sommets arrondis");
00155 modeRoundingReinitAllCoefs();
00156 return true;
00157 }
00158
00159 bool CControlerGMap::modeRoundingRoundEdges(bool A3D, bool ADig, bool ASetback,
00160 bool )
00161 {
00162 #ifndef MODULE_ROUNDING
00163 if (ASurfacic)
00164 return false;
00165 #endif // MODULE_ROUNDING
00166 assert(areRoundingCoefsAllocated());
00167
00168 if (!canApplyOperation(COperation(OPERATION_ROUND, 1)))
00169 return false;
00170
00171 undoRedoPreSave();
00172
00173 int selected = FMap->getNewMark();
00174 FMap->markIncidentCells(ORBIT_EDGE, getSelectionMark(), selected);
00175
00176 int nb = FRounding->roundMarkedEdges(selected, A3D, ADig, ASetback);
00177
00178 FMap->unmarkAll(selected);
00179 FMap->freeMark(selected);
00180
00181 if (nb==0)
00182 {
00183 setMessage("Aucune arête arrondie");
00184 undoRedoPostSaveFailed();
00185 return false;
00186 }
00187
00188 undoRedoPostSaveOk();
00189 setModelChanged();
00190 setMessage(nb, nb==1 ? " arête arrondie" : " arêtes arrondies");
00191 modeRoundingReinitAllCoefs();
00192 return true;
00193 }
00194
00195 #endif // MODULE_ROUNDING
00196