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