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