Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netedit/frames/demand/GNEVehicleFrame.cpp
193904 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 GNEVehicleFrame.cpp
15
/// @author Pablo Alvarez Lopez
16
/// @date Jan 2018
17
///
18
// The Widget for add Vehicles/Flows/Trips/etc. elements
19
/****************************************************************************/
20
21
#include <netedit/GNEApplicationWindow.h>
22
#include <netedit/GNENet.h>
23
#include <netedit/GNEViewParent.h>
24
#include <netedit/elements/additional/GNETAZ.h>
25
#include <netedit/elements/demand/GNERouteHandler.h>
26
#include <netedit/frames/GNEAttributesEditor.h>
27
#include <netedit/frames/GNEDemandSelector.h>
28
#include <netedit/frames/GNEPathCreator.h>
29
#include <netedit/frames/GNEPathLegendModule.h>
30
#include <netedit/frames/GNETagSelector.h>
31
#include <utils/foxtools/MFXDynamicLabel.h>
32
#include <utils/gui/div/GUIDesigns.h>
33
#include <utils/vehicle/SUMOVehicleParserHelper.h>
34
#include <utils/xml/SUMOSAXAttributesImpl_Cached.h>
35
36
#include "GNEVehicleFrame.h"
37
38
// ===========================================================================
39
// method definitions
40
// ===========================================================================
41
42
// ---------------------------------------------------------------------------
43
// GNEVehicleFrame::HelpCreation - methods
44
// ---------------------------------------------------------------------------
45
46
GNEVehicleFrame::HelpCreation::HelpCreation(GNEVehicleFrame* vehicleFrameParent) :
47
GNEGroupBoxModule(vehicleFrameParent, TL("Help")),
48
myVehicleFrameParent(vehicleFrameParent) {
49
myInformationLabel = new MFXDynamicLabel(getCollapsableFrame(), "", 0, GUIDesignLabelFrameInformation);
50
}
51
52
53
GNEVehicleFrame::HelpCreation::~HelpCreation() {}
54
55
56
void
57
GNEVehicleFrame::HelpCreation::showHelpCreation() {
58
// first update help cration
59
updateHelpCreation();
60
// show modul
61
show();
62
}
63
64
65
void
66
GNEVehicleFrame::HelpCreation::hideHelpCreation() {
67
hide();
68
}
69
70
void
71
GNEVehicleFrame::HelpCreation::updateHelpCreation() {
72
// create information label
73
std::ostringstream information;
74
// set text depending of selected vehicle type
75
switch (myVehicleFrameParent->myVehicleTagSelector->getCurrentTemplateAC()->getTagProperty()->getTag()) {
76
// vehicles
77
case SUMO_TAG_VEHICLE:
78
information
79
<< "- " << TL("Click over a route to create a vehicle.");
80
break;
81
case SUMO_TAG_TRIP:
82
information
83
<< "- " << TL("Select two edges to create a trip.");
84
break;
85
case GNE_TAG_VEHICLE_WITHROUTE:
86
information
87
<< "- " << TL("Select two edges to create a vehicle with embedded route.");
88
break;
89
case GNE_TAG_TRIP_JUNCTIONS:
90
information
91
<< "- " << TL("Select two junctions to create a trip.");
92
break;
93
case GNE_TAG_TRIP_TAZS:
94
information
95
<< "- " << TL("Select two TAZS to create a trip.");
96
break;
97
// flows
98
case GNE_TAG_FLOW_ROUTE:
99
information
100
<< "- " << TL("Click over a route to create a routeFlow.");
101
break;
102
case SUMO_TAG_FLOW:
103
information
104
<< "- " << TL("Select two edges to create a flow.");
105
break;
106
case GNE_TAG_FLOW_WITHROUTE:
107
information
108
<< "- " << TL("Select two edges to create a flow with embedded route.");
109
break;
110
case GNE_TAG_FLOW_JUNCTIONS:
111
information
112
<< "- " << TL("Select two junctions to create a flow.");
113
break;
114
case GNE_TAG_FLOW_TAZS:
115
information
116
<< "- " << TL("Select two TAZs to create a flow.");
117
break;
118
default:
119
break;
120
}
121
// set information label
122
myInformationLabel->setText(information.str().c_str());
123
}
124
125
// ---------------------------------------------------------------------------
126
// GNEVehicleFrame - methods
127
// ---------------------------------------------------------------------------
128
129
GNEVehicleFrame::GNEVehicleFrame(GNEViewParent* viewParent, GNEViewNet* viewNet) :
130
GNEFrame(viewParent, viewNet, TL("Vehicles")),
131
myVehicleBaseObject(new CommonXMLStructure::SumoBaseObject(nullptr)) {
132
133
// Create item Selector module for vehicles
134
myVehicleTagSelector = new GNETagSelector(this, GNETagProperties::Type::VEHICLE, SUMO_TAG_TRIP);
135
136
// Create vehicle type selector and set DEFAULT_VTYPE_ID as default element
137
myTypeSelector = new GNEDemandElementSelector(this, SUMO_TAG_VTYPE, GNETagProperties::Type::VEHICLE);
138
139
// Create attributes editor
140
myVehicleAttributesEditor = new GNEAttributesEditor(this, GNEAttributesEditorType::EditorType::CREATOR);
141
142
// create GNEPathCreator Module
143
myPathCreator = new GNEPathCreator(this, viewNet->getNet()->getDemandPathManager());
144
145
// Create Help Creation Module
146
myHelpCreation = new HelpCreation(this);
147
148
// create legend label
149
myPathLegend = new GNEPathLegendModule(this);
150
}
151
152
153
GNEVehicleFrame::~GNEVehicleFrame() {
154
delete myVehicleBaseObject;
155
}
156
157
158
void
159
GNEVehicleFrame::show() {
160
// refresh tag selector
161
myVehicleTagSelector->refreshTagSelector();
162
// show frame
163
GNEFrame::show();
164
}
165
166
167
void
168
GNEVehicleFrame::hide() {
169
// reset edge candidates
170
for (const auto& edge : myViewNet->getNet()->getAttributeCarriers()->getEdges()) {
171
edge.second->resetCandidateFlags();
172
}
173
// reset junctioncandidates
174
for (const auto& junction : myViewNet->getNet()->getAttributeCarriers()->getJunctions()) {
175
junction.second->resetCandidateFlags();
176
}
177
// hide frame
178
GNEFrame::hide();
179
}
180
181
182
bool
183
GNEVehicleFrame::addVehicle(const GNEViewNetHelper::ViewObjectsSelector& viewObjects, const GNEViewNetHelper::MouseButtonKeyPressed& mouseButtonKeyPressed) {
184
// check template AC
185
if (myVehicleTagSelector->getCurrentTemplateAC() == nullptr) {
186
return false;
187
}
188
// begin cleaning vehicle base object
189
myVehicleBaseObject->clear();
190
// obtain tag (only for improve code legibility)
191
SumoXMLTag vehicleTag = myVehicleTagSelector->getCurrentTemplateAC()->getTagProperty()->getTag();
192
const bool addEdge = ((vehicleTag == SUMO_TAG_TRIP) || (vehicleTag == GNE_TAG_VEHICLE_WITHROUTE) || (vehicleTag == SUMO_TAG_FLOW) || (vehicleTag == GNE_TAG_FLOW_WITHROUTE));
193
const bool addJunction = ((vehicleTag == GNE_TAG_TRIP_JUNCTIONS) || (vehicleTag == GNE_TAG_FLOW_JUNCTIONS));
194
const bool addTAZ = ((vehicleTag == GNE_TAG_TRIP_TAZS) || (vehicleTag == GNE_TAG_FLOW_TAZS));
195
// first check that current selected vehicle is valid
196
if (vehicleTag == SUMO_TAG_NOTHING) {
197
myViewNet->setStatusBarText(TL("Current selected vehicle isn't valid."));
198
return false;
199
}
200
// now check if VType is valid
201
if (myTypeSelector->getCurrentDemandElement() == nullptr) {
202
myViewNet->setStatusBarText(TL("Current selected vehicle type isn't valid."));
203
return false;
204
}
205
// add VType
206
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_TYPE, myTypeSelector->getCurrentDemandElement()->getID());
207
// set route or edges depending of vehicle type
208
if (myVehicleTagSelector->getCurrentTemplateAC()->getTagProperty()->vehicleRoute()) {
209
return buildVehicleOverRoute(vehicleTag, viewObjects.getDemandElementFront());
210
} else if (addEdge && viewObjects.getEdgeFront()) {
211
// add clicked edge in GNEPathCreator
212
return myPathCreator->addEdge(viewObjects.getEdgeFront(), mouseButtonKeyPressed.shiftKeyPressed(), mouseButtonKeyPressed.controlKeyPressed());
213
} else if (addJunction && viewObjects.getJunctionFront()) {
214
// add clicked junction in GNEPathCreator
215
return myPathCreator->addJunction(viewObjects.getJunctionFront());
216
} else if (addTAZ && viewObjects.getTAZFront()) {
217
// add clicked TAZ in GNEPathCreator
218
return myPathCreator->addTAZ(viewObjects.getTAZFront());
219
} else {
220
return false;
221
}
222
}
223
224
225
GNETagSelector*
226
GNEVehicleFrame::getVehicleTagSelector() const {
227
return myVehicleTagSelector;
228
}
229
230
231
GNEDemandElementSelector*
232
GNEVehicleFrame::getTypeSelector() const {
233
return myTypeSelector;
234
}
235
236
237
GNEPathCreator*
238
GNEVehicleFrame::getPathCreator() const {
239
return myPathCreator;
240
}
241
242
243
GNEAttributesEditor*
244
GNEVehicleFrame::getVehicleAttributesEditor() const {
245
return myVehicleAttributesEditor;
246
}
247
248
// ===========================================================================
249
// protected
250
// ===========================================================================
251
252
void
253
GNEVehicleFrame::tagSelected() {
254
if (myVehicleTagSelector->getCurrentTemplateAC()) {
255
// show vehicle type selector modul
256
myTypeSelector->showDemandElementSelector();
257
// show path creator modul
258
myPathCreator->showPathCreatorModule(myVehicleTagSelector->getCurrentTemplateAC()->getTagProperty(), false);
259
// check if show path legend
260
if (myVehicleTagSelector->getCurrentTemplateAC()->getTagProperty()->vehicleRouteEmbedded()) {
261
myPathLegend->hidePathLegendModule();
262
} else {
263
myPathLegend->showPathLegendModule();
264
}
265
} else {
266
// hide all moduls if tag isn't valid
267
myTypeSelector->hideDemandElementSelector();
268
myVehicleAttributesEditor->hideAttributesEditor();
269
myPathCreator->hidePathCreatorModule();
270
myHelpCreation->hideHelpCreation();
271
myPathLegend->hidePathLegendModule();
272
}
273
}
274
275
276
void
277
GNEVehicleFrame::demandElementSelected() {
278
if (myTypeSelector->getCurrentDemandElement()) {
279
// show vehicle attributes modul
280
myVehicleAttributesEditor->showAttributesEditor(myVehicleTagSelector->getCurrentTemplateAC(), true);
281
// clear colors
282
myPathCreator->clearJunctionColors();
283
myPathCreator->clearEdgeColors();
284
// set current VTypeClass in pathCreator
285
myPathCreator->setVClass(myTypeSelector->getCurrentDemandElement()->getVClass());
286
// show path creator module
287
myPathCreator->showPathCreatorModule(myVehicleTagSelector->getCurrentTemplateAC()->getTagProperty(), false);
288
// show help creation
289
myHelpCreation->showHelpCreation();
290
} else {
291
// hide all moduls if selected item isn't valid
292
myVehicleAttributesEditor->hideAttributesEditor();
293
myPathCreator->hidePathCreatorModule();
294
myPathLegend->hidePathLegendModule();
295
myHelpCreation->hideHelpCreation();
296
}
297
}
298
299
300
bool
301
GNEVehicleFrame::createPath(const bool useLastRoute) {
302
// first check if parameters are valid
303
if (myVehicleAttributesEditor->checkAttributes(true) && myTypeSelector->getCurrentDemandElement()) {
304
// obtain tag (only for improve code legibility)
305
SumoXMLTag vehicleTag = myVehicleTagSelector->getCurrentTemplateAC()->getTagProperty()->getTag();
306
// begin cleaning vehicle base object
307
myVehicleBaseObject->clear();
308
// Updated myVehicleBaseObject
309
myVehicleAttributesEditor->fillSumoBaseObject(myVehicleBaseObject);
310
// add VType
311
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_TYPE, myTypeSelector->getCurrentDemandElement()->getID());
312
// declare route handler
313
GNERouteHandler routeHandler(myViewNet->getNet(), myViewNet->getNet()->getACTemplates()->getTemplateAC(vehicleTag)->getFileBucket(),
314
myViewNet->getViewParent()->getGNEAppWindows()->isUndoRedoAllowed(), true);
315
// check if use last route
316
if (useLastRoute) {
317
// build vehicle using last route
318
return buildVehicleOverRoute(vehicleTag, myViewNet->getLastCreatedRoute());
319
} else {
320
// extract via attribute
321
std::vector<std::string> viaEdges;
322
for (int i = 1; i < ((int)myPathCreator->getSelectedEdges().size() - 1); i++) {
323
viaEdges.push_back(myPathCreator->getSelectedEdges().at(i)->getID());
324
}
325
// continue depending of tag
326
if ((vehicleTag == SUMO_TAG_TRIP) && (myPathCreator->getSelectedEdges().size() > 0)) {
327
// set tag
328
myVehicleBaseObject->setTag(SUMO_TAG_TRIP);
329
// Add parameter departure
330
if (!myVehicleBaseObject->hasStringAttribute(SUMO_ATTR_DEPART) || myVehicleBaseObject->getStringAttribute(SUMO_ATTR_DEPART).empty()) {
331
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_DEPART, "0");
332
}
333
// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes
334
SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myVehicleBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(vehicleTag));
335
// obtain trip parameters
336
SUMOVehicleParameter* tripParameters = SUMOVehicleParserHelper::parseVehicleAttributes(vehicleTag, SUMOSAXAttrs, false);
337
tripParameters->setParameters(myVehicleBaseObject->getParameters());
338
// check trip parameters
339
if (tripParameters) {
340
myVehicleBaseObject->setVehicleParameter(tripParameters);
341
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_FROM, myPathCreator->getSelectedEdges().front()->getID());
342
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_TO, myPathCreator->getSelectedEdges().back()->getID());
343
myVehicleBaseObject->addStringListAttribute(SUMO_ATTR_VIA, viaEdges);
344
// parse vehicle
345
routeHandler.parseSumoBaseObject(myVehicleBaseObject);
346
// delete tripParameters and base object
347
delete tripParameters;
348
}
349
} else if ((vehicleTag == GNE_TAG_VEHICLE_WITHROUTE) && (myPathCreator->getPath().size() > 0)) {
350
// set tag
351
myVehicleBaseObject->setTag(SUMO_TAG_VEHICLE);
352
// Add parameter departure
353
if (!myVehicleBaseObject->hasStringAttribute(SUMO_ATTR_DEPART) || myVehicleBaseObject->getStringAttribute(SUMO_ATTR_DEPART).empty()) {
354
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_DEPART, "0");
355
}
356
// get route edges
357
std::vector<std::string> routeEdges;
358
for (const auto& subPath : myPathCreator->getPath()) {
359
for (const auto& edge : subPath.getSubPath()) {
360
routeEdges.push_back(edge->getID());
361
}
362
}
363
// avoid consecutive duplicated edges
364
routeEdges.erase(std::unique(routeEdges.begin(), routeEdges.end()), routeEdges.end());
365
// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes
366
SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myVehicleBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(vehicleTag));
367
// obtain vehicle parameters
368
SUMOVehicleParameter* vehicleParameters = SUMOVehicleParserHelper::parseVehicleAttributes(vehicleTag, SUMOSAXAttrs, false);
369
vehicleParameters->setParameters(myVehicleBaseObject->getParameters());
370
// continue depending of vehicleParameters
371
if (vehicleParameters) {
372
myVehicleBaseObject->setVehicleParameter(vehicleParameters);
373
// create route base object
374
CommonXMLStructure::SumoBaseObject* embeddedRouteObject = new CommonXMLStructure::SumoBaseObject(myVehicleBaseObject);
375
embeddedRouteObject->setTag(SUMO_TAG_ROUTE);
376
embeddedRouteObject->addStringListAttribute(SUMO_ATTR_EDGES, routeEdges);
377
embeddedRouteObject->addColorAttribute(SUMO_ATTR_COLOR, RGBColor::INVISIBLE);
378
embeddedRouteObject->addIntAttribute(SUMO_ATTR_REPEAT, 0);
379
embeddedRouteObject->addTimeAttribute(SUMO_ATTR_CYCLETIME, 0);
380
embeddedRouteObject->addDoubleAttribute(SUMO_ATTR_PROB, 1.0);
381
// parse route
382
routeHandler.parseSumoBaseObject(myVehicleBaseObject);
383
// delete vehicleParamters
384
delete vehicleParameters;
385
}
386
} else if ((vehicleTag == SUMO_TAG_FLOW) && (myPathCreator->getSelectedEdges().size() > 0)) {
387
// set tag
388
myVehicleBaseObject->setTag(SUMO_TAG_FLOW);
389
// set flow attributes
390
updateFlowAttributes();
391
// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes
392
SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myVehicleBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(vehicleTag));
393
// obtain flow parameters
394
SUMOVehicleParameter* flowParameters = SUMOVehicleParserHelper::parseFlowAttributes(vehicleTag, SUMOSAXAttrs, false, true, 0, SUMOTime_MAX);
395
flowParameters->setParameters(myVehicleBaseObject->getParameters());
396
// check flowParameters
397
if (flowParameters) {
398
myVehicleBaseObject->setVehicleParameter(flowParameters);
399
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_FROM, myPathCreator->getSelectedEdges().front()->getID());
400
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_TO, myPathCreator->getSelectedEdges().back()->getID());
401
myVehicleBaseObject->addStringListAttribute(SUMO_ATTR_VIA, viaEdges);
402
// parse vehicle
403
routeHandler.parseSumoBaseObject(myVehicleBaseObject);
404
// delete flowParameters and base object
405
delete flowParameters;
406
}
407
} else if ((vehicleTag == GNE_TAG_FLOW_WITHROUTE) && (myPathCreator->getPath().size() > 0)) {
408
// set tag
409
myVehicleBaseObject->setTag(SUMO_TAG_FLOW);
410
// set flow attributes
411
updateFlowAttributes();
412
// get route edges
413
std::vector<std::string> routeEdges;
414
for (const auto& subPath : myPathCreator->getPath()) {
415
for (const auto& edge : subPath.getSubPath()) {
416
routeEdges.push_back(edge->getID());
417
}
418
}
419
// avoid consecutive duplicated edges
420
routeEdges.erase(std::unique(routeEdges.begin(), routeEdges.end()), routeEdges.end());
421
// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes
422
SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myVehicleBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(vehicleTag));
423
// obtain flow parameters
424
SUMOVehicleParameter* flowParameters = SUMOVehicleParserHelper::parseFlowAttributes(vehicleTag, SUMOSAXAttrs, false, true, 0, SUMOTime_MAX);
425
flowParameters->setParameters(myVehicleBaseObject->getParameters());
426
// continue depending of vehicleParameters
427
if (flowParameters) {
428
myVehicleBaseObject->setVehicleParameter(flowParameters);
429
// create under base object
430
CommonXMLStructure::SumoBaseObject* embeddedRouteObject = new CommonXMLStructure::SumoBaseObject(myVehicleBaseObject);
431
embeddedRouteObject->setTag(SUMO_TAG_ROUTE);
432
embeddedRouteObject->addStringListAttribute(SUMO_ATTR_EDGES, routeEdges);
433
embeddedRouteObject->addColorAttribute(SUMO_ATTR_COLOR, RGBColor::INVISIBLE);
434
embeddedRouteObject->addIntAttribute(SUMO_ATTR_REPEAT, 0);
435
embeddedRouteObject->addTimeAttribute(SUMO_ATTR_CYCLETIME, 0);
436
embeddedRouteObject->addDoubleAttribute(SUMO_ATTR_PROB, 1.0);
437
// parse route
438
routeHandler.parseSumoBaseObject(myVehicleBaseObject);
439
// delete vehicleParamters
440
delete flowParameters;
441
}
442
} else if ((vehicleTag == GNE_TAG_TRIP_JUNCTIONS) && (myPathCreator->getSelectedJunctions().size() > 0)) {
443
// set tag
444
myVehicleBaseObject->setTag(SUMO_TAG_TRIP);
445
// Add parameter departure
446
if (!myVehicleBaseObject->hasStringAttribute(SUMO_ATTR_DEPART) || myVehicleBaseObject->getStringAttribute(SUMO_ATTR_DEPART).empty()) {
447
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_DEPART, "0");
448
}
449
// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes
450
SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myVehicleBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(vehicleTag));
451
// obtain trip parameters
452
SUMOVehicleParameter* tripParameters = SUMOVehicleParserHelper::parseVehicleAttributes(vehicleTag, SUMOSAXAttrs, false);
453
tripParameters->setParameters(myVehicleBaseObject->getParameters());
454
// check trip parameters
455
if (tripParameters) {
456
myVehicleBaseObject->setVehicleParameter(tripParameters);
457
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_FROM_JUNCTION, myPathCreator->getSelectedJunctions().front()->getID());
458
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_TO_JUNCTION, myPathCreator->getSelectedJunctions().back()->getID());
459
// parse vehicle
460
routeHandler.parseSumoBaseObject(myVehicleBaseObject);
461
// delete tripParameters and base object
462
delete tripParameters;
463
}
464
} else if ((vehicleTag == GNE_TAG_TRIP_TAZS) && (myPathCreator->getSelectedTAZs().size() > 0)) {
465
// set tag
466
myVehicleBaseObject->setTag(SUMO_TAG_TRIP);
467
// Add parameter departure
468
if (!myVehicleBaseObject->hasStringAttribute(SUMO_ATTR_DEPART) || myVehicleBaseObject->getStringAttribute(SUMO_ATTR_DEPART).empty()) {
469
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_DEPART, "0");
470
}
471
// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes
472
SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myVehicleBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(vehicleTag));
473
// obtain trip parameters
474
SUMOVehicleParameter* tripParameters = SUMOVehicleParserHelper::parseVehicleAttributes(vehicleTag, SUMOSAXAttrs, false);
475
tripParameters->setParameters(myVehicleBaseObject->getParameters());
476
// check trip parameters
477
if (tripParameters) {
478
myVehicleBaseObject->setVehicleParameter(tripParameters);
479
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_FROM_TAZ, myPathCreator->getSelectedTAZs().front()->getID());
480
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_TO_TAZ, myPathCreator->getSelectedTAZs().back()->getID());
481
// parse vehicle
482
routeHandler.parseSumoBaseObject(myVehicleBaseObject);
483
// delete tripParameters and base object
484
delete tripParameters;
485
}
486
} else if ((vehicleTag == GNE_TAG_FLOW_JUNCTIONS) && (myPathCreator->getSelectedJunctions().size() > 0)) {
487
// set tag
488
myVehicleBaseObject->setTag(SUMO_TAG_FLOW);
489
// set flow attributes
490
updateFlowAttributes();
491
// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes
492
SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myVehicleBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(vehicleTag));
493
// obtain flow parameters
494
SUMOVehicleParameter* flowParameters = SUMOVehicleParserHelper::parseFlowAttributes(vehicleTag, SUMOSAXAttrs, false, true, 0, SUMOTime_MAX);
495
flowParameters->setParameters(myVehicleBaseObject->getParameters());
496
// check flowParameters
497
if (flowParameters) {
498
myVehicleBaseObject->setVehicleParameter(flowParameters);
499
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_FROM_JUNCTION, myPathCreator->getSelectedJunctions().front()->getID());
500
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_TO_JUNCTION, myPathCreator->getSelectedJunctions().back()->getID());
501
// parse vehicle
502
routeHandler.parseSumoBaseObject(myVehicleBaseObject);
503
// delete flowParameters and base object
504
delete flowParameters;
505
}
506
} else if ((vehicleTag == GNE_TAG_FLOW_TAZS) && (myPathCreator->getSelectedTAZs().size() > 0)) {
507
// set tag
508
myVehicleBaseObject->setTag(SUMO_TAG_FLOW);
509
// set flow attributes
510
updateFlowAttributes();
511
// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes
512
SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myVehicleBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(vehicleTag));
513
// obtain flow parameters
514
SUMOVehicleParameter* flowParameters = SUMOVehicleParserHelper::parseFlowAttributes(vehicleTag, SUMOSAXAttrs, false, true, 0, SUMOTime_MAX);
515
flowParameters->setParameters(myVehicleBaseObject->getParameters());
516
// check flowParameters
517
if (flowParameters) {
518
myVehicleBaseObject->setVehicleParameter(flowParameters);
519
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_FROM_TAZ, myPathCreator->getSelectedTAZs().front()->getID());
520
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_TO_TAZ, myPathCreator->getSelectedTAZs().back()->getID());
521
// parse vehicle
522
routeHandler.parseSumoBaseObject(myVehicleBaseObject);
523
// delete flowParameters and base object
524
delete flowParameters;
525
}
526
}
527
// abort path creation
528
myPathCreator->abortPathCreation();
529
// refresh attributes editor
530
myVehicleAttributesEditor->refreshAttributesEditor();
531
return true;
532
}
533
}
534
return false;
535
}
536
537
538
bool
539
GNEVehicleFrame::buildVehicleOverRoute(SumoXMLTag vehicleTag, GNEDemandElement* route) {
540
if (route && (route->getTagProperty()->isRoute())) {
541
// now check if parameters are valid
542
if (!myVehicleAttributesEditor->checkAttributes(true)) {
543
return false;
544
}
545
// get vehicle attributes
546
myVehicleAttributesEditor->fillSumoBaseObject(myVehicleBaseObject);
547
// declare route handler
548
GNERouteHandler routeHandler(myViewNet->getNet(), route->getFileBucket(),
549
myViewNet->getViewParent()->getGNEAppWindows()->isUndoRedoAllowed(), true);
550
// check if departLane is valid
551
if ((route->getTagProperty()->getTag() == SUMO_TAG_ROUTE) && myVehicleBaseObject->hasStringAttribute(SUMO_ATTR_DEPARTLANE) &&
552
GNEAttributeCarrier::canParse<int>(myVehicleBaseObject->getStringAttribute(SUMO_ATTR_DEPARTLANE))) {
553
const int departLane = GNEAttributeCarrier::parse<int>(myVehicleBaseObject->getStringAttribute(SUMO_ATTR_DEPARTLANE));
554
if (departLane >= (int)route->getParentEdges().front()->getChildLanes().size()) {
555
myViewNet->setStatusBarText("Invalid " + toString(SUMO_ATTR_DEPARTLANE));
556
return false;
557
}
558
}
559
// check if departSpeed is valid
560
if (myVehicleBaseObject->hasStringAttribute(SUMO_ATTR_DEPARTSPEED) && GNEAttributeCarrier::canParse<double>(myVehicleBaseObject->getStringAttribute(SUMO_ATTR_DEPARTSPEED))) {
561
double departSpeed = GNEAttributeCarrier::parse<double>(myVehicleBaseObject->getStringAttribute(SUMO_ATTR_DEPARTSPEED));
562
if (departSpeed >= myTypeSelector->getCurrentDemandElement()->getAttributeDouble(SUMO_ATTR_MAXSPEED)) {
563
myViewNet->setStatusBarText("Invalid " + toString(SUMO_ATTR_DEPARTSPEED));
564
return false;
565
}
566
}
567
// check if we're creating a vehicle or a flow
568
if (vehicleTag == SUMO_TAG_VEHICLE) {
569
// set tag
570
myVehicleBaseObject->setTag(SUMO_TAG_VEHICLE);
571
// Add parameter departure
572
if (!myVehicleBaseObject->hasStringAttribute(SUMO_ATTR_DEPART) || myVehicleBaseObject->getStringAttribute(SUMO_ATTR_DEPART).empty()) {
573
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_DEPART, "0");
574
}
575
// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes
576
SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myVehicleBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(vehicleTag));
577
// obtain vehicle parameters in vehicleParameters
578
SUMOVehicleParameter* vehicleParameters = SUMOVehicleParserHelper::parseVehicleAttributes(vehicleTag, SUMOSAXAttrs, false);
579
vehicleParameters->setParameters(myVehicleBaseObject->getParameters());
580
// check if vehicle was successfully created)
581
if (vehicleParameters) {
582
vehicleParameters->routeid = route->getID();
583
myVehicleBaseObject->setVehicleParameter(vehicleParameters);
584
// parse vehicle
585
routeHandler.parseSumoBaseObject(myVehicleBaseObject);
586
// delete vehicleParameters and sumoBaseObject
587
delete vehicleParameters;
588
}
589
} else {
590
// set tag
591
myVehicleBaseObject->setTag(SUMO_TAG_FLOW);
592
// set flow attributes
593
updateFlowAttributes();
594
// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes
595
SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myVehicleBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(vehicleTag));
596
// obtain routeFlow parameters in routeFlowParameters
597
SUMOVehicleParameter* routeFlowParameters = SUMOVehicleParserHelper::parseFlowAttributes(vehicleTag, SUMOSAXAttrs, false, true, 0, SUMOTime_MAX);
598
routeFlowParameters->setParameters(myVehicleBaseObject->getParameters());
599
// check if flow was successfully created)
600
if (routeFlowParameters) {
601
routeFlowParameters->routeid = route->getID();
602
myVehicleBaseObject->setVehicleParameter(routeFlowParameters);
603
// parse flow
604
routeHandler.parseSumoBaseObject(myVehicleBaseObject);
605
// delete vehicleParameters and sumoBaseObject
606
delete routeFlowParameters;
607
}
608
}
609
// center view after creation
610
const auto* vehicle = myViewNet->getNet()->getAttributeCarriers()->retrieveDemandElement(myVehicleBaseObject->getTag(), myVehicleBaseObject->getStringAttribute(SUMO_ATTR_ID), false);
611
if (vehicle && !myViewNet->getVisibleBoundary().around(vehicle->getPositionInView())) {
612
myViewNet->centerTo(vehicle->getPositionInView(), false);
613
}
614
// refresh attributes editor
615
myVehicleAttributesEditor->refreshAttributesEditor();
616
// all ok, then return true;
617
return true;
618
} else {
619
myViewNet->setStatusBarText(toString(vehicleTag) + " has to be placed within a route.");
620
return false;
621
}
622
}
623
624
625
void
626
GNEVehicleFrame::updateFlowAttributes() {
627
// adjust poisson value
628
if (myVehicleBaseObject->hasDoubleAttribute(GNE_ATTR_POISSON)) {
629
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_PERIOD, "exp(" + toString(myVehicleBaseObject->getDoubleAttribute(GNE_ATTR_POISSON)) + ")");
630
}
631
}
632
633
/****************************************************************************/
634
635