|
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 #endif 00201 } 00202 00203 00204 size_t 00205 GUIVisualizationSettings::getLaneEdgeMode() const { 00206 #ifdef HAVE_MESOSIM 00207 if (UseMesoSim) { 00208 return edgeColorer.getActive(); 00209 } 00210 #endif 00211 return laneColorer.getActive(); 00212 } 00213 00214 00215 GUIColorScheme& 00216 GUIVisualizationSettings::getLaneEdgeScheme() { 00217 #ifdef HAVE_MESOSIM 00218 if (UseMesoSim) { 00219 return edgeColorer.getScheme(); 00220 } 00221 #endif 00222 return laneColorer.getScheme(); 00223 } 00224 00225 00226 void 00227 GUIVisualizationSettings::save(OutputDevice& dev) const { 00228 dev << "<viewsettings>\n"; 00229 dev << " <scheme name=\"" << name << "\">\n"; 00230 dev << " <opengl antialiase=\"" << antialiase << "\" dither=\"" << dither << "\"/>\n"; 00231 dev << " <background backgroundColor=\"" << backgroundColor << "\"\n" 00232 << " showGrid=\"" << showGrid 00233 << "\" gridXSize=\"" << gridXSize << "\" gridYSize=\"" << gridYSize << "\"/>\n"; 00234 dev << " <edges laneEdgeMode=\"" << getLaneEdgeMode() 00235 << "\" laneShowBorders=\"" << laneShowBorders 00236 << "\" showLinkDecals=\"" << showLinkDecals 00237 << "\" showRails=\"" << showRails 00238 << "\" hideConnectors=\"" << hideConnectors << "\"\n" 00239 << " " << edgeName.print("edgeName") << "\n" 00240 << " " << internalEdgeName.print("internalEdgeName") << "\n" 00241 << " " << streetName.print("streetName") << ">\n"; 00242 laneColorer.save(dev); 00243 #ifdef HAVE_MESOSIM 00244 edgeColorer.save(dev); 00245 #endif 00246 dev << " </edges>\n"; 00247 00248 dev << " <vehicles vehicleMode=\"" << vehicleColorer.getActive() 00249 << "\" vehicleQuality=\"" << vehicleQuality 00250 << "\" minVehicleSize=\"" << minVehicleSize 00251 << "\" vehicleExaggeration=\"" << vehicleExaggeration 00252 << "\" showBlinker=\"" << showBlinker << "\"\n" 00253 << " " << vehicleName.print("vehicleName") 00254 << ">\n"; 00255 vehicleColorer.save(dev); 00256 dev << " </vehicles>\n"; 00257 00258 dev << " <junctions junctionMode=\"" << junctionMode 00259 << "\" drawLinkTLIndex=\"" << drawLinkTLIndex 00260 << "\" drawLinkJunctionIndex=\"" << drawLinkJunctionIndex << "\"\n" 00261 << " " << junctionName.print("junctionName") << "\n" 00262 << " " << internalJunctionName.print("internalJunctionName") << "\n" 00263 << " showLane2Lane=\"" << showLane2Lane << "\"/>\n"; 00264 00265 dev << " <additionals addMode=\"" << addMode 00266 << "\" minAddSize=\"" << minAddSize 00267 << "\" addExaggeration=\"" << addExaggeration << "\"\n" 00268 << " " << addName.print("addName") 00269 << "/>\n"; 00270 00271 dev << " <pois poiExaggeration=\"" << poiExaggeration 00272 << "\" minPOISize=\"" << minPOISize << "\"\n" 00273 << " " << poiName.print("poiName") 00274 << "/>\n"; 00275 00276 dev << " <legend showSizeLegend=\"" << showSizeLegend << "\"/>\n"; 00277 dev << " </scheme>\n"; 00278 dev << "</viewsettings>\n"; 00279 } 00280 00281 00282 bool 00283 GUIVisualizationSettings::operator==(const GUIVisualizationSettings& v2) { 00284 if (antialiase != v2.antialiase) { 00285 return false; 00286 } 00287 if (dither != v2.dither) { 00288 return false; 00289 } 00290 if (backgroundColor != v2.backgroundColor) { 00291 return false; 00292 } 00293 if (showBackgroundDecals != v2.showBackgroundDecals) { 00294 return false; 00295 } 00296 if (showGrid != v2.showGrid) { 00297 return false; 00298 } 00299 if (gridXSize != v2.gridXSize) { 00300 return false; 00301 } 00302 if (gridYSize != v2.gridYSize) { 00303 return false; 00304 } 00305 00306 #ifdef HAVE_MESOSIM 00307 if (!(edgeColorer == v2.edgeColorer)) { 00308 return false; 00309 } 00310 #endif 00311 if (!(laneColorer == v2.laneColorer)) { 00312 return false; 00313 } 00314 if (laneShowBorders != v2.laneShowBorders) { 00315 return false; 00316 } 00317 if (showLinkDecals != v2.showLinkDecals) { 00318 return false; 00319 } 00320 if (showRails != v2.showRails) { 00321 return false; 00322 } 00323 if (edgeName != v2.edgeName) { 00324 return false; 00325 } 00326 if (internalEdgeName != v2.internalEdgeName) { 00327 return false; 00328 } 00329 if (streetName != v2.streetName) { 00330 return false; 00331 } 00332 if (hideConnectors != v2.hideConnectors) { 00333 return false; 00334 } 00335 00336 if (!(vehicleColorer == v2.vehicleColorer)) { 00337 return false; 00338 } 00339 if (vehicleQuality != v2.vehicleQuality) { 00340 return false; 00341 } 00342 if (minVehicleSize != v2.minVehicleSize) { 00343 return false; 00344 } 00345 if (vehicleExaggeration != v2.vehicleExaggeration) { 00346 return false; 00347 } 00348 if (showBlinker != v2.showBlinker) { 00349 return false; 00350 } 00351 if (drawLaneChangePreference != v2.drawLaneChangePreference) { 00352 return false; 00353 } 00354 if (drawMinGap != v2.drawMinGap) { 00355 return false; 00356 } 00357 if (vehicleName != v2.vehicleName) { 00358 return false; 00359 } 00360 if (junctionMode != v2.junctionMode) { 00361 return false; 00362 } 00363 if (drawLinkTLIndex != v2.drawLinkTLIndex) { 00364 return false; 00365 } 00366 if (drawLinkJunctionIndex != v2.drawLinkJunctionIndex) { 00367 return false; 00368 } 00369 if (junctionName != v2.junctionName) { 00370 return false; 00371 } 00372 if (internalJunctionName != v2.internalJunctionName) { 00373 return false; 00374 } 00375 00376 if (showLane2Lane != v2.showLane2Lane) { 00377 return false; 00378 } 00379 00380 if (addMode != v2.addMode) { 00381 return false; 00382 } 00383 if (minAddSize != v2.minAddSize) { 00384 return false; 00385 } 00386 if (addExaggeration != v2.addExaggeration) { 00387 return false; 00388 } 00389 if (addName != v2.addName) { 00390 return false; 00391 } 00392 00393 if (minPOISize != v2.minPOISize) { 00394 return false; 00395 } 00396 if (poiExaggeration != v2.poiExaggeration) { 00397 return false; 00398 } 00399 if (poiName != v2.poiName) { 00400 return false; 00401 } 00402 00403 if (showSizeLegend != v2.showSizeLegend) { 00404 return false; 00405 } 00406 00407 return true; 00408 } 00409 00410 00411 00412 /****************************************************************************/ 00413