SUMO - Simulation of Urban MObility
GUIVisualizationSettings.cpp
Go to the documentation of this file.
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 
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Friends Defines