60 #ifdef CHECK_MEMORY_LEAKS
62 #endif // CHECK_MEMORY_LEAKS
70 myVehicleClasses2Keep(0),
71 myVehicleClasses2Remove(0),
87 if (oc.
isSet(
"keep-edges.explicit")) {
88 const std::vector<std::string> edges = oc.
getStringVector(
"keep-edges.explicit");
91 if (oc.
isSet(
"remove-edges.explicit")) {
92 const std::vector<std::string> edges = oc.
getStringVector(
"remove-edges.explicit");
95 if (oc.
exists(
"keep-edges.by-vclass") && oc.
isSet(
"keep-edges.by-vclass")) {
96 const std::vector<std::string> classes = oc.
getStringVector(
"keep-edges.by-vclass");
97 for (std::vector<std::string>::const_iterator i = classes.begin(); i != classes.end(); ++i) {
101 if (oc.
exists(
"remove-edges.by-vclass") && oc.
isSet(
"remove-edges.by-vclass")) {
102 const std::vector<std::string> classes = oc.
getStringVector(
"remove-edges.by-vclass");
103 for (std::vector<std::string>::const_iterator i = classes.begin(); i != classes.end(); ++i) {
107 if (oc.
exists(
"keep-edges.by-type") && oc.
isSet(
"keep-edges.by-type")) {
108 const std::vector<std::string> types = oc.
getStringVector(
"keep-edges.by-type");
111 if (oc.
exists(
"remove-edges.by-type") && oc.
isSet(
"remove-edges.by-type")) {
112 const std::vector<std::string> types = oc.
getStringVector(
"remove-edges.by-type");
116 if (oc.
isSet(
"keep-edges.in-boundary")) {
117 std::vector<std::string> polyS = oc.
getStringVector(
"keep-edges.in-boundary");
119 std::vector<SUMOReal> poly;
120 for (std::vector<std::string>::iterator i = polyS.begin(); i != polyS.end(); ++i) {
123 if (poly.size() < 4) {
124 throw ProcessError(
"Invalid boundary: need at least 2 coordinates");
125 }
else if (poly.size() % 2 != 0) {
126 throw ProcessError(
"Invalid boundary: malformed coordinate");
127 }
else if (poly.size() == 4) {
134 for (std::vector<SUMOReal>::iterator j = poly.begin(); j != poly.end();) {
146 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
174 if (oc.
exists(
"dismiss-vclasses") && oc.
getBool(
"dismiss-vclasses")) {
236 EdgeCont::const_iterator i =
myEdges.find(
id);
238 if (retrieveExtracted) {
265 hints.push_back(hintedge);
268 for (EdgeVector::iterator i = hints.begin(); i != hints.end(); i++) {
270 for (EdgeVector::iterator j = candidates.begin(); j != candidates.end(); j++) {
271 NBEdge* poss_searched = (*j);
273 ? poss_searched->
myTo : poss_searched->
myFrom;
276 if (find(cont.begin(), cont.end(), hintedge) != cont.end()) {
277 return poss_searched;
292 size_t maxLength = 0;
293 std::string tid =
id +
"[";
294 for (EdgeCont::const_iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
295 if ((*i).first.find(tid) == 0) {
296 maxLength =
MAX2(maxLength, (*i).first.length());
301 std::vector<std::string> names;
302 names.push_back(
id +
"[1]");
303 names.push_back(
id +
"[0]");
304 while (names.size() > 0) {
306 std::string cid = names.back();
312 if (cid.length() + 3 < maxLength) {
313 names.push_back(cid +
"[1]");
314 names.push_back(cid +
"[0]");
351 if (
myEdges.count(newID) != 0) {
352 throw ProcessError(
"Attempt to rename edge using existing id '" + newID +
"'");
370 const std::string& firstEdgeName,
371 const std::string& secondEdgeName,
372 unsigned int noLanesFirstEdge,
unsigned int noLanesSecondEdge) {
383 return splitAt(dc, edge, pos, node, firstEdgeName, secondEdgeName,
384 noLanesFirstEdge, noLanesSecondEdge);
391 const std::string& firstEdgeName,
392 const std::string& secondEdgeName,
393 unsigned int noLanesFirstEdge,
unsigned int noLanesSecondEdge) {
395 std::pair<PositionVector, PositionVector> geoms =
398 geoms.first.pop_back();
403 geoms.second.pop_front();
411 for (
unsigned int i = 0; i < noLanesFirstEdge && i < edge->
getNumLanes(); i++) {
418 for (
unsigned int i = 0; i < noLanesSecondEdge && i < edge->
getNumLanes(); i++) {
432 if (noLanesFirstEdge == noLanesSecondEdge - 1) {
433 for (
unsigned int i = 0; i < one->
getNumLanes(); i++) {
467 std::vector<std::string>
469 std::vector<std::string> ret;
470 for (EdgeCont::const_iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
471 ret.push_back((*i).first);
481 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
482 NBEdge* edge = (*i).second;
486 toRemove.push_back(edge);
489 for (EdgeVector::iterator j = toRemove.begin(); j != toRemove.end(); ++j) {
497 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
498 if ((*i).second->getGeometry().size() < 3) {
501 (*i).second->splitGeometry(*
this, nc);
509 for (EdgeCont::const_iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
510 (*i).second->clearControllingTLInformation();
517 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
518 (*i).second->sortOutgoingConnectionsByAngle();
525 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
526 (*i).second->computeEdge2Edges(noLeftMovers);
533 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
534 (*i).second->computeLanes2Edges();
541 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
542 (*i).second->recheckLanes();
549 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
550 (*i).second->appendTurnaround(noTLSControlled);
557 for (std::set<std::string>::const_iterator it = ids.begin(); it != ids.end(); it++) {
558 myEdges[*it]->appendTurnaround(noTLSControlled);
565 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
566 (*i).second->computeEdgeShape();
573 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
574 (*i).second->computeLaneShapes();
589 unsigned int nolanes = 0;
595 NBEdge* tpledge = *(edges.begin());
596 NBNode* from = tpledge->getFromNode();
597 NBNode* to = tpledge->getToNode();
598 EdgeVector::const_iterator i;
599 for (i = edges.begin(); i != edges.end(); i++) {
601 assert((*i)->getFromNode() == from);
602 assert((*i)->getToNode() == to);
604 nolanes += (*i)->getNumLanes();
606 if (i != edges.begin()) {
611 speed += (*i)->getSpeed();
613 priority =
MAX2(priority, (*i)->getPriority());
615 speed /= edges.size();
619 NBEdge* newEdge =
new NBEdge(
id, from, to,
"", speed, nolanes, priority,
621 tpledge->getStreetName(), tpledge->myLaneSpreadFunction);
629 for (i = edges.begin(); i != edges.end(); i++) {
631 for (EdgeVector::iterator j = ev.begin(); j != ev.end(); j++) {
636 unsigned int currLane = 0;
637 for (i = edges.begin(); i != edges.end(); i++) {
639 currLane += (*i)->getNumLanes();
643 for (i = edges.begin(); i != edges.end(); i++) {
644 unsigned int noLanes = (*i)->getNumLanes();
645 for (
unsigned int j = 0; j < noLanes; j++, currLane++) {
651 for (i = edges.begin(); i != edges.end(); i++) {
659 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
660 std::string oppositeID;
661 if ((*i).first[0] ==
'-') {
662 oppositeID = (*i).first.substr(1);
664 oppositeID =
"-" + (*i).first;
689 if (from != 0 && to != 0) {
691 WRITE_WARNING(
"Could not insert connection between '" + (*i).from +
"' and '" + (*i).to +
"' after build.");
697 for (EdgeCont::iterator it =
myEdges.begin(); it !=
myEdges.end(); ++it) {
698 NBEdge* edge = it->second;
701 std::vector<NBEdge::Connection> connections = edge->
getConnections();
702 for (std::vector<NBEdge::Connection>::iterator it_con = connections.begin(); it_con != connections.end(); ++it_con) {
716 size_t len =
id.length();
718 for (EdgeCont::const_iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
719 std::string curr = (*i).first;
722 if (curr.length() <= len) {
727 if (curr.substr(0, len) ==
id && curr[len] ==
'[') {
728 ret.push_back((*i).second);
732 size_t pos = curr.find(
id);
734 if (pos == std::string::npos) {
739 if (curr[pos - 1] !=
']' && curr[pos - 1] !=
'+') {
744 if (pos +
id.length() < curr.length()) {
745 if (curr[pos +
id.length()] !=
'[' && curr[pos +
id.length()] !=
'+') {
750 ret.push_back((*i).second);
759 std::set<NBEdge*> candidates;
760 for (EdgeCont::const_iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
764 candidates.insert(e);
769 std::set<NBEdge*> visited;
770 for (std::set<NBEdge*>::const_iterator i = candidates.begin(); i != candidates.end(); ++i) {
777 if (visited.count(e) > 0) {
781 loopEdges.push_back(e);
786 if (edges.size() < 2) {
790 EdgeVector::const_iterator me = find(edges.begin(), edges.end(), e);
793 EdgeVector::const_iterator loopClosed = find(loopEdges.begin(), loopEdges.end(), left);
794 const size_t loopSize = loopEdges.end() - loopClosed;
799 }
else if (loopSize < loopEdges.size()) {
801 EdgeVector(loopEdges.begin() + (loopEdges.size() - loopSize), loopEdges.end()).swap(loopEdges);
805 if (visited.count(left) > 0) {
809 loopEdges.push_back(left);
815 std::set<NBEdge*> loopEdgesSet(loopEdges.begin(), loopEdges.end());
816 for (std::set<NBEdge*>::const_iterator j = loopEdgesSet.begin(); j != loopEdgesSet.end(); ++j) {
818 NBNode* node = (*j)->getToNode();
820 for (EdgeVector::const_iterator k = incoming.begin(); k != incoming.end(); ++k) {
822 if (loopEdgesSet.count(inEdge) > 0) {
831 (*j)->setJunctionPriority(node, 1000);
833 marked.push_back(loopEdgesSet);
841 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {