Path: blob/main/src/netedit/elements/data/GNEDataInterval.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 GNEDataInterval.cpp14/// @author Pablo Alvarez Lopez15/// @date Jan 202016///17// A abstract class for data sets18/****************************************************************************/1920#include <netedit/GNENet.h>21#include <netedit/GNETagProperties.h>22#include <netedit/GNEViewParent.h>23#include <netedit/changes/GNEChange_Attribute.h>24#include <netedit/frames/GNEElementTree.h>25#include <netedit/frames/common/GNEInspectorFrame.h>2627#include "GNEDataInterval.h"2829// ===========================================================================30// member method definitions31// ===========================================================================3233GNEDataInterval::GNEDataInterval(GNEDataSet* dataSetParent, const double begin, const double end) :34GNEAttributeCarrier(SUMO_TAG_DATAINTERVAL, dataSetParent->getNet(), dataSetParent->getFilename(), false),35myDataSetParent(dataSetParent),36myBegin(begin),37myEnd(end) {38}394041GNEDataInterval::~GNEDataInterval() {}424344GNEHierarchicalElement*45GNEDataInterval::getHierarchicalElement() {46return this;47}484950void51GNEDataInterval::updateGenericDataIDs() {52if (myNet->isUpdateDataEnabled()) {53// iterate over generic data childrens54for (const auto& genericData : myGenericDataChildren) {55if (genericData->getTagProperty()->getTag() == GNE_TAG_EDGEREL_SINGLE) {56// {dataset}[{begin}m{end}]{edge}57genericData->setMicrosimID(myDataSetParent->getID() + "[" + toString(myBegin) + "," + toString(myEnd) + "]" +58genericData->getParentEdges().front()->getID());59} else if (genericData->getTagProperty()->getTag() == SUMO_TAG_EDGEREL) {60// {dataset}[{begin}m{end}]{from}->{to}61genericData->setMicrosimID(myDataSetParent->getID() + "[" + toString(myBegin) + "," + toString(myEnd) + "]" +62genericData->getParentEdges().front()->getID() + "->" + genericData->getParentEdges().back()->getID());63}64}65}66}676869void70GNEDataInterval::updateAttributeColors() {71if (myNet->isUpdateDataEnabled()) {72// first clear both container73myAllAttributeColors.clear();74mySpecificAttributeColors.clear();75// iterate over generic data children76for (const auto& genericData : myGenericDataChildren) {77for (const auto& param : genericData->getParametersMap()) {78// check if value can be parsed79if (canParse<double>(param.second)) {80// parse param value81const double value = parse<double>(param.second);82// update values in both containers83myAllAttributeColors.updateValues(param.first, value);84mySpecificAttributeColors[genericData->getTagProperty()->getTag()].updateValues(param.first, value);85}86}87}88}89}909192const GNEDataSet::AttributeColors&93GNEDataInterval::getAllAttributeColors() const {94return myAllAttributeColors;95}969798const std::map<SumoXMLTag, GNEDataSet::AttributeColors>&99GNEDataInterval::getSpecificAttributeColors() const {100return mySpecificAttributeColors;101}102103104GUIGlObject*105GNEDataInterval::getGUIGlObject() {106return nullptr;107}108109110const GUIGlObject*111GNEDataInterval::getGUIGlObject() const {112return nullptr;113}114115116void117GNEDataInterval::updateGeometry() {118// nothing to update119}120121122Position123GNEDataInterval::getPositionInView() const {124return Position();125}126127128bool129GNEDataInterval::checkDrawFromContour() const {130return false;131}132133134bool135GNEDataInterval::checkDrawToContour() const {136return false;137}138139140bool141GNEDataInterval::checkDrawRelatedContour() const {142return false;143}144145146bool147GNEDataInterval::checkDrawOverContour() const {148return false;149}150151152bool153GNEDataInterval::checkDrawDeleteContour() const {154return false;155}156157158bool159GNEDataInterval::checkDrawDeleteContourSmall() const {160return false;161}162163164bool165GNEDataInterval::checkDrawSelectContour() const {166return false;167}168169170bool171GNEDataInterval::checkDrawMoveContour() const {172return false;173}174175176bool177GNEDataInterval::isDataIntervalValid() const {178return true;179}180181182std::string183GNEDataInterval::getDataIntervalProblem() const {184return "";185}186187188void189GNEDataInterval::fixDataIntervalProblem() {190throw InvalidArgument(getTagStr() + " cannot fix any problem");191}192193194GNEDataSet*195GNEDataInterval::getDataSetParent() const {196return myDataSetParent;197}198199200void201GNEDataInterval::addGenericDataChild(GNEGenericData* genericData) {202// check that GenericData wasn't previously inserted203if (!hasGenericDataChild(genericData)) {204myGenericDataChildren.push_back(genericData);205// update generic data IDs206updateGenericDataIDs();207// check if add to boundary208if (genericData->getTagProperty()->isPlacedInRTree()) {209myNet->addGLObjectIntoGrid(genericData);210}211// update geometry after insertion if myUpdateGeometryEnabled is enabled212if (myNet->isUpdateGeometryEnabled()) {213// update generic data RTREE214genericData->updateGeometry();215}216// add reference in attributeCarriers217myNet->getAttributeCarriers()->insertGenericData(genericData);218// update colors219genericData->getDataIntervalParent()->getDataSetParent()->updateAttributeColors();220} else {221throw ProcessError(TL("GenericData was already inserted"));222}223}224225226void227GNEDataInterval::removeGenericDataChild(GNEGenericData* genericData) {228auto it = std::find(myGenericDataChildren.begin(), myGenericDataChildren.end(), genericData);229// check that GenericData was previously inserted230if (it != myGenericDataChildren.end()) {231// remove generic data child232myGenericDataChildren.erase(it);233// remove it from inspected ACs and GNEElementTree234myDataSetParent->getNet()->getViewNet()->getInspectedElements().uninspectAC(genericData);235myDataSetParent->getNet()->getViewNet()->getViewParent()->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(genericData);236// update colors237genericData->getDataIntervalParent()->getDataSetParent()->updateAttributeColors();238// delete path element239myNet->getDataPathManager()->removePath(genericData);240// check if remove from RTREE241if (genericData->getTagProperty()->isPlacedInRTree()) {242myNet->removeGLObjectFromGrid(genericData);243}244// remove reference from attributeCarriers245myNet->getAttributeCarriers()->deleteGenericData(genericData);246} else {247throw ProcessError(TL("GenericData wasn't previously inserted"));248}249}250251252bool253GNEDataInterval::hasGenericDataChild(GNEGenericData* genericData) const {254return std::find(myGenericDataChildren.begin(), myGenericDataChildren.end(), genericData) != myGenericDataChildren.end();255}256257258const std::vector<GNEGenericData*>&259GNEDataInterval::getGenericDataChildren() const {260return myGenericDataChildren;261}262263264bool265GNEDataInterval::edgeRelSingleExists(const GNEEdge* edge) const {266// interate over all edgeRels and check edge parents267for (const auto& genericData : myGenericDataChildren) {268if ((genericData->getTagProperty()->getTag() == GNE_TAG_EDGEREL_SINGLE) &&269(genericData->getParentEdges().front() == edge)) {270return true;271}272}273return false;274}275276277bool278GNEDataInterval::edgeRelExists(const GNEEdge* fromEdge, const GNEEdge* toEdge) const {279// interate over all edgeRels and check edge parents280for (const auto& genericData : myGenericDataChildren) {281if ((genericData->getTagProperty()->getTag() == SUMO_TAG_EDGEREL) &&282(genericData->getParentEdges().front() == fromEdge) &&283(genericData->getParentEdges().back() == toEdge)) {284return true;285}286}287return false;288}289290291bool292GNEDataInterval::TAZRelExists(const GNEAdditional* TAZ) const {293// interate over all TAZRels and check TAZ parents294for (const auto& genericData : myGenericDataChildren) {295if ((genericData->getTagProperty()->getTag() == SUMO_TAG_TAZREL) &&296(genericData->getParentAdditionals().size() == 1) &&297(genericData->getParentAdditionals().front() == TAZ)) {298return true;299}300}301return false;302}303304305bool306GNEDataInterval::TAZRelExists(const GNEAdditional* fromTAZ, const GNEAdditional* toTAZ) const {307// interate over all TAZRels and check TAZ parents308for (const auto& genericData : myGenericDataChildren) {309if ((genericData->getTagProperty()->getTag() == SUMO_TAG_TAZREL) &&310(genericData->getParentAdditionals().size() == 2) &&311(genericData->getParentAdditionals().front() == fromTAZ) &&312(genericData->getParentAdditionals().back() == toTAZ)) {313return true;314}315}316return false;317}318319320std::string321GNEDataInterval::getAttribute(SumoXMLAttr key) const {322switch (key) {323case SUMO_ATTR_ID:324return myDataSetParent->getAttribute(SUMO_ATTR_ID);325case SUMO_ATTR_BEGIN:326return toString(myBegin);327case SUMO_ATTR_END:328return toString(myEnd);329default:330return getCommonAttribute(this, key);331}332}333334335double336GNEDataInterval::getAttributeDouble(SumoXMLAttr key) const {337switch (key) {338case SUMO_ATTR_BEGIN:339return myBegin;340case SUMO_ATTR_END:341return myEnd;342default:343throw InvalidArgument(getTagStr() + " doesn't have a double attribute of type '" + toString(key) + "'");344}345}346347348void349GNEDataInterval::setAttribute(SumoXMLAttr key, const std::string& value, GNEUndoList* undoList) {350switch (key) {351case SUMO_ATTR_BEGIN:352case SUMO_ATTR_END:353GNEChange_Attribute::changeAttribute(this, key, value, undoList);354break;355default:356setCommonAttribute(key, value, undoList);357break;358}359}360361362bool363GNEDataInterval::isValid(SumoXMLAttr key, const std::string& value) {364switch (key) {365case SUMO_ATTR_BEGIN:366return canParse<double>(value);367case SUMO_ATTR_END:368return canParse<double>(value);369default:370return isCommonValid(key, value);371}372}373374375bool376GNEDataInterval::isAttributeEnabled(SumoXMLAttr key) const {377switch (key) {378case SUMO_ATTR_ID:379return false;380default:381return true;382}383}384385386std::string387GNEDataInterval::getPopUpID() const {388return getTagStr();389}390391392std::string393GNEDataInterval::getHierarchyName() const {394return "interval: " + getAttribute(SUMO_ATTR_BEGIN) + " -> " + getAttribute(SUMO_ATTR_END);395}396397398const Parameterised::Map&399GNEDataInterval::getACParametersMap() const {400return getParametersMap();401}402403404void405GNEDataInterval::setAttribute(SumoXMLAttr key, const std::string& value) {406switch (key) {407case SUMO_ATTR_BEGIN:408myBegin = parse<double>(value);409// update Generic Data IDs410updateGenericDataIDs();411break;412case SUMO_ATTR_END:413myEnd = parse<double>(value);414// update Generic Data IDs415updateGenericDataIDs();416break;417default:418setCommonAttribute(this, key, value);419break;420}421// mark interval toolbar for update422myNet->getViewNet()->getIntervalBar().markForUpdate();423}424425/****************************************************************************/426427428