Path: blob/main/src/netedit/elements/data/GNEGenericData.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 GNEGenericData.cpp14/// @author Pablo Alvarez Lopez15/// @date Jan 202016///17// A abstract class for generic datas18/****************************************************************************/1920#include <netedit/GNENet.h>21#include <netedit/GNETagPropertiesDatabase.h>22#include <netedit/GNEViewParent.h>23#include <netedit/frames/common/GNESelectorFrame.h>24#include <netedit/frames/data/GNEEdgeDataFrame.h>25#include <utils/gui/div/GLHelper.h>26#include <utils/gui/div/GUIDesigns.h>27#include <utils/gui/div/GUIParameterTableWindow.h>28#include <utils/gui/globjects/GUIGLObjectPopupMenu.h>2930#include "GNEDataInterval.h"31#include "GNEGenericData.h"3233// ===========================================================================34// member method definitions35// ===========================================================================3637GNEGenericData::GNEGenericData(SumoXMLTag tag, GNENet* net) :38GNEAttributeCarrier(tag, net, "", true),39GUIGlObject(net->getTagPropertiesDatabase()->getTagProperty(tag, true)->getGLType(), "",40GUIIconSubSys::getIcon(net->getTagPropertiesDatabase()->getTagProperty(tag, true)->getGUIIcon())),41GNEPathElement(GNEPathElement::Options::DATA_ELEMENT),42myDataIntervalParent(nullptr) {43}444546GNEGenericData::GNEGenericData(const SumoXMLTag tag, GNEDataInterval* dataIntervalParent, const Parameterised::Map& parameters) :47GNEAttributeCarrier(tag, dataIntervalParent->getNet(), dataIntervalParent->getFilename(), false),48GUIGlObject(dataIntervalParent->getNet()->getTagPropertiesDatabase()->getTagProperty(tag, true)->getGLType(), dataIntervalParent->getID(),49GUIIconSubSys::getIcon(dataIntervalParent->getNet()->getTagPropertiesDatabase()->getTagProperty(tag, true)->getGUIIcon())),50GNEPathElement(GNEPathElement::Options::DATA_ELEMENT),51Parameterised(parameters),52myDataIntervalParent(dataIntervalParent) {53}545556GNEGenericData::~GNEGenericData() {}575859GNEHierarchicalElement*60GNEGenericData::getHierarchicalElement() {61return this;62}636465GUIGlObject*66GNEGenericData::getGUIGlObject() {67return this;68}697071const GUIGlObject*72GNEGenericData::getGUIGlObject() const {73return this;74}757677GNEDataInterval*78GNEGenericData::getDataIntervalParent() const {79return myDataIntervalParent;80}818283void84GNEGenericData::drawAttribute(const PositionVector& shape) const {85if ((myTagProperty->getTag() == GNE_TAG_EDGEREL_SINGLE) && (shape.length() > 0)) {86// obtain pointer to edge data frame (only for code legibly)87const GNEEdgeDataFrame* edgeDataFrame = myDataIntervalParent->getNet()->getViewNet()->getViewParent()->getEdgeDataFrame();88// check if we have to filter generic data89if (edgeDataFrame->shown()) {90// check attribute91if ((edgeDataFrame->getAttributeSelector()->getFilteredAttribute().size() > 0) &&92(getParametersMap().count(edgeDataFrame->getAttributeSelector()->getFilteredAttribute()) > 0)) {93// get value94const std::string value = getParametersMap().at(edgeDataFrame->getAttributeSelector()->getFilteredAttribute());95// calculate center position96const Position centerPosition = shape.positionAtOffset2D(shape.length2D() / 2);97// Add a draw matrix98GLHelper::pushMatrix();99GLHelper::drawText(value, centerPosition, GLO_MAX, 2, RGBColor::BLUE);100// pop draw matrix101GLHelper::popMatrix();102}103}104}105}106107108bool109GNEGenericData::checkDrawFromContour() const {110return false;111}112113114bool115GNEGenericData::checkDrawToContour() const {116return false;117}118119120bool121GNEGenericData::checkDrawRelatedContour() const {122// check opened popup123if (myNet->getViewNet()->getPopup()) {124return myNet->getViewNet()->getPopup()->getGLObject() == this;125}126return false;127}128129130bool131GNEGenericData::checkDrawOverContour() const {132return false;133}134135136bool137GNEGenericData::checkDrawDeleteContour() const {138// get edit modes139const auto& editModes = myNet->getViewNet()->getEditModes();140// check if we're in delete mode141if (editModes.isCurrentSupermodeData() && (editModes.dataEditMode == DataEditMode::DATA_DELETE)) {142return myNet->getViewNet()->checkOverLockedElement(this, mySelected);143} else {144return false;145}146}147148149bool150GNEGenericData::checkDrawDeleteContourSmall() const {151return false;152}153154155bool156GNEGenericData::checkDrawSelectContour() const {157// get edit modes158const auto& editModes = myNet->getViewNet()->getEditModes();159// check if we're in select mode160if (editModes.isCurrentSupermodeData() && (editModes.dataEditMode == DataEditMode::DATA_SELECT)) {161return myNet->getViewNet()->checkOverLockedElement(this, mySelected);162} else {163return false;164}165}166167168bool169GNEGenericData::checkDrawMoveContour() const {170return false;171}172173174bool175GNEGenericData::isGenericDataValid() const {176return true;177}178179180std::string181GNEGenericData::getGenericDataProblem() const {182return "";183}184185186void187GNEGenericData::fixGenericDataProblem() {188throw InvalidArgument(getTagStr() + " cannot fix any problem");189}190191192GUIGLObjectPopupMenu*193GNEGenericData::getPopUpMenu(GUIMainWindow& app, GUISUMOAbstractView& parent) {194// create popup195GUIGLObjectPopupMenu* ret = new GUIGLObjectPopupMenu(app, parent, this);196// build common options197buildPopUpMenuCommonOptions(ret, app, myNet->getViewNet(), myTagProperty->getTag(), mySelected);198// show option to open additional dialog199if (myTagProperty->hasDialog()) {200GUIDesigns::buildFXMenuCommand(ret, (TLF("Open % Dialog", getTagStr())).c_str(), getACIcon(), &parent, MID_OPEN_ADDITIONAL_DIALOG);201new FXMenuSeparator(ret);202} else {203GUIDesigns::buildFXMenuCommand(ret, (TL("Cursor position in view: ") + toString(getPositionInView().x()) + "," + toString(getPositionInView().y())).c_str(), nullptr, nullptr, 0);204}205return ret;206}207208209GUIParameterTableWindow*210GNEGenericData::getParameterWindow(GUIMainWindow& app, GUISUMOAbstractView& /* parent */) {211// Create table212GUIParameterTableWindow* ret = new GUIParameterTableWindow(app, *this);213// Iterate over attributes214for (const auto& tagProperty : myTagProperty->getAttributeProperties()) {215// Add attribute and set it dynamic if aren't unique216if (tagProperty->isUnique()) {217ret->mkItem(tagProperty->getAttrStr().c_str(), false, getAttribute(tagProperty->getAttr()));218} else {219ret->mkItem(tagProperty->getAttrStr().c_str(), true, getAttribute(tagProperty->getAttr()));220}221}222// close building223ret->closeBuilding();224return ret;225}226227228void229GNEGenericData::deleteGLObject() {230myNet->deleteGenericData(this, myNet->getViewNet()->getUndoList());231}232233234void235GNEGenericData::selectGLObject() {236if (isAttributeCarrierSelected()) {237unselectAttributeCarrier();238} else {239selectAttributeCarrier();240}241// update information label242myNet->getViewNet()->getViewParent()->getSelectorFrame()->getSelectionInformation()->updateInformationLabel();243}244245246void247GNEGenericData::updateGLObject() {248updateGeometry();249}250251252bool253GNEGenericData::isPathElementSelected() const {254return mySelected;255}256257258const Parameterised::Map&259GNEGenericData::getACParametersMap() const {260return getParametersMap();261}262263// ---------------------------------------------------------------------------264// GNEGenericData - protected methods265// ---------------------------------------------------------------------------266267void268GNEGenericData::drawFilteredAttribute(const GUIVisualizationSettings& s, const PositionVector& laneShape, const std::string& attribute, const GNEDataInterval* dataIntervalParent) const {269if ((myDataIntervalParent == dataIntervalParent) && (getParametersMap().count(attribute) > 0)) {270const Position pos = laneShape.positionAtOffset2D(laneShape.length2D() * 0.5);271const double rot = laneShape.rotationDegreeAtOffset(laneShape.length2D() * 0.5);272// Add a draw matrix for details273GLHelper::pushMatrix();274// draw value275GLHelper::drawText(getParameter(attribute), pos, GLO_MAX - 1, 2, RGBColor::BLACK, s.getTextAngle(rot + 90));276// pop draw matrix277GLHelper::popMatrix();278}279}280281282bool283GNEGenericData::isVisibleInspectDeleteSelect() const {284// get toolbar285const GNEViewNetHelper::IntervalBar& toolBar = myNet->getViewNet()->getIntervalBar();286// declare flag287bool draw = true;288// check filter by generic data type289if ((toolBar.getGenericDataType() != SUMO_TAG_NOTHING) && (toolBar.getGenericDataType() != myTagProperty->getTag())) {290draw = false;291}292// check filter by data set293if (toolBar.getDataSet() && (toolBar.getDataSet() != myDataIntervalParent->getDataSetParent())) {294draw = false;295}296// check filter by begin297if ((toolBar.getBegin() != INVALID_DOUBLE) && (toolBar.getBegin() > myDataIntervalParent->getAttributeDouble(SUMO_ATTR_BEGIN))) {298draw = false;299}300// check filter by end301if ((toolBar.getEnd() != INVALID_DOUBLE) && (toolBar.getEnd() < myDataIntervalParent->getAttributeDouble(SUMO_ATTR_END))) {302draw = false;303}304// check filter by attribute305if ((toolBar.getParameter().size() > 0) && (getParametersMap().count(toolBar.getParameter()) == 0)) {306draw = false;307}308// return flag309return draw;310}311312void313GNEGenericData::replaceFirstParentEdge(const std::string& value) {314auto newEdge = myNet->getAttributeCarriers()->retrieveEdge(value);315GNEHierarchicalElement::updateParent(this, 0, newEdge);316}317318319void320GNEGenericData::replaceLastParentEdge(const std::string& value) {321auto newEdge = myNet->getAttributeCarriers()->retrieveEdge(value);322GNEHierarchicalElement::updateParent(this, (int)getParentEdges().size() - 1, newEdge);323}324325326void327GNEGenericData::replaceParentTAZElement(const int index, const std::string& value) {328std::vector<GNEAdditional*> newTAZs = getParentAdditionals();329auto TAZ = myNet->getAttributeCarriers()->retrieveAdditional(SUMO_TAG_TAZ, value);330// continue depending of index and number of TAZs331if (index == 0) {332if (newTAZs.size() == 2) {333if (newTAZs.at(1)->getID() == value) {334newTAZs = {TAZ};335} else {336newTAZs[0] = TAZ;337}338} else if (newTAZs.at(0) != TAZ) {339newTAZs = {TAZ, newTAZs.at(0)};340}341} else if (index == 1) {342if (newTAZs.size() == 2) {343if (newTAZs.at(0)->getID() == value) {344newTAZs = {TAZ};345} else {346newTAZs[1] = TAZ;347}348} else if (newTAZs.at(0) != TAZ) {349newTAZs = {newTAZs.at(0), TAZ};350}351} else {352throw ProcessError(TL("Invalid index"));353}354GNEHierarchicalElement::updateParents(this, newTAZs);355}356357358std::string359GNEGenericData::getPartialID() const {360return getDataIntervalParent()->getDataSetParent()->getID() + "[" +361getDataIntervalParent()->getAttribute(SUMO_ATTR_BEGIN) + "," +362getDataIntervalParent()->getAttribute(SUMO_ATTR_END) + "]:";363}364365/****************************************************************************/366367368