Path: blob/main/src/netedit/elements/additional/GNECalibratorFlow.cpp
193871 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 GNECalibratorFlow.cpp14/// @author Pablo Alvarez Lopez15/// @date March 201616///17//18/****************************************************************************/19#include <config.h>2021#include <netedit/changes/GNEChange_Attribute.h>22#include <netedit/GNENet.h>23#include <netedit/GNETagProperties.h>24#include <utils/gui/div/GLHelper.h>25#include <utils/gui/images/GUITextureSubSys.h>26#include <utils/options/OptionsCont.h>27#include <utils/xml/NamespaceIDs.h>2829#include "GNECalibratorFlow.h"3031// ===========================================================================32// member method definitions33// ===========================================================================3435GNECalibratorFlow::GNECalibratorFlow(GNENet* net) :36GNEAdditional(net, GNE_TAG_CALIBRATOR_FLOW),37GNEAdditionalListed(this) {38// set VPH and speed enabled39toggleAttribute(SUMO_ATTR_VEHSPERHOUR, true);40toggleAttribute(SUMO_ATTR_SPEED, true);41// reset ID42id.clear();43}444546GNECalibratorFlow::GNECalibratorFlow(GNEAdditional* calibratorParent, const SUMOTime begin, const SUMOTime end,47GNEDemandElement* vehicleType, GNEDemandElement* route) :48GNEAdditional(calibratorParent, GNE_TAG_CALIBRATOR_FLOW, ""),49GNEAdditionalListed(this) {50// set parents51setParent<GNEAdditional*>(calibratorParent);52setParents<GNEDemandElement*>({vehicleType, route});53// update centering boundary without updating grid54updateCenteringBoundary(false);55// reset ID56id.clear();57// set begin and end58depart = begin;59repetitionEnd = end;60// set default vehsperhour61setAttribute(SUMO_ATTR_VEHSPERHOUR, "1800");62}636465GNECalibratorFlow::GNECalibratorFlow(GNEAdditional* calibratorParent, GNEDemandElement* vehicleType, GNEDemandElement* route,66const SUMOVehicleParameter& vehicleParameters) :67GNEAdditional(calibratorParent, GNE_TAG_CALIBRATOR_FLOW, ""),68SUMOVehicleParameter(vehicleParameters),69GNEAdditionalListed(this) {70// set parents71setParent<GNEAdditional*>(calibratorParent);72setParents<GNEDemandElement*>({vehicleType, route});73// update centering boundary without updating grid74updateCenteringBoundary(false);75// reset ID76id.clear();77}787980GNECalibratorFlow::~GNECalibratorFlow() {}818283GNEMoveElement*84GNECalibratorFlow::getMoveElement() const {85return nullptr;86}878889Parameterised*90GNECalibratorFlow::getParameters() {91return this;92}939495const Parameterised*96GNECalibratorFlow::getParameters() const {97return this;98}99100101void102GNECalibratorFlow::writeAdditional(OutputDevice& device) const {103if (isAttributeEnabled(SUMO_ATTR_TYPE) || isAttributeEnabled(SUMO_ATTR_VEHSPERHOUR) || isAttributeEnabled(SUMO_ATTR_SPEED)) {104// open tag105device.openTag(SUMO_TAG_FLOW);106// write vehicle attributes107write(device, OptionsCont::getOptions(), SUMO_TAG_FLOW, getParentDemandElements().at(0)->getID());108// write end109device.writeAttr(SUMO_ATTR_END, getAttribute(SUMO_ATTR_END));110// write route111device.writeAttr(SUMO_ATTR_ROUTE, getParentDemandElements().at(1)->getID());112// write parameters113SUMOVehicleParameter::writeParams(device);114// close vehicle tag115device.closeTag();116} else {117WRITE_WARNING(TLF("calibratorFlow of calibrator '%' cannot be written. Either type or vehsPerHour or speed must be enabled", getParentAdditionals().front()->getID()));118}119}120121122bool123GNECalibratorFlow::isAdditionalValid() const {124return true;125}126127128std::string129GNECalibratorFlow::getAdditionalProblem() const {130return "";131}132133134void135GNECalibratorFlow::fixAdditionalProblem() {136// nothing to fix137}138139140bool141GNECalibratorFlow::checkDrawMoveContour() const {142return false;143}144145146void147GNECalibratorFlow::updateGeometry() {148updateGeometryListedAdditional();149}150151152Position153GNECalibratorFlow::getPositionInView() const {154return getListedPositionInView();155}156157158void159GNECalibratorFlow::updateCenteringBoundary(const bool /*updateGrid*/) {160// nothing to update161}162163164void165GNECalibratorFlow::splitEdgeGeometry(const double /*splitPosition*/, const GNENetworkElement* /*originalElement*/, const GNENetworkElement* /*newElement*/, GNEUndoList* /*undoList*/) {166// geometry of this element cannot be splitted167}168169170std::string171GNECalibratorFlow::getParentName() const {172return getParentAdditionals().at(0)->getID();173}174175176void177GNECalibratorFlow::drawGL(const GUIVisualizationSettings& s) const {178// draw closing reroute as listed attribute179drawListedAdditional(s, s.additionalSettings.calibratorColor, RGBColor::BLACK, GUITexture::VARIABLESPEEDSIGN_STEP,180"Flow: " + getID());181}182183184std::string185GNECalibratorFlow::getAttribute(SumoXMLAttr key) const {186switch (key) {187case SUMO_ATTR_ID:188return getMicrosimID();189case SUMO_ATTR_TYPE:190return vtypeid;191case SUMO_ATTR_ROUTE:192return getParentDemandElements().at(1)->getID();193case SUMO_ATTR_VEHSPERHOUR:194if (parametersSet & VEHPARS_VPH_SET) {195return toString(3600 / STEPS2TIME(repetitionOffset));196} else {197return "";198}199case SUMO_ATTR_SPEED:200if (parametersSet & VEHPARS_CALIBRATORSPEED_SET) {201return toString(calibratorSpeed);202} else {203return "";204}205case SUMO_ATTR_COLOR:206if (wasSet(VEHPARS_COLOR_SET)) {207return toString(color);208} else {209return myTagProperty->getDefaultStringValue(SUMO_ATTR_COLOR);210}211case SUMO_ATTR_BEGIN:212return time2string(depart);213case SUMO_ATTR_END:214return time2string(repetitionEnd);215case SUMO_ATTR_DEPARTLANE:216if (wasSet(VEHPARS_DEPARTLANE_SET)) {217return getDepartLane();218} else {219return myTagProperty->getDefaultStringValue(SUMO_ATTR_DEPARTLANE);220}221case SUMO_ATTR_DEPARTPOS:222if (wasSet(VEHPARS_DEPARTPOS_SET)) {223return getDepartPos();224} else {225return myTagProperty->getDefaultStringValue(SUMO_ATTR_DEPARTPOS);226}227case SUMO_ATTR_DEPARTSPEED:228if (wasSet(VEHPARS_DEPARTSPEED_SET)) {229return getDepartSpeed();230} else {231return myTagProperty->getDefaultStringValue(SUMO_ATTR_DEPARTSPEED);232}233case SUMO_ATTR_ARRIVALLANE:234if (wasSet(VEHPARS_ARRIVALLANE_SET)) {235return getArrivalLane();236} else {237return myTagProperty->getDefaultStringValue(SUMO_ATTR_ARRIVALLANE);238}239case SUMO_ATTR_ARRIVALPOS:240if (wasSet(VEHPARS_ARRIVALPOS_SET)) {241return getArrivalPos();242} else {243return myTagProperty->getDefaultStringValue(SUMO_ATTR_ARRIVALPOS);244}245case SUMO_ATTR_ARRIVALSPEED:246if (wasSet(VEHPARS_ARRIVALSPEED_SET)) {247return getArrivalSpeed();248} else {249return myTagProperty->getDefaultStringValue(SUMO_ATTR_ARRIVALSPEED);250}251case SUMO_ATTR_LINE:252if (wasSet(VEHPARS_LINE_SET)) {253return line;254} else {255return myTagProperty->getDefaultStringValue(SUMO_ATTR_LINE);256}257case SUMO_ATTR_PERSON_NUMBER:258if (wasSet(VEHPARS_PERSON_NUMBER_SET)) {259return toString(personNumber);260} else {261return myTagProperty->getDefaultStringValue(SUMO_ATTR_PERSON_NUMBER);262}263case SUMO_ATTR_CONTAINER_NUMBER:264if (wasSet(VEHPARS_CONTAINER_NUMBER_SET)) {265return toString(containerNumber);266} else {267return myTagProperty->getDefaultStringValue(SUMO_ATTR_CONTAINER_NUMBER);268}269case SUMO_ATTR_REROUTE:270if (wasSet(VEHPARS_CONTAINER_NUMBER_SET)) {271return "true";272} else {273return "false";274}275case SUMO_ATTR_DEPARTPOS_LAT:276if (wasSet(VEHPARS_DEPARTPOSLAT_SET)) {277return getDepartPosLat();278} else {279return myTagProperty->getDefaultStringValue(SUMO_ATTR_DEPARTPOS_LAT);280}281case SUMO_ATTR_ARRIVALPOS_LAT:282if (wasSet(VEHPARS_ARRIVALPOSLAT_SET)) {283return getArrivalPosLat();284} else {285return myTagProperty->getDefaultStringValue(SUMO_ATTR_ARRIVALPOS_LAT);286}287case SUMO_ATTR_INSERTIONCHECKS:288return getInsertionChecks();289case GNE_ATTR_PARENT:290return getParentAdditionals().at(0)->getID();291default:292return getCommonAttribute(key);293}294}295296297double298GNECalibratorFlow::getAttributeDouble(SumoXMLAttr key) const {299switch (key) {300case SUMO_ATTR_DEPART:301case SUMO_ATTR_BEGIN:302case SUMO_ATTR_END:303return STEPS2TIME(depart);304case SUMO_ATTR_DEPARTPOS:305// only return departPos it if is given306if (departPosProcedure == DepartPosDefinition::GIVEN) {307return departPos;308} else {309return 0;310}311case SUMO_ATTR_ARRIVALPOS:312// only return departPos it if is given313if (arrivalPosProcedure == ArrivalPosDefinition::GIVEN) {314return arrivalPos;315} else {316return -1;317}318case SUMO_ATTR_WIDTH:319case SUMO_ATTR_LENGTH:320case SUMO_ATTR_MINGAP:321return getParentDemandElements().at(0)->getAttributeDouble(key);322default:323return getCommonAttributeDouble(key);324}325}326327328Position329GNECalibratorFlow::getAttributePosition(SumoXMLAttr key) const {330return getCommonAttributePosition(key);331}332333334PositionVector335GNECalibratorFlow::getAttributePositionVector(SumoXMLAttr key) const {336return getCommonAttributePositionVector(key);337}338339340void341GNECalibratorFlow::setAttribute(SumoXMLAttr key, const std::string& value, GNEUndoList* undoList) {342if (value == getAttribute(key)) {343return; //avoid needless changes, later logic relies on the fact that attributes have changed344}345switch (key) {346case SUMO_ATTR_ID:347case SUMO_ATTR_TYPE:348case SUMO_ATTR_ROUTE:349case SUMO_ATTR_COLOR:350case SUMO_ATTR_VEHSPERHOUR:351case SUMO_ATTR_SPEED:352case SUMO_ATTR_BEGIN:353case SUMO_ATTR_END:354case SUMO_ATTR_DEPARTLANE:355case SUMO_ATTR_DEPARTPOS:356case SUMO_ATTR_DEPARTSPEED:357case SUMO_ATTR_ARRIVALLANE:358case SUMO_ATTR_ARRIVALPOS:359case SUMO_ATTR_ARRIVALSPEED:360case SUMO_ATTR_LINE:361case SUMO_ATTR_PERSON_NUMBER:362case SUMO_ATTR_CONTAINER_NUMBER:363case SUMO_ATTR_REROUTE:364case SUMO_ATTR_DEPARTPOS_LAT:365case SUMO_ATTR_ARRIVALPOS_LAT:366case SUMO_ATTR_INSERTIONCHECKS:367GNEChange_Attribute::changeAttribute(this, key, value, undoList);368break;369default:370setCommonAttribute(key, value, undoList);371break;372}373}374375376bool377GNECalibratorFlow::isValid(SumoXMLAttr key, const std::string& value) {378switch (key) {379case SUMO_ATTR_ID:380return isValidAdditionalID(value);381case SUMO_ATTR_TYPE:382return (myNet->getAttributeCarriers()->retrieveDemandElements(NamespaceIDs::types, value, false) == nullptr);383case SUMO_ATTR_ROUTE:384return (myNet->getAttributeCarriers()->retrieveDemandElements(NamespaceIDs::routes, value, false) == nullptr);385case SUMO_ATTR_VEHSPERHOUR:386if (value.empty()) {387// speed and vehsPerHour cannot be empty at the same time388if (!isAttributeEnabled(SUMO_ATTR_SPEED)) {389return false;390} else {391return true;392}393} else if (canParse<double>(value)) {394const double dVal = parse<double>(value);395return (dVal >= 0 || dVal == -1);396} else {397return false;398}399case SUMO_ATTR_SPEED:400if (value.empty()) {401// speed and vehsPerHour cannot be empty at the same time402if (!isAttributeEnabled(SUMO_ATTR_VEHSPERHOUR)) {403return false;404} else {405return true;406}407} else if (canParse<double>(value)) {408const double dVal = parse<double>(value);409return (dVal >= 0 || dVal == -1);410} else {411return false;412}413case SUMO_ATTR_COLOR:414return canParse<RGBColor>(value);415case SUMO_ATTR_BEGIN:416return canParse<SUMOTime>(value);417case SUMO_ATTR_END:418return canParse<SUMOTime>(value);419case SUMO_ATTR_DEPARTLANE:420if ((value == "random") || (value == "free") || (value == "allowed") || (value == "best") || (value == "first")) {421return true;422} else {423return (myNet->getAttributeCarriers()->retrieveLane(value, false) != nullptr);424}425case SUMO_ATTR_DEPARTPOS:426if ((value == "random") || (value == "free") || (value == "random_free") || (value == "base") || (value == "last")) {427return true;428} else {429return canParse<double>(value);430}431case SUMO_ATTR_DEPARTSPEED:432if ((value == "random") || (value == "max")) {433return true;434} else {435return canParse<double>(value);436}437case SUMO_ATTR_ARRIVALLANE:438if (value == "current") {439return true;440} else {441return (myNet->getAttributeCarriers()->retrieveLane(value, false) != nullptr);442}443case SUMO_ATTR_ARRIVALPOS:444if ((value == "random") || (value == "max")) {445return true;446} else {447return canParse<double>(value);448}449case SUMO_ATTR_ARRIVALSPEED:450if (value == "current") {451return true;452} else {453return canParse<double>(value);454}455case SUMO_ATTR_LINE:456return true;457case SUMO_ATTR_PERSON_NUMBER:458return canParse<int>(value) && parse<int>(value) >= 0;459case SUMO_ATTR_CONTAINER_NUMBER:460return canParse<int>(value) && parse<int>(value) >= 0;461case SUMO_ATTR_REROUTE:462return canParse<bool>(value);463case SUMO_ATTR_DEPARTPOS_LAT:464if ((value == "random") || (value == "free") || (value == "random_free") || (value == "left") || (value == "right") || (value == "center")) {465return true;466} else {467return canParse<double>(value);468}469case SUMO_ATTR_ARRIVALPOS_LAT:470if ((value == "left") || (value == "right") || (value == "center")) {471return true;472} else {473return canParse<double>(value);474}475case SUMO_ATTR_INSERTIONCHECKS:476return areInsertionChecksValid(value);477default:478return isCommonAttributeValid(key, value);479}480}481482483bool484GNECalibratorFlow::isAttributeEnabled(SumoXMLAttr key) const {485switch (key) {486case SUMO_ATTR_TYPE:487return (parametersSet & VEHPARS_VTYPE_SET) != 0;488case SUMO_ATTR_VEHSPERHOUR:489return (parametersSet & VEHPARS_VPH_SET) != 0;490case SUMO_ATTR_SPEED:491return (parametersSet & VEHPARS_CALIBRATORSPEED_SET) != 0;492default:493return true;494}495}496497498std::string499GNECalibratorFlow::getPopUpID() const {500return getTagStr();501}502503504std::string505GNECalibratorFlow::getHierarchyName() const {506return getTagStr() + ": " + getAttribute(SUMO_ATTR_BEGIN) + " -> " + getAttribute(SUMO_ATTR_END);507}508509// ===========================================================================510// private511// ===========================================================================512513void514GNECalibratorFlow::setAttribute(SumoXMLAttr key, const std::string& value) {515// declare string error516std::string error;517switch (key) {518case SUMO_ATTR_ID:519// update microsimID520setAdditionalID(value);521break;522case SUMO_ATTR_TYPE:523if (!isTemplate()) {524if (value.empty()) {525replaceDemandElementParent(SUMO_TAG_VTYPE, DEFAULT_VTYPE_ID, 0);526} else {527replaceDemandElementParent(SUMO_TAG_VTYPE, value, 0);528}529}530// set manually vtypeID (needed for saving)531vtypeid = value;532break;533case SUMO_ATTR_ROUTE:534replaceDemandElementParent(SUMO_TAG_ROUTE, value, 1);535break;536case SUMO_ATTR_VEHSPERHOUR:537if (value.empty()) {538parametersSet &= ~VEHPARS_VPH_SET;539} else {540repetitionOffset = TIME2STEPS(3600 / parse<double>(value));541// set parameters542parametersSet |= VEHPARS_VPH_SET;543}544break;545case SUMO_ATTR_SPEED:546if (value.empty()) {547parametersSet &= ~VEHPARS_CALIBRATORSPEED_SET;548} else {549calibratorSpeed = parse<double>(value);550// mark parameter as set551parametersSet |= VEHPARS_CALIBRATORSPEED_SET;552}553break;554case SUMO_ATTR_COLOR:555if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {556color = parse<RGBColor>(value);557// mark parameter as set558parametersSet |= VEHPARS_COLOR_SET;559} else {560// set default value561color = myTagProperty->getDefaultColorValue(key);562// unset parameter563parametersSet &= ~VEHPARS_COLOR_SET;564}565break;566case SUMO_ATTR_BEGIN:567depart = string2time(value);568break;569case SUMO_ATTR_END:570repetitionEnd = string2time(value);571break;572case SUMO_ATTR_DEPARTLANE:573if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {574parseDepartLane(value, myTagProperty->getTagStr(), id, departLane, departLaneProcedure, error);575// mark parameter as set576parametersSet |= VEHPARS_DEPARTLANE_SET;577} else {578// set default value579parseDepartLane(myTagProperty->getDefaultStringValue(key), myTagProperty->getTagStr(), id, departLane, departLaneProcedure, error);580// unset parameter581parametersSet &= ~VEHPARS_DEPARTLANE_SET;582}583break;584case SUMO_ATTR_DEPARTPOS:585if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {586parseDepartPos(value, myTagProperty->getTagStr(), id, departPos, departPosProcedure, error);587// mark parameter as set588parametersSet |= VEHPARS_DEPARTPOS_SET;589} else {590// set default value591parseDepartPos(myTagProperty->getDefaultStringValue(key), myTagProperty->getTagStr(), id, departPos, departPosProcedure, error);592// unset parameter593parametersSet &= ~VEHPARS_DEPARTPOS_SET;594}595// update geometry (except for template)596if (getParentAdditionals().size() > 0) {597updateGeometry();598}599break;600case SUMO_ATTR_DEPARTSPEED:601if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {602parseDepartSpeed(value, myTagProperty->getTagStr(), id, departSpeed, departSpeedProcedure, error);603// mark parameter as set604parametersSet |= VEHPARS_DEPARTSPEED_SET;605} else {606// set default value607parseDepartSpeed(myTagProperty->getDefaultStringValue(key), myTagProperty->getTagStr(), id, departSpeed, departSpeedProcedure, error);608// unset parameter609parametersSet &= ~VEHPARS_DEPARTSPEED_SET;610}611break;612case SUMO_ATTR_ARRIVALLANE:613if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {614parseArrivalLane(value, myTagProperty->getTagStr(), id, arrivalLane, arrivalLaneProcedure, error);615// mark parameter as set616parametersSet |= VEHPARS_ARRIVALLANE_SET;617} else {618// set default value619parseArrivalLane(myTagProperty->getDefaultStringValue(key), myTagProperty->getTagStr(), id, arrivalLane, arrivalLaneProcedure, error);620// unset parameter621parametersSet &= ~VEHPARS_ARRIVALLANE_SET;622}623break;624case SUMO_ATTR_ARRIVALPOS:625if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {626parseArrivalPos(value, myTagProperty->getTagStr(), id, arrivalPos, arrivalPosProcedure, error);627// mark parameter as set628parametersSet |= VEHPARS_ARRIVALPOS_SET;629} else {630// set default value631parseArrivalPos(myTagProperty->getDefaultStringValue(key), myTagProperty->getTagStr(), id, arrivalPos, arrivalPosProcedure, error);632// unset parameter633parametersSet &= ~VEHPARS_ARRIVALPOS_SET;634}635// update geometry (except for template)636if (getParentAdditionals().size() > 0) {637updateGeometry();638}639break;640case SUMO_ATTR_ARRIVALSPEED:641if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {642parseArrivalSpeed(value, myTagProperty->getTagStr(), id, arrivalSpeed, arrivalSpeedProcedure, error);643// mark parameter as set644parametersSet |= VEHPARS_ARRIVALSPEED_SET;645} else {646// set default value647parseArrivalSpeed(myTagProperty->getDefaultStringValue(key), myTagProperty->getTagStr(), id, arrivalSpeed, arrivalSpeedProcedure, error);648// unset parameter649parametersSet &= ~VEHPARS_ARRIVALSPEED_SET;650}651break;652case SUMO_ATTR_LINE:653if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {654line = value;655// mark parameter as set656parametersSet |= VEHPARS_LINE_SET;657} else {658// set default value659line = myTagProperty->getDefaultStringValue(key);660// unset parameter661parametersSet &= ~VEHPARS_LINE_SET;662}663break;664case SUMO_ATTR_PERSON_NUMBER:665if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {666personNumber = parse<int>(value);667// mark parameter as set668parametersSet |= VEHPARS_PERSON_NUMBER_SET;669} else {670// set default value671personNumber = myTagProperty->getDefaultIntValue(key);672// unset parameter673parametersSet &= ~VEHPARS_PERSON_NUMBER_SET;674}675break;676case SUMO_ATTR_CONTAINER_NUMBER:677if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {678containerNumber = parse<int>(value);679// mark parameter as set680parametersSet |= VEHPARS_CONTAINER_NUMBER_SET;681} else {682// set default value683containerNumber = myTagProperty->getDefaultIntValue(key);684// unset parameter685parametersSet &= ~VEHPARS_CONTAINER_NUMBER_SET;686}687break;688case SUMO_ATTR_REROUTE:689if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {690// mark parameter as set691parametersSet |= VEHPARS_ROUTE_SET;692} else {693// unset parameter694parametersSet &= ~VEHPARS_ROUTE_SET;695}696break;697case SUMO_ATTR_DEPARTPOS_LAT:698if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {699parseDepartPosLat(value, myTagProperty->getTagStr(), id, departPosLat, departPosLatProcedure, error);700// mark parameter as set701parametersSet |= VEHPARS_DEPARTPOSLAT_SET;702} else {703// set default value704parseDepartPosLat(myTagProperty->getDefaultStringValue(key), myTagProperty->getTagStr(), id, departPosLat, departPosLatProcedure, error);705// unset parameter706parametersSet &= ~VEHPARS_DEPARTPOSLAT_SET;707}708break;709case SUMO_ATTR_ARRIVALPOS_LAT:710if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {711parseArrivalPosLat(value, myTagProperty->getTagStr(), id, arrivalPosLat, arrivalPosLatProcedure, error);712// mark parameter as set713parametersSet |= VEHPARS_ARRIVALPOSLAT_SET;714} else {715// set default value716parseArrivalPosLat(myTagProperty->getDefaultStringValue(key), myTagProperty->getTagStr(), id, arrivalPosLat, arrivalPosLatProcedure, error);717// unset parameter718parametersSet &= ~VEHPARS_ARRIVALPOSLAT_SET;719}720parseArrivalPosLat(value, myTagProperty->getTagStr(), id, arrivalPosLat, arrivalPosLatProcedure, error);721break;722case SUMO_ATTR_INSERTIONCHECKS:723insertionChecks = parseInsertionChecks(value);724break;725default:726setCommonAttribute(key, value);727break;728}729}730731732void733GNECalibratorFlow::toggleAttribute(SumoXMLAttr key, const bool value) {734switch (key) {735case SUMO_ATTR_TYPE:736if (value) {737parametersSet |= VEHPARS_VTYPE_SET;738} else {739parametersSet &= ~VEHPARS_VTYPE_SET;740}741break;742case SUMO_ATTR_VEHSPERHOUR:743if (value) {744parametersSet |= VEHPARS_VPH_SET;745} else {746parametersSet &= ~VEHPARS_VPH_SET;747}748break;749case SUMO_ATTR_SPEED:750if (value) {751parametersSet |= VEHPARS_CALIBRATORSPEED_SET;752} else {753parametersSet &= ~VEHPARS_CALIBRATORSPEED_SET;754}755break;756default:757throw InvalidArgument(getTagStr() + " doesn't have an attribute of type '" + toString(key) + "'");758}759}760761/****************************************************************************/762763764