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 2001-2010 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/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 // FOX callback mapping
00068 // ===========================================================================
00069 /* -------------------------------------------------------------------------
00070  * GUITriggeredRerouter::GUITriggeredRerouterPopupMenu - mapping
00071  * ----------------------------------------------------------------------- */
00072 FXDEFMAP(GUITriggeredRerouter::GUITriggeredRerouterPopupMenu)
00073 GUITriggeredRerouterPopupMenuMap[]= {
00074     FXMAPFUNC(SEL_COMMAND,  MID_MANIP,         GUITriggeredRerouter::GUITriggeredRerouterPopupMenu::onCmdOpenManip),
00075 
00076 };
00077 
00078 // Object implementation
00079 FXIMPLEMENT(GUITriggeredRerouter::GUITriggeredRerouterPopupMenu, GUIGLObjectPopupMenu, GUITriggeredRerouterPopupMenuMap, ARRAYNUMBER(GUITriggeredRerouterPopupMenuMap))
00080 
00081 
00082 /* -------------------------------------------------------------------------
00083  * GUITriggeredRerouter::GUIManip_TriggeredRerouter - mapping
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 // method definitions
00097 // ===========================================================================
00098 /* -------------------------------------------------------------------------
00099  * GUITriggeredRerouter::GUIManip_TriggeredRerouter - methods
00100  * ----------------------------------------------------------------------- */
00101 GUITriggeredRerouter::GUIManip_TriggeredRerouter::GUIManip_TriggeredRerouter(
00102     GUIMainWindow &app,
00103     const std::string &name, GUITriggeredRerouter &o,
00104     int /*xpos*/, int /*ypos*/)
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         // 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(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     // (optional) set id
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         // base
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     // (optional) clear id
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 

Generated on Wed May 5 00:06:30 2010 for Sumo - Simulation of Urban MObility by  doxygen 1.5.6