Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netedit/frames/demand/GNEVehicleFrame.cpp
169684 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2001-2025 German Aerospace Center (DLR) and others.
4
// This program and the accompanying materials are made available under the
5
// terms of the Eclipse Public License 2.0 which is available at
6
// https://www.eclipse.org/legal/epl-2.0/
7
// This Source Code may also be made available under the following Secondary
8
// Licenses when the conditions for such availability set forth in the Eclipse
9
// Public License 2.0 are satisfied: GNU General Public License, version 2
10
// or later which is available at
11
// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13
/****************************************************************************/
14
/// @file 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
MFXGroupBoxModule(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(), myVehicleBaseObject->hasStringAttribute(GNE_ATTR_DEMAND_FILE) ?
314
myVehicleBaseObject->getStringAttribute(GNE_ATTR_DEMAND_FILE) : "",
315
myViewNet->getViewParent()->getGNEAppWindows()->isUndoRedoAllowed());
316
// check if use last route
317
if (useLastRoute) {
318
// build vehicle using last route
319
return buildVehicleOverRoute(vehicleTag, myViewNet->getLastCreatedRoute());
320
} else {
321
// extract via attribute
322
std::vector<std::string> viaEdges;
323
for (int i = 1; i < ((int)myPathCreator->getSelectedEdges().size() - 1); i++) {
324
viaEdges.push_back(myPathCreator->getSelectedEdges().at(i)->getID());
325
}
326
// continue depending of tag
327
if ((vehicleTag == SUMO_TAG_TRIP) && (myPathCreator->getSelectedEdges().size() > 0)) {
328
// set tag
329
myVehicleBaseObject->setTag(SUMO_TAG_TRIP);
330
// Add parameter departure
331
if (!myVehicleBaseObject->hasStringAttribute(SUMO_ATTR_DEPART) || myVehicleBaseObject->getStringAttribute(SUMO_ATTR_DEPART).empty()) {
332
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_DEPART, "0");
333
}
334
// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes
335
SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myVehicleBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(vehicleTag));
336
// obtain trip parameters
337
SUMOVehicleParameter* tripParameters = SUMOVehicleParserHelper::parseVehicleAttributes(vehicleTag, SUMOSAXAttrs, false);
338
tripParameters->setParameters(myVehicleBaseObject->getParameters());
339
// check trip parameters
340
if (tripParameters) {
341
myVehicleBaseObject->setVehicleParameter(tripParameters);
342
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_FROM, myPathCreator->getSelectedEdges().front()->getID());
343
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_TO, myPathCreator->getSelectedEdges().back()->getID());
344
myVehicleBaseObject->addStringListAttribute(SUMO_ATTR_VIA, viaEdges);
345
// parse vehicle
346
routeHandler.parseSumoBaseObject(myVehicleBaseObject);
347
// delete tripParameters and base object
348
delete tripParameters;
349
}
350
} else if ((vehicleTag == GNE_TAG_VEHICLE_WITHROUTE) && (myPathCreator->getPath().size() > 0)) {
351
// set tag
352
myVehicleBaseObject->setTag(SUMO_TAG_VEHICLE);
353
// Add parameter departure
354
if (!myVehicleBaseObject->hasStringAttribute(SUMO_ATTR_DEPART) || myVehicleBaseObject->getStringAttribute(SUMO_ATTR_DEPART).empty()) {
355
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_DEPART, "0");
356
}
357
// get route edges
358
std::vector<std::string> routeEdges;
359
for (const auto& subPath : myPathCreator->getPath()) {
360
for (const auto& edge : subPath.getSubPath()) {
361
routeEdges.push_back(edge->getID());
362
}
363
}
364
// avoid consecutive duplicated edges
365
routeEdges.erase(std::unique(routeEdges.begin(), routeEdges.end()), routeEdges.end());
366
// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes
367
SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myVehicleBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(vehicleTag));
368
// obtain vehicle parameters
369
SUMOVehicleParameter* vehicleParameters = SUMOVehicleParserHelper::parseVehicleAttributes(vehicleTag, SUMOSAXAttrs, false);
370
vehicleParameters->setParameters(myVehicleBaseObject->getParameters());
371
// continue depending of vehicleParameters
372
if (vehicleParameters) {
373
myVehicleBaseObject->setVehicleParameter(vehicleParameters);
374
// create route base object
375
CommonXMLStructure::SumoBaseObject* embeddedRouteObject = new CommonXMLStructure::SumoBaseObject(myVehicleBaseObject);
376
embeddedRouteObject->setTag(SUMO_TAG_ROUTE);
377
embeddedRouteObject->addStringListAttribute(SUMO_ATTR_EDGES, routeEdges);
378
embeddedRouteObject->addColorAttribute(SUMO_ATTR_COLOR, RGBColor::INVISIBLE);
379
embeddedRouteObject->addIntAttribute(SUMO_ATTR_REPEAT, 0);
380
embeddedRouteObject->addTimeAttribute(SUMO_ATTR_CYCLETIME, 0);
381
embeddedRouteObject->addDoubleAttribute(SUMO_ATTR_PROB, 1.0);
382
// parse route
383
routeHandler.parseSumoBaseObject(myVehicleBaseObject);
384
// delete vehicleParamters
385
delete vehicleParameters;
386
}
387
} else if ((vehicleTag == SUMO_TAG_FLOW) && (myPathCreator->getSelectedEdges().size() > 0)) {
388
// set tag
389
myVehicleBaseObject->setTag(SUMO_TAG_FLOW);
390
// set flow attributes
391
updateFlowAttributes();
392
// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes
393
SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myVehicleBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(vehicleTag));
394
// obtain flow parameters
395
SUMOVehicleParameter* flowParameters = SUMOVehicleParserHelper::parseFlowAttributes(vehicleTag, SUMOSAXAttrs, false, true, 0, SUMOTime_MAX);
396
flowParameters->setParameters(myVehicleBaseObject->getParameters());
397
// check flowParameters
398
if (flowParameters) {
399
myVehicleBaseObject->setVehicleParameter(flowParameters);
400
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_FROM, myPathCreator->getSelectedEdges().front()->getID());
401
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_TO, myPathCreator->getSelectedEdges().back()->getID());
402
myVehicleBaseObject->addStringListAttribute(SUMO_ATTR_VIA, viaEdges);
403
// parse vehicle
404
routeHandler.parseSumoBaseObject(myVehicleBaseObject);
405
// delete flowParameters and base object
406
delete flowParameters;
407
}
408
} else if ((vehicleTag == GNE_TAG_FLOW_WITHROUTE) && (myPathCreator->getPath().size() > 0)) {
409
// set tag
410
myVehicleBaseObject->setTag(SUMO_TAG_FLOW);
411
// set flow attributes
412
updateFlowAttributes();
413
// get route edges
414
std::vector<std::string> routeEdges;
415
for (const auto& subPath : myPathCreator->getPath()) {
416
for (const auto& edge : subPath.getSubPath()) {
417
routeEdges.push_back(edge->getID());
418
}
419
}
420
// avoid consecutive duplicated edges
421
routeEdges.erase(std::unique(routeEdges.begin(), routeEdges.end()), routeEdges.end());
422
// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes
423
SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myVehicleBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(vehicleTag));
424
// obtain flow parameters
425
SUMOVehicleParameter* flowParameters = SUMOVehicleParserHelper::parseFlowAttributes(vehicleTag, SUMOSAXAttrs, false, true, 0, SUMOTime_MAX);
426
flowParameters->setParameters(myVehicleBaseObject->getParameters());
427
// continue depending of vehicleParameters
428
if (flowParameters) {
429
myVehicleBaseObject->setVehicleParameter(flowParameters);
430
// create under base object
431
CommonXMLStructure::SumoBaseObject* embeddedRouteObject = new CommonXMLStructure::SumoBaseObject(myVehicleBaseObject);
432
embeddedRouteObject->setTag(SUMO_TAG_ROUTE);
433
embeddedRouteObject->addStringListAttribute(SUMO_ATTR_EDGES, routeEdges);
434
embeddedRouteObject->addColorAttribute(SUMO_ATTR_COLOR, RGBColor::INVISIBLE);
435
embeddedRouteObject->addIntAttribute(SUMO_ATTR_REPEAT, 0);
436
embeddedRouteObject->addTimeAttribute(SUMO_ATTR_CYCLETIME, 0);
437
embeddedRouteObject->addDoubleAttribute(SUMO_ATTR_PROB, 1.0);
438
// parse route
439
routeHandler.parseSumoBaseObject(myVehicleBaseObject);
440
// delete vehicleParamters
441
delete flowParameters;
442
}
443
} else if ((vehicleTag == GNE_TAG_TRIP_JUNCTIONS) && (myPathCreator->getSelectedJunctions().size() > 0)) {
444
// set tag
445
myVehicleBaseObject->setTag(SUMO_TAG_TRIP);
446
// Add parameter departure
447
if (!myVehicleBaseObject->hasStringAttribute(SUMO_ATTR_DEPART) || myVehicleBaseObject->getStringAttribute(SUMO_ATTR_DEPART).empty()) {
448
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_DEPART, "0");
449
}
450
// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes
451
SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myVehicleBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(vehicleTag));
452
// obtain trip parameters
453
SUMOVehicleParameter* tripParameters = SUMOVehicleParserHelper::parseVehicleAttributes(vehicleTag, SUMOSAXAttrs, false);
454
tripParameters->setParameters(myVehicleBaseObject->getParameters());
455
// check trip parameters
456
if (tripParameters) {
457
myVehicleBaseObject->setVehicleParameter(tripParameters);
458
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_FROM_JUNCTION, myPathCreator->getSelectedJunctions().front()->getID());
459
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_TO_JUNCTION, myPathCreator->getSelectedJunctions().back()->getID());
460
// parse vehicle
461
routeHandler.parseSumoBaseObject(myVehicleBaseObject);
462
// delete tripParameters and base object
463
delete tripParameters;
464
}
465
} else if ((vehicleTag == GNE_TAG_TRIP_TAZS) && (myPathCreator->getSelectedTAZs().size() > 0)) {
466
// set tag
467
myVehicleBaseObject->setTag(SUMO_TAG_TRIP);
468
// Add parameter departure
469
if (!myVehicleBaseObject->hasStringAttribute(SUMO_ATTR_DEPART) || myVehicleBaseObject->getStringAttribute(SUMO_ATTR_DEPART).empty()) {
470
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_DEPART, "0");
471
}
472
// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes
473
SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myVehicleBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(vehicleTag));
474
// obtain trip parameters
475
SUMOVehicleParameter* tripParameters = SUMOVehicleParserHelper::parseVehicleAttributes(vehicleTag, SUMOSAXAttrs, false);
476
tripParameters->setParameters(myVehicleBaseObject->getParameters());
477
// check trip parameters
478
if (tripParameters) {
479
myVehicleBaseObject->setVehicleParameter(tripParameters);
480
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_FROM_TAZ, myPathCreator->getSelectedTAZs().front()->getID());
481
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_TO_TAZ, myPathCreator->getSelectedTAZs().back()->getID());
482
// parse vehicle
483
routeHandler.parseSumoBaseObject(myVehicleBaseObject);
484
// delete tripParameters and base object
485
delete tripParameters;
486
}
487
} else if ((vehicleTag == GNE_TAG_FLOW_JUNCTIONS) && (myPathCreator->getSelectedJunctions().size() > 0)) {
488
// set tag
489
myVehicleBaseObject->setTag(SUMO_TAG_FLOW);
490
// set flow attributes
491
updateFlowAttributes();
492
// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes
493
SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myVehicleBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(vehicleTag));
494
// obtain flow parameters
495
SUMOVehicleParameter* flowParameters = SUMOVehicleParserHelper::parseFlowAttributes(vehicleTag, SUMOSAXAttrs, false, true, 0, SUMOTime_MAX);
496
flowParameters->setParameters(myVehicleBaseObject->getParameters());
497
// check flowParameters
498
if (flowParameters) {
499
myVehicleBaseObject->setVehicleParameter(flowParameters);
500
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_FROM_JUNCTION, myPathCreator->getSelectedJunctions().front()->getID());
501
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_TO_JUNCTION, myPathCreator->getSelectedJunctions().back()->getID());
502
// parse vehicle
503
routeHandler.parseSumoBaseObject(myVehicleBaseObject);
504
// delete flowParameters and base object
505
delete flowParameters;
506
}
507
} else if ((vehicleTag == GNE_TAG_FLOW_TAZS) && (myPathCreator->getSelectedTAZs().size() > 0)) {
508
// set tag
509
myVehicleBaseObject->setTag(SUMO_TAG_FLOW);
510
// set flow attributes
511
updateFlowAttributes();
512
// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes
513
SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myVehicleBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(vehicleTag));
514
// obtain flow parameters
515
SUMOVehicleParameter* flowParameters = SUMOVehicleParserHelper::parseFlowAttributes(vehicleTag, SUMOSAXAttrs, false, true, 0, SUMOTime_MAX);
516
flowParameters->setParameters(myVehicleBaseObject->getParameters());
517
// check flowParameters
518
if (flowParameters) {
519
myVehicleBaseObject->setVehicleParameter(flowParameters);
520
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_FROM_TAZ, myPathCreator->getSelectedTAZs().front()->getID());
521
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_TO_TAZ, myPathCreator->getSelectedTAZs().back()->getID());
522
// parse vehicle
523
routeHandler.parseSumoBaseObject(myVehicleBaseObject);
524
// delete flowParameters and base object
525
delete flowParameters;
526
}
527
}
528
// abort path creation
529
myPathCreator->abortPathCreation();
530
// refresh attributes editor
531
myVehicleAttributesEditor->refreshAttributesEditor();
532
return true;
533
}
534
}
535
return false;
536
}
537
538
539
bool
540
GNEVehicleFrame::buildVehicleOverRoute(SumoXMLTag vehicleTag, GNEDemandElement* route) {
541
if (route && (route->getTagProperty()->isRoute())) {
542
// now check if parameters are valid
543
if (!myVehicleAttributesEditor->checkAttributes(true)) {
544
return false;
545
}
546
// get vehicle attributes
547
myVehicleAttributesEditor->fillSumoBaseObject(myVehicleBaseObject);
548
// declare route handler
549
GNERouteHandler routeHandler(myViewNet->getNet(), myVehicleBaseObject->hasStringAttribute(GNE_ATTR_DEMAND_FILE) ?
550
myVehicleBaseObject->getStringAttribute(GNE_ATTR_DEMAND_FILE) : "",
551
myViewNet->getViewParent()->getGNEAppWindows()->isUndoRedoAllowed());
552
// check if departLane is valid
553
if ((route->getTagProperty()->getTag() == SUMO_TAG_ROUTE) && myVehicleBaseObject->hasStringAttribute(SUMO_ATTR_DEPARTLANE) &&
554
GNEAttributeCarrier::canParse<int>(myVehicleBaseObject->getStringAttribute(SUMO_ATTR_DEPARTLANE))) {
555
const int departLane = GNEAttributeCarrier::parse<int>(myVehicleBaseObject->getStringAttribute(SUMO_ATTR_DEPARTLANE));
556
if (departLane >= (int)route->getParentEdges().front()->getChildLanes().size()) {
557
myViewNet->setStatusBarText("Invalid " + toString(SUMO_ATTR_DEPARTLANE));
558
return false;
559
}
560
}
561
// check if departSpeed is valid
562
if (myVehicleBaseObject->hasStringAttribute(SUMO_ATTR_DEPARTSPEED) && GNEAttributeCarrier::canParse<double>(myVehicleBaseObject->getStringAttribute(SUMO_ATTR_DEPARTSPEED))) {
563
double departSpeed = GNEAttributeCarrier::parse<double>(myVehicleBaseObject->getStringAttribute(SUMO_ATTR_DEPARTSPEED));
564
if (departSpeed >= myTypeSelector->getCurrentDemandElement()->getAttributeDouble(SUMO_ATTR_MAXSPEED)) {
565
myViewNet->setStatusBarText("Invalid " + toString(SUMO_ATTR_DEPARTSPEED));
566
return false;
567
}
568
}
569
// check if we're creating a vehicle or a flow
570
if (vehicleTag == SUMO_TAG_VEHICLE) {
571
// set tag
572
myVehicleBaseObject->setTag(SUMO_TAG_VEHICLE);
573
// Add parameter departure
574
if (!myVehicleBaseObject->hasStringAttribute(SUMO_ATTR_DEPART) || myVehicleBaseObject->getStringAttribute(SUMO_ATTR_DEPART).empty()) {
575
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_DEPART, "0");
576
}
577
// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes
578
SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myVehicleBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(vehicleTag));
579
// obtain vehicle parameters in vehicleParameters
580
SUMOVehicleParameter* vehicleParameters = SUMOVehicleParserHelper::parseVehicleAttributes(vehicleTag, SUMOSAXAttrs, false);
581
vehicleParameters->setParameters(myVehicleBaseObject->getParameters());
582
// check if vehicle was successfully created)
583
if (vehicleParameters) {
584
vehicleParameters->routeid = route->getID();
585
myVehicleBaseObject->setVehicleParameter(vehicleParameters);
586
// parse vehicle
587
routeHandler.parseSumoBaseObject(myVehicleBaseObject);
588
// delete vehicleParameters and sumoBaseObject
589
delete vehicleParameters;
590
}
591
} else {
592
// set tag
593
myVehicleBaseObject->setTag(SUMO_TAG_FLOW);
594
// set flow attributes
595
updateFlowAttributes();
596
// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes
597
SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myVehicleBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(vehicleTag));
598
// obtain routeFlow parameters in routeFlowParameters
599
SUMOVehicleParameter* routeFlowParameters = SUMOVehicleParserHelper::parseFlowAttributes(vehicleTag, SUMOSAXAttrs, false, true, 0, SUMOTime_MAX);
600
routeFlowParameters->setParameters(myVehicleBaseObject->getParameters());
601
// check if flow was successfully created)
602
if (routeFlowParameters) {
603
routeFlowParameters->routeid = route->getID();
604
myVehicleBaseObject->setVehicleParameter(routeFlowParameters);
605
// parse flow
606
routeHandler.parseSumoBaseObject(myVehicleBaseObject);
607
// delete vehicleParameters and sumoBaseObject
608
delete routeFlowParameters;
609
}
610
}
611
// center view after creation
612
const auto* vehicle = myViewNet->getNet()->getAttributeCarriers()->retrieveDemandElement(myVehicleBaseObject->getTag(), myVehicleBaseObject->getStringAttribute(SUMO_ATTR_ID), false);
613
if (vehicle && !myViewNet->getVisibleBoundary().around(vehicle->getPositionInView())) {
614
myViewNet->centerTo(vehicle->getPositionInView(), false);
615
}
616
// refresh attributes editor
617
myVehicleAttributesEditor->refreshAttributesEditor();
618
// all ok, then return true;
619
return true;
620
} else {
621
myViewNet->setStatusBarText(toString(vehicleTag) + " has to be placed within a route.");
622
return false;
623
}
624
}
625
626
627
void
628
GNEVehicleFrame::updateFlowAttributes() {
629
// adjust poisson value
630
if (myVehicleBaseObject->hasDoubleAttribute(GNE_ATTR_POISSON)) {
631
myVehicleBaseObject->addStringAttribute(SUMO_ATTR_PERIOD, "exp(" + toString(myVehicleBaseObject->getDoubleAttribute(GNE_ATTR_POISSON)) + ")");
632
}
633
}
634
635
/****************************************************************************/
636
637