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