Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netedit/elements/additional/GNECalibratorFlow.cpp
169684 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2001-2025 German Aerospace Center (DLR) and others.
4
// This program and the accompanying materials are made available under the
5
// terms of the Eclipse Public License 2.0 which is available at
6
// https://www.eclipse.org/legal/epl-2.0/
7
// This Source Code may also be made available under the following Secondary
8
// Licenses when the conditions for such availability set forth in the Eclipse
9
// Public License 2.0 are satisfied: GNU General Public License, version 2
10
// or later which is available at
11
// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13
/****************************************************************************/
14
/// @file GNECalibratorFlow.cpp
15
/// @author Pablo Alvarez Lopez
16
/// @date March 2016
17
///
18
//
19
/****************************************************************************/
20
#include <config.h>
21
22
#include <netedit/GNENet.h>
23
#include <netedit/GNETagProperties.h>
24
#include <netedit/GNEViewNet.h>
25
#include <netedit/GNEUndoList.h>
26
#include <netedit/changes/GNEChange_Attribute.h>
27
#include <utils/options/OptionsCont.h>
28
#include <utils/gui/globjects/GLIncludes.h>
29
#include <utils/gui/div/GLHelper.h>
30
#include <utils/common/StringTokenizer.h>
31
#include <utils/xml/NamespaceIDs.h>
32
33
#include "GNECalibratorFlow.h"
34
35
// ===========================================================================
36
// member method definitions
37
// ===========================================================================
38
39
GNECalibratorFlow::GNECalibratorFlow(GNENet* net) :
40
GNEAdditional("", net, "", GNE_TAG_CALIBRATOR_FLOW, "") {
41
// set VPH and speed enabled
42
toggleAttribute(SUMO_ATTR_VEHSPERHOUR, true);
43
toggleAttribute(SUMO_ATTR_SPEED, true);
44
// reset ID
45
id.clear();
46
}
47
48
49
GNECalibratorFlow::GNECalibratorFlow(GNEAdditional* calibratorParent, GNEDemandElement* vehicleType, GNEDemandElement* route) :
50
GNEAdditional(calibratorParent, GNE_TAG_CALIBRATOR_FLOW, "") {
51
// set parents
52
setParent<GNEAdditional*>(calibratorParent);
53
setParents<GNEDemandElement*>({vehicleType, route});
54
// update centering boundary without updating grid
55
updateCenteringBoundary(false);
56
// reset ID
57
id.clear();
58
}
59
60
61
GNECalibratorFlow::GNECalibratorFlow(GNEAdditional* calibratorParent, GNEDemandElement* vehicleType, GNEDemandElement* route,
62
const SUMOVehicleParameter& vehicleParameters) :
63
GNEAdditional(calibratorParent, GNE_TAG_CALIBRATOR_FLOW, ""),
64
SUMOVehicleParameter(vehicleParameters) {
65
// set parents
66
setParent<GNEAdditional*>(calibratorParent);
67
setParents<GNEDemandElement*>({vehicleType, route});
68
// update centering boundary without updating grid
69
updateCenteringBoundary(false);
70
// reset ID
71
id.clear();
72
}
73
74
75
GNECalibratorFlow::~GNECalibratorFlow() {}
76
77
78
void
79
GNECalibratorFlow::writeAdditional(OutputDevice& device) const {
80
if (isAttributeEnabled(SUMO_ATTR_TYPE) || isAttributeEnabled(SUMO_ATTR_VEHSPERHOUR) || isAttributeEnabled(SUMO_ATTR_SPEED)) {
81
// open tag
82
device.openTag(SUMO_TAG_FLOW);
83
// write vehicle attributes
84
write(device, OptionsCont::getOptions(), SUMO_TAG_FLOW, getParentDemandElements().at(0)->getID());
85
// write end
86
device.writeAttr(SUMO_ATTR_END, getAttribute(SUMO_ATTR_END));
87
// write route
88
device.writeAttr(SUMO_ATTR_ROUTE, getParentDemandElements().at(1)->getID());
89
// VPH
90
if (isAttributeEnabled(SUMO_ATTR_VEHSPERHOUR)) {
91
device.writeAttr(SUMO_ATTR_VEHSPERHOUR, getAttribute(SUMO_ATTR_VEHSPERHOUR));
92
}
93
// write parameters
94
SUMOVehicleParameter::writeParams(device);
95
// close vehicle tag
96
device.closeTag();
97
} else {
98
WRITE_WARNING(TLF("calibratorFlow of calibrator '%' cannot be written. Either type or vehsPerHour or speed must be enabled", getParentAdditionals().front()->getID()));
99
}
100
}
101
102
103
bool
104
GNECalibratorFlow::isAdditionalValid() const {
105
return true;
106
}
107
108
109
std::string
110
GNECalibratorFlow::getAdditionalProblem() const {
111
return "";
112
}
113
114
115
void
116
GNECalibratorFlow::fixAdditionalProblem() {
117
// nothing to fix
118
}
119
120
121
bool
122
GNECalibratorFlow::checkDrawMoveContour() const {
123
return false;
124
}
125
126
127
GNEMoveOperation*
128
GNECalibratorFlow::getMoveOperation() {
129
// calibrators flow cannot be moved
130
return nullptr;
131
}
132
133
134
void
135
GNECalibratorFlow::updateGeometry() {
136
// update centering boundary (needed for centering)
137
updateCenteringBoundary(false);
138
}
139
140
141
Position
142
GNECalibratorFlow::getPositionInView() const {
143
// get rerouter parent position
144
Position signPosition = getParentAdditionals().front()->getPositionInView();
145
// set position depending of indexes
146
signPosition.add(4.5, (getDrawPositionIndex() * -1) + 1, 0);
147
// return signPosition
148
return signPosition;
149
}
150
151
152
void
153
GNECalibratorFlow::updateCenteringBoundary(const bool /*updateGrid*/) {
154
// nothing to update
155
}
156
157
158
void
159
GNECalibratorFlow::splitEdgeGeometry(const double /*splitPosition*/, const GNENetworkElement* /*originalElement*/, const GNENetworkElement* /*newElement*/, GNEUndoList* /*undoList*/) {
160
// geometry of this element cannot be splitted
161
}
162
163
164
std::string
165
GNECalibratorFlow::getParentName() const {
166
return getParentAdditionals().at(0)->getID();
167
}
168
169
170
void
171
GNECalibratorFlow::drawGL(const GUIVisualizationSettings& s) const {
172
if (myNet->getViewNet()->getDataViewOptions().showAdditionals()) {
173
// push rotation matrix
174
GLHelper::pushMatrix();
175
// move to parent additional position
176
glTranslated(getParentAdditionals().front()->getPositionInView().x(), getParentAdditionals().front()->getPositionInView().y(), 0);
177
// rotate
178
glRotated((-1 * getParentAdditionals().front()->getAdditionalGeometry().getShapeRotations().front()) + 180, 0, 0, 1);
179
// draw rerouter interval as listed attribute
180
drawListedAdditional(s, Position(0, 0), 0.05, 1, s.additionalSettings.calibratorColor, RGBColor::BLACK, GUITexture::VARIABLESPEEDSIGN_STEP, "Flow: " + getID());
181
// pop rotation matrix
182
GLHelper::popMatrix();
183
}
184
}
185
186
187
std::string
188
GNECalibratorFlow::getAttribute(SumoXMLAttr key) const {
189
switch (key) {
190
case SUMO_ATTR_ID:
191
return getMicrosimID();
192
case SUMO_ATTR_TYPE:
193
return vtypeid;
194
case SUMO_ATTR_ROUTE:
195
return getParentDemandElements().at(1)->getID();
196
case SUMO_ATTR_VEHSPERHOUR:
197
if (parametersSet & VEHPARS_VPH_SET) {
198
return toString(3600 / STEPS2TIME(repetitionOffset));
199
} else {
200
return "";
201
}
202
case SUMO_ATTR_SPEED:
203
if (parametersSet & VEHPARS_CALIBRATORSPEED_SET) {
204
return toString(calibratorSpeed);
205
} else {
206
return "";
207
}
208
case SUMO_ATTR_COLOR:
209
if (wasSet(VEHPARS_COLOR_SET)) {
210
return toString(color);
211
} else {
212
return myTagProperty->getDefaultStringValue(SUMO_ATTR_COLOR);
213
}
214
case SUMO_ATTR_BEGIN:
215
return time2string(depart);
216
case SUMO_ATTR_END:
217
return time2string(repetitionEnd);
218
case SUMO_ATTR_DEPARTLANE:
219
if (wasSet(VEHPARS_DEPARTLANE_SET)) {
220
return getDepartLane();
221
} else {
222
return myTagProperty->getDefaultStringValue(SUMO_ATTR_DEPARTLANE);
223
}
224
case SUMO_ATTR_DEPARTPOS:
225
if (wasSet(VEHPARS_DEPARTPOS_SET)) {
226
return getDepartPos();
227
} else {
228
return myTagProperty->getDefaultStringValue(SUMO_ATTR_DEPARTPOS);
229
}
230
case SUMO_ATTR_DEPARTSPEED:
231
if (wasSet(VEHPARS_DEPARTSPEED_SET)) {
232
return getDepartSpeed();
233
} else {
234
return myTagProperty->getDefaultStringValue(SUMO_ATTR_DEPARTSPEED);
235
}
236
case SUMO_ATTR_ARRIVALLANE:
237
if (wasSet(VEHPARS_ARRIVALLANE_SET)) {
238
return getArrivalLane();
239
} else {
240
return myTagProperty->getDefaultStringValue(SUMO_ATTR_ARRIVALLANE);
241
}
242
case SUMO_ATTR_ARRIVALPOS:
243
if (wasSet(VEHPARS_ARRIVALPOS_SET)) {
244
return getArrivalPos();
245
} else {
246
return myTagProperty->getDefaultStringValue(SUMO_ATTR_ARRIVALPOS);
247
}
248
case SUMO_ATTR_ARRIVALSPEED:
249
if (wasSet(VEHPARS_ARRIVALSPEED_SET)) {
250
return getArrivalSpeed();
251
} else {
252
return myTagProperty->getDefaultStringValue(SUMO_ATTR_ARRIVALSPEED);
253
}
254
case SUMO_ATTR_LINE:
255
if (wasSet(VEHPARS_LINE_SET)) {
256
return line;
257
} else {
258
return myTagProperty->getDefaultStringValue(SUMO_ATTR_LINE);
259
}
260
case SUMO_ATTR_PERSON_NUMBER:
261
if (wasSet(VEHPARS_PERSON_NUMBER_SET)) {
262
return toString(personNumber);
263
} else {
264
return myTagProperty->getDefaultStringValue(SUMO_ATTR_PERSON_NUMBER);
265
}
266
case SUMO_ATTR_CONTAINER_NUMBER:
267
if (wasSet(VEHPARS_CONTAINER_NUMBER_SET)) {
268
return toString(containerNumber);
269
} else {
270
return myTagProperty->getDefaultStringValue(SUMO_ATTR_CONTAINER_NUMBER);
271
}
272
case SUMO_ATTR_REROUTE:
273
if (wasSet(VEHPARS_CONTAINER_NUMBER_SET)) {
274
return "true";
275
} else {
276
return "false";
277
}
278
case SUMO_ATTR_DEPARTPOS_LAT:
279
if (wasSet(VEHPARS_DEPARTPOSLAT_SET)) {
280
return getDepartPosLat();
281
} else {
282
return myTagProperty->getDefaultStringValue(SUMO_ATTR_DEPARTPOS_LAT);
283
}
284
case SUMO_ATTR_ARRIVALPOS_LAT:
285
if (wasSet(VEHPARS_ARRIVALPOSLAT_SET)) {
286
return getArrivalPosLat();
287
} else {
288
return myTagProperty->getDefaultStringValue(SUMO_ATTR_ARRIVALPOS_LAT);
289
}
290
case SUMO_ATTR_INSERTIONCHECKS:
291
return getInsertionChecks();
292
case GNE_ATTR_PARENT:
293
return getParentAdditionals().at(0)->getID();
294
default:
295
return getCommonAttribute(this, key);
296
}
297
}
298
299
300
double
301
GNECalibratorFlow::getAttributeDouble(SumoXMLAttr key) const {
302
switch (key) {
303
case SUMO_ATTR_DEPART:
304
case SUMO_ATTR_BEGIN:
305
case SUMO_ATTR_END:
306
return STEPS2TIME(depart);
307
case SUMO_ATTR_DEPARTPOS:
308
// only return departPos it if is given
309
if (departPosProcedure == DepartPosDefinition::GIVEN) {
310
return departPos;
311
} else {
312
return 0;
313
}
314
case SUMO_ATTR_ARRIVALPOS:
315
// only return departPos it if is given
316
if (arrivalPosProcedure == ArrivalPosDefinition::GIVEN) {
317
return arrivalPos;
318
} else {
319
return -1;
320
}
321
case SUMO_ATTR_WIDTH:
322
case SUMO_ATTR_LENGTH:
323
case SUMO_ATTR_MINGAP:
324
return getParentDemandElements().at(0)->getAttributeDouble(key);
325
default:
326
throw InvalidArgument(getTagStr() + " doesn't have a double attribute of type '" + toString(key) + "'");
327
}
328
}
329
330
331
const Parameterised::Map&
332
GNECalibratorFlow::getACParametersMap() const {
333
return getParametersMap();
334
}
335
336
337
void
338
GNECalibratorFlow::setAttribute(SumoXMLAttr key, const std::string& value, GNEUndoList* undoList) {
339
if (value == getAttribute(key)) {
340
return; //avoid needless changes, later logic relies on the fact that attributes have changed
341
}
342
switch (key) {
343
case SUMO_ATTR_ID:
344
case SUMO_ATTR_TYPE:
345
case SUMO_ATTR_ROUTE:
346
case SUMO_ATTR_COLOR:
347
case SUMO_ATTR_VEHSPERHOUR:
348
case SUMO_ATTR_SPEED:
349
case SUMO_ATTR_BEGIN:
350
case SUMO_ATTR_END:
351
case SUMO_ATTR_DEPARTLANE:
352
case SUMO_ATTR_DEPARTPOS:
353
case SUMO_ATTR_DEPARTSPEED:
354
case SUMO_ATTR_ARRIVALLANE:
355
case SUMO_ATTR_ARRIVALPOS:
356
case SUMO_ATTR_ARRIVALSPEED:
357
case SUMO_ATTR_LINE:
358
case SUMO_ATTR_PERSON_NUMBER:
359
case SUMO_ATTR_CONTAINER_NUMBER:
360
case SUMO_ATTR_REROUTE:
361
case SUMO_ATTR_DEPARTPOS_LAT:
362
case SUMO_ATTR_ARRIVALPOS_LAT:
363
case SUMO_ATTR_INSERTIONCHECKS:
364
GNEChange_Attribute::changeAttribute(this, key, value, undoList);
365
break;
366
default:
367
setCommonAttribute(key, value, undoList);
368
break;
369
}
370
}
371
372
373
bool
374
GNECalibratorFlow::isValid(SumoXMLAttr key, const std::string& value) {
375
switch (key) {
376
case SUMO_ATTR_ID:
377
return isValidAdditionalID(value);
378
case SUMO_ATTR_TYPE:
379
return (myNet->getAttributeCarriers()->retrieveDemandElements(NamespaceIDs::types, value, false) == nullptr);
380
case SUMO_ATTR_ROUTE:
381
return (myNet->getAttributeCarriers()->retrieveDemandElements(NamespaceIDs::routes, value, false) == nullptr);
382
case SUMO_ATTR_VEHSPERHOUR:
383
if (value.empty()) {
384
// speed and vehsPerHour cannot be empty at the same time
385
if (!isAttributeEnabled(SUMO_ATTR_SPEED)) {
386
return false;
387
} else {
388
return true;
389
}
390
} else if (canParse<double>(value)) {
391
const double dVal = parse<double>(value);
392
return (dVal >= 0 || dVal == -1);
393
} else {
394
return false;
395
}
396
case SUMO_ATTR_SPEED:
397
if (value.empty()) {
398
// speed and vehsPerHour cannot be empty at the same time
399
if (!isAttributeEnabled(SUMO_ATTR_VEHSPERHOUR)) {
400
return false;
401
} else {
402
return true;
403
}
404
} else if (canParse<double>(value)) {
405
const double dVal = parse<double>(value);
406
return (dVal >= 0 || dVal == -1);
407
} else {
408
return false;
409
}
410
case SUMO_ATTR_COLOR:
411
return canParse<RGBColor>(value);
412
case SUMO_ATTR_BEGIN:
413
return canParse<SUMOTime>(value);
414
case SUMO_ATTR_END:
415
return canParse<SUMOTime>(value);
416
case SUMO_ATTR_DEPARTLANE:
417
if ((value == "random") || (value == "free") || (value == "allowed") || (value == "best") || (value == "first")) {
418
return true;
419
} else {
420
return (myNet->getAttributeCarriers()->retrieveLane(value, false) != nullptr);
421
}
422
case SUMO_ATTR_DEPARTPOS:
423
if ((value == "random") || (value == "free") || (value == "random_free") || (value == "base") || (value == "last")) {
424
return true;
425
} else {
426
return canParse<double>(value);
427
}
428
case SUMO_ATTR_DEPARTSPEED:
429
if ((value == "random") || (value == "max")) {
430
return true;
431
} else {
432
return canParse<double>(value);
433
}
434
case SUMO_ATTR_ARRIVALLANE:
435
if (value == "current") {
436
return true;
437
} else {
438
return (myNet->getAttributeCarriers()->retrieveLane(value, false) != nullptr);
439
}
440
case SUMO_ATTR_ARRIVALPOS:
441
if ((value == "random") || (value == "max")) {
442
return true;
443
} else {
444
return canParse<double>(value);
445
}
446
case SUMO_ATTR_ARRIVALSPEED:
447
if (value == "current") {
448
return true;
449
} else {
450
return canParse<double>(value);
451
}
452
case SUMO_ATTR_LINE:
453
return true;
454
case SUMO_ATTR_PERSON_NUMBER:
455
return canParse<int>(value) && parse<int>(value) >= 0;
456
case SUMO_ATTR_CONTAINER_NUMBER:
457
return canParse<int>(value) && parse<int>(value) >= 0;
458
case SUMO_ATTR_REROUTE:
459
return canParse<bool>(value);
460
case SUMO_ATTR_DEPARTPOS_LAT:
461
if ((value == "random") || (value == "free") || (value == "random_free") || (value == "left") || (value == "right") || (value == "center")) {
462
return true;
463
} else {
464
return canParse<double>(value);
465
}
466
case SUMO_ATTR_ARRIVALPOS_LAT:
467
if ((value == "left") || (value == "right") || (value == "center")) {
468
return true;
469
} else {
470
return canParse<double>(value);
471
}
472
case SUMO_ATTR_INSERTIONCHECKS:
473
return areInsertionChecksValid(value);
474
default:
475
return isCommonValid(key, value);
476
}
477
}
478
479
480
bool
481
GNECalibratorFlow::isAttributeEnabled(SumoXMLAttr key) const {
482
switch (key) {
483
case SUMO_ATTR_TYPE:
484
return (parametersSet & VEHPARS_VTYPE_SET) != 0;
485
case SUMO_ATTR_VEHSPERHOUR:
486
return (parametersSet & VEHPARS_VPH_SET) != 0;
487
case SUMO_ATTR_SPEED:
488
return (parametersSet & VEHPARS_CALIBRATORSPEED_SET) != 0;
489
default:
490
return true;
491
}
492
}
493
494
495
std::string
496
GNECalibratorFlow::getPopUpID() const {
497
return getTagStr();
498
}
499
500
501
std::string
502
GNECalibratorFlow::getHierarchyName() const {
503
return getTagStr() + ": " + getAttribute(SUMO_ATTR_BEGIN) + " -> " + getAttribute(SUMO_ATTR_END);
504
}
505
506
// ===========================================================================
507
// private
508
// ===========================================================================
509
510
void
511
GNECalibratorFlow::setAttribute(SumoXMLAttr key, const std::string& value) {
512
// declare string error
513
std::string error;
514
switch (key) {
515
case SUMO_ATTR_ID:
516
// update microsimID
517
setAdditionalID(value);
518
break;
519
case SUMO_ATTR_TYPE:
520
if (!isTemplate()) {
521
if (value.empty()) {
522
replaceDemandElementParent(SUMO_TAG_VTYPE, DEFAULT_VTYPE_ID, 0);
523
} else {
524
replaceDemandElementParent(SUMO_TAG_VTYPE, value, 0);
525
}
526
}
527
// set manually vtypeID (needed for saving)
528
vtypeid = value;
529
break;
530
case SUMO_ATTR_ROUTE:
531
replaceDemandElementParent(SUMO_TAG_ROUTE, value, 1);
532
break;
533
case SUMO_ATTR_VEHSPERHOUR:
534
if (value.empty()) {
535
parametersSet &= ~VEHPARS_VPH_SET;
536
} else {
537
repetitionOffset = TIME2STEPS(3600 / parse<double>(value));
538
// set parameters
539
parametersSet |= VEHPARS_VPH_SET;
540
}
541
break;
542
case SUMO_ATTR_SPEED:
543
if (value.empty()) {
544
parametersSet &= ~VEHPARS_CALIBRATORSPEED_SET;
545
} else {
546
calibratorSpeed = parse<double>(value);
547
// mark parameter as set
548
parametersSet |= VEHPARS_CALIBRATORSPEED_SET;
549
}
550
break;
551
case SUMO_ATTR_COLOR:
552
if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {
553
color = parse<RGBColor>(value);
554
// mark parameter as set
555
parametersSet |= VEHPARS_COLOR_SET;
556
} else {
557
// set default value
558
color = myTagProperty->getDefaultColorValue(key);
559
// unset parameter
560
parametersSet &= ~VEHPARS_COLOR_SET;
561
}
562
break;
563
case SUMO_ATTR_BEGIN:
564
depart = string2time(value);
565
break;
566
case SUMO_ATTR_END:
567
repetitionEnd = string2time(value);
568
break;
569
case SUMO_ATTR_DEPARTLANE:
570
if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {
571
parseDepartLane(value, myTagProperty->getTagStr(), id, departLane, departLaneProcedure, error);
572
// mark parameter as set
573
parametersSet |= VEHPARS_DEPARTLANE_SET;
574
} else {
575
// set default value
576
parseDepartLane(myTagProperty->getDefaultStringValue(key), myTagProperty->getTagStr(), id, departLane, departLaneProcedure, error);
577
// unset parameter
578
parametersSet &= ~VEHPARS_DEPARTLANE_SET;
579
}
580
break;
581
case SUMO_ATTR_DEPARTPOS:
582
if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {
583
parseDepartPos(value, myTagProperty->getTagStr(), id, departPos, departPosProcedure, error);
584
// mark parameter as set
585
parametersSet |= VEHPARS_DEPARTPOS_SET;
586
} else {
587
// set default value
588
parseDepartPos(myTagProperty->getDefaultStringValue(key), myTagProperty->getTagStr(), id, departPos, departPosProcedure, error);
589
// unset parameter
590
parametersSet &= ~VEHPARS_DEPARTPOS_SET;
591
}
592
// update geometry (except for template)
593
if (getParentAdditionals().size() > 0) {
594
updateGeometry();
595
}
596
break;
597
case SUMO_ATTR_DEPARTSPEED:
598
if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {
599
parseDepartSpeed(value, myTagProperty->getTagStr(), id, departSpeed, departSpeedProcedure, error);
600
// mark parameter as set
601
parametersSet |= VEHPARS_DEPARTSPEED_SET;
602
} else {
603
// set default value
604
parseDepartSpeed(myTagProperty->getDefaultStringValue(key), myTagProperty->getTagStr(), id, departSpeed, departSpeedProcedure, error);
605
// unset parameter
606
parametersSet &= ~VEHPARS_DEPARTSPEED_SET;
607
}
608
break;
609
case SUMO_ATTR_ARRIVALLANE:
610
if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {
611
parseArrivalLane(value, myTagProperty->getTagStr(), id, arrivalLane, arrivalLaneProcedure, error);
612
// mark parameter as set
613
parametersSet |= VEHPARS_ARRIVALLANE_SET;
614
} else {
615
// set default value
616
parseArrivalLane(myTagProperty->getDefaultStringValue(key), myTagProperty->getTagStr(), id, arrivalLane, arrivalLaneProcedure, error);
617
// unset parameter
618
parametersSet &= ~VEHPARS_ARRIVALLANE_SET;
619
}
620
break;
621
case SUMO_ATTR_ARRIVALPOS:
622
if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {
623
parseArrivalPos(value, myTagProperty->getTagStr(), id, arrivalPos, arrivalPosProcedure, error);
624
// mark parameter as set
625
parametersSet |= VEHPARS_ARRIVALPOS_SET;
626
} else {
627
// set default value
628
parseArrivalPos(myTagProperty->getDefaultStringValue(key), myTagProperty->getTagStr(), id, arrivalPos, arrivalPosProcedure, error);
629
// unset parameter
630
parametersSet &= ~VEHPARS_ARRIVALPOS_SET;
631
}
632
// update geometry (except for template)
633
if (getParentAdditionals().size() > 0) {
634
updateGeometry();
635
}
636
break;
637
case SUMO_ATTR_ARRIVALSPEED:
638
if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {
639
parseArrivalSpeed(value, myTagProperty->getTagStr(), id, arrivalSpeed, arrivalSpeedProcedure, error);
640
// mark parameter as set
641
parametersSet |= VEHPARS_ARRIVALSPEED_SET;
642
} else {
643
// set default value
644
parseArrivalSpeed(myTagProperty->getDefaultStringValue(key), myTagProperty->getTagStr(), id, arrivalSpeed, arrivalSpeedProcedure, error);
645
// unset parameter
646
parametersSet &= ~VEHPARS_ARRIVALSPEED_SET;
647
}
648
break;
649
case SUMO_ATTR_LINE:
650
if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {
651
line = value;
652
// mark parameter as set
653
parametersSet |= VEHPARS_LINE_SET;
654
} else {
655
// set default value
656
line = myTagProperty->getDefaultStringValue(key);
657
// unset parameter
658
parametersSet &= ~VEHPARS_LINE_SET;
659
}
660
break;
661
case SUMO_ATTR_PERSON_NUMBER:
662
if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {
663
personNumber = parse<int>(value);
664
// mark parameter as set
665
parametersSet |= VEHPARS_PERSON_NUMBER_SET;
666
} else {
667
// set default value
668
personNumber = myTagProperty->getDefaultIntValue(key);
669
// unset parameter
670
parametersSet &= ~VEHPARS_PERSON_NUMBER_SET;
671
}
672
break;
673
case SUMO_ATTR_CONTAINER_NUMBER:
674
if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {
675
containerNumber = parse<int>(value);
676
// mark parameter as set
677
parametersSet |= VEHPARS_CONTAINER_NUMBER_SET;
678
} else {
679
// set default value
680
containerNumber = myTagProperty->getDefaultIntValue(key);
681
// unset parameter
682
parametersSet &= ~VEHPARS_CONTAINER_NUMBER_SET;
683
}
684
break;
685
case SUMO_ATTR_REROUTE:
686
if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {
687
// mark parameter as set
688
parametersSet |= VEHPARS_ROUTE_SET;
689
} else {
690
// unset parameter
691
parametersSet &= ~VEHPARS_ROUTE_SET;
692
}
693
break;
694
case SUMO_ATTR_DEPARTPOS_LAT:
695
if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {
696
parseDepartPosLat(value, myTagProperty->getTagStr(), id, departPosLat, departPosLatProcedure, error);
697
// mark parameter as set
698
parametersSet |= VEHPARS_DEPARTPOSLAT_SET;
699
} else {
700
// set default value
701
parseDepartPosLat(myTagProperty->getDefaultStringValue(key), myTagProperty->getTagStr(), id, departPosLat, departPosLatProcedure, error);
702
// unset parameter
703
parametersSet &= ~VEHPARS_DEPARTPOSLAT_SET;
704
}
705
break;
706
case SUMO_ATTR_ARRIVALPOS_LAT:
707
if (!value.empty() && (value != myTagProperty->getDefaultStringValue(key))) {
708
parseArrivalPosLat(value, myTagProperty->getTagStr(), id, arrivalPosLat, arrivalPosLatProcedure, error);
709
// mark parameter as set
710
parametersSet |= VEHPARS_ARRIVALPOSLAT_SET;
711
} else {
712
// set default value
713
parseArrivalPosLat(myTagProperty->getDefaultStringValue(key), myTagProperty->getTagStr(), id, arrivalPosLat, arrivalPosLatProcedure, error);
714
// unset parameter
715
parametersSet &= ~VEHPARS_ARRIVALPOSLAT_SET;
716
}
717
parseArrivalPosLat(value, myTagProperty->getTagStr(), id, arrivalPosLat, arrivalPosLatProcedure, error);
718
break;
719
case SUMO_ATTR_INSERTIONCHECKS:
720
insertionChecks = parseInsertionChecks(value);
721
break;
722
default:
723
setCommonAttribute(this, key, value);
724
break;
725
}
726
}
727
728
729
void
730
GNECalibratorFlow::setMoveShape(const GNEMoveResult& /*moveResult*/) {
731
// nothing to do
732
}
733
734
void
735
GNECalibratorFlow::commitMoveShape(const GNEMoveResult& /*moveResult*/, GNEUndoList* /*undoList*/) {
736
// nothing to do
737
}
738
739
740
void
741
GNECalibratorFlow::toggleAttribute(SumoXMLAttr key, const bool value) {
742
switch (key) {
743
case SUMO_ATTR_TYPE:
744
if (value) {
745
parametersSet |= VEHPARS_VTYPE_SET;
746
} else {
747
parametersSet &= ~VEHPARS_VTYPE_SET;
748
}
749
break;
750
case SUMO_ATTR_VEHSPERHOUR:
751
if (value) {
752
parametersSet |= VEHPARS_VPH_SET;
753
} else {
754
parametersSet &= ~VEHPARS_VPH_SET;
755
}
756
break;
757
case SUMO_ATTR_SPEED:
758
if (value) {
759
parametersSet |= VEHPARS_CALIBRATORSPEED_SET;
760
} else {
761
parametersSet &= ~VEHPARS_CALIBRATORSPEED_SET;
762
}
763
break;
764
default:
765
throw InvalidArgument(getTagStr() + " doesn't have an attribute of type '" + toString(key) + "'");
766
}
767
}
768
769
/****************************************************************************/
770
771