Path: blob/main/src/utils/gui/settings/GUISettingsHandler.cpp
169684 views
/****************************************************************************/1// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo2// Copyright (C) 2001-2025 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 (myCurrentScheme && !myCurrentScheme->isFixed()) {206myCurrentScheme->setInterpolated(attrs.getOpt<bool>(SUMO_ATTR_INTERPOLATED, nullptr, ok, false));207myCurrentScheme->clear();208}209}210break;211case SUMO_TAG_SCALINGSCHEME: {212myCurrentScheme = nullptr;213myCurrentScaleScheme = nullptr;214const std::string name = attrs.getStringSecure(SUMO_ATTR_NAME, "");215if (myCurrentColorer == SUMO_TAG_VIEWSETTINGS_EDGES) {216if (StringUtils::startsWith(name, "meso:")) {217// see edgeScaler.save() in GUIVisualizationSettings::save218myCurrentScaleScheme = mySettings.edgeScaler.getSchemeByName(name.substr(5));219} else {220myCurrentScaleScheme = mySettings.laneScaler.getSchemeByName(name);221}222if (myCurrentScaleScheme == nullptr) {223// legacy: meso schemes without prefix224myCurrentScaleScheme = mySettings.edgeScaler.getSchemeByName(name);225}226}227if (myCurrentColorer == SUMO_TAG_VIEWSETTINGS_VEHICLES) {228myCurrentScaleScheme = mySettings.vehicleScaler.getSchemeByName(name);229}230if (myCurrentScaleScheme && !myCurrentScaleScheme->isFixed()) {231myCurrentScaleScheme->setInterpolated(attrs.getOpt<bool>(SUMO_ATTR_INTERPOLATED, nullptr, ok, false));232myCurrentScaleScheme->clear();233}234}235break;236case SUMO_TAG_ENTRY:237if (myCurrentScheme != nullptr) {238RGBColor color = attrs.get<RGBColor>(SUMO_ATTR_COLOR, nullptr, ok);239if (myCurrentScheme->isFixed()) {240myCurrentScheme->setColor(attrs.getStringSecure(SUMO_ATTR_NAME, ""), color);241} else {242myCurrentScheme->addColor(color,243attrs.getOpt<double>(SUMO_ATTR_THRESHOLD, nullptr, ok, std::numeric_limits<double>::max()),244attrs.getStringSecure(SUMO_ATTR_NAME, ""));245}246} else if (myCurrentScaleScheme != nullptr) {247double scale = attrs.get<double>(SUMO_ATTR_COLOR, nullptr, ok);248if (myCurrentScaleScheme->isFixed()) {249myCurrentScaleScheme->setColor(attrs.getStringSecure(SUMO_ATTR_NAME, ""), scale);250} else {251myCurrentScaleScheme->addColor(scale,252attrs.getOpt<double>(SUMO_ATTR_THRESHOLD, nullptr, ok, std::numeric_limits<double>::max()),253attrs.getStringSecure(SUMO_ATTR_NAME, ""));254}255}256break;257case SUMO_TAG_VIEWSETTINGS_VEHICLES:258mySettings.vehicleColorer.setActive(StringUtils::toInt(attrs.getStringSecure("vehicleMode", "0")));259mySettings.vehicleScaler.setActive(StringUtils::toInt(attrs.getStringSecure("vehicleScaleMode", "0")));260mySettings.vehicleQuality = StringUtils::toInt(attrs.getStringSecure("vehicleQuality", toString(mySettings.vehicleQuality)));261mySettings.showBlinker = StringUtils::toBool(attrs.getStringSecure("showBlinker", toString(mySettings.showBlinker)));262mySettings.drawMinGap = StringUtils::toBool(attrs.getStringSecure("drawMinGap", toString(mySettings.drawMinGap)));263mySettings.drawBrakeGap = StringUtils::toBool(attrs.getStringSecure("drawBrakeGap", toString(mySettings.drawBrakeGap)));264mySettings.showBTRange = StringUtils::toBool(attrs.getStringSecure("showBTRange", toString(mySettings.showBTRange)));265mySettings.showRouteIndex = StringUtils::toBool(attrs.getStringSecure("showRouteIndex", toString(mySettings.showRouteIndex)));266mySettings.scaleLength = StringUtils::toBool(attrs.getStringSecure("scaleLength", toString(mySettings.scaleLength)));267mySettings.drawReversed = StringUtils::toBool(attrs.getStringSecure("drawReversed", toString(mySettings.drawReversed)));268mySettings.showParkingInfo = StringUtils::toBool(attrs.getStringSecure("showParkingInfo", toString(mySettings.showParkingInfo)));269mySettings.showChargingInfo = StringUtils::toBool(attrs.getStringSecure("showChargingInfo", toString(mySettings.showChargingInfo)));270mySettings.vehicleSize = parseSizeSettings("vehicle", attrs, mySettings.vehicleSize);271mySettings.vehicleName = parseTextSettings("vehicleName", attrs, mySettings.vehicleName);272mySettings.vehicleValue = parseTextSettings("vehicleValue", attrs, mySettings.vehicleValue);273mySettings.vehicleScaleValue = parseTextSettings("vehicleScaleValue", attrs, mySettings.vehicleScaleValue);274mySettings.vehicleText = parseTextSettings("vehicleText", attrs, mySettings.vehicleText);275mySettings.vehicleParam = attrs.getStringSecure("vehicleParam", mySettings.vehicleParam);276mySettings.vehicleScaleParam = attrs.getStringSecure("vehicleScaleParam", mySettings.vehicleScaleParam);277mySettings.vehicleTextParam = attrs.getStringSecure("vehicleTextParam", mySettings.vehicleTextParam);278mySettings.vehicleValueRainBow = parseRainbowSettings("vehicleValue", attrs, mySettings.vehicleValueRainBow);279myCurrentColorer = element;280break;281case SUMO_TAG_VIEWSETTINGS_PERSONS:282mySettings.personColorer.setActive(StringUtils::toInt(attrs.getStringSecure("personMode", "0")));283mySettings.personQuality = StringUtils::toInt(attrs.getStringSecure("personQuality", toString(mySettings.personQuality)));284mySettings.personSize = parseSizeSettings("person", attrs, mySettings.personSize);285mySettings.personName = parseTextSettings("personName", attrs, mySettings.personName);286mySettings.personValue = parseTextSettings("personValue", attrs, mySettings.personValue);287mySettings.showPedestrianNetwork = StringUtils::toBool(attrs.getStringSecure("showPedestrianNetwork", toString(mySettings.showPedestrianNetwork)));288mySettings.pedestrianNetworkColor = RGBColor::parseColorReporting(attrs.getStringSecure("pedestrianNetworkColor", toString(mySettings.pedestrianNetworkColor)), "pedestrianNetworkColor", nullptr, true, ok);289myCurrentColorer = element;290break;291case SUMO_TAG_VIEWSETTINGS_CONTAINERS:292mySettings.containerColorer.setActive(StringUtils::toInt(attrs.getStringSecure("containerMode", "0")));293mySettings.containerQuality = StringUtils::toInt(attrs.getStringSecure("containerQuality", toString(mySettings.containerQuality)));294mySettings.containerSize = parseSizeSettings("container", attrs, mySettings.containerSize);295mySettings.containerName = parseTextSettings("containerName", attrs, mySettings.containerName);296myCurrentColorer = element;297break;298case SUMO_TAG_VIEWSETTINGS_JUNCTIONS:299mySettings.junctionColorer.setActive(StringUtils::toInt(attrs.getStringSecure("junctionMode", "0")));300mySettings.drawLinkTLIndex = parseTextSettings("drawLinkTLIndex", attrs, mySettings.drawLinkTLIndex);301mySettings.drawLinkJunctionIndex = parseTextSettings("drawLinkJunctionIndex", attrs, mySettings.drawLinkJunctionIndex);302mySettings.junctionID = parseTextSettings("junctionID", attrs, mySettings.junctionID);303mySettings.junctionName = parseTextSettings("junctionName", attrs, mySettings.junctionName);304mySettings.internalJunctionName = parseTextSettings("internalJunctionName", attrs, mySettings.internalJunctionName);305mySettings.tlsPhaseIndex = parseTextSettings("tlsPhaseIndex", attrs, mySettings.tlsPhaseIndex);306mySettings.tlsPhaseName = parseTextSettings("tlsPhaseName", attrs, mySettings.tlsPhaseName);307mySettings.showLane2Lane = StringUtils::toBool(attrs.getStringSecure("showLane2Lane", toString(mySettings.showLane2Lane)));308mySettings.drawJunctionShape = StringUtils::toBool(attrs.getStringSecure("drawShape", toString(mySettings.drawJunctionShape)));309mySettings.drawCrossingsAndWalkingareas = StringUtils::toBool(attrs.getStringSecure(310"drawCrossingsAndWalkingareas", toString(mySettings.drawCrossingsAndWalkingareas)));311mySettings.junctionSize = parseSizeSettings("junction", attrs, mySettings.junctionSize);312mySettings.junctionValueRainBow = parseRainbowSettings("junctionValue", attrs, mySettings.junctionValueRainBow);313myCurrentColorer = element;314break;315case SUMO_TAG_VIEWSETTINGS_ADDITIONALS:316mySettings.addMode = StringUtils::toInt(attrs.getStringSecure("addMode", toString(mySettings.addMode)));317mySettings.addSize = parseSizeSettings("add", attrs, mySettings.addSize);318mySettings.addName = parseTextSettings("addName", attrs, mySettings.addName);319mySettings.addFullName = parseTextSettings("addFullName", attrs, mySettings.addFullName);320// color settings (temporal, will be integrated in a schema321mySettings.colorSettings.busStopColorSign = parseColor(attrs, "busStopColorSign", mySettings.colorSettings.busStopColorSign);322mySettings.colorSettings.chargingStationColor = parseColor(attrs, "chargingStationColor", mySettings.colorSettings.chargingStationColor);323mySettings.colorSettings.chargingStationColorCharge = parseColor(attrs, "chargingStationColorCharge", mySettings.colorSettings.chargingStationColorCharge);324mySettings.colorSettings.chargingStationColorSign = parseColor(attrs, "chargingStationColorSign", mySettings.colorSettings.chargingStationColorSign);325mySettings.colorSettings.containerStopColor = parseColor(attrs, "containerStopColor", mySettings.colorSettings.containerStopColor);326mySettings.colorSettings.containerStopColorSign = parseColor(attrs, "containerStopColorSign", mySettings.colorSettings.containerStopColorSign);327mySettings.colorSettings.parkingAreaColor = parseColor(attrs, "parkingAreaColor", mySettings.colorSettings.parkingAreaColor);328mySettings.colorSettings.parkingAreaColorSign = parseColor(attrs, "parkingAreaColorSign", mySettings.colorSettings.parkingAreaColorSign);329mySettings.colorSettings.parkingSpaceColor = parseColor(attrs, "parkingSpaceColor", mySettings.colorSettings.parkingSpaceColor);330mySettings.colorSettings.parkingSpaceColorContour = parseColor(attrs, "parkingSpaceColorContour", mySettings.colorSettings.parkingSpaceColorContour);331mySettings.colorSettings.personTripColor = parseColor(attrs, "personTripColor", mySettings.colorSettings.personTripColor);332mySettings.colorSettings.rideColor = parseColor(attrs, "rideColor", mySettings.colorSettings.rideColor);333mySettings.colorSettings.selectedAdditionalColor = parseColor(attrs, "selectedAdditionalColor", mySettings.colorSettings.selectedAdditionalColor);334mySettings.colorSettings.selectedConnectionColor = parseColor(attrs, "selectedConnectionColor", mySettings.colorSettings.selectedConnectionColor);335mySettings.colorSettings.selectedContainerColor = parseColor(attrs, "selectedContainerColor", mySettings.colorSettings.selectedContainerColor);336mySettings.colorSettings.selectedContainerPlanColor = parseColor(attrs, "selectedContainerPlanColor", mySettings.colorSettings.selectedContainerPlanColor);337mySettings.colorSettings.selectedCrossingColor = parseColor(attrs, "selectedCrossingColor", mySettings.colorSettings.selectedCrossingColor);338mySettings.colorSettings.selectedEdgeColor = parseColor(attrs, "selectedEdgeColor", mySettings.colorSettings.selectedEdgeColor);339mySettings.colorSettings.selectedEdgeDataColor = parseColor(attrs, "selectedEdgeDataColor", mySettings.colorSettings.selectedEdgeDataColor);340mySettings.colorSettings.selectedLaneColor = parseColor(attrs, "selectedLaneColor", mySettings.colorSettings.selectedLaneColor);341mySettings.colorSettings.selectedPersonColor = parseColor(attrs, "selectedPersonColor", mySettings.colorSettings.selectedPersonColor);342mySettings.colorSettings.selectedPersonPlanColor = parseColor(attrs, "selectedPersonPlanColor", mySettings.colorSettings.selectedPersonPlanColor);343mySettings.colorSettings.selectedProhibitionColor = parseColor(attrs, "selectedProhibitionColor", mySettings.colorSettings.selectedProhibitionColor);344mySettings.colorSettings.selectedRouteColor = parseColor(attrs, "selectedRouteColor", mySettings.colorSettings.selectedRouteColor);345mySettings.colorSettings.selectedVehicleColor = parseColor(attrs, "selectedVehicleColor", mySettings.colorSettings.selectedVehicleColor);346mySettings.colorSettings.selectionColor = parseColor(attrs, "selectionColor", mySettings.colorSettings.selectionColor);347mySettings.colorSettings.stopColor = parseColor(attrs, "stopColor", mySettings.colorSettings.stopColor);348mySettings.colorSettings.waypointColor = parseColor(attrs, "waypointColor", mySettings.colorSettings.waypointColor);349mySettings.colorSettings.stopContainerColor = parseColor(attrs, "stopContainerColor", mySettings.colorSettings.stopContainerColor);350mySettings.colorSettings.stopPersonColor = parseColor(attrs, "stopPersonColor", mySettings.colorSettings.stopPersonColor);351mySettings.colorSettings.trainStopColor = parseColor(attrs, "trainStopColor", mySettings.colorSettings.trainStopColor);352mySettings.colorSettings.trainStopColorSign = parseColor(attrs, "trainStopColorSign", mySettings.colorSettings.trainStopColorSign);353mySettings.colorSettings.transhipColor = parseColor(attrs, "transhipColor", mySettings.colorSettings.transhipColor);354mySettings.colorSettings.transportColor = parseColor(attrs, "transportColor", mySettings.colorSettings.transportColor);355mySettings.colorSettings.vehicleTripColor = parseColor(attrs, "vehicleTripColor", mySettings.colorSettings.vehicleTripColor);356mySettings.colorSettings.walkColor = parseColor(attrs, "walkColor", mySettings.colorSettings.walkColor);357mySettings.widthSettings.personTripWidth = StringUtils::toDouble(attrs.getStringSecure("personTripWidth", toString(mySettings.widthSettings.personTripWidth)));358mySettings.widthSettings.rideWidth = StringUtils::toDouble(attrs.getStringSecure("rideWidth", toString(mySettings.widthSettings.rideWidth)));359mySettings.widthSettings.transhipWidth = StringUtils::toDouble(attrs.getStringSecure("transhipWidth", toString(mySettings.widthSettings.transhipWidth)));360mySettings.widthSettings.transportWidth = StringUtils::toDouble(attrs.getStringSecure("transportWidth", toString(mySettings.widthSettings.transportWidth)));361mySettings.widthSettings.tripWidth = StringUtils::toDouble(attrs.getStringSecure("tripWidth", toString(mySettings.widthSettings.tripWidth)));362mySettings.widthSettings.walkWidth = StringUtils::toDouble(attrs.getStringSecure("walkWidth", toString(mySettings.widthSettings.walkWidth)));363mySettings.colorSettings.busStopColor = parseColor(attrs, "busStopColor", mySettings.colorSettings.busStopColor);364break;365case SUMO_TAG_VIEWSETTINGS_POIS:366mySettings.poiTextParam = attrs.getStringSecure("poiTextParam", mySettings.poiTextParam);367mySettings.poiSize = parseSizeSettings("poi", attrs, mySettings.poiSize);368mySettings.poiDetail = StringUtils::toInt(attrs.getStringSecure("poiDetail", toString(mySettings.poiDetail)));369mySettings.poiName = parseTextSettings("poiName", attrs, mySettings.poiName);370mySettings.poiType = parseTextSettings("poiType", attrs, mySettings.poiType);371mySettings.poiText = parseTextSettings("poiText", attrs, mySettings.poiText);372mySettings.poiColorer.setActive(StringUtils::toInt(attrs.getStringSecure("personMode", "0")));373mySettings.poiUseCustomLayer = StringUtils::toBool(attrs.getStringSecure("poiUseCustomLayer", toString(mySettings.poiUseCustomLayer)));374mySettings.poiCustomLayer = StringUtils::toDouble(attrs.getStringSecure("poiCustomLayer", toString(mySettings.poiCustomLayer)));375myCurrentColorer = element;376break;377case SUMO_TAG_VIEWSETTINGS_POLYS:378mySettings.polySize = parseSizeSettings("poly", attrs, mySettings.polySize);379mySettings.polyName = parseTextSettings("polyName", attrs, mySettings.polyName);380mySettings.polyType = parseTextSettings("polyType", attrs, mySettings.polyType);381mySettings.polyColorer.setActive(StringUtils::toInt(attrs.getStringSecure("personMode", "0")));382mySettings.polyUseCustomLayer = StringUtils::toBool(attrs.getStringSecure("polyUseCustomLayer", toString(mySettings.polyUseCustomLayer)));383mySettings.polyCustomLayer = StringUtils::toDouble(attrs.getStringSecure("polyCustomLayer", toString(mySettings.polyCustomLayer)));384myCurrentColorer = element;385break;386case SUMO_TAG_VIEWSETTINGS_LEGEND:387mySettings.showSizeLegend = StringUtils::toBool(attrs.getStringSecure("showSizeLegend", toString(mySettings.showSizeLegend)));388mySettings.showColorLegend = StringUtils::toBool(attrs.getStringSecure("showColorLegend", toString(mySettings.showColorLegend)));389mySettings.showVehicleColorLegend = StringUtils::toBool(attrs.getStringSecure("showVehicleColorLegend", toString(mySettings.showVehicleColorLegend)));390break;391case SUMO_TAG_VIEWSETTINGS_DECAL: {392GUISUMOAbstractView::Decal d;393if (attrs.hasAttribute(SUMO_ATTR_FILE)) {394d.filename = StringUtils::substituteEnvironment(attrs.get<std::string>(SUMO_ATTR_FILE, nullptr, ok));395} else {396d.filename = attrs.getStringSecure("filename", d.filename);397WRITE_WARNING(TL("The 'filename' attribute is deprecated for decals. Please use 'file'."));398}399if (d.filename != "" && !FileHelpers::isAbsolute(d.filename)) {400d.filename = FileHelpers::getConfigurationRelative(getFileName(), d.filename);401}402d.centerX = attrs.getOpt<double>(SUMO_ATTR_CENTER_X, nullptr, ok, d.centerX);403d.centerY = attrs.getOpt<double>(SUMO_ATTR_CENTER_Y, nullptr, ok, d.centerY);404d.centerZ = attrs.getOpt<double>(SUMO_ATTR_CENTER_Z, nullptr, ok, d.centerZ);405d.width = attrs.getOpt<double>(SUMO_ATTR_WIDTH, nullptr, ok, d.width);406d.height = attrs.getOpt<double>(SUMO_ATTR_HEIGHT, nullptr, ok, d.height);407d.altitude = StringUtils::toDouble(attrs.getStringSecure("altitude", "0"));408d.rot = StringUtils::toDouble(attrs.getStringSecure("rotation", toString(d.rot)));409d.tilt = StringUtils::toDouble(attrs.getStringSecure("tilt", toString(d.tilt)));410d.roll = StringUtils::toDouble(attrs.getStringSecure("roll", toString(d.roll)));411d.layer = attrs.getOpt<double>(SUMO_ATTR_LAYER, nullptr, ok, d.layer);412d.screenRelative = StringUtils::toBool(attrs.getStringSecure("screenRelative", toString(d.screenRelative)));413d.initialised = false;414myDecals.push_back(d);415}416break;417case SUMO_TAG_VIEWSETTINGS_LIGHT: {418GUISUMOAbstractView::Decal d;419d.filename = "light" + attrs.getOpt<std::string>(SUMO_ATTR_INDEX, nullptr, ok, "0");420d.centerX = attrs.getOpt<double>(SUMO_ATTR_CENTER_X, nullptr, ok, d.centerX);421d.centerY = attrs.getOpt<double>(SUMO_ATTR_CENTER_Y, nullptr, ok, d.centerY);422d.centerZ = attrs.getOpt<double>(SUMO_ATTR_CENTER_Z, nullptr, ok, d.centerZ);423d.width = attrs.getOpt<double>(SUMO_ATTR_WIDTH, nullptr, ok, d.width);424d.height = attrs.getOpt<double>(SUMO_ATTR_HEIGHT, nullptr, ok, d.height);425d.altitude = StringUtils::toDouble(attrs.getStringSecure("altitude", "0"));426d.rot = StringUtils::toDouble(attrs.getStringSecure("rotation", toString(d.rot)));427d.tilt = StringUtils::toDouble(attrs.getStringSecure("tilt", toString(d.tilt)));428d.roll = StringUtils::toDouble(attrs.getStringSecure("roll", toString(d.roll)));429d.layer = attrs.getOpt<double>(SUMO_ATTR_LAYER, nullptr, ok, d.layer);430d.initialised = false;431myDecals.push_back(d);432}433break;434case SUMO_TAG_VIEWSETTINGS_EVENT: {435const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);436const std::string cmd = attrs.get<std::string>(SUMO_ATTR_COMMAND, nullptr, ok);437const double prob = attrs.get<double>(SUMO_ATTR_PROB, id.c_str(), ok);438myEventDistributions[id].add(cmd, prob);439}440break;441case SUMO_TAG_VIEWSETTINGS_EVENT_JAM_TIME:442myJamSoundTime = attrs.get<double>(SUMO_ATTR_VALUE, nullptr, ok);443break;444default:445break;446}447}448449void450GUISettingsHandler::myEndElement(int element) {451switch (element) {452case SUMO_TAG_VIEWSETTINGS_SCHEME: {453if (mySettings.name != "") {454gSchemeStorage.add(mySettings);455myLoadedSettingNames.push_back(mySettings.name);456}457}458}459}460461462RGBColor463GUISettingsHandler::parseColor(const SUMOSAXAttributes& attrs, const std::string attribute, const RGBColor& defaultValue) const {464bool ok = true;465return RGBColor::parseColorReporting(attrs.getStringSecure(attribute, toString(defaultValue)), attribute.c_str(), nullptr, true, ok);466}467468469GUIVisualizationTextSettings470GUISettingsHandler::parseTextSettings(471const std::string& prefix, const SUMOSAXAttributes& attrs,472GUIVisualizationTextSettings defaults) {473bool ok = true;474return GUIVisualizationTextSettings(475StringUtils::toBool(attrs.getStringSecure(prefix + "_show", toString(defaults.showText))),476StringUtils::toDouble(attrs.getStringSecure(prefix + "_size", toString(defaults.size))),477RGBColor::parseColorReporting(attrs.getStringSecure(prefix + "_color", toString(defaults.color)), "textSettings", nullptr, true, ok),478RGBColor::parseColorReporting(attrs.getStringSecure(prefix + "_bgColor", toString(defaults.bgColor)), "textSettings", nullptr, true, ok),479StringUtils::toBool(attrs.getStringSecure(prefix + "_constantSize", toString(defaults.constSize))),480StringUtils::toBool(attrs.getStringSecure(prefix + "_onlySelected", toString(defaults.onlySelected))));481}482483484GUIVisualizationSizeSettings485GUISettingsHandler::parseSizeSettings(486const std::string& prefix, const SUMOSAXAttributes& attrs,487GUIVisualizationSizeSettings defaults) {488return GUIVisualizationSizeSettings(489StringUtils::toDouble(attrs.getStringSecure(prefix + "_minSize", toString(defaults.minSize))),490StringUtils::toDouble(attrs.getStringSecure(prefix + "_exaggeration", toString(defaults.exaggeration))),491StringUtils::toBool(attrs.getStringSecure(prefix + "_constantSize", toString(defaults.constantSize))),492StringUtils::toBool(attrs.getStringSecure(prefix + "_constantSizeSelected", toString(defaults.constantSizeSelected))));493}494495GUIVisualizationRainbowSettings496GUISettingsHandler::parseRainbowSettings(497const std::string& prefix, const SUMOSAXAttributes& attrs,498GUIVisualizationRainbowSettings defaults) {499return GUIVisualizationRainbowSettings(500StringUtils::toBool(attrs.getStringSecure(prefix + "HideCheck", toString(defaults.hideMin))),501StringUtils::toDouble(attrs.getStringSecure(prefix + "HideThreshold", toString(defaults.minThreshold))),502StringUtils::toBool(attrs.getStringSecure(prefix + "HideCheck2", toString(defaults.hideMax))),503StringUtils::toDouble(attrs.getStringSecure(prefix + "HideThreshold2", toString(defaults.maxThreshold))),504StringUtils::toBool(attrs.getStringSecure(prefix + "SetNeutral", toString(defaults.hideMax))),505StringUtils::toDouble(attrs.getStringSecure(prefix + "NeutralThreshold", toString(defaults.neutralThreshold))),506StringUtils::toBool(attrs.getStringSecure(prefix + "FixRange", toString(defaults.fixRange))),507StringUtils::toInt(attrs.getStringSecure(prefix + "RainbowScheme", toString(defaults.rainbowScheme))));508}509510const std::vector<std::string>&511GUISettingsHandler::addSettings(GUISUMOAbstractView* view) const {512if (view) {513for (std::string name : myLoadedSettingNames) {514FXint index = view->getColoringSchemesCombo()->appendIconItem(name.c_str());515view->getColoringSchemesCombo()->setCurrentItem(index);516view->setColorScheme(name);517}518}519return myLoadedSettingNames;520}521522523void524GUISettingsHandler::applyViewport(GUISUMOAbstractView* view) const {525if (myLookFrom.z() > 0 || myZoom > 0) {526// z value stores zoom so we must convert first527double z = (view->is3DView()) ? myLookFrom.z() : view->getChanger().zoom2ZPos(myZoom);528if (view->is3DView() && !myZCoordSet) { // set view angle to ground to at least 45 degrees if no Z coordinate is given529z = myLookFrom.distanceTo2D(myLookAt) * sin(PI * 0.25);530}531Position lookFrom(myLookFrom.x(), myLookFrom.y(), z);532view->setViewportFromToRot(lookFrom, myLookAt, myRotation);533if (view->is3DView() && !myZCoordSet) {534view->recenterView();535}536}537}538539540void541GUISettingsHandler::setSnapshots(GUISUMOAbstractView* view) const {542if (!mySnapshots.empty()) {543for (auto item : mySnapshots) {544for (auto file : item.second) {545view->addSnapshot(item.first, file);546}547}548}549}550551552bool553GUISettingsHandler::hasDecals() const {554return !myDecals.empty();555}556557558const std::vector<GUISUMOAbstractView::Decal>&559GUISettingsHandler::getDecals() const {560return myDecals;561}562563564double565GUISettingsHandler::getDelay() const {566return myDelay;567}568569570std::vector<SUMOTime>571GUISettingsHandler::loadBreakpoints(const std::string& file) {572std::vector<SUMOTime> result;573std::ifstream strm(file.c_str());574if (!strm.good()) {575WRITE_ERRORF(TL("Could not open '%'."), file);576return result;577}578while (strm.good()) {579std::string val;580strm >> val;581if (val.length() == 0) {582continue;583}584try {585SUMOTime value = string2time(val);586result.push_back(value);587} catch (NumberFormatException& e) {588WRITE_ERRORF(TL("A breakpoint value must be a time description (%)."), toString(e.what()));589} catch (EmptyData&) {590} catch (ProcessError&) {591WRITE_ERRORF(TL("Could not decode breakpoint '%'."), val);592}593}594return result;595}596597598RandomDistributor<std::string>599GUISettingsHandler::getEventDistribution(const std::string& id) {600RandomDistributor<std::string> result = myEventDistributions[id];601if (result.getOverallProb() > 0 && result.getOverallProb() < 1) {602// unscaled probabilities are assumed, fill up with dummy event603result.add("", 1. - result.getOverallProb());604}605return result;606}607608609/****************************************************************************/610611612