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