SUMO - Simulation of Urban MObility
|
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