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