Path: blob/main/src/netedit/elements/additional/GNECalibratorFlow.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 GNECalibratorFlow.cpp14/// @author Pablo Alvarez Lopez15/// @date March 201616///17//18/****************************************************************************/19#include <config.h>2021#include <netedit/GNENet.h>22#include <netedit/GNETagProperties.h>23#include <netedit/GNEViewNet.h>24#include <netedit/GNEUndoList.h>25#include <netedit/changes/GNEChange_Attribute.h>26#include <utils/options/OptionsCont.h>27#include <utils/gui/globjects/GLIncludes.h>28#include <utils/gui/div/GLHelper.h>29#include <utils/common/StringTokenizer.h>30#include <utils/xml/NamespaceIDs.h>3132#include "GNECalibratorFlow.h"3334// ===========================================================================35// member method definitions36// ===========================================================================3738GNECalibratorFlow::GNECalibratorFlow(GNENet* net) :39GNEAdditional("", net, "", GNE_TAG_CALIBRATOR_FLOW, "") {40// set VPH and speed enabled41toggleAttribute(SUMO_ATTR_VEHSPERHOUR, true);42toggleAttribute(SUMO_ATTR_SPEED, true);43// reset ID44id.clear();45}464748GNECalibratorFlow::GNECalibratorFlow(GNEAdditional* calibratorParent, GNEDemandElement* vehicleType, GNEDemandElement* route) :49GNEAdditional(calibratorParent, GNE_TAG_CALIBRATOR_FLOW, "") {50// set parents51setParent<GNEAdditional*>(calibratorParent);52setParents<GNEDemandElement*>({vehicleType, route});53// update centering boundary without updating grid54updateCenteringBoundary(false);55// reset ID56id.clear();57}585960GNECalibratorFlow::GNECalibratorFlow(GNEAdditional* calibratorParent, GNEDemandElement* vehicleType, GNEDemandElement* route,61const SUMOVehicleParameter& vehicleParameters) :62GNEAdditional(calibratorParent, GNE_TAG_CALIBRATOR_FLOW, ""),63SUMOVehicleParameter(vehicleParameters) {64// set parents65setParent<GNEAdditional*>(calibratorParent);66setParents<GNEDemandElement*>({vehicleType, route});67// update centering boundary without updating grid68updateCenteringBoundary(false);69// reset ID70id.clear();71}727374GNECalibratorFlow::~GNECalibratorFlow() {}757677void78GNECalibratorFlow::writeAdditional(OutputDevice& device) const {79if (isAttributeEnabled(SUMO_ATTR_TYPE) || isAttributeEnabled(SUMO_ATTR_VEHSPERHOUR) || isAttributeEnabled(SUMO_ATTR_SPEED)) {80// open tag81device.openTag(SUMO_TAG_FLOW);82// write vehicle attributes83write(device, OptionsCont::getOptions(), SUMO_TAG_FLOW, getParentDemandElements().at(0)->getID());84// write end85device.writeAttr(SUMO_ATTR_END, getAttribute(SUMO_ATTR_END));86// write route87device.writeAttr(SUMO_ATTR_ROUTE, getParentDemandElements().at(1)->getID());88// VPH89if (isAttributeEnabled(SUMO_ATTR_VEHSPERHOUR)) {90device.writeAttr(SUMO_ATTR_VEHSPERHOUR, getAttribute(SUMO_ATTR_VEHSPERHOUR));91}92// write parameters93SUMOVehicleParameter::writeParams(device);94// close vehicle tag95device.closeTag();96} else {97WRITE_WARNING(TLF("calibratorFlow of calibrator '%' cannot be written. Either type or vehsPerHour or speed must be enabled", getParentAdditionals().front()->getID()));98}99}100101102bool103GNECalibratorFlow::isAdditionalValid() const {104return true;105}106107108std::string109GNECalibratorFlow::getAdditionalProblem() const {110return "";111}112113114void115GNECalibratorFlow::fixAdditionalProblem() {116// nothing to fix117}118119120bool121GNECalibratorFlow::checkDrawMoveContour() const {122return false;123}124125126GNEMoveOperation*127GNECalibratorFlow::getMoveOperation() {128// calibrators flow cannot be moved129return nullptr;130}131132133void134GNECalibratorFlow::updateGeometry() {135// update centering boundary (needed for centering)136updateCenteringBoundary(false);137}138139140Position141GNECalibratorFlow::getPositionInView() const {142// get rerouter parent position143Position signPosition = getParentAdditionals().front()->getPositionInView();144// set position depending of indexes145signPosition.add(4.5, (getDrawPositionIndex() * -1) + 1, 0);146// return signPosition147return signPosition;148}149150151void152GNECalibratorFlow::updateCenteringBoundary(const bool /*updateGrid*/) {153// nothing to update154}155156157void158GNECalibratorFlow::splitEdgeGeometry(const double /*splitPosition*/, const GNENetworkElement* /*originalElement*/, const GNENetworkElement* /*newElement*/, GNEUndoList* /*undoList*/) {159// geometry of this element cannot be splitted160}161162163std::string164GNECalibratorFlow::getParentName() const {165return getParentAdditionals().at(0)->getID();166}167168169void170GNECalibratorFlow::drawGL(const GUIVisualizationSettings& s) const {171if (myNet->getViewNet()->getDataViewOptions().showAdditionals()) {172// push rotation matrix173GLHelper::pushMatrix();174// move to parent additional position175glTranslated(getParentAdditionals().front()->getPositionInView().x(), getParentAdditionals().front()->getPositionInView().y(), 0);176// rotate177glRotated((-1 * getParentAdditionals().front()->getAdditionalGeometry().getShapeRotations().front()) + 180, 0, 0, 1);178// draw rerouter interval as listed attribute179drawListedAdditional(s, Position(0, 0), 0.05, 1, s.additionalSettings.calibratorColor, RGBColor::BLACK, GUITexture::VARIABLESPEEDSIGN_STEP, "Flow: " + getID());180// pop rotation matrix181GLHelper::popMatrix();182}183}184185186std::string187GNECalibratorFlow::getAttribute(SumoXMLAttr key) const {188switch (key) {189case SUMO_ATTR_ID:190return getMicrosimID();191case SUMO_ATTR_TYPE:192return vtypeid;193case SUMO_ATTR_ROUTE:194return getParentDemandElements().at(1)->getID();195case SUMO_ATTR_VEHSPERHOUR:196if (parametersSet & VEHPARS_VPH_SET) {197return toString(3600 / STEPS2TIME(repetitionOffset));198} else {199return "";200}201case SUMO_ATTR_SPEED:202if (parametersSet & VEHPARS_CALIBRATORSPEED_SET) {203return toString(calibratorSpeed);204} else {205return "";206}207case SUMO_ATTR_COLOR:208if (wasSet(VEHPARS_COLOR_SET)) {209return toString(color);210} else {211return myTagProperty->getDefaultStringValue(SUMO_ATTR_COLOR);212}213case SUMO_ATTR_BEGIN:214return time2string(depart);215case SUMO_ATTR_END:216return time2string(repetitionEnd);217case SUMO_ATTR_DEPARTLANE:218if (wasSet(VEHPARS_DEPARTLANE_SET)) {219return getDepartLane();220} else {221return myTagProperty->getDefaultStringValue(SUMO_ATTR_DEPARTLANE);222}223case SUMO_ATTR_DEPARTPOS:224if (wasSet(VEHPARS_DEPARTPOS_SET)) {225return getDepartPos();226} else {227return myTagProperty->getDefaultStringValue(SUMO_ATTR_DEPARTPOS);228}229case SUMO_ATTR_DEPARTSPEED:230if (wasSet(VEHPARS_DEPARTSPEED_SET)) {231return getDepartSpeed();232} else {233return myTagProperty->getDefaultStringValue(SUMO_ATTR_DEPARTSPEED);234}235case SUMO_ATTR_ARRIVALLANE:236if (wasSet(VEHPARS_ARRIVALLANE_SET)) {237return getArrivalLane();238} else {239return myTagProperty->getDefaultStringValue(SUMO_ATTR_ARRIVALLANE);240}241case SUMO_ATTR_ARRIVALPOS:242if (wasSet(VEHPARS_ARRIVALPOS_SET)) {243return getArrivalPos();244} else {245return myTagProperty->getDefaultStringValue(SUMO_ATTR_ARRIVALPOS);246}247case SUMO_ATTR_ARRIVALSPEED:248if (wasSet(VEHPARS_ARRIVALSPEED_SET)) {249return getArrivalSpeed();250} else {251return myTagProperty->getDefaultStringValue(SUMO_ATTR_ARRIVALSPEED);252}253case SUMO_ATTR_LINE:254if (wasSet(VEHPARS_LINE_SET)) {255return line;256} else {257return myTagProperty->getDefaultStringValue(SUMO_ATTR_LINE);258}259case SUMO_ATTR_PERSON_NUMBER:260if (wasSet(VEHPARS_PERSON_NUMBER_SET)) {261return toString(personNumber);262} else {263return myTagProperty->getDefaultStringValue(SUMO_ATTR_PERSON_NUMBER);264}265case SUMO_ATTR_CONTAINER_NUMBER:266if (wasSet(VEHPARS_CONTAINER_NUMBER_SET)) {267return toString(containerNumber);268} else {269return myTagProperty->getDefaultStringValue(SUMO_ATTR_CONTAINER_NUMBER);270}271case SUMO_ATTR_REROUTE:272if (wasSet(VEHPARS_CONTAINER_NUMBER_SET)) {273return "true";274} else {275return "false";276}277case SUMO_ATTR_DEPARTPOS_LAT:278if (wasSet(VEHPARS_DEPARTPOSLAT_SET)) {279return getDepartPosLat();280} else {281return myTagProperty->getDefaultStringValue(SUMO_ATTR_DEPARTPOS_LAT);282}283case SUMO_ATTR_ARRIVALPOS_LAT:284if (wasSet(VEHPARS_ARRIVALPOSLAT_SET)) {285return getArrivalPosLat();286} else {287return myTagProperty->getDefaultStringValue(SUMO_ATTR_ARRIVALPOS_LAT);288}289case SUMO_ATTR_INSERTIONCHECKS:290return getInsertionChecks();291case GNE_ATTR_PARENT:292return getParentAdditionals().at(0)->getID();293default:294return getCommonAttribute(this, key);295}296}297298299double300GNECalibratorFlow::getAttributeDouble(SumoXMLAttr key) const {301switch (key) {302case SUMO_ATTR_DEPART:303case SUMO_ATTR_BEGIN:304case SUMO_ATTR_END:305return STEPS2TIME(depart);306case SUMO_ATTR_DEPARTPOS:307// only return departPos it if is given308if (departPosProcedure == DepartPosDefinition::GIVEN) {309return departPos;310} else {311return 0;312}313case SUMO_ATTR_ARRIVALPOS:314// only return departPos it if is given315if (arrivalPosProcedure == ArrivalPosDefinition::GIVEN) {316return arrivalPos;317} else {318return -1;319}320case SUMO_ATTR_WIDTH:321case SUMO_ATTR_LENGTH:322case SUMO_ATTR_MINGAP:323return getParentDemandElements().at(0)->getAttributeDouble(key);324default:325throw InvalidArgument(getTagStr() + " doesn't have a double attribute of type '" + toString(key) + "'");326}327}328329330const Parameterised::Map&331GNECalibratorFlow::getACParametersMap() const {332return getParametersMap();333}334335336void337GNECalibratorFlow::setAttribute(SumoXMLAttr key, const std::string& value, GNEUndoList* undoList) {338if (value == getAttribute(key)) {339return; //avoid needless changes, later logic relies on the fact that attributes have changed340}341switch (key) {342case SUMO_ATTR_ID:343case SUMO_ATTR_TYPE:344case SUMO_ATTR_ROUTE:345case SUMO_ATTR_COLOR:346case SUMO_ATTR_VEHSPERHOUR:347case SUMO_ATTR_SPEED:348case SUMO_ATTR_BEGIN:349case SUMO_ATTR_END:350case SUMO_ATTR_DEPARTLANE:351case SUMO_ATTR_DEPARTPOS:352case SUMO_ATTR_DEPARTSPEED:353case SUMO_ATTR_ARRIVALLANE:354case SUMO_ATTR_ARRIVALPOS:355case SUMO_ATTR_ARRIVALSPEED:356case SUMO_ATTR_LINE:357case SUMO_ATTR_PERSON_NUMBER:358case SUMO_ATTR_CONTAINER_NUMBER:359case SUMO_ATTR_REROUTE:360case SUMO_ATTR_DEPARTPOS_LAT:361case SUMO_ATTR_ARRIVALPOS_LAT:362case SUMO_ATTR_INSERTIONCHECKS:363GNEChange_Attribute::changeAttribute(this, key, value, undoList);364break;365default:366setCommonAttribute(key, value, undoList);367break;368}369}370371372bool373GNECalibratorFlow::isValid(SumoXMLAttr key, const std::string& value) {374switch (key) {375case SUMO_ATTR_ID:376return isValidAdditionalID(value);377case SUMO_ATTR_TYPE:378return (myNet->getAttributeCarriers()->retrieveDemandElements(NamespaceIDs::types, value, false) == nullptr);379case SUMO_ATTR_ROUTE:380return (myNet->getAttributeCarriers()->retrieveDemandElements(NamespaceIDs::routes, value, false) == nullptr);381case SUMO_ATTR_VEHSPERHOUR:382if (value.empty()) {383// speed and vehsPerHour cannot be empty at the same time384if (!isAttributeEnabled(SUMO_ATTR_SPEED)) {385return false;386} else {387return true;388}389} else if (canParse<double>(value)) {390const double dVal = parse<double>(value);391return (dVal >= 0 || dVal == -1);392} else {393return false;394}395case SUMO_ATTR_SPEED:396if (value.empty()) {397// speed and vehsPerHour cannot be empty at the same time398if (!isAttributeEnabled(SUMO_ATTR_VEHSPERHOUR)) {399return false;400} else {401return true;402}403} else if (canParse<double>(value)) {404const double dVal = parse<double>(value);405return (dVal >= 0 || dVal == -1);406} else {407return false;408}409case SUMO_ATTR_COLOR:410return canParse<RGBColor>(value);411case SUMO_ATTR_BEGIN:412return canParse<SUMOTime>(value);413case SUMO_ATTR_END:414return canParse<SUMOTime>(value);415case SUMO_ATTR_DEPARTLANE:416if ((value == "random") || (value == "free") || (value == "allowed") || (value == "best") || (value == "first")) {417return true;418} else {419return (myNet->getAttributeCarriers()->retrieveLane(value, false) != nullptr);420}421case SUMO_ATTR_DEPARTPOS:422if ((value == "random") || (value == "free") || (value == "random_free") || (value == "base") || (value == "last")) {423return true;424} else {425return canParse<double>(value);426}427case SUMO_ATTR_DEPARTSPEED:428if ((value == "random") || (value == "max")) {429return true;430} else {431return canParse<double>(value);432}433case SUMO_ATTR_ARRIVALLANE:434if (value == "current") {435return true;436} else {437return (myNet->getAttributeCarriers()->retrieveLane(value, false) != nullptr);438}439case SUMO_ATTR_ARRIVALPOS:440if ((value == "random") || (value == "max")) {441return true;442} else {443return canParse<double>(value);444}445case SUMO_ATTR_ARRIVALSPEED:446if (value == "current") {447return true;448} else {449return canParse<double>(value);450}451case SUMO_ATTR_LINE:452return true;453case SUMO_ATTR_PERSON_NUMBER:454return canParse<int>(value) && parse<int>(value) >= 0;455case SUMO_ATTR_CONTAINER_NUMBER:456return canParse<int>(value) && parse<int>(value) >= 0;457case SUMO_ATTR_REROUTE:458return canParse<bool>(value);459case SUMO_ATTR_DEPARTPOS_LAT:460if ((value == "random") || (value == "free") || (value == "random_free") || (value == "left") || (value == "right") || (value == "center")) {461return true;462} else {463return canParse<double>(value);464}465case SUMO_ATTR_ARRIVALPOS_LAT:466if ((value == "left") || (value == "right") || (value == "center")) {467return true;468} else {469return canParse<double>(value);470}471case SUMO_ATTR_INSERTIONCHECKS:472return areInsertionChecksValid(value);473default:474return isCommonValid(key, value);475}476}477478479bool480GNECalibratorFlow::isAttributeEnabled(SumoXMLAttr key) const {481switch (key) {482case SUMO_ATTR_TYPE:483return (parametersSet & VEHPARS_VTYPE_SET) != 0;484case SUMO_ATTR_VEHSPERHOUR:485return (parametersSet & VEHPARS_VPH_SET) != 0;486case SUMO_ATTR_SPEED:487return (parametersSet & VEHPARS_CALIBRATORSPEED_SET) != 0;488default:489return true;490}491}492493494std::string495GNECalibratorFlow::getPopUpID() const {496return getTagStr();497}498499500std::string501GNECalibratorFlow::getHierarchyName() const {502return getTagStr() + ": " + getAttribute(SUMO_ATTR_BEGIN) + " -> " + getAttribute(SUMO_ATTR_END);503}504505// ===========================================================================506// private507// ===========================================================================508509void510GNECalibratorFlow::setAttribute(SumoXMLAttr key, const std::string& value) {511// declare string error512std::string error;513switch (key) {514case SUMO_ATTR_ID:515// update microsimID516setAdditionalID(value);517break;518case SUMO_ATTR_TYPE:519if (!isTemplate()) {520if (value.empty()) {521replaceDemandElementParent(SUMO_TAG_VTYPE, DEFAULT_VTYPE_ID, 0);522} else {523replaceDemandElementParent(SUMO_TAG_VTYPE, value, 0);524}525}526// set manually vtypeID (needed for saving)527vtypeid = value;528break;529case SUMO_ATTR_ROUTE:530replaceDemandElementParent(SUMO_TAG_ROUTE, value, 1);531break;532case SUMO_ATTR_VEHSPERHOUR:533if (value.empty()) {534parametersSet &= ~VEHPARS_VPH_SET;535} else {536repetitionOffset = TIME2STEPS(3600 / parse<double>(value));537// set parameters538parametersSet |= VEHPARS_VPH_SET;539}540break;541case SUMO_ATTR_SPEED:542if (value.empty()) {543parametersSet &= ~VEHPARS_CALIBRATORSPEED_SET;544} else {545calibratorSpeed = parse<double>(value);546// mark parameter as set547parametersSet |= VEHPARS_CALIBRATORSPEED_SET;548}549break;550case SUMO_ATTR_COLOR:551if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {552color = parse<RGBColor>(value);553// mark parameter as set554parametersSet |= VEHPARS_COLOR_SET;555} else {556// set default value557color = myTagProperty->getDefaultColorValue(key);558// unset parameter559parametersSet &= ~VEHPARS_COLOR_SET;560}561break;562case SUMO_ATTR_BEGIN:563depart = string2time(value);564break;565case SUMO_ATTR_END:566repetitionEnd = string2time(value);567break;568case SUMO_ATTR_DEPARTLANE:569if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {570parseDepartLane(value, myTagProperty->getTagStr(), id, departLane, departLaneProcedure, error);571// mark parameter as set572parametersSet |= VEHPARS_DEPARTLANE_SET;573} else {574// set default value575parseDepartLane(myTagProperty->getDefaultStringValue(key), myTagProperty->getTagStr(), id, departLane, departLaneProcedure, error);576// unset parameter577parametersSet &= ~VEHPARS_DEPARTLANE_SET;578}579break;580case SUMO_ATTR_DEPARTPOS:581if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {582parseDepartPos(value, myTagProperty->getTagStr(), id, departPos, departPosProcedure, error);583// mark parameter as set584parametersSet |= VEHPARS_DEPARTPOS_SET;585} else {586// set default value587parseDepartPos(myTagProperty->getDefaultStringValue(key), myTagProperty->getTagStr(), id, departPos, departPosProcedure, error);588// unset parameter589parametersSet &= ~VEHPARS_DEPARTPOS_SET;590}591// update geometry (except for template)592if (getParentAdditionals().size() > 0) {593updateGeometry();594}595break;596case SUMO_ATTR_DEPARTSPEED:597if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {598parseDepartSpeed(value, myTagProperty->getTagStr(), id, departSpeed, departSpeedProcedure, error);599// mark parameter as set600parametersSet |= VEHPARS_DEPARTSPEED_SET;601} else {602// set default value603parseDepartSpeed(myTagProperty->getDefaultStringValue(key), myTagProperty->getTagStr(), id, departSpeed, departSpeedProcedure, error);604// unset parameter605parametersSet &= ~VEHPARS_DEPARTSPEED_SET;606}607break;608case SUMO_ATTR_ARRIVALLANE:609if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {610parseArrivalLane(value, myTagProperty->getTagStr(), id, arrivalLane, arrivalLaneProcedure, error);611// mark parameter as set612parametersSet |= VEHPARS_ARRIVALLANE_SET;613} else {614// set default value615parseArrivalLane(myTagProperty->getDefaultStringValue(key), myTagProperty->getTagStr(), id, arrivalLane, arrivalLaneProcedure, error);616// unset parameter617parametersSet &= ~VEHPARS_ARRIVALLANE_SET;618}619break;620case SUMO_ATTR_ARRIVALPOS:621if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {622parseArrivalPos(value, myTagProperty->getTagStr(), id, arrivalPos, arrivalPosProcedure, error);623// mark parameter as set624parametersSet |= VEHPARS_ARRIVALPOS_SET;625} else {626// set default value627parseArrivalPos(myTagProperty->getDefaultStringValue(key), myTagProperty->getTagStr(), id, arrivalPos, arrivalPosProcedure, error);628// unset parameter629parametersSet &= ~VEHPARS_ARRIVALPOS_SET;630}631// update geometry (except for template)632if (getParentAdditionals().size() > 0) {633updateGeometry();634}635break;636case SUMO_ATTR_ARRIVALSPEED:637if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {638parseArrivalSpeed(value, myTagProperty->getTagStr(), id, arrivalSpeed, arrivalSpeedProcedure, error);639// mark parameter as set640parametersSet |= VEHPARS_ARRIVALSPEED_SET;641} else {642// set default value643parseArrivalSpeed(myTagProperty->getDefaultStringValue(key), myTagProperty->getTagStr(), id, arrivalSpeed, arrivalSpeedProcedure, error);644// unset parameter645parametersSet &= ~VEHPARS_ARRIVALSPEED_SET;646}647break;648case SUMO_ATTR_LINE:649if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {650line = value;651// mark parameter as set652parametersSet |= VEHPARS_LINE_SET;653} else {654// set default value655line = myTagProperty->getDefaultStringValue(key);656// unset parameter657parametersSet &= ~VEHPARS_LINE_SET;658}659break;660case SUMO_ATTR_PERSON_NUMBER:661if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {662personNumber = parse<int>(value);663// mark parameter as set664parametersSet |= VEHPARS_PERSON_NUMBER_SET;665} else {666// set default value667personNumber = myTagProperty->getDefaultIntValue(key);668// unset parameter669parametersSet &= ~VEHPARS_PERSON_NUMBER_SET;670}671break;672case SUMO_ATTR_CONTAINER_NUMBER:673if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {674containerNumber = parse<int>(value);675// mark parameter as set676parametersSet |= VEHPARS_CONTAINER_NUMBER_SET;677} else {678// set default value679containerNumber = myTagProperty->getDefaultIntValue(key);680// unset parameter681parametersSet &= ~VEHPARS_CONTAINER_NUMBER_SET;682}683break;684case SUMO_ATTR_REROUTE:685if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {686// mark parameter as set687parametersSet |= VEHPARS_ROUTE_SET;688} else {689// unset parameter690parametersSet &= ~VEHPARS_ROUTE_SET;691}692break;693case SUMO_ATTR_DEPARTPOS_LAT:694if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {695parseDepartPosLat(value, myTagProperty->getTagStr(), id, departPosLat, departPosLatProcedure, error);696// mark parameter as set697parametersSet |= VEHPARS_DEPARTPOSLAT_SET;698} else {699// set default value700parseDepartPosLat(myTagProperty->getDefaultStringValue(key), myTagProperty->getTagStr(), id, departPosLat, departPosLatProcedure, error);701// unset parameter702parametersSet &= ~VEHPARS_DEPARTPOSLAT_SET;703}704break;705case SUMO_ATTR_ARRIVALPOS_LAT:706if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {707parseArrivalPosLat(value, myTagProperty->getTagStr(), id, arrivalPosLat, arrivalPosLatProcedure, error);708// mark parameter as set709parametersSet |= VEHPARS_ARRIVALPOSLAT_SET;710} else {711// set default value712parseArrivalPosLat(myTagProperty->getDefaultStringValue(key), myTagProperty->getTagStr(), id, arrivalPosLat, arrivalPosLatProcedure, error);713// unset parameter714parametersSet &= ~VEHPARS_ARRIVALPOSLAT_SET;715}716parseArrivalPosLat(value, myTagProperty->getTagStr(), id, arrivalPosLat, arrivalPosLatProcedure, error);717break;718case SUMO_ATTR_INSERTIONCHECKS:719insertionChecks = parseInsertionChecks(value);720break;721default:722setCommonAttribute(this, key, value);723break;724}725}726727728void729GNECalibratorFlow::setMoveShape(const GNEMoveResult& /*moveResult*/) {730// nothing to do731}732733void734GNECalibratorFlow::commitMoveShape(const GNEMoveResult& /*moveResult*/, GNEUndoList* /*undoList*/) {735// nothing to do736}737738739void740GNECalibratorFlow::toggleAttribute(SumoXMLAttr key, const bool value) {741switch (key) {742case SUMO_ATTR_TYPE:743if (value) {744parametersSet |= VEHPARS_VTYPE_SET;745} else {746parametersSet &= ~VEHPARS_VTYPE_SET;747}748break;749case SUMO_ATTR_VEHSPERHOUR:750if (value) {751parametersSet |= VEHPARS_VPH_SET;752} else {753parametersSet &= ~VEHPARS_VPH_SET;754}755break;756case SUMO_ATTR_SPEED:757if (value) {758parametersSet |= VEHPARS_CALIBRATORSPEED_SET;759} else {760parametersSet &= ~VEHPARS_CALIBRATORSPEED_SET;761}762break;763default:764throw InvalidArgument(getTagStr() + " doesn't have an attribute of type '" + toString(key) + "'");765}766}767768/****************************************************************************/769770771