00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
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
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(SumoXMLTag 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, "delay", 0, ok, myDelay);
00075 break;
00076 case SUMO_TAG_VIEWPORT:
00077 myZoom = attrs.getOptSUMORealReporting(SUMO_ATTR_ZOOM, "viewport", 0, ok, myZoom);
00078 myXPos = attrs.getOptSUMORealReporting(SUMO_ATTR_X, "viewport", 0, ok, myXPos);
00079 myYPos = attrs.getOptSUMORealReporting(SUMO_ATTR_Y, "viewport", 0, ok, myYPos);
00080 break;
00081 case SUMO_TAG_SNAPSHOT: {
00082 bool ok = true;
00083 std::string file = attrs.getStringReporting(SUMO_ATTR_FILE, "snapshot", 0, ok);
00084 if (file != "" && !FileHelpers::isAbsolute(file)) {
00085 file = FileHelpers::getConfigurationRelative(getFileName(), file);
00086 }
00087 mySnapshots[attrs.getOptSUMOTimeReporting(SUMO_ATTR_TIME, "snapshot", 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, 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.drawEdgeName = TplConvert<char>::_2bool(attrs.getStringSecure("drawEdgeName", toString(mySettings.drawEdgeName)).c_str());
00117 mySettings.edgeNameSize = TplConvert<char>::_2SUMOReal(attrs.getStringSecure("edgeNameSize", toString(mySettings.edgeNameSize)).c_str());
00118 mySettings.edgeNameColor = RGBColor::parseColorReporting(attrs.getStringSecure("edgeNameColor", toString(mySettings.edgeNameColor)), "edges", 0, true, ok);
00119 mySettings.drawInternalEdgeName = TplConvert<char>::_2bool(attrs.getStringSecure("drawInternalEdgeName", toString(mySettings.drawInternalEdgeName)).c_str());
00120 mySettings.internalEdgeNameSize = TplConvert<char>::_2SUMOReal(attrs.getStringSecure("internalEdgeNameSize", toString(mySettings.internalEdgeNameSize)).c_str());
00121 mySettings.internalEdgeNameColor = RGBColor::parseColorReporting(attrs.getStringSecure("internalEdgeNameColor", toString(mySettings.internalEdgeNameColor)), "edges", 0, true, ok);
00122 mySettings.hideConnectors = TplConvert<char>::_2bool(attrs.getStringSecure("hideConnectors", toString(mySettings.hideConnectors)).c_str());
00123 myCurrentColorer = element;
00124 #ifdef HAVE_MESOSIM
00125 mySettings.edgeColorer.setActive(laneEdgeMode);
00126 #endif
00127 mySettings.laneColorer.setActive(laneEdgeMode);
00128 }
00129 break;
00130 case SUMO_TAG_COLORSCHEME:
00131 myCurrentScheme = 0;
00132 if (myCurrentColorer == SUMO_TAG_VIEWSETTINGS_EDGES) {
00133 myCurrentScheme = mySettings.laneColorer.getSchemeByName(attrs.getStringSecure(SUMO_ATTR_NAME, ""));
00134 #ifdef HAVE_MESOSIM
00135 if (myCurrentScheme == 0) {
00136 myCurrentScheme = mySettings.edgeColorer.getSchemeByName(attrs.getStringSecure(SUMO_ATTR_NAME, ""));
00137 }
00138 #endif
00139 }
00140 if (myCurrentColorer == SUMO_TAG_VIEWSETTINGS_VEHICLES) {
00141 myCurrentScheme = mySettings.vehicleColorer.getSchemeByName(attrs.getStringSecure(SUMO_ATTR_NAME, ""));
00142 }
00143 if (myCurrentScheme && !myCurrentScheme->isFixed()) {
00144 bool ok = true;
00145 myCurrentScheme->setInterpolated(attrs.getOptBoolReporting(SUMO_ATTR_INTERPOLATED, "colorScheme", 0, ok, false));
00146 myCurrentScheme->clear();
00147 }
00148 break;
00149 case SUMO_TAG_ENTRY:
00150 if (myCurrentScheme) {
00151 bool ok = true;
00152 std::string colorStr = attrs.getStringReporting(SUMO_ATTR_COLOR, "entry", 0, ok);
00153 RGBColor color = RGBColor::parseColorReporting(colorStr, "edgeColoring", 0, true, ok);
00154 if (myCurrentScheme->isFixed()) {
00155 myCurrentScheme->setColor(attrs.getStringSecure(SUMO_ATTR_NAME, ""), color);
00156 } else {
00157 myCurrentScheme->addColor(color,
00158 attrs.getSUMORealReporting(SUMO_ATTR_THRESHOLD, "entry", 0, ok));
00159 }
00160 }
00161 break;
00162 case SUMO_TAG_VIEWSETTINGS_VEHICLES:
00163 mySettings.vehicleColorer.setActive(TplConvert<char>::_2int(attrs.getStringSecure("vehicleMode", "0").c_str()));
00164 mySettings.vehicleQuality = TplConvert<char>::_2int(attrs.getStringSecure("vehicleQuality", toString(mySettings.vehicleQuality)).c_str());
00165 mySettings.minVehicleSize = TplConvert<char>::_2SUMOReal(attrs.getStringSecure("minVehicleSize", toString(mySettings.minVehicleSize)).c_str());
00166 mySettings.vehicleExaggeration = TplConvert<char>::_2SUMOReal(attrs.getStringSecure("vehicleExaggeration", toString(mySettings.vehicleExaggeration)).c_str());
00167 mySettings.showBlinker = TplConvert<char>::_2bool(attrs.getStringSecure("showBlinker", toString(mySettings.showBlinker)).c_str());
00168 mySettings.drawVehicleName = TplConvert<char>::_2bool(attrs.getStringSecure("drawVehicleName", toString(mySettings.drawVehicleName)).c_str());
00169 mySettings.vehicleNameSize = TplConvert<char>::_2SUMOReal(attrs.getStringSecure("vehicleNameSize", toString(mySettings.vehicleNameSize)).c_str());
00170 mySettings.vehicleNameColor = RGBColor::parseColorReporting(attrs.getStringSecure("vehicleNameColor", toString(mySettings.vehicleNameColor)), "vehicles", 0, true, ok);
00171 myCurrentColorer = element;
00172 break;
00173 case SUMO_TAG_VIEWSETTINGS_JUNCTIONS:
00174 mySettings.junctionMode = TplConvert<char>::_2int(attrs.getStringSecure("junctionMode", toString(mySettings.junctionMode)).c_str());
00175 mySettings.drawLinkTLIndex = TplConvert<char>::_2bool(attrs.getStringSecure("drawLinkTLIndex", toString(mySettings.drawLinkTLIndex)).c_str());
00176 mySettings.drawLinkJunctionIndex = TplConvert<char>::_2bool(attrs.getStringSecure("drawLinkJunctionIndex", toString(mySettings.drawLinkJunctionIndex)).c_str());
00177 mySettings.drawJunctionName = TplConvert<char>::_2bool(attrs.getStringSecure("drawJunctionName", toString(mySettings.drawJunctionName)).c_str());
00178 mySettings.junctionNameSize = TplConvert<char>::_2SUMOReal(attrs.getStringSecure("junctionNameSize", toString(mySettings.junctionNameSize)).c_str());
00179 mySettings.junctionNameColor = RGBColor::parseColorReporting(attrs.getStringSecure("junctionNameColor", toString(mySettings.junctionNameColor)), "junctions", 0, true, ok);
00180 mySettings.showLane2Lane = TplConvert<char>::_2bool(attrs.getStringSecure("showLane2Lane", toString(mySettings.showLane2Lane)).c_str());
00181 break;
00182 case SUMO_TAG_VIEWSETTINGS_ADDITIONALS:
00183 mySettings.addMode = TplConvert<char>::_2int(attrs.getStringSecure("addMode", toString(mySettings.addMode)).c_str());
00184 mySettings.minAddSize = TplConvert<char>::_2SUMOReal(attrs.getStringSecure("minAddSize", toString(mySettings.minAddSize)).c_str());
00185 mySettings.addExaggeration = TplConvert<char>::_2SUMOReal(attrs.getStringSecure("addExaggeration", toString(mySettings.addExaggeration)).c_str());
00186 mySettings.drawAddName = TplConvert<char>::_2bool(attrs.getStringSecure("drawAddName", toString(mySettings.drawAddName)).c_str());
00187 mySettings.addNameSize = TplConvert<char>::_2SUMOReal(attrs.getStringSecure("addNameSize", toString(mySettings.addNameSize)).c_str());
00188 break;
00189 case SUMO_TAG_VIEWSETTINGS_POIS:
00190 mySettings.poiExaggeration = TplConvert<char>::_2SUMOReal(attrs.getStringSecure("poiExaggeration", toString(mySettings.poiExaggeration)).c_str());
00191 mySettings.minPOISize = TplConvert<char>::_2SUMOReal(attrs.getStringSecure("minPOISize", toString(mySettings.minPOISize)).c_str());
00192 mySettings.drawPOIName = TplConvert<char>::_2bool(attrs.getStringSecure("drawPOIName", toString(mySettings.drawPOIName)).c_str());
00193 mySettings.poiNameSize = TplConvert<char>::_2SUMOReal(attrs.getStringSecure("poiNameSize", toString(mySettings.poiNameSize)).c_str());
00194 mySettings.poiNameColor = RGBColor::parseColorReporting(attrs.getStringSecure("poiNameColor", toString(mySettings.poiNameColor)), "pois", 0, true, ok);
00195 break;
00196 case SUMO_TAG_VIEWSETTINGS_LEGEND:
00197 mySettings.showSizeLegend = TplConvert<char>::_2bool(attrs.getStringSecure("showSizeLegend", toString(mySettings.showSizeLegend)).c_str());
00198 break;
00199 case SUMO_TAG_VIEWSETTINGS_DECAL: {
00200 GUISUMOAbstractView::Decal d;
00201 d.filename = attrs.getStringSecure("filename", d.filename);
00202 if (d.filename != "" && !FileHelpers::isAbsolute(d.filename)) {
00203 d.filename = FileHelpers::getConfigurationRelative(getFileName(), d.filename);
00204 }
00205 d.centerX = TplConvert<char>::_2SUMOReal(attrs.getStringSecure("centerX", toString(d.centerX)).c_str());
00206 d.centerY = TplConvert<char>::_2SUMOReal(attrs.getStringSecure("centerY", toString(d.centerY)).c_str());
00207 d.width = TplConvert<char>::_2SUMOReal(attrs.getStringSecure("width", toString(d.width)).c_str());
00208 d.height = TplConvert<char>::_2SUMOReal(attrs.getStringSecure("height", toString(d.height)).c_str());
00209 d.rot = TplConvert<char>::_2SUMOReal(attrs.getStringSecure("rotation", toString(d.rot)).c_str());
00210 d.initialised = false;
00211 myDecals.push_back(d);
00212 }
00213 break;
00214 }
00215 }
00216
00217
00218 std::string
00219 GUISettingsHandler::addSettings(GUISUMOAbstractView* view) const throw() {
00220 if (mySettings.name != "") {
00221 gSchemeStorage.add(mySettings);
00222 if (view) {
00223 size_t index = view->getColoringSchemesCombo().appendItem(mySettings.name.c_str());
00224 view->getColoringSchemesCombo().setCurrentItem(index);
00225 view->setColorScheme(mySettings.name);
00226 }
00227 }
00228 return mySettings.name;
00229 }
00230
00231
00232 void
00233 GUISettingsHandler::setViewport(GUISUMOAbstractView* view) const throw() {
00234 if (myZoom > 0) {
00235 view->setViewport(myZoom, myXPos, myYPos);
00236 }
00237 }
00238
00239
00240 void
00241 GUISettingsHandler::setViewport(SUMOReal &zoom, SUMOReal &xoff, SUMOReal &yoff) const throw() {
00242 zoom = myZoom;
00243 xoff = myXPos;
00244 yoff = myYPos;
00245 }
00246
00247
00248 void
00249 GUISettingsHandler::setSnapshots(GUISUMOAbstractView* view) const throw() {
00250 if (!mySnapshots.empty()) {
00251 view->setSnapshots(mySnapshots);
00252 }
00253 }
00254
00255
00256 bool
00257 GUISettingsHandler::hasDecals() const throw() {
00258 return !myDecals.empty();
00259 }
00260
00261
00262 const std::vector<GUISUMOAbstractView::Decal>&
00263 GUISettingsHandler::getDecals() const throw() {
00264 return myDecals;
00265 }
00266
00267
00268 SUMOReal
00269 GUISettingsHandler::getDelay() const throw() {
00270 return myDelay;
00271 }
00272
00273
00274
00275