|
SUMO - Simulation of Urban MObility
|
00001 /****************************************************************************/ 00007 // Stores the information about how to visualize structures 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 #include <map> 00031 #include <vector> 00032 #include "GUIVisualizationSettings.h" 00033 #include "GUIColorScheme.h" 00034 00035 #ifdef CHECK_MEMORY_LEAKS 00036 #include <foreign/nvwa/debug_new.h> 00037 #endif // CHECK_MEMORY_LEAKS 00038 00039 // =========================================================================== 00040 // static members 00041 // =========================================================================== 00042 #ifdef HAVE_MESOSIM 00043 bool GUIVisualizationSettings::UseMesoSim = false; 00044 #endif 00045 00046 // =========================================================================== 00047 // member method definitions 00048 // =========================================================================== 00049 GUIVisualizationSettings::GUIVisualizationSettings() throw() 00050 : name(""), antialiase(false), dither(false), 00051 backgroundColor(RGBColor(1, 1, 1)), 00052 showGrid(false), gridXSize(100), gridYSize(100), 00053 laneShowBorders(false), showLinkDecals(true), showRails(true), 00054 edgeName(false, 50, RGBColor(1, .5, 0)), 00055 internalEdgeName(false, 40, RGBColor(.5, .25, 0)), 00056 streetName(false, 55, RGBColor(1, 1, 0)), 00057 hideConnectors(false), vehicleQuality(0), 00058 minVehicleSize(1), vehicleExaggeration(1), showBlinker(true), 00059 drawLaneChangePreference(false), 00060 vehicleName(false, 50, RGBColor(.8, .6, 0)), 00061 junctionMode(0), drawLinkTLIndex(false), drawLinkJunctionIndex(false), 00062 junctionName(false, 50, RGBColor(0, 1, .5)), 00063 internalJunctionName(false, 50, RGBColor(0, .8, .5)), 00064 showLane2Lane(false), addMode(0), minAddSize(1), addExaggeration(1), 00065 addName(false, 50, RGBColor(1., 0, .5)), 00066 poiName(false, 50, RGBColor(1., 0, .5)), 00067 minPOISize(0), poiExaggeration(1), 00068 showSizeLegend(true), 00069 gaming(false), 00070 selectionScale(1) { 00072 GUIColorScheme scheme = GUIColorScheme("uniform", RGBColor(0,0,0), "", true); 00073 laneColorer.addScheme(scheme); 00074 scheme = GUIColorScheme("by selection (lane-/streetwise)", RGBColor(0.7f, 0.7f, 0.7f), "unselected", true); 00075 scheme.addColor(RGBColor(0, .4f, .8f), 1, "selected"); 00076 laneColorer.addScheme(scheme); 00077 scheme = GUIColorScheme("by vclass", RGBColor(0,0,0), "all", true); 00078 scheme.addColor(RGBColor(0, .1f, .5f), 1, "public"); 00079 laneColorer.addScheme(scheme); 00080 // ... traffic states ... 00081 scheme = GUIColorScheme("by allowed speed (lanewise)", RGBColor(1,0,0)); 00082 scheme.addColor(RGBColor(0, 0, 1), (SUMOReal)(150.0/3.6)); 00083 laneColorer.addScheme(scheme); 00084 scheme = GUIColorScheme("by current occupancy (lanewise)", RGBColor(0,0,1)); 00085 scheme.addColor(RGBColor(1, 0, 0), (SUMOReal)0.95); 00086 laneColorer.addScheme(scheme); 00087 scheme = GUIColorScheme("by first vehicle waiting time (lanewise)", RGBColor(0,1,0)); 00088 scheme.addColor(RGBColor(1,0,0), (SUMOReal)200); 00089 laneColorer.addScheme(scheme); 00090 scheme = GUIColorScheme("by lane number (streetwise)", RGBColor(1,0,0)); 00091 scheme.addColor(RGBColor(0,0,1), (SUMOReal)5); 00092 laneColorer.addScheme(scheme); 00093 // ... emissions ... 00094 scheme = GUIColorScheme("by CO2 emissions (HBEFA)", RGBColor(0,1,0)); 00095 scheme.addColor(RGBColor(1,0,0), (SUMOReal)(10./7.5/5.)); 00096 laneColorer.addScheme(scheme); 00097 scheme = GUIColorScheme("by CO emissions (HBEFA)", RGBColor(0,1,0)); 00098 scheme.addColor(RGBColor(1,0,0), (SUMOReal)(0.05/7.5/2.)); 00099 laneColorer.addScheme(scheme); 00100 scheme = GUIColorScheme("by PMx emissions (HBEFA)", RGBColor(0,1,0)); 00101 scheme.addColor(RGBColor(1,0,0), (SUMOReal)(.005/7.5/5.)); 00102 laneColorer.addScheme(scheme); 00103 scheme = GUIColorScheme("by NOx emissions (HBEFA)", RGBColor(0,1,0)); 00104 scheme.addColor(RGBColor(1,0,0), (SUMOReal)(.125/7.5/5.)); 00105 laneColorer.addScheme(scheme); 00106 scheme = GUIColorScheme("by HC emissions (HBEFA)", RGBColor(0,1,0)); 00107 scheme.addColor(RGBColor(1,0,0), (SUMOReal)(.02/7.5/4.)); 00108 laneColorer.addScheme(scheme); 00109 scheme = GUIColorScheme("by fuel consumption (HBEFA)", RGBColor(0,1,0)); 00110 scheme.addColor(RGBColor(1,0,0), (SUMOReal)(.005/7.5*100.)); 00111 laneColorer.addScheme(scheme); 00112 scheme = GUIColorScheme("by noise emissions (Harmonoise)", RGBColor(0,1,0)); 00113 scheme.addColor(RGBColor(1,0,0), (SUMOReal)100); 00114 laneColorer.addScheme(scheme); 00115 // ... weights (experimental) ... 00116 scheme = GUIColorScheme("by global travel time", RGBColor(0,1,0)); 00117 scheme.addColor(RGBColor(1,0,0), (SUMOReal)100); 00118 scheme.setAllowsNegativeValues(true); 00119 laneColorer.addScheme(scheme); 00120 scheme = GUIColorScheme("by global speed percentage", RGBColor(1,0,0)); 00121 scheme.addColor(RGBColor(1,1,0), (SUMOReal)50); 00122 scheme.addColor(RGBColor(0,1,0), (SUMOReal)100); 00123 scheme.setAllowsNegativeValues(true); 00124 laneColorer.addScheme(scheme); 00125 00126 00128 vehicleColorer.addScheme(GUIColorScheme("uniform", RGBColor(1,1,0), "", true)); 00129 vehicleColorer.addScheme(GUIColorScheme("given/assigned vehicle color", RGBColor(1,1,0), "", true)); 00130 vehicleColorer.addScheme(GUIColorScheme("given/assigned type color", RGBColor(1,1,0), "", true)); 00131 vehicleColorer.addScheme(GUIColorScheme("given/assigned route color", RGBColor(1,1,0), "", true)); 00132 vehicleColorer.addScheme(GUIColorScheme("depart position as HSV", RGBColor(1,1,0), "", true)); 00133 vehicleColorer.addScheme(GUIColorScheme("arrival position as HSV", RGBColor(1,1,0), "", true)); 00134 vehicleColorer.addScheme(GUIColorScheme("direction/distance as HSV", RGBColor(1,1,0), "", true)); 00135 scheme = GUIColorScheme("by speed", RGBColor(1,0,0)); 00136 scheme.addColor(RGBColor(0,0,1), (SUMOReal)(150.0/3.6)); 00137 vehicleColorer.addScheme(scheme); 00138 scheme = GUIColorScheme("by waiting time", RGBColor(0,0,1)); 00139 scheme.addColor(RGBColor(1,0,0), (SUMOReal)(5*60)); 00140 vehicleColorer.addScheme(scheme); 00141 scheme = GUIColorScheme("by time since last lanechange", RGBColor(1,1,1)); 00142 scheme.addColor(RGBColor(.5,.5,.5), (SUMOReal)(5*60)); 00143 vehicleColorer.addScheme(scheme); 00144 scheme = GUIColorScheme("by max speed", RGBColor(1,0,0)); 00145 scheme.addColor(RGBColor(0,0,1), (SUMOReal)(150.0/3.6)); 00146 vehicleColorer.addScheme(scheme); 00147 // ... emissions ... 00148 scheme = GUIColorScheme("by CO2 emissions (HBEFA)", RGBColor(0,1,0)); 00149 scheme.addColor(RGBColor(1,0,0), (SUMOReal)5.); 00150 vehicleColorer.addScheme(scheme); 00151 scheme = GUIColorScheme("by CO emissions (HBEFA)", RGBColor(0,1,0)); 00152 scheme.addColor(RGBColor(1,0,0), (SUMOReal)0.05); 00153 vehicleColorer.addScheme(scheme); 00154 scheme = GUIColorScheme("by PMx emissions (HBEFA)", RGBColor(0,1,0)); 00155 scheme.addColor(RGBColor(1,0,0), (SUMOReal).005); 00156 vehicleColorer.addScheme(scheme); 00157 scheme = GUIColorScheme("by NOx emissions (HBEFA)", RGBColor(0,1,0)); 00158 scheme.addColor(RGBColor(1,0,0), (SUMOReal).125); 00159 vehicleColorer.addScheme(scheme); 00160 scheme = GUIColorScheme("by HC emissions (HBEFA)", RGBColor(0,1,0)); 00161 scheme.addColor(RGBColor(1,0,0), (SUMOReal).02); 00162 vehicleColorer.addScheme(scheme); 00163 scheme = GUIColorScheme("by fuel consumption (HBEFA)", RGBColor(0,1,0)); 00164 scheme.addColor(RGBColor(1,0,0), (SUMOReal).005); 00165 vehicleColorer.addScheme(scheme); 00166 scheme = GUIColorScheme("by noise emissions (Harmonoise)", RGBColor(0,1,0)); 00167 scheme.addColor(RGBColor(1,0,0), (SUMOReal)100.); 00168 vehicleColorer.addScheme(scheme); 00169 scheme = GUIColorScheme("by reroute number", RGBColor(1,0,0)); 00170 scheme.addColor(RGBColor(1,1,0), (SUMOReal)1.); 00171 scheme.addColor(RGBColor(1,1,1), (SUMOReal)10.); 00172 vehicleColorer.addScheme(scheme); 00173 00174 00175 #ifdef HAVE_MESOSIM 00176 00177 edgeColorer.addScheme(GUIColorScheme("uniform (streetwise)", RGBColor(0,0,0), "", true)); 00178 scheme = GUIColorScheme("by selection (streetwise)", RGBColor(0.7f, 0.7f, 0.7f), "unselected", true); 00179 scheme.addColor(RGBColor(0, .4f, .8f), 1, "selected"); 00180 edgeColorer.addScheme(scheme); 00181 scheme = GUIColorScheme("by purpose (streetwise)", RGBColor(0,0,0), "normal", true); 00182 scheme.addColor(RGBColor(.5, 0, .5), 1, "connector"); // see MSEdge::EdgeBasicFunction::EDGEFUNCTION_CONNECTOR 00183 scheme.addColor(RGBColor(0, 0, 1), 2, "internal"); // see MSEdge::EdgeBasicFunction::EDGEFUNCTION_INTERNAL 00184 edgeColorer.addScheme(scheme); 00185 scheme = GUIColorScheme("by allowed speed (streetwise)", RGBColor(1,0,0)); 00186 scheme.addColor(RGBColor(0, 0, 1), (SUMOReal)(150.0/3.6)); 00187 edgeColorer.addScheme(scheme); 00188 scheme = GUIColorScheme("by current occupancy (streetwise)", RGBColor(0,0,1)); 00189 scheme.addColor(RGBColor(1, 0, 0), (SUMOReal)0.95); 00190 edgeColorer.addScheme(scheme); 00191 scheme = GUIColorScheme("by current speed (streetwise)", RGBColor(1,0,0)); 00192 scheme.addColor(RGBColor(0, 0, 1), (SUMOReal)(150.0/3.6)); 00193 edgeColorer.addScheme(scheme); 00194 scheme = GUIColorScheme("by current flow (streetwise)", RGBColor(0,0,1)); 00195 scheme.addColor(RGBColor(1, 0, 0), (SUMOReal)5000); 00196 edgeColorer.addScheme(scheme); 00197 #endif 00198 } 00199 00200 00201 size_t 00202 GUIVisualizationSettings::getLaneEdgeMode() const { 00203 #ifdef HAVE_MESOSIM 00204 if (UseMesoSim) { 00205 return edgeColorer.getActive(); 00206 } 00207 #endif 00208 return laneColorer.getActive(); 00209 } 00210 00211 00212 GUIColorScheme& 00213 GUIVisualizationSettings::getLaneEdgeScheme() { 00214 #ifdef HAVE_MESOSIM 00215 if (UseMesoSim) { 00216 return edgeColorer.getScheme(); 00217 } 00218 #endif 00219 return laneColorer.getScheme(); 00220 } 00221 00222 00223 void 00224 GUIVisualizationSettings::save(OutputDevice& dev) const throw(IOError) { 00225 dev << "<viewsettings>\n"; 00226 dev << " <scheme name=\"" << name << "\">\n"; 00227 dev << " <opengl antialiase=\"" << antialiase << "\" dither=\"" << dither << "\"/>\n"; 00228 dev << " <background backgroundColor=\"" << backgroundColor << "\"\n" 00229 << " showGrid=\"" << showGrid 00230 << "\" gridXSize=\"" << gridXSize << "\" gridYSize=\"" << gridYSize << "\"/>\n"; 00231 dev << " <edges laneEdgeMode=\"" << getLaneEdgeMode() 00232 << "\" laneShowBorders=\"" << laneShowBorders 00233 << "\" showLinkDecals=\"" << showLinkDecals 00234 << "\" showRails=\"" << showRails 00235 << "\" hideConnectors=\"" << hideConnectors << "\"\n" 00236 << " " << edgeName.print("edgeName") << "\n" 00237 << " " << internalEdgeName.print("internalEdgeName") << "\n" 00238 << " " << streetName.print("streetName") << ">\n"; 00239 laneColorer.save(dev); 00240 #ifdef HAVE_MESOSIM 00241 edgeColorer.save(dev); 00242 #endif 00243 dev << " </edges>\n"; 00244 00245 dev << " <vehicles vehicleMode=\"" << vehicleColorer.getActive() 00246 << "\" vehicleQuality=\"" << vehicleQuality 00247 << "\" minVehicleSize=\"" << minVehicleSize 00248 << "\" vehicleExaggeration=\"" << vehicleExaggeration 00249 << "\" showBlinker=\"" << showBlinker << "\"\n" 00250 << " " << vehicleName.print("vehicleName") 00251 << ">\n"; 00252 vehicleColorer.save(dev); 00253 dev << " </vehicles>\n"; 00254 00255 dev << " <junctions junctionMode=\"" << junctionMode 00256 << "\" drawLinkTLIndex=\"" << drawLinkTLIndex 00257 << "\" drawLinkJunctionIndex=\"" << drawLinkJunctionIndex << "\"\n" 00258 << " " << junctionName.print("junctionName") << "\n" 00259 << " " << internalJunctionName.print("internalJunctionName") << "\n" 00260 << " showLane2Lane=\"" << showLane2Lane << "\"/>\n"; 00261 00262 dev << " <additionals addMode=\"" << addMode 00263 << "\" minAddSize=\"" << minAddSize 00264 << "\" addExaggeration=\"" << addExaggeration << "\"\n" 00265 << " " << addName.print("addName") 00266 << "/>\n"; 00267 00268 dev << " <pois poiExaggeration=\"" << poiExaggeration 00269 << "\" minPOISize=\"" << minPOISize << "\"\n" 00270 << " " << poiName.print("poiName") 00271 << "/>\n"; 00272 00273 dev << " <legend showSizeLegend=\"" << showSizeLegend << "\"/>\n"; 00274 dev << " </scheme>\n"; 00275 dev << "</viewsettings>\n"; 00276 } 00277 00278 00279 bool 00280 GUIVisualizationSettings::operator==(const GUIVisualizationSettings& v2) { 00281 if (antialiase!=v2.antialiase) { 00282 return false; 00283 } 00284 if (dither!=v2.dither) { 00285 return false; 00286 } 00287 if (backgroundColor!=v2.backgroundColor) { 00288 return false; 00289 } 00290 if (showBackgroundDecals!=v2.showBackgroundDecals) { 00291 return false; 00292 } 00293 if (showGrid!=v2.showGrid) { 00294 return false; 00295 } 00296 if (gridXSize!=v2.gridXSize) { 00297 return false; 00298 } 00299 if (gridYSize!=v2.gridYSize) { 00300 return false; 00301 } 00302 00303 #ifdef HAVE_MESOSIM 00304 if (!(edgeColorer==v2.edgeColorer)) { 00305 return false; 00306 } 00307 #endif 00308 if (!(laneColorer==v2.laneColorer)) { 00309 return false; 00310 } 00311 if (laneShowBorders!=v2.laneShowBorders) { 00312 return false; 00313 } 00314 if (showLinkDecals!=v2.showLinkDecals) { 00315 return false; 00316 } 00317 if (showRails!=v2.showRails) { 00318 return false; 00319 } 00320 if (edgeName!=v2.edgeName) { 00321 return false; 00322 } 00323 if (internalEdgeName!=v2.internalEdgeName) { 00324 return false; 00325 } 00326 if (streetName!=v2.streetName) { 00327 return false; 00328 } 00329 if (hideConnectors!=v2.hideConnectors) { 00330 return false; 00331 } 00332 00333 if (!(vehicleColorer==v2.vehicleColorer)) { 00334 return false; 00335 } 00336 if (vehicleQuality!=v2.vehicleQuality) { 00337 return false; 00338 } 00339 if (minVehicleSize!=v2.minVehicleSize) { 00340 return false; 00341 } 00342 if (vehicleExaggeration!=v2.vehicleExaggeration) { 00343 return false; 00344 } 00345 if (showBlinker!=v2.showBlinker) { 00346 return false; 00347 } 00348 if (drawLaneChangePreference!=v2.drawLaneChangePreference) { 00349 return false; 00350 } 00351 if (vehicleName!=v2.vehicleName) { 00352 return false; 00353 } 00354 if (junctionMode!=v2.junctionMode) { 00355 return false; 00356 } 00357 if (drawLinkTLIndex!=v2.drawLinkTLIndex) { 00358 return false; 00359 } 00360 if (drawLinkJunctionIndex!=v2.drawLinkJunctionIndex) { 00361 return false; 00362 } 00363 if (junctionName!=v2.junctionName) { 00364 return false; 00365 } 00366 if (internalJunctionName!=v2.internalJunctionName) { 00367 return false; 00368 } 00369 00370 if (showLane2Lane!=v2.showLane2Lane) { 00371 return false; 00372 } 00373 00374 if (addMode!=v2.addMode) { 00375 return false; 00376 } 00377 if (minAddSize!=v2.minAddSize) { 00378 return false; 00379 } 00380 if (addExaggeration!=v2.addExaggeration) { 00381 return false; 00382 } 00383 if (addName!=v2.addName) { 00384 return false; 00385 } 00386 00387 if (minPOISize!=v2.minPOISize) { 00388 return false; 00389 } 00390 if (poiExaggeration!=v2.poiExaggeration) { 00391 return false; 00392 } 00393 if (poiName!=v2.poiName) { 00394 return false; 00395 } 00396 00397 if (showSizeLegend!=v2.showSizeLegend) { 00398 return false; 00399 } 00400 00401 return true; 00402 } 00403 00404 00405 00406 /****************************************************************************/ 00407