SUMO - Simulation of Urban MObility
|
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