Path: blob/main/src/netedit/elements/data/GNEMeanData.cpp
193678 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 GNEMeanData.cpp14/// @author Pablo Alvarez Lopez15/// @date Nov 202216///17// Class for representing MeanData18/****************************************************************************/1920#include <netedit/changes/GNEChange_Attribute.h>21#include <netedit/GNEApplicationWindow.h>22#include <netedit/GNENet.h>23#include <netedit/GNETagProperties.h>2425#include "GNEMeanData.h"2627// ===========================================================================28// member method definitions29// ===========================================================================3031GNEMeanData::GNEMeanData(SumoXMLTag tag, std::string ID, GNENet* net, FileBucket* fileBucket) :32GNEAttributeCarrier(tag, net, fileBucket),33myID(ID) {34// reset default values35resetDefaultValues(false);36}373839GNEMeanData::GNEMeanData(SumoXMLTag tag, std::string ID, GNENet* net, FileBucket* fileBucket, const std::string& file,40const std::string& type, const SUMOTime period, const SUMOTime begin, const SUMOTime end,41const bool trackVehicles, const std::vector<SumoXMLAttr>& writtenAttributes, const bool aggregate,42const std::vector<std::string>& edges, const std::string& edgeFile, const std::string& excludeEmpty,43const bool withInternal, const std::vector<std::string>& detectPersons, const double minSamples,44const double maxTravelTime, const std::vector<std::string>& vTypes, const double speedThreshold) :45GNEAttributeCarrier(tag, net, fileBucket),46myID(ID),47myFile(file),48myType(type),49myPeriod(period),50myBegin(begin),51myEnd(end),52myTrackVehicles(trackVehicles),53myWrittenAttributes(writtenAttributes),54myAggregate(aggregate),55myEdges(edges),56myEdgeFile(edgeFile),57myExcludeEmpty(excludeEmpty),58myWithInternal(withInternal),59myDetectPersons(detectPersons),60myMinSamples(minSamples),61myMaxTravelTime(maxTravelTime),62myVTypes(vTypes),63mySpeedThreshold(speedThreshold) {64// set file65if (myFile.empty()) {66myFile = (myID + ".xml");67}68}697071GNEMeanData::~GNEMeanData() {}727374GNEHierarchicalElement*75GNEMeanData::getHierarchicalElement() {76return this;77}787980GNEMoveElement*81GNEMeanData::getMoveElement() const {82return nullptr;83}848586Parameterised*87GNEMeanData::getParameters() {88return nullptr;89}909192const Parameterised*93GNEMeanData::getParameters() const {94return nullptr;95}969798GUIGlObject*99GNEMeanData::getGUIGlObject() {100return nullptr;101}102103104const GUIGlObject*105GNEMeanData::getGUIGlObject() const {106return nullptr;107}108109110FileBucket*111GNEMeanData::getFileBucket() const {112return myFileBucket;113}114115116void117GNEMeanData::writeMeanData(OutputDevice& device) const {118device.openTag(getTagProperty()->getTag());119// write needed attributes120device.writeAttr(SUMO_ATTR_ID, getID());121if (myFile.empty()) {122device.writeAttr(SUMO_ATTR_FILE, myID + ".xml");123} else {124device.writeAttr(SUMO_ATTR_FILE, myFile);125}126// write optional attributes127if (myType != myTagProperty->getDefaultStringValue(SUMO_ATTR_TYPE) &&128(myType != SUMOXMLDefinitions::MeanDataTypes.getString(MeanDataType::TRAFFIC))) {129device.writeAttr(SUMO_ATTR_TYPE, myType);130}131if (myPeriod != myTagProperty->getDefaultTimeValue(SUMO_ATTR_PERIOD)) {132device.writeAttr(SUMO_ATTR_PERIOD, time2string(myPeriod));133}134if (myBegin != myTagProperty->getDefaultTimeValue(SUMO_ATTR_BEGIN)) {135device.writeAttr(SUMO_ATTR_BEGIN, time2string(myBegin));136}137if (myEnd != myTagProperty->getDefaultTimeValue(SUMO_ATTR_END)) {138device.writeAttr(SUMO_ATTR_END, time2string(myEnd));139}140if (myExcludeEmpty != myTagProperty->getDefaultStringValue(SUMO_ATTR_EXCLUDE_EMPTY)) {141device.writeAttr(SUMO_ATTR_EXCLUDE_EMPTY, myExcludeEmpty);142}143if (myWithInternal) {144device.writeAttr(SUMO_ATTR_WITH_INTERNAL, true);145}146if (myMaxTravelTime != myTagProperty->getDefaultDoubleValue(SUMO_ATTR_MAX_TRAVELTIME)) {147device.writeAttr(SUMO_ATTR_MAX_TRAVELTIME, myMaxTravelTime);148}149if (myMinSamples != myTagProperty->getDefaultDoubleValue(SUMO_ATTR_MIN_SAMPLES)) {150device.writeAttr(SUMO_ATTR_MIN_SAMPLES, myMinSamples);151}152if (mySpeedThreshold != myTagProperty->getDefaultDoubleValue(SUMO_ATTR_HALTING_SPEED_THRESHOLD)) {153device.writeAttr(SUMO_ATTR_HALTING_SPEED_THRESHOLD, mySpeedThreshold);154}155if (myVTypes.size() > 0) {156device.writeAttr(SUMO_ATTR_VTYPES, getAttribute(SUMO_ATTR_VTYPES));157}158if (myTrackVehicles) {159device.writeAttr(SUMO_ATTR_TRACK_VEHICLES, true);160}161if (myDetectPersons.size() > 0 && (myDetectPersons.at(0) != SUMOXMLDefinitions::PersonModeValues.getString(PersonMode::NONE))) {162device.writeAttr(SUMO_ATTR_DETECT_PERSONS, myDetectPersons);163}164if (myWrittenAttributes.size() > 0) {165device.writeAttr(SUMO_ATTR_WRITE_ATTRIBUTES, getAttribute(SUMO_ATTR_WRITE_ATTRIBUTES));166}167if (myEdges.size() > 0) {168device.writeAttr(SUMO_ATTR_EDGES, myEdges);169}170if (myEdgeFile.size() > 0) {171device.writeAttr(SUMO_ATTR_EDGESFILE, myEdgeFile);172}173if (myAggregate) {174device.writeAttr(SUMO_ATTR_AGGREGATE, true);175}176device.closeTag();177}178179180void181GNEMeanData::updateGeometry() {182// nothing to update183}184185186Position187GNEMeanData::getPositionInView() const {188return Position();189}190191192bool193GNEMeanData::checkDrawFromContour() const {194return false;195}196197198bool199GNEMeanData::checkDrawToContour() const {200return false;201}202203204bool205GNEMeanData::checkDrawRelatedContour() const {206return false;207}208209210bool211GNEMeanData::checkDrawOverContour() const {212return false;213}214215216bool217GNEMeanData::checkDrawDeleteContour() const {218return false;219}220221222bool223GNEMeanData::checkDrawDeleteContourSmall() const {224return false;225}226227228bool229GNEMeanData::checkDrawSelectContour() const {230return false;231}232233234bool235GNEMeanData::checkDrawMoveContour() const {236return false;237}238239240std::string241GNEMeanData::getAttribute(SumoXMLAttr key) const {242switch (key) {243case SUMO_ATTR_ID:244return myID;245case SUMO_ATTR_FILE:246return myFile;247case SUMO_ATTR_TYPE:248return myType;249case SUMO_ATTR_PERIOD:250if (myPeriod == myTagProperty->getDefaultTimeValue(key)) {251return "";252} else {253return time2string(myPeriod);254}255case SUMO_ATTR_BEGIN:256if (myBegin == myTagProperty->getDefaultTimeValue(key)) {257return "";258} else {259return time2string(myBegin);260}261case SUMO_ATTR_END:262if (myEnd == myTagProperty->getDefaultTimeValue(key)) {263return "";264} else {265return time2string(myEnd);266}267case SUMO_ATTR_EXCLUDE_EMPTY:268return myExcludeEmpty;269case SUMO_ATTR_WITH_INTERNAL:270return toString(myWithInternal);271case SUMO_ATTR_MAX_TRAVELTIME:272return toString(myMaxTravelTime);273case SUMO_ATTR_MIN_SAMPLES:274return toString(myMinSamples);275case SUMO_ATTR_HALTING_SPEED_THRESHOLD:276return toString(mySpeedThreshold);277case SUMO_ATTR_VTYPES:278return toString(myVTypes);279case SUMO_ATTR_TRACK_VEHICLES:280return toString(myTrackVehicles);281case SUMO_ATTR_DETECT_PERSONS:282return toString(myDetectPersons);283case SUMO_ATTR_WRITE_ATTRIBUTES:284return joinToString(myWrittenAttributes, " ");285case SUMO_ATTR_EDGES:286return toString(myEdges);287case SUMO_ATTR_EDGESFILE:288return myEdgeFile;289case SUMO_ATTR_AGGREGATE:290return toString(myAggregate);291default:292return getCommonAttribute(key);293}294}295296297double298GNEMeanData::getAttributeDouble(SumoXMLAttr key) const {299return getCommonAttributeDouble(key);300}301302303Position304GNEMeanData::getAttributePosition(SumoXMLAttr key) const {305return getCommonAttributePosition(key);306}307308309PositionVector310GNEMeanData::getAttributePositionVector(SumoXMLAttr key) const {311return getCommonAttributePositionVector(key);312}313314315void316GNEMeanData::setAttribute(SumoXMLAttr key, const std::string& value, GNEUndoList* undoList) {317if (value == getAttribute(key)) {318return; //avoid needless changes, later logic relies on the fact that attributes have changed319}320switch (key) {321case SUMO_ATTR_ID:322case SUMO_ATTR_FILE:323case SUMO_ATTR_TYPE:324case SUMO_ATTR_PERIOD:325case SUMO_ATTR_BEGIN:326case SUMO_ATTR_END:327case SUMO_ATTR_EXCLUDE_EMPTY:328case SUMO_ATTR_WITH_INTERNAL:329case SUMO_ATTR_MAX_TRAVELTIME:330case SUMO_ATTR_MIN_SAMPLES:331case SUMO_ATTR_HALTING_SPEED_THRESHOLD:332case SUMO_ATTR_VTYPES:333case SUMO_ATTR_TRACK_VEHICLES:334case SUMO_ATTR_DETECT_PERSONS:335case SUMO_ATTR_WRITE_ATTRIBUTES:336case SUMO_ATTR_EDGES:337case SUMO_ATTR_EDGESFILE:338case SUMO_ATTR_AGGREGATE:339GNEChange_Attribute::changeAttribute(this, key, value, undoList);340break;341default:342setCommonAttribute(key, value, undoList);343break;344}345}346347348bool349GNEMeanData::isValid(SumoXMLAttr key, const std::string& value) {350switch (key) {351case SUMO_ATTR_ID:352return SUMOXMLDefinitions::isValidNetID(value) && (myNet->getAttributeCarriers()->retrieveMeanData(myTagProperty->getTag(), value, false) == nullptr);353case SUMO_ATTR_FILE:354return SUMOXMLDefinitions::isValidFilename(value);355case SUMO_ATTR_TYPE:356return SUMOXMLDefinitions::MeanDataTypes.hasString(value);357case SUMO_ATTR_PERIOD:358case SUMO_ATTR_BEGIN:359case SUMO_ATTR_END:360if (value.empty()) {361return true;362} else {363return (canParse<SUMOTime>(value) && (parse<SUMOTime>(value) >= 0));364}365case SUMO_ATTR_EXCLUDE_EMPTY:366if (canParse<bool>(value)) {367return true;368} else {369return (value == SUMOXMLDefinitions::ExcludeEmptys.getString(ExcludeEmpty::DEFAULTS));370}371case SUMO_ATTR_WITH_INTERNAL:372return (canParse<bool>(value));373case SUMO_ATTR_MAX_TRAVELTIME:374if (value.empty()) {375return true;376} else {377return (canParse<double>(value) && (parse<double>(value) >= 0));378}379case SUMO_ATTR_MIN_SAMPLES:380return (canParse<double>(value) && (parse<double>(value) >= 0));381case SUMO_ATTR_HALTING_SPEED_THRESHOLD:382return (canParse<double>(value) && (parse<double>(value) >= 0));383case SUMO_ATTR_VTYPES:384return true;385case SUMO_ATTR_TRACK_VEHICLES:386return (canParse<bool>(value));387case SUMO_ATTR_DETECT_PERSONS:388if (value.empty()) {389return true;390} else {391return SUMOXMLDefinitions::PersonModeValues.hasString(value);392}393case SUMO_ATTR_WRITE_ATTRIBUTES:394return canParse<std::vector<SumoXMLAttr> >(value);395case SUMO_ATTR_EDGES:396return canParse<std::vector<GNEEdge*> >(myNet, value, false);397case SUMO_ATTR_EDGESFILE:398return SUMOXMLDefinitions::isValidFilename(value);399case SUMO_ATTR_AGGREGATE:400return (canParse<bool>(value));401default:402return isCommonAttributeValid(key, value);403}404}405406407std::string408GNEMeanData::getPopUpID() const {409return getTagStr();410}411412413std::string414GNEMeanData::getHierarchyName() const {415return getTagStr();416}417418419void420GNEMeanData::setAttribute(SumoXMLAttr key, const std::string& value) {421switch (key) {422case SUMO_ATTR_ID:423myNet->getAttributeCarriers()->updateMeanDataID(this, value);424myID = value;425break;426case SUMO_ATTR_FILE:427if (value.empty()) {428myFile = (myID + ".xml");429} else {430myFile = value;431}432break;433case SUMO_ATTR_TYPE:434myType = value;435break;436case SUMO_ATTR_PERIOD:437if (value.empty()) {438myPeriod = myTagProperty->getDefaultTimeValue(key);439} else {440myPeriod = string2time(value);441}442break;443case SUMO_ATTR_BEGIN:444if (value.empty()) {445myBegin = myTagProperty->getDefaultTimeValue(key);446} else {447myBegin = string2time(value);448}449break;450case SUMO_ATTR_END:451if (value.empty()) {452myEnd = myTagProperty->getDefaultTimeValue(key);453} else {454myEnd = string2time(value);455}456break;457case SUMO_ATTR_EXCLUDE_EMPTY:458if (value == SUMOXMLDefinitions::ExcludeEmptys.getString(ExcludeEmpty::DEFAULTS)) {459myExcludeEmpty = value;460} else if (parse<bool>(value)) {461myExcludeEmpty = SUMOXMLDefinitions::ExcludeEmptys.getString(ExcludeEmpty::TRUES);462} else {463myExcludeEmpty = SUMOXMLDefinitions::ExcludeEmptys.getString(ExcludeEmpty::FALSES);464}465break;466case SUMO_ATTR_WITH_INTERNAL:467myWithInternal = parse<bool>(value);468break;469case SUMO_ATTR_MAX_TRAVELTIME:470if (value.empty()) {471myMaxTravelTime = myTagProperty->getDefaultDoubleValue(key);472} else {473myMaxTravelTime = parse<double>(value);474}475break;476case SUMO_ATTR_MIN_SAMPLES:477if (value.empty()) {478myMinSamples = myTagProperty->getDefaultDoubleValue(key);479} else {480myMinSamples = parse<double>(value);481}482break;483case SUMO_ATTR_HALTING_SPEED_THRESHOLD:484if (value.empty()) {485mySpeedThreshold = myTagProperty->getDefaultDoubleValue(key);486} else {487mySpeedThreshold = parse<double>(value);488}489break;490case SUMO_ATTR_VTYPES:491myVTypes = parse<std::vector<std::string> >(value);492break;493case SUMO_ATTR_TRACK_VEHICLES:494myTrackVehicles = parse<bool>(value);495break;496case SUMO_ATTR_DETECT_PERSONS:497myDetectPersons.clear();498if (value.empty()) {499myDetectPersons.push_back(SUMOXMLDefinitions::PersonModeValues.getString(PersonMode::NONE));500} else {501myDetectPersons = parse<std::vector<std::string> >(value);502}503break;504case SUMO_ATTR_WRITE_ATTRIBUTES:505myWrittenAttributes = parse<std::vector<SumoXMLAttr> >(value);506break;507case SUMO_ATTR_EDGES:508myEdges = parse<std::vector<std::string> >(value);509break;510case SUMO_ATTR_EDGESFILE:511myEdgeFile = value;512break;513case SUMO_ATTR_AGGREGATE:514myAggregate = parse<bool>(value);515break;516default:517setCommonAttribute(key, value);518break;519}520}521522/****************************************************************************/523524525