Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netedit/frames/demand/GNEStopFrame.cpp
193772 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 GNEStopFrame.cpp
15
/// @author Pablo Alvarez Lopez
16
/// @date March 2019
17
///
18
// The Widget for add Stops elements
19
/****************************************************************************/
20
21
#include <netedit/GNEApplicationWindow.h>
22
#include <netedit/GNENet.h>
23
#include <netedit/GNEViewParent.h>
24
#include <netedit/elements/demand/GNERouteHandler.h>
25
#include <netedit/frames/GNEAttributesEditor.h>
26
#include <netedit/frames/GNEDemandSelector.h>
27
#include <netedit/frames/GNETagSelector.h>
28
#include <utils/foxtools/MFXDynamicLabel.h>
29
#include <utils/gui/div/GUIDesigns.h>
30
31
#include "GNEStopFrame.h"
32
33
// ===========================================================================
34
// method definitions
35
// ===========================================================================
36
37
// ---------------------------------------------------------------------------
38
// GNEStopFrame::HelpCreation - methods
39
// ---------------------------------------------------------------------------
40
41
GNEStopFrame::HelpCreation::HelpCreation(GNEStopFrame* StopFrameParent) :
42
GNEGroupBoxModule(StopFrameParent, TL("Help")),
43
myStopFrameParent(StopFrameParent) {
44
myInformationLabel = new MFXDynamicLabel(getCollapsableFrame(), "", 0, GUIDesignLabelFrameInformation);
45
}
46
47
48
GNEStopFrame::HelpCreation::~HelpCreation() {}
49
50
51
void
52
GNEStopFrame::HelpCreation::showHelpCreation() {
53
// first update help creation
54
updateHelpCreation();
55
// show module
56
show();
57
}
58
59
60
void
61
GNEStopFrame::HelpCreation::hideHelpCreation() {
62
hide();
63
}
64
65
66
void
67
GNEStopFrame::HelpCreation::updateHelpCreation() {
68
// create information label
69
std::ostringstream information;
70
// set text depending of selected Stop type
71
if (myStopFrameParent->myStopTagSelector->getCurrentTemplateAC()) {
72
switch (myStopFrameParent->myStopTagSelector->getCurrentTemplateAC()->getTagProperty()->getTag()) {
73
case GNE_TAG_STOP_BUSSTOP:
74
case GNE_TAG_WAYPOINT_BUSSTOP:
75
information
76
<< "- " << TL("Shift+Click to select parent") << "\n"
77
<< "- " << TL("Click over a bus stop to create a stop.");
78
break;
79
case GNE_TAG_STOP_TRAINSTOP:
80
case GNE_TAG_WAYPOINT_TRAINSTOP:
81
information
82
<< "- " << TL("Shift+Click to select parent") << "\n"
83
<< "- " << TL("Click over a train stop to create a stop.");
84
break;
85
case GNE_TAG_STOP_CONTAINERSTOP:
86
case GNE_TAG_WAYPOINT_CONTAINERSTOP:
87
information
88
<< "- " << TL("Shift+Click to select parent") << "\n"
89
<< "- " << TL("Click over a container stop to create a stop.");
90
break;
91
case GNE_TAG_STOP_CHARGINGSTATION:
92
case GNE_TAG_WAYPOINT_CHARGINGSTATION:
93
information
94
<< "- " << TL("Shift+Click to select parent") << "\n"
95
<< "- " << TL("Click over a charging station to create a stop.");
96
break;
97
case GNE_TAG_STOP_PARKINGAREA:
98
case GNE_TAG_WAYPOINT_PARKINGAREA:
99
information
100
<< "- " << TL("Shift+Click to select parent") << "\n"
101
<< "- " << TL("Click over a parking area to create a stop.");
102
break;
103
case GNE_TAG_STOP_LANE:
104
case GNE_TAG_WAYPOINT_LANE:
105
information
106
<< "- " << TL("Shift+Click to select parent") << "\n"
107
<< "- " << TL("Click over a lane to create a stop.");
108
break;
109
default:
110
information
111
<< "- " << TL("No stop parents in current network.");
112
break;
113
}
114
}
115
// set information label
116
myInformationLabel->setText(information.str().c_str());
117
}
118
119
// ---------------------------------------------------------------------------
120
// GNEStopFrame - methods
121
// ---------------------------------------------------------------------------
122
123
GNEStopFrame::GNEStopFrame(GNEViewParent* viewParent, GNEViewNet* viewNet) :
124
GNEFrame(viewParent, viewNet, TL("Stops")),
125
myStopParentBaseObject(new CommonXMLStructure::SumoBaseObject(nullptr)) {
126
127
// Create Stop parent selector
128
myStopParentSelector = new GNEDemandElementSelector(this, {GNETagProperties::Type::VEHICLE, GNETagProperties::Type::ROUTE}, {GNE_TAG_ROUTE_EMBEDDED});
129
130
// Create item Selector module for Stops
131
myStopTagSelector = new GNETagSelector(this, GNETagProperties::Type::STOP_VEHICLE, GNE_TAG_STOP_LANE);
132
133
// Create attributes editor
134
myAttributesEditor = new GNEAttributesEditor(this, GNEAttributesEditorType::EditorType::CREATOR);
135
136
// Create Help Creation Module
137
myHelpCreation = new HelpCreation(this);
138
139
// refresh myStopParentMatchBox
140
myStopParentSelector->refreshDemandElementSelector();
141
}
142
143
144
GNEStopFrame::~GNEStopFrame() {
145
delete myStopParentBaseObject;
146
}
147
148
149
void
150
GNEStopFrame::show() {
151
// first check if stop frame modules can be shown
152
bool validStopParent = false;
153
// check if at least there an item that supports an stop
154
for (auto i = myStopParentSelector->getAllowedTags().begin(); (i != myStopParentSelector->getAllowedTags().end()) && (validStopParent == false); i++) {
155
if (myViewNet->getNet()->getAttributeCarriers()->getDemandElements().at(*i).size() > 0) {
156
validStopParent = true;
157
}
158
}
159
// show or hide modules depending of validStopParent
160
if (validStopParent) {
161
// refresh tag selector
162
myStopTagSelector->refreshTagSelector();
163
// refresh vType selector
164
myStopParentSelector->refreshDemandElementSelector();
165
// refresh tag selector
166
myStopTagSelector->refreshTagSelector();
167
// show
168
myStopParentSelector->showDemandElementSelector();
169
myStopTagSelector->showTagSelector();
170
} else {
171
// hide modules (except help creation)
172
myStopParentSelector->hideDemandElementSelector();
173
myStopTagSelector->hideTagSelector();
174
myAttributesEditor->hideAttributesEditor();
175
// show help creation module
176
myHelpCreation->showHelpCreation();
177
}
178
// reset last position
179
myLastClickedPosition = Position::INVALID;
180
// show frame
181
GNEFrame::show();
182
}
183
184
185
bool
186
GNEStopFrame::addStop(const GNEViewNetHelper::ViewObjectsSelector& viewObjects, const GNEViewNetHelper::MouseButtonKeyPressed& mouseButtonKeyPressed) {
187
// first check stop type
188
if (myStopTagSelector->getCurrentTemplateAC() == nullptr) {
189
WRITE_WARNING(TL("Selected Stop type isn't valid."));
190
return false;
191
}
192
// check last position
193
if ((myViewNet->getPositionInformation() == myLastClickedPosition) && !myViewNet->getMouseButtonKeyPressed().shiftKeyPressed()) {
194
WRITE_WARNING(TL("Shift + click to create two additionals in the same position"));
195
return false;
196
}
197
// check if we're selecting a new stop parent
198
if (mouseButtonKeyPressed.shiftKeyPressed()) {
199
if (viewObjects.getDemandElementFront() &&
200
(viewObjects.getDemandElementFront()->getTagProperty()->isVehicle() || viewObjects.getDemandElementFront()->getTagProperty()->getTag() == SUMO_TAG_ROUTE)) {
201
myStopParentSelector->setDemandElement(viewObjects.getDemandElementFront());
202
WRITE_WARNINGF(TL("Selected % '%' as stop parent."), viewObjects.getDemandElementFront()->getTagStr(), viewObjects.getDemandElementFront()->getID());
203
return true;
204
} else {
205
WRITE_WARNING(TL("Selected Stop parent isn't valid."));
206
return false;
207
}
208
} else {
209
// now check if stop parent selector is valid
210
if (myStopParentSelector->getCurrentDemandElement() == nullptr) {
211
WRITE_WARNING(TL("Current selected Stop parent isn't valid."));
212
return false;
213
}
214
// create stop base object
215
getStopParameter(myStopTagSelector->getCurrentTemplateAC()->getTagProperty()->getTag(),
216
viewObjects.getLaneFront(), viewObjects.getAdditionalFront());
217
if (myStopParentBaseObject->getTag() != SUMO_TAG_NOTHING) {
218
// declare route handler
219
GNERouteHandler routeHandler(myViewNet->getNet(), myStopTagSelector->getCurrentTemplateAC()->getFileBucket(),
220
myViewNet->getViewParent()->getGNEAppWindows()->isUndoRedoAllowed(), true);
221
// build stop
222
routeHandler.buildStop(myStopParentBaseObject->getSumoBaseObjectChildren().front(), myPlanParameters,
223
myStopParentBaseObject->getSumoBaseObjectChildren().front()->getStopParameter());
224
// show all trips
225
if (myStopTagSelector->getCurrentTemplateAC()->getTagProperty()->isVehicleStop()) {
226
myViewNet->getDemandViewOptions().menuCheckShowAllTrips->setChecked(TRUE);
227
} else {
228
myViewNet->getDemandViewOptions().menuCheckShowAllPersonPlans->setChecked(TRUE);
229
}
230
// stop successfully created, then return true
231
return true;
232
} else {
233
return false;
234
}
235
}
236
}
237
238
bool
239
GNEStopFrame::getStopParameter(const SumoXMLTag stopTag, const GNELane* lane, const GNEAdditional* stoppingPlace) {
240
// first clear containers
241
myStopParentBaseObject->clear();
242
myPlanParameters.clear();
243
// declare stop parameters
244
SUMOVehicleParameter::Stop stop;
245
// first check that current selected Stop is valid
246
if (stopTag == SUMO_TAG_NOTHING) {
247
WRITE_WARNING(TL("Current selected Stop type isn't valid."));
248
return false;
249
} else if ((stopTag == GNE_TAG_STOP_LANE) || (stopTag == GNE_TAG_WAYPOINT_LANE)) {
250
if (lane) {
251
stop.lane = lane->getID();
252
if ((stopTag == GNE_TAG_WAYPOINT_LANE) && (stop.speed == 0)) {
253
stop.speed = lane->getSpeed();
254
}
255
const Position viewPosSnapped = myViewNet->snapToActiveGrid(myViewNet->getPositionInformation());
256
const double mousePositionOverLane = lane->getLaneShape().nearest_offset_to_point2D(viewPosSnapped) / lane->getLengthGeometryFactor();
257
stop.startPos = mousePositionOverLane - 10;
258
if (stop.startPos < 0) {
259
stop.startPos = 0;
260
}
261
stop.parametersSet |= STOP_START_SET;
262
stop.endPos = mousePositionOverLane;
263
stop.parametersSet |= STOP_END_SET;
264
} else {
265
WRITE_WARNING("Click over a " + toString(SUMO_TAG_LANE) + " to create a stop placed in a " + toString(SUMO_TAG_LANE));
266
return false;
267
}
268
} else if ((stopTag == GNE_TAG_STOPPERSON_EDGE) || (stopTag == GNE_TAG_STOPCONTAINER_EDGE)) {
269
if (lane) {
270
stop.edge = lane->getParentEdge()->getID();
271
myPlanParameters.toEdge = stop.edge;
272
} else {
273
WRITE_WARNING("Click over a " + toString(SUMO_TAG_EDGE) + " to create a stop placed in a " + toString(SUMO_TAG_EDGE));
274
return false;
275
}
276
} else if (stoppingPlace) {
277
if (stoppingPlace->getTagProperty()->getTag() == SUMO_TAG_BUS_STOP) {
278
if ((stopTag != GNE_TAG_STOP_BUSSTOP) && (stopTag != GNE_TAG_WAYPOINT_BUSSTOP) && (stopTag != GNE_TAG_STOPPERSON_BUSSTOP)) {
279
WRITE_WARNING("Invalid clicked stopping place to create a stop placed in a " + stoppingPlace->getTagProperty()->getTagStr());
280
return false;
281
} else {
282
stop.busstop = stoppingPlace->getID();
283
myPlanParameters.toBusStop = stop.busstop;
284
if ((stopTag == GNE_TAG_WAYPOINT_BUSSTOP) && (stop.speed == 0)) {
285
stop.speed = stoppingPlace->getParentLanes().front()->getSpeed();
286
}
287
stop.startPos = 0;
288
stop.endPos = 0;
289
}
290
} else if (stoppingPlace->getTagProperty()->getTag() == SUMO_TAG_TRAIN_STOP) {
291
if ((stopTag != GNE_TAG_STOP_TRAINSTOP) && (stopTag != GNE_TAG_WAYPOINT_TRAINSTOP)) {
292
WRITE_WARNING("Invalid clicked stopping place to create a stop placed in a " + stoppingPlace->getTagProperty()->getTagStr());
293
return false;
294
} else {
295
stop.busstop = stoppingPlace->getID();
296
myPlanParameters.toTrainStop = stop.busstop;
297
if ((stopTag == GNE_TAG_WAYPOINT_TRAINSTOP) && (stop.speed == 0)) {
298
stop.speed = stoppingPlace->getParentLanes().front()->getSpeed();
299
}
300
stop.startPos = 0;
301
stop.endPos = 0;
302
}
303
} else if (stoppingPlace->getTagProperty()->getTag() == SUMO_TAG_CONTAINER_STOP) {
304
if ((stopTag != GNE_TAG_STOP_CONTAINERSTOP) && (stopTag != GNE_TAG_WAYPOINT_CONTAINERSTOP)) {
305
WRITE_WARNING("Invalid clicked stopping place to create a stop placed in a " + stoppingPlace->getTagProperty()->getTagStr());
306
return false;
307
} else {
308
stop.containerstop = stoppingPlace->getID();
309
myPlanParameters.toContainerStop = stop.containerstop;
310
if ((stopTag == GNE_TAG_WAYPOINT_CONTAINERSTOP) && (stop.speed == 0)) {
311
stop.speed = stoppingPlace->getParentLanes().front()->getSpeed();
312
}
313
stop.startPos = 0;
314
stop.endPos = 0;
315
}
316
} else if (stoppingPlace->getTagProperty()->getTag() == SUMO_TAG_CHARGING_STATION) {
317
if ((stopTag != GNE_TAG_STOP_CHARGINGSTATION) && (stopTag != GNE_TAG_WAYPOINT_CHARGINGSTATION)) {
318
WRITE_WARNING("Invalid clicked stopping place to create a stop placed in a " + stoppingPlace->getTagProperty()->getTagStr());
319
return false;
320
} else {
321
stop.chargingStation = stoppingPlace->getID();
322
myPlanParameters.toChargingStation = stop.chargingStation;
323
if ((stopTag == GNE_TAG_WAYPOINT_CHARGINGSTATION) && (stop.speed == 0)) {
324
stop.speed = stoppingPlace->getParentLanes().front()->getSpeed();
325
}
326
stop.startPos = 0;
327
stop.endPos = 0;
328
}
329
} else if (stoppingPlace->getTagProperty()->getTag() == SUMO_TAG_PARKING_AREA) {
330
if ((stopTag != GNE_TAG_STOP_PARKINGAREA) && (stopTag != GNE_TAG_WAYPOINT_PARKINGAREA)) {
331
WRITE_WARNING("Invalid clicked stopping place to create a stop placed in a " + stoppingPlace->getTagProperty()->getTagStr());
332
return false;
333
} else {
334
stop.parkingarea = stoppingPlace->getID();
335
myPlanParameters.toParkingArea = stop.parkingarea;
336
if ((stopTag == GNE_TAG_WAYPOINT_PARKINGAREA) && (stop.speed == 0)) {
337
stop.speed = stoppingPlace->getParentLanes().front()->getSpeed();
338
}
339
stop.startPos = 0;
340
stop.endPos = 0;
341
}
342
}
343
} else {
344
if ((stopTag == GNE_TAG_STOP_BUSSTOP) || (stopTag == GNE_TAG_WAYPOINT_BUSSTOP)) {
345
WRITE_WARNING("Click over a " + toString(GNE_TAG_STOP_BUSSTOP) + " to create a stop placed in a " + toString(GNE_TAG_STOP_BUSSTOP));
346
} else if ((stopTag == GNE_TAG_STOP_TRAINSTOP) || (stopTag == GNE_TAG_WAYPOINT_TRAINSTOP)) {
347
WRITE_WARNING("Click over a " + toString(GNE_TAG_STOP_TRAINSTOP) + " to create a stop placed in a " + toString(GNE_TAG_STOP_TRAINSTOP));
348
} else if ((stopTag == GNE_TAG_STOP_CONTAINERSTOP) || (stopTag == GNE_TAG_WAYPOINT_CONTAINERSTOP)) {
349
WRITE_WARNING("Click over a " + toString(SUMO_TAG_CONTAINER_STOP) + " to create a stop placed in a " + toString(SUMO_TAG_CONTAINER_STOP));
350
} else if ((stopTag == GNE_TAG_STOP_CHARGINGSTATION) || (stopTag == GNE_TAG_WAYPOINT_CHARGINGSTATION)) {
351
WRITE_WARNING("Click over a " + toString(SUMO_TAG_CHARGING_STATION) + " to create a stop placed in a " + toString(SUMO_TAG_CHARGING_STATION));
352
} else if ((stopTag == GNE_TAG_STOP_PARKINGAREA) || (stopTag == GNE_TAG_WAYPOINT_PARKINGAREA)) {
353
WRITE_WARNING("Click over a " + toString(SUMO_TAG_PARKING_AREA) + " to create a stop placed in a " + toString(SUMO_TAG_PARKING_AREA));
354
} else if (stopTag == GNE_TAG_STOPPERSON_BUSSTOP) {
355
WRITE_WARNING("Click over a " + toString(GNE_TAG_STOP_BUSSTOP) + " to create a person stop placed in a " + toString(GNE_TAG_STOP_BUSSTOP));
356
} else if (stopTag == GNE_TAG_STOPPERSON_TRAINSTOP) {
357
WRITE_WARNING("Click over a " + toString(GNE_TAG_STOP_TRAINSTOP) + " to create a person stop placed in a " + toString(GNE_TAG_STOP_TRAINSTOP));
358
}
359
return false;
360
}
361
// check if stop attributes are valid
362
if (!myAttributesEditor->checkAttributes(true)) {
363
return false;
364
}
365
// get stop parent
366
const GNEDemandElement* stopParent = myStopParentSelector->getCurrentDemandElement();
367
// if stopParent is a route, check that stop is placed over a route's edge
368
if (stopParent->isRoute() && lane) {
369
bool found = false;
370
for (const auto& edge : stopParent->getParentEdges()) {
371
if (edge == lane->getParentEdge()) {
372
found = true;
373
}
374
}
375
if (!found) {
376
WRITE_WARNING(TL("Stop must be placed over a route's edge"));
377
return false;
378
}
379
}
380
// same if stoParent is a vehicle/flow with embedded route
381
if (stopParent->getChildDemandElements().size() > 0 && stopParent->getChildDemandElements().front()->getTagProperty()->isRoute() && lane) {
382
bool found = false;
383
for (const auto& edge : stopParent->getChildDemandElements().front()->getParentEdges()) {
384
if (edge == lane->getParentEdge()) {
385
found = true;
386
}
387
}
388
if (!found) {
389
WRITE_WARNING(TL("Stop must be placed over an embedded route's edge"));
390
return false;
391
}
392
}
393
// set parent tag and id
394
myStopParentBaseObject->setTag(stopParent->getTagProperty()->getTag());
395
myStopParentBaseObject->addStringAttribute(SUMO_ATTR_ID, stopParent->getID());
396
// add route, from and to attributes
397
if (stopParent->getTagProperty()->hasAttribute(SUMO_ATTR_ROUTE)) {
398
myStopParentBaseObject->addStringAttribute(SUMO_ATTR_ROUTE, stopParent->getAttribute(SUMO_ATTR_ROUTE));
399
}
400
if (stopParent->getTagProperty()->hasAttribute(SUMO_ATTR_FROM)) {
401
myStopParentBaseObject->addStringAttribute(SUMO_ATTR_FROM, stopParent->getAttribute(SUMO_ATTR_FROM));
402
}
403
if (stopParent->getTagProperty()->hasAttribute(SUMO_ATTR_TO)) {
404
myStopParentBaseObject->addStringAttribute(SUMO_ATTR_TO, stopParent->getAttribute(SUMO_ATTR_TO));
405
}
406
// create stop object
407
CommonXMLStructure::SumoBaseObject* stopBaseObject = new CommonXMLStructure::SumoBaseObject(myStopParentBaseObject);
408
// get stop attributes
409
myAttributesEditor->fillSumoBaseObject(stopBaseObject);
410
// obtain friendly position
411
if (stopBaseObject->hasBoolAttribute(SUMO_ATTR_FRIENDLY_POS)) {
412
stop.friendlyPos = stopBaseObject->getBoolAttribute(SUMO_ATTR_FRIENDLY_POS);
413
}
414
// obtain posLat
415
if (stopBaseObject->hasStringAttribute(SUMO_ATTR_POSITION_LAT)) {
416
if (GNEAttributeCarrier::canParse<double>(stopBaseObject->getStringAttribute(SUMO_ATTR_POSITION_LAT))) {
417
stop.posLat = GNEAttributeCarrier::parse<double>(stopBaseObject->getStringAttribute(SUMO_ATTR_POSITION_LAT));
418
stop.parametersSet |= STOP_POSLAT_SET;
419
} else {
420
stop.posLat = INVALID_DOUBLE;
421
}
422
}
423
// obtain actType
424
if (stopBaseObject->hasStringAttribute(SUMO_ATTR_ACTTYPE)) {
425
stop.actType = stopBaseObject->getStringAttribute(SUMO_ATTR_ACTTYPE);
426
}
427
// fill rest of parameters depending if it was edited
428
if (stopBaseObject->hasTimeAttribute(SUMO_ATTR_DURATION)) {
429
stop.duration = stopBaseObject->getTimeAttribute(SUMO_ATTR_DURATION);
430
if (stop.duration >= 0) {
431
stop.parametersSet |= STOP_DURATION_SET;
432
}
433
}
434
if (stopBaseObject->hasTimeAttribute(SUMO_ATTR_UNTIL)) {
435
stop.until = stopBaseObject->getTimeAttribute(SUMO_ATTR_UNTIL);
436
if (stop.until >= 0) {
437
stop.parametersSet |= STOP_UNTIL_SET;
438
}
439
}
440
if (stopBaseObject->hasTimeAttribute(SUMO_ATTR_EXTENSION)) {
441
stop.extension = stopBaseObject->getTimeAttribute(SUMO_ATTR_EXTENSION);
442
if (stop.extension >= 0) {
443
stop.parametersSet |= STOP_EXTENSION_SET;
444
}
445
}
446
if (stopBaseObject->hasStringAttribute(SUMO_ATTR_TRIGGERED)) {
447
if ((stopBaseObject->getStringAttribute(SUMO_ATTR_TRIGGERED) == "person") || (stopBaseObject->getStringAttribute(SUMO_ATTR_TRIGGERED) == "true")) {
448
stop.parametersSet |= STOP_TRIGGER_SET;
449
stop.triggered = true;
450
} else if (stopBaseObject->getStringAttribute(SUMO_ATTR_TRIGGERED) == "container") {
451
stop.parametersSet |= STOP_CONTAINER_TRIGGER_SET;
452
stop.containerTriggered = true;
453
} else if (stopBaseObject->getStringAttribute(SUMO_ATTR_TRIGGERED) == "join") {
454
stop.parametersSet |= STOP_JOIN_SET;
455
stop.joinTriggered = true;
456
}
457
}
458
if (stopBaseObject->hasStringListAttribute(SUMO_ATTR_EXPECTED)) {
459
const auto expected = stopBaseObject->getStringListAttribute(SUMO_ATTR_EXPECTED);
460
if (expected.size() > 0) {
461
if (stop.triggered) {
462
for (const auto& id : expected) {
463
stop.awaitedPersons.insert(id);
464
}
465
stop.parametersSet |= STOP_EXPECTED_SET;
466
} else if (stop.containerTriggered) {
467
for (const auto& id : expected) {
468
stop.awaitedContainers.insert(id);
469
}
470
stop.parametersSet |= STOP_EXPECTED_CONTAINERS_SET;
471
}
472
}
473
}
474
if (stopBaseObject->hasStringAttribute(SUMO_ATTR_JOIN)) {
475
stop.join = stopBaseObject->getStringAttribute(SUMO_ATTR_JOIN);
476
if (stop.join.size() > 0) {
477
stop.parametersSet |= STOP_JOIN_SET;
478
}
479
}
480
if (stopBaseObject->hasStringListAttribute(SUMO_ATTR_PERMITTED)) {
481
const auto permitted = stopBaseObject->getStringListAttribute(SUMO_ATTR_PERMITTED);
482
if (permitted.size() > 0) {
483
stop.parametersSet |= STOP_PERMITTED_SET;
484
for (const auto& permit : permitted) {
485
stop.permitted.insert(permit);
486
}
487
}
488
}
489
if (stopBaseObject->hasStringAttribute(SUMO_ATTR_PARKING)) {
490
if (stopBaseObject->getStringAttribute(SUMO_ATTR_PARKING) == "true") {
491
stop.parking = ParkingType::ONROAD;
492
stop.parametersSet |= STOP_PARKING_SET;
493
} else if (stopBaseObject->getStringAttribute(SUMO_ATTR_PARKING) == "opportunistic") {
494
stop.parking = ParkingType::OPPORTUNISTIC;
495
stop.parametersSet |= STOP_PARKING_SET;
496
} else {
497
stop.parking = ParkingType::OFFROAD;
498
}
499
}
500
if (stopBaseObject->hasTimeAttribute(SUMO_ATTR_JUMP)) {
501
stop.jump = stopBaseObject->getTimeAttribute(SUMO_ATTR_JUMP);
502
if (stop.jump >= 0) {
503
stop.parametersSet |= STOP_JUMP_SET;
504
}
505
}
506
if (stopBaseObject->hasStringAttribute(SUMO_ATTR_SPLIT)) {
507
stop.split = stopBaseObject->getStringAttribute(SUMO_ATTR_SPLIT);
508
if (stop.split.size() > 0) {
509
stop.parametersSet |= STOP_SPLIT_SET;
510
}
511
}
512
if (stopBaseObject->hasStringAttribute(SUMO_ATTR_TRIP_ID)) {
513
stop.tripId = stopBaseObject->getStringAttribute(SUMO_ATTR_TRIP_ID);
514
if (stop.tripId.size() > 0) {
515
stop.parametersSet |= STOP_TRIP_ID_SET;
516
}
517
}
518
if (stopBaseObject->hasStringAttribute(SUMO_ATTR_LINE)) {
519
stop.line = stopBaseObject->getStringAttribute(SUMO_ATTR_LINE);
520
if (stop.line.size() > 0) {
521
stop.parametersSet |= STOP_LINE_SET;
522
}
523
}
524
if (stopBaseObject->hasBoolAttribute(SUMO_ATTR_ONDEMAND)) {
525
stop.onDemand = stopBaseObject->getBoolAttribute(SUMO_ATTR_ONDEMAND);
526
if (stop.onDemand) {
527
stop.parametersSet |= STOP_ONDEMAND_SET;
528
}
529
}
530
if (stopBaseObject->hasDoubleAttribute(SUMO_ATTR_SPEED) && (stopBaseObject->getDoubleAttribute(SUMO_ATTR_SPEED) > 0)) {
531
stop.speed = stopBaseObject->getDoubleAttribute(SUMO_ATTR_SPEED);
532
if (stop.speed > 0) {
533
stop.parametersSet |= STOP_SPEED_SET;
534
}
535
}
536
if (stopBaseObject->hasStringAttribute(SUMO_ATTR_INDEX)) {
537
if (stopBaseObject->getStringAttribute(SUMO_ATTR_INDEX) == "fit") {
538
stop.index = STOP_INDEX_FIT;
539
} else if (stopBaseObject->getStringAttribute(SUMO_ATTR_INDEX) == "end") {
540
stop.index = STOP_INDEX_END;
541
} else if (GNEAttributeCarrier::canParse<int>(stopBaseObject->getStringAttribute(SUMO_ATTR_INDEX))) {
542
stop.index = GNEAttributeCarrier::parse<int>(stopBaseObject->getStringAttribute(SUMO_ATTR_INDEX));
543
} else {
544
stop.index = STOP_INDEX_END;
545
}
546
} else {
547
stop.index = STOP_INDEX_END;
548
}
549
// refresh attributes editor
550
myAttributesEditor->refreshAttributesEditor();
551
// set tag
552
stopBaseObject->setTag(stopTag);
553
stopBaseObject->setStopParameter(stop);
554
return true;
555
}
556
557
558
GNEDemandElementSelector*
559
GNEStopFrame::getStopParentSelector() const {
560
return myStopParentSelector;
561
}
562
563
// ===========================================================================
564
// protected
565
// ===========================================================================
566
567
void
568
GNEStopFrame::tagSelected() {
569
if (myStopTagSelector->getCurrentTemplateAC()) {
570
// show Stop type selector module
571
myAttributesEditor->showAttributesEditor(myStopTagSelector->getCurrentTemplateAC(), true);
572
myHelpCreation->showHelpCreation();
573
} else {
574
// hide all modules if stop parent isn't valid
575
myAttributesEditor->hideAttributesEditor();
576
myHelpCreation->hideHelpCreation();
577
}
578
}
579
580
581
void
582
GNEStopFrame::demandElementSelected() {
583
// show or hide modules depending if current selected stop parent is valid
584
if (myStopParentSelector->getCurrentDemandElement()) {
585
myStopTagSelector->showTagSelector();
586
if (myStopTagSelector->getCurrentTemplateAC()) {
587
// show modules
588
myAttributesEditor->showAttributesEditor(myStopTagSelector->getCurrentTemplateAC(), true);
589
myHelpCreation->showHelpCreation();
590
} else {
591
myAttributesEditor->hideAttributesEditor();
592
myHelpCreation->hideHelpCreation();
593
}
594
} else {
595
// hide modules
596
myStopTagSelector->hideTagSelector();
597
myAttributesEditor->hideAttributesEditor();
598
myHelpCreation->hideHelpCreation();
599
}
600
}
601
602
/****************************************************************************/
603
604