57 #ifdef CHECK_MEMORY_LEAKS 59 #endif // CHECK_MEMORY_LEAKS 62 #define DEBUGCOND true 136 assert((
int)myTransitions.size() > virtEdge);
138 NBEdge* succEdge = myTransitions[virtEdge];
139 std::vector<int> lanes;
143 std::map<NBEdge*, std::vector<int> >::iterator i =
myConnections.find(succEdge);
151 std::vector<int>::iterator j = find(lanes.begin(), lanes.end(), lane);
152 if (j == lanes.end()) {
154 lanes.push_back(lane);
167 if (outgoing.size() == 0) {
171 assert(outgoing.size() > 0);
173 #ifdef DEBUG_CONNECTION_GUESSING 175 std::cout <<
" MainDirections edge=" << parent->
getID() <<
" straightest=" << outgoing[indexOfStraightest]->getID() <<
" dir=" <<
toString(straightestDir) <<
"\n";
187 if (outgoing.back()->getJunctionPriority(to) == 1) {
193 if (outgoing.back()->getPriority() > tmp[0]->getPriority()) {
196 if (outgoing.back()->getNumLanes() > tmp[0]->getNumLanes()) {
205 NBEdge* edge = *(tmp.begin());
218 return myDirs.empty();
224 return find(myDirs.begin(), myDirs.end(), d) != myDirs.end();
246 const std::string& streetName,
262 init(nolanes,
false,
id);
267 std::string type,
SUMOReal speed,
int nolanes,
270 const std::string& streetName,
271 const std::string& origID,
287 init(nolanes, tryIgnoreNodePositions, origID);
317 if (to == tpl->
myTo) {
326 SUMOReal speed,
int nolanes,
int priority,
328 const std::string& streetName,
330 bool tryIgnoreNodePositions) {
352 const std::vector<Lane> oldLanes =
myLanes;
353 init(nolanes, tryIgnoreNodePositions, oldLanes.empty() ?
"" : oldLanes[0].origID);
354 for (
int i = 0; i < (int)nolanes; ++i) {
356 myLanes[i] = oldLanes[
MIN2(i, (
int)oldLanes.size() - 1)];
375 if (from == 0 || to == 0) {
376 throw ProcessError(
"At least one of edge's '" +
myID +
"' nodes is not known.");
393 NBEdge::init(
int noLanes,
bool tryIgnoreNodePositions,
const std::string& origID) {
398 throw ProcessError(
"At least one of edge's '" +
myID +
"' nodes is not known.");
404 if (!tryIgnoreNodePositions ||
myGeom.size() < 2) {
419 WRITE_ERROR(
"Edge's '" +
myID +
"' from- and to-node are at the same position.");
427 assert(
myGeom.size() >= 2);
428 if ((
int)
myLanes.size() > noLanes) {
430 for (
int lane = noLanes; lane < (int)
myLanes.size(); ++lane) {
435 for (EdgeVector::const_iterator i = incoming.begin(); i != incoming.end(); i++) {
436 for (
int lane = noLanes; lane < (int)
myLanes.size(); ++lane) {
437 (*i)->removeFromConnections(
this, -1, lane);
442 for (
int i = 0; i < noLanes; i++) {
457 for (
int i = 0; i < (int)
myLanes.size(); i++) {
458 myLanes[i].shape.add(xoff, yoff, 0);
467 for (
int i = 0; i < (int)
myLanes.size(); i++) {
471 (*i).shape.mirrorX();
472 (*i).viaShape.mirrorX();
514 const SUMOReal distanceOfClosestThreshold = 1.0;
515 SUMOReal distanceOfClosest = distanceOfClosestThreshold;
517 if (distanceOfClosest < distanceOfClosestThreshold) {
522 base += shiftDirection * (distanceOfClosestThreshold - distanceOfClosest);
528 if (border.size() == 2) {
530 for (
int i = 0; i < (int)
myLanes.size(); i++) {
537 assert(node ==
myTo);
548 if (shape.size() < 2) {
562 assert(shape.size() >= 2);
563 assert(shape.
length() > 0);
571 tmp.push_back(shape[0]);
572 tmp.push_back(shape[-1]);
591 assert(shape.size() >= 2);
592 assert(shape.
length() > 0);
612 for (
int i = 0; i < (int)
myLanes.size(); i++) {
617 for (
int i = 0; i < (int)
myLanes.size(); i++) {
618 assert(
myLanes[i].shape.length() > 0);
619 avgLength +=
myLanes[i].shape.length();
628 if (nodeShape.size() == 0) {
637 assert(pbv.size() > 0);
651 assert(ns.size() >= 2);
656 assert(pbv.size() > 0);
714 NBEdge* currentEdge =
this;
715 for (
int i = 1; i < (int)
myGeom.size() - 1; i++) {
717 if (i != (
int)
myGeom.size() - 2) {
718 std::string nodename =
myID +
"_in_between#" +
toString(i);
720 throw ProcessError(
"Error on adding in-between node '" + nodename +
"'.");
728 currentEdge->
myTo = newTo;
731 std::string edgename =
myID +
"[" +
toString(i - 1) +
"]";
735 if (!ec.
insert(currentEdge,
true)) {
736 throw ProcessError(
"Error on adding splitted edge '" + edgename +
"'.");
761 std::vector<SUMOReal> angles;
763 for (
int i = 0; i < (int)
myGeom.size() - 1; ++i) {
768 for (
int i = 0; i < (int)angles.size() - 1; ++i) {
771 if (maxAngle > 0 && relAngle > maxAngle) {
777 if (i == 0 || i == (
int)angles.size() - 2) {
778 const bool start = i == 0;
782 if (minRadius > 0 && r < minRadius) {
785 (start ?
"start" :
"end") +
" of edge '" +
getID() +
"'.");
791 (start ?
"start" :
"end") +
" of edge '" +
getID() +
"'.");
828 bool mayUseSameDestination,
829 bool mayDefinitelyPass,
845 return setConnection(from, dest, toLane, type, mayUseSameDestination, mayDefinitelyPass, keepClear, contPos, visibility);
853 bool invalidatePrevious,
854 bool mayDefinitelyPass) {
855 if (invalidatePrevious) {
859 for (
int i = 0; i < no && ok; i++) {
869 bool mayUseSameDestination,
870 bool mayDefinitelyPass,
898 if ((*i).toEdge == destEdge && ((*i).fromLane == -1 || (*i).toLane == -1)) {
905 if (mayDefinitelyPass) {
935 std::vector<NBEdge::Connection>
937 std::vector<NBEdge::Connection> ret;
939 if ((*i).fromLane == lane) {
951 (*i).fromLane == fromLane
953 && (*i).toLane == toLane) {
958 +
" to " + to->
getID() +
"_" +
toString(toLane) +
" not found");
965 (*i).fromLane == fromLane
967 && (*i).toLane == toLane) {
972 +
" to " + to->
getID() +
"_" +
toString(toLane) +
" not found");
1003 if (find(outgoing.begin(), outgoing.end(), (*i).toEdge) == outgoing.end()) {
1004 outgoing.push_back((*i).toEdge);
1009 if (it->fromLane < 0 && it->toLane < 0) {
1011 EdgeVector::iterator forbidden = find(outgoing.begin(), outgoing.end(), it->toEdge);
1012 if (forbidden != outgoing.end()) {
1013 outgoing.erase(forbidden);
1018 int size = (int) outgoing.size();
1020 edges->reserve(size);
1021 for (EdgeVector::const_iterator i = outgoing.begin(); i != outgoing.end(); i++) {
1024 edges->push_back(outedge);
1036 if (find(ret.begin(), ret.end(), (*i).toEdge) == ret.end()) {
1037 ret.push_back((*i).toEdge);
1048 for (EdgeVector::const_iterator i = candidates.begin(); i != candidates.end(); i++) {
1049 if ((*i)->isConnectedTo(
this)) {
1059 std::vector<int> ret;
1062 if ((*i).toEdge == currentOutgoing) {
1063 ret.push_back((*i).fromLane);
1086 for (EdgeVector::const_iterator i = incoming.begin(); i != incoming.end(); i++) {
1091 for (EdgeVector::iterator j = connected.begin(); j != connected.end(); j++) {
1104 if ((toEdge == 0 || c.
toEdge == toEdge)
1105 && (fromLane < 0 || c.
fromLane == fromLane)
1106 && (toLane < 0 || c.
toLane == toLane)) {
1109 for (std::set<NBTrafficLightDefinition*>::iterator it = tldefs.begin(); it != tldefs.end(); it++) {
1136 if (((*i).toEdge == connectionToRemove.
toEdge) && ((*i).fromLane == connectionToRemove.
fromLane) && ((*i).toLane == connectionToRemove.
toLane)) {
1151 if (reallowSetting) {
1163 if ((*i).toEdge == which) {
1165 (*i).toLane += laneOff;
1176 std::map<int, int> laneMap;
1180 bool wasConnected =
false;
1182 if ((*i).toEdge != which) {
1185 wasConnected =
true;
1186 if ((*i).fromLane != -1) {
1187 int fromLane = (*i).fromLane;
1188 laneMap[(*i).toLane] = fromLane;
1189 if (minLane == -1 || minLane > fromLane) {
1192 if (maxLane == -1 || maxLane < fromLane) {
1197 if (!wasConnected) {
1203 std::vector<NBEdge::Connection> conns = origConns;
1204 for (std::vector<NBEdge::Connection>::iterator i = conns.begin(); i != conns.end(); ++i) {
1205 if ((*i).toEdge == which) {
1208 int fromLane = (*i).fromLane;
1210 if (laneMap.find(fromLane) == laneMap.end()) {
1211 if (fromLane >= 0 && fromLane <= minLane) {
1214 if (fromLane >= 0 && fromLane >= maxLane) {
1218 toUse = laneMap[fromLane];
1252 std::vector<Connection>::iterator i =
myConnections.begin() + index;
1275 std::string innerID =
":" + n.
getID();
1277 int edgeIndex = linkIndex;
1278 int internalLaneIndex = 0;
1285 if (con.
toEdge != toEdge) {
1288 edgeIndex = linkIndex;
1289 toEdge = (*i).toEdge;
1290 internalLaneIndex = 0;
1293 std::vector<int> foeInternalLinks;
1303 std::pair<SUMOReal, std::vector<int> > crossingPositions(-1, std::vector<int>());
1304 std::set<std::string> tmpFoeIncomingLanes;
1313 for (EdgeVector::const_iterator i2 = incoming.begin(); i2 != incoming.end(); ++i2) {
1314 const std::vector<Connection>& elv = (*i2)->getConnections();
1315 for (std::vector<NBEdge::Connection>::const_iterator k2 = elv.begin(); k2 != elv.end(); k2++) {
1316 if ((*k2).toEdge == 0) {
1319 bool needsCont = n.
needsCont(
this, *i2, con, *k2);
1322 crossingPositions.second.push_back(index);
1326 SUMOReal width2 = (*k2).toEdge->getLaneWidth((*k2).toLane);
1327 if ((*k2).toEdge->getPermissions((*k2).toLane) !=
SVC_BICYCLE) {
1333 if (crossingPositions.first < 0 || crossingPositions.first > minDV) {
1334 crossingPositions.first = minDV;
1339 this, con.
toEdge, con.
fromLane, (*i2), (*k2).toEdge, (*k2).fromLane);
1341 if (n.
foes(
this, con.
toEdge, *i2, (*k2).toEdge) || rightTurnConflict) {
1342 foeInternalLinks.push_back(index);
1346 if ((n.
forbids(*i2, (*k2).toEdge,
this, con.
toEdge, signalised) || rightTurnConflict) && (needsCont || dir ==
LINKDIR_TURN)) {
1347 tmpFoeIncomingLanes.insert((*i2)->getID() +
"_" +
toString((*k2).fromLane));
1353 const std::vector<NBNode::Crossing>& crossings = n.
getCrossings();
1354 for (std::vector<NBNode::Crossing>::const_iterator it_c = crossings.begin(); it_c != crossings.end(); ++it_c) {
1356 for (EdgeVector::const_iterator it_e = crossing.
edges.begin(); it_e != crossing.
edges.end(); ++it_e) {
1357 const NBEdge* edge = *it_e;
1359 if (
this == edge || con.
toEdge == edge) {
1360 foeInternalLinks.push_back(index);
1361 if (con.
toEdge == edge &&
1369 if (crossingPositions.first < 0 || crossingPositions.first > minDV) {
1370 crossingPositions.first = minDV;
1393 crossingPositions.first = -1;
1396 crossingPositions.first = con.
contPos;
1414 assert(shape.size() >= 2);
1416 if (crossingPositions.first >= 0) {
1417 std::pair<PositionVector, PositionVector>
split = shape.
splitAt(crossingPositions.first);
1418 con.
id = innerID +
"_" +
toString(edgeIndex);
1419 con.
shape = split.first;
1422 con.
viaID = innerID +
"_" +
toString(splitIndex + noInternalNoSplits);
1428 con.
id = innerID +
"_" +
toString(edgeIndex);
1433 ++internalLaneIndex;
1453 if (tmp.size() > 0) {
1454 intersect =
MIN2(intersect, tmp[0]);
1457 if (tmp.size() > 0) {
1458 intersect =
MIN2(intersect, tmp[0]);
1491 assert(atNode ==
myTo);
1506 assert(atNode ==
myTo);
1514 if (!onlyPossible) {
1534 std::vector<SUMOReal> offsets(
myLanes.size(), 0.);
1536 for (
int i = (
int)
myLanes.size() - 2; i >= 0; --i) {
1538 offsets[i] = offset;
1545 for (
int i = 0; i < (int)
myLanes.size(); ++i) {
1551 for (
int i = 0; i < (int)
myLanes.size(); ++i) {
1552 offsets[i] += offset;
1556 for (
int i = 0; i < (int)
myLanes.size(); ++i) {
1560 WRITE_WARNING(
"In edge '" +
getID() +
"': lane shape could not be determined (" + e.what() +
").");
1633 for (std::vector<Lane>::const_iterator i =
myLanes.begin(); i !=
myLanes.end(); ++i) {
1634 if ((*i).permissions !=
SVCAll) {
1644 std::vector<Lane>::const_iterator i =
myLanes.begin();
1647 for (; i !=
myLanes.end(); ++i) {
1648 if (i->permissions != firstLanePermissions) {
1658 for (std::vector<Lane>::const_iterator i =
myLanes.begin(); i !=
myLanes.end(); ++i) {
1669 for (std::vector<Lane>::const_iterator i =
myLanes.begin(); i !=
myLanes.end(); ++i) {
1670 if (i->width !=
myLanes.begin()->width) {
1680 for (std::vector<Lane>::const_iterator i =
myLanes.begin(); i !=
myLanes.end(); ++i) {
1681 if (i->endOffset !=
myLanes.begin()->endOffset) {
1705 for (EdgeVector::const_iterator i = o.begin(); i != o.end(); ++i) {
1743 std::vector<int> connNumbersPerLane(
myLanes.size(), 0);
1745 if ((*i).toEdge == 0 || (*i).fromLane < 0 || (*i).toLane < 0) {
1748 if ((*i).fromLane >= 0) {
1749 ++connNumbersPerLane[(*i).fromLane];
1760 for (
int i = 0; i < (int)
myLanes.size(); i++) {
1776 }
else if (common == 0) {
1779 const int origToLane = c.
toLane;
1781 int toLane = origToLane;
1794 int toLane = origToLane;
1829 if (outgoing->size() == 0) {
1841 #ifdef DEBUG_CONNECTION_GUESSING 1843 std::cout <<
" divideOnEdges " <<
getID() <<
" outgoing=" <<
toString(*outgoing) <<
" prios=" <<
toString(*priorities) <<
"\n";
1848 std::vector<int> availableLanes;
1849 for (
int i = 0; i < (int)
myLanes.size(); ++i) {
1851 availableLanes.push_back(i);
1854 if (availableLanes.size() > 0) {
1858 availableLanes.clear();
1859 for (
int i = 0; i < (int)
myLanes.size(); ++i) {
1864 availableLanes.push_back(i);
1866 if (availableLanes.size() > 0) {
1870 availableLanes.clear();
1871 for (
int i = 0; i < (int)
myLanes.size(); ++i) {
1876 availableLanes.push_back(i);
1878 if (availableLanes.size() > 0) {
1882 availableLanes.clear();
1883 for (
int i = 0; i < (int)
myLanes.size(); ++i) {
1888 availableLanes.push_back(i);
1890 if (availableLanes.size() > 0) {
1895 if ((*i).fromLane == -1) {
1914 const int numOutgoing = (int) outgoing->size();
1915 std::vector<SUMOReal> resultingLanes;
1916 resultingLanes.reserve(numOutgoing);
1919 for (
int i = 0; i < numOutgoing; i++) {
1926 if (res > availableLanes.size()) {
1927 res = (
SUMOReal) availableLanes.size();
1930 resultingLanes.push_back(res);
1931 sumResulting += res;
1932 if (minResulting > res && res > 0) {
1944 transition.reserve(numOutgoing);
1945 for (
int i = 0; i < numOutgoing; i++) {
1948 assert(i < (
int)resultingLanes.size());
1949 const int tmpNum = (int)std::ceil(resultingLanes[i] / minResulting);
1950 numVirtual += tmpNum;
1951 for (
SUMOReal j = 0; j < tmpNum; j++) {
1952 transition.push_back((*outgoing)[i]);
1955 #ifdef DEBUG_CONNECTION_GUESSING 1957 std::cout <<
" prioSum=" << prioSum <<
" sumResulting=" << sumResulting <<
" minResulting=" << minResulting <<
" numVirtual=" << numVirtual <<
" availLanes=" <<
toString(availableLanes) <<
" resLanes=" <<
toString(resultingLanes) <<
" transition=" <<
toString(transition) <<
"\n";
1966 for (EdgeVector::const_iterator i = outgoing->begin(); i != outgoing->end(); ++i) {
1968 assert(l2eConns.find(target) != l2eConns.end());
1969 const std::vector<int> lanes = (l2eConns.find(target))->second;
1970 for (std::vector<int>::const_iterator j = lanes.begin(); j != lanes.end(); ++j) {
1971 const int fromIndex = availableLanes[*j];
1990 if (numConsToTarget >= targetLanes) {
1995 for (
int ii = 0; ii < (int)
myLanes.size(); ++ii) {
2005 #ifdef DEBUG_CONNECTION_GUESSING 2007 std::cout <<
" request connection from " <<
getID() <<
"_" << fromIndex <<
" to " << target->
getID() <<
"\n";
2020 const int numOutgoing = (int) outgoing->size();
2022 NBEdge* rightOfTarget = 0;
2023 NBEdge* leftOfTarget = 0;
2025 for (
int i = 0; i < numOutgoing; i++) {
2026 if (maxPrio < (*priorities)[i]) {
2029 maxPrio = (*priorities)[i];
2030 target = (*outgoing)[i];
2031 rightOfTarget = i == 0 ? outgoing->back() : (*outgoing)[i - 1];
2032 leftOfTarget = i + 1 == numOutgoing ? outgoing->front() : (*outgoing)[i + 1];
2044 const int numDesiredConsToTarget =
MIN2(targetLanes, (
int)availableLanes.size());
2045 #ifdef DEBUG_CONNECTION_GUESSING 2047 std::cout <<
" checking extra lanes for target=" << target->
getID() <<
" cons=" << numConsToTarget <<
" desired=" << numDesiredConsToTarget <<
"\n";
2050 std::vector<int>::const_iterator it_avail = availableLanes.begin();
2051 while (numConsToTarget < numDesiredConsToTarget && it_avail != availableLanes.end()) {
2052 const int fromIndex = *it_avail;
2061 #ifdef DEBUG_CONNECTION_GUESSING 2063 std::cout <<
" candidate from " <<
getID() <<
"_" << fromIndex <<
" to " << target->
getID() <<
"\n";
2072 #ifdef DEBUG_CONNECTION_GUESSING 2074 std::cout <<
" request additional connection from " <<
getID() <<
"_" << fromIndex <<
" to " << target->
getID() <<
"\n";
2080 #ifdef DEBUG_CONNECTION_GUESSING 2085 <<
" rightOfTarget=" << rightOfTarget->
getID()
2086 <<
" leftOfTarget=" << leftOfTarget->
getID()
2100 std::vector<int>* priorities =
new std::vector<int>();
2101 if (outgoing->size() == 0) {
2104 priorities->reserve(outgoing->size());
2105 EdgeVector::const_iterator i;
2106 for (i = outgoing->begin(); i != outgoing->end(); i++) {
2109 assert((prio + 1) * 2 > 0);
2110 prio = (prio + 1) * 2;
2111 priorities->push_back(prio);
2118 i = find(outgoing->begin(), outgoing->end(), *(tmp.begin()));
2119 int dist = (int) distance(outgoing->begin(), i);
2121 #ifdef DEBUG_CONNECTION_GUESSING 2123 <<
" outgoing=" <<
toString(*outgoing)
2124 <<
" priorities1=" <<
toString(*priorities)
2131 assert(priorities->size() > 0);
2132 (*priorities)[0] /= 2;
2133 #ifdef DEBUG_CONNECTION_GUESSING 2135 std::cout <<
" priorities2=" <<
toString(*priorities) <<
"\n";
2142 if (mainDirections.
empty()) {
2143 assert(dist < (
int)priorities->size());
2144 (*priorities)[dist] *= 2;
2145 #ifdef DEBUG_CONNECTION_GUESSING 2147 std::cout <<
" priorities3=" <<
toString(*priorities) <<
"\n";
2152 (*priorities)[dist] += 1;
2156 (*priorities)[0] /= 4;
2157 (*priorities)[(int)priorities->size() - 1] /= 2;
2158 #ifdef DEBUG_CONNECTION_GUESSING 2160 std::cout <<
" priorities6=" <<
toString(*priorities) <<
"\n";
2167 (*priorities)[dist] *= 2;
2168 #ifdef DEBUG_CONNECTION_GUESSING 2170 std::cout <<
" priorities4=" <<
toString(*priorities) <<
"\n";
2174 (*priorities)[dist] *= 3;
2175 #ifdef DEBUG_CONNECTION_GUESSING 2177 std::cout <<
" priorities5=" <<
toString(*priorities) <<
"\n";
2190 for (std::vector<int>::const_iterator i = priorities.begin(); i != priorities.end(); i++) {
2208 const int fromLane = (int)
myLanes.size() - 1;
2210 if (checkPermissions) {
2241 if (pos < tolerance) {
2255 for (
int i = 0; i < lanes; i++) {
2257 for (std::vector<NBEdge::Connection>::iterator j = elv.begin(); j != elv.end(); j++) {
2259 assert(el.
tlID ==
"");
2305 assert(fromLane < 0 || fromLane < (
int)
myLanes.size());
2307 if (fromLane >= 0 && toLane >= 0) {
2309 std::vector<Connection>::iterator i =
2317 connection.
tlID = tlID;
2325 bool hadError =
false;
2327 if ((*i).toEdge != toEdge) {
2330 if (fromLane >= 0 && fromLane != (*i).fromLane) {
2333 if (toLane >= 0 && toLane != (*i).toLane) {
2336 if ((*i).tlID ==
"") {
2338 (*i).tlLinkNo = tlIndex;
2341 if ((*i).tlID != tlID && (*i).tlLinkNo == tlIndex) {
2342 WRITE_WARNING(
"The lane '" + toString<int>((*i).fromLane) +
"' on edge '" +
getID() +
"' already had a traffic light signal.");
2347 if (hadError && no == 0) {
2348 WRITE_WARNING(
"Could not set any signal of the tlLogic '" + tlID +
"' (unknown group)");
2382 ret =
myLanes.back().shape.reverse();
2400 ret =
myLanes[0].shape.reverse();
2431 for (
int i = 0; i < (int)
myLanes.size(); i++) {
2433 myLanes[i].permissions != possContinuation->
myLanes[i].permissions ||
2459 if (find(conn.begin(), conn.end(), possContinuation) == conn.end()) {
2475 if (conns.size() !=
myLanes.size() - offset) {
2491 for (
int i = 0; i < (int)
myLanes.size(); i++) {
2518 if ((*i).toEdge == e && (*i).tlID !=
"") {
2550 assert(distances.size() > 0);
2557 assert(index <= (
int)
myLanes.size());
2561 int templateIndex = index > 0 ? index - 1 : index + 1;
2572 for (EdgeVector::const_iterator i = incs.begin(); i != incs.end(); ++i) {
2573 (*i)->invalidateConnections(
true);
2581 int newLaneNo = (int)
myLanes.size() + by;
2582 while ((
int)
myLanes.size() < newLaneNo) {
2592 assert(index < (
int)
myLanes.size());
2597 for (EdgeVector::const_iterator i = incs.begin(); i != incs.end(); ++i) {
2598 (*i)->invalidateConnections(
true);
2607 int newLaneNo = (int)
myLanes.size() - by;
2608 assert(newLaneNo > 0);
2609 while ((
int)
myLanes.size() > newLaneNo) {
2627 for (
int i = 0; i < (int)
myLanes.size(); i++) {
2631 assert(lane < (
int)
myLanes.size());
2632 myLanes[lane].permissions |= vclass;
2640 for (
int i = 0; i < (int)
myLanes.size(); i++) {
2644 assert(lane < (
int)
myLanes.size());
2645 myLanes[lane].permissions &= ~vclass;
2653 for (
int i = 0; i < (int)
myLanes.size(); i++) {
2657 assert(lane < (
int)
myLanes.size());
2658 myLanes[lane].preferred |= vclass;
2668 for (
int i = 0; i < (int)
myLanes.size(); i++) {
2674 assert(lane < (
int)
myLanes.size());
2690 for (
int i = 0; i < (int)
myLanes.size(); i++) {
2707 for (
int i = 0; i < (int)
myLanes.size(); i++) {
2713 assert(lane < (
int)
myLanes.size());
2714 myLanes[lane].endOffset = offset;
2723 for (
int i = 0; i < (int)
myLanes.size(); i++) {
2729 assert(lane < (
int)
myLanes.size());
2737 for (
int i = 0; i < (int)
myLanes.size(); i++) {
2742 assert(lane < (
int)
myLanes.size());
2743 myLanes[lane].permissions = permissions;
2751 for (
int i = 0; i < (int)
myLanes.size(); i++) {
2756 assert(lane < (
int)
myLanes.size());
2757 myLanes[lane].preferred = permissions;
2766 for (
int i = 0; i < (int)
myLanes.size(); i++) {
2771 assert(lane < (
int)
myLanes.size());
2772 return myLanes[lane].permissions;
2785 for (std::vector<Lane>::iterator i =
myLanes.begin(); i !=
myLanes.end(); ++i) {
2786 (*i).permissions =
SVCAll;
2809 for (
int i = start; i != end; i += direction) {
2821 std::set<SVCPermissions>
2823 std::set<SVCPermissions> result;
2827 for (
int i = iStart; i < iEnd; ++i) {
2844 std::cout <<
getID() <<
" angle=" <<
getAngleAtNode(node) <<
" convAngle=" << angle <<
"\n";
2886 if (
myLanes[0].permissions == vclass) {
2898 myLanes[0].permissions = vclass;
2909 for (EdgeVector::const_iterator it = incoming.begin(); it != incoming.end(); ++it) {
2910 (*it)->shiftToLanesToEdge(
this, 1);
2921 if (
myLanes[0].permissions != vclass) {
2931 for (EdgeVector::const_iterator it = incoming.begin(); it != incoming.end(); ++it) {
2932 (*it)->shiftToLanesToEdge(
this, 0);
2945 if ((*it).toEdge == to && (*it).toLane >= 0) {
2946 (*it).toLane += laneOff;
2955 const int i = (node ==
myTo ? -1 : 0);
2956 const int i2 = (node ==
myTo ? 0 : -1);
2962 if (dist < neededOffset && dist2 < neededOffset2) {
2970 WRITE_WARNING(
"Could not avoid overlapping shape at node '" + node->
getID() +
"' for edge '" +
getID() +
"'");
NBEdge::Lane getFirstNonPedestrianLane(int direction) const
get first non-pedestrian lane
bool gDebugFlag1
global utility flags for debugging
std::string id
id of Connection
void moveConnectionToRight(int lane)
void invalidateConnections(bool reallowSetting=false)
invalidate current connections of edge
int tlLinkNo
The index of this connection within the controlling traffic light.
void init(int noLanes, bool tryIgnoreNodePositions, const std::string &origID)
Initialization routines common to all constructors.
The link is a partial left direction.
std::vector< Lane > myLanes
Lane information.
bool includes(Direction d) const
returns the information whether the street in the given direction has a higher priority ...
PositionVector cutAtIntersection(const PositionVector &old) const
cut shape at the intersection shapes
const EdgeVector & getIncomingEdges() const
Returns this node's incoming edges (The edges which yield in this node)
const std::string & getTypeID() const
get ID of type
bool setControllingTLInformation(const NBConnection &c, const std::string &tlID)
Returns if the link could be set as to be controlled.
void divideOnEdges(const EdgeVector *outgoing)
divides the lanes on the outgoing edges
A structure which describes a connection between edges or lanes.
int toLane
The lane the connections yields in.
static const SUMOReal UNSPECIFIED_WIDTH
unspecified lane width
SUMOReal width
This lane's width.
std::string foeIncomingLanes
FOE Incomings lanes.
const SUMOReal SUMO_const_laneWidth
int getTLIndex() const
returns the index within the controlling tls or InvalidTLIndex if this link is unontrolled ...
SUMOReal myEndOffset
This edges's offset to the intersection begin (will be applied to all lanes)
std::vector< TLSDisabledConnection > myTLSDisabledConnections
vector with the disabled connections
SUMOReal nearest_offset_to_point2D(const Position &p, bool perpendicular=true) const
return the nearest offest to point 2D
static const SUMOReal UNSPECIFIED_SIGNAL_OFFSET
unspecified signal offset
LaneSpreadFunction myLaneSpreadFunction
The information about how to spread the lanes.
PositionVector getSubpart2D(SUMOReal beginOffset, SUMOReal endOffset) const
get subpart of a position vector in two dimensions (Z is ignored)
SUMOReal viaVmax
Maximun velocity of via.
void sortOutgoingConnectionsByAngle()
sorts the outgoing connections by their angle relative to their junction
std::string viaID
if Connection have a via, ID of it
NBEdge * toEdge
The edge the connections yields in.
bool hasDefaultGeometry() const
Returns whether the geometry consists only of the node positions.
void shiftTLConnectionLaneIndex(NBEdge *edge, int offset)
patches loaded signal plans by modifying lane indices
void mirrorX()
mirror coordinates along the x-axis
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types...
PositionVector getOrthogonal(const Position &p, SUMOReal extend, SUMOReal &distToClosest) const
return orthogonal through p (extending this vector if necessary)
The relationships between edges are computed/loaded.
bool empty() const
returns the information whether no following street has a higher priority
std::vector< Connection > getConnectionsFromLane(int lane) const
Returns connections from a given lane.
void setNodeBorder(const NBNode *node, const Position &p)
Set Node border.
bool hasLaneSpecificEndOffset() const
whether lanes differ in offset
void setLaneWidth(int lane, SUMOReal width)
set lane specific width (negative lane implies set for all lanes)
bool isTLControlled() const
Returns whether this node is controlled by any tls.
Holds (- relative to the edge it is build from -!!!) the list of main directions a vehicle that drive...
void setSpeed(int lane, SUMOReal speed)
set lane specific speed (negative lane implies set for all lanes)
Some static methods for string processing.
void moveConnectionToLeft(int lane)
const SUMOReal SUMO_const_laneWidthAndOffset
void addSidewalk(SUMOReal width)
add a pedestrian sidewalk of the given width and shift existing connctions
void removeEdge(NBEdge *edge, bool removeFromConnections=true)
Removes edge from this node and optionally removes connections as well.
void addIncomingEdge(NBEdge *edge)
adds an incoming edge
The representation of a single edge during network building.
void reinitNodes(NBNode *from, NBNode *to)
Resets nodes but keeps all other values the same (used when joining)
void clearControllingTLInformation()
clears tlID for all connections
Lane2LaneInfoType
Modes of setting connections between lanes.
std::vector< int > * prepareEdgePriorities(const EdgeVector *outgoing)
recomputes the edge priorities and manipulates them for a distribution of lanes on edges which is mor...
bool mayBeTLSControlled(int fromLane, NBEdge *toEdge, int toLane) const
return true if certain connection must be controlled by TLS
bool hasDefaultGeometryEndpoints() const
Returns whether the geometry is terminated by the node positions This default may be violated by init...
Lane(NBEdge *e, const std::string &_origID)
constructor
The link is a 180 degree turn.
Position getCentroid() const
Returns the centroid (closes the polygon if unclosed)
int getFromLane() const
returns the from-lane
PositionVector getCCWBoundaryLine(const NBNode &n) const
get the outer boundary of this edge when going counter-clock-wise around the given node ...
bool intersects(const Position &p1, const Position &p2) const
Returns the information whether this list of points interesects the given line.
std::string getDescription(const NBEdge *parent) const
get string describing this connection
const std::vector< Crossing > & getCrossings() const
return this junctions pedestrian crossings
EdgeVector getIncomingEdges() const
Returns the list of incoming edges unsorted.
static const SUMOReal UNSPECIFIED_SPEED
unspecified lane speed
std::vector< Direction > myDirs
list of the main direction within the following junction relative to the edge
void markAsInLane2LaneState()
mark edge as in lane to state lane
SUMOReal getTotalWidth() const
Returns the combined width of all lanes of this edge.
PositionVector computeInternalLaneShape(NBEdge *fromE, const NBEdge::Connection &con, int numPoints, NBNode *recordError=0) const
Compute the shape for an internal lane.
TLS Disabled Connections.
Lanes to lanes - relationships are computed; should be recheked.
SUMOReal getLaneWidth() const
Returns the default width of lanes of this edge.
void setPermissions(SVCPermissions permissions, int lane=-1)
set allowed/disallowed classes for the given lane or for all lanes if -1 is given ...
PositionVector shape
The lane's shape.
int myFromJunctionPriority
The priority normalised for the node the edge is outgoing of.
static std::string getIDSecure(const T *obj, const std::string &fallBack="NULL")
get an identifier for Named-like object which may be Null
void computeLaneShapes()
compute lane shapes
bool mayDefinitelyPass
Information about being definitely free to drive (on-ramps)
PositionVector getSubpartByIndex(int beginIndex, int count) const
get subpart of a position vector using index and a cout
SUMOReal getShapeStartAngle() const
Returns the angle at the start of the edge.
PositionVector myGeom
The geometry for the edge.
bool isForbidden(SVCPermissions permissions)
Returns whether an edge with the given permission is a forbidden edge.
void remapConnections(const EdgeVector &incoming)
Remaps the connection in a way that allows the removal of it.
SUMOReal distanceTo(const Position &p2) const
returns the euclidean distance in 3 dimension
static const SUMOReal UNSPECIFIED_CONTPOS
unspecified internal junction position
const SUMOReal SUMO_const_laneOffset
bool around(const Position &p, SUMOReal offset=0) const
Returns the information whether the position vector describes a polygon lying around the given point...
bool isRailway(SVCPermissions permissions)
Returns whether an edge with the given permission is a railway edge.
const SVCPermissions SVCAll
static const SUMOReal UNSPECIFIED_OFFSET
unspecified lane offset
SUMOReal beginEndAngle() const
returns the angle in radians of the line connecting the first and the last position ...
static SUMOReal angleDiff(const SUMOReal angle1, const SUMOReal angle2)
Returns the difference of the second angle to the first angle in radiants.
PositionVector myFromBorder
intersection borders (because the node shape might be invalid)
void restoreBikelane(std::vector< NBEdge::Lane > oldLanes, PositionVector oldGeometry, std::vector< NBEdge::Connection > oldConnections)
restore an previously added BikeLane
void addOutgoingEdge(NBEdge *edge)
adds an outgoing edge
Position positionAtOffset2D(SUMOReal pos, SUMOReal lateralOffset=0) const
Returns the position at the given length.
void setGeometry(const PositionVector &g, bool inner=false)
(Re)sets the edge's geometry
static SUMOReal firstIntersection(const PositionVector &v1, const PositionVector &v2, SUMOReal width2)
compute the first intersection point between the given lane geometries considering their rspective wi...
SUMOReal getLaneSpeed(int lane) const
get lane speed
The link is a (hard) left direction.
#define WRITE_WARNING(msg)
void setz(SUMOReal z)
set position z
bool isConnectedTo(const NBEdge *e) const
Returns the information whethe a connection to the given edge has been added (or computed) ...
The connection was computed and validated.
SUMOReal distance2D(const Position &p, bool perpendicular=false) const
closest 2D-distance to point p (or -1 if perpendicular is true and the point is beyond this vector) ...
static OptionsCont & getOptions()
Retrieves the options.
void reinit(NBNode *from, NBNode *to, const std::string &type, SUMOReal speed, int nolanes, int priority, PositionVector geom, SUMOReal width, SUMOReal offset, const std::string &streetName, LaneSpreadFunction spread=LANESPREAD_RIGHT, bool tryIgnoreNodePositions=false)
Resets initial values.
static bool rightTurnConflict(const NBEdge *from, const NBEdge *to, int fromLane, const NBEdge *prohibitorFrom, const NBEdge *prohibitorTo, int prohibitorFromLane, bool lefthand=false)
return whether the given laneToLane connection is a right turn which must yield to a bicycle crossing...
SUMOReal vmax
maximun velocity
PositionVector reverse() const
reverse position vector
The edge has been loaded, nothing is computed yet.
LinkDirection
The different directions a link between two lanes may take (or a stream between two edges)...
int myToJunctionPriority
The priority normalised for the node the edge is incoming in.
EdgeVector getConnectedEdges() const
Returns the list of outgoing edges unsorted.
The link is a straight direction.
PositionVector shape
shape of Connection
void restoreSidewalk(std::vector< NBEdge::Lane > oldLanes, PositionVector oldGeometry, std::vector< NBEdge::Connection > oldConnections)
restore an previously added sidewalk
SUMOReal speed
The speed allowed on this lane.
bool keepClear
whether the junction must be kept clear when using this connection
const EdgeVector & getOutgoingEdges() const
Returns this node's outgoing edges (The edges which start at this node)
void extrapolate2D(const SUMOReal val, const bool onlyFirst=false)
extrapolate position vector in two dimensions (Z is ignored)
bool hasPermissions() const
whether at least one lane has restrictions
SUMOReal getLoadedLength() const
Returns the length was set explicitly or the computed length if it wasn't set.
An (internal) definition of a single lane of an edge.
const std::string & getID() const
Returns the id.
SUMOReal length2D() const
Returns the length.
SUMOReal mySpeed
The maximal speed.
std::vector< SUMOReal > distances(const PositionVector &s, bool perpendicular=false) const
distances of all my points to s and all of s points to myself
void addLane(int index, bool recompute=true)
add lane
bool needsCont(const NBEdge *fromE, const NBEdge *otherFromE, const NBEdge::Connection &c, const NBEdge::Connection &otherC) const
whether an internal junction should be built at from and respect other
bool addEdge2EdgeConnection(NBEdge *dest)
Adds a connection to another edge.
void incLaneNo(int by)
increment lane
bool myAmMacroscopicConnector
Information whether this edge is a (macroscopic) connector.
const PositionVector getInnerGeometry() const
Returns the geometry of the edge without the endpoints.
void push_front_noDoublePos(const Position &p)
insert in front a non double position
void reshiftPosition(SUMOReal xoff, SUMOReal yoff)
Applies an offset to the edge.
const Position & getPosition() const
bool computeLanes2Edges()
computes the edge, step2: computation of which lanes approach the edges)
NBEdge * myTurnDestination
The turn destination edge (if a connection exists)
Lanes to lanes - relationships are loaded; no recheck is necessary/wished.
Connection getConnection(int fromLane, const NBEdge *to, int toLane) const
Returns the specified connection This method goes through "myConnections" and returns the specified o...
int operator()(const Connection &c1, const Connection &c2) const
comparing operation
bool hasConnectionTo(NBEdge *destEdge, int destLane, int fromLane=-1) const
Retrieves info about a connection to a certain lane of a certain edge.
const std::set< NBTrafficLightDefinition * > & getControllingTLS() const
Returns the traffic lights that were assigned to this node (The set of tls that control this node) ...
bool hasLaneSpecificSpeed() const
whether lanes differ in speed
int getPriority() const
Returns the priority of the edge.
bool insert(NBEdge *edge, bool ignorePrunning=false)
Adds an edge to the dictionary.
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
void checkGeometry(const SUMOReal maxAngle, const SUMOReal minRadius, bool fix)
Check the angles of successive geometry segments.
static SUMOReal legacyDegree(const SUMOReal angle, const bool positive=false)
static const int FORWARD
edge directions (for pedestrian related stuff)
void decLaneNo(int by)
decrement lane
NBEdge(const std::string &id, NBNode *from, NBNode *to, std::string type, SUMOReal speed, int nolanes, int priority, SUMOReal width, SUMOReal offset, const std::string &streetName="", LaneSpreadFunction spread=LANESPREAD_RIGHT)
Constructor.
std::string tlID
The id of the traffic light that controls this connection.
std::string getInternalLaneID() const
get ID of internal lane
int fromLane
The lane the connections starts at.
A point in 2D or 3D with translation and scaling methods.
void deleteLane(int index, bool recompute=true)
delete lane
void add(SUMOReal xoff, SUMOReal yoff, SUMOReal zoff)
bool addLane2LaneConnections(int fromLane, NBEdge *dest, int toLane, int no, Lane2LaneInfoType type, bool invalidatePrevious=false, bool mayDefinitelyPass=false)
Builds no connections starting at the given lanes.
void moveOutgoingConnectionsFrom(NBEdge *e, int laneOff)
move outgoing connection
bool hasLaneSpecificPermissions() const
whether lanes differ in allowed vehicle classes
bool lanesWereAssigned() const
Check if lanes were assigned.
static int computePrioritySum(const std::vector< int > &priorities)
computes the sum of the given list's entries (sic!)
static const SUMOReal UNSPECIFIED_VISIBILITY_DISTANCE
unspecified foe visibility for connections
static bool connections_sorter(const Connection &c1, const Connection &c2)
connections_sorter sort by fromLane, toEdge and toLane
const std::map< NBEdge *, std::vector< int > > & getBuiltConnections() const
get built connections
SUMOReal z() const
Returns the z-position.
SumoXMLNodeType getType() const
Returns the type of this node.
bool geometryLike() const
whether this is structurally similar to a geometry node
NBEdge * myPossibleTurnDestination
The edge that would be the turn destination if there was one.
PositionVector getCWBoundaryLine(const NBNode &n) const
get the outer boundary of this edge when going clock-wise around the given node
bool addLane2LaneConnection(int fromLane, NBEdge *dest, int toLane, Lane2LaneInfoType type, bool mayUseSameDestination=false, bool mayDefinitelyPass=false, bool keepClear=true, SUMOReal contPos=UNSPECIFIED_CONTPOS, SUMOReal visibility=UNSPECIFIED_VISIBILITY_DISTANCE)
Adds a connection between the specified this edge's lane and an approached one.
bool hasLoadedLength() const
Returns whether a length was set explicitly.
int getNumLanes() const
Returns the number of lanes.
bool isTurningDirectionAt(const NBEdge *const edge) const
Returns whether the given edge is the opposite direction to this edge.
SUMOReal contPos
custom position for internal junction on this connection
SUMOReal myLaneWidth
This width of this edge's lanes.
int myPriority
The priority of the edge.
int getFirstNonPedestrianLaneIndex(int direction, bool exclusive=false) const
return the first lane with permissions other than SVC_PEDESTRIAN and 0
Storage for edges, including some functionality operating on multiple edges.
std::string origID
origin ID
bool needsLaneSpecificOutput() const
whether at least one lane has values differing from the edges values
std::vector< std::string > & split(const std::string &s, char delim, std::vector< std::string > &elems)
The link is a (hard) right direction.
Connection(int fromLane_, NBEdge *toEdge_, int toLane_)
Constructor.
EdgeBuildingStep myStep
The building step.
bool canMoveConnection(const Connection &con, int newFromLane) const
whether the connection can originate on newFromLane
std::string getLaneIDInsecure(int lane) const
get Lane ID (Insecure)
Class to sort edges by their angle.
void buildInnerEdges(const NBNode &n, int noInternalNoSplits, int &linkIndex, int &splitIndex)
SUMOReal getAngleAtNodeToCenter(const NBNode *const node) const
Returns the angle of from the node shape center to where the edge meets the node shape.
LinkDirection getDirection(const NBEdge *const incoming, const NBEdge *const outgoing, bool leftHand=false) const
Returns the representation of the described stream's direction.
std::vector< Connection > myConnections
List of connections to following edges.
void setLoadedLength(SUMOReal val)
set loaded lenght
void execute(const int lane, const int virtEdge)
executes a bresenham - step
The connection was given by the user.
const PositionVector & getShape() const
retrieve the junction shape
SUMOReal getSignalOffset() const
Returns the offset of a traffic signal from the end of this edge.
void removeFromConnections(NBEdge *toEdge, int fromLane=-1, int toLane=-1, bool tryLater=false)
Removes the specified connection(s)
The link is a partial right direction.
SUMOReal getEndOffset() const
Returns the offset to the destination node.
vehicle is a passenger car (a "normal" car)
bool myAmInnerEdge
Information whether this is a junction-inner edge.
bool isLeftMover(const NBEdge *const from, const NBEdge *const to) const
Computes whether the given connection is a left mover across the junction.
Base class for objects which have an id.
bool recheckLanes()
recheck whether all lanes within the edge are all right and optimises the connections once again ...
int getJunctionPriority(const NBNode *const node) const
Returns the junction priority (normalised for the node currently build)
SUMOReal myLoadedLength
An optional length to use (-1 if not valid)
PositionVector startShapeAt(const PositionVector &laneShape, const NBNode *startNode, PositionVector nodeShape) const
std::pair< PositionVector, PositionVector > splitAt(SUMOReal where) const
Returns the two lists made when this list vector is splitted at the given point.
static std::string convertUmlaute(std::string str)
Converts german "Umlaute" to their latin-version.
int internalLaneIndex
The lane index of this internal lane within the internal edge.
SVCPermissions getPermissions(int lane=-1) const
get the union of allowed classes over all lanes or for a specific lane
SUMOReal getCrossingAngle(NBNode *node)
return the angle for computing pedestrian crossings at the given node
SUMOReal length() const
Returns the length.
void addRestrictedLane(SUMOReal width, SUMOVehicleClass vclass)
add a lane of the given width, restricted to the given class and shift existing connections ...
void setTurningDestination(NBEdge *e, bool onlyPossible=false)
Sets the turing destination at the given edge.
static const int BACKWARD
void addBikeLane(SUMOReal width)
add a bicycle lane of the given width and shift existing connctions
std::string myID
The name of the object.
NBNode * getToNode() const
Returns the destination node of the edge.
std::vector< int > getConnectionLanes(NBEdge *currentOutgoing) const
Returns the list of lanes that may be used to reach the given edge.
void removeDoublePoints(SUMOReal minDist=POSITION_EPS, bool assertLength=false)
Removes positions if too near.
void computeEdgeShape()
Recomputeds the lane shapes to terminate at the node shape For every lane the intersection with the f...
void addStraightConnections(const EdgeVector *outgoing, const std::vector< int > &availableLanes, const std::vector< int > *priorities)
add some straight connections
PositionVector smoothedZFront(SUMOReal dist=std::numeric_limits< SUMOReal >::max()) const
returned vector that is smoothed at the front (within dist)
void disableConnection4TLS(int fromLane, NBEdge *toEdge, int toLane)
disable connections for TLS
PositionVector viaShape
shape of via
SUMOReal angleAt2D(int pos) const
get angle in certain position of position vector
SUMOReal getMaxLaneOffset()
get max lane offset
PositionVector myToBorder
static const SUMOReal UNSPECIFIED_LOADED_LENGTH
no length override given
std::vector< NBEdge * > EdgeVector
container for (sorted) edges
static const int UNSPECIFIED_INTERNAL_LANE_INDEX
internal lane computation not yet done
SUMOReal myLength
The length of the edge.
void setPreferredVehicleClass(SVCPermissions permissions, int lane=-1)
set preferred Vehicle Class
const PositionVector & getGeometry() const
Returns the geometry of the edge.
The edge has been loaded and connections shall not be added.
int getToLane() const
returns the to-lane
std::vector< Connection > myConnectionsToDelete
List of connections marked for delayed removal.
void reduceGeometry(const SUMOReal minDist)
Removes points with a distance lesser than the given.
void setJunctionPriority(const NBNode *const node, int prio)
Sets the junction priority of the edge.
bool insert(const std::string &id, const Position &position, NBDistrict *district=0)
Inserts a node into the map.
const EdgeVector * getConnectedSorted()
Returns the list of outgoing edges without the turnaround sorted in clockwise direction.
void restoreRestrictedLane(SUMOVehicleClass vclass, std::vector< NBEdge::Lane > oldLanes, PositionVector oldGeometry, std::vector< NBEdge::Connection > oldConnections)
restore a restricted lane
void sortOutgoingConnectionsByIndex()
sorts the outgoing connections by their from-lane-index and their to-lane-index
SUMOReal mySignalOffset
the offset of a traffic light signal from the end of this edge (-1 for None)
std::string myType
The type of the edge.
LaneSpreadFunction
Numbers representing special SUMO-XML-attribute values Information how the edge's lateral offset shal...
void append(NBEdge *continuation)
append another edge
NBEdge * getTo() const
returns the to-edge (end of the connection)
NBNode * tryGetNodeAtPosition(SUMOReal pos, SUMOReal tolerance=5.0) const
Returns the node at the given edges length (using an epsilon)
The connection was computed.
LaneSpreadFunction getLaneSpreadFunction() const
Returns how this edge's lanes' lateral offset is computed.
SUMOReal myStartAngle
The angles of the edge.
EdgeVector edges
The edges being crossed.
Represents a single node (junction) during network building.
PositionVector computeLaneShape(int lane, SUMOReal offset) const
Computes the shape for the given lane.
MainDirections(const EdgeVector &outgoing, NBEdge *parent, NBNode *to, int indexOfStraightest)
constructor
void dismissVehicleClassInformation()
dimiss vehicle class information
bool hasSignalisedConnectionTo(const NBEdge *const e) const
Check if edge has signalised connections.
Lanes to lanes - relationships are computed; no recheck is necessary/wished.
A definition of a pedestrian crossing.
void move2side(SUMOReal amount)
move position vector to side using certain ammount
void replaceInConnections(NBEdge *which, NBEdge *by, int laneOff)
replace in current connections of edge
bool hasLaneSpecificWidth() const
whether lanes differ in width
void setEndOffset(int lane, SUMOReal offset)
set lane specific end-offset (negative lane implies set for all lanes)
void appendTurnaround(bool noTLSControlled, bool checkPermissions)
Add a connection to the previously computed turnaround, if wished.
static void compute(BresenhamCallBack *callBack, const int val1, const int val2)
Direction
enum of possible directions
bool isNearEnough2BeJoined2(NBEdge *e, SUMOReal threshold) const
Check if edge is near enought to be joined to another edge.
void preferVehicleClass(int lane, SUMOVehicleClass vclass)
prefer certain vehicle class
void push_back_noDoublePos(const Position &p)
insert in back a non double position
std::string getLaneID(int lane) const
get Lane ID (Secure)
void allowVehicleClass(int lane, SUMOVehicleClass vclass)
set allowed class for the given lane or for all lanes if -1 is given
void insertConnection(NBEdge::Connection connection)
insert a previously created NBEdge::connection
void addGeometryPoint(int index, const Position &p)
Adds a further geometry point.
void shiftToLanesToEdge(NBEdge *to, int laneOff)
modifify the toLane for all connections to the given edge
SUMOReal getShapeEndAngle() const
Returns the angle at the end of the edge.
void computeAngle()
computes the angle of this edge and stores it in myAngle
NBNode * retrieve(const std::string &id) const
Returns the node with the given name.
SUMOReal getSpeed() const
Returns the speed allowed on this edge.
Container for nodes during the netbuilding process.
SUMOReal getFinalLength() const
get length that will be assigned to the lanes in the final network
bool computeEdge2Edges(bool noLeftMovers)
computes the edge (step1: computation of approached edges)
static T maxValue(const std::vector< T > &v)
bool haveVia
check if Connection have a Via
int getInt(const std::string &name) const
Returns the int-value of the named option (only for Option_Integer)
bool foes(const NBEdge *const from1, const NBEdge *const to1, const NBEdge *const from2, const NBEdge *const to2) const
Returns the information whether the given flows cross.
void setLaneSpreadFunction(LaneSpreadFunction spread)
(Re)sets how the lanes lateral offset shall be computed
#define WRITE_MESSAGE(msg)
void divideSelectedLanesOnEdges(const EdgeVector *outgoing, const std::vector< int > &availableLanes, const std::vector< int > *priorities)
divide selected lanes on edges
std::vector< SUMOReal > intersectsAtLengths2D(const PositionVector &other) const
For all intersections between this vector and other, return the 2D-length of the subvector from this ...
std::set< SVCPermissions > getPermissionVariants(int iStart, int iEnd) const
return all permission variants within the specified lane range [iStart, iEnd[
Lanes to edges - relationships are computed/loaded.
std::string myStreetName
The street name (or whatever arbitrary string you wish to attach)
const std::string & getStreetName() const
Returns the street name of this edge.
NBNode * myFrom
The source and the destination node.
bool expandableBy(NBEdge *possContinuation) const
Check if Node is expandable.
NBEdge * getTurnDestination(bool possibleDestination=false) const
Connection & getConnectionRef(int fromLane, const NBEdge *to, int toLane)
Returns reference to the specified connection This method goes through "myConnections" and returns th...
bool setConnection(int lane, NBEdge *destEdge, int destLane, Lane2LaneInfoType type, bool mayUseSameDestination=false, bool mayDefinitelyPass=false, bool keepClear=true, SUMOReal contPos=UNSPECIFIED_CONTPOS, SUMOReal visibility=UNSPECIFIED_VISIBILITY_DISTANCE)
Adds a connection to a certain lane of a certain edge.
std::vector< int > foeInternalLinks
FOE Internal links.
PositionVector getSubpart(SUMOReal beginOffset, SUMOReal endOffset) const
get subpart of a position vector
~MainDirections()
destructor
const PositionVector & getLaneShape(int i) const
Returns the shape of the nth lane.
static bool isTrafficLight(SumoXMLNodeType type)
return whether the given type is a traffic light
void shiftPositionAtNode(NBNode *node, NBEdge *opposite)
shift geometry at the given node to avoid overlap
std::string joinToString(const std::vector< T > &v, const T_BETWEEN &between, std::streamsize accuracy=gPrecision)
void disallowVehicleClass(int lane, SUMOVehicleClass vclass)
set disallowed class for the given lane or for all lanes if -1 is given
SUMOReal angleTo2D(const Position &other) const
returns the angle in the plane of the vector pointing from here to the other position ...
void append(const PositionVector &v, SUMOReal sameThreshold=2.0)
void extrapolate(const SUMOReal val, const bool onlyFirst=false)
extrapolate position vector
static const SUMOReal INVALID_OFFSET
a value to signify offsets outside the range of [0, Line.length()]
void copyConnectionsFrom(NBEdge *src)
copy connections from antoher edge
A class that being a bresenham-callback assigns the incoming lanes to the edges.
static const SUMOReal ANGLE_LOOKAHEAD
the distance at which to take the default angle
SUMOReal getLength() const
Returns the computed length of the edge.
SUMOReal getAngleAtNode(const NBNode *const node) const
Returns the angle of the edge's geometry at the given node.
bool forbids(const NBEdge *const possProhibitorFrom, const NBEdge *const possProhibitorTo, const NBEdge *const possProhibitedFrom, const NBEdge *const possProhibitedTo, bool regardNonSignalisedLowerPriority) const
Returns the information whether "prohibited" flow must let "prohibitor" flow pass.
SUMOReal visibility
custom foe visiblity for connection
NBNode * getFromNode() const
Returns the origin node of the edge.
bool splitGeometry(NBEdgeCont &ec, NBNodeCont &nc)
Splits this edge at geometry points.