Path: blob/main/src/netedit/elements/data/GNEMeanData.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 GNEMeanData.cpp14/// @author Pablo Alvarez Lopez15/// @date Nov 202216///17// Class for representing MeanData18/****************************************************************************/1920#include <netedit/GNENet.h>21#include <netedit/GNETagProperties.h>22#include <netedit/changes/GNEChange_Attribute.h>2324#include "GNEMeanData.h"2526// ===========================================================================27// member method definitions28// ===========================================================================2930GNEMeanData::GNEMeanData(SumoXMLTag tag, std::string ID, GNENet* net, const std::string& filename) :31GNEAttributeCarrier(tag, net, filename, true),32myID(ID) {33// reset default values34resetDefaultValues(false);35}363738GNEMeanData::GNEMeanData(SumoXMLTag tag, std::string ID, GNENet* net, const std::string& filename, const std::string& file, const SUMOTime period,39const SUMOTime begin, const SUMOTime end, const bool trackVehicles, const std::vector<SumoXMLAttr>& writtenAttributes,40const bool aggregate, const std::vector<std::string>& edges, const std::string& edgeFile, const std::string& excludeEmpty,41const bool withInternal, const std::vector<std::string>& detectPersons, const double minSamples, const double maxTravelTime,42const std::vector<std::string>& vTypes, const double speedThreshold) :43GNEAttributeCarrier(tag, net, filename, false),44myID(ID),45myFile(file),46myPeriod(period),47myBegin(begin),48myEnd(end),49myTrackVehicles(trackVehicles),50myWrittenAttributes(writtenAttributes),51myAggregate(aggregate),52myEdges(edges),53myEdgeFile(edgeFile),54myExcludeEmpty(excludeEmpty),55myWithInternal(withInternal),56myDetectPersons(detectPersons),57myMinSamples(minSamples),58myMaxTravelTime(maxTravelTime),59myVTypes(vTypes),60mySpeedThreshold(speedThreshold) {61// set file62if (myFile.empty()) {63myFile = (myID + ".xml");64}65}666768GNEMeanData::~GNEMeanData() {}697071GNEHierarchicalElement*72GNEMeanData::getHierarchicalElement() {73return this;74}757677void78GNEMeanData::writeMeanData(OutputDevice& device) const {79device.openTag(getTagProperty()->getTag());80// write needed attributes81device.writeAttr(SUMO_ATTR_ID, getID());82if (myFile.empty()) {83device.writeAttr(SUMO_ATTR_FILE, myID + ".xml");84} else {85device.writeAttr(SUMO_ATTR_FILE, myFile);86}87// write optional attributes88if (myPeriod != myTagProperty->getDefaultTimeValue(SUMO_ATTR_PERIOD)) {89std::cout << myPeriod << std::endl;90device.writeAttr(SUMO_ATTR_PERIOD, time2string(myPeriod));91}92if (myBegin != myTagProperty->getDefaultTimeValue(SUMO_ATTR_BEGIN)) {93device.writeAttr(SUMO_ATTR_BEGIN, time2string(myBegin));94}95if (myEnd != myTagProperty->getDefaultTimeValue(SUMO_ATTR_END)) {96device.writeAttr(SUMO_ATTR_END, time2string(myEnd));97}98if (myExcludeEmpty != myTagProperty->getDefaultStringValue(SUMO_ATTR_EXCLUDE_EMPTY)) {99device.writeAttr(SUMO_ATTR_EXCLUDE_EMPTY, myExcludeEmpty);100}101if (myWithInternal) {102device.writeAttr(SUMO_ATTR_WITH_INTERNAL, true);103}104if (myMaxTravelTime != myTagProperty->getDefaultDoubleValue(SUMO_ATTR_MAX_TRAVELTIME)) {105device.writeAttr(SUMO_ATTR_MAX_TRAVELTIME, myMaxTravelTime);106}107if (myMinSamples != myTagProperty->getDefaultDoubleValue(SUMO_ATTR_MIN_SAMPLES)) {108device.writeAttr(SUMO_ATTR_MIN_SAMPLES, myMinSamples);109}110if (mySpeedThreshold != myTagProperty->getDefaultDoubleValue(SUMO_ATTR_HALTING_SPEED_THRESHOLD)) {111device.writeAttr(SUMO_ATTR_HALTING_SPEED_THRESHOLD, mySpeedThreshold);112}113if (myVTypes.size() > 0) {114device.writeAttr(SUMO_ATTR_VTYPES, getAttribute(SUMO_ATTR_VTYPES));115}116if (myTrackVehicles) {117device.writeAttr(SUMO_ATTR_TRACK_VEHICLES, true);118}119if (myDetectPersons.size() > 0 && (myDetectPersons.at(0) != SUMOXMLDefinitions::PersonModeValues.getString(PersonMode::NONE))) {120device.writeAttr(SUMO_ATTR_DETECT_PERSONS, myDetectPersons);121}122if (myWrittenAttributes.size() > 0) {123device.writeAttr(SUMO_ATTR_WRITE_ATTRIBUTES, getAttribute(SUMO_ATTR_WRITE_ATTRIBUTES));124}125if (myEdges.size() > 0) {126device.writeAttr(SUMO_ATTR_EDGES, myEdges);127}128if (myEdgeFile.size() > 0) {129device.writeAttr(SUMO_ATTR_EDGESFILE, myEdgeFile);130}131if (myAggregate) {132device.writeAttr(SUMO_ATTR_AGGREGATE, true);133}134device.closeTag();135}136137138GUIGlObject*139GNEMeanData::getGUIGlObject() {140return nullptr;141}142143144const GUIGlObject*145GNEMeanData::getGUIGlObject() const {146return nullptr;147}148149150void151GNEMeanData::updateGeometry() {152// nothing to update153}154155156Position157GNEMeanData::getPositionInView() const {158return Position();159}160161162bool163GNEMeanData::checkDrawFromContour() const {164return false;165}166167168bool169GNEMeanData::checkDrawToContour() const {170return false;171}172173174bool175GNEMeanData::checkDrawRelatedContour() const {176return false;177}178179180bool181GNEMeanData::checkDrawOverContour() const {182return false;183}184185186bool187GNEMeanData::checkDrawDeleteContour() const {188return false;189}190191192bool193GNEMeanData::checkDrawDeleteContourSmall() const {194return false;195}196197198bool199GNEMeanData::checkDrawSelectContour() const {200return false;201}202203204bool205GNEMeanData::checkDrawMoveContour() const {206return false;207}208209210std::string211GNEMeanData::getAttribute(SumoXMLAttr key) const {212switch (key) {213case SUMO_ATTR_ID:214return myID;215case SUMO_ATTR_FILE:216return myFile;217case SUMO_ATTR_PERIOD:218if (myPeriod == myTagProperty->getDefaultTimeValue(key)) {219return "";220} else {221return time2string(myPeriod);222}223case SUMO_ATTR_BEGIN:224if (myBegin == myTagProperty->getDefaultTimeValue(key)) {225return "";226} else {227return time2string(myBegin);228}229case SUMO_ATTR_END:230if (myEnd == myTagProperty->getDefaultTimeValue(key)) {231return "";232} else {233return time2string(myEnd);234}235case SUMO_ATTR_EXCLUDE_EMPTY:236return myExcludeEmpty;237case SUMO_ATTR_WITH_INTERNAL:238return toString(myWithInternal);239case SUMO_ATTR_MAX_TRAVELTIME:240return toString(myMaxTravelTime);241case SUMO_ATTR_MIN_SAMPLES:242return toString(myMinSamples);243case SUMO_ATTR_HALTING_SPEED_THRESHOLD:244return toString(mySpeedThreshold);245case SUMO_ATTR_VTYPES:246return toString(myVTypes);247case SUMO_ATTR_TRACK_VEHICLES:248return toString(myTrackVehicles);249case SUMO_ATTR_DETECT_PERSONS:250return toString(myDetectPersons);251case SUMO_ATTR_WRITE_ATTRIBUTES:252return joinToString(myWrittenAttributes, " ");253case SUMO_ATTR_EDGES:254return toString(myEdges);255case SUMO_ATTR_EDGESFILE:256return myEdgeFile;257case SUMO_ATTR_AGGREGATE:258return toString(myAggregate);259default:260return getCommonAttribute(this, key);261}262}263264265double266GNEMeanData::getAttributeDouble(SumoXMLAttr key) const {267throw InvalidArgument(getTagStr() + " doesn't have a double attribute of type '" + toString(key) + "'");268}269270271void272GNEMeanData::setAttribute(SumoXMLAttr key, const std::string& value, GNEUndoList* undoList) {273if (value == getAttribute(key)) {274return; //avoid needless changes, later logic relies on the fact that attributes have changed275}276switch (key) {277case SUMO_ATTR_ID:278case SUMO_ATTR_FILE:279case SUMO_ATTR_PERIOD:280case SUMO_ATTR_BEGIN:281case SUMO_ATTR_END:282case SUMO_ATTR_EXCLUDE_EMPTY:283case SUMO_ATTR_WITH_INTERNAL:284case SUMO_ATTR_MAX_TRAVELTIME:285case SUMO_ATTR_MIN_SAMPLES:286case SUMO_ATTR_HALTING_SPEED_THRESHOLD:287case SUMO_ATTR_VTYPES:288case SUMO_ATTR_TRACK_VEHICLES:289case SUMO_ATTR_DETECT_PERSONS:290case SUMO_ATTR_WRITE_ATTRIBUTES:291case SUMO_ATTR_EDGES:292case SUMO_ATTR_EDGESFILE:293case SUMO_ATTR_AGGREGATE:294GNEChange_Attribute::changeAttribute(this, key, value, undoList);295break;296default:297setCommonAttribute(key, value, undoList);298break;299}300}301302303bool304GNEMeanData::isValid(SumoXMLAttr key, const std::string& value) {305switch (key) {306case SUMO_ATTR_ID:307return SUMOXMLDefinitions::isValidNetID(value) && (myNet->getAttributeCarriers()->retrieveMeanData(myTagProperty->getTag(), value, false) == nullptr);308case SUMO_ATTR_FILE:309return SUMOXMLDefinitions::isValidFilename(value);310case SUMO_ATTR_PERIOD:311case SUMO_ATTR_BEGIN:312case SUMO_ATTR_END:313if (value.empty()) {314return true;315} else {316return (canParse<SUMOTime>(value) && (parse<SUMOTime>(value) >= 0));317}318case SUMO_ATTR_EXCLUDE_EMPTY:319if (canParse<bool>(value)) {320return true;321} else {322return (value == SUMOXMLDefinitions::ExcludeEmptys.getString(ExcludeEmpty::DEFAULTS));323}324case SUMO_ATTR_WITH_INTERNAL:325return (canParse<bool>(value));326case SUMO_ATTR_MAX_TRAVELTIME:327if (value.empty()) {328return true;329} else {330return (canParse<double>(value) && (parse<double>(value) >= 0));331}332case SUMO_ATTR_MIN_SAMPLES:333return (canParse<double>(value) && (parse<double>(value) >= 0));334case SUMO_ATTR_HALTING_SPEED_THRESHOLD:335return (canParse<double>(value) && (parse<double>(value) >= 0));336case SUMO_ATTR_VTYPES:337return true;338case SUMO_ATTR_TRACK_VEHICLES:339return (canParse<bool>(value));340case SUMO_ATTR_DETECT_PERSONS:341if (value.empty()) {342return true;343} else {344return SUMOXMLDefinitions::PersonModeValues.hasString(value);345}346case SUMO_ATTR_WRITE_ATTRIBUTES:347return canParse<std::vector<SumoXMLAttr> >(value);348case SUMO_ATTR_EDGES:349return canParse<std::vector<GNEEdge*> >(myNet, value, false);350case SUMO_ATTR_EDGESFILE:351return SUMOXMLDefinitions::isValidFilename(value);352case SUMO_ATTR_AGGREGATE:353return (canParse<bool>(value));354default:355return isCommonValid(key, value);356}357}358359360std::string361GNEMeanData::getPopUpID() const {362return getTagStr();363}364365366std::string367GNEMeanData::getHierarchyName() const {368return getTagStr();369}370371372const Parameterised::Map&373GNEMeanData::getACParametersMap() const {374return getParametersMap();375}376377378void379GNEMeanData::setAttribute(SumoXMLAttr key, const std::string& value) {380switch (key) {381case SUMO_ATTR_ID:382myNet->getAttributeCarriers()->updateMeanDataID(this, value);383myID = value;384break;385case SUMO_ATTR_FILE:386if (value.empty()) {387myFile = (myID + ".xml");388} else {389myFile = value;390}391break;392case SUMO_ATTR_PERIOD:393if (value.empty()) {394myPeriod = myTagProperty->getDefaultTimeValue(key);395} else {396myPeriod = string2time(value);397}398break;399case SUMO_ATTR_BEGIN:400if (value.empty()) {401myBegin = myTagProperty->getDefaultTimeValue(key);402} else {403myBegin = string2time(value);404}405break;406case SUMO_ATTR_END:407if (value.empty()) {408myEnd = myTagProperty->getDefaultTimeValue(key);409} else {410myEnd = string2time(value);411}412break;413case SUMO_ATTR_EXCLUDE_EMPTY:414if (value == SUMOXMLDefinitions::ExcludeEmptys.getString(ExcludeEmpty::DEFAULTS)) {415myExcludeEmpty = value;416} else if (parse<bool>(value)) {417myExcludeEmpty = SUMOXMLDefinitions::ExcludeEmptys.getString(ExcludeEmpty::TRUES);418} else {419myExcludeEmpty = SUMOXMLDefinitions::ExcludeEmptys.getString(ExcludeEmpty::FALSES);420}421break;422case SUMO_ATTR_WITH_INTERNAL:423myWithInternal = parse<bool>(value);424break;425case SUMO_ATTR_MAX_TRAVELTIME:426if (value.empty()) {427myMaxTravelTime = myTagProperty->getDefaultDoubleValue(key);428} else {429myMaxTravelTime = parse<double>(value);430}431break;432case SUMO_ATTR_MIN_SAMPLES:433if (value.empty()) {434myMinSamples = myTagProperty->getDefaultDoubleValue(key);435} else {436myMinSamples = parse<double>(value);437}438break;439case SUMO_ATTR_HALTING_SPEED_THRESHOLD:440if (value.empty()) {441mySpeedThreshold = myTagProperty->getDefaultDoubleValue(key);442} else {443mySpeedThreshold = parse<double>(value);444}445break;446case SUMO_ATTR_VTYPES:447myVTypes = parse<std::vector<std::string> >(value);448break;449case SUMO_ATTR_TRACK_VEHICLES:450myTrackVehicles = parse<bool>(value);451break;452case SUMO_ATTR_DETECT_PERSONS:453myDetectPersons.clear();454if (value.empty()) {455myDetectPersons.push_back(SUMOXMLDefinitions::PersonModeValues.getString(PersonMode::NONE));456} else {457myDetectPersons = parse<std::vector<std::string> >(value);458}459break;460case SUMO_ATTR_WRITE_ATTRIBUTES:461myWrittenAttributes = parse<std::vector<SumoXMLAttr> >(value);462break;463case SUMO_ATTR_EDGES:464myEdges = parse<std::vector<std::string> >(value);465break;466case SUMO_ATTR_EDGESFILE:467myEdgeFile = value;468break;469case SUMO_ATTR_AGGREGATE:470myAggregate = parse<bool>(value);471break;472default:473setCommonAttribute(this, key, value);474break;475}476}477478/****************************************************************************/479480481