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 #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 
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Friends Defines