SUMO - Simulation of Urban MObility
GUISettingsHandler.cpp
Go to the documentation of this file.
00001 /****************************************************************************/
00010 // The dialog to change the view (gui) settings.
00011 /****************************************************************************/
00012 // SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/
00013 // Copyright (C) 2001-2012 DLR (http://www.dlr.de/) and contributors
00014 /****************************************************************************/
00015 //
00016 //   This file is part of SUMO.
00017 //   SUMO is free software: you can redistribute it and/or modify
00018 //   it under the terms of the GNU General Public License as published by
00019 //   the Free Software Foundation, either version 3 of the License, or
00020 //   (at your option) any later version.
00021 //
00022 /****************************************************************************/
00023 
00024 
00025 // ===========================================================================
00026 // included modules
00027 // ===========================================================================
00028 #ifdef _MSC_VER
00029 #include <windows_config.h>
00030 #else
00031 #include <config.h>
00032 #endif
00033 
00034 #include <vector>
00035 #include <utils/common/TplConvert.h>
00036 #include <utils/common/ToString.h>
00037 #include <utils/common/RGBColor.h>
00038 #include <utils/common/MsgHandler.h>
00039 #include <utils/common/FileHelpers.h>
00040 #include <utils/gui/settings/GUIVisualizationSettings.h>
00041 #include <utils/gui/settings/GUICompleteSchemeStorage.h>
00042 #include <utils/foxtools/MFXImageHelper.h>
00043 #include <xercesc/framework/MemBufInputSource.hpp>
00044 #include "GUISettingsHandler.h"
00045 
00046 #ifdef CHECK_MEMORY_LEAKS
00047 #include <foreign/nvwa/debug_new.h>
00048 #endif // CHECK_MEMORY_LEAKS
00049 
00050 
00051 // ===========================================================================
00052 // method definitions
00053 // ===========================================================================
00054 GUISettingsHandler::GUISettingsHandler(const std::string& content, bool isFile)
00055     : SUMOSAXHandler(content), myDelay(-1), myZoom(-1), myXPos(-1), myYPos(-1), myCurrentColorer(SUMO_TAG_NOTHING), myCurrentScheme(0) {
00056     if (isFile) {
00057         XMLSubSys::runParser(*this, content);
00058     } else {
00059         setFileName("registrySettings");
00060         SAX2XMLReader* reader = XMLSubSys::getSAXReader(*this);
00061         MemBufInputSource memBufIS((const XMLByte*)content.c_str(), content.size(), "registrySettings");
00062         reader->parse(memBufIS);
00063         delete reader;
00064     }
00065 }
00066 
00067 
00068 GUISettingsHandler::~GUISettingsHandler() {
00069 }
00070 
00071 
00072 void
00073 GUISettingsHandler::myStartElement(int element,
00074                                    const SUMOSAXAttributes& attrs) {
00075     bool ok = true;
00076     switch (element) {
00077         case SUMO_TAG_DELAY:
00078             myDelay = attrs.getOptSUMORealReporting(SUMO_ATTR_VALUE, 0, ok, myDelay);
00079             break;
00080         case SUMO_TAG_VIEWPORT:
00081             myZoom = attrs.getOptSUMORealReporting(SUMO_ATTR_ZOOM, 0, ok, myZoom);
00082             myXPos = attrs.getOptSUMORealReporting(SUMO_ATTR_X, 0, ok, myXPos);
00083             myYPos = attrs.getOptSUMORealReporting(SUMO_ATTR_Y, 0, ok, myYPos);
00084             break;
00085         case SUMO_TAG_SNAPSHOT: {
00086             bool ok = true;
00087             std::string file = attrs.getStringReporting(SUMO_ATTR_FILE, 0, ok);
00088             if (file != "" && !FileHelpers::isAbsolute(file)) {
00089                 file = FileHelpers::getConfigurationRelative(getFileName(), file);
00090             }
00091             mySnapshots[attrs.getOptSUMOTimeReporting(SUMO_ATTR_TIME, file.c_str(), ok, 0)] = file;
00092         }
00093         break;
00094         case SUMO_TAG_VIEWSETTINGS_SCHEME: {
00095             bool ok = true;
00096             mySettings.name = attrs.getOptStringReporting(SUMO_ATTR_NAME, 0, ok, mySettings.name);
00097             if (gSchemeStorage.contains(mySettings.name)) {
00098                 mySettings = gSchemeStorage.get(mySettings.name);
00099             }
00100         }
00101         break;
00102         case SUMO_TAG_VIEWSETTINGS_OPENGL:
00103             mySettings.antialiase = TplConvert<char>::_2bool(attrs.getStringSecure("antialiase", toString(mySettings.antialiase)).c_str());
00104             mySettings.dither = TplConvert<char>::_2bool(attrs.getStringSecure("dither", toString(mySettings.dither)).c_str());
00105             break;
00106         case SUMO_TAG_VIEWSETTINGS_BACKGROUND: {
00107             bool ok = true;
00108             mySettings.backgroundColor = RGBColor::parseColorReporting(attrs.getStringSecure("backgroundColor", toString(mySettings.backgroundColor)), "background", 0, true, ok);
00109             mySettings.showGrid = TplConvert<char>::_2bool(attrs.getStringSecure("showGrid", toString(mySettings.showGrid)).c_str());
00110             mySettings.gridXSize = TplConvert<char>::_2SUMOReal(attrs.getStringSecure("gridXSize", toString(mySettings.gridXSize)).c_str());
00111             mySettings.gridYSize = TplConvert<char>::_2SUMOReal(attrs.getStringSecure("gridYSize", toString(mySettings.gridYSize)).c_str());
00112         }
00113         break;
00114         case SUMO_TAG_VIEWSETTINGS_EDGES: {
00115             bool ok = true;
00116             int laneEdgeMode = TplConvert<char>::_2int(attrs.getStringSecure("laneEdgeMode", "0").c_str());
00117             mySettings.laneShowBorders = TplConvert<char>::_2bool(attrs.getStringSecure("laneShowBorders", toString(mySettings.laneShowBorders)).c_str());
00118             mySettings.showLinkDecals = TplConvert<char>::_2bool(attrs.getStringSecure("showLinkDecals", toString(mySettings.showLinkDecals)).c_str());
00119             mySettings.showRails = TplConvert<char>::_2bool(attrs.getStringSecure("showRails", toString(mySettings.showRails)).c_str());
00120             mySettings.edgeName = parseTextSettings("edgeName", attrs, mySettings.edgeName);
00121             mySettings.internalEdgeName = parseTextSettings("internalEdgeName", attrs, mySettings.internalEdgeName);
00122             mySettings.streetName = parseTextSettings("streetName", attrs, mySettings.streetName);
00123             mySettings.hideConnectors = TplConvert<char>::_2bool(attrs.getStringSecure("hideConnectors", toString(mySettings.hideConnectors)).c_str());
00124             myCurrentColorer = element;
00125 #ifdef HAVE_MESOSIM
00126             mySettings.edgeColorer.setActive(laneEdgeMode);
00127 #endif
00128             mySettings.laneColorer.setActive(laneEdgeMode);
00129         }
00130         break;
00131         case SUMO_TAG_COLORSCHEME:
00132             myCurrentScheme = 0;
00133             if (myCurrentColorer == SUMO_TAG_VIEWSETTINGS_EDGES) {
00134                 myCurrentScheme = mySettings.laneColorer.getSchemeByName(attrs.getStringSecure(SUMO_ATTR_NAME, ""));
00135 #ifdef HAVE_MESOSIM
00136                 if (myCurrentScheme == 0) {
00137                     myCurrentScheme = mySettings.edgeColorer.getSchemeByName(attrs.getStringSecure(SUMO_ATTR_NAME, ""));
00138                 }
00139 #endif
00140             }
00141             if (myCurrentColorer == SUMO_TAG_VIEWSETTINGS_VEHICLES) {
00142                 myCurrentScheme = mySettings.vehicleColorer.getSchemeByName(attrs.getStringSecure(SUMO_ATTR_NAME, ""));
00143             }
00144             if (myCurrentScheme && !myCurrentScheme->isFixed()) {
00145                 bool ok = true;
00146                 myCurrentScheme->setInterpolated(attrs.getOptBoolReporting(SUMO_ATTR_INTERPOLATED, 0, ok, false));
00147                 myCurrentScheme->clear();
00148             }
00149             break;
00150         case SUMO_TAG_ENTRY:
00151             if (myCurrentScheme) {
00152                 bool ok = true;
00153                 std::string colorStr = attrs.getStringReporting(SUMO_ATTR_COLOR, 0, ok);
00154                 RGBColor color = RGBColor::parseColorReporting(colorStr, attrs.getObjectType(), 0, true, ok);
00155                 if (myCurrentScheme->isFixed()) {
00156                     myCurrentScheme->setColor(attrs.getStringSecure(SUMO_ATTR_NAME, ""), color);
00157                 } else {
00158                     myCurrentScheme->addColor(color,
00159                                               attrs.getSUMORealReporting(SUMO_ATTR_THRESHOLD, 0, ok));
00160                 }
00161             }
00162             break;
00163         case SUMO_TAG_VIEWSETTINGS_VEHICLES:
00164             mySettings.vehicleColorer.setActive(TplConvert<char>::_2int(attrs.getStringSecure("vehicleMode", "0").c_str()));
00165             mySettings.vehicleQuality = TplConvert<char>::_2int(attrs.getStringSecure("vehicleQuality", toString(mySettings.vehicleQuality)).c_str());
00166             mySettings.minVehicleSize = TplConvert<char>::_2SUMOReal(attrs.getStringSecure("minVehicleSize", toString(mySettings.minVehicleSize)).c_str());
00167             mySettings.vehicleExaggeration = TplConvert<char>::_2SUMOReal(attrs.getStringSecure("vehicleExaggeration", toString(mySettings.vehicleExaggeration)).c_str());
00168             mySettings.showBlinker = TplConvert<char>::_2bool(attrs.getStringSecure("showBlinker", toString(mySettings.showBlinker)).c_str());
00169             mySettings.vehicleName = parseTextSettings("vehicleName", attrs, mySettings.vehicleName);
00170             myCurrentColorer = element;
00171             break;
00172         case SUMO_TAG_VIEWSETTINGS_JUNCTIONS:
00173             mySettings.junctionMode = TplConvert<char>::_2int(attrs.getStringSecure("junctionMode", toString(mySettings.junctionMode)).c_str());
00174             mySettings.drawLinkTLIndex = TplConvert<char>::_2bool(attrs.getStringSecure("drawLinkTLIndex", toString(mySettings.drawLinkTLIndex)).c_str());
00175             mySettings.drawLinkJunctionIndex = TplConvert<char>::_2bool(attrs.getStringSecure("drawLinkJunctionIndex", toString(mySettings.drawLinkJunctionIndex)).c_str());
00176             mySettings.junctionName = parseTextSettings("junctionName", attrs, mySettings.junctionName);
00177             mySettings.internalJunctionName = parseTextSettings("internalJunctionName", attrs, mySettings.internalJunctionName);
00178             mySettings.showLane2Lane = TplConvert<char>::_2bool(attrs.getStringSecure("showLane2Lane", toString(mySettings.showLane2Lane)).c_str());
00179             break;
00180         case SUMO_TAG_VIEWSETTINGS_ADDITIONALS:
00181             mySettings.addMode = TplConvert<char>::_2int(attrs.getStringSecure("addMode", toString(mySettings.addMode)).c_str());
00182             mySettings.minAddSize = TplConvert<char>::_2SUMOReal(attrs.getStringSecure("minAddSize", toString(mySettings.minAddSize)).c_str());
00183             mySettings.addExaggeration = TplConvert<char>::_2SUMOReal(attrs.getStringSecure("addExaggeration", toString(mySettings.addExaggeration)).c_str());
00184             mySettings.addName = parseTextSettings("addName", attrs, mySettings.addName);
00185             break;
00186         case SUMO_TAG_VIEWSETTINGS_POIS:
00187             mySettings.poiExaggeration = TplConvert<char>::_2SUMOReal(attrs.getStringSecure("poiExaggeration", toString(mySettings.poiExaggeration)).c_str());
00188             mySettings.minPOISize = TplConvert<char>::_2SUMOReal(attrs.getStringSecure("minPOISize", toString(mySettings.minPOISize)).c_str());
00189             mySettings.poiName = parseTextSettings("poiName", attrs, mySettings.poiName);
00190             break;
00191         case SUMO_TAG_VIEWSETTINGS_LEGEND:
00192             mySettings.showSizeLegend = TplConvert<char>::_2bool(attrs.getStringSecure("showSizeLegend", toString(mySettings.showSizeLegend)).c_str());
00193             break;
00194         case SUMO_TAG_VIEWSETTINGS_DECAL: {
00195             GUISUMOAbstractView::Decal d;
00196             d.filename = attrs.getStringSecure("filename", d.filename);
00197             if (d.filename != "" && !FileHelpers::isAbsolute(d.filename)) {
00198                 d.filename = FileHelpers::getConfigurationRelative(getFileName(), d.filename);
00199             }
00200             d.centerX = TplConvert<char>::_2SUMOReal(attrs.getStringSecure("centerX", toString(d.centerX)).c_str());
00201             d.centerY = TplConvert<char>::_2SUMOReal(attrs.getStringSecure("centerY", toString(d.centerY)).c_str());
00202             d.width = TplConvert<char>::_2SUMOReal(attrs.getStringSecure("width", toString(d.width)).c_str());
00203             d.height = TplConvert<char>::_2SUMOReal(attrs.getStringSecure("height", toString(d.height)).c_str());
00204             d.rot = TplConvert<char>::_2SUMOReal(attrs.getStringSecure("rotation", toString(d.rot)).c_str());
00205             d.initialised = false;
00206             myDecals.push_back(d);
00207         }
00208         break;
00209         default:
00210             break;
00211     }
00212 }
00213 
00214 
00215 GUIVisualizationTextSettings
00216 GUISettingsHandler::parseTextSettings(
00217     const std::string& prefix, const SUMOSAXAttributes& attrs,
00218     GUIVisualizationTextSettings defaults) {
00219     bool ok = true;
00220     return GUIVisualizationTextSettings(
00221                TplConvert<char>::_2bool(attrs.getStringSecure(prefix + "_show", toString(defaults.show)).c_str()),
00222                TplConvert<char>::_2SUMOReal(attrs.getStringSecure(prefix + "_size", toString(defaults.size)).c_str()),
00223                RGBColor::parseColorReporting(attrs.getStringSecure(prefix + "_color", toString(defaults.color)), "edges", 0, true, ok));
00224 }
00225 
00226 
00227 std::string
00228 GUISettingsHandler::addSettings(GUISUMOAbstractView* view) const {
00229     if (mySettings.name != "") {
00230         gSchemeStorage.add(mySettings);
00231         if (view) {
00232             FXint index = view->getColoringSchemesCombo().appendItem(mySettings.name.c_str());
00233             view->getColoringSchemesCombo().setCurrentItem(index);
00234             view->setColorScheme(mySettings.name);
00235         }
00236     }
00237     return mySettings.name;
00238 }
00239 
00240 
00241 void
00242 GUISettingsHandler::setViewport(GUISUMOAbstractView* view) const {
00243     if (myZoom > 0) {
00244         view->setViewport(myZoom, myXPos, myYPos);
00245     }
00246 }
00247 
00248 
00249 void
00250 GUISettingsHandler::setViewport(SUMOReal& zoom, SUMOReal& xoff, SUMOReal& yoff) const {
00251     zoom = myZoom;
00252     xoff = myXPos;
00253     yoff = myYPos;
00254 }
00255 
00256 
00257 void
00258 GUISettingsHandler::setSnapshots(GUISUMOAbstractView* view) const {
00259     if (!mySnapshots.empty()) {
00260         view->setSnapshots(mySnapshots);
00261     }
00262 }
00263 
00264 
00265 bool
00266 GUISettingsHandler::hasDecals() const {
00267     return !myDecals.empty();
00268 }
00269 
00270 
00271 const std::vector<GUISUMOAbstractView::Decal>&
00272 GUISettingsHandler::getDecals() const {
00273     return myDecals;
00274 }
00275 
00276 
00277 SUMOReal
00278 GUISettingsHandler::getDelay() const {
00279     return myDelay;
00280 }
00281 
00282 
00283 /****************************************************************************/
00284 
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Friends Defines