SUMO - Simulation of Urban MObility

GUIVisualizationSettings.cpp

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