Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netedit/frames/demand/GNEStopFrame.cpp
169685 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 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
MFXGroupBoxModule(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});
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(), myStopParentBaseObject->hasStringAttribute(GNE_ATTR_DEMAND_FILE) ?
220
myStopParentBaseObject->getStringAttribute(GNE_ATTR_DEMAND_FILE) : "",
221
myViewNet->getViewParent()->getGNEAppWindows()->isUndoRedoAllowed());
222
// build stop
223
routeHandler.buildStop(myStopParentBaseObject->getSumoBaseObjectChildren().front(), myPlanParameters,
224
myStopParentBaseObject->getSumoBaseObjectChildren().front()->getStopParameter());
225
// show all trips
226
if (myStopTagSelector->getCurrentTemplateAC()->getTagProperty()->isVehicleStop()) {
227
myViewNet->getDemandViewOptions().menuCheckShowAllTrips->setChecked(TRUE);
228
} else {
229
myViewNet->getDemandViewOptions().menuCheckShowAllPersonPlans->setChecked(TRUE);
230
}
231
// stop successfully created, then return true
232
return true;
233
} else {
234
return false;
235
}
236
}
237
}
238
239
bool
240
GNEStopFrame::getStopParameter(const SumoXMLTag stopTag, const GNELane* lane, const GNEAdditional* stoppingPlace) {
241
// first clear containers
242
myStopParentBaseObject->clear();
243
myPlanParameters.clear();
244
// declare stop parameters
245
SUMOVehicleParameter::Stop stop;
246
// first check that current selected Stop is valid
247
if (stopTag == SUMO_TAG_NOTHING) {
248
WRITE_WARNING(TL("Current selected Stop type isn't valid."));
249
return false;
250
} else if ((stopTag == GNE_TAG_STOP_LANE) || (stopTag == GNE_TAG_WAYPOINT_LANE)) {
251
if (lane) {
252
stop.lane = lane->getID();
253
if ((stopTag == GNE_TAG_WAYPOINT_LANE) && (stop.speed == 0)) {
254
stop.speed = lane->getSpeed();
255
}
256
const Position viewPosSnapped = myViewNet->snapToActiveGrid(myViewNet->getPositionInformation());
257
const double mousePositionOverLane = lane->getLaneShape().nearest_offset_to_point2D(viewPosSnapped) / lane->getLengthGeometryFactor();
258
stop.startPos = mousePositionOverLane - 10;
259
if (stop.startPos < 0) {
260
stop.startPos = 0;
261
}
262
stop.parametersSet |= STOP_START_SET;
263
stop.endPos = mousePositionOverLane;
264
stop.parametersSet |= STOP_END_SET;
265
} else {
266
WRITE_WARNING("Click over a " + toString(SUMO_TAG_LANE) + " to create a stop placed in a " + toString(SUMO_TAG_LANE));
267
return false;
268
}
269
} else if ((stopTag == GNE_TAG_STOPPERSON_EDGE) || (stopTag == GNE_TAG_STOPCONTAINER_EDGE)) {
270
if (lane) {
271
stop.edge = lane->getParentEdge()->getID();
272
myPlanParameters.toEdge = stop.edge;
273
} else {
274
WRITE_WARNING("Click over a " + toString(SUMO_TAG_EDGE) + " to create a stop placed in a " + toString(SUMO_TAG_EDGE));
275
return false;
276
}
277
} else if (stoppingPlace) {
278
if (stoppingPlace->getTagProperty()->getTag() == SUMO_TAG_BUS_STOP) {
279
if ((stopTag != GNE_TAG_STOP_BUSSTOP) && (stopTag != GNE_TAG_WAYPOINT_BUSSTOP) && (stopTag != GNE_TAG_STOPPERSON_BUSSTOP)) {
280
WRITE_WARNING("Invalid clicked stopping place to create a stop placed in a " + stoppingPlace->getTagProperty()->getTagStr());
281
return false;
282
} else {
283
stop.busstop = stoppingPlace->getID();
284
myPlanParameters.toBusStop = stop.busstop;
285
if ((stopTag == GNE_TAG_WAYPOINT_BUSSTOP) && (stop.speed == 0)) {
286
stop.speed = stoppingPlace->getParentLanes().front()->getSpeed();
287
}
288
stop.startPos = 0;
289
stop.endPos = 0;
290
}
291
} else if (stoppingPlace->getTagProperty()->getTag() == SUMO_TAG_TRAIN_STOP) {
292
if ((stopTag != GNE_TAG_STOP_TRAINSTOP) && (stopTag != GNE_TAG_WAYPOINT_TRAINSTOP)) {
293
WRITE_WARNING("Invalid clicked stopping place to create a stop placed in a " + stoppingPlace->getTagProperty()->getTagStr());
294
return false;
295
} else {
296
stop.busstop = stoppingPlace->getID();
297
myPlanParameters.toTrainStop = stop.busstop;
298
if ((stopTag == GNE_TAG_WAYPOINT_TRAINSTOP) && (stop.speed == 0)) {
299
stop.speed = stoppingPlace->getParentLanes().front()->getSpeed();
300
}
301
stop.startPos = 0;
302
stop.endPos = 0;
303
}
304
} else if (stoppingPlace->getTagProperty()->getTag() == SUMO_TAG_CONTAINER_STOP) {
305
if ((stopTag != GNE_TAG_STOP_CONTAINERSTOP) && (stopTag != GNE_TAG_WAYPOINT_CONTAINERSTOP)) {
306
WRITE_WARNING("Invalid clicked stopping place to create a stop placed in a " + stoppingPlace->getTagProperty()->getTagStr());
307
return false;
308
} else {
309
stop.containerstop = stoppingPlace->getID();
310
myPlanParameters.toContainerStop = stop.containerstop;
311
if ((stopTag == GNE_TAG_WAYPOINT_CONTAINERSTOP) && (stop.speed == 0)) {
312
stop.speed = stoppingPlace->getParentLanes().front()->getSpeed();
313
}
314
stop.startPos = 0;
315
stop.endPos = 0;
316
}
317
} else if (stoppingPlace->getTagProperty()->getTag() == SUMO_TAG_CHARGING_STATION) {
318
if ((stopTag != GNE_TAG_STOP_CHARGINGSTATION) && (stopTag != GNE_TAG_WAYPOINT_CHARGINGSTATION)) {
319
WRITE_WARNING("Invalid clicked stopping place to create a stop placed in a " + stoppingPlace->getTagProperty()->getTagStr());
320
return false;
321
} else {
322
stop.chargingStation = stoppingPlace->getID();
323
myPlanParameters.toChargingStation = stop.chargingStation;
324
if ((stopTag == GNE_TAG_WAYPOINT_CHARGINGSTATION) && (stop.speed == 0)) {
325
stop.speed = stoppingPlace->getParentLanes().front()->getSpeed();
326
}
327
stop.startPos = 0;
328
stop.endPos = 0;
329
}
330
} else if (stoppingPlace->getTagProperty()->getTag() == SUMO_TAG_PARKING_AREA) {
331
if ((stopTag != GNE_TAG_STOP_PARKINGAREA) && (stopTag != GNE_TAG_WAYPOINT_PARKINGAREA)) {
332
WRITE_WARNING("Invalid clicked stopping place to create a stop placed in a " + stoppingPlace->getTagProperty()->getTagStr());
333
return false;
334
} else {
335
stop.parkingarea = stoppingPlace->getID();
336
myPlanParameters.toParkingArea = stop.parkingarea;
337
if ((stopTag == GNE_TAG_WAYPOINT_PARKINGAREA) && (stop.speed == 0)) {
338
stop.speed = stoppingPlace->getParentLanes().front()->getSpeed();
339
}
340
stop.startPos = 0;
341
stop.endPos = 0;
342
}
343
}
344
} else {
345
if ((stopTag == GNE_TAG_STOP_BUSSTOP) || (stopTag == GNE_TAG_WAYPOINT_BUSSTOP)) {
346
WRITE_WARNING("Click over a " + toString(GNE_TAG_STOP_BUSSTOP) + " to create a stop placed in a " + toString(GNE_TAG_STOP_BUSSTOP));
347
} else if ((stopTag == GNE_TAG_STOP_TRAINSTOP) || (stopTag == GNE_TAG_WAYPOINT_TRAINSTOP)) {
348
WRITE_WARNING("Click over a " + toString(GNE_TAG_STOP_TRAINSTOP) + " to create a stop placed in a " + toString(GNE_TAG_STOP_TRAINSTOP));
349
} else if ((stopTag == GNE_TAG_STOP_CONTAINERSTOP) || (stopTag == GNE_TAG_WAYPOINT_CONTAINERSTOP)) {
350
WRITE_WARNING("Click over a " + toString(SUMO_TAG_CONTAINER_STOP) + " to create a stop placed in a " + toString(SUMO_TAG_CONTAINER_STOP));
351
} else if ((stopTag == GNE_TAG_STOP_CHARGINGSTATION) || (stopTag == GNE_TAG_WAYPOINT_CHARGINGSTATION)) {
352
WRITE_WARNING("Click over a " + toString(SUMO_TAG_CHARGING_STATION) + " to create a stop placed in a " + toString(SUMO_TAG_CHARGING_STATION));
353
} else if ((stopTag == GNE_TAG_STOP_PARKINGAREA) || (stopTag == GNE_TAG_WAYPOINT_PARKINGAREA)) {
354
WRITE_WARNING("Click over a " + toString(SUMO_TAG_PARKING_AREA) + " to create a stop placed in a " + toString(SUMO_TAG_PARKING_AREA));
355
} else if (stopTag == GNE_TAG_STOPPERSON_BUSSTOP) {
356
WRITE_WARNING("Click over a " + toString(GNE_TAG_STOP_BUSSTOP) + " to create a person stop placed in a " + toString(GNE_TAG_STOP_BUSSTOP));
357
} else if (stopTag == GNE_TAG_STOPPERSON_TRAINSTOP) {
358
WRITE_WARNING("Click over a " + toString(GNE_TAG_STOP_TRAINSTOP) + " to create a person stop placed in a " + toString(GNE_TAG_STOP_TRAINSTOP));
359
}
360
return false;
361
}
362
// check if stop attributes are valid
363
if (!myAttributesEditor->checkAttributes(true)) {
364
return false;
365
}
366
// get stop parent
367
const GNEDemandElement* stopParent = myStopParentSelector->getCurrentDemandElement();
368
// if stopParent is a route, check that stop is placed over a route's edge
369
if (stopParent->isRoute() && lane) {
370
bool found = false;
371
for (const auto& edge : stopParent->getParentEdges()) {
372
if (edge == lane->getParentEdge()) {
373
found = true;
374
}
375
}
376
if (!found) {
377
WRITE_WARNING(TL("Stop must be placed over a route's edge"));
378
return false;
379
}
380
}
381
// same if stoParent is a vehicle/flow with embedded route
382
if (stopParent->getChildDemandElements().size() > 0 && stopParent->getChildDemandElements().front()->getTagProperty()->isRoute() && lane) {
383
bool found = false;
384
for (const auto& edge : stopParent->getChildDemandElements().front()->getParentEdges()) {
385
if (edge == lane->getParentEdge()) {
386
found = true;
387
}
388
}
389
if (!found) {
390
WRITE_WARNING(TL("Stop must be placed over an embedded route's edge"));
391
return false;
392
}
393
}
394
// set parent tag and id
395
myStopParentBaseObject->setTag(stopParent->getTagProperty()->getTag());
396
myStopParentBaseObject->addStringAttribute(SUMO_ATTR_ID, stopParent->getID());
397
// add route, from and to attributes
398
if (stopParent->getTagProperty()->hasAttribute(SUMO_ATTR_ROUTE)) {
399
myStopParentBaseObject->addStringAttribute(SUMO_ATTR_ROUTE, stopParent->getAttribute(SUMO_ATTR_ROUTE));
400
}
401
if (stopParent->getTagProperty()->hasAttribute(SUMO_ATTR_FROM)) {
402
myStopParentBaseObject->addStringAttribute(SUMO_ATTR_FROM, stopParent->getAttribute(SUMO_ATTR_FROM));
403
}
404
if (stopParent->getTagProperty()->hasAttribute(SUMO_ATTR_TO)) {
405
myStopParentBaseObject->addStringAttribute(SUMO_ATTR_TO, stopParent->getAttribute(SUMO_ATTR_TO));
406
}
407
// create stop object
408
CommonXMLStructure::SumoBaseObject* stopBaseObject = new CommonXMLStructure::SumoBaseObject(myStopParentBaseObject);
409
// get stop attributes
410
myAttributesEditor->fillSumoBaseObject(stopBaseObject);
411
// obtain friendly position
412
if (stopBaseObject->hasBoolAttribute(SUMO_ATTR_FRIENDLY_POS)) {
413
stop.friendlyPos = stopBaseObject->getBoolAttribute(SUMO_ATTR_FRIENDLY_POS);
414
}
415
// obtain posLat
416
if (stopBaseObject->hasStringAttribute(SUMO_ATTR_POSITION_LAT)) {
417
if (GNEAttributeCarrier::canParse<double>(stopBaseObject->getStringAttribute(SUMO_ATTR_POSITION_LAT))) {
418
stop.posLat = GNEAttributeCarrier::parse<double>(stopBaseObject->getStringAttribute(SUMO_ATTR_POSITION_LAT));
419
stop.parametersSet |= STOP_POSLAT_SET;
420
} else {
421
stop.posLat = INVALID_DOUBLE;
422
}
423
}
424
// obtain actType
425
if (stopBaseObject->hasStringAttribute(SUMO_ATTR_ACTTYPE)) {
426
stop.actType = stopBaseObject->getStringAttribute(SUMO_ATTR_ACTTYPE);
427
}
428
// fill rest of parameters depending if it was edited
429
if (stopBaseObject->hasTimeAttribute(SUMO_ATTR_DURATION)) {
430
stop.duration = stopBaseObject->getTimeAttribute(SUMO_ATTR_DURATION);
431
if (stop.duration >= 0) {
432
stop.parametersSet |= STOP_DURATION_SET;
433
}
434
}
435
if (stopBaseObject->hasTimeAttribute(SUMO_ATTR_UNTIL)) {
436
stop.until = stopBaseObject->getTimeAttribute(SUMO_ATTR_UNTIL);
437
if (stop.until >= 0) {
438
stop.parametersSet |= STOP_UNTIL_SET;
439
}
440
}
441
if (stopBaseObject->hasTimeAttribute(SUMO_ATTR_EXTENSION)) {
442
stop.extension = stopBaseObject->getTimeAttribute(SUMO_ATTR_EXTENSION);
443
if (stop.extension >= 0) {
444
stop.parametersSet |= STOP_EXTENSION_SET;
445
}
446
}
447
if (stopBaseObject->hasStringAttribute(SUMO_ATTR_TRIGGERED)) {
448
if ((stopBaseObject->getStringAttribute(SUMO_ATTR_TRIGGERED) == "person") || (stopBaseObject->getStringAttribute(SUMO_ATTR_TRIGGERED) == "true")) {
449
stop.parametersSet |= STOP_TRIGGER_SET;
450
stop.triggered = true;
451
} else if (stopBaseObject->getStringAttribute(SUMO_ATTR_TRIGGERED) == "container") {
452
stop.parametersSet |= STOP_CONTAINER_TRIGGER_SET;
453
stop.containerTriggered = true;
454
} else if (stopBaseObject->getStringAttribute(SUMO_ATTR_TRIGGERED) == "join") {
455
stop.parametersSet |= STOP_JOIN_SET;
456
stop.joinTriggered = true;
457
}
458
}
459
if (stopBaseObject->hasStringListAttribute(SUMO_ATTR_EXPECTED)) {
460
const auto expected = stopBaseObject->getStringListAttribute(SUMO_ATTR_EXPECTED);
461
if (expected.size() > 0) {
462
if (stop.triggered) {
463
for (const auto& id : expected) {
464
stop.awaitedPersons.insert(id);
465
}
466
stop.parametersSet |= STOP_EXPECTED_SET;
467
} else if (stop.containerTriggered) {
468
for (const auto& id : expected) {
469
stop.awaitedContainers.insert(id);
470
}
471
stop.parametersSet |= STOP_EXPECTED_CONTAINERS_SET;
472
}
473
}
474
}
475
if (stopBaseObject->hasStringAttribute(SUMO_ATTR_JOIN)) {
476
stop.join = stopBaseObject->getStringAttribute(SUMO_ATTR_JOIN);
477
if (stop.join.size() > 0) {
478
stop.parametersSet |= STOP_JOIN_SET;
479
}
480
}
481
if (stopBaseObject->hasStringListAttribute(SUMO_ATTR_PERMITTED)) {
482
const auto permitted = stopBaseObject->getStringListAttribute(SUMO_ATTR_PERMITTED);
483
if (permitted.size() > 0) {
484
stop.parametersSet |= STOP_PERMITTED_SET;
485
for (const auto& permit : permitted) {
486
stop.permitted.insert(permit);
487
}
488
}
489
}
490
if (stopBaseObject->hasStringAttribute(SUMO_ATTR_PARKING)) {
491
if (stopBaseObject->getStringAttribute(SUMO_ATTR_PARKING) == "true") {
492
stop.parking = ParkingType::ONROAD;
493
stop.parametersSet |= STOP_PARKING_SET;
494
} else if (stopBaseObject->getStringAttribute(SUMO_ATTR_PARKING) == "opportunistic") {
495
stop.parking = ParkingType::OPPORTUNISTIC;
496
stop.parametersSet |= STOP_PARKING_SET;
497
} else {
498
stop.parking = ParkingType::OFFROAD;
499
}
500
}
501
if (stopBaseObject->hasTimeAttribute(SUMO_ATTR_JUMP)) {
502
stop.jump = stopBaseObject->getTimeAttribute(SUMO_ATTR_JUMP);
503
if (stop.jump >= 0) {
504
stop.parametersSet |= STOP_JUMP_SET;
505
}
506
}
507
if (stopBaseObject->hasStringAttribute(SUMO_ATTR_SPLIT)) {
508
stop.split = stopBaseObject->getStringAttribute(SUMO_ATTR_SPLIT);
509
if (stop.split.size() > 0) {
510
stop.parametersSet |= STOP_SPLIT_SET;
511
}
512
}
513
if (stopBaseObject->hasStringAttribute(SUMO_ATTR_TRIP_ID)) {
514
stop.tripId = stopBaseObject->getStringAttribute(SUMO_ATTR_TRIP_ID);
515
if (stop.tripId.size() > 0) {
516
stop.parametersSet |= STOP_TRIP_ID_SET;
517
}
518
}
519
if (stopBaseObject->hasStringAttribute(SUMO_ATTR_LINE)) {
520
stop.line = stopBaseObject->getStringAttribute(SUMO_ATTR_LINE);
521
if (stop.line.size() > 0) {
522
stop.parametersSet |= STOP_LINE_SET;
523
}
524
}
525
if (stopBaseObject->hasBoolAttribute(SUMO_ATTR_ONDEMAND)) {
526
stop.onDemand = stopBaseObject->getBoolAttribute(SUMO_ATTR_ONDEMAND);
527
if (stop.onDemand) {
528
stop.parametersSet |= STOP_ONDEMAND_SET;
529
}
530
}
531
if (stopBaseObject->hasDoubleAttribute(SUMO_ATTR_SPEED) && (stopBaseObject->getDoubleAttribute(SUMO_ATTR_SPEED) > 0)) {
532
stop.speed = stopBaseObject->getDoubleAttribute(SUMO_ATTR_SPEED);
533
if (stop.speed > 0) {
534
stop.parametersSet |= STOP_SPEED_SET;
535
}
536
}
537
if (stopBaseObject->hasStringAttribute(SUMO_ATTR_INDEX)) {
538
if (stopBaseObject->getStringAttribute(SUMO_ATTR_INDEX) == "fit") {
539
stop.index = STOP_INDEX_FIT;
540
} else if (stopBaseObject->getStringAttribute(SUMO_ATTR_INDEX) == "end") {
541
stop.index = STOP_INDEX_END;
542
} else if (GNEAttributeCarrier::canParse<int>(stopBaseObject->getStringAttribute(SUMO_ATTR_INDEX))) {
543
stop.index = GNEAttributeCarrier::parse<int>(stopBaseObject->getStringAttribute(SUMO_ATTR_INDEX));
544
} else {
545
stop.index = STOP_INDEX_END;
546
}
547
} else {
548
stop.index = STOP_INDEX_END;
549
}
550
// refresh attributes editor
551
myAttributesEditor->refreshAttributesEditor();
552
// set tag
553
stopBaseObject->setTag(stopTag);
554
stopBaseObject->setStopParameter(stop);
555
return true;
556
}
557
558
559
GNEDemandElementSelector*
560
GNEStopFrame::getStopParentSelector() const {
561
return myStopParentSelector;
562
}
563
564
// ===========================================================================
565
// protected
566
// ===========================================================================
567
568
void
569
GNEStopFrame::tagSelected() {
570
if (myStopTagSelector->getCurrentTemplateAC()) {
571
// show Stop type selector module
572
myAttributesEditor->showAttributesEditor(myStopTagSelector->getCurrentTemplateAC(), true);
573
myHelpCreation->showHelpCreation();
574
} else {
575
// hide all modules if stop parent isn't valid
576
myAttributesEditor->hideAttributesEditor();
577
myHelpCreation->hideHelpCreation();
578
}
579
}
580
581
582
void
583
GNEStopFrame::demandElementSelected() {
584
// show or hide modules depending if current selected stop parent is valid
585
if (myStopParentSelector->getCurrentDemandElement()) {
586
myStopTagSelector->showTagSelector();
587
if (myStopTagSelector->getCurrentTemplateAC()) {
588
// show modules
589
myAttributesEditor->showAttributesEditor(myStopTagSelector->getCurrentTemplateAC(), true);
590
myHelpCreation->showHelpCreation();
591
} else {
592
myAttributesEditor->hideAttributesEditor();
593
myHelpCreation->hideHelpCreation();
594
}
595
} else {
596
// hide modules
597
myStopTagSelector->hideTagSelector();
598
myAttributesEditor->hideAttributesEditor();
599
myHelpCreation->hideHelpCreation();
600
}
601
}
602
603
/****************************************************************************/
604
605