61 #ifdef CHECK_MEMORY_LEAKS
63 #endif // CHECK_MEMORY_LEAKS
72 myVehicleClasses2Keep(0),
73 myVehicleClasses2Remove(0),
74 myNeedGeoTransformedPrunningBoundary(false)
89 if (oc.
isSet(
"keep-edges.explicit")) {
90 const std::vector<std::string> edges = oc.
getStringVector(
"keep-edges.explicit");
93 if (oc.
isSet(
"remove-edges.explicit")) {
94 const std::vector<std::string> edges = oc.
getStringVector(
"remove-edges.explicit");
97 if (oc.
exists(
"keep-edges.by-vclass") && oc.
isSet(
"keep-edges.by-vclass")) {
100 if (oc.
exists(
"remove-edges.by-vclass") && oc.
isSet(
"remove-edges.by-vclass")) {
103 if (oc.
exists(
"keep-edges.by-type") && oc.
isSet(
"keep-edges.by-type")) {
104 const std::vector<std::string> types = oc.
getStringVector(
"keep-edges.by-type");
107 if (oc.
exists(
"remove-edges.by-type") && oc.
isSet(
"remove-edges.by-type")) {
108 const std::vector<std::string> types = oc.
getStringVector(
"remove-edges.by-type");
112 if (oc.
isSet(
"keep-edges.in-boundary") || oc.
isSet(
"keep-edges.in-geo-boundary")) {
114 "keep-edges.in-boundary" :
"keep-edges.in-geo-boundary");
116 std::vector<SUMOReal> poly;
117 for (std::vector<std::string>::iterator i = polyS.begin(); i != polyS.end(); ++i) {
120 if (poly.size() < 4) {
121 throw ProcessError(
"Invalid boundary: need at least 2 coordinates");
122 }
else if (poly.size() % 2 != 0) {
123 throw ProcessError(
"Invalid boundary: malformed coordinate");
124 }
else if (poly.size() == 4) {
131 for (std::vector<SUMOReal>::iterator j = poly.begin(); j != poly.end();) {
144 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
172 if (oc.
exists(
"dismiss-vclasses") && oc.
getBool(
"dismiss-vclasses")) {
230 WRITE_ERROR(
"Cannot prune edges using a geo-boundary because no projection has been loaded");
246 EdgeCont::const_iterator i =
myEdges.find(
id);
248 if (retrieveExtracted) {
268 while (candidates->size() == 1) {
269 const std::string& nextID = candidates->front()->getID();
270 if (nextID.find(
id) != 0 || nextID.size() <=
id.size() + 1 || (nextID[
id.size()] !=
'.' && nextID[
id.size()] !=
'-')) {
273 edge = candidates->front();
294 hints.push_back(hintedge);
297 for (EdgeVector::iterator i = hints.begin(); i != hints.end(); i++) {
299 for (EdgeVector::iterator j = candidates.begin(); j != candidates.end(); j++) {
300 NBEdge* poss_searched = (*j);
302 ? poss_searched->
myTo : poss_searched->
myFrom;
305 if (find(cont.begin(), cont.end(), hintedge) != cont.end()) {
306 return poss_searched;
321 size_t maxLength = 0;
322 std::string tid =
id +
"[";
323 for (EdgeCont::const_iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
324 if ((*i).first.find(tid) == 0) {
325 maxLength =
MAX2(maxLength, (*i).first.length());
330 std::vector<std::string> names;
331 names.push_back(
id +
"[1]");
332 names.push_back(
id +
"[0]");
333 while (names.size() > 0) {
335 std::string cid = names.back();
341 if (cid.length() + 3 < maxLength) {
342 names.push_back(cid +
"[1]");
343 names.push_back(cid +
"[0]");
380 if (
myEdges.count(newID) != 0) {
381 throw ProcessError(
"Attempt to rename edge using existing id '" + newID +
"'");
399 const std::string& firstEdgeName,
400 const std::string& secondEdgeName,
401 unsigned int noLanesFirstEdge,
unsigned int noLanesSecondEdge) {
412 return splitAt(dc, edge, pos, node, firstEdgeName, secondEdgeName,
413 noLanesFirstEdge, noLanesSecondEdge);
420 const std::string& firstEdgeName,
421 const std::string& secondEdgeName,
422 unsigned int noLanesFirstEdge,
unsigned int noLanesSecondEdge) {
424 std::pair<PositionVector, PositionVector> geoms =
427 geoms.first.pop_back();
432 geoms.second.pop_front();
436 NBEdge* one =
new NBEdge(firstEdgeName, edge->
myFrom, node, edge, geoms.first, noLanesFirstEdge);
437 NBEdge* two =
new NBEdge(secondEdgeName, node, edge->
myTo, edge, geoms.second, noLanesSecondEdge);
449 if (noLanesFirstEdge == noLanesSecondEdge - 1) {
450 for (
unsigned int i = 0; i < one->
getNumLanes(); i++) {
484 std::vector<std::string>
486 std::vector<std::string> ret;
487 for (EdgeCont::const_iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
488 ret.push_back((*i).first);
498 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
499 NBEdge* edge = (*i).second;
503 toRemove.push_back(edge);
506 for (EdgeVector::iterator j = toRemove.begin(); j != toRemove.end(); ++j) {
514 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
515 if ((*i).second->getGeometry().size() < 3) {
518 (*i).second->splitGeometry(*
this, nc);
525 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
526 (*i).second->reduceGeometry(minDist);
533 if (maxAngle > 0 || minRadius > 0) {
534 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
535 (*i).second->checkGeometry(maxAngle, minRadius, fix);
544 for (EdgeCont::const_iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
545 (*i).second->clearControllingTLInformation();
552 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
553 (*i).second->sortOutgoingConnectionsByAngle();
560 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
561 (*i).second->computeEdge2Edges(noLeftMovers);
568 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
569 (*i).second->computeLanes2Edges(buildCrossingsAndWalkingAreas);
576 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
577 (*i).second->recheckLanes(buildCrossingsAndWalkingAreas);
584 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
585 (*i).second->appendTurnaround(noTLSControlled);
592 for (std::set<std::string>::const_iterator it = ids.begin(); it != ids.end(); it++) {
593 myEdges[*it]->appendTurnaround(noTLSControlled);
600 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
601 (*i).second->computeEdgeShape();
608 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
609 (*i).second->computeLaneShapes();
624 unsigned int nolanes = 0;
630 NBEdge* tpledge = *(edges.begin());
631 NBNode* from = tpledge->getFromNode();
632 NBNode* to = tpledge->getToNode();
633 EdgeVector::const_iterator i;
634 for (i = edges.begin(); i != edges.end(); i++) {
636 assert((*i)->getFromNode() == from);
637 assert((*i)->getToNode() == to);
639 nolanes += (*i)->getNumLanes();
641 if (i != edges.begin()) {
646 speed += (*i)->getSpeed();
648 priority =
MAX2(priority, (*i)->getPriority());
650 speed /= edges.size();
654 NBEdge* newEdge =
new NBEdge(
id, from, to,
"", speed, nolanes, priority,
656 tpledge->getStreetName(), tpledge->myLaneSpreadFunction);
664 for (i = edges.begin(); i != edges.end(); i++) {
666 for (EdgeVector::iterator j = ev.begin(); j != ev.end(); j++) {
671 unsigned int currLane = 0;
672 for (i = edges.begin(); i != edges.end(); i++) {
674 currLane += (*i)->getNumLanes();
678 for (i = edges.begin(); i != edges.end(); i++) {
679 unsigned int noLanes = (*i)->getNumLanes();
680 for (
unsigned int j = 0; j < noLanes; j++, currLane++) {
686 for (i = edges.begin(); i != edges.end(); i++) {
694 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
695 std::string oppositeID;
696 if ((*i).first[0] ==
'-') {
697 oppositeID = (*i).first.substr(1);
699 oppositeID =
"-" + (*i).first;
724 if (from != 0 && to != 0) {
726 WRITE_WARNING(
"Could not insert connection between '" + (*i).from +
"' and '" + (*i).to +
"' after build.");
732 for (EdgeCont::iterator it =
myEdges.begin(); it !=
myEdges.end(); ++it) {
733 NBEdge* edge = it->second;
736 std::vector<NBEdge::Connection> connections = edge->
getConnections();
737 for (std::vector<NBEdge::Connection>::iterator it_con = connections.begin(); it_con != connections.end(); ++it_con) {
751 size_t len =
id.length();
753 for (EdgeCont::const_iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
754 std::string curr = (*i).first;
757 if (curr.length() <= len) {
762 if (curr.substr(0, len) ==
id && curr[len] ==
'[') {
763 ret.push_back((*i).second);
767 size_t pos = curr.find(
id);
769 if (pos == std::string::npos) {
774 if (curr[pos - 1] !=
']' && curr[pos - 1] !=
'+') {
779 if (pos +
id.length() < curr.length()) {
780 if (curr[pos +
id.length()] !=
'[' && curr[pos +
id.length()] !=
'+') {
785 ret.push_back((*i).second);
794 std::set<NBEdge*> candidates;
795 for (EdgeCont::const_iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
799 candidates.insert(e);
804 std::set<NBEdge*> visited;
805 for (std::set<NBEdge*>::const_iterator i = candidates.begin(); i != candidates.end(); ++i) {
812 if (visited.count(e) > 0) {
816 loopEdges.push_back(e);
821 if (edges.size() < 2) {
830 EdgeVector::const_iterator me = find(edges.begin(), edges.end(), e);
839 EdgeVector::const_iterator loopClosed = find(loopEdges.begin(), loopEdges.end(), left);
840 const size_t loopSize = loopEdges.end() - loopClosed;
845 }
else if (loopSize < loopEdges.size()) {
847 EdgeVector(loopEdges.begin() + (loopEdges.size() - loopSize), loopEdges.end()).swap(loopEdges);
851 for (EdgeVector::const_iterator j = loopEdges.begin(); j != loopEdges.end(); ++j) {
852 if ((*j)->getToNode()->getEdges().size() > 2) {
856 if (attachments < 3) {
861 if (visited.count(left) > 0) {
865 loopEdges.push_back(left);
871 std::set<NBEdge*> loopEdgesSet(loopEdges.begin(), loopEdges.end());
872 for (std::set<NBEdge*>::const_iterator j = loopEdgesSet.begin(); j != loopEdgesSet.end(); ++j) {
874 NBNode* node = (*j)->getToNode();
876 for (EdgeVector::const_iterator k = incoming.begin(); k != incoming.end(); ++k) {
878 if (loopEdgesSet.count(inEdge) > 0) {
887 (*j)->setJunctionPriority(node, 1000);
890 marked.push_back(loopEdges);
898 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
936 int sidewalksCreated = 0;
937 for (EdgeCont::iterator it =
myEdges.begin(); it !=
myEdges.end(); it++) {
938 NBEdge* edge = it->second;
941 sidewalksCreated += 1;
944 return sidewalksCreated;