Path: blob/main/src/utils/gui/settings/GUICompleteSchemeStorage.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 GUICompleteSchemeStorage.cpp14/// @author Daniel Krajzewicz15/// @author Jakob Erdmann16/// @author Michael Behrisch17/// @author Laura Bieker18/// @date 2006-01-0919///20// Storage for available visualization settings21/****************************************************************************/22#include <config.h>2324#include "GUICompleteSchemeStorage.h"25#include <utils/common/ToString.h>26#include <utils/common/StringUtils.h>27#include <utils/common/RGBColor.h>28#include <utils/foxtools/MFXUtils.h>29#include <utils/gui/settings/GUISettingsHandler.h>30#include <utils/iodevices/OutputDevice_String.h>313233// ===========================================================================34// static variable definitions35// ===========================================================================36GUICompleteSchemeStorage gSchemeStorage;373839// ===========================================================================40// method definitions41// ===========================================================================42GUICompleteSchemeStorage::GUICompleteSchemeStorage() { }434445GUICompleteSchemeStorage::~GUICompleteSchemeStorage() {46for (auto item : mySettings) {47delete item.second;48}49}50515253void54GUICompleteSchemeStorage::add(const GUIVisualizationSettings& scheme) {55std::string name = scheme.name;56if (std::find(mySortedSchemeNames.begin(), mySortedSchemeNames.end(), name) == mySortedSchemeNames.end()) {57mySortedSchemeNames.push_back(name);58}59GUIVisualizationSettings* s = new GUIVisualizationSettings(name);60s->copy(scheme);61mySettings[name] = s;62}636465GUIVisualizationSettings&66GUICompleteSchemeStorage::get(const std::string& name) {67return *mySettings.find(name)->second;68}697071GUIVisualizationSettings&72GUICompleteSchemeStorage::getDefault() {73return *mySettings.find(myDefaultSettingName)->second;74}757677bool78GUICompleteSchemeStorage::contains(const std::string& name) const {79return mySettings.find(name) != mySettings.end();80}818283void84GUICompleteSchemeStorage::remove(const std::string name) {85if (!contains(name)) {86return;87}88mySortedSchemeNames.erase(find(mySortedSchemeNames.begin(), mySortedSchemeNames.end(), name));89delete mySettings.find(name)->second;90mySettings.erase(name);91}929394void95GUICompleteSchemeStorage::setDefault(const std::string& name) {96if (!contains(name)) {97return;98}99myDefaultSettingName = name;100}101102103const std::vector<std::string>&104GUICompleteSchemeStorage::getNames() const {105return mySortedSchemeNames;106}107108109int110GUICompleteSchemeStorage::getNumInitialSettings() const {111return myNumInitialSettings;112}113114115void116GUICompleteSchemeStorage::init(FXApp* app, bool netedit) {117{118GUIVisualizationSettings vs("standard", netedit);119vs.laneShowBorders = true;120gSchemeStorage.add(vs);121}122{123GUIVisualizationSettings vs("faster standard", netedit);124vs.laneShowBorders = false;125vs.showLinkDecals = false;126vs.showRails = false;127vs.showRails = false;128vs.showSublanes = false;129gSchemeStorage.add(vs);130}131{132GUIVisualizationSettings vs("real world", netedit);133vs.vehicleQuality = 2;134vs.backgroundColor = RGBColor(51, 128, 51, 255);135vs.laneShowBorders = true;136vs.hideConnectors = true;137vs.vehicleSize.minSize = 0;138vs.personQuality = 2;139vs.containerQuality = 2;140vs.showSublanes = false;141gSchemeStorage.add(vs);142}143{144GUIVisualizationSettings vs("rail", netedit);145vs.vehicleQuality = 2;146vs.showLaneDirection = true;147vs.spreadSuperposed = true;148vs.junctionSize.constantSize = true;149vs.junctionColorer.setSchemeByName(GUIVisualizationSettings::SCHEME_NAME_TYPE);150gSchemeStorage.add(vs);151}152153if (!netedit) {154GUIVisualizationSettings vs("selection", netedit);155vs.vehicleColorer.setSchemeByName(GUIVisualizationSettings::SCHEME_NAME_SELECTION);156vs.edgeColorer.setSchemeByName(GUIVisualizationSettings::SCHEME_NAME_SELECTION);157vs.laneColorer.setSchemeByName(GUIVisualizationSettings::SCHEME_NAME_SELECTION);158vs.junctionColorer.setSchemeByName(GUIVisualizationSettings::SCHEME_NAME_SELECTION);159vs.personColorer.setSchemeByName(GUIVisualizationSettings::SCHEME_NAME_SELECTION);160vs.containerColorer.setSchemeByName(GUIVisualizationSettings::SCHEME_NAME_SELECTION);161vs.poiColorer.setSchemeByName(GUIVisualizationSettings::SCHEME_NAME_SELECTION);162vs.polyColorer.setSchemeByName(GUIVisualizationSettings::SCHEME_NAME_SELECTION);163gSchemeStorage.add(vs);164}165myNumInitialSettings = (int) mySortedSchemeNames.size();166// add saved settings167int noSaved = app->reg().readIntEntry("VisualizationSettings", "settingNo", 0);168for (int i = 0; i < noSaved; ++i) {169std::string name = "visset#" + toString(i);170std::string setting = app->reg().readStringEntry("VisualizationSettings", name.c_str(), "");171if (setting != "") {172GUIVisualizationSettings vs(setting, netedit);173app->reg().readStringEntry("VisualizationSettings", name.c_str(), "");174175// add saved xml setting176int xmlSize = app->reg().readIntEntry(name.c_str(), "xmlSize", 0);177std::string content = "";178int index = 0;179while (xmlSize > 0) {180std::string part = app->reg().readStringEntry(name.c_str(), ("xml" + toString(index)).c_str(), "");181if (part == "") {182break;183}184content += part;185xmlSize -= (int) part.size();186index++;187}188if (content != "" && xmlSize == 0) {189try {190GUISettingsHandler handler(content, false, netedit);191handler.addSettings();192} catch (ProcessError&) { }193}194}195}196myDefaultSettingName = mySortedSchemeNames[0];197myLookFrom.set(0, 0, 0);198}199200201void202GUICompleteSchemeStorage::writeSettings(FXApp* app) {203const std::vector<std::string>& names = getNames();204app->reg().writeIntEntry("VisualizationSettings", "settingNo", (FXint) names.size() - myNumInitialSettings);205int gidx = 0;206for (std::vector<std::string>::const_iterator it = names.begin() + myNumInitialSettings; it != names.end(); ++it, ++gidx) {207const GUIVisualizationSettings* item = mySettings.find(*it)->second;208std::string sname = "visset#" + toString(gidx);209210app->reg().writeStringEntry("VisualizationSettings", sname.c_str(), item->name.c_str());211OutputDevice_String dev;212item->save(dev);213std::string content = dev.getString();214app->reg().writeIntEntry(sname.c_str(), "xmlSize", (FXint)(content.size()));215const unsigned maxSize = 1500; // this is a fox limitation for registry entries216for (int i = 0; i < (int)content.size(); i += maxSize) {217const std::string b = content.substr(i, maxSize);218app->reg().writeStringEntry(sname.c_str(), ("xml" + toString(i / maxSize)).c_str(), b.c_str());219}220}221}222223224void225GUICompleteSchemeStorage::saveViewport(const double x, const double y, const double z, const double rot) {226myLookFrom.set(x, y, z);227myRotation = rot;228}229230void231GUICompleteSchemeStorage::saveDecals(const std::vector<GUISUMOAbstractView::Decal>& decals) {232myDecals = decals;233for (auto& d : myDecals) {234d.initialised = false;235}236}237238void239GUICompleteSchemeStorage::setViewport(GUISUMOAbstractView* view) {240if (myLookFrom.z() > 0) {241// look straight down242view->setViewportFromToRot(myLookFrom, Position(myLookFrom.x(), myLookFrom.y(), 0), myRotation);243} else {244view->recenterView();245}246}247248249/****************************************************************************/250251252