56 routeID(originalDemandElement->getTagProperty().isRoute() ?
57 originalDemandElement->getID() :
58 originalDemandElement->getViewNet()->getNet()->generateDemandElementID(originalDemandElement->getID(),
SUMO_TAG_ROUTE)),
59 edges(originalDemandElement->getEdgeParents()),
60 color(originalDemandElement->getColor()),
61 VClass(originalDemandElement->getVClass()) {
71 edges = GNEAttributeCarrier::parse<std::vector<GNEEdge*> >(viewNet->
getNet(), edgeIDs);
81 if (fromID.size() + toID.size() > 0) {
86 if (from ==
nullptr) {
87 WRITE_ERROR(
"Invalid 'from' edge used in trip '" + vehicleID +
"'.");
88 }
else if (to ==
nullptr) {
89 WRITE_ERROR(
"Invalid 'to' edge used in trip '" + vehicleID +
"'.");
91 WRITE_ERROR(
"Invalid 'via' edges used in trip '" + vehicleID +
"'.");
94 std::vector<GNEEdge*> viaEdges = GNEAttributeCarrier::parse<std::vector<GNEEdge*> >(viewNet->
getNet(), viaIDs);
96 edges.push_back(from);
97 for (
const auto& i : viaEdges) {
126 WRITE_ERROR(
"There is another " +
toString(vehicleTag) +
" with the same ID='" +
id +
"'.");
138 WRITE_ERROR(
"There is another " +
toString(personTag) +
" with the same ID='" +
id +
"'.");
155 if (vType ==
nullptr) {
156 WRITE_ERROR(
"Invalid vehicle type '" + vehicleParameters.
vtypeid +
"' used in " +
toString(vehicleParameters.
tag) +
" '" + vehicleParameters.
id +
"'.");
157 }
else if (route ==
nullptr) {
166 if (undoDemandElements) {
170 for (
const auto& i : vehicleParameters.
stops) {
171 buildStop(viewNet,
true, i, vehicle,
false);
179 vehicle->
incRef(
"buildVehicleOverRoute");
181 for (
const auto& i : vehicleParameters.
stops) {
182 buildStop(viewNet,
false, i, vehicle,
false);
199 if (vType ==
nullptr) {
200 WRITE_ERROR(
"Invalid vehicle type '" + vehicleParameters.
vtypeid +
"' used in " +
toString(vehicleParameters.
tag) +
" '" + vehicleParameters.
id +
"'.");
201 }
else if (route ==
nullptr) {
210 if (undoDemandElements) {
214 for (
const auto& i : vehicleParameters.
stops) {
215 buildStop(viewNet,
true, i, flow,
false);
223 flow->
incRef(
"buildFlowOverRoute");
225 for (
const auto& i : vehicleParameters.
stops) {
226 buildStop(viewNet,
false, i, flow,
false);
242 if (vType ==
nullptr) {
243 WRITE_ERROR(
"Invalid vehicle type '" + vehicleParameters.
vtypeid +
"' used in " +
toString(vehicleParameters.
tag) +
" '" + vehicleParameters.
id +
"'.");
258 if (undoDemandElements) {
269 vehicle->
incRef(
"buildVehicleWithEmbeddedRoute");
273 i->addDemandElementChild(vehicle);
277 embeddedRoute->
incRef(
"buildVehicleWithEmbeddedRoute");
292 if (vType ==
nullptr) {
293 WRITE_ERROR(
"Invalid vehicle type '" + vehicleParameters.
vtypeid +
"' used in " +
toString(vehicleParameters.
tag) +
" '" + vehicleParameters.
id +
"'.");
308 if (undoDemandElements) {
319 flow->
incRef(
"buildFlowWithEmbeddedRoute");
323 i->addDemandElementChild(flow);
327 embeddedRoute->
incRef(
"buildFlowWithEmbeddedRoute");
342 if (vType ==
nullptr) {
343 WRITE_ERROR(
"Invalid vehicle type '" + vehicleParameters.
vtypeid +
"' used in " +
toString(vehicleParameters.
tag) +
" '" + vehicleParameters.
id +
"'.");
350 for (
int i = 1; i < ((int)edges.size() - 1); i++) {
351 vehicleParameters.
via.push_back(edges.at(i)->getID());
354 GNEVehicle* trip =
new GNEVehicle(viewNet, vType, edges.front(), edges.back(), vehicleParameters);
355 if (undoDemandElements) {
359 for (
const auto& i : vehicleParameters.
stops) {
360 buildStop(viewNet,
true, i, trip,
false);
367 trip->
incRef(
"buildTrip");
369 for (
const auto& i : edges) {
370 i->addDemandElementChild(trip);
373 for (
const auto& i : vehicleParameters.
stops) {
374 buildStop(viewNet,
false, i, trip,
false);
390 if (vType ==
nullptr) {
391 WRITE_ERROR(
"Invalid vehicle type '" + vehicleParameters.
vtypeid +
"' used in " +
toString(vehicleParameters.
tag) +
" '" + vehicleParameters.
id +
"'.");
398 for (
int i = 1; i < ((int)edges.size() - 1); i++) {
399 vehicleParameters.
via.push_back(edges.at(i)->getID());
402 GNEVehicle* flow =
new GNEVehicle(viewNet, vType, edges.front(), edges.back(), vehicleParameters);
403 if (undoDemandElements) {
407 for (
const auto& i : vehicleParameters.
stops) {
408 buildStop(viewNet,
true, i, flow,
false);
415 flow->
incRef(
"buildFlow");
417 for (
const auto& i : edges) {
418 i->addDemandElementChild(flow);
421 for (
const auto& i : vehicleParameters.
stops) {
422 buildStop(viewNet,
false, i, flow,
false);
436 bool validDemandElementParent =
true;
437 if (stopParameters.
busstop.size() > 0) {
449 WRITE_ERROR(
"Persons doesn't support stops over container stops");
450 validDemandElementParent =
false;
458 WRITE_ERROR(
"Persons doesn't support stops over charging stations");
459 validDemandElementParent =
false;
463 }
else if (stopParameters.
parkingarea.size() > 0) {
467 WRITE_ERROR(
"Persons doesn't support stops over parking areas");
468 validDemandElementParent =
false;
472 }
else if (stopParameters.
lane.size() > 0) {
482 if (validDemandElementParent) {
484 if (stoppingPlace && lane) {
485 WRITE_ERROR(
"A stop must be defined either over a stoppingPlace or over a lane");
486 }
else if (!stoppingPlace && !lane) {
487 WRITE_ERROR(
"A stop requires a stoppingPlace or a lane");
488 }
else if (stoppingPlace) {
490 GNEStop* stop =
new GNEStop(stopTagType, viewNet, stopParameters, stoppingPlace, stopParent);
492 if (undoDemandElements) {
500 stop->
incRef(
"buildStoppingPlaceStop");
504 GNEStop* stop =
new GNEStop(viewNet, stopParameters, lane, friendlyPosition, stopParent);
506 if (undoDemandElements) {
514 stop->
incRef(
"buildLaneStop");
527 if (pType ==
nullptr) {
532 if (undoDemandElements) {
540 person->
incRef(
"buildPerson");
553 if (pType ==
nullptr) {
554 WRITE_ERROR(
"Invalid personFlow type '" + personFlowParameters.
vtypeid +
"' used in " +
toString(personFlowParameters.
tag) +
" '" + personFlowParameters.
id +
"'.");
558 if (undoDemandElements) {
566 personFlow->
incRef(
"buildPersonFlow");
575 const std::vector<std::string>& types,
const std::vector<std::string>& modes,
double arrivalPos) {
577 if (edges.size() == 0) {
583 if (pathEdges.size() == 0) {
589 if (undoDemandElements) {
597 personTripFromTo->
incRef(
"buildPersonTripFromTo");
608 GNEAdditional* busStop,
const std::vector<std::string>& types,
const std::vector<std::string>& modes) {
610 if (edges.size() == 0) {
616 if (pathEdges.size() == 0) {
622 if (undoDemandElements) {
632 for (
const auto& i : edges) {
633 i->addDemandElementChild(personTripBusStop);
635 personTripBusStop->
incRef(
"buildPersonTripBusStop");
647 if (edges.size() == 0) {
653 if (pathEdges.size() == 0) {
659 if (undoDemandElements) {
668 for (
const auto& i : edges) {
669 i->addDemandElementChild(walkEdges);
671 walkEdges->
incRef(
"buildWalkEdges");
683 if (edges.size() == 0) {
689 if (pathEdges.size() == 0) {
695 if (undoDemandElements) {
704 for (
const auto& i : edges) {
705 i->addDemandElementChild(walkFromTo);
707 walkFromTo->
incRef(
"buildWalkFromTo");
719 if (edges.size() == 0) {
725 if (pathEdges.size() == 0) {
729 GNEWalk* walkBusStop =
new GNEWalk(viewNet, personParent, pathEdges, busStop);
731 if (undoDemandElements) {
741 for (
const auto& i : edges) {
742 i->addDemandElementChild(walkBusStop);
744 walkBusStop->
incRef(
"buildWalkBusStop");
756 GNEWalk* walkRoute =
new GNEWalk(viewNet, personParent, routeParent, arrivalPos);
758 if (undoDemandElements) {
767 walkRoute->
incRef(
"buildWalkRoute");
777 const std::vector<std::string>& lines,
double arrivalPos) {
779 if (edges.size() == 0) {
785 if (pathEdges.size() == 0) {
789 GNERide* rideFromTo =
new GNERide(viewNet, personParent, pathEdges, arrivalPos, lines);
791 if (undoDemandElements) {
800 for (
const auto& i : edges) {
801 i->addDemandElementChild(rideFromTo);
803 rideFromTo->
incRef(
"buildRideFromTo");
814 GNEAdditional* busStop,
const std::vector<std::string>& lines) {
816 if (edges.size() == 0) {
822 if (pathEdges.size() == 0) {
826 GNERide* rideBusStop =
new GNERide(viewNet, personParent, pathEdges, busStop, lines);
828 if (undoDemandElements) {
838 for (
const auto& i : edges) {
839 i->addDemandElementChild(rideBusStop);
841 rideBusStop->
incRef(
"buildRideBusStop");
882 if (createEmbeddedRoute) {
942 if (createEmbeddedRoute) {
999 newVehicleParameters);
1021 if (separatedEmbeddedRoute) {
1059 newVehicleParameters);
1077 if (separatedEmbeddedRoute) {
1128 return vehicleWithoutEmbebbeRoute;
1190 if (vType ==
nullptr) {
1216 vehicleOrRouteFlow->
incRef(
"buildVehicleAndRoute");
1220 i->addDemandElementChild(vehicleOrRouteFlow);
1223 embeddedRoute->
incRef(
"buildVehicleAndRoute");
1254 i->addDemandElementChild(route);
1256 route->
incRef(
"buildRoute");
1309 vType->
incRef(
"buildVType");
1324 if (pType ==
nullptr) {
1328 bool abortPersonPlans =
false;
1344 i->from = (i - 1)->getLastEdge();
1347 WRITE_ERROR(
"The first person plan of type '" +
toString(i->tag) +
"' needs a from edge. Person cannot be created.");
1351 abortPersonPlans =
true;
1360 i->from = (i - 1)->getLastEdge();
1363 WRITE_ERROR(
"The first person plan of type '" +
toString(i->tag) +
"' needs a from edge. Person cannot be created.");
1367 abortPersonPlans =
true;
1376 i->from = (i - 1)->getLastEdge();
1379 WRITE_ERROR(
"The first person plan of type '" +
toString(i->tag) +
"' needs a from edge. Person cannot be created.");
1383 abortPersonPlans =
true;
1392 i->from = (i - 1)->getLastEdge();
1395 WRITE_ERROR(
"The first person plan of type '" +
toString(i->tag) +
"' needs a from edge. Person cannot be created.");
1399 abortPersonPlans =
true;
1411 i->from = (i - 1)->getLastEdge();
1414 WRITE_ERROR(
"The first person plan of type '" +
toString(i->tag) +
"' needs a from edge. Person cannot be created.");
1418 abortPersonPlans =
true;
1427 i->from = (i - 1)->getLastEdge();
1430 WRITE_ERROR(
"The first person plan of type '" +
toString(i->tag) +
"' needs a from edge. Person cannot be created.");
1434 abortPersonPlans =
true;
1451 if (!abortPersonPlans) {
1509 std::string errorSuffix;
1524 if (bs ==
nullptr) {
1550 WRITE_ERROR(
"A stop must be placed on a busStop, a chargingStation, a containerStop a parkingArea or a lane" + errorSuffix);
1556 WRITE_ERROR(
"Deprecated attribute 'pos' in description of stop" + errorSuffix);
1599 bool validValues =
true;
1603 if (personTripValuesLoaded.
from ==
nullptr) {
1605 validValues =
false;
1609 personTripValuesLoaded.
vTypes = GNEAttributeCarrier::parseAttributeFromXML<std::vector<std::string> >(attrs,
"", personTripValuesLoaded.
tag,
SUMO_ATTR_VTYPES,
myAbort);
1610 personTripValuesLoaded.
modes = GNEAttributeCarrier::parseAttributeFromXML<std::vector<std::string> >(attrs,
"", personTripValuesLoaded.
tag,
SUMO_ATTR_MODES,
myAbort);
1615 if (personTripValuesLoaded.
to ==
nullptr) {
1617 validValues =
false;
1620 for (
const auto& i : personTripValuesLoaded.
modes) {
1621 if ((i !=
"public") && (i !=
"car") && (i !=
"bicycle")) {
1622 validValues =
false;
1627 std::sort(personTripValuesLoaded.
modes.begin(), personTripValuesLoaded.
modes.end());
1628 personTripValuesLoaded.
modes.erase(unique(personTripValuesLoaded.
modes.begin(), personTripValuesLoaded.
modes.end()), personTripValuesLoaded.
modes.end());
1630 WRITE_ERROR(
"A person trip mode can be only a combination of 'public', 'car' or 'bicycle'");
1632 for (
const auto& i : personTripValuesLoaded.
vTypes) {
1635 validValues =
false;
1646 bool validValues =
true;
1650 if (personTripValuesLoaded.
from ==
nullptr) {
1652 validValues =
false;
1656 personTripValuesLoaded.
vTypes = GNEAttributeCarrier::parseAttributeFromXML<std::vector<std::string> >(attrs,
"", personTripValuesLoaded.
tag,
SUMO_ATTR_VTYPES,
myAbort);
1657 personTripValuesLoaded.
modes = GNEAttributeCarrier::parseAttributeFromXML<std::vector<std::string> >(attrs,
"", personTripValuesLoaded.
tag,
SUMO_ATTR_MODES,
myAbort);
1662 if (personTripValuesLoaded.
busStop ==
nullptr) {
1664 validValues =
false;
1667 for (
const auto& i : personTripValuesLoaded.
modes) {
1668 if ((i !=
"public") && (i !=
"car") && (i !=
"bicycle")) {
1669 validValues =
false;
1674 std::sort(personTripValuesLoaded.
modes.begin(), personTripValuesLoaded.
modes.end());
1675 personTripValuesLoaded.
modes.erase(unique(personTripValuesLoaded.
modes.begin(), personTripValuesLoaded.
modes.end()), personTripValuesLoaded.
modes.end());
1677 WRITE_ERROR(
"A person trip mode can be only a combination of 'public', 'car' or 'bicycle'");
1679 for (
const auto& i : personTripValuesLoaded.
vTypes) {
1682 validValues =
false;
1690 WRITE_ERROR(
"A personTrip requieres either a from-to edges or a from edge and a busStop");
1707 std::string edgeIDs = GNEAttributeCarrier::parseAttributeFromXML<std::string>(attrs,
"", walkValuesLoaded.
tag,
SUMO_ATTR_EDGES,
myAbort);
1709 walkValuesLoaded.
edges = GNEAttributeCarrier::parse<std::vector<GNEEdge*> >(
myViewNet->
getNet(), edgeIDs);
1716 if (walkValuesLoaded.
edges.empty()) {
1728 if (walkValuesLoaded.
from ==
nullptr) {
1737 if (walkValuesLoaded.
to ==
nullptr) {
1749 if (walkValuesLoaded.
from ==
nullptr) {
1759 if (walkValuesLoaded.
busStop ==
nullptr) {
1774 if (walkValuesLoaded.
route ==
nullptr) {
1781 WRITE_ERROR(
"A walk requieres either a from-to edges, a from edge and a busStop or a route");
1811 if (rideValuesLoaded.
from ==
nullptr) {
1816 rideValuesLoaded.
lines = GNEAttributeCarrier::parseAttributeFromXML<std::vector<std::string> >(attrs,
"", rideValuesLoaded.
tag,
SUMO_ATTR_LINES,
myAbort);
1821 if (rideValuesLoaded.
lines.empty()) {
1822 rideValuesLoaded.
lines.push_back(
"ANY");
1825 if (rideValuesLoaded.
to ==
nullptr) {
1837 if (rideValuesLoaded.
from ==
nullptr) {
1842 rideValuesLoaded.
lines = GNEAttributeCarrier::parseAttributeFromXML<std::vector<std::string> >(attrs,
"", rideValuesLoaded.
tag,
SUMO_ATTR_LINES,
myAbort);
1847 if (rideValuesLoaded.
lines.empty()) {
1848 rideValuesLoaded.
lines.push_back(
"ANY");
1851 if (rideValuesLoaded.
busStop ==
nullptr) {
1858 WRITE_ERROR(
"A ride requieres either a from-to edges or a from edge and a busStop");
1886 friendlyPos(false) {
1892 if (edges.size() > 0) {
1893 return edges.back();
1896 }
else if (busStop) {
1897 return &busStop->getLaneParents().front()->getParentEdge();
1898 }
else if (laneStop) {
1899 return &laneStop->getParentEdge();
1908 std::vector<GNEEdge*>
1911 if ((from && to) && (from != to)) {
1914 if (edgePath.empty()) {
1919 }
else if (from && busStop) {
1922 if (edgePath.empty()) {
1923 return {from, &busStop->getLaneParents().front()->getParentEdge()};