Path: blob/main/src/utils/gui/settings/GUISettingsHandler.cpp
193870 views
/****************************************************************************/1// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo2// Copyright (C) 2001-2026 German Aerospace Center (DLR) and others.3// This program and the accompanying materials are made available under the4// terms of the Eclipse Public License 2.0 which is available at5// https://www.eclipse.org/legal/epl-2.0/6// This Source Code may also be made available under the following Secondary7// Licenses when the conditions for such availability set forth in the Eclipse8// Public License 2.0 are satisfied: GNU General Public License, version 29// or later which is available at10// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html11// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later12/****************************************************************************/13/// @file GUISettingsHandler.cpp14/// @author Michael Behrisch15/// @author Daniel Krajzewicz16/// @author Jakob Erdmann17/// @author Laura Bieker18/// @author Mirko Barthauer19/// @date Fri, 24. Apr 200920///21// The dialog to change the view (gui) settings.22/****************************************************************************/23#include <config.h>2425#include <vector>26#include <utils/common/StringUtils.h>27#include <utils/common/ToString.h>28#include <utils/common/RGBColor.h>29#include <utils/common/MsgHandler.h>30#include <utils/common/FileHelpers.h>31#include <utils/gui/settings/GUIVisualizationSettings.h>32#include <utils/gui/settings/GUICompleteSchemeStorage.h>33#include <utils/gui/windows/GUIPerspectiveChanger.h>34#include <utils/foxtools/MFXImageHelper.h>35#include <utils/xml/SUMOSAXReader.h>36#include <utils/xml/XMLSubSys.h>37#include "GUISettingsHandler.h"383940// ===========================================================================41// method definitions42// ===========================================================================43GUISettingsHandler::GUISettingsHandler(const std::string& content, bool isFile, bool netedit) :44SUMOSAXHandler(content),45mySettings("TEMPORARY_NAME", netedit),46myDelay(-1), myLookFrom(-1, -1, -1), myLookAt(-1, -1, -1), myZCoordSet(true),47myRotation(0),48myZoom(-1),49myCurrentColorer(SUMO_TAG_NOTHING),50myCurrentScheme(nullptr),51myJamSoundTime(-1) {52if (isFile) {53XMLSubSys::runParser(*this, content);54} else {55setFileName("registrySettings");56SUMOSAXReader* reader = XMLSubSys::getSAXReader(*this);57reader->parseString(content);58delete reader;59}60}616263GUISettingsHandler::~GUISettingsHandler() {64}656667void68GUISettingsHandler::myStartElement(int element, const SUMOSAXAttributes& attrs) {69bool ok = true;70switch (element) {71case SUMO_TAG_BREAKPOINT:72if (attrs.hasAttribute(SUMO_ATTR_TIME)) {73myBreakpoints.push_back(attrs.getSUMOTimeReporting(SUMO_ATTR_TIME, nullptr, ok));74} else {75myBreakpoints.push_back(attrs.getSUMOTimeReporting(SUMO_ATTR_VALUE, nullptr, ok));76WRITE_WARNING(TL("The 'value' attribute is deprecated for breakpoints. Please use 'time'."));77}78break;79case SUMO_TAG_VIEWSETTINGS:80myViewType = attrs.getOpt<std::string>(SUMO_ATTR_TYPE, nullptr, ok, "default");81myViewType = StringUtils::to_lower_case(myViewType);82break;83case SUMO_TAG_VIEWSETTINGS_3D:84mySettings.show3DTLSLinkMarkers = StringUtils::toBool(attrs.getStringSecure("show3DTLSLinkMarkers", toString(mySettings.show3DTLSLinkMarkers)));85mySettings.show3DTLSDomes = StringUtils::toBool(attrs.getStringSecure("show3DTLSDomes", toString(mySettings.show3DTLSDomes)));86mySettings.show3DHeadUpDisplay = StringUtils::toBool(attrs.getStringSecure("show3DHeadUpDisplay", toString(mySettings.show3DHeadUpDisplay)));87mySettings.generate3DTLSModels = StringUtils::toBool(attrs.getStringSecure("generate3DTLSModels", toString(mySettings.generate3DTLSModels)));88mySettings.ambient3DLight = parseColor(attrs, "ambient3DLight", mySettings.ambient3DLight);89mySettings.diffuse3DLight = parseColor(attrs, "diffuse3DLight", mySettings.diffuse3DLight);90break;91case SUMO_TAG_DELAY:92myDelay = attrs.getOpt<double>(SUMO_ATTR_VALUE, nullptr, ok, myDelay);93break;94case SUMO_TAG_VIEWPORT: {95const double x = attrs.getOpt<double>(SUMO_ATTR_X, nullptr, ok, myLookFrom.x());96const double y = attrs.getOpt<double>(SUMO_ATTR_Y, nullptr, ok, myLookFrom.y());97const double z = attrs.getOpt<double>(SUMO_ATTR_Z, nullptr, ok, myLookFrom.z());98attrs.get<double>(SUMO_ATTR_Z, nullptr, myZCoordSet, false);99myLookFrom.set(x, y, z);100myZoom = attrs.getOpt<double>(SUMO_ATTR_ZOOM, nullptr, ok, myZoom);101const double cx = attrs.getOpt<double>(SUMO_ATTR_CENTER_X, nullptr, ok, myLookFrom.x());102const double cy = attrs.getOpt<double>(SUMO_ATTR_CENTER_Y, nullptr, ok, myLookFrom.y());103const double cz = attrs.getOpt<double>(SUMO_ATTR_CENTER_Z, nullptr, ok, 0.);104myLookAt.set(cx, cy, cz);105myRotation = attrs.getOpt<double>(SUMO_ATTR_ANGLE, nullptr, ok, myRotation);106break;107}108case SUMO_TAG_SNAPSHOT: {109std::string file = attrs.get<std::string>(SUMO_ATTR_FILE, nullptr, ok);110if (file != "" && !FileHelpers::isAbsolute(file)) {111file = FileHelpers::getConfigurationRelative(getFileName(), file);112}113mySnapshots[attrs.getOptSUMOTimeReporting(SUMO_ATTR_TIME, file.c_str(), ok, 0)].push_back(file);114}115break;116case SUMO_TAG_VIEWSETTINGS_SCHEME: {117mySettings.name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, nullptr, ok, mySettings.name);118if (gSchemeStorage.contains(mySettings.name)) {119mySettings.copy(gSchemeStorage.get(mySettings.name));120}121}122break;123case SUMO_TAG_VIEWSETTINGS_OPENGL:124mySettings.dither = StringUtils::toBool(attrs.getStringSecure("dither", toString(mySettings.dither)));125mySettings.fps = StringUtils::toBool(attrs.getStringSecure("fps", toString(mySettings.fps)));126mySettings.trueZ = StringUtils::toBool(attrs.getStringSecure("trueZ", toString(mySettings.trueZ)));127mySettings.drawBoundaries = StringUtils::toBool(attrs.getStringSecure("drawBoundaries", toString(mySettings.drawBoundaries)));128mySettings.forceDrawForRectangleSelection = StringUtils::toBool(attrs.getStringSecure("forceDrawRectangleSelection", toString(mySettings.forceDrawForRectangleSelection)));129mySettings.disableDottedContours = StringUtils::toBool(attrs.getStringSecure("disableDottedContours", toString(mySettings.disableDottedContours)));130mySettings.geometryIndices = parseTextSettings("geometryIndices", attrs, mySettings.geometryIndices);131break;132case SUMO_TAG_VIEWSETTINGS_BACKGROUND:133mySettings.backgroundColor = RGBColor::parseColorReporting(attrs.getStringSecure("backgroundColor", toString(mySettings.backgroundColor)), "background", nullptr, true, ok);134mySettings.showGrid = StringUtils::toBool(attrs.getStringSecure("showGrid", toString(mySettings.showGrid)));135mySettings.gridXSize = StringUtils::toDouble(attrs.getStringSecure("gridXSize", toString(mySettings.gridXSize)));136mySettings.gridYSize = StringUtils::toDouble(attrs.getStringSecure("gridYSize", toString(mySettings.gridYSize)));137break;138case SUMO_TAG_VIEWSETTINGS_EDGES: {139int laneEdgeMode = StringUtils::toInt(attrs.getStringSecure("laneEdgeMode", "0"));140int laneEdgeScaleMode = StringUtils::toInt(attrs.getStringSecure("scaleMode", "0"));141mySettings.laneShowBorders = StringUtils::toBool(attrs.getStringSecure("laneShowBorders", toString(mySettings.laneShowBorders)));142mySettings.showBikeMarkings = StringUtils::toBool(attrs.getStringSecure("showBikeMarkings", toString(mySettings.showBikeMarkings)));143mySettings.showLinkDecals = StringUtils::toBool(attrs.getStringSecure("showLinkDecals", toString(mySettings.showLinkDecals)));144mySettings.realisticLinkRules = StringUtils::toBool(attrs.getStringSecure("realisticLinkRules", toString(mySettings.realisticLinkRules)));145mySettings.showLinkRules = StringUtils::toBool(attrs.getStringSecure("showLinkRules", toString(mySettings.showLinkRules)));146mySettings.showRails = StringUtils::toBool(attrs.getStringSecure("showRails", toString(mySettings.showRails)));147mySettings.secondaryShape = StringUtils::toBool(attrs.getStringSecure("secondaryShape", toString(mySettings.secondaryShape)));148mySettings.edgeName = parseTextSettings("edgeName", attrs, mySettings.edgeName);149mySettings.internalEdgeName = parseTextSettings("internalEdgeName", attrs, mySettings.internalEdgeName);150mySettings.cwaEdgeName = parseTextSettings("cwaEdgeName", attrs, mySettings.cwaEdgeName);151mySettings.streetName = parseTextSettings("streetName", attrs, mySettings.streetName);152mySettings.edgeValue = parseTextSettings("edgeValue", attrs, mySettings.edgeValue);153mySettings.edgeScaleValue = parseTextSettings("edgeScaleValue", attrs, mySettings.edgeScaleValue);154mySettings.hideConnectors = StringUtils::toBool(attrs.getStringSecure("hideConnectors", toString(mySettings.hideConnectors)));155mySettings.laneWidthExaggeration = StringUtils::toDouble(attrs.getStringSecure("widthExaggeration", toString(mySettings.laneWidthExaggeration)));156mySettings.laneMinSize = StringUtils::toDouble(attrs.getStringSecure("minSize", toString(mySettings.laneMinSize)));157mySettings.showLaneDirection = StringUtils::toBool(attrs.getStringSecure("showDirection", toString(mySettings.showLaneDirection)));158mySettings.showSublanes = StringUtils::toBool(attrs.getStringSecure("showSublanes", toString(mySettings.showSublanes)));159mySettings.spreadSuperposed = StringUtils::toBool(attrs.getStringSecure("spreadSuperposed", toString(mySettings.spreadSuperposed)));160mySettings.disableHideByZoom = StringUtils::toBool(attrs.getStringSecure("disableHideByZoom", toString(mySettings.disableHideByZoom)));161mySettings.edgeParam = attrs.getStringSecure("edgeParam", mySettings.edgeParam);162mySettings.laneParam = attrs.getStringSecure("laneParam", mySettings.laneParam);163mySettings.edgeData = attrs.getStringSecure("edgeData", mySettings.edgeData);164mySettings.edgeDataID = attrs.getStringSecure("edgeDataID", mySettings.edgeDataID);165mySettings.edgeDataScaling = attrs.getStringSecure("edgeDataScaling", mySettings.edgeDataScaling);166mySettings.edgeValueRainBow = parseRainbowSettings("edgeValue", attrs, mySettings.edgeValueRainBow);167myCurrentColorer = element;168mySettings.edgeColorer.setActive(laneEdgeMode);169mySettings.edgeScaler.setActive(laneEdgeScaleMode);170mySettings.laneColorer.setActive(laneEdgeMode);171mySettings.laneScaler.setActive(laneEdgeScaleMode);172}173break;174case SUMO_TAG_COLORSCHEME: {175myCurrentScheme = nullptr;176myCurrentScaleScheme = nullptr;177const std::string name = attrs.getStringSecure(SUMO_ATTR_NAME, "");178if (myCurrentColorer == SUMO_TAG_VIEWSETTINGS_EDGES) {179if (StringUtils::startsWith(name, "meso:")) {180// see edgeColorer.save() in GUIVisualizationSettings::save181myCurrentScheme = mySettings.edgeColorer.getSchemeByName(name.substr(5));182} else {183myCurrentScheme = mySettings.laneColorer.getSchemeByName(name);184}185if (myCurrentScheme == nullptr) {186// legacy: meso schemes without prefix187myCurrentScheme = mySettings.edgeColorer.getSchemeByName(name);188}189}190if (myCurrentColorer == SUMO_TAG_VIEWSETTINGS_VEHICLES) {191myCurrentScheme = mySettings.vehicleColorer.getSchemeByName(name);192}193if (myCurrentColorer == SUMO_TAG_VIEWSETTINGS_PERSONS) {194myCurrentScheme = mySettings.personColorer.getSchemeByName(name);195}196if (myCurrentColorer == SUMO_TAG_VIEWSETTINGS_JUNCTIONS) {197myCurrentScheme = mySettings.junctionColorer.getSchemeByName(name);198}199if (myCurrentColorer == SUMO_TAG_VIEWSETTINGS_POIS) {200myCurrentScheme = mySettings.poiColorer.getSchemeByName(name);201}202if (myCurrentColorer == SUMO_TAG_VIEWSETTINGS_POLYS) {203myCurrentScheme = mySettings.polyColorer.getSchemeByName(name);204}205if (myCurrentColorer == SUMO_TAG_VIEWSETTINGS_DATA) {206myCurrentScheme = mySettings.dataColorer.getSchemeByName(name);207}208if (myCurrentScheme && !myCurrentScheme->isFixed()) {209myCurrentScheme->setInterpolated(attrs.getOpt<bool>(SUMO_ATTR_INTERPOLATED, nullptr, ok, false));210myCurrentScheme->clear();211}212}213break;214case SUMO_TAG_SCALINGSCHEME: {215myCurrentScheme = nullptr;216myCurrentScaleScheme = nullptr;217const std::string name = attrs.getStringSecure(SUMO_ATTR_NAME, "");218if (myCurrentColorer == SUMO_TAG_VIEWSETTINGS_EDGES) {219if (StringUtils::startsWith(name, "meso:")) {220// see edgeScaler.save() in GUIVisualizationSettings::save221myCurrentScaleScheme = mySettings.edgeScaler.getSchemeByName(name.substr(5));222} else {223myCurrentScaleScheme = mySettings.laneScaler.getSchemeByName(name);224}225if (myCurrentScaleScheme == nullptr) {226// legacy: meso schemes without prefix227myCurrentScaleScheme = mySettings.edgeScaler.getSchemeByName(name);228}229}230if (myCurrentColorer == SUMO_TAG_VIEWSETTINGS_VEHICLES) {231myCurrentScaleScheme = mySettings.vehicleScaler.getSchemeByName(name);232}233if (myCurrentColorer == SUMO_TAG_VIEWSETTINGS_DATA) {234myCurrentScaleScheme = mySettings.dataScaler.getSchemeByName(name);235}236if (myCurrentScaleScheme && !myCurrentScaleScheme->isFixed()) {237myCurrentScaleScheme->setInterpolated(attrs.getOpt<bool>(SUMO_ATTR_INTERPOLATED, nullptr, ok, false));238myCurrentScaleScheme->clear();239}240}241break;242case SUMO_TAG_ENTRY:243if (myCurrentScheme != nullptr) {244RGBColor color = attrs.get<RGBColor>(SUMO_ATTR_COLOR, nullptr, ok);245if (myCurrentScheme->isFixed()) {246myCurrentScheme->setColor(attrs.getStringSecure(SUMO_ATTR_NAME, ""), color);247} else {248myCurrentScheme->addColor(color,249attrs.getOpt<double>(SUMO_ATTR_THRESHOLD, nullptr, ok, std::numeric_limits<double>::max()),250attrs.getStringSecure(SUMO_ATTR_NAME, ""));251}252} else if (myCurrentScaleScheme != nullptr) {253double scale = attrs.get<double>(SUMO_ATTR_COLOR, nullptr, ok);254if (myCurrentScaleScheme->isFixed()) {255myCurrentScaleScheme->setColor(attrs.getStringSecure(SUMO_ATTR_NAME, ""), scale);256} else {257myCurrentScaleScheme->addColor(scale,258attrs.getOpt<double>(SUMO_ATTR_THRESHOLD, nullptr, ok, std::numeric_limits<double>::max()),259attrs.getStringSecure(SUMO_ATTR_NAME, ""));260}261}262break;263case SUMO_TAG_VIEWSETTINGS_VEHICLES:264mySettings.vehicleColorer.setActive(StringUtils::toInt(attrs.getStringSecure("vehicleMode", "0")));265mySettings.vehicleScaler.setActive(StringUtils::toInt(attrs.getStringSecure("vehicleScaleMode", "0")));266mySettings.vehicleQuality = StringUtils::toInt(attrs.getStringSecure("vehicleQuality", toString(mySettings.vehicleQuality)));267mySettings.showBlinker = StringUtils::toBool(attrs.getStringSecure("showBlinker", toString(mySettings.showBlinker)));268mySettings.drawMinGap = StringUtils::toBool(attrs.getStringSecure("drawMinGap", toString(mySettings.drawMinGap)));269mySettings.drawBrakeGap = StringUtils::toBool(attrs.getStringSecure("drawBrakeGap", toString(mySettings.drawBrakeGap)));270mySettings.showBTRange = StringUtils::toBool(attrs.getStringSecure("showBTRange", toString(mySettings.showBTRange)));271mySettings.showRouteIndex = StringUtils::toBool(attrs.getStringSecure("showRouteIndex", toString(mySettings.showRouteIndex)));272mySettings.scaleLength = StringUtils::toBool(attrs.getStringSecure("scaleLength", toString(mySettings.scaleLength)));273mySettings.drawReversed = StringUtils::toBool(attrs.getStringSecure("drawReversed", toString(mySettings.drawReversed)));274mySettings.showParkingInfo = StringUtils::toBool(attrs.getStringSecure("showParkingInfo", toString(mySettings.showParkingInfo)));275mySettings.showChargingInfo = StringUtils::toBool(attrs.getStringSecure("showChargingInfo", toString(mySettings.showChargingInfo)));276mySettings.vehicleSize = parseSizeSettings("vehicle", attrs, mySettings.vehicleSize);277mySettings.vehicleName = parseTextSettings("vehicleName", attrs, mySettings.vehicleName);278mySettings.vehicleValue = parseTextSettings("vehicleValue", attrs, mySettings.vehicleValue);279mySettings.vehicleScaleValue = parseTextSettings("vehicleScaleValue", attrs, mySettings.vehicleScaleValue);280mySettings.vehicleText = parseTextSettings("vehicleText", attrs, mySettings.vehicleText);281mySettings.vehicleParam = attrs.getStringSecure("vehicleParam", mySettings.vehicleParam);282mySettings.vehicleScaleParam = attrs.getStringSecure("vehicleScaleParam", mySettings.vehicleScaleParam);283mySettings.vehicleTextParam = attrs.getStringSecure("vehicleTextParam", mySettings.vehicleTextParam);284mySettings.vehicleValueRainBow = parseRainbowSettings("vehicleValueRainbow", attrs, mySettings.vehicleValueRainBow);285myCurrentColorer = element;286break;287case SUMO_TAG_VIEWSETTINGS_PERSONS:288mySettings.personColorer.setActive(StringUtils::toInt(attrs.getStringSecure("personMode", "0")));289mySettings.personQuality = StringUtils::toInt(attrs.getStringSecure("personQuality", toString(mySettings.personQuality)));290mySettings.personSize = parseSizeSettings("person", attrs, mySettings.personSize);291mySettings.personName = parseTextSettings("personName", attrs, mySettings.personName);292mySettings.personValue = parseTextSettings("personValue", attrs, mySettings.personValue);293mySettings.showPedestrianNetwork = StringUtils::toBool(attrs.getStringSecure("showPedestrianNetwork", toString(mySettings.showPedestrianNetwork)));294mySettings.pedestrianNetworkColor = RGBColor::parseColorReporting(attrs.getStringSecure("pedestrianNetworkColor", toString(mySettings.pedestrianNetworkColor)), "pedestrianNetworkColor", nullptr, true, ok);295myCurrentColorer = element;296break;297case SUMO_TAG_VIEWSETTINGS_CONTAINERS:298mySettings.containerColorer.setActive(StringUtils::toInt(attrs.getStringSecure("containerMode", "0")));299mySettings.containerQuality = StringUtils::toInt(attrs.getStringSecure("containerQuality", toString(mySettings.containerQuality)));300mySettings.containerSize = parseSizeSettings("container", attrs, mySettings.containerSize);301mySettings.containerName = parseTextSettings("containerName", attrs, mySettings.containerName);302myCurrentColorer = element;303break;304case SUMO_TAG_VIEWSETTINGS_JUNCTIONS:305mySettings.junctionColorer.setActive(StringUtils::toInt(attrs.getStringSecure("junctionMode", "0")));306mySettings.drawLinkTLIndex = parseTextSettings("drawLinkTLIndex", attrs, mySettings.drawLinkTLIndex);307mySettings.drawLinkJunctionIndex = parseTextSettings("drawLinkJunctionIndex", attrs, mySettings.drawLinkJunctionIndex);308mySettings.junctionID = parseTextSettings("junctionID", attrs, mySettings.junctionID);309mySettings.junctionName = parseTextSettings("junctionName", attrs, mySettings.junctionName);310mySettings.internalJunctionName = parseTextSettings("internalJunctionName", attrs, mySettings.internalJunctionName);311mySettings.tlsPhaseIndex = parseTextSettings("tlsPhaseIndex", attrs, mySettings.tlsPhaseIndex);312mySettings.tlsPhaseName = parseTextSettings("tlsPhaseName", attrs, mySettings.tlsPhaseName);313mySettings.showLane2Lane = StringUtils::toBool(attrs.getStringSecure("showLane2Lane", toString(mySettings.showLane2Lane)));314mySettings.drawJunctionShape = StringUtils::toBool(attrs.getStringSecure("drawShape", toString(mySettings.drawJunctionShape)));315mySettings.drawCrossingsAndWalkingareas = StringUtils::toBool(attrs.getStringSecure(316"drawCrossingsAndWalkingareas", toString(mySettings.drawCrossingsAndWalkingareas)));317mySettings.junctionSize = parseSizeSettings("junction", attrs, mySettings.junctionSize);318mySettings.junctionValueRainBow = parseRainbowSettings("junctionValue", attrs, mySettings.junctionValueRainBow);319myCurrentColorer = element;320break;321case SUMO_TAG_VIEWSETTINGS_ADDITIONALS:322mySettings.addMode = StringUtils::toInt(attrs.getStringSecure("addMode", toString(mySettings.addMode)));323mySettings.addSize = parseSizeSettings("add", attrs, mySettings.addSize);324mySettings.addName = parseTextSettings("addName", attrs, mySettings.addName);325mySettings.addFullName = parseTextSettings("addFullName", attrs, mySettings.addFullName);326// color settings (temporal, will be integrated in a schema327mySettings.colorSettings.busStopColorSign = parseColor(attrs, "busStopColorSign", mySettings.colorSettings.busStopColorSign);328mySettings.colorSettings.chargingStationColor = parseColor(attrs, "chargingStationColor", mySettings.colorSettings.chargingStationColor);329mySettings.colorSettings.chargingStationColorCharge = parseColor(attrs, "chargingStationColorCharge", mySettings.colorSettings.chargingStationColorCharge);330mySettings.colorSettings.chargingStationColorSign = parseColor(attrs, "chargingStationColorSign", mySettings.colorSettings.chargingStationColorSign);331mySettings.colorSettings.containerStopColor = parseColor(attrs, "containerStopColor", mySettings.colorSettings.containerStopColor);332mySettings.colorSettings.containerStopColorSign = parseColor(attrs, "containerStopColorSign", mySettings.colorSettings.containerStopColorSign);333mySettings.colorSettings.parkingAreaColor = parseColor(attrs, "parkingAreaColor", mySettings.colorSettings.parkingAreaColor);334mySettings.colorSettings.parkingAreaColorSign = parseColor(attrs, "parkingAreaColorSign", mySettings.colorSettings.parkingAreaColorSign);335mySettings.colorSettings.parkingSpaceColor = parseColor(attrs, "parkingSpaceColor", mySettings.colorSettings.parkingSpaceColor);336mySettings.colorSettings.parkingSpaceColorContour = parseColor(attrs, "parkingSpaceColorContour", mySettings.colorSettings.parkingSpaceColorContour);337mySettings.colorSettings.personTripColor = parseColor(attrs, "personTripColor", mySettings.colorSettings.personTripColor);338mySettings.colorSettings.rideColor = parseColor(attrs, "rideColor", mySettings.colorSettings.rideColor);339mySettings.colorSettings.selectedAdditionalColor = parseColor(attrs, "selectedAdditionalColor", mySettings.colorSettings.selectedAdditionalColor);340mySettings.colorSettings.selectedConnectionColor = parseColor(attrs, "selectedConnectionColor", mySettings.colorSettings.selectedConnectionColor);341mySettings.colorSettings.selectedContainerColor = parseColor(attrs, "selectedContainerColor", mySettings.colorSettings.selectedContainerColor);342mySettings.colorSettings.selectedContainerPlanColor = parseColor(attrs, "selectedContainerPlanColor", mySettings.colorSettings.selectedContainerPlanColor);343mySettings.colorSettings.selectedCrossingColor = parseColor(attrs, "selectedCrossingColor", mySettings.colorSettings.selectedCrossingColor);344mySettings.colorSettings.selectedEdgeColor = parseColor(attrs, "selectedEdgeColor", mySettings.colorSettings.selectedEdgeColor);345mySettings.colorSettings.selectedEdgeDataColor = parseColor(attrs, "selectedEdgeDataColor", mySettings.colorSettings.selectedEdgeDataColor);346mySettings.colorSettings.selectedLaneColor = parseColor(attrs, "selectedLaneColor", mySettings.colorSettings.selectedLaneColor);347mySettings.colorSettings.selectedPersonColor = parseColor(attrs, "selectedPersonColor", mySettings.colorSettings.selectedPersonColor);348mySettings.colorSettings.selectedPersonPlanColor = parseColor(attrs, "selectedPersonPlanColor", mySettings.colorSettings.selectedPersonPlanColor);349mySettings.colorSettings.selectedProhibitionColor = parseColor(attrs, "selectedProhibitionColor", mySettings.colorSettings.selectedProhibitionColor);350mySettings.colorSettings.selectedRouteColor = parseColor(attrs, "selectedRouteColor", mySettings.colorSettings.selectedRouteColor);351mySettings.colorSettings.selectedVehicleColor = parseColor(attrs, "selectedVehicleColor", mySettings.colorSettings.selectedVehicleColor);352mySettings.colorSettings.selectionColor = parseColor(attrs, "selectionColor", mySettings.colorSettings.selectionColor);353mySettings.colorSettings.stopColor = parseColor(attrs, "stopColor", mySettings.colorSettings.stopColor);354mySettings.colorSettings.waypointColor = parseColor(attrs, "waypointColor", mySettings.colorSettings.waypointColor);355mySettings.colorSettings.stopContainerColor = parseColor(attrs, "stopContainerColor", mySettings.colorSettings.stopContainerColor);356mySettings.colorSettings.stopPersonColor = parseColor(attrs, "stopPersonColor", mySettings.colorSettings.stopPersonColor);357mySettings.colorSettings.trainStopColor = parseColor(attrs, "trainStopColor", mySettings.colorSettings.trainStopColor);358mySettings.colorSettings.trainStopColorSign = parseColor(attrs, "trainStopColorSign", mySettings.colorSettings.trainStopColorSign);359mySettings.colorSettings.transhipColor = parseColor(attrs, "transhipColor", mySettings.colorSettings.transhipColor);360mySettings.colorSettings.transportColor = parseColor(attrs, "transportColor", mySettings.colorSettings.transportColor);361mySettings.colorSettings.vehicleTripColor = parseColor(attrs, "vehicleTripColor", mySettings.colorSettings.vehicleTripColor);362mySettings.colorSettings.walkColor = parseColor(attrs, "walkColor", mySettings.colorSettings.walkColor);363mySettings.widthSettings.personTripWidth = StringUtils::toDouble(attrs.getStringSecure("personTripWidth", toString(mySettings.widthSettings.personTripWidth)));364mySettings.widthSettings.rideWidth = StringUtils::toDouble(attrs.getStringSecure("rideWidth", toString(mySettings.widthSettings.rideWidth)));365mySettings.widthSettings.transhipWidth = StringUtils::toDouble(attrs.getStringSecure("transhipWidth", toString(mySettings.widthSettings.transhipWidth)));366mySettings.widthSettings.transportWidth = StringUtils::toDouble(attrs.getStringSecure("transportWidth", toString(mySettings.widthSettings.transportWidth)));367mySettings.widthSettings.tripWidth = StringUtils::toDouble(attrs.getStringSecure("tripWidth", toString(mySettings.widthSettings.tripWidth)));368mySettings.widthSettings.walkWidth = StringUtils::toDouble(attrs.getStringSecure("walkWidth", toString(mySettings.widthSettings.walkWidth)));369mySettings.colorSettings.busStopColor = parseColor(attrs, "busStopColor", mySettings.colorSettings.busStopColor);370break;371case SUMO_TAG_VIEWSETTINGS_POIS:372mySettings.poiTextParam = attrs.getStringSecure("poiTextParam", mySettings.poiTextParam);373mySettings.poiSize = parseSizeSettings("poi", attrs, mySettings.poiSize);374mySettings.poiDetail = StringUtils::toInt(attrs.getStringSecure("poiDetail", toString(mySettings.poiDetail)));375mySettings.poiName = parseTextSettings("poiName", attrs, mySettings.poiName);376mySettings.poiType = parseTextSettings("poiType", attrs, mySettings.poiType);377mySettings.poiText = parseTextSettings("poiText", attrs, mySettings.poiText);378mySettings.poiColorer.setActive(StringUtils::toInt(attrs.getStringSecure("personMode", "0")));379mySettings.poiUseCustomLayer = StringUtils::toBool(attrs.getStringSecure("poiUseCustomLayer", toString(mySettings.poiUseCustomLayer)));380mySettings.poiCustomLayer = StringUtils::toDouble(attrs.getStringSecure("poiCustomLayer", toString(mySettings.poiCustomLayer)));381myCurrentColorer = element;382break;383case SUMO_TAG_VIEWSETTINGS_POLYS:384mySettings.polySize = parseSizeSettings("poly", attrs, mySettings.polySize);385mySettings.polyName = parseTextSettings("polyName", attrs, mySettings.polyName);386mySettings.polyType = parseTextSettings("polyType", attrs, mySettings.polyType);387mySettings.polyColorer.setActive(StringUtils::toInt(attrs.getStringSecure("personMode", "0")));388mySettings.polyUseCustomLayer = StringUtils::toBool(attrs.getStringSecure("polyUseCustomLayer", toString(mySettings.polyUseCustomLayer)));389mySettings.polyCustomLayer = StringUtils::toDouble(attrs.getStringSecure("polyCustomLayer", toString(mySettings.polyCustomLayer)));390myCurrentColorer = element;391break;392case SUMO_TAG_VIEWSETTINGS_DATA:393mySettings.dataColorer.setActive(StringUtils::toInt(attrs.getStringSecure("dataMode", "0")));394mySettings.dataScaler.setActive(StringUtils::toInt(attrs.getStringSecure("dataScaleMode", "0")));395mySettings.dataValueRainBow = parseRainbowSettings("dataValueRainbow", attrs, mySettings.dataValueRainBow);396mySettings.dataValue = parseTextSettings("dataValue", attrs, mySettings.dataValue);397mySettings.tazRelWidthExaggeration = StringUtils::toDouble(attrs.getStringSecure("tazRelExaggeration", toString(mySettings.tazRelWidthExaggeration)));398mySettings.edgeRelWidthExaggeration = StringUtils::toDouble(attrs.getStringSecure("edgeRelExaggeration", toString(mySettings.edgeRelWidthExaggeration)));399mySettings.relDataAttr = attrs.getStringSecure("relDataAttr", mySettings.relDataAttr);400mySettings.relDataScaleAttr = attrs.getStringSecure("relDataScaleAttr", mySettings.relDataScaleAttr);401myCurrentColorer = element;402break;403case SUMO_TAG_VIEWSETTINGS_LEGEND:404mySettings.showSizeLegend = StringUtils::toBool(attrs.getStringSecure("showSizeLegend", toString(mySettings.showSizeLegend)));405mySettings.showColorLegend = StringUtils::toBool(attrs.getStringSecure("showColorLegend", toString(mySettings.showColorLegend)));406mySettings.showVehicleColorLegend = StringUtils::toBool(attrs.getStringSecure("showVehicleColorLegend", toString(mySettings.showVehicleColorLegend)));407break;408case SUMO_TAG_VIEWSETTINGS_DECAL: {409GUISUMOAbstractView::Decal d;410if (attrs.hasAttribute(SUMO_ATTR_FILE)) {411d.filename = StringUtils::substituteEnvironment(attrs.get<std::string>(SUMO_ATTR_FILE, nullptr, ok));412} else {413d.filename = attrs.getStringSecure("filename", d.filename);414WRITE_WARNING(TL("The 'filename' attribute is deprecated for decals. Please use 'file'."));415}416if (d.filename != "" && !FileHelpers::isAbsolute(d.filename)) {417d.filename = FileHelpers::getConfigurationRelative(getFileName(), d.filename);418}419d.centerX = attrs.getOpt<double>(SUMO_ATTR_CENTER_X, nullptr, ok, d.centerX);420d.centerY = attrs.getOpt<double>(SUMO_ATTR_CENTER_Y, nullptr, ok, d.centerY);421d.centerZ = attrs.getOpt<double>(SUMO_ATTR_CENTER_Z, nullptr, ok, d.centerZ);422d.width = attrs.getOpt<double>(SUMO_ATTR_WIDTH, nullptr, ok, d.width);423d.height = attrs.getOpt<double>(SUMO_ATTR_HEIGHT, nullptr, ok, d.height);424d.altitude = StringUtils::toDouble(attrs.getStringSecure("altitude", "0"));425d.rot = StringUtils::toDouble(attrs.getStringSecure("rotation", toString(d.rot)));426d.tilt = StringUtils::toDouble(attrs.getStringSecure("tilt", toString(d.tilt)));427d.roll = StringUtils::toDouble(attrs.getStringSecure("roll", toString(d.roll)));428d.layer = attrs.getOpt<double>(SUMO_ATTR_LAYER, nullptr, ok, d.layer);429d.screenRelative = StringUtils::toBool(attrs.getStringSecure("screenRelative", toString(d.screenRelative)));430d.initialised = false;431myDecals.push_back(d);432}433break;434case SUMO_TAG_VIEWSETTINGS_TRACKER: {435myTrackers.push_back(attrs.get<std::string>(SUMO_ATTR_TLID, nullptr, ok));436}437break;438case SUMO_TAG_VIEWSETTINGS_LIGHT: {439GUISUMOAbstractView::Decal d;440d.filename = "light" + attrs.getOpt<std::string>(SUMO_ATTR_INDEX, nullptr, ok, "0");441d.centerX = attrs.getOpt<double>(SUMO_ATTR_CENTER_X, nullptr, ok, d.centerX);442d.centerY = attrs.getOpt<double>(SUMO_ATTR_CENTER_Y, nullptr, ok, d.centerY);443d.centerZ = attrs.getOpt<double>(SUMO_ATTR_CENTER_Z, nullptr, ok, d.centerZ);444d.width = attrs.getOpt<double>(SUMO_ATTR_WIDTH, nullptr, ok, d.width);445d.height = attrs.getOpt<double>(SUMO_ATTR_HEIGHT, nullptr, ok, d.height);446d.altitude = StringUtils::toDouble(attrs.getStringSecure("altitude", "0"));447d.rot = StringUtils::toDouble(attrs.getStringSecure("rotation", toString(d.rot)));448d.tilt = StringUtils::toDouble(attrs.getStringSecure("tilt", toString(d.tilt)));449d.roll = StringUtils::toDouble(attrs.getStringSecure("roll", toString(d.roll)));450d.layer = attrs.getOpt<double>(SUMO_ATTR_LAYER, nullptr, ok, d.layer);451d.initialised = false;452myDecals.push_back(d);453}454break;455case SUMO_TAG_VIEWSETTINGS_EVENT: {456const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);457const std::string cmd = attrs.get<std::string>(SUMO_ATTR_COMMAND, nullptr, ok);458const double prob = attrs.get<double>(SUMO_ATTR_PROB, id.c_str(), ok);459myEventDistributions[id].add(cmd, prob);460}461break;462case SUMO_TAG_VIEWSETTINGS_EVENT_JAM_TIME:463myJamSoundTime = attrs.get<double>(SUMO_ATTR_VALUE, nullptr, ok);464break;465default:466break;467}468}469470void471GUISettingsHandler::myEndElement(int element) {472switch (element) {473case SUMO_TAG_VIEWSETTINGS_SCHEME: {474if (mySettings.name != "") {475gSchemeStorage.add(mySettings);476myLoadedSettingNames.push_back(mySettings.name);477}478}479}480}481482483RGBColor484GUISettingsHandler::parseColor(const SUMOSAXAttributes& attrs, const std::string attribute, const RGBColor& defaultValue) const {485bool ok = true;486return RGBColor::parseColorReporting(attrs.getStringSecure(attribute, toString(defaultValue)), attribute.c_str(), nullptr, true, ok);487}488489490GUIVisualizationTextSettings491GUISettingsHandler::parseTextSettings(492const std::string& prefix, const SUMOSAXAttributes& attrs,493GUIVisualizationTextSettings defaults) {494bool ok = true;495return GUIVisualizationTextSettings(496StringUtils::toBool(attrs.getStringSecure(prefix + "_show", toString(defaults.showText))),497StringUtils::toDouble(attrs.getStringSecure(prefix + "_size", toString(defaults.size))),498RGBColor::parseColorReporting(attrs.getStringSecure(prefix + "_color", toString(defaults.color)), "textSettings", nullptr, true, ok),499RGBColor::parseColorReporting(attrs.getStringSecure(prefix + "_bgColor", toString(defaults.bgColor)), "textSettings", nullptr, true, ok),500StringUtils::toBool(attrs.getStringSecure(prefix + "_constantSize", toString(defaults.constSize))),501StringUtils::toBool(attrs.getStringSecure(prefix + "_onlySelected", toString(defaults.onlySelected))));502}503504505GUIVisualizationSizeSettings506GUISettingsHandler::parseSizeSettings(507const std::string& prefix, const SUMOSAXAttributes& attrs,508GUIVisualizationSizeSettings defaults) {509return GUIVisualizationSizeSettings(510StringUtils::toDouble(attrs.getStringSecure(prefix + "_minSize", toString(defaults.minSize))),511StringUtils::toDouble(attrs.getStringSecure(prefix + "_exaggeration", toString(defaults.exaggeration))),512StringUtils::toBool(attrs.getStringSecure(prefix + "_constantSize", toString(defaults.constantSize))),513StringUtils::toBool(attrs.getStringSecure(prefix + "_constantSizeSelected", toString(defaults.constantSizeSelected))));514}515516GUIVisualizationRainbowSettings517GUISettingsHandler::parseRainbowSettings(518const std::string& prefix, const SUMOSAXAttributes& attrs,519GUIVisualizationRainbowSettings defaults) {520return GUIVisualizationRainbowSettings(521StringUtils::toBool(attrs.getStringSecure(prefix + "HideCheck", toString(defaults.hideMin))),522StringUtils::toDouble(attrs.getStringSecure(prefix + "HideThreshold", toString(defaults.minThreshold))),523StringUtils::toBool(attrs.getStringSecure(prefix + "HideCheck2", toString(defaults.hideMax))),524StringUtils::toDouble(attrs.getStringSecure(prefix + "HideThreshold2", toString(defaults.maxThreshold))),525StringUtils::toBool(attrs.getStringSecure(prefix + "SetNeutral", toString(defaults.hideMax))),526StringUtils::toDouble(attrs.getStringSecure(prefix + "NeutralThreshold", toString(defaults.neutralThreshold))),527StringUtils::toBool(attrs.getStringSecure(prefix + "FixRange", toString(defaults.fixRange))),528StringUtils::toInt(attrs.getStringSecure(prefix + "RainbowScheme", toString(defaults.rainbowScheme))));529}530531const std::vector<std::string>&532GUISettingsHandler::addSettings(GUISUMOAbstractView* view) const {533if (view) {534for (std::string name : myLoadedSettingNames) {535FXint index = view->getColoringSchemesCombo()->appendIconItem(name.c_str());536view->getColoringSchemesCombo()->setCurrentItem(index);537view->setColorScheme(name);538}539}540return myLoadedSettingNames;541}542543544void545GUISettingsHandler::applyViewport(GUISUMOAbstractView* view) const {546if (myLookFrom.z() > 0 || myZoom > 0) {547// z value stores zoom so we must convert first548double z = (view->is3DView()) ? myLookFrom.z() : view->getChanger().zoom2ZPos(myZoom);549if (view->is3DView() && !myZCoordSet) { // set view angle to ground to at least 45 degrees if no Z coordinate is given550z = myLookFrom.distanceTo2D(myLookAt) * sin(PI * 0.25);551}552Position lookFrom(myLookFrom.x(), myLookFrom.y(), z);553view->setViewportFromToRot(lookFrom, myLookAt, myRotation);554if (view->is3DView() && !myZCoordSet) {555view->recenterView();556}557}558}559560561void562GUISettingsHandler::setSnapshots(GUISUMOAbstractView* view) const {563if (!mySnapshots.empty()) {564for (auto item : mySnapshots) {565for (auto file : item.second) {566view->addSnapshot(item.first, file);567}568}569}570}571572573bool574GUISettingsHandler::hasDecals() const {575return !myDecals.empty();576}577578579const std::vector<GUISUMOAbstractView::Decal>&580GUISettingsHandler::getDecals() const {581return myDecals;582}583584585double586GUISettingsHandler::getDelay() const {587return myDelay;588}589590591std::vector<SUMOTime>592GUISettingsHandler::loadBreakpoints(const std::string& file) {593std::vector<SUMOTime> result;594std::ifstream strm(file.c_str());595if (!strm.good()) {596WRITE_ERRORF(TL("Could not open '%'."), file);597return result;598}599while (strm.good()) {600std::string val;601strm >> val;602if (val.length() == 0) {603continue;604}605try {606SUMOTime value = string2time(val);607result.push_back(value);608} catch (NumberFormatException& e) {609WRITE_ERRORF(TL("A breakpoint value must be a time description (%)."), toString(e.what()));610} catch (EmptyData&) {611} catch (ProcessError&) {612WRITE_ERRORF(TL("Could not decode breakpoint '%'."), val);613}614}615return result;616}617618619RandomDistributor<std::string>620GUISettingsHandler::getEventDistribution(const std::string& id) {621RandomDistributor<std::string> result = myEventDistributions[id];622if (result.getOverallProb() > 0 && result.getOverallProb() < 1) {623// unscaled probabilities are assumed, fill up with dummy event624result.add("", 1. - result.getOverallProb());625}626return result;627}628629630/****************************************************************************/631632633