Path: blob/main/src/netedit/elements/data/GNEDataInterval.cpp
193867 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 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->getFileBucket()),35myDataSetParent(dataSetParent),36myBegin(begin),37myEnd(end) {38}394041GNEDataInterval::~GNEDataInterval() {}424344GNEHierarchicalElement*45GNEDataInterval::getHierarchicalElement() {46return this;47}484950GNEMoveElement*51GNEDataInterval::getMoveElement() const {52return nullptr;53}545556Parameterised*57GNEDataInterval::getParameters() {58return nullptr;59}606162const Parameterised*63GNEDataInterval::getParameters() const {64return nullptr;65}666768GUIGlObject*69GNEDataInterval::getGUIGlObject() {70return nullptr;71}727374const GUIGlObject*75GNEDataInterval::getGUIGlObject() const {76return nullptr;77}787980void81GNEDataInterval::updateGenericDataIDs() {82if (myNet->isUpdateDataEnabled()) {83// iterate over generic data childrens84for (const auto& genericData : myGenericDataChildren) {85if (genericData->getTagProperty()->getTag() == GNE_TAG_EDGEREL_SINGLE) {86// {dataset}[{begin}m{end}]{edge}87genericData->setMicrosimID(myDataSetParent->getID() + "[" + toString(myBegin) + "," + toString(myEnd) + "]" +88genericData->getParentEdges().front()->getID());89} else if (genericData->getTagProperty()->getTag() == SUMO_TAG_EDGEREL) {90// {dataset}[{begin}m{end}]{from}->{to}91genericData->setMicrosimID(myDataSetParent->getID() + "[" + toString(myBegin) + "," + toString(myEnd) + "]" +92genericData->getParentEdges().front()->getID() + "->" + genericData->getParentEdges().back()->getID());93}94}95}96}979899void100GNEDataInterval::updateAttributeColors() {101if (myNet->isUpdateDataEnabled()) {102// first clear both container103myAllAttributeColors.clear();104mySpecificAttributeColors.clear();105// iterate over generic data children106for (const auto& genericData : myGenericDataChildren) {107for (const auto& param : genericData->getParametersMap()) {108// check if value can be parsed109if (canParse<double>(param.second)) {110// parse param value111const double value = parse<double>(param.second);112// update values in both containers113myAllAttributeColors.updateValues(param.first, value);114mySpecificAttributeColors[genericData->getTagProperty()->getTag()].updateValues(param.first, value);115}116}117}118}119}120121122const GNEDataSet::AttributeColors&123GNEDataInterval::getAllAttributeColors() const {124return myAllAttributeColors;125}126127128const std::map<SumoXMLTag, GNEDataSet::AttributeColors>&129GNEDataInterval::getSpecificAttributeColors() const {130return mySpecificAttributeColors;131}132133134void135GNEDataInterval::updateGeometry() {136// nothing to update137}138139140Position141GNEDataInterval::getPositionInView() const {142return Position();143}144145146bool147GNEDataInterval::checkDrawFromContour() const {148return false;149}150151152bool153GNEDataInterval::checkDrawToContour() const {154return false;155}156157158bool159GNEDataInterval::checkDrawRelatedContour() const {160return false;161}162163164bool165GNEDataInterval::checkDrawOverContour() const {166return false;167}168169170bool171GNEDataInterval::checkDrawDeleteContour() const {172return false;173}174175176bool177GNEDataInterval::checkDrawDeleteContourSmall() const {178return false;179}180181182bool183GNEDataInterval::checkDrawSelectContour() const {184return false;185}186187188bool189GNEDataInterval::checkDrawMoveContour() const {190return false;191}192193194FileBucket*195GNEDataInterval::getFileBucket() const {196if (isTemplate()) {197return nullptr;198} else {199return myDataSetParent->getFileBucket();200}201}202203204bool205GNEDataInterval::isDataIntervalValid() const {206return true;207}208209210std::string211GNEDataInterval::getDataIntervalProblem() const {212return "";213}214215216void217GNEDataInterval::fixDataIntervalProblem() {218throw InvalidArgument(getTagStr() + " cannot fix any problem");219}220221222GNEDataSet*223GNEDataInterval::getDataSetParent() const {224return myDataSetParent;225}226227228void229GNEDataInterval::addGenericDataChild(GNEGenericData* genericData) {230// check that GenericData wasn't previously inserted231if (!hasGenericDataChild(genericData)) {232myGenericDataChildren.push_back(genericData);233// update generic data IDs234updateGenericDataIDs();235// add id RTREE236myNet->addGLObjectIntoGrid(genericData);237// update geometry after insertion if myUpdateGeometryEnabled is enabled238if (myNet->isUpdateGeometryEnabled()) {239// update generic data RTREE240genericData->updateGeometry();241}242// add reference in attributeCarriers243myNet->getAttributeCarriers()->insertGenericData(genericData);244// update colors245genericData->getDataIntervalParent()->getDataSetParent()->updateAttributeColors();246} else {247throw ProcessError(TL("GenericData was already inserted"));248}249}250251252void253GNEDataInterval::removeGenericDataChild(GNEGenericData* genericData) {254auto it = std::find(myGenericDataChildren.begin(), myGenericDataChildren.end(), genericData);255// check that GenericData was previously inserted256if (it != myGenericDataChildren.end()) {257// remove generic data child258myGenericDataChildren.erase(it);259// remove it from inspected ACs and GNEElementTree260myDataSetParent->getNet()->getViewNet()->getInspectedElements().uninspectAC(genericData);261myDataSetParent->getNet()->getViewParent()->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(genericData);262// update colors263genericData->getDataIntervalParent()->getDataSetParent()->updateAttributeColors();264// delete path element265myNet->getDataPathManager()->removePath(genericData);266// add in RTREE267myNet->removeGLObjectFromGrid(genericData);268// remove reference from attributeCarriers269myNet->getAttributeCarriers()->deleteGenericData(genericData);270} else {271throw ProcessError(TL("GenericData wasn't previously inserted"));272}273}274275276bool277GNEDataInterval::hasGenericDataChild(GNEGenericData* genericData) const {278return std::find(myGenericDataChildren.begin(), myGenericDataChildren.end(), genericData) != myGenericDataChildren.end();279}280281282const std::vector<GNEGenericData*>&283GNEDataInterval::getGenericDataChildren() const {284return myGenericDataChildren;285}286287288bool289GNEDataInterval::edgeRelSingleExists(const GNEEdge* edge) const {290// interate over all edgeRels and check edge parents291for (const auto& genericData : myGenericDataChildren) {292if ((genericData->getTagProperty()->getTag() == GNE_TAG_EDGEREL_SINGLE) &&293(genericData->getParentEdges().front() == edge)) {294return true;295}296}297return false;298}299300301bool302GNEDataInterval::edgeRelExists(const GNEEdge* fromEdge, const GNEEdge* toEdge) const {303// interate over all edgeRels and check edge parents304for (const auto& genericData : myGenericDataChildren) {305if ((genericData->getTagProperty()->getTag() == SUMO_TAG_EDGEREL) &&306(genericData->getParentEdges().front() == fromEdge) &&307(genericData->getParentEdges().back() == toEdge)) {308return true;309}310}311return false;312}313314315bool316GNEDataInterval::TAZRelExists(const GNEAdditional* TAZ) const {317// interate over all TAZRels and check TAZ parents318for (const auto& genericData : myGenericDataChildren) {319if ((genericData->getTagProperty()->getTag() == SUMO_TAG_TAZREL) &&320(genericData->getParentAdditionals().size() == 1) &&321(genericData->getParentAdditionals().front() == TAZ)) {322return true;323}324}325return false;326}327328329bool330GNEDataInterval::TAZRelExists(const GNEAdditional* fromTAZ, const GNEAdditional* toTAZ) const {331// interate over all TAZRels and check TAZ parents332for (const auto& genericData : myGenericDataChildren) {333if ((genericData->getTagProperty()->getTag() == SUMO_TAG_TAZREL) &&334(genericData->getParentAdditionals().size() == 2) &&335(genericData->getParentAdditionals().front() == fromTAZ) &&336(genericData->getParentAdditionals().back() == toTAZ)) {337return true;338}339}340return false;341}342343344std::string345GNEDataInterval::getAttribute(SumoXMLAttr key) const {346switch (key) {347case SUMO_ATTR_ID:348return myDataSetParent->getAttribute(SUMO_ATTR_ID);349case SUMO_ATTR_BEGIN:350return toString(myBegin);351case SUMO_ATTR_END:352return toString(myEnd);353default:354return getCommonAttribute(key);355}356}357358359double360GNEDataInterval::getAttributeDouble(SumoXMLAttr key) const {361switch (key) {362case SUMO_ATTR_BEGIN:363return myBegin;364case SUMO_ATTR_END:365return myEnd;366default:367return getCommonAttributeDouble(key);368}369}370371372Position373GNEDataInterval::getAttributePosition(SumoXMLAttr key) const {374return getCommonAttributePosition(key);375}376377378PositionVector379GNEDataInterval::getAttributePositionVector(SumoXMLAttr key) const {380return getCommonAttributePositionVector(key);381}382383384void385GNEDataInterval::setAttribute(SumoXMLAttr key, const std::string& value, GNEUndoList* undoList) {386switch (key) {387case SUMO_ATTR_BEGIN:388case SUMO_ATTR_END:389GNEChange_Attribute::changeAttribute(this, key, value, undoList);390break;391default:392setCommonAttribute(key, value, undoList);393break;394}395}396397398bool399GNEDataInterval::isValid(SumoXMLAttr key, const std::string& value) {400switch (key) {401case SUMO_ATTR_BEGIN:402return canParse<double>(value);403case SUMO_ATTR_END:404return canParse<double>(value);405default:406return isCommonAttributeValid(key, value);407}408}409410411bool412GNEDataInterval::isAttributeEnabled(SumoXMLAttr key) const {413switch (key) {414case SUMO_ATTR_ID:415return false;416default:417return true;418}419}420421422std::string423GNEDataInterval::getPopUpID() const {424return getTagStr();425}426427428std::string429GNEDataInterval::getHierarchyName() const {430return "interval: " + getAttribute(SUMO_ATTR_BEGIN) + " -> " + getAttribute(SUMO_ATTR_END);431}432433434void435GNEDataInterval::setAttribute(SumoXMLAttr key, const std::string& value) {436switch (key) {437case SUMO_ATTR_BEGIN:438myBegin = parse<double>(value);439// update Generic Data IDs440updateGenericDataIDs();441break;442case SUMO_ATTR_END:443myEnd = parse<double>(value);444// update Generic Data IDs445updateGenericDataIDs();446break;447default:448setCommonAttribute(key, value);449break;450}451// mark interval toolbar for update452myNet->getViewNet()->getIntervalBar().markForUpdate();453}454455/****************************************************************************/456457458