Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
GNERouteHandler.cpp
Go to the documentation of this file.
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/****************************************************************************/
18// Builds demand objects for netedit
19/****************************************************************************/
20
27#include <netedit/GNENet.h>
28#include <netedit/GNEUndoList.h>
31
32#include "GNEContainer.h"
33#include "GNEPerson.h"
34#include "GNEPersonTrip.h"
35#include "GNERide.h"
36#include "GNERoute.h"
37#include "GNERouteRef.h"
39#include "GNERouteHandler.h"
40#include "GNEStop.h"
41#include "GNEStopPlan.h"
42#include "GNETranship.h"
43#include "GNETransport.h"
44#include "GNEVType.h"
45#include "GNEVTypeRef.h"
47#include "GNEVehicle.h"
48#include "GNEWalk.h"
49
50
51// ===========================================================================
52// member method definitions
53// ===========================================================================
54
55GNERouteHandler::GNERouteHandler(GNENet* net, const std::string& file, const bool allowUndoRedo) :
56 RouteHandler(file, false),
57 myNet(net),
58 myPlanObject(new CommonXMLStructure::SumoBaseObject(nullptr)),
59 myAllowUndoRedo(allowUndoRedo) {
60}
61
62
66
67
68bool
70 // clear all parent plan elements without children
71 for (const auto& parentPlanElement : myParentPlanElements) {
72 if (parentPlanElement->getChildDemandElements().empty()) {
73 if (myAllowUndoRedo) {
74 myNet->getViewNet()->getUndoList()->begin(parentPlanElement, TLF("delete % '%'", parentPlanElement->getTagStr(), parentPlanElement->getID()));
75 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(parentPlanElement, false), true);
77 } else {
78 parentPlanElement->decRef("postParserTasks");
79 myNet->getAttributeCarriers()->deleteDemandElement(parentPlanElement, false);
80 }
81 }
82 }
83 return true;
84}
85
86
87bool
89 // check if loaded type is a default type
90 if (DEFAULT_VTYPES.count(vTypeParameter.id) > 0) {
91 // overwrite default vehicle type
93 } else {
94 const auto element = retrieveDemandElement(NamespaceIDs::types, vTypeParameter.id);
95 if (!checkElement(SUMO_TAG_VTYPE, element)) {
96 return false;
97 } else if (!checkValidDemandElementID(SUMO_TAG_VTYPE, vTypeParameter.id)) {
98 return false;
99 } else {
100 // create vType/pType using myCurrentVType
101 GNEDemandElement* vType = new GNEVType(myNet, myFilename, vTypeParameter);
102 // if this vType was created within a vType distribution, we have to create an extra vTypeRef
103 GNEDemandElement* vTypeRef = nullptr;
104 GNEDemandElement* distributionParent = nullptr;
105 if (sumoBaseObject && sumoBaseObject->getParentSumoBaseObject() && (sumoBaseObject->getParentSumoBaseObject()->getTag() == SUMO_TAG_VTYPE_DISTRIBUTION)) {
106 const auto& vTypeDistributionID = sumoBaseObject->getParentSumoBaseObject()->getStringAttribute(SUMO_ATTR_ID);
107 distributionParent = myNet->getAttributeCarriers()->retrieveDemandElement(SUMO_TAG_VTYPE_DISTRIBUTION, vTypeDistributionID, false);
108 if (distributionParent) {
109 // create vType reference without probability
110 vTypeRef = new GNEVTypeRef(distributionParent, vType);
111 } else {
112 WRITE_WARNING(TLF("VType '%' with probability % cannot be referenced with distribution '%'", vTypeParameter.id, toString(vTypeParameter.defaultProbability), vTypeDistributionID));
113 }
114 }
115 if (myAllowUndoRedo) {
116 myNet->getViewNet()->getUndoList()->begin(vType, TLF("add % '%'", vType->getTagStr(), vTypeParameter.id));
117 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(vType, true), true);
118 if (vTypeRef) {
119 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(vTypeRef, true), true);
120 }
122 } else {
124 if (vTypeRef) {
125 distributionParent->addChildElement(vTypeRef);
126 vType->addChildElement(vTypeRef);
127 }
128 vType->incRef("buildVType");
129 }
130 return true;
131 }
132 }
133}
134
135
136bool
137GNERouteHandler::buildVTypeRef(const CommonXMLStructure::SumoBaseObject* sumoBaseObject, const std::string& vTypeID, const double probability) {
138 const auto distribution = getVTypeDistributionParent(sumoBaseObject);
139 // the referenced element can be either a vType or a vTypeDistribution
141 // check distributions
142 if (distribution == nullptr) {
144 } else if (refElement) {
145 // create distributions
146 GNEDemandElement* vTypeRef = new GNEVTypeRef(distribution, refElement, probability);
147 if (myAllowUndoRedo) {
148 myNet->getViewNet()->getUndoList()->begin(vTypeRef, TLF("add % '%'", vTypeRef->getTagStr(), distribution->getID()));
149 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(vTypeRef, true), true);
151 } else {
153 distribution->addChildElement(vTypeRef);
154 refElement->addChildElement(vTypeRef);
155 vTypeRef->incRef("buildVTypeRef");
156 }
157 return true;
158 } else {
160 }
161}
162
163
164bool
165GNERouteHandler::buildVTypeDistribution(const CommonXMLStructure::SumoBaseObject* /*sumoBaseObject*/, const std::string& id, const int deterministic) {
166 // check conditions
167 const auto element = retrieveDemandElement(NamespaceIDs::types, id);
169 return false;
171 return false;
172 } else {
173 // create distributions
174 GNEVTypeDistribution* vTypeDistribution = new GNEVTypeDistribution(id, myNet, myFilename, deterministic);
175 if (myAllowUndoRedo) {
176 myNet->getViewNet()->getUndoList()->begin(vTypeDistribution, TLF("add % '%'", vTypeDistribution->getTagStr(), id));
177 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(vTypeDistribution, true), true);
179 } else {
180 myNet->getAttributeCarriers()->insertDemandElement(vTypeDistribution);
181 vTypeDistribution->incRef("buildVTypeDistribution");
182 }
183 return true;
184 }
185}
186
187
188bool
189GNERouteHandler::buildRoute(const CommonXMLStructure::SumoBaseObject* sumoBaseObject, const std::string& id, SUMOVehicleClass vClass,
190 const std::vector<std::string>& edgeIDs, const RGBColor& color, const int repeat, const SUMOTime cycleTime,
191 const double probability, const Parameterised::Map& routeParameters) {
192 // check conditions
193 const auto element = retrieveDemandElement(NamespaceIDs::routes, id);
194 if (!checkElement(SUMO_TAG_ROUTE, element)) {
195 return false;
196 } else if (!checkValidDemandElementID(SUMO_TAG_ROUTE, id)) {
197 return false;
198 } else if (!checkNegative(SUMO_TAG_ROUTE, id, SUMO_ATTR_REPEAT, repeat, true)) {
199 return false;
200 } else {
201 // parse edges
202 const auto edges = parseEdges(SUMO_TAG_ROUTE, id, edgeIDs);
203 // check edges
204 const auto validEdges = GNERoute::isRouteValid(edges);
205 // continue depending if route is valid
206 if (validEdges.size() > 0) {
207 return writeError(TLF("Could not build % with ID '%' in netedit; %.", toString(SUMO_TAG_ROUTE), id, validEdges));
208 } else {
209 // create GNERoute
210 GNEDemandElement* route = new GNERoute(id, myNet, myFilename, vClass, edges, color, repeat, cycleTime, probability, routeParameters);
211 // if this route was created within a route distribution, we have to create an extra routeRef
212 GNEDemandElement* routeRef = nullptr;
213 GNEDemandElement* distributionParent = nullptr;
214 if (sumoBaseObject && sumoBaseObject->getParentSumoBaseObject() && (sumoBaseObject->getParentSumoBaseObject()->getTag() == SUMO_TAG_ROUTE_DISTRIBUTION)) {
215 const auto& routeDistributionID = sumoBaseObject->getParentSumoBaseObject()->getStringAttribute(SUMO_ATTR_ID);
216 distributionParent = myNet->getAttributeCarriers()->retrieveDemandElement(SUMO_TAG_ROUTE_DISTRIBUTION, routeDistributionID, false);
217 if (distributionParent) {
218 // create route reference without probability
219 routeRef = new GNERouteRef(distributionParent, route);
220 } else {
221 WRITE_WARNING(TLF("Route '%' with probability % cannot be referenced with distribution '%'", id, toString(probability), routeDistributionID));
222 }
223 }
224 if (myAllowUndoRedo) {
225 myNet->getViewNet()->getUndoList()->begin(route, TLF("add % '%'", route->getTagStr(), id));
226 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(route, true), true);
227 if (routeRef) {
228 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(routeRef, true), true);
229 }
231 } else {
233 for (const auto& edge : edges) {
234 edge->addChildElement(route);
235 }
236 if (routeRef) {
237 distributionParent->addChildElement(routeRef);
238 route->addChildElement(routeRef);
239 }
240 route->incRef("buildRoute");
241 }
242 return true;
243 }
244 }
245
246}
247
248
249bool
250GNERouteHandler::buildRouteRef(const CommonXMLStructure::SumoBaseObject* sumoBaseObject, const std::string& routeID, const double probability) {
251 const auto distribution = getRouteDistributionParent(sumoBaseObject);
252 // the referenced element can be either a route or a routeDistribution
254 // check distributions
255 if (distribution == nullptr) {
257 } else if (refElement) {
258 // create distributions
259 GNEDemandElement* routeRef = new GNERouteRef(distribution, refElement, probability);
260 if (myAllowUndoRedo) {
261 myNet->getViewNet()->getUndoList()->begin(routeRef, TLF("add % in '%'", routeRef->getTagStr(), distribution->getID()));
262 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(routeRef, true), true);
264 } else {
266 distribution->addChildElement(routeRef);
267 refElement->addChildElement(routeRef);
268 routeRef->incRef("buildRouteRef");
269 }
270 return true;
271 } else {
273 }
274}
275
276
277bool
278GNERouteHandler::buildRouteDistribution(const CommonXMLStructure::SumoBaseObject* /*sumoBaseObject*/, const std::string& id) {
279 // check conditions
280 const auto element = retrieveDemandElement(NamespaceIDs::routes, id);
282 return false;
284 return false;
285 } else {
286 // create distributions
287 GNERouteDistribution* routeDistribution = new GNERouteDistribution(id, myNet, myFilename);
288 if (myAllowUndoRedo) {
289 myNet->getViewNet()->getUndoList()->begin(routeDistribution, TLF("add % '%'", routeDistribution->getTagStr(), id));
290 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(routeDistribution, true), true);
292 } else {
293 myNet->getAttributeCarriers()->insertDemandElement(routeDistribution);
294 routeDistribution->incRef("buildRouteDistribution");
295 }
296 return true;
297 }
298}
299
300
301bool
303 // check conditions
304 const auto element = retrieveDemandElement(NamespaceIDs::vehicles, vehicleParameters.id);
305 if (!checkElement(SUMO_TAG_VEHICLE, element)) {
306 return false;
307 } else if (!checkValidDemandElementID(SUMO_TAG_VEHICLE, vehicleParameters.id)) {
308 return false;
309 } else {
310 // obtain routes and vtypes
311 GNEDemandElement* type = getType(vehicleParameters.vtypeid);
312 GNEDemandElement* route = getRoute(vehicleParameters.routeid);
313 if (type == nullptr) {
314 return writeErrorInvalidParent(SUMO_TAG_VEHICLE, vehicleParameters.id, {SUMO_TAG_VTYPE, SUMO_TAG_VTYPE_DISTRIBUTION}, vehicleParameters.vtypeid);
315 } else if (route == nullptr) {
316 return writeErrorInvalidParent(SUMO_TAG_VEHICLE, vehicleParameters.id, {SUMO_TAG_ROUTE, SUMO_TAG_ROUTE_DISTRIBUTION}, vehicleParameters.routeid);
317 } else if (vehicleParameters.wasSet(VEHPARS_DEPARTLANE_SET) && (vehicleParameters.departLaneProcedure == DepartLaneDefinition::GIVEN) && ((int)route->getParentEdges().front()->getChildLanes().size() < vehicleParameters.departLane)) {
318 return writeError(TLF("Invalid % used in % '%'. % is greater than number of lanes", toString(SUMO_ATTR_DEPARTLANE), toString(vehicleParameters.tag), vehicleParameters.id, toString(vehicleParameters.departLane)));
319 } else if (vehicleParameters.wasSet(VEHPARS_DEPARTSPEED_SET) && (vehicleParameters.departSpeedProcedure == DepartSpeedDefinition::GIVEN) && (type->getAttributeDouble(SUMO_ATTR_MAXSPEED) < vehicleParameters.departSpeed)) {
320 return writeError(TLF("Invalid % used in % '%'. % is greater than type %", toString(SUMO_ATTR_DEPARTSPEED), toString(vehicleParameters.tag), vehicleParameters.id, toString(vehicleParameters.departSpeed), toString(SUMO_ATTR_MAXSPEED)));
321 } else {
322 // create vehicle using vehicleParameters
323 GNEDemandElement* vehicle = new GNEVehicle(SUMO_TAG_VEHICLE, myNet, myFilename, type, route, vehicleParameters);
324 if (myAllowUndoRedo) {
325 myNet->getViewNet()->getUndoList()->begin(vehicle, TLF("add % '%'", vehicle->getTagStr(), vehicleParameters.id));
326 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(vehicle, true), true);
328 } else {
330 // set vehicle as child of type and Route
331 type->addChildElement(vehicle);
332 route->addChildElement(vehicle);
333 vehicle->incRef("buildVehicleOverRoute");
334 }
335 return true;
336 }
337 }
338}
339
340
341bool
343 const std::vector<std::string>& edgeIDs, const RGBColor& color, const int repeat, const SUMOTime cycleTime,
344 const Parameterised::Map& routeParameters) {
345 // check conditions
346 const auto element = retrieveDemandElement(NamespaceIDs::vehicles, vehicleParameters.id);
348 return false;
349 } else if (!checkValidDemandElementID(GNE_TAG_VEHICLE_WITHROUTE, vehicleParameters.id)) {
350 return false;
351 } else {
352 // parse route edges
353 const auto edges = parseEdges(GNE_TAG_ROUTE_EMBEDDED, vehicleParameters.id, edgeIDs);
354 // check edges
355 const auto validEdges = GNERoute::isRouteValid(edges);
356 // continue depending if route is valid
357 if (validEdges.size() > 0) {
358 return writeError(TLF("Could not build % with ID '%' in netedit; %.", toString(GNE_TAG_VEHICLE_WITHROUTE), vehicleParameters.id, validEdges));
359 } else {
360 // obtain type
361 GNEDemandElement* type = getType(vehicleParameters.vtypeid);
362 if (type == nullptr) {
363 return writeErrorInvalidParent(GNE_TAG_VEHICLE_WITHROUTE, vehicleParameters.id, {SUMO_TAG_VTYPE, SUMO_TAG_VTYPE_DISTRIBUTION}, vehicleParameters.vtypeid);
364 } else if (vehicleParameters.wasSet(VEHPARS_DEPARTLANE_SET) && (vehicleParameters.departLaneProcedure == DepartLaneDefinition::GIVEN) && ((int)edges.front()->getChildLanes().size() < vehicleParameters.departLane)) {
365 return writeError(TLF("Invalid % used in % '%'. % is greater than number of lanes", toString(SUMO_ATTR_DEPARTLANE), toString(vehicleParameters.tag), vehicleParameters.id, toString(vehicleParameters.departLane)));
366 } else if (vehicleParameters.wasSet(VEHPARS_DEPARTSPEED_SET) && (vehicleParameters.departSpeedProcedure == DepartSpeedDefinition::GIVEN) && (type->getAttributeDouble(SUMO_ATTR_MAXSPEED) < vehicleParameters.departSpeed)) {
367 return writeError(TLF("Invalid % used in % '%'. % is greater than type %", toString(SUMO_ATTR_DEPARTSPEED), toString(vehicleParameters.tag), vehicleParameters.id, toString(vehicleParameters.departSpeed), toString(SUMO_ATTR_MAXSPEED)));
368 } else {
369 // create vehicle using vehicleParameters
370 GNEDemandElement* vehicle = new GNEVehicle(GNE_TAG_VEHICLE_WITHROUTE, myNet, myFilename, type, vehicleParameters);
371 // create embedded route
372 GNEDemandElement* route = new GNERoute(vehicle, edges, color, repeat, cycleTime, routeParameters);
373 if (myAllowUndoRedo) {
374 myNet->getViewNet()->getUndoList()->begin(vehicle, TLF("add % '%'", vehicle->getTagStr(), vehicleParameters.id));
375 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(vehicle, true), true);
376 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(route, true), true);
378 } else {
381 type->addChildElement(vehicle);
382 vehicle->addChildElement(route);
383 for (const auto& edge : edges) {
384 edge->addChildElement(route);
385 }
386 vehicle->incRef("buildVehicleEmbeddedRoute");
387 route->incRef("buildVehicleEmbeddedRoute");
388 }
389 return true;
390 }
391 }
392 }
393}
394
395
396bool
398 // check conditions
399 const auto element = retrieveDemandElement(NamespaceIDs::vehicles, vehicleParameters.id);
400 if (!checkElement(GNE_TAG_FLOW_ROUTE, element)) {
401 return false;
402 } else if (!checkValidDemandElementID(GNE_TAG_FLOW_ROUTE, vehicleParameters.id)) {
403 return false;
404 } else {
405 // obtain routes and vtypes
406 GNEDemandElement* type = getType(vehicleParameters.vtypeid);
407 GNEDemandElement* route = getRoute(vehicleParameters.routeid);
408 if (type == nullptr) {
409 return writeErrorInvalidParent(SUMO_TAG_VEHICLE, vehicleParameters.id, {SUMO_TAG_VTYPE, SUMO_TAG_VTYPE_DISTRIBUTION}, vehicleParameters.vtypeid);
410 } else if (route == nullptr) {
411 return writeErrorInvalidParent(SUMO_TAG_VEHICLE, vehicleParameters.id, {SUMO_TAG_ROUTE, SUMO_TAG_ROUTE_DISTRIBUTION}, vehicleParameters.routeid);
412 } else if (vehicleParameters.wasSet(VEHPARS_DEPARTLANE_SET) && (vehicleParameters.departLaneProcedure == DepartLaneDefinition::GIVEN) && ((int)route->getParentEdges().front()->getChildLanes().size() < vehicleParameters.departLane)) {
413 return writeError(TLF("Invalid % used in % '%'. % is greater than number of lanes", toString(SUMO_ATTR_DEPARTLANE), toString(vehicleParameters.tag), vehicleParameters.id, toString(vehicleParameters.departLane)));
414 } else if (vehicleParameters.wasSet(VEHPARS_DEPARTSPEED_SET) && (vehicleParameters.departSpeedProcedure == DepartSpeedDefinition::GIVEN) && (type->getAttributeDouble(SUMO_ATTR_MAXSPEED) < vehicleParameters.departSpeed)) {
415 return writeError(TLF("Invalid % used in % '%'. % is greater than type %", toString(SUMO_ATTR_DEPARTSPEED), toString(vehicleParameters.tag), vehicleParameters.id, toString(vehicleParameters.departSpeed), toString(SUMO_ATTR_MAXSPEED)));
416 } else {
417 // create flow or trips using vehicleParameters
418 GNEDemandElement* flow = new GNEVehicle(GNE_TAG_FLOW_ROUTE, myNet, myFilename, type, route, vehicleParameters);
419 if (myAllowUndoRedo) {
420 myNet->getViewNet()->getUndoList()->begin(flow, TLF("add % '%'", flow->getTagStr(), vehicleParameters.id));
421 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(flow, true), true);
423 } else {
425 // set flow as child of type and Route
426 type->addChildElement(flow);
427 route->addChildElement(flow);
428 flow->incRef("buildFlowOverRoute");
429 }
430 return true;
431 }
432 }
433}
434
435
436bool
438 const std::vector<std::string>& edgeIDs, const RGBColor& color, const int repeat, const SUMOTime cycleTime,
439 const Parameterised::Map& routeParameters) {
440 // check conditions
441 const auto element = retrieveDemandElement(NamespaceIDs::vehicles, vehicleParameters.id);
442 if (!checkElement(GNE_TAG_FLOW_WITHROUTE, element)) {
443 return false;
444 } else if (!checkValidDemandElementID(GNE_TAG_FLOW_WITHROUTE, vehicleParameters.id)) {
445 return false;
446 } else {
447 // parse route edges
448 const auto edges = parseEdges(GNE_TAG_FLOW_WITHROUTE, vehicleParameters.id, edgeIDs);
449 // check edges
450 const auto validEdges = GNERoute::isRouteValid(edges);
451 // continue depending if route is valid
452 if (validEdges.size() > 0) {
453 return writeError(TLF("Could not build % with ID '%' in netedit; %.", toString(GNE_TAG_FLOW_WITHROUTE), vehicleParameters.id, validEdges));
454 } else {
455 // obtain type
456 GNEDemandElement* type = getType(vehicleParameters.vtypeid);
457 if (type == nullptr) {
458 return writeErrorInvalidParent(GNE_TAG_FLOW_WITHROUTE, vehicleParameters.id, {SUMO_TAG_VTYPE, SUMO_TAG_VTYPE_DISTRIBUTION}, vehicleParameters.vtypeid);
459 } else if (vehicleParameters.wasSet(VEHPARS_DEPARTLANE_SET) && (vehicleParameters.departLaneProcedure == DepartLaneDefinition::GIVEN) && ((int)edges.front()->getChildLanes().size() < vehicleParameters.departLane)) {
460 return writeError(TLF("Invalid % used in % '%'. % is greater than number of lanes", toString(SUMO_ATTR_DEPARTLANE), toString(vehicleParameters.tag), vehicleParameters.id, toString(vehicleParameters.departLane)));
461 } else if (vehicleParameters.wasSet(VEHPARS_DEPARTSPEED_SET) && (vehicleParameters.departSpeedProcedure == DepartSpeedDefinition::GIVEN) && (type->getAttributeDouble(SUMO_ATTR_MAXSPEED) < vehicleParameters.departSpeed)) {
462 return writeError(TLF("Invalid % used in % '%'. % is greater than type %", toString(SUMO_ATTR_DEPARTSPEED), toString(vehicleParameters.tag), vehicleParameters.id, toString(vehicleParameters.departSpeed), toString(SUMO_ATTR_MAXSPEED)));
463 } else {
464 // create vehicle using vehicleParameters
465 GNEDemandElement* vehicle = new GNEVehicle(GNE_TAG_FLOW_WITHROUTE, myNet, myFilename, type, vehicleParameters);
466 // create embedded route
467 GNEDemandElement* route = new GNERoute(vehicle, edges, color, repeat, cycleTime, routeParameters);
468 if (myAllowUndoRedo) {
469 myNet->getViewNet()->getUndoList()->begin(vehicle, TLF("add % '%'", vehicle->getTagStr(), vehicleParameters.id));
470 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(vehicle, true), true);
471 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(route, true), true);
473 } else {
476 type->addChildElement(vehicle);
477 vehicle->addChildElement(route);
478 for (const auto& edge : edges) {
479 edge->addChildElement(route);
480 }
481 vehicle->incRef("buildFlowEmbeddedRoute");
482 route->incRef("buildFlowEmbeddedRoute");
483 }
484 return true;
485 }
486 }
487 }
488}
489
490
491bool
493 const std::string& fromEdgeID, const std::string& toEdgeID) {
494 // check conditions
495 const auto element = retrieveDemandElement(NamespaceIDs::vehicles, vehicleParameters.id);
496 if (!checkElement(SUMO_TAG_TRIP, element)) {
497 return false;
498 } else if (!checkValidDemandElementID(SUMO_TAG_TRIP, vehicleParameters.id)) {
499 return false;
500 } else {
501 // set via attribute
502 if (sumoBaseObject && sumoBaseObject->hasStringListAttribute(SUMO_ATTR_VIA)) {
503 vehicleParameters.via = sumoBaseObject->getStringListAttribute(SUMO_ATTR_VIA);
504 }
505 // parse edges
506 const auto fromEdge = parseEdge(SUMO_TAG_TRIP, vehicleParameters.id, fromEdgeID, sumoBaseObject, true);
507 const auto toEdge = parseEdge(SUMO_TAG_TRIP, vehicleParameters.id, toEdgeID, sumoBaseObject, false);
508 if (!fromEdge || !toEdge) {
509 return false;
510 } else {
511 // obtain type
512 GNEDemandElement* type = getType(vehicleParameters.vtypeid);
513 if (type == nullptr) {
514 return writeErrorInvalidParent(SUMO_TAG_TRIP, vehicleParameters.id, {SUMO_TAG_VTYPE, SUMO_TAG_VTYPE_DISTRIBUTION}, vehicleParameters.vtypeid);
515 } else if (vehicleParameters.wasSet(VEHPARS_DEPARTLANE_SET) && ((vehicleParameters.departLaneProcedure == DepartLaneDefinition::GIVEN)) && ((int)fromEdge->getChildLanes().size() < vehicleParameters.departLane)) {
516 return writeError(TLF("Invalid % used in % '%'. % is greater than number of lanes", toString(SUMO_ATTR_DEPARTLANE), toString(vehicleParameters.tag), vehicleParameters.id, toString(vehicleParameters.departLane)));
517 } else if (vehicleParameters.wasSet(VEHPARS_DEPARTSPEED_SET) && (vehicleParameters.departSpeedProcedure == DepartSpeedDefinition::GIVEN) && (type->getAttributeDouble(SUMO_ATTR_MAXSPEED) < vehicleParameters.departSpeed)) {
518 return writeError(TLF("Invalid % used in % '%'. % is greater than type %", toString(SUMO_ATTR_DEPARTSPEED), toString(vehicleParameters.tag), vehicleParameters.id, toString(vehicleParameters.departSpeed), toString(SUMO_ATTR_MAXSPEED)));
519 } else if (!checkViaAttribute(SUMO_TAG_TRIP, vehicleParameters.id, vehicleParameters.via)) {
520 return false;
521 } else {
522 // create trip or flow using tripParameters
523 GNEDemandElement* trip = new GNEVehicle(SUMO_TAG_TRIP, myNet, myFilename, type, fromEdge, toEdge, vehicleParameters);
524 if (myAllowUndoRedo) {
525 myNet->getViewNet()->getUndoList()->begin(trip, TLF("add % '%'", trip->getTagStr(), vehicleParameters.id));
526 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(trip, true), true);
528 } else {
530 // set vehicle as child of type
531 type->addChildElement(trip);
532 trip->incRef("buildTrip");
533 // add reference in all edges
534 fromEdge->addChildElement(trip);
535 toEdge->addChildElement(trip);
536 }
537 return true;
538 }
539 }
540 }
541}
542
543
544bool
546 const std::string& fromJunctionID, const std::string& toJunctionID) {
547 // check conditions
548 const auto element = retrieveDemandElement(NamespaceIDs::vehicles, vehicleParameters.id);
549 if (!checkElement(GNE_TAG_TRIP_JUNCTIONS, element)) {
550 return false;
551 } else if (!checkValidDemandElementID(GNE_TAG_TRIP_JUNCTIONS, vehicleParameters.id)) {
552 return false;
553 } else {
554 // parse junctions
555 const auto fromJunction = parseJunction(GNE_TAG_TRIP_JUNCTIONS, vehicleParameters.id, fromJunctionID);
556 const auto toJunction = parseJunction(GNE_TAG_TRIP_JUNCTIONS, vehicleParameters.id, toJunctionID);
557 if (!fromJunction || !toJunction) {
558 return false;
559 } else {
560 // obtain type
561 GNEDemandElement* type = getType(vehicleParameters.vtypeid);
562 if (type == nullptr) {
563 return writeErrorInvalidParent(GNE_TAG_TRIP_JUNCTIONS, vehicleParameters.id, {SUMO_TAG_VTYPE, SUMO_TAG_VTYPE_DISTRIBUTION}, vehicleParameters.vtypeid);
564 } else if (vehicleParameters.wasSet(VEHPARS_DEPARTLANE_SET) && ((vehicleParameters.departLaneProcedure == DepartLaneDefinition::GIVEN)) && (vehicleParameters.departLane > 0)) {
565 return writeError(TLF("Invalid % used in % '%'. % is greater than number of lanes", toString(SUMO_ATTR_DEPARTLANE), toString(vehicleParameters.tag), vehicleParameters.id, toString(vehicleParameters.departLane)));
566 } else if (vehicleParameters.wasSet(VEHPARS_DEPARTSPEED_SET) && (vehicleParameters.departSpeedProcedure == DepartSpeedDefinition::GIVEN) && (type->getAttributeDouble(SUMO_ATTR_MAXSPEED) < vehicleParameters.departSpeed)) {
567 return writeError(TLF("Invalid % used in % '%'. % is greater than type %", toString(SUMO_ATTR_DEPARTSPEED), toString(vehicleParameters.tag), vehicleParameters.id, toString(vehicleParameters.departSpeed), toString(SUMO_ATTR_MAXSPEED)));
568 } else {
569 // create trip using vehicleParameters
570 GNEDemandElement* flow = new GNEVehicle(GNE_TAG_TRIP_JUNCTIONS, myNet, myFilename, type, fromJunction, toJunction, vehicleParameters);
571 if (myAllowUndoRedo) {
572 myNet->getViewNet()->getUndoList()->begin(flow, TLF("add % '%'", flow->getTagStr(), vehicleParameters.id));
573 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(flow, true), true);
575 } else {
577 // set vehicle as child of type
578 type->addChildElement(flow);
579 flow->incRef("buildFlow");
580 // add reference in all junctions
581 fromJunction->addChildElement(flow);
582 toJunction->addChildElement(flow);
583 }
584 return true;
585 }
586 }
587 }
588}
589
590
591bool
593 const std::string& fromTAZID, const std::string& toTAZID) {
594 // check conditions
595 const auto element = retrieveDemandElement(NamespaceIDs::vehicles, vehicleParameters.id);
596 if (!checkElement(GNE_TAG_TRIP_TAZS, element)) {
597 return false;
598 } else if (!checkValidDemandElementID(GNE_TAG_TRIP_TAZS, vehicleParameters.id)) {
599 return false;
600 } else {
601 // parse TAZs
602 const auto fromTAZ = parseTAZ(GNE_TAG_TRIP_TAZS, vehicleParameters.id, fromTAZID);
603 const auto toTAZ = parseTAZ(GNE_TAG_TRIP_TAZS, vehicleParameters.id, toTAZID);
604 if (!fromTAZ || !toTAZ) {
605 return false;
606 } else {
607 // obtain type
608 GNEDemandElement* type = getType(vehicleParameters.vtypeid);
609 if (type == nullptr) {
610 return writeErrorInvalidParent(GNE_TAG_TRIP_TAZS, vehicleParameters.id, {SUMO_TAG_VTYPE, SUMO_TAG_VTYPE_DISTRIBUTION}, vehicleParameters.vtypeid);
611 } else if (vehicleParameters.wasSet(VEHPARS_DEPARTLANE_SET) && ((vehicleParameters.departLaneProcedure == DepartLaneDefinition::GIVEN)) && (vehicleParameters.departLane > 0)) {
612 return writeError(TLF("Invalid % used in % '%'. % is greater than number of lanes", toString(SUMO_ATTR_DEPARTLANE), toString(vehicleParameters.tag), vehicleParameters.id, toString(vehicleParameters.departLane)));
613 } else if (vehicleParameters.wasSet(VEHPARS_DEPARTSPEED_SET) && (vehicleParameters.departSpeedProcedure == DepartSpeedDefinition::GIVEN) && (type->getAttributeDouble(SUMO_ATTR_MAXSPEED) < vehicleParameters.departSpeed)) {
614 return writeError(TLF("Invalid % used in % '%'. % is greater than type %", toString(SUMO_ATTR_DEPARTSPEED), toString(vehicleParameters.tag), vehicleParameters.id, toString(vehicleParameters.departSpeed), toString(SUMO_ATTR_MAXSPEED)));
615 } else {
616 // create trip using vehicleParameters
617 GNEDemandElement* flow = new GNEVehicle(GNE_TAG_TRIP_TAZS, myNet, myFilename, type, fromTAZ, toTAZ, vehicleParameters);
618 if (myAllowUndoRedo) {
619 myNet->getViewNet()->getUndoList()->begin(flow, TLF("add % '%'", flow->getTagStr(), vehicleParameters.id));
620 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(flow, true), true);
622 } else {
624 // set vehicle as child of type
625 type->addChildElement(flow);
626 flow->incRef("buildFlow");
627 // add reference in all TAZs
628 fromTAZ->addChildElement(flow);
629 toTAZ->addChildElement(flow);
630 }
631 return true;
632 }
633 }
634 }
635}
636
637
638bool
640 const std::string& fromEdgeID, const std::string& toEdgeID) {
641 // check conditions
642 const auto element = retrieveDemandElement(NamespaceIDs::vehicles, vehicleParameters.id);
643 if (!checkElement(SUMO_TAG_FLOW, element)) {
644 return false;
645 } else if (!checkValidDemandElementID(SUMO_TAG_FLOW, vehicleParameters.id)) {
646 return false;
647 } else {
648 // set via attribute
649 if (sumoBaseObject && sumoBaseObject->hasStringListAttribute(SUMO_ATTR_VIA)) {
650 vehicleParameters.via = sumoBaseObject->getStringListAttribute(SUMO_ATTR_VIA);
651 }
652 // parse edges
653 const auto fromEdge = parseEdge(SUMO_TAG_FLOW, vehicleParameters.id, fromEdgeID, sumoBaseObject, true);
654 const auto toEdge = parseEdge(SUMO_TAG_FLOW, vehicleParameters.id, toEdgeID, sumoBaseObject, false);
655 if (!fromEdge || !toEdge) {
656 return false;
657 } else {
658 // obtain type
659 GNEDemandElement* type = getType(vehicleParameters.vtypeid);
660 if (type == nullptr) {
661 return writeErrorInvalidParent(SUMO_TAG_FLOW, vehicleParameters.id, {SUMO_TAG_VTYPE, SUMO_TAG_VTYPE_DISTRIBUTION}, vehicleParameters.vtypeid);
662 } else if (vehicleParameters.wasSet(VEHPARS_DEPARTLANE_SET) && (vehicleParameters.departLaneProcedure == DepartLaneDefinition::GIVEN) && ((int)fromEdge->getChildLanes().size() < vehicleParameters.departLane)) {
663 return writeError(TLF("Invalid % used in % '%'. % is greater than number of lanes", toString(SUMO_ATTR_DEPARTLANE), toString(vehicleParameters.tag), vehicleParameters.id, toString(vehicleParameters.departLane)));
664 } else if (vehicleParameters.wasSet(VEHPARS_DEPARTSPEED_SET) && (vehicleParameters.departSpeedProcedure == DepartSpeedDefinition::GIVEN) && (type->getAttributeDouble(SUMO_ATTR_MAXSPEED) < vehicleParameters.departSpeed)) {
665 return writeError(TLF("Invalid % used in % '%'. % is greater than type %", toString(SUMO_ATTR_DEPARTSPEED), toString(vehicleParameters.tag), vehicleParameters.id, toString(vehicleParameters.departSpeed), toString(SUMO_ATTR_MAXSPEED)));
666 } else if (!checkViaAttribute(SUMO_TAG_FLOW, vehicleParameters.id, vehicleParameters.via)) {
667 return false;
668 } else {
669 // create trip or flow using tripParameters
670 GNEDemandElement* flow = new GNEVehicle(SUMO_TAG_FLOW, myNet, myFilename, type, fromEdge, toEdge, vehicleParameters);
671 if (myAllowUndoRedo) {
672 myNet->getViewNet()->getUndoList()->begin(flow, TLF("add % '%'", flow->getTagStr(), vehicleParameters.id));
673 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(flow, true), true);
675 } else {
677 // set vehicle as child of type
678 type->addChildElement(flow);
679 flow->incRef("buildFlow");
680 // add reference in all edges
681 fromEdge->addChildElement(flow);
682 toEdge->addChildElement(flow);
683 }
684 return true;
685 }
686 }
687 }
688}
689
690
691bool
693 const std::string& fromJunctionID, const std::string& toJunctionID) {
694 // check conditions
695 const auto element = retrieveDemandElement(NamespaceIDs::vehicles, vehicleParameters.id);
696 if (!checkElement(GNE_TAG_FLOW_JUNCTIONS, element)) {
697 return false;
698 } else if (!checkValidDemandElementID(GNE_TAG_FLOW_JUNCTIONS, vehicleParameters.id)) {
699 return false;
700 } else {
701 // parse junctions
702 const auto fromJunction = parseJunction(GNE_TAG_FLOW_JUNCTIONS, vehicleParameters.id, fromJunctionID);
703 const auto toJunction = parseJunction(GNE_TAG_FLOW_JUNCTIONS, vehicleParameters.id, toJunctionID);
704 if (!fromJunction || !toJunction) {
705 return false;
706 } else {
707 // obtain type
708 GNEDemandElement* type = getType(vehicleParameters.vtypeid);
709 if (type == nullptr) {
710 return writeErrorInvalidParent(GNE_TAG_FLOW_JUNCTIONS, vehicleParameters.id, {SUMO_TAG_VTYPE, SUMO_TAG_VTYPE_DISTRIBUTION}, vehicleParameters.vtypeid);
711 } else if (vehicleParameters.wasSet(VEHPARS_DEPARTLANE_SET) && ((vehicleParameters.departLaneProcedure == DepartLaneDefinition::GIVEN)) && (vehicleParameters.departLane > 0)) {
712 return writeError(TLF("Invalid % used in % '%'. % is greater than number of lanes", toString(SUMO_ATTR_DEPARTLANE), toString(vehicleParameters.tag), vehicleParameters.id, toString(vehicleParameters.departLane)));
713 } else if (vehicleParameters.wasSet(VEHPARS_DEPARTSPEED_SET) && (vehicleParameters.departSpeedProcedure == DepartSpeedDefinition::GIVEN) && (type->getAttributeDouble(SUMO_ATTR_MAXSPEED) < vehicleParameters.departSpeed)) {
714 return writeError(TLF("Invalid % used in % '%'. % is greater than type %", toString(SUMO_ATTR_DEPARTSPEED), toString(vehicleParameters.tag), vehicleParameters.id, toString(vehicleParameters.departSpeed), toString(SUMO_ATTR_MAXSPEED)));
715 } else {
716 // create flow using vehicleParameters
717 GNEDemandElement* flow = new GNEVehicle(GNE_TAG_FLOW_JUNCTIONS, myNet, myFilename, type, fromJunction, toJunction, vehicleParameters);
718 if (myAllowUndoRedo) {
719 myNet->getViewNet()->getUndoList()->begin(flow, TLF("add % '%'", flow->getTagStr(), vehicleParameters.id));
720 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(flow, true), true);
722 } else {
724 // set vehicle as child of type
725 type->addChildElement(flow);
726 flow->incRef("buildFlow");
727 // add reference in all junctions
728 fromJunction->addChildElement(flow);
729 toJunction->addChildElement(flow);
730 }
731 return true;
732 }
733 }
734 }
735}
736
737
738bool
740 const std::string& fromTAZID, const std::string& toTAZID) {
741 // check conditions
742 const auto element = retrieveDemandElement(NamespaceIDs::vehicles, vehicleParameters.id);
743 if (!checkElement(GNE_TAG_FLOW_TAZS, element)) {
744 return false;
745 } else if (!checkValidDemandElementID(GNE_TAG_FLOW_TAZS, vehicleParameters.id)) {
746 return false;
747 } else {
748 // parse TAZs
749 const auto fromTAZ = parseTAZ(GNE_TAG_FLOW_TAZS, vehicleParameters.id, fromTAZID);
750 const auto toTAZ = parseTAZ(GNE_TAG_FLOW_TAZS, vehicleParameters.id, toTAZID);
751 if (!fromTAZ || !toTAZ) {
752 return false;
753 } else {
754 // obtain type
755 GNEDemandElement* type = getType(vehicleParameters.vtypeid);
756 if (type == nullptr) {
757 return writeErrorInvalidParent(GNE_TAG_FLOW_TAZS, vehicleParameters.id, {SUMO_TAG_VTYPE, SUMO_TAG_VTYPE_DISTRIBUTION}, vehicleParameters.vtypeid);
758 } else if (vehicleParameters.wasSet(VEHPARS_DEPARTLANE_SET) && ((vehicleParameters.departLaneProcedure == DepartLaneDefinition::GIVEN)) && (vehicleParameters.departLane > 0)) {
759 return writeError(TLF("Invalid % used in % '%'. % is greater than number of lanes", toString(SUMO_ATTR_DEPARTLANE), toString(vehicleParameters.tag), vehicleParameters.id, toString(vehicleParameters.departLane)));
760 } else if (vehicleParameters.wasSet(VEHPARS_DEPARTSPEED_SET) && (vehicleParameters.departSpeedProcedure == DepartSpeedDefinition::GIVEN) && (type->getAttributeDouble(SUMO_ATTR_MAXSPEED) < vehicleParameters.departSpeed)) {
761 return writeError(TLF("Invalid % used in % '%'. % is greater than type %", toString(SUMO_ATTR_DEPARTSPEED), toString(vehicleParameters.tag), vehicleParameters.id, toString(vehicleParameters.departSpeed), toString(SUMO_ATTR_MAXSPEED)));
762 } else {
763 // create flow using vehicleParameters
764 GNEDemandElement* flow = new GNEVehicle(GNE_TAG_FLOW_TAZS, myNet, myFilename, type, fromTAZ, toTAZ, vehicleParameters);
765 if (myAllowUndoRedo) {
766 myNet->getViewNet()->getUndoList()->begin(flow, TLF("add % '%'", flow->getTagStr(), vehicleParameters.id));
767 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(flow, true), true);
769 } else {
771 // set vehicle as child of type
772 type->addChildElement(flow);
773 flow->incRef("buildFlow");
774 // add reference in all TAZs
775 fromTAZ->addChildElement(flow);
776 toTAZ->addChildElement(flow);
777 }
778 return true;
779 }
780 }
781 }
782}
783
784
785bool
787 // check conditions
788 const auto element = retrieveDemandElement(NamespaceIDs::persons, personParameters.id);
789 if (!checkElement(SUMO_TAG_PERSON, element)) {
790 return false;
791 } else if (!checkValidDemandElementID(SUMO_TAG_PERSON, personParameters.id)) {
792 return false;
793 } else {
794 // obtain type
795 GNEDemandElement* type = getType(personParameters.vtypeid);
796 if (type == nullptr) {
797 return writeErrorInvalidParent(SUMO_TAG_PERSON, personParameters.id, {SUMO_TAG_VTYPE}, personParameters.vtypeid);
798 } else {
799 // create person using personParameters
800 GNEDemandElement* person = new GNEPerson(SUMO_TAG_PERSON, myNet, myFilename, type, personParameters);
801 if (myAllowUndoRedo) {
802 myNet->getViewNet()->getUndoList()->begin(person, TLF("add % '%'", person->getTagStr(), personParameters.id));
803 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(person, true), true);
805 } else {
807 // set person as child of type
808 type->addChildElement(person);
809 person->incRef("buildPerson");
810 }
811 // save in parent plan elements
812 myParentPlanElements.insert(person);
813 return true;
814 }
815 }
816}
817
818
819bool
820GNERouteHandler::buildPersonFlow(const CommonXMLStructure::SumoBaseObject* /*sumoBaseObject*/, const SUMOVehicleParameter& personFlowParameters) {
821 // check conditions
822 const auto element = retrieveDemandElement(NamespaceIDs::persons, personFlowParameters.id);
823 if (!checkElement(SUMO_TAG_PERSONFLOW, element)) {
824 return false;
825 } else if (!checkValidDemandElementID(SUMO_TAG_PERSONFLOW, personFlowParameters.id)) {
826 return false;
827 } else {
828 // obtain type
829 GNEDemandElement* type = getType(personFlowParameters.vtypeid);
830 if (type == nullptr) {
831 return writeErrorInvalidParent(SUMO_TAG_PERSONFLOW, personFlowParameters.id, {SUMO_TAG_VTYPE}, personFlowParameters.vtypeid);
832 } else {
833 // create personFlow using personFlowParameters
834 GNEDemandElement* personFlow = new GNEPerson(SUMO_TAG_PERSONFLOW, myNet, myFilename, type, personFlowParameters);
835 if (myAllowUndoRedo) {
836 myNet->getViewNet()->getUndoList()->begin(personFlow, TLF("add % '%'", personFlow->getTagStr(), personFlowParameters.id));
837 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(personFlow, true), true);
839 } else {
841 // set personFlow as child of type
842 type->addChildElement(personFlow);
843 personFlow->incRef("buildPersonFlow");
844 }
845 // save in parent plan elements
846 myParentPlanElements.insert(personFlow);
847 return true;
848 }
849 }
850}
851
852
853bool
855 const double arrivalPos, const std::vector<std::string>& types, const std::vector<std::string>& modes,
856 const std::vector<std::string>& lines, const double walkFactor, const std::string& group) {
857 // get values
858 GNEDemandElement* personParent = getPersonParent(sumoBaseObject);
859 const auto personTripTag = planParameters.getPersonTripTag();
860 GNEPlanParents planParents = GNEPlanParents(planParameters, myNet->getAttributeCarriers());
861 // check conditions
862 if (personParent == nullptr) {
864 } else if (personTripTag == SUMO_TAG_NOTHING) {
865 return writeError(TL("invalid combination for personTrip"));
866 } else if (planParents.checkIntegrity(personTripTag, personParent, planParameters)) {
867 // build person trip
868 GNEDemandElement* personTrip = new GNEPersonTrip(personTripTag, personParent, planParents,
869 arrivalPos, types, modes, lines, walkFactor, group);
870 // continue depending of undo.redo
871 if (myAllowUndoRedo) {
872 myNet->getViewNet()->getUndoList()->begin(personTrip, TLF("add % in '%'", personTrip->getTagStr(), personParent->getID()));
873 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(personTrip, true), true);
875 } else {
877 // set child references
878 personParent->addChildElement(personTrip);
879 planParents.addDemandElementChild(personTrip);
880 personTrip->incRef("buildPersonTrip");
881 }
882 return true;
883 } else {
884 return false;
885 }
886}
887
888
889bool
891 const double arrivalPos, const double speed, const SUMOTime duration) {
892 // get values
893 GNEDemandElement* personParent = getPersonParent(sumoBaseObject);
894 const auto walkTag = planParameters.getWalkTag();
895 GNEPlanParents planParents = GNEPlanParents(planParameters, myNet->getAttributeCarriers());
896 // check conditions
897 if (personParent == nullptr) {
899 } else if (walkTag == SUMO_TAG_NOTHING) {
900 return writeError(TL("invalid combination for personTrip"));
901 } else if (!checkNegative(SUMO_TAG_WALK, personParent->getID(), SUMO_ATTR_SPEED, speed, true)) {
902 return false;
903 } else if (!checkNegative(SUMO_TAG_WALK, personParent->getID(), SUMO_ATTR_DURATION, duration, true)) {
904 return false;
905 } else if (planParents.checkIntegrity(walkTag, personParent, planParameters)) {
906 // build person trip
907 GNEDemandElement* walk = new GNEWalk(walkTag, personParent, planParents, arrivalPos, speed, duration);
908 // continue depending of undo.redo
909 if (myAllowUndoRedo) {
910 myNet->getViewNet()->getUndoList()->begin(walk, TLF("add % in '%'", walk->getTagStr(), personParent->getID()));
911 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(walk, true), true);
913 } else {
915 // set child references
916 personParent->addChildElement(walk);
917 planParents.addDemandElementChild(walk);
918 walk->incRef("buildWalk");
919 }
920 return true;
921 } else {
922 return false;
923 }
924}
925
926
927bool
929 const double arrivalPos, const std::vector<std::string>& lines, const std::string& group) {
930 // get values
931 GNEDemandElement* personParent = getPersonParent(sumoBaseObject);
932 const auto rideTag = planParameters.getRideTag();
933 GNEPlanParents planParents = GNEPlanParents(planParameters, myNet->getAttributeCarriers());
934 // check conditions
935 if (personParent == nullptr) {
937 } else if (rideTag == SUMO_TAG_NOTHING) {
938 return writeError(TL("invalid combination for ride"));
939 } else if (planParents.checkIntegrity(rideTag, personParent, planParameters)) {
940 // build ride
941 GNEDemandElement* ride = new GNERide(rideTag, personParent, planParents, arrivalPos, lines, group);
942 // continue depending of undo-redo
943 if (myAllowUndoRedo) {
944 myNet->getViewNet()->getUndoList()->begin(ride, TLF("add % in '%'", ride->getTagStr(), personParent->getID()));
945 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(ride, true), true);
947 } else {
949 // set child references
950 personParent->addChildElement(ride);
951 planParents.addDemandElementChild(ride);
952 ride->incRef("buildRide");
953 }
954 return true;
955 } else {
956 return false;
957 }
958}
959
960
961bool
963 // check conditions
964 const auto element = retrieveDemandElement(NamespaceIDs::containers, containerParameters.id);
965 if (!checkElement(SUMO_TAG_CONTAINER, element)) {
966 return false;
967 } else if (!checkValidDemandElementID(SUMO_TAG_CONTAINER, containerParameters.id)) {
968 return false;
969 } else {
970 // obtain type
971 GNEDemandElement* type = getType(containerParameters.vtypeid);
972 if (type == nullptr) {
973 return writeError(TLF("Invalid vehicle type '%' used in % '%'.", containerParameters.vtypeid, toString(containerParameters.tag), containerParameters.id));
974 } else {
975 // create container using containerParameters
976 GNEDemandElement* container = new GNEContainer(SUMO_TAG_CONTAINER, myNet, myFilename, type, containerParameters);
977 if (myAllowUndoRedo) {
978 myNet->getViewNet()->getUndoList()->begin(container, TLF("add % '%'", container->getTagStr(), container->getID()));
979 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(container, true), true);
981 } else {
983 // set container as child of type
984 type->addChildElement(container);
985 container->incRef("buildContainer");
986 }
987 // save in parent plan elements
988 myParentPlanElements.insert(container);
989 return true;
990 }
991 }
992}
993
994
995bool
996GNERouteHandler::buildContainerFlow(const CommonXMLStructure::SumoBaseObject* /*sumoBaseObject*/, const SUMOVehicleParameter& containerFlowParameters) {
997 // check conditions
998 const auto element = retrieveDemandElement(NamespaceIDs::containers, containerFlowParameters.id);
999 if (!checkElement(SUMO_TAG_CONTAINERFLOW, element)) {
1000 return false;
1001 } else if (!checkValidDemandElementID(SUMO_TAG_CONTAINERFLOW, containerFlowParameters.id)) {
1002 return false;
1003 } else {
1004 // obtain type
1005 GNEDemandElement* type = getType(containerFlowParameters.vtypeid);
1006 if (type == nullptr) {
1007 return writeError(TLF("Invalid vehicle type '%' used in % '%'.", containerFlowParameters.vtypeid, toString(containerFlowParameters.tag), containerFlowParameters.id));
1008 } else {
1009 // create containerFlow using containerFlowParameters
1010 GNEDemandElement* containerFlow = new GNEContainer(SUMO_TAG_CONTAINERFLOW, myNet, myFilename, type, containerFlowParameters);
1011 if (myAllowUndoRedo) {
1012 myNet->getViewNet()->getUndoList()->begin(containerFlow, TLF("add % '%'", containerFlow->getTagStr(), containerFlow->getID()));
1013 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(containerFlow, true), true);
1015 } else {
1017 // set containerFlow as child of type
1018 type->addChildElement(containerFlow);
1019 containerFlow->incRef("buildContainerFlow");
1020 }
1021 // save in parent plan elements
1022 myParentPlanElements.insert(containerFlow);
1023 return true;
1024 }
1025 }
1026}
1027
1028
1029bool
1031 const double arrivalPos, const std::vector<std::string>& lines, const std::string& group) {
1032 // get values
1033 GNEDemandElement* containerParent = getContainerParent(sumoBaseObject);
1034 const auto transportTag = planParameters.getTransportTag();
1035 GNEPlanParents planParents = GNEPlanParents(planParameters, myNet->getAttributeCarriers());
1036 // check conditions
1037 if (containerParent == nullptr) {
1039 } else if (transportTag == SUMO_TAG_NOTHING) {
1040 return writeError(TL("invalid combination for personTrip"));
1041 } else if (planParents.checkIntegrity(transportTag, containerParent, planParameters)) {
1042 // build transport
1043 GNEDemandElement* transport = new GNETransport(transportTag, containerParent, planParents, arrivalPos, lines, group);
1044 // continue depending of undo-redo
1045 if (myAllowUndoRedo) {
1046 myNet->getViewNet()->getUndoList()->begin(transport, TLF("add % in '%'", transport->getTagStr(), containerParent->getID()));
1047 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(transport, true), true);
1049 } else {
1051 // set child references
1052 containerParent->addChildElement(transport);
1053 planParents.addDemandElementChild(transport);
1054 transport->incRef("buildTransport");
1055 }
1056 return true;
1057 } else {
1058 return false;
1059 }
1060}
1061
1062
1063bool
1065 const double arrivalPosition, const double departPosition, const double speed, const SUMOTime duration) {
1066 // get values
1067 GNEDemandElement* containerParent = getContainerParent(sumoBaseObject);
1068 const auto transhipTag = planParameters.getTranshipTag();
1069 GNEPlanParents planParents = GNEPlanParents(planParameters, myNet->getAttributeCarriers());
1070 // check conditions
1071 if (containerParent == nullptr) {
1073 } else if (transhipTag == SUMO_TAG_NOTHING) {
1074 return writeError(TL("invalid combination for personTrip"));
1075 } else if (!checkNegative(SUMO_TAG_TRANSHIP, containerParent->getID(), SUMO_ATTR_SPEED, speed, true)) {
1076 return false;
1077 } else if (!checkNegative(SUMO_TAG_TRANSHIP, containerParent->getID(), SUMO_ATTR_DURATION, duration, true)) {
1078 return false;
1079 } else if (planParents.checkIntegrity(transhipTag, containerParent, planParameters)) {
1080 // build tranship
1081 GNEDemandElement* tranship = new GNETranship(transhipTag, containerParent, planParents,
1082 departPosition, arrivalPosition, speed, duration);
1083 // continue depending of undo-redo
1084 if (myAllowUndoRedo) {
1085 myNet->getViewNet()->getUndoList()->begin(tranship, TLF("add % in '%'", tranship->getTagStr(), containerParent->getID()));
1086 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(tranship, true), true);
1088 } else {
1090 // set child references
1091 containerParent->addChildElement(tranship);
1092 planParents.addDemandElementChild(tranship);
1093 tranship->incRef("buildTranship");
1094 }
1095 return true;
1096 } else {
1097 return false;
1098 }
1099}
1100
1101
1102bool
1104 const double endPos, const SUMOTime duration, const SUMOTime until,
1105 const std::string& actType, const bool friendlyPos, const int parameterSet) {
1106 // get values
1107 GNEDemandElement* personParent = getPersonParent(sumoBaseObject);
1108 const auto personStopTag = planParameters.getPersonStopTag();
1109 GNEPlanParents planParents = GNEPlanParents(planParameters, myNet->getAttributeCarriers());
1110 // check conditions
1111 if (personParent == nullptr) {
1113 } else if (personStopTag == SUMO_TAG_NOTHING) {
1114 return writeError(TL("invalid combination for person stop"));
1115 } else if (planParents.checkIntegrity(personStopTag, personParent, planParameters)) {
1116 // build person stop
1117 GNEDemandElement* stopPlan = new GNEStopPlan(personStopTag, personParent, planParents,
1118 endPos, duration, until, actType, friendlyPos, parameterSet);
1119 // continue depending of undo-redo
1120 if (myAllowUndoRedo) {
1121 myNet->getViewNet()->getUndoList()->begin(stopPlan, TLF("add % in '%'", stopPlan->getTagStr(), personParent->getID()));
1122 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(stopPlan, true), true);
1124 } else {
1126 // set child references
1127 personParent->addChildElement(stopPlan);
1128 planParents.addDemandElementChild(stopPlan);
1129 stopPlan->incRef("buildPersonStop");
1130 }
1131 return true;
1132 } else {
1133 return false;
1134 }
1135}
1136
1137
1138bool
1140 const double endPos, const SUMOTime duration,
1141 const SUMOTime until, const std::string& actType, const bool friendlyPos, const int parameterSet) {
1142 // get values
1143 GNEDemandElement* containerParent = getContainerParent(sumoBaseObject);
1144 const auto containerStopTag = planParameters.getContainerStopTag();
1145 GNEPlanParents planParents = GNEPlanParents(planParameters, myNet->getAttributeCarriers());
1146 // check conditions
1147 if (containerParent == nullptr) {
1149 } else if (containerStopTag == SUMO_TAG_NOTHING) {
1150 return writeError(TL("invalid combination for containerStop"));
1151 } else if (planParents.checkIntegrity(containerStopTag, containerParent, planParameters)) {
1152 // build container stop
1153 GNEDemandElement* stopPlan = new GNEStopPlan(containerStopTag, containerParent, planParents,
1154 endPos, duration, until, actType, friendlyPos, parameterSet);
1155 // continue depending of undo-redo
1156 if (myAllowUndoRedo) {
1157 myNet->getViewNet()->getUndoList()->begin(stopPlan, TLF("add % in '%'", stopPlan->getTagStr(), containerParent->getID()));
1158 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(stopPlan, true), true);
1160 } else {
1162 // set child references
1163 containerParent->addChildElement(stopPlan);
1164 planParents.addDemandElementChild(stopPlan);
1165 stopPlan->incRef("buildContainerStop");
1166 }
1167 return true;
1168 } else {
1169 return false;
1170 }
1171}
1172
1173
1174bool
1176 const SUMOVehicleParameter::Stop& stopParameters) {
1177 // get obj parent
1178 const auto objParent = sumoBaseObject->getParentSumoBaseObject();
1179 // continue depending of objParent
1180 if (objParent == nullptr) {
1182 } else if ((objParent->getTag() == SUMO_TAG_PERSON) || (objParent->getTag() == SUMO_TAG_PERSONFLOW)) {
1183 return buildPersonStop(sumoBaseObject, planParameters, stopParameters.endPos,
1184 stopParameters.duration, stopParameters.until, stopParameters.actType, stopParameters.friendlyPos, stopParameters.parametersSet);
1185 } else if ((objParent->getTag() == SUMO_TAG_CONTAINER) || (objParent->getTag() == SUMO_TAG_CONTAINERFLOW)) {
1186 return buildContainerStop(sumoBaseObject, planParameters, stopParameters.endPos,
1187 stopParameters.duration, stopParameters.until, stopParameters.actType, stopParameters.friendlyPos, stopParameters.parametersSet);
1188 } else {
1189 // get vehicle tag
1190 SumoXMLTag vehicleTag = objParent->getTag();
1191 if (vehicleTag == SUMO_TAG_VEHICLE) {
1192 // check if vehicle is placed over route or with embedded route
1193 if (!objParent->hasStringAttribute(SUMO_ATTR_ROUTE)) {
1194 vehicleTag = GNE_TAG_VEHICLE_WITHROUTE;
1195 }
1196 } else if (vehicleTag == SUMO_TAG_FLOW) {
1197 if (objParent->hasStringAttribute(SUMO_ATTR_ROUTE)) {
1198 vehicleTag = GNE_TAG_FLOW_ROUTE;
1199 } else if (objParent->hasStringAttribute(SUMO_ATTR_FROM) && objParent->hasStringAttribute(SUMO_ATTR_TO)) {
1200 vehicleTag = SUMO_TAG_FLOW;
1201 } else {
1202 vehicleTag = GNE_TAG_FLOW_WITHROUTE;
1203 }
1204 }
1205 // get stop parent
1206 GNEDemandElement* stopParent = myNet->getAttributeCarriers()->retrieveDemandElement(vehicleTag, objParent->getStringAttribute(SUMO_ATTR_ID), false);
1207 // check if stopParent exist
1208 if (stopParent) {
1209 // flag for waypoint (is like a stop, but with extra attribute speed)
1210 bool waypoint = false;
1211 // abool waypoints for person and containers
1212 if (!stopParent->getTagProperty()->isPerson() && !stopParent->getTagProperty()->isContainer()) {
1213 waypoint = (sumoBaseObject->getStopParameter().parametersSet & STOP_SPEED_SET) || (sumoBaseObject->getStopParameter().speed > 0);
1214 }
1215 // declare pointers to parent elements
1216 GNEAdditional* stoppingPlace = nullptr;
1217 GNELane* lane = nullptr;
1218 GNEEdge* edge = nullptr;
1219 // declare stopTagType
1220 SumoXMLTag stopTagType = SUMO_TAG_NOTHING;
1221 // check conditions
1222 if (stopParameters.busstop.size() > 0) {
1223 stoppingPlace = myNet->getAttributeCarriers()->retrieveAdditional(SUMO_TAG_BUS_STOP, stopParameters.busstop, false);
1224 stopTagType = waypoint ? GNE_TAG_WAYPOINT_BUSSTOP : GNE_TAG_STOP_BUSSTOP;
1225 // check if is a train stop
1226 if (stoppingPlace == nullptr) {
1227 stoppingPlace = myNet->getAttributeCarriers()->retrieveAdditional(SUMO_TAG_TRAIN_STOP, stopParameters.busstop, false);
1228 stopTagType = waypoint ? GNE_TAG_WAYPOINT_TRAINSTOP : GNE_TAG_STOP_TRAINSTOP;
1229 }
1230 // containers cannot stops in busStops
1231 if (stopParent->getTagProperty()->isContainer()) {
1232 return writeError(TL("Containers don't support stops at busStops or trainStops"));
1233 }
1234 } else if (stopParameters.containerstop.size() > 0) {
1235 stoppingPlace = myNet->getAttributeCarriers()->retrieveAdditional(SUMO_TAG_CONTAINER_STOP, stopParameters.containerstop, false);
1237 // persons cannot stops in containerStops
1238 if (stopParent->getTagProperty()->isPerson()) {
1239 return writeError(TL("Persons don't support stops at containerStops"));
1240 }
1241 } else if (stopParameters.chargingStation.size() > 0) {
1244 // check person and containers
1245 if (stopParent->getTagProperty()->isPerson()) {
1246 return writeError(TL("Persons don't support stops at chargingStations"));
1247 } else if (stopParent->getTagProperty()->isContainer()) {
1248 return writeError(TL("Containers don't support stops at chargingStations"));
1249 }
1250 } else if (stopParameters.parkingarea.size() > 0) {
1251 stoppingPlace = myNet->getAttributeCarriers()->retrieveAdditional(SUMO_TAG_PARKING_AREA, stopParameters.parkingarea, false);
1252 stopTagType = waypoint ? GNE_TAG_WAYPOINT_PARKINGAREA : GNE_TAG_STOP_PARKINGAREA;
1253 // check person and containers
1254 if (stopParent->getTagProperty()->isPerson()) {
1255 return writeError(TL("Persons don't support stops at parkingAreas"));
1256 } else if (stopParent->getTagProperty()->isContainer()) {
1257 return writeError(TL("Containers don't support stops at parkingAreas"));
1258 }
1259 } else if (stopParameters.lane.size() > 0) {
1260 lane = myNet->getAttributeCarriers()->retrieveLane(stopParameters.lane, false);
1261 stopTagType = waypoint ? GNE_TAG_WAYPOINT_LANE : GNE_TAG_STOP_LANE;
1262 } else if (stopParameters.edge.size() > 0) {
1263 edge = myNet->getAttributeCarriers()->retrieveEdge(stopParameters.edge, false);
1264 // check vehicles
1265 if (stopParent->getTagProperty()->isVehicle()) {
1266 return writeError(TL("vehicles don't support stops at edges"));
1267 }
1268 }
1269 // overwrite lane with edge parent if we're handling a personStop
1270 if (lane && (stopParent->getTagProperty()->isPerson() || stopParent->getTagProperty()->isContainer())) {
1271 edge = lane->getParentEdge();
1272 lane = nullptr;
1273 }
1274 // check if values are correct
1275 if (stoppingPlace && lane && edge) {
1276 return writeError(TL("A stop must be defined either over a stoppingPlace, a edge or a lane"));
1277 } else if (!stoppingPlace && !lane && !edge) {
1278 return writeError(TL("A stop requires only a stoppingPlace, edge or lane"));
1279 } else if (stoppingPlace) {
1280 // create stop using stopParameters and stoppingPlace
1281 GNEDemandElement* stop = nullptr;
1282 if (stopParent->getTagProperty()->isPerson()) {
1283 if (stoppingPlace->getTagProperty()->getTag() == SUMO_TAG_BUS_STOP) {
1284 stop = new GNEStop(GNE_TAG_STOPPERSON_BUSSTOP, stopParent, stoppingPlace, stopParameters);
1285 } else {
1286 stop = new GNEStop(GNE_TAG_STOPPERSON_TRAINSTOP, stopParent, stoppingPlace, stopParameters);
1287 }
1288 } else if (stopParent->getTagProperty()->isContainer()) {
1289 stop = new GNEStop(GNE_TAG_STOPCONTAINER_CONTAINERSTOP, stopParent, stoppingPlace, stopParameters);
1290 } else {
1291 stop = new GNEStop(stopTagType, stopParent, stoppingPlace, stopParameters);
1292 }
1293 // add it depending of undoDemandElements
1294 if (myAllowUndoRedo) {
1295 myNet->getViewNet()->getUndoList()->begin(stop, TLF("add % in '%'", stop->getTagStr(), stopParent->getID()));
1296 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(stop, true), true);
1298 } else {
1300 stoppingPlace->addChildElement(stop);
1301 stopParent->addChildElement(stop);
1302 stop->incRef("buildStoppingPlaceStop");
1303 }
1304 return true;
1305 } else if (lane) {
1306 // create stop using stopParameters and lane (only for vehicles)
1307 GNEDemandElement* stop = new GNEStop(stopTagType, stopParent, lane, stopParameters);
1308 // add it depending of undoDemandElements
1309 if (myAllowUndoRedo) {
1310 myNet->getViewNet()->getUndoList()->begin(stop, TLF("add % in '%'", stop->getTagStr(), stopParent->getID()));
1311 myNet->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(stop, true), true);
1313 } else {
1315 lane->addChildElement(stop);
1316 stopParent->addChildElement(stop);
1317 stop->incRef("buildLaneStop");
1318 }
1319 return true;
1320 } else {
1321 return false;
1322 }
1323 } else {
1324 return false;
1325 }
1326 }
1327}
1328
1329
1330bool
1332 GNEAttributesEditor* personPlanAttributesEditor, GNEPlanCreator* planCreator,
1333 const bool centerAfterCreation) {
1334 // first check if person is valid
1335 if (personParent == nullptr) {
1336 return false;
1337 }
1338 // clear and set person object
1340 myPlanObject->setTag(personParent->getTagProperty()->getTag());
1342 // declare personPlan object
1344 // get person plan attributes
1345 personPlanAttributesEditor->fillSumoBaseObject(personPlanObject);
1346 // get attributes
1347 const std::vector<std::string> types = personPlanObject->hasStringListAttribute(SUMO_ATTR_VTYPES) ? personPlanObject->getStringListAttribute(SUMO_ATTR_VTYPES) :
1348 personPlanObject->hasStringAttribute(SUMO_ATTR_VTYPES) ? GNEAttributeCarrier::parse<std::vector<std::string> >(personPlanObject->getStringAttribute(SUMO_ATTR_VTYPES)) :
1349 std::vector<std::string>();
1350 const std::vector<std::string> modes = personPlanObject->hasStringListAttribute(SUMO_ATTR_MODES) ? personPlanObject->getStringListAttribute(SUMO_ATTR_MODES) :
1351 personPlanObject->hasStringAttribute(SUMO_ATTR_MODES) ? GNEAttributeCarrier::parse<std::vector<std::string> >(personPlanObject->getStringAttribute(SUMO_ATTR_MODES)) :
1352 std::vector<std::string>();
1353 const std::vector<std::string> lines = personPlanObject->hasStringListAttribute(SUMO_ATTR_LINES) ? personPlanObject->getStringListAttribute(SUMO_ATTR_LINES) :
1354 personPlanObject->hasStringAttribute(SUMO_ATTR_LINES) ? GNEAttributeCarrier::parse<std::vector<std::string> >(personPlanObject->getStringAttribute(SUMO_ATTR_LINES)) :
1355 std::vector<std::string>();
1356 const double arrivalPos = personPlanObject->hasDoubleAttribute(SUMO_ATTR_ARRIVALPOS) ? personPlanObject->getDoubleAttribute(SUMO_ATTR_ARRIVALPOS) :
1357 personPlanObject->hasStringAttribute(SUMO_ATTR_ARRIVALPOS) ? GNEAttributeCarrier::parse<double>(personPlanObject->getStringAttribute(SUMO_ATTR_ARRIVALPOS)) :
1358 -1;
1359 const double endPos = personPlanObject->hasDoubleAttribute(SUMO_ATTR_ENDPOS) ? personPlanObject->getDoubleAttribute(SUMO_ATTR_ENDPOS) :
1360 personPlanObject->hasStringAttribute(SUMO_ATTR_ENDPOS) ? GNEAttributeCarrier::parse<double>(personPlanObject->getStringAttribute(SUMO_ATTR_ENDPOS)) :
1361 planCreator->getClickedPositionOverLane();
1362 const SUMOTime duration = personPlanObject->hasTimeAttribute(SUMO_ATTR_DURATION) ? personPlanObject->getTimeAttribute(SUMO_ATTR_DURATION) :
1363 personPlanObject->hasStringAttribute(SUMO_ATTR_DURATION) ? GNEAttributeCarrier::parse<SUMOTime>(personPlanObject->getStringAttribute(SUMO_ATTR_DURATION)) :
1364 0;
1365 const SUMOTime until = personPlanObject->hasTimeAttribute(SUMO_ATTR_UNTIL) ? personPlanObject->getTimeAttribute(SUMO_ATTR_UNTIL) :
1366 personPlanObject->hasStringAttribute(SUMO_ATTR_UNTIL) ? GNEAttributeCarrier::parse<SUMOTime>(personPlanObject->getStringAttribute(SUMO_ATTR_UNTIL)) :
1367 0;
1368 const std::string actType = personPlanObject->hasStringAttribute(SUMO_ATTR_ACTTYPE) ? personPlanObject->getStringAttribute(SUMO_ATTR_ACTTYPE) : "";
1369 const bool friendlyPos = personPlanObject->hasBoolAttribute(SUMO_ATTR_FRIENDLY_POS) ? personPlanObject->getBoolAttribute(SUMO_ATTR_FRIENDLY_POS) :
1370 personPlanObject->hasStringAttribute(SUMO_ATTR_FRIENDLY_POS) ? GNEAttributeCarrier::parse<bool>(personPlanObject->getStringAttribute(SUMO_ATTR_FRIENDLY_POS)) :
1371 false;
1372 const double walkFactor = personPlanObject->hasDoubleAttribute(SUMO_ATTR_WALKFACTOR) ? personPlanObject->getDoubleAttribute(SUMO_ATTR_WALKFACTOR) : 0;
1373 const std::string group = personPlanObject->hasStringAttribute(SUMO_ATTR_GROUP) ? personPlanObject->getStringAttribute(SUMO_ATTR_GROUP) : "";
1374 const double speed = personPlanObject->hasDoubleAttribute(SUMO_ATTR_SPEED) ? personPlanObject->getDoubleAttribute(SUMO_ATTR_SPEED) : 0;
1375 // build depending of plan type
1376 if (planTemplate->getTagProperty()->isPlanWalk()) {
1377 buildWalk(personPlanObject, planCreator->getPlanParameteres(), arrivalPos, speed, duration);
1378 } else if (planTemplate->getTagProperty()->isPlanPersonTrip()) {
1379 buildPersonTrip(personPlanObject, planCreator->getPlanParameteres(), arrivalPos, types, modes, lines, walkFactor, group);
1380 } else if (planTemplate->getTagProperty()->isPlanRide()) {
1381 buildRide(personPlanObject, planCreator->getPlanParameteres(), arrivalPos, lines, group);
1382 } else if (planTemplate->getTagProperty()->isPlanStopPerson()) {
1383 // set specific stop parameters
1384 int parameterSet = 0;
1385 if (personPlanObject->hasTimeAttribute(SUMO_ATTR_DURATION)) {
1386 parameterSet |= STOP_DURATION_SET;
1387 }
1388 if (personPlanObject->hasTimeAttribute(SUMO_ATTR_UNTIL)) {
1389 parameterSet |= STOP_UNTIL_SET;
1390 }
1391 buildPersonStop(personPlanObject, planCreator->getPlanParameteres(), endPos, duration, until, actType, friendlyPos, parameterSet);
1392 }
1393 // get person
1394 const auto person = myNet->getAttributeCarriers()->retrieveDemandElement(personPlanObject->getParentSumoBaseObject()->getTag(),
1395 personPlanObject->getParentSumoBaseObject()->getStringAttribute(SUMO_ATTR_ID), false);
1396 if (person) {
1397 // center view after creation
1398 if (centerAfterCreation && !myNet->getViewNet()->getVisibleBoundary().around(person->getPositionInView())) {
1399 myNet->getViewNet()->centerTo(person->getPositionInView(), false);
1400 }
1401 }
1402 delete personPlanObject;
1403 return true;
1404}
1405
1406
1407bool
1409 GNEAttributesEditor* containerPlanAttributesEditor, GNEPlanCreator* planCreator,
1410 const bool centerAfterCreation) {
1411 // first check if container is valid
1412 if (containerParent == nullptr) {
1413 return false;
1414 }
1415 // clear and set container object
1417 myPlanObject->setTag(containerParent->getTagProperty()->getTag());
1418 myPlanObject->addStringAttribute(SUMO_ATTR_ID, containerParent->getID());
1419 // declare containerPlan object
1421 // get container plan attributes
1422 containerPlanAttributesEditor->fillSumoBaseObject(containerPlanObject);
1423 // get attributes
1424 const double speed = containerPlanObject->hasDoubleAttribute(SUMO_ATTR_SPEED) ? containerPlanObject->getDoubleAttribute(SUMO_ATTR_SPEED) :
1425 containerPlanObject->hasStringAttribute(SUMO_ATTR_SPEED) ? GNEAttributeCarrier::parse<double>(containerPlanObject->getStringAttribute(SUMO_ATTR_SPEED)) :
1426 0;
1427 const std::vector<std::string> lines = containerPlanObject->hasStringListAttribute(SUMO_ATTR_LINES) ? containerPlanObject->getStringListAttribute(SUMO_ATTR_LINES) :
1428 containerPlanObject->hasStringAttribute(SUMO_ATTR_LINES) ? GNEAttributeCarrier::parse<std::vector<std::string> >(containerPlanObject->getStringAttribute(SUMO_ATTR_LINES)) :
1429 std::vector<std::string>();
1430 const double departPos = containerPlanObject->hasDoubleAttribute(SUMO_ATTR_DEPARTPOS) ? containerPlanObject->getDoubleAttribute(SUMO_ATTR_DEPARTPOS) :
1431 containerPlanObject->hasStringAttribute(SUMO_ATTR_DEPARTPOS) ? GNEAttributeCarrier::parse<double>(containerPlanObject->getStringAttribute(SUMO_ATTR_DEPARTPOS)) :
1432 -1;
1433 const double arrivalPos = containerPlanObject->hasDoubleAttribute(SUMO_ATTR_ARRIVALPOS) ? containerPlanObject->getDoubleAttribute(SUMO_ATTR_ARRIVALPOS) :
1434 containerPlanObject->hasStringAttribute(SUMO_ATTR_ARRIVALPOS) ? GNEAttributeCarrier::parse<double>(containerPlanObject->getStringAttribute(SUMO_ATTR_ARRIVALPOS)) :
1435 -1;
1436 const double endPos = containerPlanObject->hasDoubleAttribute(SUMO_ATTR_ENDPOS) ? containerPlanObject->getDoubleAttribute(SUMO_ATTR_ENDPOS) :
1437 containerPlanObject->hasStringAttribute(SUMO_ATTR_ENDPOS) ? GNEAttributeCarrier::parse<double>(containerPlanObject->getStringAttribute(SUMO_ATTR_ENDPOS)) :
1438 planCreator->getClickedPositionOverLane();
1439 const SUMOTime duration = containerPlanObject->hasTimeAttribute(SUMO_ATTR_DURATION) ? containerPlanObject->getTimeAttribute(SUMO_ATTR_DURATION) :
1440 containerPlanObject->hasStringAttribute(SUMO_ATTR_DURATION) ? GNEAttributeCarrier::parse<SUMOTime>(containerPlanObject->getStringAttribute(SUMO_ATTR_DURATION)) :
1441 0;
1442 const SUMOTime until = containerPlanObject->hasTimeAttribute(SUMO_ATTR_UNTIL) ? containerPlanObject->getTimeAttribute(SUMO_ATTR_UNTIL) :
1443 containerPlanObject->hasStringAttribute(SUMO_ATTR_UNTIL) ? GNEAttributeCarrier::parse<SUMOTime>(containerPlanObject->getStringAttribute(SUMO_ATTR_UNTIL)) :
1444 0;
1445 const std::string actType = containerPlanObject->hasStringAttribute(SUMO_ATTR_ACTTYPE) ? containerPlanObject->getStringAttribute(SUMO_ATTR_ACTTYPE) : "";
1446 const bool friendlyPos = containerPlanObject->hasBoolAttribute(SUMO_ATTR_FRIENDLY_POS) ? containerPlanObject->getBoolAttribute(SUMO_ATTR_FRIENDLY_POS) :
1447 containerPlanObject->hasStringAttribute(SUMO_ATTR_FRIENDLY_POS) ? GNEAttributeCarrier::parse<bool>(containerPlanObject->getStringAttribute(SUMO_ATTR_FRIENDLY_POS)) :
1448 false;
1449 const std::string group = containerPlanObject->hasStringAttribute(SUMO_ATTR_GROUP) ? containerPlanObject->getStringAttribute(SUMO_ATTR_GROUP) : "";
1450 // build depending of plan type
1451 if (planTemplate->getTagProperty()->isPlanTranship()) {
1452 buildTranship(containerPlanObject, planCreator->getPlanParameteres(), arrivalPos, departPos, speed, duration);
1453 } else if (planTemplate->getTagProperty()->isPlanTransport()) {
1454 buildTransport(containerPlanObject, planCreator->getPlanParameteres(), arrivalPos, lines, group);
1455 } else if (planTemplate->getTagProperty()->isPlanStopContainer()) {
1456 // set stops specific parameters
1457 int parameterSet = 0;
1458 if (containerPlanObject->hasTimeAttribute(SUMO_ATTR_DURATION)) {
1459 parameterSet |= STOP_DURATION_SET;
1460 }
1461 if (containerPlanObject->hasTimeAttribute(SUMO_ATTR_UNTIL)) {
1462 parameterSet |= STOP_UNTIL_SET;
1463 }
1464 buildContainerStop(containerPlanObject, planCreator->getPlanParameteres(), endPos, duration, until, actType, friendlyPos, parameterSet);
1465 }
1466 // get container
1467 const auto container = myNet->getAttributeCarriers()->retrieveDemandElement(containerPlanObject->getParentSumoBaseObject()->getTag(),
1468 containerPlanObject->getParentSumoBaseObject()->getStringAttribute(SUMO_ATTR_ID), false);
1469 if (container) {
1470 // center view after creation
1471 if (centerAfterCreation && !myNet->getViewNet()->getVisibleBoundary().around(container->getPositionInView())) {
1472 myNet->getViewNet()->centerTo(container->getPositionInView(), false);
1473 }
1474 }
1475 delete containerPlanObject;
1476 return true;
1477}
1478
1479
1480void
1482 const auto tagProperty = originalPlan->getTagProperty();
1483 // clear and set container object
1485 myPlanObject->setTag(newParent->getTagProperty()->getTag());
1487 // declare personPlan object for adding all attributes
1489 planObject->setTag(tagProperty->getTag());
1490 // declare parameters
1492 // from-to elements
1493 if (tagProperty->planFromEdge()) {
1494 planParameters.fromEdge = originalPlan->getAttribute(SUMO_ATTR_FROM);
1495 }
1496 if (tagProperty->planToEdge()) {
1497 planParameters.toEdge = originalPlan->getAttribute(SUMO_ATTR_TO);
1498 }
1499 if (tagProperty->planFromJunction()) {
1500 planParameters.fromJunction = originalPlan->getAttribute(SUMO_ATTR_FROM_JUNCTION);
1501 }
1502 if (tagProperty->planToJunction()) {
1503 planParameters.toJunction = originalPlan->getAttribute(SUMO_ATTR_TO_JUNCTION);
1504 }
1505 if (tagProperty->planFromTAZ()) {
1506 planParameters.fromTAZ = originalPlan->getAttribute(SUMO_ATTR_FROM_TAZ);
1507 }
1508 if (tagProperty->planToTAZ()) {
1509 planParameters.toTAZ = originalPlan->getAttribute(SUMO_ATTR_TO_TAZ);
1510 }
1511 if (tagProperty->planFromBusStop()) {
1512 planParameters.fromBusStop = originalPlan->getAttribute(GNE_ATTR_FROM_BUSSTOP);
1513 }
1514 if (tagProperty->planToBusStop()) {
1515 planParameters.toBusStop = originalPlan->getAttribute(SUMO_ATTR_BUS_STOP);
1516 }
1517 if (tagProperty->planFromTrainStop()) {
1518 planParameters.fromTrainStop = originalPlan->getAttribute(GNE_ATTR_FROM_TRAINSTOP);
1519 }
1520 if (tagProperty->planToTrainStop()) {
1521 planParameters.toTrainStop = originalPlan->getAttribute(SUMO_ATTR_TRAIN_STOP);
1522 }
1523 if (tagProperty->planFromContainerStop()) {
1524 planParameters.fromContainerStop = originalPlan->getAttribute(GNE_ATTR_FROM_CONTAINERSTOP);
1525 }
1526 if (tagProperty->planToContainerStop()) {
1527 planParameters.toContainerStop = originalPlan->getAttribute(SUMO_ATTR_CONTAINER_STOP);
1528 }
1529 // single elements
1530 if (tagProperty->planEdge()) {
1531 planParameters.toEdge = originalPlan->getAttribute(SUMO_ATTR_EDGE);
1532 }
1533 if (tagProperty->planBusStop()) {
1534 planParameters.toBusStop = originalPlan->getAttribute(SUMO_ATTR_BUS_STOP);
1535 }
1536 if (tagProperty->planTrainStop()) {
1537 planParameters.toTrainStop = originalPlan->getAttribute(SUMO_ATTR_TRAIN_STOP);
1538 }
1539 if (tagProperty->planContainerStop()) {
1540 planParameters.toContainerStop = originalPlan->getAttribute(SUMO_ATTR_CONTAINER_STOP);
1541 }
1542 // route
1543 if (tagProperty->planRoute()) {
1544 planParameters.toRoute = originalPlan->getAttribute(SUMO_ATTR_ROUTE);
1545 }
1546 // path
1547 if (tagProperty->planConsecutiveEdges()) {
1548 planParameters.consecutiveEdges = GNEAttributeCarrier::parse<std::vector<std::string> >(originalPlan->getAttribute(SUMO_ATTR_EDGES));
1549 }
1550 // other elements
1551 planObject->addTimeAttribute(SUMO_ATTR_DURATION, 60);
1552 planObject->addTimeAttribute(SUMO_ATTR_UNTIL, 0);
1555 planObject->addDoubleAttribute(SUMO_ATTR_ENDPOS, 0);
1556 planObject->addDoubleAttribute(SUMO_ATTR_SPEED, 1.39);
1557 planObject->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, false);
1558 // add rest of attributes
1559 for (const auto& attrProperty : tagProperty->getAttributeProperties()) {
1560 if (!planObject->hasStringAttribute(attrProperty->getAttr())) {
1561 if (attrProperty->isFloat()) {
1562 if (!originalPlan->getAttribute(attrProperty->getAttr()).empty()) {
1563 planObject->addDoubleAttribute(attrProperty->getAttr(), originalPlan->getAttributeDouble(attrProperty->getAttr()));
1564 }
1565 } else if (attrProperty->isSUMOTime()) {
1566 if (!originalPlan->getAttribute(attrProperty->getAttr()).empty()) {
1567 planObject->addTimeAttribute(attrProperty->getAttr(), GNEAttributeCarrier::parse<SUMOTime>(originalPlan->getAttribute(attrProperty->getAttr())));
1568 }
1569 } else if (attrProperty->isBool()) {
1570 planObject->addBoolAttribute(attrProperty->getAttr(), GNEAttributeCarrier::parse<bool>(originalPlan->getAttribute(attrProperty->getAttr())));
1571 } else if (attrProperty->isList()) {
1572 planObject->addStringListAttribute(attrProperty->getAttr(), GNEAttributeCarrier::parse<std::vector<std::string> >(originalPlan->getAttribute(attrProperty->getAttr())));
1573 } else {
1574 planObject->addStringAttribute(attrProperty->getAttr(), originalPlan->getAttribute(attrProperty->getAttr()));
1575 }
1576 }
1577 }
1578 // create plan
1579 if (tagProperty->isPlanPersonTrip()) {
1580 buildPersonTrip(planObject, planParameters,
1586 planObject->getStringAttribute(SUMO_ATTR_GROUP));
1587 } else if (tagProperty->isPlanWalk()) {
1588 buildWalk(planObject, planParameters,
1592 } else if (tagProperty->isPlanRide()) {
1593 buildRide(planObject, planParameters,
1596 planObject->getStringAttribute(SUMO_ATTR_GROUP));
1597 } else if (tagProperty->isPlanStopPerson()) {
1598 // set parameters
1599 int parameterSet = 0;
1600 if (planObject->hasTimeAttribute(SUMO_ATTR_DURATION)) {
1601 parameterSet |= STOP_DURATION_SET;
1602 }
1603 if (planObject->hasTimeAttribute(SUMO_ATTR_UNTIL)) {
1604 parameterSet |= STOP_UNTIL_SET;
1605 }
1606 buildPersonStop(planObject, planParameters,
1609 planObject->getTimeAttribute(SUMO_ATTR_UNTIL),
1612 parameterSet);
1613 } else if (tagProperty->isPlanTransport()) {
1614 buildTransport(planObject, planParameters,
1617 planObject->getStringAttribute(SUMO_ATTR_GROUP));
1618 } else if (tagProperty->isPlanTranship()) {
1619 buildTranship(planObject, planParameters,
1624 } else if (tagProperty->isPlanStopContainer()) {
1625 // set parameters
1626 int parameterSet = 0;
1627 if (planObject->hasTimeAttribute(SUMO_ATTR_DURATION)) {
1628 parameterSet |= STOP_DURATION_SET;
1629 }
1630 if (planObject->hasTimeAttribute(SUMO_ATTR_UNTIL)) {
1631 parameterSet |= STOP_UNTIL_SET;
1632 }
1633 buildContainerStop(planObject, planParameters,
1636 planObject->getTimeAttribute(SUMO_ATTR_UNTIL),
1639 parameterSet);
1640 } else {
1641 throw ProcessError("Invalid plan for duplicating");
1642 }
1643}
1644
1645
1646bool
1647GNERouteHandler::checkViaAttribute(const SumoXMLTag tag, const std::string& id, const std::vector<std::string>& via) {
1648 for (const auto& edgeID : via) {
1649 if (myNet->getAttributeCarriers()->retrieveEdge(edgeID, false) == nullptr) {
1650 return writeError(TLF("Could not build % with ID '%' in netedit; via % with ID '%' doesn't exist.", toString(tag), id, toString(SUMO_TAG_EDGE), edgeID));
1651 }
1652 }
1653 return true;
1654}
1655
1656
1657void
1658GNERouteHandler::transformToVehicle(GNEVehicle* originalVehicle, bool createEmbeddedRoute) {
1659 // get pointer to net
1660 GNENet* net = originalVehicle->getNet();
1661 // check if transform after creation
1662 const bool inspectAfterTransform = net->getViewNet()->getInspectedElements().isACInspected(originalVehicle);
1663 // declare route handler
1664 GNERouteHandler routeHandler(net, originalVehicle->getAttribute(GNE_ATTR_DEMAND_FILE),
1666 // make a copy of the vehicle parameters
1667 SUMOVehicleParameter vehicleParameters = *originalVehicle;
1668 // obtain vClass
1669 const auto vClass = originalVehicle->getVClass();
1670 // set "yellow" as original route color
1671 RGBColor routeColor = RGBColor::YELLOW;
1672 // declare edges
1673 GNEDemandElement* originalRoute = nullptr;
1674 std::vector<GNEEdge*> routeEdges;
1675 // obtain edges depending of tag
1676 if (originalVehicle->getTagProperty()->vehicleRoute()) {
1677 // get route edges
1678 originalRoute = originalVehicle->getParentDemandElements().at(1);
1679 } else if (originalVehicle->getTagProperty()->vehicleRouteEmbedded()) {
1680 // get embedded route edges
1681 routeEdges = originalVehicle->getChildDemandElements().front()->getParentEdges();
1682 } else if (originalVehicle->getTagProperty()->vehicleEdges()) {
1683 // calculate path using from-via-to edges
1684 routeEdges = originalVehicle->getNet()->getDemandPathManager()->getPathCalculator()->calculateDijkstraPath(originalVehicle->getVClass(), originalVehicle->getParentEdges());
1685 }
1686 // declare edge IDs
1687 std::vector<std::string> edgeIDs;
1688 for (const auto& edge : routeEdges) {
1689 edgeIDs.push_back(edge->getID());
1690 }
1691 // only continue if edges are valid
1692 if (!originalRoute && routeEdges.empty()) {
1693 // declare header
1694 const std::string header = "Problem transforming to vehicle";
1695 // declare message
1696 const std::string message = "Vehicle cannot be transformed. Invalid number of edges";
1697 // open message box
1698 GNEWarningBasicDialog(originalVehicle->getNet()->getViewNet()->getViewParent()->getGNEAppWindows(), header, message);
1699 } else {
1700 // begin undo-redo operation
1701 net->getViewNet()->getUndoList()->begin(originalVehicle, "transform " + originalVehicle->getTagStr() + " to " + toString(SUMO_TAG_VEHICLE));
1702 // first delete vehicle
1703 net->deleteDemandElement(originalVehicle, net->getViewNet()->getUndoList());
1704 // check if new vehicle must have an embedded route
1705 if (createEmbeddedRoute) {
1706 // change tag in vehicle parameters
1707 vehicleParameters.tag = GNE_TAG_VEHICLE_WITHROUTE;
1708 // build embedded route
1709 if (originalRoute) {
1710 for (const auto& edge : originalRoute->getParentEdges()) {
1711 edgeIDs.push_back(edge->getID());
1712 }
1713 routeHandler.buildVehicleEmbeddedRoute(nullptr, vehicleParameters, edgeIDs, RGBColor::INVISIBLE, 0, 0, {});
1714 } else {
1715 routeHandler.buildVehicleEmbeddedRoute(nullptr, vehicleParameters, edgeIDs, RGBColor::INVISIBLE, 0, 0, {});
1716 }
1717 } else if (originalRoute) {
1718 // set route ID in vehicle parameters
1719 vehicleParameters.routeid = originalRoute->getID();
1720 // create vehicle
1721 routeHandler.buildVehicleOverRoute(nullptr, vehicleParameters);
1722 } else {
1723 // change tag in vehicle parameters
1724 vehicleParameters.tag = SUMO_TAG_VEHICLE;
1725 // generate route ID
1726 const std::string routeID = net->getAttributeCarriers()->generateDemandElementID(SUMO_TAG_ROUTE);
1727 // build route
1728 routeHandler.buildRoute(nullptr, routeID, vClass, edgeIDs, routeColor, 0, 0, DEFAULT_VEH_PROB, {});
1729 // set route ID in vehicle parameters
1730 vehicleParameters.routeid = routeID;
1731 // create vehicle
1732 routeHandler.buildVehicleOverRoute(nullptr, vehicleParameters);
1733 }
1734 // end undo-redo operation
1735 net->getViewNet()->getUndoList()->end();
1736 // check if inspect
1737 if (inspectAfterTransform) {
1738 // get created element
1739 auto transformedVehicle = net->getAttributeCarriers()->retrieveDemandElement(vehicleParameters.tag, vehicleParameters.id);
1740 // inspect it
1741 net->getViewNet()->getViewParent()->getInspectorFrame()->inspectElement(transformedVehicle);
1742 }
1743 }
1744}
1745
1746
1747void
1748GNERouteHandler::transformToRouteFlow(GNEVehicle* originalVehicle, bool createEmbeddedRoute) {
1749 // get pointer to net
1750 GNENet* net = originalVehicle->getNet();
1751 // check if transform after creation
1752 const bool inspectAfterTransform = net->getViewNet()->getInspectedElements().isACInspected(originalVehicle);
1753 // declare route handler
1754 GNERouteHandler routeHandler(net, originalVehicle->getAttribute(GNE_ATTR_DEMAND_FILE),
1756 // obtain vehicle parameters
1757 SUMOVehicleParameter vehicleParameters = *originalVehicle;
1758 // obtain vClass
1759 const auto vClass = originalVehicle->getVClass();
1760 // set "yellow" as original route color
1761 RGBColor routeColor = RGBColor::YELLOW;
1762 // declare edges
1763 GNEDemandElement* originalRoute = nullptr;
1764 std::vector<GNEEdge*> routeEdges;
1765 // obtain edges depending of tag
1766 if (originalVehicle->getTagProperty()->vehicleRoute()) {
1767 // get original route
1768 originalRoute = originalVehicle->getParentDemandElements().back();
1769 } else if (originalVehicle->getTagProperty()->vehicleRouteEmbedded()) {
1770 // get embedded route edges
1771 routeEdges = originalVehicle->getChildDemandElements().front()->getParentEdges();
1772 } else if (originalVehicle->getTagProperty()->vehicleEdges()) {
1773 // calculate path using from-via-to edges
1774 routeEdges = originalVehicle->getNet()->getDemandPathManager()->getPathCalculator()->calculateDijkstraPath(originalVehicle->getVClass(), originalVehicle->getParentEdges());
1775 }
1776 // declare edge IDs
1777 std::vector<std::string> edgeIDs;
1778 for (const auto& edge : routeEdges) {
1779 edgeIDs.push_back(edge->getID());
1780 }
1781 // only continue if edges are valid
1782 if (!originalRoute && routeEdges.empty()) {
1783 // declare header
1784 const std::string header = "Problem transforming to vehicle";
1785 // declare message
1786 const std::string message = "Vehicle cannot be transformed. Invalid number of edges";
1787 // open message box
1788 GNEWarningBasicDialog(originalVehicle->getNet()->getViewNet()->getViewParent()->getGNEAppWindows(), header, message);
1789 } else {
1790 // begin undo-redo operation
1791 net->getViewNet()->getUndoList()->begin(originalVehicle, "transform " + originalVehicle->getTagStr() + " to " + toString(GNE_TAG_FLOW_ROUTE));
1792 // first delete vehicle
1793 net->deleteDemandElement(originalVehicle, net->getViewNet()->getUndoList());
1794 // change depart
1795 if (!originalVehicle->getTagProperty()->isFlow()) {
1796 // get template flow
1797 const auto templateFlow = net->getViewNet()->getNet()->getACTemplates()->getTemplateAC(GNE_TAG_FLOW_ROUTE);
1798 // set flow parameters
1799 vehicleParameters.repetitionEnd = vehicleParameters.depart + string2time("3600");
1800 vehicleParameters.repetitionNumber = GNEAttributeCarrier::parse<int>(templateFlow->getAttribute(SUMO_ATTR_NUMBER));
1801 vehicleParameters.repetitionOffset = string2time(templateFlow->getAttribute(SUMO_ATTR_PERIOD));
1802 vehicleParameters.repetitionProbability = GNEAttributeCarrier::parse<double>(templateFlow->getAttribute(SUMO_ATTR_PROB));
1803 // by default, number and end enabled
1804 vehicleParameters.parametersSet = GNEAttributeCarrier::parse<int>(templateFlow->getAttribute(GNE_ATTR_FLOWPARAMETERS));
1805 }
1806 // check if new vehicle must have an embedded route
1807 if (createEmbeddedRoute) {
1808 // change tag in vehicle parameters
1809 vehicleParameters.tag = GNE_TAG_FLOW_WITHROUTE;
1810 // build embedded route
1811 if (originalRoute) {
1812 for (const auto& edge : originalRoute->getParentEdges()) {
1813 edgeIDs.push_back(edge->getID());
1814 }
1815 routeHandler.buildFlowEmbeddedRoute(nullptr, vehicleParameters, edgeIDs, RGBColor::INVISIBLE, 0, 0, {});
1816 } else {
1817 routeHandler.buildFlowEmbeddedRoute(nullptr, vehicleParameters, edgeIDs, RGBColor::INVISIBLE, 0, 0, {});
1818 }
1819 } else if (originalRoute) {
1820 // set route ID in vehicle parameters
1821 vehicleParameters.routeid = originalRoute->getID();
1822 // create vehicle
1823 routeHandler.buildFlowOverRoute(nullptr, vehicleParameters);
1824 } else {
1825 // change tag in vehicle parameters
1826 vehicleParameters.tag = GNE_TAG_FLOW_ROUTE;
1827 // generate a new route id
1828 const std::string routeID = net->getAttributeCarriers()->generateDemandElementID(SUMO_TAG_ROUTE);
1829 // build route
1830 routeHandler.buildRoute(nullptr, routeID, vClass, edgeIDs, routeColor, 0, 0, DEFAULT_VEH_PROB, {});
1831 // set route ID in vehicle parameters
1832 vehicleParameters.routeid = routeID;
1833 // create vehicle
1834 routeHandler.buildFlowOverRoute(nullptr, vehicleParameters);
1835 }
1836
1837 // end undo-redo operation
1838 net->getViewNet()->getUndoList()->end();
1839 // check if inspect
1840 if (inspectAfterTransform) {
1841 // get created element
1842 auto transformedVehicle = net->getAttributeCarriers()->retrieveDemandElement(vehicleParameters.tag, vehicleParameters.id);
1843 // inspect it
1844 net->getViewNet()->getViewParent()->getInspectorFrame()->inspectElement(transformedVehicle);
1845 }
1846 }
1847}
1848
1849
1850void
1852 // get pointer to net
1853 GNENet* net = originalVehicle->getNet();
1854 // check if transform after creation
1855 const bool inspectAfterTransform = net->getViewNet()->getInspectedElements().isACInspected(originalVehicle);
1856 // declare route handler
1857 GNERouteHandler routeHandler(net, originalVehicle->getAttribute(GNE_ATTR_DEMAND_FILE),
1859 // obtain vehicle parameters
1860 SUMOVehicleParameter vehicleParameters = *originalVehicle;
1861 // get route
1862 GNEDemandElement* route = nullptr;
1863 // declare edges
1864 std::vector<GNEEdge*> edges;
1865 // obtain edges depending of tag
1866 if (originalVehicle->getTagProperty()->vehicleRoute()) {
1867 // set route
1868 route = originalVehicle->getParentDemandElements().back();
1869 // get route edges
1870 edges = route->getParentEdges();
1871 } else if (originalVehicle->getTagProperty()->vehicleRouteEmbedded()) {
1872 // get embedded route edges
1873 edges = originalVehicle->getChildDemandElements().front()->getParentEdges();
1874 } else if (originalVehicle->getTagProperty()->vehicleEdges()) {
1875 // just take parent edges (from and to)
1876 edges = originalVehicle->getParentEdges();
1877 }
1878 // only continue if edges are valid
1879 if (edges.size() < 2) {
1880 // declare header
1881 const std::string header = "Problem transforming to vehicle";
1882 // declare message
1883 const std::string message = "Vehicle cannot be transformed. Invalid number of edges";
1884 // open message box
1885 GNEWarningBasicDialog(originalVehicle->getNet()->getViewNet()->getViewParent()->getGNEAppWindows(), header, message);
1886 } else {
1887 // begin undo-redo operation
1888 net->getViewNet()->getUndoList()->begin(originalVehicle, "transform " + originalVehicle->getTagStr() + " to " + toString(SUMO_TAG_TRIP));
1889 // first delete vehicle
1890 net->deleteDemandElement(originalVehicle, net->getViewNet()->getUndoList());
1891 // check if route has to be deleted
1892 if (route && route->getChildDemandElements().empty()) {
1893 net->deleteDemandElement(route, net->getViewNet()->getUndoList());
1894 }
1895 // change tag in vehicle parameters
1896 vehicleParameters.tag = SUMO_TAG_TRIP;
1897 // create trip
1898 routeHandler.buildTrip(nullptr, vehicleParameters, edges.front()->getID(), edges.back()->getID());
1899 // end undo-redo operation
1900 net->getViewNet()->getUndoList()->end();
1901 // check if inspect
1902 if (inspectAfterTransform) {
1903 // get created element
1904 auto transformedVehicle = net->getAttributeCarriers()->retrieveDemandElement(vehicleParameters.tag, vehicleParameters.id);
1905 // inspect it
1906 net->getViewNet()->getViewParent()->getInspectorFrame()->inspectElement(transformedVehicle);
1907 }
1908 }
1909}
1910
1911
1912void
1914 // get pointer to net
1915 GNENet* net = originalVehicle->getNet();
1916 // check if transform after creation
1917 const bool inspectAfterTransform = net->getViewNet()->getInspectedElements().isACInspected(originalVehicle);
1918 // declare route handler
1919 GNERouteHandler routeHandler(net, originalVehicle->getAttribute(GNE_ATTR_DEMAND_FILE),
1921 // obtain vehicle parameters
1922 SUMOVehicleParameter vehicleParameters = *originalVehicle;
1923 // declare route
1924 GNEDemandElement* route = nullptr;
1925 // declare edges
1926 std::vector<GNEEdge*> edges;
1927 // obtain edges depending of tag
1928 if (originalVehicle->getTagProperty()->vehicleRoute()) {
1929 // set route
1930 route = originalVehicle->getParentDemandElements().back();
1931 // get route edges
1932 edges = route->getParentEdges();
1933 } else if (originalVehicle->getTagProperty()->vehicleRouteEmbedded()) {
1934 // get embedded route edges
1935 edges = originalVehicle->getChildDemandElements().front()->getParentEdges();
1936 } else if (originalVehicle->getTagProperty()->vehicleEdges()) {
1937 // just take parent edges (from and to)
1938 edges = originalVehicle->getParentEdges();
1939 }
1940 // only continue if edges are valid
1941 if (edges.empty()) {
1942 // declare header
1943 const std::string header = "Problem transforming to vehicle";
1944 // declare message
1945 const std::string message = "Vehicle cannot be transformed. Invalid number of edges";
1946 // open message box
1947 GNEWarningBasicDialog(originalVehicle->getNet()->getViewNet()->getViewParent()->getGNEAppWindows(), header, message);
1948 } else {
1949 // begin undo-redo operation
1950 net->getViewNet()->getUndoList()->begin(originalVehicle, "transform " + originalVehicle->getTagStr() + " to " + toString(SUMO_TAG_VEHICLE));
1951 // first delete vehicle
1952 net->deleteDemandElement(originalVehicle, net->getViewNet()->getUndoList());
1953 // check if route has to be deleted
1954 if (route && route->getChildDemandElements().empty()) {
1955 net->deleteDemandElement(route, net->getViewNet()->getUndoList());
1956 }
1957 // change depart
1958 if (!originalVehicle->getTagProperty()->isFlow()) {
1959 // get template flow
1960 const auto templateFlow = net->getViewNet()->getNet()->getACTemplates()->getTemplateAC(GNE_TAG_FLOW_ROUTE);
1961 // set flow parameters
1962 vehicleParameters.repetitionEnd = vehicleParameters.depart + string2time("3600");
1963 vehicleParameters.repetitionNumber = GNEAttributeCarrier::parse<int>(templateFlow->getAttribute(SUMO_ATTR_NUMBER));
1964 vehicleParameters.repetitionOffset = string2time(templateFlow->getAttribute(SUMO_ATTR_PERIOD));
1965 vehicleParameters.repetitionProbability = GNEAttributeCarrier::parse<double>(templateFlow->getAttribute(SUMO_ATTR_PROB));
1966 // by default, number and end enabled
1967 vehicleParameters.parametersSet = GNEAttributeCarrier::parse<int>(templateFlow->getAttribute(GNE_ATTR_FLOWPARAMETERS));
1968 }
1969 // change tag in vehicle parameters
1970 vehicleParameters.tag = SUMO_TAG_FLOW;
1971 // create flow
1972 routeHandler.buildFlow(nullptr, vehicleParameters, edges.front()->getID(), edges.back()->getID());
1973 // end undo-redo operation
1974 net->getViewNet()->getUndoList()->end();
1975 // check if inspect
1976 if (inspectAfterTransform) {
1977 // get created element
1978 auto transformedVehicle = net->getAttributeCarriers()->retrieveDemandElement(vehicleParameters.tag, vehicleParameters.id);
1979 // inspect it
1980 net->getViewNet()->getViewParent()->getInspectorFrame()->inspectElement(transformedVehicle);
1981 }
1982 }
1983}
1984
1985
1986void
1988 // only continue if number of junctions are valid
1989 if (originalVehicle->getParentJunctions().empty()) {
1990 // declare header
1991 const std::string header = "Problem transforming to trip over junctions";
1992 // declare message
1993 const std::string message = "Vehicle cannot be transformed. Invalid number of junctions";
1994 // open message box
1995 GNEWarningBasicDialog(originalVehicle->getNet()->getViewNet()->getViewParent()->getGNEAppWindows(), header, message);
1996 } else {
1997 // get pointer to net
1998 GNENet* net = originalVehicle->getNet();
1999 // get TAZs before deleting vehicle
2000 const auto fromJunction = originalVehicle->getParentJunctions().front()->getID();
2001 const auto toJunction = originalVehicle->getParentJunctions().back()->getID();
2002 // check if transform after creation
2003 const bool inspectAfterTransform = net->getViewNet()->getInspectedElements().isACInspected(originalVehicle);
2004 // declare route handler
2005 GNERouteHandler routeHandler(net, originalVehicle->getAttribute(GNE_ATTR_DEMAND_FILE),
2007 // obtain vehicle parameters
2008 SUMOVehicleParameter vehicleParameters = *originalVehicle;
2009 // begin undo-redo operation
2010 net->getViewNet()->getUndoList()->begin(originalVehicle, "transform " + originalVehicle->getTagStr() + " to " + toString(GNE_TAG_TRIP_JUNCTIONS));
2011 // first delete vehicle
2012 net->deleteDemandElement(originalVehicle, net->getViewNet()->getUndoList());
2013 // change tag in vehicle parameters
2014 vehicleParameters.tag = GNE_TAG_TRIP_JUNCTIONS;
2015 // create trip
2016 routeHandler.buildTripJunctions(nullptr, vehicleParameters, fromJunction, toJunction);
2017 // end undo-redo operation
2018 net->getViewNet()->getUndoList()->end();
2019 // check if inspect
2020 if (inspectAfterTransform) {
2021 // get created element
2022 auto transformedVehicle = net->getAttributeCarriers()->retrieveDemandElement(vehicleParameters.tag, vehicleParameters.id);
2023 // inspect it
2024 net->getViewNet()->getViewParent()->getInspectorFrame()->inspectElement(transformedVehicle);
2025 }
2026 }
2027}
2028
2029
2030void
2032 // only continue if number of junctions are valid
2033 if (originalVehicle->getParentJunctions().empty()) {
2034 // declare header
2035 const std::string header = "Problem transforming to flow over junctions";
2036 // declare message
2037 const std::string message = "Vehicle cannot be transformed. Invalid number of junctions";
2038 // open message box
2039 GNEWarningBasicDialog(originalVehicle->getNet()->getViewNet()->getViewParent()->getGNEAppWindows(), header, message);
2040 } else {
2041 // get pointer to net
2042 GNENet* net = originalVehicle->getNet();
2043 // get TAZs before deleting vehicle
2044 const auto fromJunction = originalVehicle->getParentJunctions().front()->getID();
2045 const auto toJunction = originalVehicle->getParentJunctions().back()->getID();
2046 // check if transform after creation
2047 const bool inspectAfterTransform = net->getViewNet()->getInspectedElements().isACInspected(originalVehicle);
2048 // declare route handler
2049 GNERouteHandler routeHandler(net, originalVehicle->getAttribute(GNE_ATTR_DEMAND_FILE),
2051 // obtain vehicle parameters
2052 SUMOVehicleParameter vehicleParameters = *originalVehicle;
2053 // begin undo-redo operation
2054 net->getViewNet()->getUndoList()->begin(originalVehicle, "transform " + originalVehicle->getTagStr() + " to " + toString(GNE_TAG_FLOW_JUNCTIONS));
2055 // first delete vehicle
2056 net->deleteDemandElement(originalVehicle, net->getViewNet()->getUndoList());
2057 // get template flow
2058 const auto templateFlow = net->getViewNet()->getNet()->getACTemplates()->getTemplateAC(GNE_TAG_FLOW_JUNCTIONS);
2059 // set flow parameters
2060 vehicleParameters.repetitionEnd = vehicleParameters.depart + string2time("3600");
2061 vehicleParameters.repetitionNumber = GNEAttributeCarrier::parse<int>(templateFlow->getAttribute(SUMO_ATTR_NUMBER));
2062 vehicleParameters.repetitionOffset = string2time(templateFlow->getAttribute(SUMO_ATTR_PERIOD));
2063 vehicleParameters.repetitionProbability = GNEAttributeCarrier::parse<double>(templateFlow->getAttribute(SUMO_ATTR_PROB));
2064 // by default, number and end enabled
2065 vehicleParameters.parametersSet = GNEAttributeCarrier::parse<int>(templateFlow->getAttribute(GNE_ATTR_FLOWPARAMETERS));
2066 // change tag in vehicle parameters
2067 vehicleParameters.tag = GNE_TAG_FLOW_JUNCTIONS;
2068 // create flow
2069 routeHandler.buildFlowJunctions(nullptr, vehicleParameters, fromJunction, toJunction);
2070 // end undo-redo operation
2071 net->getViewNet()->getUndoList()->end();
2072 // check if inspect
2073 if (inspectAfterTransform) {
2074 // get created element
2075 auto transformedVehicle = net->getAttributeCarriers()->retrieveDemandElement(vehicleParameters.tag, vehicleParameters.id);
2076 // inspect it
2077 net->getViewNet()->getViewParent()->getInspectorFrame()->inspectElement(transformedVehicle);
2078 }
2079 }
2080}
2081
2082
2083void
2085 // only continue if number of junctions are valid
2086 if (originalVehicle->getParentAdditionals().empty()) {
2087 // declare header
2088 const std::string header = "Problem transforming to trip over TAZs";
2089 // declare message
2090 const std::string message = "Vehicle cannot be transformed. Invalid number of TAZs";
2091 // open message box
2092 GNEWarningBasicDialog(originalVehicle->getNet()->getViewNet()->getViewParent()->getGNEAppWindows(), header, message);
2093 } else {
2094 // get pointer to net
2095 GNENet* net = originalVehicle->getNet();
2096 // get TAZs before deleting vehicle
2097 const auto fromTAZ = originalVehicle->getParentAdditionals().front()->getID();
2098 const auto toTAZ = originalVehicle->getParentAdditionals().back()->getID();
2099 // check if transform after creation
2100 const bool inspectAfterTransform = net->getViewNet()->getInspectedElements().isACInspected(originalVehicle);
2101 // declare route handler
2102 GNERouteHandler routeHandler(net, originalVehicle->getAttribute(GNE_ATTR_DEMAND_FILE),
2104 // obtain vehicle parameters
2105 SUMOVehicleParameter vehicleParameters = *originalVehicle;
2106 // begin undo-redo operation
2107 net->getViewNet()->getUndoList()->begin(originalVehicle, "transform " + originalVehicle->getTagStr() + " to " + toString(GNE_TAG_TRIP_TAZS));
2108 // first delete vehicle
2109 net->deleteDemandElement(originalVehicle, net->getViewNet()->getUndoList());
2110 // change tag in vehicle parameters
2111 vehicleParameters.tag = GNE_TAG_TRIP_TAZS;
2112 // create trip
2113 routeHandler.buildTripTAZs(nullptr, vehicleParameters, fromTAZ, toTAZ);
2114 // end undo-redo operation
2115 net->getViewNet()->getUndoList()->end();
2116 // check if inspect
2117 if (inspectAfterTransform) {
2118 // get created element
2119 auto transformedVehicle = net->getAttributeCarriers()->retrieveDemandElement(vehicleParameters.tag, vehicleParameters.id);
2120 // inspect it
2121 net->getViewNet()->getViewParent()->getInspectorFrame()->inspectElement(transformedVehicle);
2122 }
2123 }
2124}
2125
2126
2127void
2129 // only continue if number of junctions are valid
2130 if (originalVehicle->getParentAdditionals().empty()) {
2131 // declare header
2132 const std::string header = "Problem transforming to flow over TAZs";
2133 // declare message
2134 const std::string message = "Vehicle cannot be transformed. Invalid number of TAZs";
2135 // open message box
2136 GNEWarningBasicDialog(originalVehicle->getNet()->getViewNet()->getViewParent()->getGNEAppWindows(), header, message);
2137 } else {
2138 // get pointer to net
2139 GNENet* net = originalVehicle->getNet();
2140 // get TAZs before deleting vehicle
2141 const auto fromTAZ = originalVehicle->getParentAdditionals().front()->getID();
2142 const auto toTAZ = originalVehicle->getParentAdditionals().back()->getID();
2143 // check if transform after creation
2144 const bool inspectAfterTransform = net->getViewNet()->getInspectedElements().isACInspected(originalVehicle);
2145 // declare route handler
2146 GNERouteHandler routeHandler(net, originalVehicle->getAttribute(GNE_ATTR_DEMAND_FILE),
2148 // obtain vehicle parameters
2149 SUMOVehicleParameter vehicleParameters = *originalVehicle;
2150 // begin undo-redo operation
2151 net->getViewNet()->getUndoList()->begin(originalVehicle, "transform " + originalVehicle->getTagStr() + " to " + toString(GNE_TAG_FLOW_TAZS));
2152 // first delete vehicle
2153 net->deleteDemandElement(originalVehicle, net->getViewNet()->getUndoList());
2154 // get template flow
2155 const auto templateFlow = net->getViewNet()->getNet()->getACTemplates()->getTemplateAC(GNE_TAG_FLOW_TAZS);
2156 // set flow parameters
2157 vehicleParameters.repetitionEnd = vehicleParameters.depart + string2time("3600");
2158 vehicleParameters.repetitionNumber = GNEAttributeCarrier::parse<int>(templateFlow->getAttribute(SUMO_ATTR_NUMBER));
2159 vehicleParameters.repetitionOffset = string2time(templateFlow->getAttribute(SUMO_ATTR_PERIOD));
2160 vehicleParameters.repetitionProbability = GNEAttributeCarrier::parse<double>(templateFlow->getAttribute(SUMO_ATTR_PROB));
2161 // by default, number and end enabled
2162 vehicleParameters.parametersSet = GNEAttributeCarrier::parse<int>(templateFlow->getAttribute(GNE_ATTR_FLOWPARAMETERS));
2163 // change tag in vehicle parameters
2164 vehicleParameters.tag = GNE_TAG_FLOW_TAZS;
2165 // create flow
2166 routeHandler.buildFlowTAZs(nullptr, vehicleParameters, fromTAZ, toTAZ);
2167 // end undo-redo operation
2168 net->getViewNet()->getUndoList()->end();
2169 // check if inspect
2170 if (inspectAfterTransform) {
2171 // get created element
2172 auto transformedVehicle = net->getAttributeCarriers()->retrieveDemandElement(vehicleParameters.tag, vehicleParameters.id);
2173 // inspect it
2174 net->getViewNet()->getViewParent()->getInspectorFrame()->inspectElement(transformedVehicle);
2175 }
2176 }
2177}
2178
2179
2180void
2182 // get pointer to net
2183 GNENet* net = originalPerson->getNet();
2184 // check if transform after creation
2185 const bool inspectAfterTransform = net->getViewNet()->getInspectedElements().isACInspected(originalPerson);
2186 // declare route handler
2187 GNERouteHandler routeHandler(net, originalPerson->getAttribute(GNE_ATTR_DEMAND_FILE),
2189 // obtain person parameters
2190 SUMOVehicleParameter personParameters = *originalPerson;
2191 // save ID
2192 const auto ID = personParameters.id;
2193 // set dummy ID
2194 personParameters.id = "%dummyID%";
2195 // begin undo-redo operation
2196 net->getViewNet()->getUndoList()->begin(originalPerson, "transform " + originalPerson->getTagStr() + " to " + toString(SUMO_TAG_PERSON));
2197 // create personFlow and get it
2198 routeHandler.buildPerson(nullptr, personParameters);
2199 auto newPerson = net->getAttributeCarriers()->retrieveDemandElement(SUMO_TAG_PERSON, "%dummyID%");
2200 // duplicate plans in new person
2201 for (const auto& personPlan : originalPerson->getChildDemandElements()) {
2202 routeHandler.duplicatePlan(personPlan, newPerson);
2203 }
2204 // delete original person plan
2205 net->deleteDemandElement(originalPerson, net->getViewNet()->getUndoList());
2206 // restore ID of new person plan
2207 newPerson->setAttribute(SUMO_ATTR_ID, ID, net->getViewNet()->getUndoList());
2208 // finish undoList
2209 net->getViewNet()->getUndoList()->end();
2210 // check if inspect
2211 if (inspectAfterTransform) {
2213 }
2214}
2215
2216
2217void
2219 // get pointer to net
2220 GNENet* net = originalPerson->getNet();
2221 // check if transform after creation
2222 const bool inspectAfterTransform = net->getViewNet()->getInspectedElements().isACInspected(originalPerson);
2223 // declare route handler
2224 GNERouteHandler routeHandler(net, originalPerson->getAttribute(GNE_ATTR_DEMAND_FILE),
2226 // obtain person parameters
2227 SUMOVehicleParameter personParameters = *originalPerson;
2228 // get person plans
2229 const auto personPlans = originalPerson->getChildDemandElements();
2230 // save ID
2231 const auto ID = personParameters.id;
2232 // set dummy ID
2233 personParameters.id = "%dummyID%";
2234 // begin undo-redo operation
2235 net->getViewNet()->getUndoList()->begin(originalPerson, "transform " + originalPerson->getTagStr() + " to " + toString(SUMO_TAG_PERSONFLOW));
2236 // create personFlow and get it
2237 routeHandler.buildPersonFlow(nullptr, personParameters);
2238 auto newPerson = net->getAttributeCarriers()->retrieveDemandElement(SUMO_TAG_PERSONFLOW, "%dummyID%");
2239 // move all person plans to new person
2240 for (const auto& personPlan : personPlans) {
2241 routeHandler.duplicatePlan(personPlan, newPerson);
2242 }
2243 // delete original person plan
2244 net->deleteDemandElement(originalPerson, net->getViewNet()->getUndoList());
2245 // restore ID of new person plan
2246 newPerson->setAttribute(SUMO_ATTR_ID, ID, net->getViewNet()->getUndoList());
2247 // enable attributes
2248 newPerson->enableAttribute(SUMO_ATTR_END, net->getViewNet()->getUndoList());
2249 newPerson->enableAttribute(SUMO_ATTR_PERSONSPERHOUR, net->getViewNet()->getUndoList());
2250 // finish undoList
2251 net->getViewNet()->getUndoList()->end();
2252 // check if inspect
2253 if (inspectAfterTransform) {
2255 }
2256}
2257
2258
2259void
2261 // get pointer to net
2262 GNENet* net = originalContainer->getNet();
2263 // check if transform after creation
2264 const bool inspectAfterTransform = net->getViewNet()->getInspectedElements().isACInspected(originalContainer);
2265 // declare route handler
2266 GNERouteHandler routeHandler(net, originalContainer->getAttribute(GNE_ATTR_DEMAND_FILE),
2268 // obtain container parameters
2269 SUMOVehicleParameter containerParameters = *originalContainer;
2270 // get container plans
2271 const auto containerPlans = originalContainer->getChildDemandElements();
2272 // save ID
2273 const auto ID = containerParameters.id;
2274 // set dummy ID
2275 containerParameters.id = "%dummyID%";
2276 // begin undo-redo operation
2277 net->getViewNet()->getUndoList()->begin(originalContainer, "transform " + originalContainer->getTagStr() + " to " + toString(SUMO_TAG_CONTAINER));
2278 // create containerFlow
2279 routeHandler.buildContainer(nullptr, containerParameters);
2280 // move all container plans to new container
2281 for (const auto& containerPlan : containerPlans) {
2282 containerPlan->setAttribute(GNE_ATTR_PARENT, "%dummyID%", net->getViewNet()->getUndoList());
2283 }
2284 // delete original container plan
2285 net->deleteDemandElement(originalContainer, net->getViewNet()->getUndoList());
2286 // restore ID of new container plan
2287 auto newContainer = net->getAttributeCarriers()->retrieveDemandElement(SUMO_TAG_CONTAINER, "%dummyID%");
2288 newContainer->setAttribute(SUMO_ATTR_ID, ID, net->getViewNet()->getUndoList());
2289 // finish undoList
2290 net->getViewNet()->getUndoList()->end();
2291 // check if inspect
2292 if (inspectAfterTransform) {
2293 net->getViewNet()->getViewParent()->getInspectorFrame()->inspectElement(newContainer);
2294 }
2295}
2296
2297
2298void
2300 // get pointer to net
2301 GNENet* net = originalContainer->getNet();
2302 // check if transform after creation
2303 const bool inspectAfterTransform = net->getViewNet()->getInspectedElements().isACInspected(originalContainer);
2304 // declare route handler
2305 GNERouteHandler routeHandler(net, originalContainer->getAttribute(GNE_ATTR_DEMAND_FILE),
2307 // obtain container parameters
2308 SUMOVehicleParameter containerParameters = *originalContainer;
2309 // get container plans
2310 const auto containerPlans = originalContainer->getChildDemandElements();
2311 // save ID
2312 const auto ID = containerParameters.id;
2313 // set dummy ID
2314 containerParameters.id = "%dummyID%";
2315 // begin undo-redo operation
2316 net->getViewNet()->getUndoList()->begin(originalContainer, "transform " + originalContainer->getTagStr() + " to " + toString(SUMO_TAG_CONTAINERFLOW));
2317 // create containerFlow
2318 routeHandler.buildContainerFlow(nullptr, containerParameters);
2319 // move all container plans to new container
2320 for (const auto& containerPlan : containerPlans) {
2321 containerPlan->setAttribute(GNE_ATTR_PARENT, "%dummyID%", net->getViewNet()->getUndoList());
2322 }
2323 // delete original container plan
2324 net->deleteDemandElement(originalContainer, net->getViewNet()->getUndoList());
2325 // restore ID of new container plan
2326 auto newContainer = net->getAttributeCarriers()->retrieveDemandElement(SUMO_TAG_CONTAINERFLOW, "%dummyID%");
2327 newContainer->setAttribute(SUMO_ATTR_ID, ID, net->getViewNet()->getUndoList());
2328 // enable attributes
2329 newContainer->enableAttribute(SUMO_ATTR_END, net->getViewNet()->getUndoList());
2330 newContainer->enableAttribute(SUMO_ATTR_CONTAINERSPERHOUR, net->getViewNet()->getUndoList());
2331 // finish undoList
2332 net->getViewNet()->getUndoList()->end();
2333 // check if inspect
2334 if (inspectAfterTransform) {
2335 net->getViewNet()->getViewParent()->getInspectorFrame()->inspectElement(newContainer);
2336 }
2337}
2338
2339
2340bool
2342 // continue depending of element
2343 if (element->getTagProperty()->getTag() == SUMO_TAG_ROUTE) {
2344 return canReverse(element->getNet(), SVC_PEDESTRIAN, element->getParentEdges());
2345 } else if (element->getTagProperty()->vehicleRoute()) {
2346 return canReverse(element->getNet(), element->getVClass(), element->getParentDemandElements().at(1)->getParentEdges());
2347 } else if (element->getTagProperty()->vehicleRouteEmbedded()) {
2348 return canReverse(element->getNet(), element->getVClass(), element->getChildDemandElements().front()->getParentEdges());
2349 } else if (element->getTagProperty()->vehicleEdges()) {
2350 return canReverse(element->getNet(), element->getVClass(), element->getParentEdges());
2351 } else if (element->getTagProperty()->vehicleJunctions()) {
2353 element->getParentJunctions().back(), element->getParentJunctions().front()).size() > 0);
2354 } else if (element->getTagProperty()->vehicleTAZs()) {
2355 return true;
2356 } else {
2357 return false;
2358 }
2359}
2360
2361
2362bool
2363GNERouteHandler::canReverse(GNENet* net, SUMOVehicleClass vClass, const std::vector<GNEEdge*>& edges) {
2364 if (edges.empty()) {
2365 return false;
2366 } else {
2367 // obtain opposite edges
2368 std::vector<GNEEdge*> reverseEdges;
2369 for (const auto& edge : edges) {
2370 const auto oppositeEdges = edge->getOppositeEdges();
2371 // stop if there isn't opposite edges for the current edge
2372 if (oppositeEdges.empty()) {
2373 return false;
2374 } else {
2375 reverseEdges.push_back(oppositeEdges.front());
2376 }
2377 }
2378 // reverse edges
2379 std::reverse(reverseEdges.begin(), reverseEdges.end());
2380 // now check if exist a path
2381 return (net->getDemandPathManager()->getPathCalculator()->calculateDijkstraPath(vClass, edges).size() > 0);
2382 }
2383}
2384
2385
2386void
2388 // get undo list
2389 auto undoList = element->getNet()->getViewNet()->getUndoList();
2390 // continue depending of element
2391 if (element->getTagProperty()->vehicleRoute()) {
2392 // reverse parent route
2393 reverse(element->getParentDemandElements().at(1));
2394 } else if (element->getTagProperty()->vehicleRouteEmbedded()) {
2395 // reverse embedded route
2396 reverse(element->getChildDemandElements().front());
2397 } else if (element->getTagProperty()->vehicleJunctions()) {
2398 // get from to junctions
2399 const auto fromJunction = element->getAttribute(SUMO_ATTR_FROM_JUNCTION);
2400 const auto toJunction = element->getAttribute(SUMO_ATTR_TO_JUNCTION);
2401 // swap both attributes
2402 element->setAttribute(SUMO_ATTR_FROM_JUNCTION, toJunction, undoList);
2403 element->setAttribute(SUMO_ATTR_TO_JUNCTION, fromJunction, undoList);
2404 } else if (element->getTagProperty()->vehicleTAZs()) {
2405 // get from to TAZs
2406 const auto fromTAZ = element->getAttribute(SUMO_ATTR_FROM_TAZ);
2407 const auto toTAZ = element->getAttribute(SUMO_ATTR_TO_TAZ);
2408 // swap both attributes
2409 element->setAttribute(SUMO_ATTR_FROM_TAZ, toTAZ, undoList);
2410 element->setAttribute(SUMO_ATTR_TO_TAZ, fromTAZ, undoList);
2411 } else {
2412 // extract and reverse opposite edges
2413 std::vector<GNEEdge*> oppositeEdges;
2414 for (const auto& edge : element->getParentEdges()) {
2415 oppositeEdges.push_back(edge->getOppositeEdges().front());
2416 }
2417 std::reverse(oppositeEdges.begin(), oppositeEdges.end());
2418 if (element->isRoute()) {
2419 element->setAttribute(SUMO_ATTR_EDGES, GNEAttributeCarrier::parseIDs(oppositeEdges), undoList);
2420 } else {
2421 // set from and to
2422 element->setAttribute(SUMO_ATTR_FROM, oppositeEdges.front()->getID(), undoList);
2423 element->setAttribute(SUMO_ATTR_TO, oppositeEdges.back()->getID(), undoList);
2424 // check if add via attribute
2425 oppositeEdges.erase(oppositeEdges.begin());
2426 oppositeEdges.pop_back();
2427 if (oppositeEdges.size() > 0) {
2428 element->setAttribute(SUMO_ATTR_VIA, GNEAttributeCarrier::parseIDs(oppositeEdges), undoList);
2429 }
2430 }
2431 }
2432}
2433
2434
2435void
2437 GNEDemandElement* elementCopy = nullptr;
2438 if (element->getTagProperty()->getTag() == SUMO_TAG_ROUTE) {
2439 // make a copy of the route and reverse
2440 elementCopy = GNERoute::copyRoute(dynamic_cast<GNERoute*>(element));
2441 } else if (element->getTagProperty()->isVehicle()) {
2442 // make a copy of the vehicle
2443 elementCopy = GNEVehicle::copyVehicle(dynamic_cast<GNEVehicle*>(element));
2444 }
2445 // reverse copied element
2446 reverse(elementCopy);
2447}
2448
2449// ===========================================================================
2450// protected
2451// ===========================================================================
2452
2454GNERouteHandler::parseJunction(const SumoXMLTag tag, const std::string& id, const std::string& junctionID) {
2455 GNEJunction* junction = myNet->getAttributeCarriers()->retrieveJunction(junctionID, false);
2456 // empty junctions aren't allowed. If junction is empty, write error, clear junctions and stop
2457 if (junction == nullptr) {
2458 writeErrorInvalidParent(tag, id, {SUMO_TAG_JUNCTION}, junctionID);
2459 }
2460 return junction;
2461}
2462
2463
2465GNERouteHandler::parseTAZ(const SumoXMLTag tag, const std::string& id, const std::string& TAZID) {
2467 // empty TAZs aren't allowed. If TAZ is empty, write error, clear TAZs and stop
2468 if (TAZ == nullptr) {
2469 writeErrorInvalidParent(tag, id, {SUMO_TAG_TAZ}, TAZID);
2470 }
2471 return TAZ;
2472}
2473
2474
2475GNEEdge*
2476GNERouteHandler::parseEdge(const SumoXMLTag tag, const std::string& id, const std::string& edgeID,
2477 const CommonXMLStructure::SumoBaseObject* sumoBaseObject,
2478 const bool firstEdge) {
2479 GNEEdge* edge = nullptr;
2480 if (edgeID.empty()) {
2481 if (sumoBaseObject->getSumoBaseObjectChildren().size() > 0) {
2482 const auto frontTag = sumoBaseObject->getSumoBaseObjectChildren().front()->getTag();
2483 const auto backTag = sumoBaseObject->getSumoBaseObjectChildren().back()->getTag();
2484 if (firstEdge && ((frontTag == SUMO_TAG_STOP) || (frontTag == SUMO_TAG_TRAIN_STOP) ||
2485 (frontTag == SUMO_TAG_CONTAINER_STOP) || (frontTag == SUMO_TAG_CHARGING_STATION) ||
2486 (frontTag == SUMO_TAG_PARKING_AREA))) {
2487 edge = parseStopEdge(sumoBaseObject->getSumoBaseObjectChildren().front());
2488 } else if (!firstEdge && ((backTag == SUMO_TAG_STOP) || (backTag == SUMO_TAG_TRAIN_STOP) ||
2489 (backTag == SUMO_TAG_CONTAINER_STOP) || (backTag == SUMO_TAG_CHARGING_STATION) ||
2490 (backTag == SUMO_TAG_PARKING_AREA))) {
2491 edge = parseStopEdge(sumoBaseObject->getSumoBaseObjectChildren().back());
2492 }
2493 }
2494 } else {
2495 edge = myNet->getAttributeCarriers()->retrieveEdge(edgeID, false);
2496 }
2497 // write info if edge doesn't exist
2498 if (edge == nullptr) {
2499 writeErrorInvalidParent(tag, id, {SUMO_TAG_EDGE}, edgeID);
2500 }
2501 return edge;
2502}
2503
2504
2505GNEEdge*
2507 if (sumoBaseObject->hasStringAttribute(SUMO_ATTR_EDGE)) {
2508 return myNet->getAttributeCarriers()->retrieveEdge(sumoBaseObject->getStringAttribute(SUMO_ATTR_EDGE), false);
2509 } else if (sumoBaseObject->hasStringAttribute(SUMO_ATTR_LANE)) {
2510 return parseEdgeFromLaneID(sumoBaseObject->getStringAttribute(SUMO_ATTR_LANE));
2511 } else if (sumoBaseObject->hasStringAttribute(SUMO_ATTR_BUS_STOP)) {
2514 if (busStop != nullptr) {
2515 return busStop->getParentLanes().front()->getParentEdge();
2516 } else if (trainStop != nullptr) {
2517 return trainStop->getParentLanes().front()->getParentEdge();
2518 } else {
2519 return nullptr;
2520 }
2521 } else if (sumoBaseObject->hasStringAttribute(SUMO_ATTR_TRAIN_STOP)) {
2524 if (busStop != nullptr) {
2525 return busStop->getParentLanes().front()->getParentEdge();
2526 } else if (trainStop != nullptr) {
2527 return trainStop->getParentLanes().front()->getParentEdge();
2528 } else {
2529 return nullptr;
2530 }
2531 } else if (sumoBaseObject->hasStringAttribute(SUMO_ATTR_CONTAINER_STOP)) {
2533 if (containerStop != nullptr) {
2534 return containerStop->getParentLanes().front()->getParentEdge();
2535 } else {
2536 return nullptr;
2537 }
2538
2539 } else if (sumoBaseObject->hasStringAttribute(SUMO_ATTR_CHARGING_STATION)) {
2541 if (containerStop != nullptr) {
2542 return containerStop->getParentLanes().front()->getParentEdge();
2543 } else {
2544 return nullptr;
2545 }
2546
2547 } else if (sumoBaseObject->hasStringAttribute(SUMO_ATTR_PARKING_AREA)) {
2549 if (parkingArea != nullptr) {
2550 return parkingArea->getParentLanes().front()->getParentEdge();
2551 } else {
2552 return nullptr;
2553 }
2554 } else {
2555 return nullptr;
2556 }
2557}
2558
2559
2560GNEEdge*
2561GNERouteHandler::parseEdgeFromLaneID(const std::string& laneID) const {
2562 std::string edgeID = laneID;
2563 for (int i = ((int)laneID.size() - 1); (i >= 0) && (laneID[i + 1] != '_'); i--) {
2564 edgeID.pop_back();
2565 }
2566 return myNet->getAttributeCarriers()->retrieveEdge(edgeID, false);
2567}
2568
2569
2570std::vector<GNEEdge*>
2571GNERouteHandler::parseEdges(const SumoXMLTag tag, const std::string& id, const std::vector<std::string>& edgeIDs) {
2572 std::vector<GNEEdge*> edges;
2573 for (const auto& edgeID : edgeIDs) {
2574 GNEEdge* edge = myNet->getAttributeCarriers()->retrieveEdge(edgeID, false);
2575 // empty edges aren't allowed. If edge is empty, write error, clear edges and stop
2576 if (edge == nullptr) {
2577 writeError(TLF("Could not build % with ID '%' in netedit; % with ID '%' doesn't exist.", toString(tag), id, toString(SUMO_TAG_EDGE), edgeID));
2578 edges.clear();
2579 return edges;
2580 } else {
2581 edges.push_back(edge);
2582 }
2583 }
2584 return edges;
2585}
2586
2587
2589GNERouteHandler::getType(const std::string& id) const {
2591 if (type == nullptr) {
2593 } else {
2594 return type;
2595 }
2596}
2597
2598
2600GNERouteHandler::getRoute(const std::string& id) const {
2602 if (type == nullptr) {
2604 } else {
2605 return type;
2606 }
2607}
2608
2609
2612 // check that sumoBaseObject has parent
2613 if (sumoBaseObject->getParentSumoBaseObject() == nullptr) {
2614 return nullptr;
2615 }
2616 if ((sumoBaseObject->getParentSumoBaseObject()->getTag() != SUMO_TAG_PERSON) &&
2617 (sumoBaseObject->getParentSumoBaseObject()->getTag() != SUMO_TAG_PERSONFLOW)) {
2618 return nullptr;
2619 }
2620 // try it with person
2622 // if empty, try it with personFlow
2623 if (personParent == nullptr) {
2625 } else {
2626 return personParent;
2627 }
2628}
2629
2630
2633 // check that sumoBaseObject has parent
2634 if (sumoBaseObject->getParentSumoBaseObject() == nullptr) {
2635 return nullptr;
2636 }
2637 if ((sumoBaseObject->getParentSumoBaseObject()->getTag() != SUMO_TAG_CONTAINER) &&
2638 (sumoBaseObject->getParentSumoBaseObject()->getTag() != SUMO_TAG_CONTAINERFLOW)) {
2639 return nullptr;
2640 }
2641 // try it with container
2643 // if empty, try it with containerFlow
2644 if (containerParent == nullptr) {
2646 } else {
2647 return containerParent;
2648 }
2649}
2650
2651
2654 // check that sumoBaseObject has parent
2655 if (sumoBaseObject->getParentSumoBaseObject() == nullptr) {
2656 return nullptr;
2657 }
2658 if (sumoBaseObject->getParentSumoBaseObject()->getTag() != SUMO_TAG_ROUTE_DISTRIBUTION) {
2659 return nullptr;
2660 }
2662}
2663
2664
2667 // check that sumoBaseObject has parent
2668 if (sumoBaseObject->getParentSumoBaseObject() == nullptr) {
2669 return nullptr;
2670 }
2671 if (sumoBaseObject->getParentSumoBaseObject()->getTag() != SUMO_TAG_VTYPE_DISTRIBUTION) {
2672 return nullptr;
2673 }
2675}
2676
2677
2678bool
2680 const std::vector<std::string>& distributionElementIDs, const std::vector<double>& probabilities,
2681 std::vector<const GNEDemandElement*>& elements) {
2682 // get distribution tag and ID
2683 std::string distributionTag = toString(sumoBaseObject->getTag());
2684 std::string distributionID = sumoBaseObject->getStringAttribute(SUMO_ATTR_ID);
2685 // first parse vType IDs
2686 for (const auto& distributionElementID : distributionElementIDs) {
2687 auto distributionElement = myNet->getAttributeCarriers()->retrieveDemandElement(distributionElementTag, distributionElementID, false);
2688 if (distributionElement) {
2689 elements.push_back(distributionElement);
2690 } else {
2691 return writeError(TLF("% with id '%' doesn't exist in % '%'", toString(distributionElementTag), distributionElementID, distributionTag, distributionID));
2692 }
2693 }
2694 // check probabilities
2695 for (const auto& probability : probabilities) {
2696 if (probability < 0) {
2697 return writeError(TLF("invalid probability % in % '%'", toString(probability), distributionTag, distributionID));
2698 }
2699 }
2700 // check that number of elements and probabilities is the same
2701 if (elements.size() != probabilities.size()) {
2702 return writeError(TLF("Invalid type distribution probabilities in % '%'. Must have the same number of elements", distributionTag, distributionID));
2703 } else {
2704 return true;
2705 }
2706}
2707
2708
2710GNERouteHandler::retrieveDemandElement(const std::vector<SumoXMLTag> tags, const std::string& id) {
2711 for (const auto& tag : tags) {
2712 // retrieve demand element
2713 auto demandElement = myNet->getAttributeCarriers()->retrieveDemandElement(tag, id, false);
2714 if (demandElement) {
2715 return demandElement;
2716 }
2717 }
2718 return nullptr;
2719}
2720
2721
2722bool
2724 if (demandElement) {
2725 if (myOverwriteElements) {
2726 // delete element
2727 myNet->deleteDemandElement(demandElement, myNet->getViewNet()->getUndoList());
2728 } else if (myRemainElements) {
2729 // duplicated demand
2730 return writeWarningDuplicated(tag, demandElement->getID(), demandElement->getTagProperty()->getTag());
2731 } else {
2732 // open overwrite dialog
2733 GNEOverwriteElement overwriteElementDialog(this, demandElement);
2734 // continue depending of result
2735 if (overwriteElementDialog.getResult() == GNEOverwriteElement::Result::ACCEPT) {
2736 // delete element
2737 myNet->deleteDemandElement(demandElement, myNet->getViewNet()->getUndoList());
2738 } else if (overwriteElementDialog.getResult() == GNEOverwriteElement::Result::CANCEL) {
2739 // duplicated demand
2740 return writeWarningDuplicated(tag, demandElement->getID(), demandElement->getTagProperty()->getTag());
2741 } else {
2742 return false;
2743 }
2744 }
2745 }
2746 return true;
2747}
2748
2749/****************************************************************************/
long long int SUMOTime
Definition GUI.h:36
#define WRITE_WARNING(msg)
Definition MsgHandler.h:286
#define TL(string)
Definition MsgHandler.h:304
#define TLF(string,...)
Definition MsgHandler.h:306
SUMOTime string2time(const std::string &r)
convert string to SUMOTime
Definition SUMOTime.cpp:46
const double DEFAULT_VEH_PROB
const std::set< std::string > DEFAULT_VTYPES
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types.
@ SVC_PEDESTRIAN
pedestrian
const long long int VEHPARS_DEPARTSPEED_SET
const int STOP_DURATION_SET
@ GIVEN
The lane is given.
const int STOP_SPEED_SET
const int STOP_UNTIL_SET
@ GIVEN
The speed is given.
const long long int VEHPARS_DEPARTLANE_SET
SumoXMLTag
Numbers representing SUMO-XML - element names.
@ GNE_TAG_TRIP_JUNCTIONS
a trip between junctions
@ GNE_TAG_TRIP_TAZS
a single trip definition that uses TAZs
@ GNE_TAG_VTYPEREF
reference to a vType (used in VType distributions)
@ GNE_TAG_WAYPOINT_PARKINGAREA
@ GNE_TAG_STOP_PARKINGAREA
stop placed over a parking area
@ SUMO_TAG_TAZ
a traffic assignment zone
@ SUMO_TAG_CHARGING_STATION
A Charging Station.
@ SUMO_TAG_VTYPE
description of a vehicle/person/container type
@ SUMO_TAG_WALK
@ SUMO_TAG_NOTHING
invalid tag, must be the last one
@ SUMO_TAG_TRANSHIP
@ SUMO_TAG_CONTAINER_STOP
A container stop.
@ GNE_TAG_STOP_BUSSTOP
stop placed over a busStop
@ SUMO_TAG_CONTAINERFLOW
@ GNE_TAG_WAYPOINT_TRAINSTOP
@ GNE_TAG_WAYPOINT_CONTAINERSTOP
@ GNE_TAG_WAYPOINT_BUSSTOP
@ SUMO_TAG_BUS_STOP
A bus stop.
@ GNE_TAG_WAYPOINT_CHARGINGSTATION
@ GNE_TAG_STOPPERSON_BUSSTOP
@ SUMO_TAG_STOP
stop for vehicles
@ SUMO_TAG_VEHICLE
description of a vehicle
@ GNE_TAG_FLOW_ROUTE
a flow definition using a route instead of a from-to edges route
@ SUMO_TAG_ROUTE_DISTRIBUTION
distribution of a route
@ GNE_TAG_FLOW_JUNCTIONS
a flow between junctions
@ GNE_TAG_STOP_CONTAINERSTOP
stop placed over a containerStop
@ GNE_TAG_STOPCONTAINER_CONTAINERSTOP
@ GNE_TAG_FLOW_WITHROUTE
description of a vehicle with an embedded route
@ SUMO_TAG_FLOW
a flow definition using from and to edges or a route
@ SUMO_TAG_PARKING_AREA
A parking area.
@ SUMO_TAG_TRANSPORT
@ GNE_TAG_FLOW_TAZS
a flow between TAZs
@ SUMO_TAG_CONTAINER
@ SUMO_TAG_JUNCTION
begin/end of the description of a junction
@ SUMO_TAG_ROUTE
description of a route
@ SUMO_TAG_RIDE
@ SUMO_TAG_TRAIN_STOP
A train stop (alias for bus stop)
@ SUMO_TAG_VTYPE_DISTRIBUTION
distribution of a vehicle type
@ GNE_TAG_VEHICLE_WITHROUTE
description of a vehicle with an embedded route
@ GNE_TAG_WAYPOINT_LANE
@ SUMO_TAG_PERSON
@ SUMO_TAG_PERSONTRIP
@ GNE_TAG_STOP_LANE
stop placed over a lane
@ GNE_TAG_STOPPERSON_TRAINSTOP
@ GNE_TAG_STOP_TRAINSTOP
stop placed over a trainStop
@ GNE_TAG_STOP_CHARGINGSTATION
stop placed over a charging station
@ GNE_TAG_ROUTEREF
virtual element used to reference routes with distributions
@ GNE_TAG_ROUTE_EMBEDDED
embedded route
@ SUMO_TAG_PERSONFLOW
@ SUMO_TAG_TRIP
a single trip definition (used by router)
@ SUMO_TAG_EDGE
begin/end of the description of an edge
@ SUMO_ATTR_LINES
@ GNE_ATTR_FROM_TRAINSTOP
@ SUMO_ATTR_NUMBER
@ GNE_ATTR_DEMAND_FILE
demand demand file
@ SUMO_ATTR_LANE
@ GNE_ATTR_FROM_BUSSTOP
@ SUMO_ATTR_FROM_JUNCTION
@ SUMO_ATTR_SPEED
@ SUMO_ATTR_VIA
@ SUMO_ATTR_CONTAINER_STOP
@ SUMO_ATTR_PARKING_AREA
@ SUMO_ATTR_EDGE
@ SUMO_ATTR_BUS_STOP
@ SUMO_ATTR_TRAIN_STOP
@ SUMO_ATTR_ENDPOS
@ SUMO_ATTR_TO_JUNCTION
@ GNE_ATTR_FLOWPARAMETERS
flow parameters (integer for mask end, number, etc...)
@ GNE_ATTR_PARENT
parent of an additional element
@ SUMO_ATTR_ARRIVALPOS
@ SUMO_ATTR_ACTTYPE
@ SUMO_ATTR_EDGES
the edges of a route
@ SUMO_ATTR_CHARGING_STATION
@ SUMO_ATTR_CONTAINERSPERHOUR
@ SUMO_ATTR_MODES
@ SUMO_ATTR_VTYPES
@ SUMO_ATTR_DEPARTPOS
@ SUMO_ATTR_GROUP
@ GNE_ATTR_FROM_CONTAINERSTOP
@ SUMO_ATTR_PERIOD
@ SUMO_ATTR_TO_TAZ
@ SUMO_ATTR_DEPARTSPEED
@ SUMO_ATTR_TO
@ SUMO_ATTR_FROM
@ SUMO_ATTR_END
weights: time range end
@ SUMO_ATTR_FROM_TAZ
@ SUMO_ATTR_DEPARTLANE
@ SUMO_ATTR_PROB
@ SUMO_ATTR_FRIENDLY_POS
@ SUMO_ATTR_WALKFACTOR
@ SUMO_ATTR_ROUTE
@ SUMO_ATTR_MAXSPEED
@ SUMO_ATTR_ID
@ SUMO_ATTR_UNTIL
@ SUMO_ATTR_DURATION
@ SUMO_ATTR_REPEAT
@ SUMO_ATTR_PERSONSPERHOUR
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:46
bool around(const Position &p, double offset=0) const
Returns whether the boundary contains the given coordinate.
Definition Boundary.cpp:169
bool writeError(const std::string &error)
write error and enable error creating element
bool writeWarningDuplicated(const SumoXMLTag tag, const std::string &id, const SumoXMLTag checkedTag)
write warning duplicated element
bool writeErrorInvalidParent(const SumoXMLTag tag, const std::string &id, const std::vector< SumoXMLTag > parentTags, const std::string &parentID)
write error "invalid parent element" giving ids of current and parent element
bool myOverwriteElements
overwrite elements
const std::string myFilename
filename
bool checkNegative(const SumoXMLTag tag, const std::string &id, const SumoXMLAttr attribute, const int value, const bool canBeZero)
check if the given int value is NOT negative
bool checkValidDemandElementID(const SumoXMLTag tag, const std::string &value)
check if the given demand elmement ID is valid
bool myRemainElements
remain elements
plan parameters (used for group all from-to parameters related with plans)
SumoXMLTag getPersonStopTag() const
get the person stop tag for the current combination of parameters
std::string fromJunction
from junction
SumoXMLTag getRideTag() const
get the ride tag for the current combination of parameters
std::string fromContainerStop
from containerStop
std::string fromTrainStop
from trainStop
SumoXMLTag getPersonTripTag() const
get the personTrip tag for the current combination of parameters
SumoXMLTag getTransportTag() const
get the transport tag for the current combination of parameters
std::vector< std::string > consecutiveEdges
consecutive edges
SumoXMLTag getContainerStopTag() const
get the container stop tag for the current combination of parameters
std::string toContainerStop
to containerStop
SumoXMLTag getWalkTag() const
get the walk tag for the current combination of parameters
SumoXMLTag getTranshipTag() const
get the tranship tag for the current combination of parameters
const SUMOVehicleParameter::Stop & getStopParameter() const
get stop parameters
SUMOTime getTimeAttribute(const SumoXMLAttr attr) const
get time attribute
bool hasBoolAttribute(const SumoXMLAttr attr) const
check if current SumoBaseObject has the given bool attribute
bool hasStringAttribute(const SumoXMLAttr attr) const
has function
void setTag(const SumoXMLTag tag)
set SumoBaseObject tag
SumoBaseObject * getParentSumoBaseObject() const
get pointer to mySumoBaseObjectParent SumoBaseObject (if is null, then is the root)
bool hasTimeAttribute(const SumoXMLAttr attr) const
check if current SumoBaseObject has the given time attribute
void addBoolAttribute(const SumoXMLAttr attr, const bool value)
add bool attribute into current SumoBaseObject node
SumoXMLTag getTag() const
get XML myTag
void addTimeAttribute(const SumoXMLAttr attr, const SUMOTime value)
add time attribute into current SumoBaseObject node
void addStringListAttribute(const SumoXMLAttr attr, const std::vector< std::string > &value)
add string list attribute into current SumoBaseObject node
void addDoubleAttribute(const SumoXMLAttr attr, const double value)
add double attribute into current SumoBaseObject node
bool hasDoubleAttribute(const SumoXMLAttr attr) const
check if current SumoBaseObject has the given double attribute
bool getBoolAttribute(const SumoXMLAttr attr) const
get bool attribute
void addStringAttribute(const SumoXMLAttr attr, const std::string &value)
add string attribute into current SumoBaseObject node
double getDoubleAttribute(const SumoXMLAttr attr) const
get double attribute
const std::vector< std::string > & getStringListAttribute(const SumoXMLAttr attr) const
get string list attribute
bool hasStringListAttribute(const SumoXMLAttr attr) const
check if current SumoBaseObject has the given string list attribute
const std::string & getStringAttribute(const SumoXMLAttr attr) const
get string attribute
const std::vector< SumoBaseObject * > & getSumoBaseObjectChildren() const
get SumoBaseObject children
virtual double getAttributeDouble(SumoXMLAttr key) const =0
const std::string getID() const override
get ID (all Attribute Carriers have one)
const std::string & getTagStr() const
get tag assigned to this object in string format
const GNETagProperties * getTagProperty() const
get tagProperty associated with this Attribute Carrier
GNENet * getNet() const
get pointer to net
static std::string parseIDs(const std::vector< T > &ACs)
parses a list of specific Attribute Carriers into a string of IDs
virtual void setAttribute(SumoXMLAttr key, const std::string &value, GNEUndoList *undoList)=0
virtual std::string getAttribute(SumoXMLAttr key) const =0
SumoXMLAttr fillSumoBaseObject(CommonXMLStructure::SumoBaseObject *baseObject) const
fill sumo Base object
std::string getAttribute(SumoXMLAttr key) const override
inherited from GNEAttributeCarrier
virtual SUMOVehicleClass getVClass() const =0
obtain VClass related with this demand element
Result getResult() const
get result to indicate if this dialog was closed accepting or rejecting changes
Definition GNEDialog.cpp:96
const GNEHierarchicalContainerParents< GNEAdditional * > & getParentAdditionals() const
get parent additionals
const GNEHierarchicalContainerParents< GNEDemandElement * > & getParentDemandElements() const
get parent demand elements
const GNEHierarchicalContainerParents< GNEEdge * > & getParentEdges() const
get parent edges
void addChildElement(ChildType *element)
add child without updating parent (ONLY used if we're creating elements without undo-redo)
const GNEHierarchicalContainerParents< GNEJunction * > & getParentJunctions() const
get parent junctions
const GNEHierarchicalContainerParents< GNELane * > & getParentLanes() const
get parent lanes
const GNEHierarchicalContainerChildren< GNEDemandElement * > & getChildDemandElements() const
return child demand elements
void inspectElement(GNEAttributeCarrier *AC, GNEAttributeCarrier *previousInspectedAC=nullptr)
Inspect a single element.
GNEEdge * getParentEdge() const
get parent edge
Definition GNELane.cpp:214
GNEAttributeCarrier * getTemplateAC(const SumoXMLTag tag) const
get template AC by tag
GNELane * retrieveLane(const std::string &id, bool hardFail=true, bool checkVolatileChange=false) const
get lane by id
void deleteDemandElement(GNEDemandElement *demandElement, const bool updateFrames)
delete demand element of container
std::string generateDemandElementID(SumoXMLTag tag) const
generate demand element id
GNEAdditional * retrieveAdditional(SumoXMLTag type, const std::string &id, bool hardFail=true) const
Returns the named additional.
GNEJunction * retrieveJunction(const std::string &id, bool hardFail=true) const
get junction by id
GNEDemandElement * retrieveDemandElements(const std::vector< SumoXMLTag > types, const std::string &id, bool hardFail=true) const
Returns the named demand element.
void insertDemandElement(GNEDemandElement *demandElement)
Insert a demand element in container.
GNEEdge * retrieveEdge(const std::string &id, bool hardFail=true) const
get edge by id
GNEDemandElement * retrieveDemandElement(SumoXMLTag type, const std::string &id, bool hardFail=true) const
Returns the named demand element.
A NBNetBuilder extended by visualisation and editing capabilities.
Definition GNENet.h:42
void deleteDemandElement(GNEDemandElement *demandElement, GNEUndoList *undoList)
remove demand element
Definition GNENet.cpp:746
GNEPathManager * getDemandPathManager()
get demand path manager
Definition GNENet.cpp:174
GNENetHelper::ACTemplate * getACTemplates() const
get all attribute carriers templates used in this net
Definition GNENet.cpp:150
GNENetHelper::AttributeCarriers * getAttributeCarriers() const
get all attribute carriers used in this net
Definition GNENet.cpp:144
GNEViewNet * getViewNet() const
get view net
Definition GNENet.cpp:2193
bool isRoute() const
check if pathElement is a route
std::vector< GNEEdge * > calculateDijkstraPath(const SUMOVehicleClass vClass, const std::vector< GNEEdge * > &edges) const
calculate Dijkstra path between a list of edges (for example, from-via-to edges)
PathCalculator * getPathCalculator()
obtain instance of PathCalculator
std::string getAttribute(SumoXMLAttr key) const override
inherited from GNEAttributeCarrier
double getClickedPositionOverLane() const
get clicked position over lane
const CommonXMLStructure::PlanParameters & getPlanParameteres() const
get plan parameters
GNEPlanParents (used for group all plan parents)
bool checkIntegrity(SumoXMLTag planTag, const GNEDemandElement *parent, const CommonXMLStructure::PlanParameters &planParameters) const
check integrity between planParameters and GNE elements
void addDemandElementChild(GNEDemandElement *element)
add the given demand element in the element as child
void incRef(const std::string &debugMsg="")
Increase reference.
GNEEdge * parseStopEdge(const CommonXMLStructure::SumoBaseObject *sumoBaseObject) const
parse stop edge
bool buildTripJunctions(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const SUMOVehicleParameter &vehicleParameters, const std::string &fromJunctionID, const std::string &toJunctionID)
build trip over junctions
GNEDemandElement * getRouteDistributionParent(const CommonXMLStructure::SumoBaseObject *sumoBaseObject) const
get route distribution parent
static void addReverse(GNEDemandElement *element)
add reverse for given demand element
bool buildRide(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const CommonXMLStructure::PlanParameters &planParameters, const double arrivalPos, const std::vector< std::string > &lines, const std::string &group)
build ride
bool buildVType(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const SUMOVTypeParameter &vTypeParameter)
build vType
CommonXMLStructure::SumoBaseObject * myPlanObject
pointer for person and container plans
GNEDemandElement * getPersonParent(const CommonXMLStructure::SumoBaseObject *sumoBaseObject) const
get person parent
const bool myAllowUndoRedo
allow undo/redo
GNEEdge * parseEdgeFromLaneID(const std::string &laneID) const
parse edge from lane ID
bool buildWalk(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const CommonXMLStructure::PlanParameters &planParameters, const double arrivalPos, const double speed, const SUMOTime duration)
build walk
GNEJunction * parseJunction(const SumoXMLTag tag, const std::string &id, const std::string &junctionID)
parse junction
bool buildRoute(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &id, SUMOVehicleClass vClass, const std::vector< std::string > &edgeIDs, const RGBColor &color, const int repeat, const SUMOTime cycleTime, const double probability, const Parameterised::Map &routeParameters)
build route
bool buildPersonTrip(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const CommonXMLStructure::PlanParameters &planParameters, const double arrivalPos, const std::vector< std::string > &types, const std::vector< std::string > &modes, const std::vector< std::string > &lines, const double walkFactor, const std::string &group)
build person trip
static void transformToRouteFlow(GNEVehicle *originalVehicle, bool createEmbeddedRoute)
transform routeFlow over an existent route
GNENet * myNet
pointer to GNENet
void duplicatePlan(const GNEDemandElement *originalPlan, GNEDemandElement *newParent)
duplicate given plan in new parent
bool buildContainerPlan(const GNEDemandElement *planTemplate, GNEDemandElement *containerParent, GNEAttributesEditor *containerPlanAttributesEditor, GNEPlanCreator *planCreator, const bool centerAfterCreation)
build container plan
bool buildPersonPlan(const GNEDemandElement *planTemplate, GNEDemandElement *personParent, GNEAttributesEditor *personPlanAttributesEditor, GNEPlanCreator *planCreator, const bool centerAfterCreation)
build person plan
bool buildRouteRef(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &routeID, const double probability)
build route ref
bool buildFlowEmbeddedRoute(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const SUMOVehicleParameter &vehicleParameters, const std::vector< std::string > &edgeIDs, const RGBColor &color, const int repeat, const SUMOTime cycleTime, const Parameterised::Map &routeParameters)
build a flow with an embedded route
static void transformToContainerFlow(GNEContainer *originalContainer)
transform routeFlow over an existent route
bool buildPersonFlow(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const SUMOVehicleParameter &personFlowParameters)
build person flow
static void transformToFlow(GNEVehicle *originalVehicle)
transform to flow
bool buildVTypeRef(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &vTypeID, const double probability)
build vType ref
bool buildFlowJunctions(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const SUMOVehicleParameter &vehicleParameters, const std::string &fromJunctionID, const std::string &toJunctionID)
build flow over junctions
bool buildFlowTAZs(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const SUMOVehicleParameter &vehicleParameters, const std::string &fromTAZID, const std::string &toTAZID)
build flow over junctions
bool buildRouteDistribution(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &id)
build route distribution
GNEAdditional * parseTAZ(const SumoXMLTag tag, const std::string &id, const std::string &TAZID)
parse TAZ
bool buildContainer(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const SUMOVehicleParameter &containerParameters)
build container
bool buildTripTAZs(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const SUMOVehicleParameter &vehicleParameters, const std::string &fromTAZID, const std::string &toTAZID)
build trip over TAZs
bool buildTransport(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const CommonXMLStructure::PlanParameters &planParameters, const double arrivalPos, const std::vector< std::string > &lines, const std::string &group)
build transport
static bool canReverse(const GNEDemandElement *element)
reverse functions
bool buildStop(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const CommonXMLStructure::PlanParameters &planParameters, const SUMOVehicleParameter::Stop &stopParameters)
build stop
bool postParserTasks()
run post parser tasks
std::vector< GNEEdge * > parseEdges(const SumoXMLTag tag, const std::string &id, const std::vector< std::string > &edgeIDs)
parse edges
bool checkViaAttribute(const SumoXMLTag tag, const std::string &id, const std::vector< std::string > &via)
check if via attribute is valid
GNEDemandElement * getVTypeDistributionParent(const CommonXMLStructure::SumoBaseObject *sumoBaseObject) const
get vType distribution parent
bool buildContainerStop(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const CommonXMLStructure::PlanParameters &planParameters, const double endPos, const SUMOTime duration, const SUMOTime until, const std::string &actType, const bool friendlyPos, const int parameterSet)
build container stop
static void transformToTrip(GNEVehicle *originalVehicle)
transform to trip
bool buildPersonStop(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const CommonXMLStructure::PlanParameters &planParameters, const double endPos, const SUMOTime duration, const SUMOTime until, const std::string &actType, const bool friendlyPos, const int parameterSet)
build person stop
static void transformToPerson(GNEPerson *originalPerson)
transform person functions
bool buildVTypeDistribution(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &id, const int deterministic)
build vType distribution
GNEDemandElement * retrieveDemandElement(const std::vector< SumoXMLTag > tags, const std::string &id)
get element by ID
GNEDemandElement * getType(const std::string &id) const
get type (Either type o typeDistribution)
virtual ~GNERouteHandler()
Destructor.
bool buildFlow(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const SUMOVehicleParameter &vehicleParameters, const std::string &fromEdgeID, const std::string &toEdgeIDs)
build flow
GNERouteHandler()=delete
invalidate default onstructor
bool buildContainerFlow(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const SUMOVehicleParameter &containerFlowParameters)
build container flow
bool buildTrip(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const SUMOVehicleParameter &vehicleParameters, const std::string &fromEdgeID, const std::string &toEdgeID)
build trip
bool buildVehicleEmbeddedRoute(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const SUMOVehicleParameter &vehicleParameters, const std::vector< std::string > &edgeIDs, const RGBColor &color, const int repeat, const SUMOTime cycleTime, const Parameterised::Map &routeParameters)
build a vehicle with an embedded route
bool buildVehicleOverRoute(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const SUMOVehicleParameter &vehicleParameters)
build a vehicle over an existent route
GNEDemandElement * getContainerParent(const CommonXMLStructure::SumoBaseObject *sumoBaseObject) const
get container parent
static void reverse(GNEDemandElement *element)
reverse given demand element
bool buildPerson(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const SUMOVehicleParameter &personParameters)
build person
static void transformToFlowJunctions(GNEVehicle *originalVehicle)
transform to flow over junctions
static void transformToTripJunctions(GNEVehicle *originalVehicle)
transform to trip over junctions
static void transformToContainer(GNEContainer *originalContainer)
transform container functions
GNEDemandElement * getRoute(const std::string &id) const
get route (Either route o routeDistribution)
bool buildTranship(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const CommonXMLStructure::PlanParameters &planParameters, const double arrivalPosition, const double departPosition, const double speed, const SUMOTime duration)
build tranship
static void transformToPersonFlow(GNEPerson *originalPerson)
transform routeFlow over an existent route
GNEEdge * parseEdge(const SumoXMLTag tag, const std::string &id, const std::string &edgeID, const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const bool firstEdge)
parse edge
bool getDistributionElements(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, SumoXMLTag distributionElementTag, const std::vector< std::string > &distributionElementIDs, const std::vector< double > &probabilities, std::vector< const GNEDemandElement * > &elements)
get distribution elements
bool checkElement(const SumoXMLTag tag, GNEDemandElement *demandElement)
check if element exist, and if overwrite
bool buildFlowOverRoute(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const SUMOVehicleParameter &vehicleParameters)
build a flow over an existent route
static void transformToFlowTAZs(GNEVehicle *originalVehicle)
transform to flow over TAZs
std::set< GNEDemandElement * > myParentPlanElements
demand element parentplans (person and containers, used in postParserTasks)
static void transformToVehicle(GNEVehicle *originalVehicle, bool createEmbeddedRoute)
transform vehicle functions
static void transformToTripTAZs(GNEVehicle *originalVehicle)
transform to trip over TAZs
static GNEDemandElement * copyRoute(const GNERoute *originalRoute)
create a copy of the given route
Definition GNERoute.cpp:728
static std::string isRouteValid(const std::vector< GNEEdge * > &edges)
check if a route is valid
Definition GNERoute.cpp:697
bool isPlanTransport() const
return true if tag correspond to a transport
bool isContainer() const
return true if tag correspond to a container element
bool isFlow() const
return true if tag correspond to a flow element
bool isVehicle() const
return true if tag correspond to a vehicle element
bool vehicleJunctions() const
return true if tag correspond to a vehicle placed over from-to junctions
bool isPlanStopContainer() const
return true if tag correspond to a container stop plan
SumoXMLTag getTag() const
get Tag vinculated with this attribute Property
bool vehicleRouteEmbedded() const
return true if tag correspond to a vehicle placed over an embedded route
bool isPlanPersonTrip() const
return true if tag correspond to a person trip plan
bool vehicleEdges() const
return true if tag correspond to a vehicle placed over from-to edges
bool isPlanRide() const
return true if tag correspond to a ride plan
bool isPlanStopPerson() const
return true if tag correspond to a person stop plan
bool isPerson() const
return true if tag correspond to a person element
bool vehicleTAZs() const
return true if tag correspond to a vehicle placed over from-to TAZs
bool vehicleRoute() const
plan parents
bool isPlanWalk() const
return true if tag correspond to a walk plan
bool isPlanTranship() const
return true if tag correspond to a tranship
void end()
End undo command sub-group. If the sub-group is still empty, it will be deleted; otherwise,...
void begin(GUIIcon icon, const std::string &description)
Begin undo command sub-group with current supermode. This begins a new group of commands that are tre...
void add(GNEChange *command, bool doit=false, bool merge=true)
Add new command, executing it if desired. The new command will be merged with the previous command if...
static bool overwriteVType(GNEDemandElement *vType, const SUMOVTypeParameter newVTypeParameter, GNEUndoList *undoList)
overwrite all values of GNEVType with a SUMOVTypeParameter
Definition GNEVType.cpp:977
std::string getAttribute(SumoXMLAttr key) const override
inherited from GNEAttributeCarrier
SUMOVehicleClass getVClass() const override
obtain VClass related with this demand element
static GNEDemandElement * copyVehicle(const GNEVehicle *originalVehicle)
create a copy of the given vehicle
bool isACInspected(GNEAttributeCarrier *AC) const
GNENet * getNet() const
get the net object
GNEViewNetHelper::InspectedElements & getInspectedElements()
get inspected elements
GNEViewParent * getViewParent() const
get the net object
GNEUndoList * getUndoList() const
get the undoList object
GNEApplicationWindow * getGNEAppWindows() const
get GNE Application Windows
GNEInspectorFrame * getInspectorFrame() const
get frame for inspect elements
Boundary getVisibleBoundary() const
get visible boundary
virtual void centerTo(GUIGlID id, bool applyZoom, double zoomDist=20)
centers to the chosen artifact
static const std::vector< SumoXMLTag > types
type namespace
static const std::vector< SumoXMLTag > vehicles
vehicles namespace
static const std::vector< SumoXMLTag > routes
route namespace
static const std::vector< SumoXMLTag > persons
persons namespace
static const std::vector< SumoXMLTag > containers
containers namespace
std::map< std::string, std::string > Map
parameters map
static const RGBColor YELLOW
Definition RGBColor.h:191
static const RGBColor INVISIBLE
Definition RGBColor.h:198
Structure representing possible vehicle parameter.
double defaultProbability
The probability when being added to a distribution without an explicit probability.
std::string id
The vehicle type's id.
Definition of vehicle stop (position and duration)
std::string edge
The edge to stop at.
std::string lane
The lane to stop at.
bool friendlyPos
enable or disable friendly position (used by netedit)
double speed
the speed at which this stop counts as reached (waypoint mode)
std::string parkingarea
(Optional) parking area if one is assigned to the stop
std::string chargingStation
(Optional) charging station if one is assigned to the stop
int parametersSet
Information for the output which parameter were set.
SUMOTime until
The time at which the vehicle may continue its journey.
std::string actType
act Type (only used by Persons) (used by netedit)
double endPos
The stopping position end.
std::string busstop
(Optional) bus stop if one is assigned to the stop
std::string containerstop
(Optional) container stop if one is assigned to the stop
SUMOTime duration
The stopping duration.
Structure representing possible vehicle parameter.
double repetitionProbability
The probability for emitting a vehicle per second.
int departLane
(optional) The lane the vehicle shall depart from (index in edge)
double departSpeed
(optional) The initial speed of the vehicle
SumoXMLTag tag
The vehicle tag.
std::string vtypeid
The vehicle's type id.
SUMOTime repetitionOffset
The time offset between vehicle reinsertions.
std::vector< std::string > via
List of the via-edges the vehicle must visit.
long long int parametersSet
Information for the router which parameter were set, TraCI may modify this (when changing color)
DepartLaneDefinition departLaneProcedure
Information how the vehicle shall choose the lane to depart from.
SUMOTime repetitionEnd
The time at which the flow ends (only needed when using repetitionProbability)
bool wasSet(long long int what) const
Returns whether the given parameter was set.
DepartSpeedDefinition departSpeedProcedure
Information how the vehicle's initial speed shall be chosen.
std::string routeid
The vehicle's route id.
std::string id
The vehicle's id.