SUMO - Simulation of Urban MObility

GUITriggeredRerouter.cpp

Go to the documentation of this file.
00001 /****************************************************************************/
00007 // Reroutes vehicles passing an edge (gui version)
00008 /****************************************************************************/
00009 // SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/
00010 // Copyright (C) 2001-2011 DLR (http://www.dlr.de/) and contributors
00011 /****************************************************************************/
00012 //
00013 //   This program is free software; you can redistribute it and/or modify
00014 //   it under the terms of the GNU General Public License as published by
00015 //   the Free Software Foundation; either version 2 of the License, or
00016 //   (at your option) any later version.
00017 //
00018 /****************************************************************************/
00019 
00020 
00021 // ===========================================================================
00022 // included modules
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/PositionVector.h>
00039 #include <utils/geom/Line.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 <foreign/polyfonts/polyfonts.h>
00059 
00060 #ifdef CHECK_MEMORY_LEAKS
00061 #include <foreign/nvwa/debug_new.h>
00062 #endif // CHECK_MEMORY_LEAKS
00063 
00064 
00065 // ===========================================================================
00066 // FOX callback mapping
00067 // ===========================================================================
00068 /* -------------------------------------------------------------------------
00069  * GUITriggeredRerouter::GUITriggeredRerouterPopupMenu - mapping
00070  * ----------------------------------------------------------------------- */
00071 FXDEFMAP(GUITriggeredRerouter::GUITriggeredRerouterPopupMenu)
00072 GUITriggeredRerouterPopupMenuMap[]= {
00073     FXMAPFUNC(SEL_COMMAND,  MID_MANIP,         GUITriggeredRerouter::GUITriggeredRerouterPopupMenu::onCmdOpenManip),
00074 
00075 };
00076 
00077 // Object implementation
00078 FXIMPLEMENT(GUITriggeredRerouter::GUITriggeredRerouterPopupMenu, GUIGLObjectPopupMenu, GUITriggeredRerouterPopupMenuMap, ARRAYNUMBER(GUITriggeredRerouterPopupMenuMap))
00079 
00080 
00081 /* -------------------------------------------------------------------------
00082  * GUITriggeredRerouter::GUIManip_TriggeredRerouter - mapping
00083  * ----------------------------------------------------------------------- */
00084 FXDEFMAP(GUITriggeredRerouter::GUIManip_TriggeredRerouter) GUIManip_TriggeredRerouterMap[]= {
00085     FXMAPFUNC(SEL_COMMAND,  GUITriggeredRerouter::GUIManip_TriggeredRerouter::MID_USER_DEF, GUITriggeredRerouter::GUIManip_TriggeredRerouter::onCmdUserDef),
00086     FXMAPFUNC(SEL_UPDATE,   GUITriggeredRerouter::GUIManip_TriggeredRerouter::MID_USER_DEF, GUITriggeredRerouter::GUIManip_TriggeredRerouter::onUpdUserDef),
00087     FXMAPFUNC(SEL_COMMAND,  GUITriggeredRerouter::GUIManip_TriggeredRerouter::MID_OPTION,   GUITriggeredRerouter::GUIManip_TriggeredRerouter::onCmdChangeOption),
00088     FXMAPFUNC(SEL_COMMAND,  GUITriggeredRerouter::GUIManip_TriggeredRerouter::MID_CLOSE,    GUITriggeredRerouter::GUIManip_TriggeredRerouter::onCmdClose),
00089 };
00090 
00091 FXIMPLEMENT(GUITriggeredRerouter::GUIManip_TriggeredRerouter, GUIManipulator, GUIManip_TriggeredRerouterMap, ARRAYNUMBER(GUIManip_TriggeredRerouterMap))
00092 
00093 
00094 // ===========================================================================
00095 // method definitions
00096 // ===========================================================================
00097 /* -------------------------------------------------------------------------
00098  * GUITriggeredRerouter::GUIManip_TriggeredRerouter - methods
00099  * ----------------------------------------------------------------------- */
00100 GUITriggeredRerouter::GUIManip_TriggeredRerouter::GUIManip_TriggeredRerouter(
00101     GUIMainWindow& app,
00102     const std::string& name, GUITriggeredRerouter& o,
00103     int /*xpos*/, int /*ypos*/)
00104     : GUIManipulator(app, name, 0, 0), myParent(&app),
00105       myChosenValue(0), myChosenTarget(myChosenValue, NULL, MID_OPTION),
00106       myUsageProbability(o.getProbability()), myUsageProbabilityTarget(myUsageProbability),
00107       myObject(&o) {
00108     myChosenTarget.setTarget(this);
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         // default
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         // free
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         // off
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  * GUITriggeredRerouter::GUITriggeredRerouterPopupMenu - methods
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  * GUITriggeredRerouter - methods
00231  * ----------------------------------------------------------------------- */
00232 GUITriggeredRerouter::GUITriggeredRerouter(
00233     const std::string& id,
00234     const std::vector<MSEdge*> &edges,
00235     SUMOReal prob, const std::string& aXMLFilename, bool off)
00236     : MSTriggeredRerouter(id, edges, prob, aXMLFilename, off),
00237       GUIGlObject_AbstractAdd("rerouter", GLO_TRIGGER, id) {
00238     size_t k;
00239     size_t no = 0;
00240     for (k=0; k<edges.size(); k++) {
00241         GUIEdge* gedge = static_cast<GUIEdge*>(edges[k]);
00242         no += gedge->getLanes().size();
00243     }
00244     myFGPositions.reserve(no);
00245     myFGRotations.reserve(no);
00246     for (k=0; k<edges.size(); k++) {
00247         GUIEdge* gedge = static_cast<GUIEdge*>(edges[k]);
00248         const std::vector<MSLane*> &lanes = gedge->getLanes();
00249         size_t noLanes = lanes.size();
00250         for (size_t i=0; i<noLanes; ++i) {
00251             const PositionVector& v = gedge->getLaneGeometry((size_t) i).getShape();
00252             SUMOReal pos = v.length() - (SUMOReal) 6.;
00253             myFGPositions.push_back(v.positionAtLengthPosition(pos));
00254             myBoundary.add(v.positionAtLengthPosition(pos));
00255             Line l(v.getBegin(), v.getEnd());
00256             myFGRotations.push_back(-v.rotationDegreeAtLengthPosition(pos));
00257         }
00258     }
00259 }
00260 
00261 
00262 GUITriggeredRerouter::~GUITriggeredRerouter() throw() {}
00263 
00264 
00265 GUIGLObjectPopupMenu*
00266 GUITriggeredRerouter::getPopUpMenu(GUIMainWindow& app,
00267                                    GUISUMOAbstractView& parent) throw() {
00268     GUIGLObjectPopupMenu* ret = new GUITriggeredRerouterPopupMenu(app, parent, *this);
00269     buildPopupHeader(ret, app);
00270     buildCenterPopupEntry(ret);
00271     buildShowManipulatorPopupEntry(ret, false);
00272     buildNameCopyPopupEntry(ret);
00273     buildSelectionPopupEntry(ret);
00274     buildPositionCopyEntry(ret, false);
00275     return ret;
00276 }
00277 
00278 
00279 GUIParameterTableWindow*
00280 GUITriggeredRerouter::getParameterWindow(GUIMainWindow&,
00281         GUISUMOAbstractView&) throw() {
00282     return 0;
00283 }
00284 
00285 
00286 void
00287 GUITriggeredRerouter::drawGL(const GUIVisualizationSettings& s) const throw() {
00288     glPushName(getGlID());
00289     for (size_t i=0; i<myFGPositions.size(); ++i) {
00290         const Position& pos = myFGPositions[i];
00291         SUMOReal rot = myFGRotations[i];
00292         glPushMatrix();
00293         glScaled(s.addExaggeration, s.addExaggeration, 1);
00294         glTranslated(pos.x(), pos.y(), 0);
00295         glRotated(rot, 0, 0, 1);
00296         glTranslated(0, 0, getType());
00297         glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
00298 
00299         glBegin(GL_TRIANGLES);
00300         glColor3d(1, .8f, 0);
00301         // base
00302         glVertex2d(0-1.4, 0);
00303         glVertex2d(0-1.4, 6);
00304         glVertex2d(0+1.4, 6);
00305         glVertex2d(0+1.4, 0);
00306         glVertex2d(0-1.4, 0);
00307         glVertex2d(0+1.4, 6);
00308         glEnd();
00309 
00310         glTranslated(0, 0, .1);
00311         glColor3d(0, 0, 0);
00312         pfSetPosition(0, 0);
00313         pfSetScale(3.f);
00314         SUMOReal w = pfdkGetStringWidth("U");
00315         glRotated(180, 0, 1, 0);
00316         glTranslated(-w/2., 2, 0);
00317         pfDrawString("U");
00318 
00319         glTranslated(w/2., -2, 0);
00320         SUMOReal prob = myAmInUserMode ? myUserProbability : myProbability;
00321         prob *= 100.;
00322         prob = (SUMOReal)((int) prob);
00323         std::string str = toString(prob) + "%";
00324         pfSetPosition(0, 0);
00325         pfSetScale(.7f);
00326         w = pfdkGetStringWidth(str.c_str());
00327         glTranslated(-w/2., 4, 0);
00328         pfDrawString(str.c_str());
00329         glPopMatrix();
00330     }
00331     if (hasCurrentReroute(MSNet::getInstance()->getCurrentTimeStep())&&getProbability()>0) {
00332         const RerouteInterval& ri =
00333             getCurrentReroute(MSNet::getInstance()->getCurrentTimeStep());
00334         for (std::vector<MSEdge*>::const_iterator i=ri.closed.begin(); i!=ri.closed.end(); ++i) {
00335             GUIEdge* gedge = static_cast<GUIEdge*>(*i);
00336             const std::vector<MSLane*> &lanes = gedge->getLanes();
00337             size_t noLanes = lanes.size();
00338             SUMOReal prob = getProbability()*360;
00339             for (size_t j=0; j<noLanes; ++j) {
00340                 const PositionVector& v = gedge->getLaneGeometry((size_t) j).getShape();
00341                 SUMOReal d = 3.;
00342                 Position pos = v.positionAtLengthPosition(d);
00343                 SUMOReal rot = -v.rotationDegreeAtLengthPosition(d);
00344 
00345                 glPushMatrix();
00346                 glTranslated(pos.x(), pos.y(), 0);
00347                 glRotated(rot, 0, 0, 1);
00348                 glTranslated(0, -1.5, 0);
00349 
00350                 int noPoints = 9;
00351                 if (s.scale>25) {
00352                     noPoints = (int)(9.0 + s.scale / 10.0);
00353                     if (noPoints>36) {
00354                         noPoints = 36;
00355                     }
00356                 }
00357                 glTranslated(0, 0, getType());
00358                 glColor3d(0.7, 0, 0);
00359                 GLHelper::drawFilledCircle((SUMOReal) 1.3, noPoints);
00360                 glTranslated(0, 0, .1);
00361                 glColor3d(1, 0, 0);
00362                 GLHelper::drawFilledCircle((SUMOReal) 1.3, noPoints, 0, prob);
00363                 glTranslated(0, 0, .1);
00364                 glColor3d(1, 1, 1);
00365                 glRotated(-90, 0, 0, 1);
00366                 glBegin(GL_TRIANGLES);
00367                 glVertex2d(0-.3, -1.);
00368                 glVertex2d(0-.3, 1.);
00369                 glVertex2d(0+.3, 1.);
00370                 glVertex2d(0+.3, -1.);
00371                 glVertex2d(0-.3, -1.);
00372                 glVertex2d(0+.3, 1.);
00373                 glEnd();
00374                 glPopMatrix();
00375             }
00376         }
00377     }
00378     glPopName();
00379 }
00380 
00381 
00382 Boundary
00383 GUITriggeredRerouter::getCenteringBoundary() const throw() {
00384     Boundary b(myBoundary);
00385     b.grow(20);
00386     return b;
00387 }
00388 
00389 
00390 
00391 GUIManipulator*
00392 GUITriggeredRerouter::openManipulator(GUIMainWindow& app,
00393                                       GUISUMOAbstractView&) {
00394     GUIManip_TriggeredRerouter* gui =
00395         new GUIManip_TriggeredRerouter(app, getFullName(), *this, 0, 0);
00396     gui->create();
00397     gui->show();
00398     return gui;
00399 }
00400 
00401 
00402 
00403 /****************************************************************************/
00404 
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Friends Defines