SUMO - Simulation of Urban MObility

GUISettingsHandler.cpp

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