00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifdef _MSC_VER
00025 #include <windows_config.h>
00026 #else
00027 #include <config.h>
00028 #endif
00029
00030 #ifdef _WIN32
00031 #include <windows.h>
00032 #endif
00033
00034 #include <GL/gl.h>
00035
00036 #include <string>
00037 #include <utils/common/MsgHandler.h>
00038 #include <utils/geom/Position2DVector.h>
00039 #include <utils/geom/Line2D.h>
00040 #include <utils/geom/Boundary.h>
00041 #include <utils/gui/div/GLHelper.h>
00042 #include <utils/common/ToString.h>
00043 #include <utils/common/Command.h>
00044 #include <microsim/MSNet.h>
00045 #include <microsim/MSLane.h>
00046 #include <microsim/MSEdge.h>
00047 #include <guisim/GUINet.h>
00048 #include <guisim/GUIEdge.h>
00049 #include "GUITriggeredRerouter.h"
00050 #include <utils/gui/globjects/GUIGLObjectPopupMenu.h>
00051 #include <utils/gui/windows/GUIAppEnum.h>
00052 #include <gui/GUIGlobals.h>
00053 #include <utils/gui/div/GUIParameterTableWindow.h>
00054 #include <gui/GUIApplicationWindow.h>
00055 #include <utils/gui/images/GUITexturesHelper.h>
00056 #include <microsim/logging/FunctionBinding.h>
00057 #include <utils/gui/div/GUIGlobalSelection.h>
00058 #include <utils/gui/globjects/GUIGlObjectStorage.h>
00059 #include <foreign/polyfonts/polyfonts.h>
00060
00061 #ifdef CHECK_MEMORY_LEAKS
00062 #include <foreign/nvwa/debug_new.h>
00063 #endif // CHECK_MEMORY_LEAKS
00064
00065
00066
00067
00068
00069
00070
00071
00072 FXDEFMAP(GUITriggeredRerouter::GUITriggeredRerouterPopupMenu)
00073 GUITriggeredRerouterPopupMenuMap[]= {
00074 FXMAPFUNC(SEL_COMMAND, MID_MANIP, GUITriggeredRerouter::GUITriggeredRerouterPopupMenu::onCmdOpenManip),
00075
00076 };
00077
00078
00079 FXIMPLEMENT(GUITriggeredRerouter::GUITriggeredRerouterPopupMenu, GUIGLObjectPopupMenu, GUITriggeredRerouterPopupMenuMap, ARRAYNUMBER(GUITriggeredRerouterPopupMenuMap))
00080
00081
00082
00083
00084
00085 FXDEFMAP(GUITriggeredRerouter::GUIManip_TriggeredRerouter) GUIManip_TriggeredRerouterMap[]= {
00086 FXMAPFUNC(SEL_COMMAND, GUITriggeredRerouter::GUIManip_TriggeredRerouter::MID_USER_DEF, GUITriggeredRerouter::GUIManip_TriggeredRerouter::onCmdUserDef),
00087 FXMAPFUNC(SEL_UPDATE, GUITriggeredRerouter::GUIManip_TriggeredRerouter::MID_USER_DEF, GUITriggeredRerouter::GUIManip_TriggeredRerouter::onUpdUserDef),
00088 FXMAPFUNC(SEL_COMMAND, GUITriggeredRerouter::GUIManip_TriggeredRerouter::MID_OPTION, GUITriggeredRerouter::GUIManip_TriggeredRerouter::onCmdChangeOption),
00089 FXMAPFUNC(SEL_COMMAND, GUITriggeredRerouter::GUIManip_TriggeredRerouter::MID_CLOSE, GUITriggeredRerouter::GUIManip_TriggeredRerouter::onCmdClose),
00090 };
00091
00092 FXIMPLEMENT(GUITriggeredRerouter::GUIManip_TriggeredRerouter, GUIManipulator, GUIManip_TriggeredRerouterMap, ARRAYNUMBER(GUIManip_TriggeredRerouterMap))
00093
00094
00095
00096
00097
00098
00099
00100
00101 GUITriggeredRerouter::GUIManip_TriggeredRerouter::GUIManip_TriggeredRerouter(
00102 GUIMainWindow &app,
00103 const std::string &name, GUITriggeredRerouter &o,
00104 int , int )
00105 : GUIManipulator(app, name, 0, 0), myParent(&app),
00106 myChosenValue(0), myChosenTarget(myChosenValue, this, MID_OPTION),
00107 myUsageProbability(o.getProbability()), myUsageProbabilityTarget(myUsageProbability),
00108 myObject(&o) {
00109 FXVerticalFrame *f1 =
00110 new FXVerticalFrame(this, LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 0,0,0,0);
00111
00112 FXGroupBox *gp = new FXGroupBox(f1, "Change Probability",
00113 GROUPBOX_TITLE_LEFT|FRAME_SUNKEN|FRAME_RIDGE,
00114 0, 0, 0, 0, 4, 4, 1, 1, 2, 0);
00115 {
00116
00117 FXHorizontalFrame *gf1 =
00118 new FXHorizontalFrame(gp, LAYOUT_TOP|LAYOUT_LEFT,0,0,0,0, 10,10,5,5);
00119 new FXRadioButton(gf1, "Default", &myChosenTarget, FXDataTarget::ID_OPTION+0,
00120 ICON_BEFORE_TEXT|LAYOUT_SIDE_TOP,
00121 0, 0, 0, 0, 2, 2, 0, 0);
00122 }
00123 {
00124
00125 FXHorizontalFrame *gf12 =
00126 new FXHorizontalFrame(gp, LAYOUT_TOP|LAYOUT_LEFT,0,0,0,0, 10,10,5,5);
00127 new FXRadioButton(gf12, "User Given: ", &myChosenTarget, FXDataTarget::ID_OPTION+1,
00128 ICON_BEFORE_TEXT|LAYOUT_SIDE_TOP|LAYOUT_CENTER_Y,
00129 0, 0, 0, 0, 2, 2, 0, 0);
00130 myUsageProbabilityDial =
00131 new FXRealSpinDial(gf12, 10, this, MID_USER_DEF,
00132 LAYOUT_TOP|FRAME_SUNKEN|FRAME_THICK);
00133 myUsageProbabilityDial->setFormatString("%.2f");
00134 myUsageProbabilityDial->setIncrements(.1,.1,.1);
00135 myUsageProbabilityDial->setRange(0,1);
00136 myUsageProbabilityDial->setValue(myObject->getUserProbability());
00137 }
00138 {
00139
00140 FXHorizontalFrame *gf13 =
00141 new FXHorizontalFrame(gp, LAYOUT_TOP|LAYOUT_LEFT,0,0,0,0, 10,10,5,5);
00142 new FXRadioButton(gf13, "Off", &myChosenTarget, FXDataTarget::ID_OPTION+2,
00143 ICON_BEFORE_TEXT|LAYOUT_SIDE_TOP,
00144 0, 0, 0, 0, 2, 2, 0, 0);
00145 }
00146 myChosenValue = myObject->inUserMode()
00147 ? myObject->getUserProbability()>0
00148 ? 1 : 2
00149 : 0;
00150 new FXButton(f1,"Close",NULL,this,MID_CLOSE,
00151 BUTTON_INITIAL|BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_CENTER_X,0,0,0,0, 30,30,4,4);
00152 }
00153
00154
00155 GUITriggeredRerouter::GUIManip_TriggeredRerouter::~GUIManip_TriggeredRerouter() {}
00156
00157
00158 long
00159 GUITriggeredRerouter::GUIManip_TriggeredRerouter::onCmdClose(FXObject*,FXSelector,void*) {
00160 destroy();
00161 return 1;
00162 }
00163
00164
00165 long
00166 GUITriggeredRerouter::GUIManip_TriggeredRerouter::onCmdUserDef(FXObject*,FXSelector,void*) {
00167 myUsageProbability = (SUMOReal)(myUsageProbabilityDial->getValue());
00168 static_cast<GUITriggeredRerouter*>(myObject)->setUserUsageProbability(myUsageProbability);
00169 static_cast<GUITriggeredRerouter*>(myObject)->setUserMode(true);
00170 myParent->updateChildren();
00171 return 1;
00172 }
00173
00174
00175 long
00176 GUITriggeredRerouter::GUIManip_TriggeredRerouter::onUpdUserDef(FXObject *sender,FXSelector,void*ptr) {
00177 sender->handle(this,
00178 myChosenValue!=1 ? FXSEL(SEL_COMMAND,ID_DISABLE):FXSEL(SEL_COMMAND,ID_ENABLE),
00179 ptr);
00180 myParent->updateChildren();
00181 return 1;
00182 }
00183
00184
00185 long
00186 GUITriggeredRerouter::GUIManip_TriggeredRerouter::onCmdChangeOption(FXObject*,FXSelector,void*) {
00187 static_cast<GUITriggeredRerouter*>(myObject)->setUserUsageProbability(myUsageProbability);
00188 switch (myChosenValue) {
00189 case 0:
00190 static_cast<GUITriggeredRerouter*>(myObject)->setUserMode(false);
00191 break;
00192 case 1:
00193 static_cast<GUITriggeredRerouter*>(myObject)->setUserMode(true);
00194 break;
00195 case 2:
00196 static_cast<GUITriggeredRerouter*>(myObject)->setUserUsageProbability(0);
00197 static_cast<GUITriggeredRerouter*>(myObject)->setUserMode(true);
00198 break;
00199 default:
00200 throw 1;
00201 }
00202 myParent->updateChildren();
00203 return 1;
00204 }
00205
00206
00207
00208
00209
00210 GUITriggeredRerouter::GUITriggeredRerouterPopupMenu::GUITriggeredRerouterPopupMenu(
00211 GUIMainWindow &app, GUISUMOAbstractView &parent,
00212 GUIGlObject &o)
00213 : GUIGLObjectPopupMenu(app, parent, o) {}
00214
00215
00216 GUITriggeredRerouter::GUITriggeredRerouterPopupMenu::~GUITriggeredRerouterPopupMenu() throw() {}
00217
00218
00219 long
00220 GUITriggeredRerouter::GUITriggeredRerouterPopupMenu::onCmdOpenManip(FXObject*,
00221 FXSelector,
00222 void*) {
00223 static_cast<GUITriggeredRerouter*>(myObject)->openManipulator(
00224 *myApplication, *myParent);
00225 return 1;
00226 }
00227
00228
00229
00230
00231
00232 GUITriggeredRerouter::GUITriggeredRerouter(const std::string &id,
00233 const std::vector<MSEdge*> &edges,
00234 SUMOReal prob, const std::string &aXMLFilename, bool off)
00235 : MSTriggeredRerouter(id, edges, prob, aXMLFilename, off),
00236 GUIGlObject_AbstractAdd(GUIGlObjectStorage::gIDStorage, "rerouter:" + id, GLO_TRIGGER) {
00237 size_t k;
00238 size_t no = 0;
00239 for (k=0; k<edges.size(); k++) {
00240 GUIEdge *gedge = static_cast<GUIEdge*>(edges[k]);
00241 no += gedge->getLanes().size();
00242 }
00243 myFGPositions.reserve(no);
00244 myFGRotations.reserve(no);
00245 for (k=0; k<edges.size(); k++) {
00246 GUIEdge *gedge = static_cast<GUIEdge*>(edges[k]);
00247 const std::vector<MSLane*> &lanes = gedge->getLanes();
00248 size_t noLanes = lanes.size();
00249 for (size_t i=0; i<noLanes; ++i) {
00250 const Position2DVector &v = gedge->getLaneGeometry((size_t) i).getShape();
00251 SUMOReal pos = v.length() - (SUMOReal) 6.;
00252 myFGPositions.push_back(v.positionAtLengthPosition(pos));
00253 myBoundary.add(v.positionAtLengthPosition(pos));
00254 Line2D l(v.getBegin(), v.getEnd());
00255 myFGRotations.push_back(-v.rotationDegreeAtLengthPosition(pos));
00256 }
00257 }
00258 }
00259
00260
00261 GUITriggeredRerouter::~GUITriggeredRerouter() throw() {}
00262
00263
00264 GUIGLObjectPopupMenu *
00265 GUITriggeredRerouter::getPopUpMenu(GUIMainWindow &app,
00266 GUISUMOAbstractView &parent) throw() {
00267 GUIGLObjectPopupMenu *ret = new GUITriggeredRerouterPopupMenu(app, parent, *this);
00268 buildPopupHeader(ret, app);
00269 buildCenterPopupEntry(ret);
00270 buildShowManipulatorPopupEntry(ret, false);
00271 buildNameCopyPopupEntry(ret);
00272 buildSelectionPopupEntry(ret);
00273 buildPositionCopyEntry(ret, false);
00274 return ret;
00275 }
00276
00277
00278 GUIParameterTableWindow *
00279 GUITriggeredRerouter::getParameterWindow(GUIMainWindow &,
00280 GUISUMOAbstractView &) throw() {
00281 return 0;
00282 }
00283
00284
00285 const std::string &
00286 GUITriggeredRerouter::getMicrosimID() const throw() {
00287 return getID();
00288 }
00289
00290
00291 void
00292 GUITriggeredRerouter::drawGL(const GUIVisualizationSettings &s) const throw() {
00293
00294 if (s.needsGlID) {
00295 glPushName(getGlID());
00296 }
00297 for (size_t i=0; i<myFGPositions.size(); ++i) {
00298 const Position2D &pos = myFGPositions[i];
00299 SUMOReal rot = myFGRotations[i];
00300 glPushMatrix();
00301 glScaled(s.addExaggeration, s.addExaggeration, 1);
00302 glTranslated(pos.x(), pos.y(), 0);
00303 glRotated(rot, 0, 0, 1);
00304 glTranslated(0, 0, -.03);
00305 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
00306
00307 glBegin(GL_TRIANGLES);
00308 glColor3d(1, .8f, 0);
00309
00310 glVertex2d(0-1.4, 0);
00311 glVertex2d(0-1.4, 6);
00312 glVertex2d(0+1.4, 6);
00313 glVertex2d(0+1.4, 0);
00314 glVertex2d(0-1.4, 0);
00315 glVertex2d(0+1.4, 6);
00316 glEnd();
00317
00318 glTranslated(0, 0, -.01);
00319 glColor3d(0, 0, 0);
00320 pfSetPosition(0, 0);
00321 pfSetScale(3.f);
00322 SUMOReal w = pfdkGetStringWidth("U");
00323 glRotated(180, 0, 1, 0);
00324 glTranslated(-w/2., 2, 0);
00325 pfDrawString("U");
00326
00327 glTranslated(w/2., -2, 0);
00328 SUMOReal prob = myAmInUserMode ? myUserProbability : myProbability;
00329 prob *= 100.;
00330 prob = (SUMOReal)((int) prob);
00331 std::string str = toString(prob) + "%";
00332 pfSetPosition(0, 0);
00333 pfSetScale(.7f);
00334 w = pfdkGetStringWidth(str.c_str());
00335 glTranslated(-w/2., 4, 0);
00336 pfDrawString(str.c_str());
00337 glPopMatrix();
00338 }
00339 if (hasCurrentReroute(MSNet::getInstance()->getCurrentTimeStep())&&getProbability()>0) {
00340 const RerouteInterval & ri =
00341 getCurrentReroute(MSNet::getInstance()->getCurrentTimeStep());
00342 for (std::vector<MSEdge*>::const_iterator i=ri.closed.begin(); i!=ri.closed.end(); ++i) {
00343 GUIEdge *gedge = static_cast<GUIEdge*>(*i);
00344 const std::vector<MSLane*> &lanes = gedge->getLanes();
00345 size_t noLanes = lanes.size();
00346 SUMOReal prob = getProbability()*360;
00347 for (size_t j=0; j<noLanes; ++j) {
00348 const Position2DVector &v = gedge->getLaneGeometry((size_t) j).getShape();
00349 SUMOReal d = 3.;
00350 Position2D pos = v.positionAtLengthPosition(d);
00351 SUMOReal rot = -v.rotationDegreeAtLengthPosition(d);
00352
00353 glPushMatrix();
00354 glTranslated(pos.x(), pos.y(), 0);
00355 glRotated(rot, 0, 0, 1);
00356 glTranslated(0, -1.5, 0);
00357
00358 int noPoints = 9;
00359 if (s.scale>25) {
00360 noPoints = (int)(9.0 + s.scale / 10.0);
00361 if (noPoints>36) {
00362 noPoints = 36;
00363 }
00364 }
00365 glTranslated(0, 0, -.03);
00366 glColor3d(0.7, 0, 0);
00367 GLHelper::drawFilledCircle((SUMOReal) 1.3, noPoints);
00368 glTranslated(0, 0, -.01);
00369 glColor3d(1, 0, 0);
00370 GLHelper::drawFilledCircle((SUMOReal) 1.3, noPoints, 0, prob);
00371 glTranslated(0, 0, -.01);
00372 glColor3d(1, 1, 1);
00373 glRotated(-90, 0, 0, 1);
00374 glBegin(GL_TRIANGLES);
00375 glVertex2d(0-.3, -1.);
00376 glVertex2d(0-.3, 1.);
00377 glVertex2d(0+.3, 1.);
00378 glVertex2d(0+.3, -1.);
00379 glVertex2d(0-.3, -1.);
00380 glVertex2d(0+.3, 1.);
00381 glEnd();
00382 glPopMatrix();
00383 }
00384 }
00385 }
00386
00387 if (s.needsGlID) {
00388 glPopName();
00389 }
00390 }
00391
00392
00393 Boundary
00394 GUITriggeredRerouter::getCenteringBoundary() const throw() {
00395 Boundary b(myBoundary);
00396 b.grow(20);
00397 return b;
00398 }
00399
00400
00401
00402 GUIManipulator *
00403 GUITriggeredRerouter::openManipulator(GUIMainWindow &app,
00404 GUISUMOAbstractView &) {
00405 GUIManip_TriggeredRerouter *gui =
00406 new GUIManip_TriggeredRerouter(app, getFullName(), *this, 0, 0);
00407 gui->create();
00408 gui->show();
00409 return gui;
00410 }
00411
00412
00413
00414
00415