59 #define ENDPOINT_TOLERANCE 2
79 myAmResponsible(
false),
81 myConnectionStatus(loaded ? FEATURE_LOADED : FEATURE_GUESSED),
82 myUpdateGeometry(
true) {
84 int numLanes = myNBEdge->getNumLanes();
85 myLanes.reserve(numLanes);
86 for (
int i = 0; i < numLanes; i++) {
87 myLanes.push_back(
new GNELane(
this, i));
88 myLanes.back()->
incRef(
"GNEEdge::GNEEdge");
91 for (
const auto& lane : myLanes) {
92 lane->updateGeometry();
95 updateCenteringBoundary(
false);
101 for (
const auto& lane :
myLanes) {
102 lane->decRef(
"GNEEdge::~GNEEdge");
103 if (lane->unreferenced()) {
109 WRITE_DEBUG(
"Deleting unreferenced " + lane->getTagStr() +
" '" + lane->getID() +
"' in GNEEdge destructor");
115 connection->decRef(
"GNEEdge::~GNEEdge");
116 if (connection->unreferenced()) {
122 WRITE_DEBUG(
"Deleting unreferenced " + connection->getTagStr() +
" '" + connection->getID() +
"' in GNEEdge destructor");
144 return TLF(
"Parent junctions are in the same position: %, %",
155 for (
const auto& lane :
myLanes) {
156 lane->updateGeometry();
160 connection->updateGeometry();
164 childAdditional->updateGeometry();
168 childDemandElement->updateGeometry();
172 childGenericData->updateGeometry();
177 childAdditional->computePathElement();
180 childDemandElement->computePathElement();
183 childGenericData->computePathElement();
198 return myLanes.front()->getPositionInView();
215 }
else if (modes.isCurrentSupermodeDemand()) {
219 planCreator = viewParent->getPersonFrame()->getPlanCreator();
221 planCreator = viewParent->getPersonPlanFrame()->getPlanCreator();
223 planCreator = viewParent->getContainerFrame()->getPlanCreator();
225 planCreator = viewParent->getContainerPlanFrame()->getPlanCreator();
233 const auto& selectedEdges = viewParent->getVehicleFrame()->getPathCreator()->getSelectedEdges();
235 if ((selectedEdges.size() > 0) && (selectedEdges.front() ==
this)) {
239 }
else if (modes.isCurrentSupermodeData()) {
241 const auto& getEdgeRelDataFrame = viewParent->getEdgeRelDataFrame();
242 if (getEdgeRelDataFrame->shown()) {
244 if (getEdgeRelDataFrame->getPathCreator()->getSelectedEdges().empty()) {
246 }
else if (getEdgeRelDataFrame->getPathCreator()->getSelectedEdges().front() ==
this) {
266 if (inspectedAC->getTagProperty().vehicleEdges() && inspectedAC->hasAttribute(
SUMO_ATTR_TO) && (inspectedAC->getAttribute(
SUMO_ATTR_TO) ==
getID())) {
269 }
else if (modes.isCurrentSupermodeDemand()) {
273 planCreator = viewParent->getPersonFrame()->getPlanCreator();
275 planCreator = viewParent->getPersonPlanFrame()->getPlanCreator();
277 planCreator = viewParent->getContainerFrame()->getPlanCreator();
279 planCreator = viewParent->getContainerPlanFrame()->getPlanCreator();
287 const auto& selectedEdges = viewParent->getVehicleFrame()->getPathCreator()->getSelectedEdges();
289 if ((selectedEdges.size() > 1) && (selectedEdges.back() ==
this)) {
293 }
else if (modes.isCurrentSupermodeData()) {
295 const auto& getEdgeRelDataFrame = viewParent->getEdgeRelDataFrame();
296 if (getEdgeRelDataFrame->shown()) {
298 if (getEdgeRelDataFrame->getPathCreator()->getSelectedEdges().empty()) {
300 }
else if (getEdgeRelDataFrame->getPathCreator()->getSelectedEdges().back() ==
this) {
322 if (modes.isCurrentSupermodeDemand()) {
326 planSelector = viewParent->getPersonFrame()->getPlanSelector();
328 planSelector = viewParent->getPersonPlanFrame()->getPlanSelector();
330 planSelector = viewParent->getContainerFrame()->getPlanSelector();
332 planSelector = viewParent->getContainerPlanFrame()->getPlanSelector();
335 if (planSelector && planSelector->
markEdges() && (viewObjectsSelector.getEdgeFront() ==
this)) {
336 if (viewObjectsSelector.getAttributeCarrierFront()->getTagProperty().isStoppingPlace()) {
338 }
else if (viewObjectsSelector.getAttributeCarrierFront()->getTagProperty().isTAZElement()) {
340 }
else if (viewObjectsSelector.getAttributeCarrierFront()->getTagProperty().getTag() ==
SUMO_TAG_JUNCTION) {
347 const auto& vehicleTemplate = viewParent->getVehicleFrame()->getVehicleTagSelector()->getCurrentTemplateAC();
349 if (vehicleTemplate && vehicleTemplate->getTagProperty().vehicleEdges()) {
367 for (
const auto& lane :
myLanes) {
398 for (
const auto& lane :
myLanes) {
429 if (editedNetworkElement) {
430 if (editedNetworkElement ==
this) {
434 for (
const auto& lane :
myLanes) {
435 if (editedNetworkElement == lane) {
442 for (
const auto& lane :
myLanes) {
514 if (shape[index].distanceSquaredTo2D(clickedPosition) > (geometryPointRadius * geometryPointRadius)) {
518 if (!customStartPosition && (index == 0)) {
522 if (!customEndPosition && (index == lastIndex)) {
530 undoList->
begin(
this,
"remove first geometry point of " +
getTagStr());
533 }
else if (index == lastIndex) {
535 undoList->
begin(
this,
"remove last geometry point of " +
getTagStr());
540 shape.erase(shape.begin() + index);
572 return (
myNBEdge->
getGeometry().front().distanceSquaredTo2D(pos) < (geometryPointRadius * geometryPointRadius));
584 return (
myNBEdge->
getGeometry().back().distanceSquaredTo2D(pos) < (geometryPointRadius * geometryPointRadius));
598 for (
const auto& geometryPoint : innenShape) {
599 if (geometryPoint.distanceSquaredTo2D(pos) < (geometryPointRadius * geometryPointRadius)) {
647 for (
const auto& lane :
myLanes) {
648 const auto laneBoundary = lane->getCenteringBoundary();
649 if (laneBoundary.isInitialised()) {
652 for (
const auto& additional : lane->getChildAdditionals()) {
653 const auto additionalBoundary = additional->getCenteringBoundary();
654 if (additionalBoundary.isInitialised()) {
662 const auto additionalBoundary = additional->getCenteringBoundary();
663 if (additionalBoundary.isInitialised()) {
689 return myLanes.back()->getPopUpMenu(app, parent);
693 std::vector<GNEEdge*>
706 const auto d =
myLanes.front()->getDrawingConstants()->getDetail();
725 for (
const auto& lane :
myLanes) {
764 if (geom[index].distanceSquaredTo2D(clickPos) < (geometryPointRadius * geometryPointRadius)) {
779 (
myNBEdge->
getGeometry().front().distanceSquaredTo2D(pos) < (geometryPointRadius * geometryPointRadius))) {
780 undoList->
begin(
this,
"remove endpoint");
784 (
myNBEdge->
getGeometry().back().distanceSquaredTo2D(pos) < (geometryPointRadius * geometryPointRadius))) {
785 undoList->
begin(
this,
"remove endpoint");
797 undoList->
begin(
this,
"set endpoint");
803 if (geom[index].distanceSquaredTo2D(pos) < (geometryPointRadius * geometryPointRadius)) {
804 newPos = geom[index];
812 if (geom[index].distanceSquaredTo2D(pos) < (geometryPointRadius * geometryPointRadius)) {
813 newPos = geom[index];
868 edge->updateGeometry();
871 edge->updateGeometry();
876 for (
const auto& edge :
getToJunction()->getGNEIncomingEdges()) {
877 edge->updateGeometry();
879 for (
const auto& edge :
getToJunction()->getGNEOutgoingEdges()) {
880 edge->updateGeometry();
888 laneShape.
move2side(
myLanes.front()->getParentEdge()->getNBEdge()->getLaneWidth(
myLanes.front()->getIndex()) / 2);
889 return laneShape.front();
896 laneShape.
move2side(-1 *
myLanes.back()->getParentEdge()->getNBEdge()->getLaneWidth(
myLanes.back()->getIndex()) / 2);
897 return laneShape.front();
904 laneShape.
move2side(
myLanes.front()->getParentEdge()->getNBEdge()->getLaneWidth(
myLanes.front()->getIndex()) / 2);
905 return laneShape.back();
912 laneShape.
move2side(-1 *
myLanes.back()->getParentEdge()->getNBEdge()->getLaneWidth(
myLanes.back()->getIndex()) / 2);
913 return laneShape.back();
921 std::vector<GNEConnection*> retrievedConnections;
923 for (
const auto& connection : connections) {
926 if (junctionsReady) {
929 retrievedConnections.push_back(retrievedGNEConnection);
936 retrievedGNEConnection->
incRef(
"GNEEdge::remakeGNEConnections");
944 connection->decRef();
952 if (connection->unreferenced()) {
955 WRITE_DEBUG(
"Deleting unreferenced " + connection->getTagStr() +
" '" + connection->getID() +
"' in rebuildGNEConnections()");
969 if (connection->isAttributeCarrierSelected()) {
970 connection->unselectAttributeCarrier();
973 connection->decRef(
"GNEEdge::clearGNEConnections");
981 if (connection->unreferenced()) {
983 WRITE_DEBUG(
"Deleting unreferenced " + connection->getTagStr() +
" '" + connection->getID() +
"' in clearGNEConnections()");
993 std::vector<GNEAdditional*> routeProbes;
996 routeProbes.push_back(i);
1000 auto it = std::find(routeProbes.begin(), routeProbes.end(), routeProbe);
1001 if (it == routeProbes.end()) {
1004 return (
int)(it - routeProbes.begin());
1009 std::vector<GNECrossing*>
1011 std::vector<GNECrossing*> crossings;
1013 if (i->checkEdgeBelong(
this)) {
1014 crossings.push_back(i);
1018 if (i->checkEdgeBelong(
this)) {
1019 crossings.push_back(i);
1030 if (attProperty.isCopyable() &&
isValid(attProperty.getAttr(), edgeTemplate->
getAttribute(attProperty.getAttr()))) {
1037 for (
int i = 0; i < (int)
myLanes.size(); i++) {
1038 for (
const auto& attProperty : edgeTemplate->
getLaneTemplates().at(i)->getTagProperty()) {
1039 if (attProperty.isCopyable() &&
myLanes[i]->isValid(attProperty.getAttr(), edgeTemplate->
getLaneTemplates().at(i)->getAttribute(attProperty.getAttr()))) {
1040 myLanes[i]->setAttribute(attProperty.getAttr(), edgeTemplate->
getLaneTemplates().at(i)->getAttribute(attProperty.getAttr()), undoList);
1059 for (
const auto& attrProperty : edgeTypeProperties) {
1060 if (attrProperty.isCopyable() && edgeProperties.hasAttribute(attrProperty.getAttr())) {
1066 for (
int i = 0; i < (int)
myLanes.size(); i++) {
1067 for (
const auto& attrProperty : laneTypeProperties) {
1068 if (attrProperty.isCopyable() && laneProperties.hasAttribute(attrProperty.getAttr()) && (edgeType->
getLaneTypes().at(i)->getAttribute(attrProperty.getAttr()) != laneTypeProperties.getAttributeProperties(attrProperty.getAttr()).getDefaultValue())) {
1069 myLanes[i]->setAttribute(attrProperty.getAttr(), edgeType->
getLaneTypes().at(i)->getAttribute(attrProperty.getAttr()), undoList);
1081 std::set<GUIGlID> result;
1083 result.insert(i->getGlID());
1089 const std::vector<GNELane*>&
1095 const std::vector<GNEConnection*>&
1139 return "lane specific";
1145 return "lane specific";
1151 return "lane specific";
1159 return "lane specific";
1236 const std::string origValue =
myLanes.at(0)->getAttribute(key);
1239 it->setAttribute(key, value, undoList);
1298 if (canParse<double>(value) && (parse<double>(value) == 0)) {
1354 if (updateTemplate) {
1386 return canParse<double>(value) && (parse<double>(value) > 0);
1388 return canParse<double>(value) && (parse<double>(value) > 0);
1390 return canParse<int>(value) && (parse<double>(value) > 0);
1392 return canParse<int>(value);
1394 if (value.empty()) {
1406 return canParse<PositionVector>(value);
1412 if (value.empty() || (value ==
"default")) {
1415 return canParse<double>(value) && ((parse<double>(value) >= -1) || (parse<double>(value) ==
NBEdge::UNSPECIFIED_WIDTH));
1418 return canParse<double>(value) && parse<double>(value) >= 0 && parse<double>(value) <
myNBEdge->
getLoadedLength();
1420 if (value.empty()) {
1423 return canParse<double>(value);
1426 if (value.empty()) {
1428 }
else if (canParse<Position>(value)) {
1429 Position shapeStart = parse<Position>(value);
1436 if (value.empty()) {
1438 }
else if (canParse<Position>(value)) {
1439 Position shapeEnd = parse<Position>(value);
1448 if (value.empty()) {
1451 return canParse<double>(value) && (parse<double>(value) >= 0);
1456 return canParse<bool>(value);
1542 const std::map<const GNELane*, std::vector<GNEDemandElement*> > laneVehiclesMap =
getVehiclesOverEdgeMap();
1544 for (
const auto& laneVehicle : laneVehiclesMap) {
1546 double totalLength = 0;
1547 for (
const auto& vehicle : laneVehicle.second) {
1551 double multiplier = 1;
1552 const double laneShapeLength = laneVehicle.first->getLaneShape().length();
1553 if (laneShapeLength == 0) {
1555 }
else if (totalLength > laneShapeLength) {
1556 multiplier = (laneShapeLength / totalLength);
1561 for (
const auto& vehicle : laneVehicle.second) {
1562 vehicle->updateDemandElementSpreadGeometry(laneVehicle.first, length * multiplier);
1573 const std::map<const GNELane*, std::vector<GNEDemandElement*> > laneVehiclesMap =
getVehiclesOverEdgeMap();
1575 for (
const auto& vehicleMap : laneVehiclesMap) {
1577 std::vector<std::pair<GNEEdge::StackPosition, GNEDemandElement*> > departPosVehicles;
1579 std::vector<GNEEdge::StackDemandElements> stackedVehicles;
1581 for (
const auto& vehicle : vehicleMap.second) {
1587 if (posOverLane < 0) {
1588 posOverLane += vehicleMap.first->getLaneShape().length();
1591 departPosVehicles.push_back(std::make_pair(
StackPosition(departPos, length), vehicle));
1593 vehicle->updateDemandElementGeometry(vehicleMap.first, posOverLane);
1595 vehicle->updateDemandElementStackLabel(0);
1599 std::sort(departPosVehicles.begin(), departPosVehicles.end());
1601 for (
const auto& departPosVehicle : departPosVehicles) {
1606 if (stackedVehicles.empty()) {
1610 stackedVehicles[stackedVehicles.size() - 1].addDemandElements(vehicle);
1617 for (
const auto& vehicle : stackedVehicles) {
1619 if (vehicle.getDemandElements().size() > 1) {
1631 const std::map<const GNELane*, std::vector<GNEDemandElement*> > lanePersonsMap =
getPersonsOverEdgeMap();
1633 for (
const auto& personMap : lanePersonsMap) {
1635 std::vector<std::pair<GNEEdge::StackPosition, GNEDemandElement*> > departPosPersons;
1637 std::vector<GNEEdge::StackDemandElements> stackedPersons;
1639 for (
const auto& person : personMap.second) {
1643 departPosPersons.push_back(std::make_pair(
StackPosition(departPos, 1.8), person));
1645 person->updateDemandElementGeometry(personMap.first, departPos);
1647 person->updateDemandElementStackLabel(0);
1651 std::sort(departPosPersons.begin(), departPosPersons.end());
1653 for (
const auto& departPosPerson : departPosPersons) {
1658 if (stackedPersons.empty()) {
1662 stackedPersons[stackedPersons.size() - 1].addDemandElements(person);
1669 for (
const auto& person : stackedPersons) {
1671 if (person.getDemandElements().size() > 1) {
1685 for (
const auto& containerMap : laneContainersMap) {
1687 std::vector<std::pair<GNEEdge::StackPosition, GNEDemandElement*> > departPosContainers;
1689 std::vector<GNEEdge::StackDemandElements> stackedContainers;
1691 for (
const auto& container : containerMap.second) {
1695 departPosContainers.push_back(std::make_pair(
StackPosition(departPos, 1.8), container));
1697 container->updateDemandElementGeometry(containerMap.first, departPos);
1699 container->updateDemandElementStackLabel(0);
1703 std::sort(departPosContainers.begin(), departPosContainers.end());
1705 for (
const auto& departPosContainer : departPosContainers) {
1710 if (stackedContainers.empty()) {
1714 stackedContainers[stackedContainers.size() - 1].addDemandElements(container);
1721 for (
const auto& container : stackedContainers) {
1723 if (container.getDemandElements().size() > 1) {
1737 while (edgeAngle < 0) {
1741 edgeAngle = fmod(edgeAngle, 360);
1743 return edgeAngle >= 0 && edgeAngle < 180;
1752 for (
const auto& incomingEdge : incomingEdges) {
1753 for (
const auto& connection : incomingEdge->getGNEConnections()) {
1754 if (connection->getEdgeTo() ==
this) {
1771 for (
const auto& outgoingEdge :
getParentJunctions().back()->getGNEOutgoingEdges()) {
1773 return outgoingEdge;
1784 pair(departPos, departPos + length) {
1801 pair(stackedPosition, {
1809 second.push_back(demandElement);
1819 const std::vector<GNEDemandElement*>&
1832 if (stop->getTagProperty().isVehicleStop()) {
1837 for (
const auto& lane :
myLanes) {
1838 for (
const auto& stop : lane->getChildDemandElements()) {
1839 if (stop->getTagProperty().isVehicleStop()) {
1868 throw InvalidArgument(
"GNEEdge::setAttribute (private) called for attr SUMO_ATTR_NUMLANES. This should never happen");
1873 if (value.empty()) {
1901 if (value.empty() || (value ==
"default")) {
1915 if (value.empty()) {
1924 WRITE_DEBUG(
"invalidating (removing) connections of edge '" +
getID() +
"' due it were guessed");
1928 WRITE_DEBUG(
"declaring connections of edge '" +
getID() +
"' as loaded (It will not be removed)");
1938 newShapeStart = parse<Position>(value);
1952 newShapeEnd = parse<Position>(value);
1964 if (parse<bool>(value)) {
1971 if (value.empty()) {
2006 innenShape.pop_back();
2027 innenShapeToUpdate.pop_back();
2035 if (innenShapeToUpdate.size() > 0) {
2059 const int oldNumLanes = (int)
myLanes.size();
2062 if (oppositeID !=
"") {
2066 for (
int i = oldNumLanes; i < numLanes; i++) {
2070 for (
int i = (oldNumLanes - 1); i > (numLanes - 1); i--) {
2074 if (oppositeID !=
"") {
2113 myNBEdge->
addLane(index,
true, recomputeConnections, !recomputeConnections);
2119 lane =
new GNELane(
this, index);
2122 lane->
incRef(
"GNEEdge::addLane");
2137 for (
int i = 0; i < (int)
myLanes.size(); ++i) {
2148 fromEdge->remakeGNEConnections();
2152 toEdge->remakeGNEConnections();
2166 if (lane ==
nullptr) {
2179 lane->
decRef(
"GNEEdge::removeLane");
2190 for (
int i = 0; i < (int)
myLanes.size(); ++i) {
2201 fromEdge->remakeGNEConnections();
2205 toEdge->remakeGNEConnections();
2227 if (selectAfterCreation) {
2248 if (connection !=
nullptr) {
2249 connection->
decRef(
"GNEEdge::removeConnection");
2263 WRITE_DEBUG(
"Deleting unreferenced " + connection->
getTagStr() +
" '" + connection->
getID() +
"' in removeConnection()");
2274 if ((connection->getFromLaneIndex() == fromLane) && (connection->getEdgeTo()->getNBEdge() == to) && (connection->getToLaneIndex() == toLane)) {
2278 if (createIfNoExist) {
2297 for (
const auto& lane :
myLanes) {
2298 lane->setNetworkElementID(
getNBEdge()->getLaneID(lane->getIndex()));
2305 for (
const auto& lane :
myLanes) {
2306 if (lane->isRestricted(vclass)) {
2318 if (crossing->checkEdgeBelong(
this)) {
2330 PositionVector innerShape(modifiedShape.begin() + 1, modifiedShape.end() - 1);
2343 #ifdef DEBUG_SMOOTH_GEOM
2345 <<
" forElevation=" << forElevation
2348 <<
" smoothShape old=" << old <<
"\n";
2350 if (old.size() == 3 || old.size() == 4) {
2352 }
else if (old.size() > 4 && !forElevation) {
2354 init.push_back(old[0]);
2355 init.push_back(old[1]);
2356 init.push_back(old[-2]);
2357 init.push_back(old[-1]);
2363 if (incoming.size() == 1) {
2364 begShape = incoming[0]->getGeometry();
2366 assert(incoming.size() == 2);
2369 if (outgoing.size() == 1) {
2370 endShape = outgoing[0]->getGeometry();
2372 assert(outgoing.size() == 2);
2378 init.push_back(old[0]);
2381 init.push_back(old[-1]);
2385 init[1].setz(2 * init[0].z() - begZ);
2386 init[2].setz(2 * init[-1].z() - endZ);
2389 const double straightThresh =
DEG2RAD(neteditOptions.getFloat(
"opendrive-output.straight-threshold"));
2392 #ifdef DEBUG_SMOOTH_GEOM
2394 std::cout <<
" begShape=" << begShape <<
" endShape=" << endShape <<
" forElevation=" << forElevation <<
" dist=" << dist <<
" ok=" << ok <<
" init=" << init <<
"\n";
2398 if (init.size() == 0) {
2401 const int numPoints =
MAX2(neteditOptions.getInt(
"junctions.internal-link-detail"),
2402 int(old.
length2D() / neteditOptions.getFloat(
"opendrive.curve-resolution")));
2403 return init.
bezier(numPoints);
2411 if (modifiedShape.size() < 2) {
2414 PositionVector innerShape(modifiedShape.begin() + 1, modifiedShape.end() - 1);
2424 if (elevationBase.size() == 0 || elevationBase[-1].z() != pos.z()) {
2425 elevationBase.push_back(pos);
2429 if (elevation.size() <= 2) {
2433 if (modifiedShape.size() < 5) {
2439 for (
int i = 1; i < (int)modifiedShape.size(); ++i) {
2440 seen += modifiedShape[i - 1].distanceTo2D(modifiedShape[i]);
2444 PositionVector innerShape(modifiedShape.begin() + 1, modifiedShape.end() - 1);
2466 geom.push_back(pos);
2472 const std::map<const GNELane*, std::vector<GNEDemandElement*> >
2475 std::vector<GNEDemandElement*> vehiclesOverEdge;
2477 std::map<const GNELane*, std::vector<GNEDemandElement*> > vehiclesOverEdgeMap;
2479 std::set<std::pair<double, GNEDemandElement*> > vehicles;
2483 (edgeChild->getParentEdges().front() ==
this)) {
2484 vehicles.insert(std::make_pair(edgeChild->getAttributeDouble(
SUMO_ATTR_DEPART), edgeChild));
2485 vehicles.insert(std::make_pair(edgeChild->getAttributeDouble(
SUMO_ATTR_DEPART), edgeChild));
2486 }
else if ((edgeChild->getTagProperty().getTag() ==
SUMO_TAG_ROUTE) && (edgeChild->getParentEdges().front() ==
this)) {
2487 for (
const auto& routeChild : edgeChild->getChildDemandElements()) {
2488 if (routeChild->getTagProperty().vehicleRoute()) {
2489 vehicles.insert(std::make_pair(routeChild->getAttributeDouble(
SUMO_ATTR_DEPART), routeChild));
2492 }
else if ((edgeChild->getTagProperty().getTag() ==
GNE_TAG_ROUTE_EMBEDDED) && (edgeChild->getParentEdges().front() ==
this)) {
2493 vehicles.insert(std::make_pair(edgeChild->getParentDemandElements().front()->getAttributeDouble(
SUMO_ATTR_DEPART), edgeChild->getParentDemandElements().front()));
2497 vehiclesOverEdge.reserve(vehicles.size());
2499 for (
const auto& vehicle : vehicles) {
2501 vehiclesOverEdge.push_back(vehicle.second);
2504 for (
const auto& vehicle : vehiclesOverEdge) {
2505 const GNELane* vehicleLane = vehicle->getFirstPathLane();
2507 vehiclesOverEdgeMap[vehicleLane].push_back(vehicle);
2510 return vehiclesOverEdgeMap;
2514 const std::map<const GNELane*, std::vector<GNEDemandElement*> >
2517 std::vector<GNEDemandElement*> personsOverEdge;
2519 std::map<const GNELane*, std::vector<GNEDemandElement*> > personsOverEdgeMap;
2521 std::set<std::pair<double, GNEDemandElement*> > persons;
2524 if (edgeChild->getTagProperty().isPlanPerson()) {
2525 persons.insert(std::make_pair(edgeChild->getParentDemandElements().front()->getAttributeDouble(
SUMO_ATTR_DEPARTPOS), edgeChild->getParentDemandElements().front()));
2529 personsOverEdge.reserve(persons.size());
2531 for (
const auto& person : persons) {
2533 personsOverEdge.push_back(person.second);
2536 for (
const auto& person : personsOverEdge) {
2537 const GNELane* personLane = person->getFirstPathLane();
2539 personsOverEdgeMap[personLane].push_back(person);
2542 return personsOverEdgeMap;
2547 const std::map<const GNELane*, std::vector<GNEDemandElement*> >
2550 std::vector<GNEDemandElement*> containersOverEdge;
2552 std::map<const GNELane*, std::vector<GNEDemandElement*> > containersOverEdgeMap;
2554 std::set<std::pair<double, GNEDemandElement*> > containers;
2557 if (edgeChild->getTagProperty().isPlanContainer()) {
2558 containers.insert(std::make_pair(edgeChild->getParentDemandElements().front()->getAttributeDouble(
SUMO_ATTR_DEPARTPOS), edgeChild->getParentDemandElements().front()));
2562 containersOverEdge.reserve(containers.size());
2564 for (
const auto& container : containers) {
2566 containersOverEdge.push_back(container.second);
2569 for (
const auto& container : containersOverEdge) {
2570 const GNELane* containerLane = container->getFirstPathLane();
2571 if (containerLane) {
2572 containersOverEdgeMap[containerLane].push_back(container);
2575 return containersOverEdgeMap;
2610 glTranslated(0, 0, 0.2);
2618 if (bigGeometryPoints) {
2631 const double geometryPointRadius,
const double exaggeration)
const {
2637 const bool startPosEdited = (startGeometryPointPos !=
getParentJunctions().front()->getPositionInView());
2640 if (startPosEdited || forceDraw) {
2654 glTranslated(startGeometryPointPos.x(), startGeometryPointPos.y(),
GLO_GEOMETRYPOINT);
2670 if ((selectedGeometryPoints.size() > 0) && (selectedGeometryPoints.front() == 0)) {
2687 geometryPointRadius, exaggeration);
2695 const double geometryPointRadius,
const double exaggeration)
const {
2701 const bool endPosEdited = (geometryPointPos !=
getParentJunctions().back()->getPositionInView());
2704 if (endPosEdited || forceDraw) {
2734 if ((selectedGeometryPoints.size() > 0) && (selectedGeometryPoints.back() == ((
int)
myNBEdge->
getGeometry().size() - 1))) {
2751 geometryPointRadius, exaggeration);
2770 drawPosition.
mul(.5);
2771 if (spreadSuperposed) {
2775 const Position shift(dist * cos(shiftA), dist * sin(shiftA));
2776 drawPosition.
add(shift);
2782 if (drawAngle > 90 && drawAngle < 270) {
2790 if (drawStreetName) {
2799 if (activeScheme == 12) {
2802 }
else if (activeScheme == 13) {
2807 const double doubleValue = lastLane->
getColorValue(s, activeScheme);
2833 for (
const auto& lane :
getLanes()) {
2834 lane->drawLaneStopOffset(s);
2847 additional->drawGL(s);
2853 stopEdge->drawGL(s);
2859 for (
const auto& vehicleMap : vehiclesMap) {
2860 for (
const auto& vehicle : vehicleMap.second) {
2896 std::vector<GNEAdditional*> TAZSourceSinks;
2901 TAZSourceSinks.push_back(additional);
2904 if (TAZSourceSinks.size() > 0) {
2906 bool selected =
false;
2907 for (
const auto& TAZSourceSink : TAZSourceSinks) {
2908 if (TAZSourceSink->isAttributeCarrierSelected()) {
2913 for (
const auto& lane :
myLanes) {
2925 glTranslated(0, 0, 0.1);
2934 lane->getDrawingConstants()->getDrawingWidth());
2993 if (!editModes.isCurrentSupermodeNetwork()) {
3025 const double squaredSnapRadius = (snapRadius * snapRadius);
3029 const int nearestIndex = originalShape.
indexOfClosest(mousePosition);
3033 std::vector<int> indexes;
3035 if (nearestIndex == -1) {
3040 for (
int i = 1; i <= nearestIndex; i++) {
3041 indexes.push_back(i);
3044 return new GNEMoveOperation(
this, originalShape, indexes, shapeToMove, indexes);
3048 }
else if (nearestPosition.
distanceSquaredTo2D(shapeToMove[nearestIndex]) <= squaredSnapRadius) {
3049 for (
int i = 1; i <= nearestIndex; i++) {
3050 indexes.push_back(i);
3053 return new GNEMoveOperation(
this, originalShape, indexes, shapeToMove, indexes);
3056 const int newIndex = shapeToMove.
insertAtClosest(nearestPosition,
true);
3057 for (
int i = 1; i <= newIndex; i++) {
3058 indexes.push_back(i);
3061 return new GNEMoveOperation(
this, originalShape, indexes, shapeToMove, indexes);
3069 const double squaredSnapRadius = (snapRadius * snapRadius);
3073 const int nearestIndex = originalShape.
indexOfClosest(mousePosition);
3077 std::vector<int> indexes;
3079 if (nearestIndex == -1) {
3084 for (
int i = nearestIndex; i < ((int)originalShape.size() - 1); i++) {
3085 indexes.push_back(i);
3088 return new GNEMoveOperation(
this, originalShape, indexes, shapeToMove, indexes);
3092 }
else if (nearestPosition.
distanceSquaredTo2D(shapeToMove[nearestIndex]) <= squaredSnapRadius) {
3093 for (
int i = nearestIndex; i < ((int)originalShape.size() - 1); i++) {
3094 indexes.push_back(i);
3097 return new GNEMoveOperation(
this, originalShape, indexes, shapeToMove, indexes);
3100 const int newIndex = shapeToMove.
insertAtClosest(nearestPosition,
true);
3101 for (
int i = newIndex; i < ((int)originalShape.size() - 1); i++) {
3102 indexes.push_back(i);
3105 return new GNEMoveOperation(
this, originalShape, indexes, shapeToMove, indexes);
3112 std::vector<int> geometryPointsToMove;
3114 geometryPointsToMove.push_back(i);
3128 if (shapeToMove.
length2D() < moveMultipleElementValues.getEdgeOffset()) {
3135 offset = moveMultipleElementValues.getEdgeOffset();
3137 offset = shapeToMove.
length2D() - moveMultipleElementValues.getEdgeOffset();
3146 }
else if (offsetPosition.
distanceSquaredTo2D(shapeToMove[nearestIndex]) <= (snapRadius * snapRadius)) {
3151 const int newIndex = shapeToMove.
insertAtClosest(offsetPosition,
true);
#define ENDPOINT_TOLERANCE
@ NETWORK_DELETE
mode for deleting network elements
@ NETWORK_MOVE
mode for moving network elements
@ NETWORK_SELECT
mode for selecting network elements
@ DEMAND_PERSONPLAN
Mode for editing person plan.
@ DEMAND_CONTAINER
Mode for editing container.
@ DEMAND_PERSON
Mode for editing person.
@ DEMAND_VEHICLE
Mode for editing vehicles.
@ DEMAND_CONTAINERPLAN
Mode for editing container plan.
@ GLO_FRONTELEMENT
front element (used in netedit)
@ GLO_GEOMETRYPOINT
geometry point (used in netedit)
GUIViewObjectsHandler gViewObjectsHandler
GUIIcon
An enumeration of icons used by the gui applications.
#define WRITE_WARNINGF(...)
std::vector< NBEdge * > EdgeVector
container for (sorted) edges
const SVCPermissions SVCAll
all VClasses are allowed
SVCPermissions invertPermissions(SVCPermissions permissions)
negate the given permissions and ensure that only relevant bits are set
const std::string & getVehicleClassNames(SVCPermissions permissions, bool expand)
Returns the ids of the given classes, divided using a ' '.
bool canParseVehicleClasses(const std::string &classes)
Checks whether the given string contains only known vehicle classes.
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types.
@ SVC_PASSENGER
vehicle is a passenger car (a "normal" car)
@ SUMO_TAG_TAZSINK
a sink within a district (connection road)
@ GNE_TAG_STOPCONTAINER_EDGE
@ SUMO_TAG_LANETYPE
lane type
@ SUMO_TAG_FLOW
a flow definition using from and to edges or a route
@ SUMO_TAG_JUNCTION
begin/end of the description of a junction
@ SUMO_TAG_ROUTE
begin/end of the description of a route
@ SUMO_TAG_LANE
begin/end of the description of a single lane
@ SUMO_TAG_TYPE
type (edge)
@ SUMO_TAG_TAZSOURCE
a source within a district (connection road)
@ GNE_TAG_ROUTE_EMBEDDED
embedded route
@ GNE_TAG_STOPPERSON_EDGE
@ SUMO_TAG_TRIP
a single trip definition (used by router)
@ SUMO_TAG_EDGE
begin/end of the description of an edge
SumoXMLAttr
Numbers representing SUMO-XML - attributes.
@ SUMO_ATTR_FROM_JUNCTION
@ GNE_ATTR_STOPOFFSET
stop offset (virtual, used by edge and lanes)
@ GNE_ATTR_OPPOSITE
to busStop (used by personPlans)
@ GNE_ATTR_SELECTED
element is selected
@ GNE_ATTR_PARAMETERS
parameters "key1=value1|key2=value2|...|keyN=valueN"
@ GNE_ATTR_STOPOEXCEPTION
stop exceptions (virtual, used by edge and lanes)
@ GNE_ATTR_MODIFICATION_STATUS
whether a feature has been loaded,guessed,modified or approved
@ SUMO_ATTR_SHAPE
edge: the shape in xml-definition
@ SUMO_ATTR_SPREADTYPE
The information about how to spread the lanes from the given position.
@ GNE_ATTR_SHAPE_END
last coordinate of edge shape
@ GNE_ATTR_BIDIR
whether an edge is part of a bidirectional railway
@ GNE_ATTR_SHAPE_START
first coordinate of edge shape
const double SUMO_const_halfLaneWidth
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
A class that stores a 2D geometrical boundary.
void add(double x, double y, double z=0)
Makes the boundary include the given coordinate.
bool isInitialised() const
check if Boundary is Initialised
Boundary & grow(double by)
extends the boundary by the given amount
double getHeight() const
Returns the height of the boundary (y-axis)
double getWidth() const
Returns the width of the boudary (x-axis)
double contains(const Boundary &b) const
return true if this boundary contains the given boundary (only X-Y)
std::string fromEdge
from edge
std::string toEdge
to edge
static void setColor(const RGBColor &c)
Sets the gl-color to this value.
static void popMatrix()
pop matrix
static void drawBoundary(const GUIVisualizationSettings &s, const Boundary &b)
Draw a boundary (used for debugging)
static void drawBoxLine(const Position &beg, double rot, double visLength, double width, double offset=0)
Draws a thick line.
static void drawFilledCircleDetailled(const GUIVisualizationSettings::Detail d, const double radius)
Draws a filled circle around (0,0) depending of level of detail.
static void pushMatrix()
push matrix
static void drawText(const std::string &text, const Position &pos, const double layer, const double size, const RGBColor &col=RGBColor::BLACK, const double angle=0, const int align=0, double width=-1)
static void drawTextSettings(const GUIVisualizationTextSettings &settings, const std::string &text, const Position &pos, const double scale, const double angle=0, const double layer=2048, const int align=0)
const std::string getID() const
get ID (all Attribute Carriers have one)
bool isAttributeCarrierSelected() const
check if attribute carrier is selected
bool mySelected
boolean to check if this AC is selected (instead of GUIGlObjectStorage)
static const std::string True
true value in string format (used for comparing boolean values in getAttribute(......
const std::string & getTagStr() const
get tag assigned to this object in string format
static const std::string FEATURE_GUESSED
feature has been reguessed (may still be unchanged be we can't tell (yet)
const GNETagProperties & getTagProperty() const
get tagProperty associated with this Attribute Carrier
void unselectAttributeCarrier(const bool changeFlag=true)
unselect attribute carrier using GUIGlobalSelection
bool drawUsingSelectColor() const
check if attribute carrier must be drawn using selecting color.
GNENet * myNet
pointer to net
void selectAttributeCarrier(const bool changeFlag=true)
select attribute carrier using GUIGlobalSelection
static const std::string False
true value in string format(used for comparing boolean values in getAttribute(...))
const GNETagProperties & myTagProperty
reference to tagProperty associated with this attribute carrier
static void changeAttribute(GNEAttributeCarrier *AC, SumoXMLAttr key, const std::string &value, GNEUndoList *undoList, const bool force=false)
change attribute
void markConnectionGeometryDeprecated()
check that connection's Geometry has to be updated
void updateGeometry()
update pre-computed geometry information
void updateLinkState()
recompute cached myLinkState
void calculateContourEdge(const GUIVisualizationSettings &s, const GUIVisualizationSettings::Detail d, const GNEEdge *edge, const GUIGlObject *elementToRegister, const bool closeFirstExtrem, const bool closeLastExtrem) const
calculate contour edge
void drawDottedContourGeometryPoints(const GUIVisualizationSettings &s, const GUIVisualizationSettings::Detail d, const GNEAttributeCarrier *AC, const PositionVector &shape, const double radius, const double scale, const double lineWidth) const
draw dotted contour for geometry points
void calculateContourEdgeGeometryPoints(const GUIVisualizationSettings &s, const GUIVisualizationSettings::Detail d, const GNEEdge *edge, const double radius, const bool calculatePosOverShape, const bool firstExtrem, const bool lastExtrem) const
calculate contour for edge geometry points
void drawDottedContours(const GUIVisualizationSettings &s, const GUIVisualizationSettings::Detail d, const GNEAttributeCarrier *AC, const double lineWidth, const bool addOffset) const
drawing contour functions
void calculateContourFirstGeometryPoint(const GUIVisualizationSettings &s, const GUIVisualizationSettings::Detail d, const GUIGlObject *glObject, const PositionVector &shape, const double radius, const double scale) const
calculate contour for first geometry point
bool deleteOnlyGeometryPoints() const
check if only delete geometry points checkbox is enabled
struct for saving subordinated elements (Junction->Edge->Lane->(Additional | DemandElement)
ProtectElements * getProtectElements() const
get protect elements modul
DeleteOptions * getDeleteOptions() const
get delete options modul
void updateDemandElementStackLabel(const int stack)
update stack label
const StackPosition & getStackPosition() const
get stack position
const std::vector< GNEDemandElement * > & getDemandElements() const
get demand elements
void addDemandElements(GNEDemandElement *demandElement)
add demand elment to current StackDemandElements
StackDemandElements(const StackPosition stackedPosition, GNEDemandElement *demandElement)
constructor
Stack position (used to stack demand elements over edges)
double beginPosition() const
get begin position
StackPosition(const double departPos, const double length)
constructor
double endPosition() const
get end position
A road/street connecting two junctions (netedit-version)
const Position getFrontDownShapePosition() const
get front down shape position
Boundary myEdgeBoundary
edge boundary
void updateCenteringBoundary(const bool updateGrid)
update centering boundary (implies change in RTREE)
void drawEdgeName(const GUIVisualizationSettings &s) const
draw edge name
void drawStartGeometryPoint(const GUIVisualizationSettings &s, const GUIVisualizationSettings::Detail d, const double geometryPointRadius, const double exaggeration) const
draw start extreme geometry point
bool isConvexAngle() const
check if edge makes a convex angle [0 - 180) degrees
bool checkDrawRelatedContour() const
check if draw related contour (cyan)
void setNumLanes(int numLanes, GNEUndoList *undoList)
changes the number of lanes. When reducing the number of lanes, higher-numbered lanes are removed fir...
std::string getNetworkElementProblem() const
return a string with the current network element problem
const std::map< const GNELane *, std::vector< GNEDemandElement * > > getPersonsOverEdgeMap() const
get persons a that start over this edge
const std::map< const GNELane *, std::vector< GNEDemandElement * > > getContainersOverEdgeMap() const
get containers a that start over this edge
void commitMoveShape(const GNEMoveResult &moveResult, GNEUndoList *undoList)
commit move shape
bool hasPredecessors() const
check if this edge has predecessors (note: only for vehicles, this function ignore walking areas!...
void setMoveShape(const GNEMoveResult &moveResult)
set move shape
void drawEndGeometryPoint(const GUIVisualizationSettings &s, const GUIVisualizationSettings::Detail d, const double geometryPointRadius, const double exaggeration) const
draw end extreme geometry point
bool checkDrawMoveContour() const
check if draw move contour (red)
friend class GNEChange_Lane
Friend class.
bool checkDrawOverContour() const
check if draw over contour (orange)
void smooth(GNEUndoList *undoList)
make geometry smooth
void updateGeometry()
update pre-computed geometry information
double getGeometryPointRadius() const
get geometry point radius
GNEMoveOperation * getMoveOperation()
get move operation
std::string getAttributeForSelection(SumoXMLAttr key) const
method for getting the attribute in the context of object selection
GNEJunction * getFromJunction() const
get from Junction (only used to increase readability)
void setResponsible(bool newVal)
set responsibility for deleting internal structures
void copyEdgeType(const GNEEdgeType *edgeType, GNEUndoList *undoList)
copy edge attributes from edgeType
NBEdge * getNBEdge() const
returns the internal NBEdge
GUIGLObjectPopupMenu * getPopUpMenu(GUIMainWindow &app, GUISUMOAbstractView &parent)
Returns an own popup-menu.
const std::map< const GNELane *, std::vector< GNEDemandElement * > > getVehiclesOverEdgeMap() const
get vehicles a that start over this edge
std::set< GUIGlID > getLaneGlIDs() const
returns GLIDs of all lanes
GNEEdge * getReverseEdge() const
get reverse edge (if exist)
const Position getFrontUpShapePosition() const
get front up shape position
void setGeometry(PositionVector geom, bool inner)
update edge geometry and inform the lanes
void smoothElevation(GNEUndoList *undoList)
smooth elevation with regard to adjoining edges
bool clickedOverGeometryPoint(const Position &pos) const
return true if user clicked over a Geometry Point
bool clickedOverShapeEnd(const Position &pos) const
return true if user clicked over ShapeEnd
void updateVehicleStackLabels()
GNEJunction * getToJunction() const
get from Junction (only used to increase readability)
bool isValid(SumoXMLAttr key, const std::string &value)
void remakeGNEConnections(bool junctionsReady=false)
remake connections
GNEMoveOperation * processMoveBothJunctionSelected()
process moving edge when both junctions are selected
void removeGeometryPoint(const Position clickedPosition, GNEUndoList *undoList)
remove geometry point in the clicked position
const std::vector< GNELane * > & getLanes() const
returns a reference to the lane vector
LaneVector myLanes
vector with the lanes of this edge
static const double SNAP_RADIUS
GNELane * getLaneByAllowedVClass(const SUMOVehicleClass vClass) const
return the first lane that allow a vehicle of type vClass (or the first lane, if none was found)
bool hasCustomEndPoints() const
void updatePersonStackLabels()
void setEdgeID(const std::string &newID)
set edge ID
void removeConnection(NBEdge::Connection nbCon)
removes a connection
void drawChildrens(const GUIVisualizationSettings &s) const
draw children
bool hasSuccessors() const
check if this edge has successors (note: only for vehicles, this function ignore walking areas!...
bool isAttributeComputed(SumoXMLAttr key) const
bool drawBigGeometryPoints() const
check if draw big geometry points
bool myWasSplit
whether this edge was created from a split
void removeLane(GNELane *lane, bool recomputeConnections)
@briefdecrease the number of lanes by one. argument is only used to increase robustness (assertions)
bool checkDrawSelectContour() const
check if draw select contour (blue)
double getExaggeration(const GUIVisualizationSettings &s) const
return exaggeration associated with this GLObject
bool hasRestrictedLane(SUMOVehicleClass vclass) const
check if edge has a restricted lane
static const double SNAP_RADIUS_SQUARED
void updateSecondParentJunction(const std::string &value)
update last parent junction
std::vector< GNEEdge * > getOppositeEdges() const
get opposite edges
PositionVector smoothShape(const PositionVector &shape, bool forElevation)
return smoothed shape
bool wasSplit()
whether this edge was created from a split
NBEdge * myNBEdge
the underlying NBEdge
void copyTemplate(const GNEEdgeTemplate *edgeTemplate, GNEUndoList *undoList)
copy edge attributes from edgetemplate
void removeEdgeFromCrossings(GNEJunction *junction, GNEUndoList *undoList)
remove crossing of junction
Position getPositionInView() const
Returns position of hierarchical element in view.
void addLane(GNELane *lane, const NBEdge::Lane &laneAttrs, bool recomputeConnections)
increase number of lanes by one use the given attributes and restore the GNELane
GNEConnection * retrieveGNEConnection(int fromLane, NBEdge *to, int toLane, bool createIfNoExist=true)
get GNEConnection if exist, and if not create it if create is enabled
ConnectionVector myGNEConnections
vector with the connections of this edge
void calculateEdgeContour(const GUIVisualizationSettings &s, const GUIVisualizationSettings::Detail d) const
calculate contours
void editEndpoint(Position pos, GNEUndoList *undoList)
makes pos the new geometry endpoint at the appropriate end, or remove current existent endpoint
void resetBothEndpoint(GNEUndoList *undoList)
restores both endpoint to the junction position at the appropriate end
Position getSplitPos(const Position &clickPos)
void drawEdgeGeometryPoints(const GUIVisualizationSettings &s, const GUIVisualizationSettings::Detail d) const
draw edge geometry points (note: This function is called by GNELane::drawGL(...)
const std::vector< GNEConnection * > & getGNEConnections() const
returns a reference to the GNEConnection vector
std::string getAttribute(SumoXMLAttr key) const
int getRouteProbeRelativePosition(GNERouteProbe *routeProbe) const
obtain relative positions of RouteProbes
bool checkDrawFromContour() const
check if draw from contour (green)
std::string myConnectionStatus
modification status of the connections
bool checkDrawDeleteContour() const
check if draw delete contour (pink/white)
void deleteGLObject()
delete element
const std::string getOptionalName() const
Returns the street name.
void clearGNEConnections()
clear current connections
bool myUpdateGeometry
flag to enable/disable update geometry of lanes (used mainly by setNumLanes)
const Position getBackDownShapePosition() const
get back down shape position
bool areStackPositionOverlapped(const GNEEdge::StackPosition &vehicleA, const GNEEdge::StackPosition &vehicleB) const
check if given stacked positions are overlapped
void updateFirstParentJunction(const std::string &value)
update front parent junction
void straightenElevation(GNEUndoList *undoList)
interpolate z values linear between junctions
void updateContainerStackLabels()
void drawEdgeShape(const GUIVisualizationSettings &s, const GUIVisualizationSettings::Detail d) const
draw edge shape (only one line)
bool checkDrawToContour() const
check if draw from contour (magenta)
bool clickedOverShapeStart(const Position &pos) const
return true if user clicked over ShapeStart
bool isNetworkElementValid() const
check if current network element is valid to be written into XML
void setShapeStartPos(const Position &pos)
change Shape StartPos
void setAttribute(SumoXMLAttr key, const std::string &value, GNEUndoList *undoList)
const Position getBackUpShapePosition() const
get back up shape position
void resetEndpoint(const Position &pos, GNEUndoList *undoList)
restores the endpoint to the junction position at the appropriate end
bool isAttributeEnabled(SumoXMLAttr key) const
void drawGL(const GUIVisualizationSettings &s) const
Draws the object.
void addConnection(NBEdge::Connection nbCon, bool selectAfterCreation=false)
adds a connection
void drawLaneStopOffset(const GUIVisualizationSettings &s, const GUIVisualizationSettings::Detail d) const
draw edgeStopOffset
GNEMoveOperation * processMoveFromJunctionSelected(const PositionVector originalShape, const Position mousePosition, const double snapRadius)
process moving edge when only from junction is selected
GNEMoveOperation * processNoneJunctionSelected(const double snapRadius)
process moving edge when none junction are selected
PositionVector getAttributePositionVector(SumoXMLAttr key) const
Boundary getCenteringBoundary() const
Returns the boundary to which the view shall be centered in order to show the object.
const Parameterised::Map & getACParametersMap() const
get parameters map
void drawTAZElements(const GUIVisualizationSettings &s) const
draw TAZElements
std::vector< GNECrossing * > getGNECrossings()
get GNECrossings vinculated with this Edge
GNELane * getLaneByDisallowedVClass(const SUMOVehicleClass vClass) const
return the first lane that disallow a vehicle of type vClass (or the first lane, if none was found)
void updateVehicleSpreadGeometries()
GNEMoveOperation * processMoveToJunctionSelected(const PositionVector originalShape, const Position mousePosition, const double snapRadius)
process moving edge when only to junction is selected
void updateGLObject()
update GLObject (geometry, ID, etc.)
void updateJunctionPosition(GNEJunction *junction, const Position &origPos)
update edge geometry after junction move
bool myAmResponsible
whether we are responsible for deleting myNBNode
GNEEdge(GNENet *net, NBEdge *nbe, bool wasSplit=false, bool loaded=false)
Constructor.
void setShapeEndPos(const Position &pos)
change Shape EndPos
std::string getAttribute(SumoXMLAttr key) const
const std::vector< GNELaneTemplate * > & getLaneTemplates() const
get vector with the lane templates of this edge
const std::vector< GNELaneType * > & getLaneTypes() const
get laneTypes
std::string getAttribute(SumoXMLAttr key) const
void removeCurrentEditedAttributeCarrier(const GNEAttributeCarrier *HE)
if given AttributeCarrier is the same of myHE, set it as nullptr
const std::vector< GNEJunction * > & getParentJunctions() const
get parent junctions
const std::vector< GNEDemandElement * > & getChildDemandElements() const
return child demand elements
const std::vector< GNEEdge * > & getChildEdges() const
get child edges
const std::vector< GNEAdditional * > & getChildAdditionals() const
return child additionals
void replaceParentElements(T *elementChild, const U &newParents)
replace parent elements
const std::vector< GNEGenericData * > & getChildGenericDatas() const
return child generic data elements
void setEdgeTemplate(const GNEEdge *edge)
set edge template
GNEEdgeTemplate * getEdgeTemplate() const
get edge template (to copy attributes from)
void updateEdgeTemplate()
update edge template
TemplateEditor * getTemplateEditor() const
get template editor
GNEElementTree * getHierarchicalElementTree() const
get GNEElementTree modul
const std::vector< GNEEdge * > & getGNEIncomingEdges() const
Returns incoming GNEEdges.
const std::vector< GNECrossing * > & getGNECrossings() const
Returns GNECrossings.
void updateGeometry()
update pre-computed geometry information (including crossings)
void removeOutgoingGNEEdge(GNEEdge *edge)
remove outgoing GNEEdge
void removeIncomingGNEEdge(GNEEdge *edge)
remove incoming GNEEdge
void drawGL(const GUIVisualizationSettings &s) const
Draws the object.
void addIncomingGNEEdge(GNEEdge *edge)
add incoming GNEEdge
NBNode * getNBNode() const
Return net build node.
void setLogicValid(bool valid, GNEUndoList *undoList, const std::string &status=FEATURE_GUESSED)
void addOutgoingGNEEdge(GNEEdge *edge)
add outgoing GNEEdge
This lane is powered by an underlying GNEEdge and basically knows how to draw itself.
const PositionVector & getLaneShape() const
get elements shape
int getIndex() const
returns the index of the lane
double getColorValue(const GUIVisualizationSettings &s, int activeScheme) const
return value for lane coloring according to the given scheme
GNEMoveOperation * calculateMoveShapeOperation(const GUIGlObject *obj, const PositionVector originalShape, const bool maintainShapeClosed)
calculate move shape operation
bool getForceDrawGeometryPoints() const
force draw geometry points
NetworkModeOptions * getNetworkModeOptions() const
get network mode options
std::vector< int > geometryPointsToMove
shape points to move (of shapeToMove)
PositionVector shapeToUpdate
shape to update (edited in moveElement)
std::vector< GNEEdge * > retrieveEdges(GNEJunction *from, GNEJunction *to) const
get all edges by from and to GNEJunction
void insertLane(GNELane *lane)
insert lane in container
void deleteConnection(GNEConnection *connection)
delete connection from container
GNEJunction * retrieveJunction(const std::string &id, bool hardFail=true) const
get junction by id
void insertConnection(GNEConnection *connection)
insert connection in container
const std::map< const GUIGlObject *, GNELane * > & getLanes() const
get lanes
void updateEdgeID(GNEEdge *edge, const std::string &newID)
update edge ID in container
const std::map< const GUIGlObject *, GNEConnection * > & getConnections() const
get connections
GNEEdge * retrieveEdge(const std::string &id, bool hardFail=true) const
get edge by id
void deleteLane(GNELane *lane)
delete lane from container
int getNumberOfSelectedEdges() const
get number of selected edges
void requireSaveDemandElements()
inform that demand elements has to be saved
A NBNetBuilder extended by visualisation and editing capabilities.
void deleteEdge(GNEEdge *edge, GNEUndoList *undoList, bool recomputeConnections)
removes edge
void deleteCrossing(GNECrossing *crossing, GNEUndoList *undoList)
remove crossing
void addGLObjectIntoGrid(GNEAttributeCarrier *AC)
add GL Object into net
void removeGLObjectFromGrid(GNEAttributeCarrier *AC)
add GL Object into net
GNENetHelper::SavingStatus * getSavingStatus() const
get saving status
void removeExplicitTurnaround(std::string id)
remove edge id from the list of explicit turnarounds
GNENetHelper::AttributeCarriers * getAttributeCarriers() const
get all attribute carriers used in this net
void changeEdgeEndpoints(GNEEdge *edge, const std::string &newSourceID, const std::string &newDestID)
modifies endpoins of the given edge
GNEPathManager * getPathManager()
get path manager
GNEViewNet * getViewNet() const
get view net
bool checkDrawingBoundarySelection() const
GNEContour myNetworkElementContour
network element contour
void setNetworkElementID(const std::string &newID)
set network element id
void invalidatePathCalculator()
invalidate pathCalculator
PathCalculator * getPathCalculator()
obtain instance of PathCalculator
const CommonXMLStructure::PlanParameters & getPlanParameteres() const
get plan parameters
bool markEdges() const
check if mark edges with dotted contours
void decRef(const std::string &debugMsg="")
Decrease reference.
void incRef(const std::string &debugMsg="")
Increase reference.
bool unreferenced()
check if object ins't referenced
Representation of a RouteProbe in netedit.
SumoXMLTag getTag() const
get Tag vinculated with this attribute Property
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...
GNEEdge * getEdgeFront() const
get front edge or a pointer to nullptr
const GUIGlObject * getGUIGlObjectFront() const
get front attribute carrier or a pointer to nullptr
bool isCurrentlyMovingElements() const
check if an element is being moved
const GNEViewNetHelper::DataViewOptions & getDataViewOptions() const
get data view options
const GNEAttributeCarrier * getFrontAttributeCarrier() const
get front attributeCarrier
const GNEViewNetHelper::EditModes & getEditModes() const
get edit modes
const GNEViewNetHelper::EditNetworkElementShapes & getEditNetworkElementShapes() const
get Edit Shape module
const GNEViewNetHelper::NetworkViewOptions & getNetworkViewOptions() const
get network view options
void drawTranslateFrontAttributeCarrier(const GNEAttributeCarrier *AC, double typeOrLayer, const double extraOffset=0)
draw front attributeCarrier
GNEViewParent * getViewParent() const
get the net object
bool checkOverLockedElement(const GUIGlObject *GLObject, const bool isSelected) const
check if given element is locked (used for drawing select and delete contour)
bool checkSelectEdges() const
check if select edges (toggle using button or shift)
GNEUndoList * getUndoList() const
get the undoList object
const GNEViewNetHelper::MoveMultipleElementModul & getMoveMultipleElementValues() const
get move multiple element values
const GNEViewNetHelper::ViewObjectsSelector & getViewObjectsSelector() const
get objects under cursor
void removeFromAttributeCarrierInspected(const GNEAttributeCarrier *AC)
remove given AC of list of inspected Attribute Carriers
const std::vector< GNEAttributeCarrier * > & getInspectedAttributeCarriers() const
get inspected attribute carriers
GNEMoveFrame * getMoveFrame() const
get frame for move elements
GNEDeleteFrame * getDeleteFrame() const
get frame for delete elements
GNEInspectorFrame * getInspectorFrame() const
get frame for inspect elements
static void drawGeometry(const GUIVisualizationSettings::Detail d, const GUIGeometry &geometry, const double width, double offset=0)
draw geometry
GUIGlObjectType getType() const
Returns the type of the object as coded in GUIGlObjectType.
const std::string & getMicrosimID() const
Returns the id of the object as known to microsim.
void drawName(const Position &pos, const double scale, const GUIVisualizationTextSettings &settings, const double angle=0, bool forceShow=false) const
draw name of item
T getColor(const double value) const
const std::vector< T > & getSchemes() const
Position snapToActiveGrid(const Position &pos, bool snapXY=true) const
Returns a position that is mapped to the closest grid point if the grid is active.
const GUIVisualizationSettings & getVisualisationSettings() const
get visualization settings (read only)
virtual Position getPositionInformation() const
Returns the cursor's x/y position within the network.
bool isElementSelected(const GUIGlObject *GLObject) const
check if element was already selected
const Boundary & getSelectionBoundary() const
get selection boundary (usually the mouse position)
const std::vector< int > & getGeometryPoints(const GUIGlObject *GLObject) const
get geometry points for the given glObject
bool addElementUnderCursor(const GUIGlObject *GLObject, const bool checkDuplicated, const bool fullBoundary)
add element into list of elements under cursor
const GUIGlObject * markedFirstGeometryPoint
marked first geometry point (used for moving/delete geometry points)
Stores the information about how to visualize structures.
GUIVisualizationSizeSettings addSize
GUIVisualizationTextSettings edgeValue
double laneWidthExaggeration
The lane exaggeration (upscale thickness)
GUIVisualizationColorSettings colorSettings
color settings
GUIVisualizationDottedContourSettings dottedContourSettings
dotted contour settings
double scale
information about a lane's width (temporary, used for a single view)
GUIVisualizationTextSettings streetName
bool drawForViewObjectsHandler
whether drawing is performed for the purpose of selecting objects in view using ViewObjectsHandler
GUIColorer laneColorer
The lane colorer.
GUIVisualizationTextSettings edgeName
bool spreadSuperposed
Whether to improve visualisation of superposed (rail) edges.
GUIColorer junctionColorer
The junction colorer.
std::string edgeParam
key for coloring by edge parameter
bool checkBoundarySizeDrawing(const double w, const double h) const
check if draw element depending of boundarySize
GUIVisualizationNeteditSizeSettings neteditSizeSettings
netedit size settings
static const double INVALID_OFFSET
a value to signify offsets outside the range of [0, Line.length()]
The representation of a single edge during network building.
void setStreetName(const std::string &name)
sets the street name of this edge
void mirrorX()
mirror coordinates along the x-axis
void setPreferredVehicleClass(SVCPermissions permissions, int lane=-1)
set preferred Vehicle Class
SVCPermissions getPermissions(int lane=-1) const
get the union of allowed classes over all lanes or for a specific lane
void setPermissions(SVCPermissions permissions, int lane=-1)
set allowed/disallowed classes for the given lane or for all lanes if -1 is given
StopOffset myEdgeStopOffset
A vClass specific stop offset - assumed of length 0 (unspecified) or 1. For the latter case the int i...
double getLoadedLength() const
Returns the length was set explicitly or the computed length if it wasn't set.
void setSpeed(int lane, double speed)
set lane specific speed (negative lane implies set for all lanes)
bool hasLaneSpecificFriction() const
whether lanes differ in friction
double getLaneWidth() const
Returns the default width of lanes of this edge.
const std::string & getStreetName() const
Returns the street name of this edge.
void addLane(int index, bool recomputeShape, bool recomputeConnections, bool shiftIndices)
add lane
bool hasLaneSpecificSpeed() const
whether lanes differ in speed
std::string myType
The type of the edge.
LaneSpreadFunction getLaneSpreadFunction() const
Returns how this edge's lanes' lateral offset is computed.
bool hasLoadedLength() const
Returns whether a length was set explicitly.
void setDistance(double distance)
set kilometrage at start of edge (negative value implies couting down along the edge)
const std::string & getID() const
const std::vector< NBEdge::Lane > & getLanes() const
Returns the lane definitions.
NBNode * getToNode() const
Returns the destination node of the edge.
double getSpeed() const
Returns the speed allowed on this edge.
double getDistance() const
get distance
static const double UNSPECIFIED_LOADED_LENGTH
no length override given
void setLaneWidth(int lane, double width)
set lane specific width (negative lane implies set for all lanes)
void setLaneSpreadFunction(LaneSpreadFunction spread)
(Re)sets how the lanes lateral offset shall be computed
bool isTurningDirectionAt(const NBEdge *const edge) const
Returns whether the given edge is the opposite direction to this edge.
bool hasLaneSpecificPermissions() const
whether lanes differ in allowed vehicle classes
bool isBidiEdge(bool checkPotential=false) const
whether this edge is part of a bidirectional edge pair
void setBidi(bool isBidi)
mark this edge as a bidi edge
int getNumLanes() const
Returns the number of lanes.
const PositionVector & getGeometry() const
Returns the geometry of the edge.
void setFriction(int lane, double friction)
set lane specific friction (negative lane implies set for all lanes)
void removeFromConnections(NBEdge *toEdge, int fromLane=-1, int toLane=-1, bool tryLater=false, const bool adaptToLaneRemoval=false, const bool keepPossibleTurns=false)
Removes the specified connection(s)
void invalidateConnections(bool reallowSetting=false)
invalidate current connections of edge
void deleteLane(int index, bool recompute, bool shiftIndices)
delete lane
bool hasLaneSpecificWidth() const
whether lanes differ in width
@ USER
The connection was given by the user.
double getFriction() const
Returns the friction on this edge.
const NBEdge * getBidiEdge() const
bool setConnection(int lane, NBEdge *destEdge, int destLane, Lane2LaneInfoType type, bool mayUseSameDestination=false, bool mayDefinitelyPass=false, KeepClear keepClear=KEEPCLEAR_UNSPECIFIED, double contPos=UNSPECIFIED_CONTPOS, double visibility=UNSPECIFIED_VISIBILITY_DISTANCE, double speed=UNSPECIFIED_SPEED, double friction=UNSPECIFIED_FRICTION, double length=myDefaultConnectionLength, const PositionVector &customShape=PositionVector::EMPTY, const bool uncontrolled=UNSPECIFIED_CONNECTION_UNCONTROLLED, SVCPermissions permissions=SVC_UNSPECIFIED, bool indirectLeft=false, const std::string &edgeType="", SVCPermissions changeLeft=SVC_UNSPECIFIED, SVCPermissions changeRight=SVC_UNSPECIFIED, bool postProcess=false)
Adds a connection to a certain lane of a certain edge.
bool hasLaneSpecificEndOffset() const
whether lanes differ in offset
NBEdge * getTurnDestination(bool possibleDestination=false) const
int getPriority() const
Returns the priority of the edge.
static const double UNSPECIFIED_WIDTH
unspecified lane width
const std::vector< Connection > & getConnections() const
Returns the connections.
const std::string & getTypeID() const
get ID of type
void declareConnectionsAsLoaded(EdgeBuildingStep step=EdgeBuildingStep::LANES2LANES_USER)
declares connections as fully loaded. This is needed to avoid recomputing connections if an edge has ...
double getEndOffset() const
Returns the offset to the destination node.
void setEndOffset(int lane, double offset)
set lane specific end-offset (negative lane implies set for all lanes)
Lane & getLaneStruct(int lane)
void setLoadedLength(double val)
set loaded length
const PositionVector getInnerGeometry() const
Returns the geometry of the edge without the endpoints.
double getFinalLength() const
get length that will be assigned to the lanes in the final network
void setGeometry(const PositionVector &g, bool inner=false)
(Re)sets the edge's geometry
int myPriority
The priority of the edge.
NBNode * getFromNode() const
Returns the origin node of the edge.
const EdgeVector & getOutgoingEdges() const
Returns this node's outgoing edges (The edges which start at this node)
const EdgeVector & getIncomingEdges() const
Returns this node's incoming edges (The edges which yield in this node)
const Position & getPosition() const
bool isRoundabout() const
return whether this node is part of a roundabout
bool geometryLike() const
whether this is structurally similar to a geometry node
static PositionVector bezierControlPoints(const PositionVector &begShape, const PositionVector &endShape, bool isTurnaround, double extrapolateBeg, double extrapolateEnd, bool &ok, NBNode *recordError=0, double straightThresh=DEG2RAD(5), int shapeFlag=0)
get bezier control points
const std::string & getID() const
Returns the id.
bool set(const std::string &name, const std::string &value, const bool append=false)
Sets the given value for the named option.
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
void resetWritable()
Resets all options to be writeable.
static OptionsCont & getOptions()
Retrieves the options.
static bool areParametersValid(const std::string &value, bool report=false, const std::string kvsep="=", const std::string sep="|")
check if given string can be parsed to a parameters map "key1=value1|key2=value2|....
std::map< std::string, std::string > Map
parameters map
void setParametersStr(const std::string ¶msString, const std::string kvsep="=", const std::string sep="|")
set the inner key/value map in string format "key1=value1|key2=value2|...|keyN=valueN"
virtual const std::string getParameter(const std::string &key, const std::string defaultValue="") const
Returns the value for a given key.
const Parameterised::Map & getParametersMap() const
Returns the inner key/value map.
std::string getParametersStr(const std::string kvsep="=", const std::string sep="|") const
Returns the inner key/value map in string format "key1=value1|key2=value2|...|keyN=valueN".
A point in 2D or 3D with translation and scaling methods.
double distanceSquaredTo2D(const Position &p2) const
returns the square of the distance to another position (Only using x and y positions)
static const Position INVALID
used to indicate that a position is valid
double distanceTo2D(const Position &p2) const
returns the euclidean distance in the x-y-plane
void add(const Position &pos)
Adds the given position to this one.
void mul(double val)
Multiplies position with the given value.
double z() const
Returns the z-position.
double length2D() const
Returns the length.
double length() const
Returns the length.
double rotationAtOffset(double pos) const
Returns the rotation at the given length.
PositionVector resample(double maxLength, const bool adjustEnd) const
resample shape (i.e. transform to segments, equal spacing)
double rotationDegreeAtOffset(double pos) const
Returns the rotation at the given length.
Position positionAtOffset(double pos, double lateralOffset=0) const
Returns the position at the given length.
void add(double xoff, double yoff, double zoff)
double nearest_offset_to_point2D(const Position &p, bool perpendicular=true) const
return the nearest offest to point 2D
int indexOfClosest(const Position &p, bool twoD=false) const
void move2side(double amount, double maxExtension=100)
move position vector to side using certain amount
PositionVector interpolateZ(double zStart, double zEnd) const
returned vector that varies z smoothly over its length
Boundary getBoxBoundary() const
Returns a boundary enclosing this list of lines.
static const PositionVector EMPTY
empty Vector
PositionVector bezier(int numPoints)
return a bezier interpolation
int insertAtClosest(const Position &p, bool interpolateZ)
inserts p between the two closest positions
void push_front(const Position &p)
insert in front a Position
void removeDoublePoints(double minDist=POSITION_EPS, bool assertLength=false, int beginOffset=0, int endOffset=0, bool resample=false)
Removes positions if too near.
void pop_front()
pop first Position
PositionVector reverse() const
reverse position vector
Position positionAtOffset2D(double pos, double lateralOffset=0) const
Returns the position at the given length.
static const RGBColor BLUE
unsigned char alpha() const
Returns the alpha-amount of the color.
static const RGBColor ORANGE
static const RGBColor CYAN
RGBColor changedBrightness(int change, int toChange=3) const
Returns a new color with altered brightness.
static StringBijection< LaneSpreadFunction > LaneSpreadFunctions
lane spread functions
static bool isValidNetID(const std::string &value)
whether the given string is a valid id for a network element
void setOffset(const double offset)
set offset
bool isDefined() const
check if stopOffset was defined
SVCPermissions getPermissions() const
get permissions
void setExceptions(const std::string permissions)
set exceptions (used in netedit)
std::string getExceptions() const
get exceptions (used in netedit)
double getOffset() const
get offset
bool hasString(const std::string &str) const
const std::string & getString(const T key) const
auto get(const nlohmann::detail::iteration_proxy_value< IteratorType > &i) -> decltype(i.key())
bool showDemandElements() const
check if show demand elements checkbox is enabled
NetworkEditMode networkEditMode
the current Network edit mode
bool isCurrentSupermodeNetwork() const
@check if current supermode is Network
GNENetworkElement * getEditedNetworkElement() const
pointer to edited network element
static void drawLockIcon(const GUIVisualizationSettings::Detail d, const GNEAttributeCarrier *AC, GUIGlObjectType type, const Position position, const double exaggeration, const double size=0.5, const double offsetx=0, const double offsety=0)
draw lock icon
bool isMovingSelectedEdge() const
flag for moving edge
bool editingElevation() const
check if we're editing elevation
bool showDemandElements() const
check if show demand elements checkbox is enabled
bool showTAZElements() const
check if show TAZ Elements
RGBColor selectedEdgeColor
edge selection color
static const double segmentWidthSmall
width of small dotted contour segments
static const double segmentWidth
width of dotted contour segments
static const double junctionBubbleRadius
junction bubble radius
double getExaggeration(const GUIVisualizationSettings &s, const GUIGlObject *o, double factor=20) const
return the drawing size including exaggeration and constantSize values
bool show(const GUIGlObject *o) const
whether to show the text
double scaledSize(double scale, double constFactor=0.1) const
get scale size
A structure which describes a connection between edges or lanes.
int fromLane
The lane the connections starts at.
int toLane
The lane the connections yields in.
double speed
custom speed for connection
NBEdge * toEdge
The edge the connections yields in.
KeepClear keepClear
whether the junction must be kept clear when using this connection
double customLength
custom length for connection
bool uncontrolled
check if Connection is uncontrolled
PositionVector customShape
custom shape for connection
bool mayDefinitelyPass
Information about being definitely free to drive (on-ramps)
double contPos
custom position for internal junction on this connection
double visibility
custom foe visiblity for connection
An (internal) definition of a single lane of an edge.
double width
This lane's width.
double endOffset
This lane's offset to the intersection begin.
SVCPermissions preferred
List of vehicle types that are preferred on this lane.
double speed
The speed allowed on this lane.
double friction
The friction on this lane.
SVCPermissions permissions
List of vehicle types that are allowed on this lane.