61 #ifdef CHECK_MEMORY_LEAKS
63 #endif // CHECK_MEMORY_LEAKS
72 myVehicleClasses2Keep(0),
73 myVehicleClasses2Remove(0)
88 if (oc.
isSet(
"keep-edges.explicit")) {
89 const std::vector<std::string> edges = oc.
getStringVector(
"keep-edges.explicit");
92 if (oc.
isSet(
"remove-edges.explicit")) {
93 const std::vector<std::string> edges = oc.
getStringVector(
"remove-edges.explicit");
96 if (oc.
exists(
"keep-edges.by-vclass") && oc.
isSet(
"keep-edges.by-vclass")) {
97 const std::vector<std::string> classes = oc.
getStringVector(
"keep-edges.by-vclass");
98 for (std::vector<std::string>::const_iterator i = classes.begin(); i != classes.end(); ++i) {
102 if (oc.
exists(
"remove-edges.by-vclass") && oc.
isSet(
"remove-edges.by-vclass")) {
103 const std::vector<std::string> classes = oc.
getStringVector(
"remove-edges.by-vclass");
104 for (std::vector<std::string>::const_iterator i = classes.begin(); i != classes.end(); ++i) {
108 if (oc.
exists(
"keep-edges.by-type") && oc.
isSet(
"keep-edges.by-type")) {
109 const std::vector<std::string> types = oc.
getStringVector(
"keep-edges.by-type");
112 if (oc.
exists(
"remove-edges.by-type") && oc.
isSet(
"remove-edges.by-type")) {
113 const std::vector<std::string> types = oc.
getStringVector(
"remove-edges.by-type");
117 if (oc.
isSet(
"keep-edges.in-boundary")) {
118 std::vector<std::string> polyS = oc.
getStringVector(
"keep-edges.in-boundary");
120 std::vector<SUMOReal> poly;
121 for (std::vector<std::string>::iterator i = polyS.begin(); i != polyS.end(); ++i) {
124 if (poly.size() < 4) {
125 throw ProcessError(
"Invalid boundary: need at least 2 coordinates");
126 }
else if (poly.size() % 2 != 0) {
127 throw ProcessError(
"Invalid boundary: malformed coordinate");
128 }
else if (poly.size() == 4) {
135 for (std::vector<SUMOReal>::iterator j = poly.begin(); j != poly.end();) {
147 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
175 if (oc.
exists(
"dismiss-vclasses") && oc.
getBool(
"dismiss-vclasses")) {
237 EdgeCont::const_iterator i =
myEdges.find(
id);
239 if (retrieveExtracted) {
254 const std::string& hint,
255 bool incoming)
const {
268 hints.push_back(hintedge);
271 for (EdgeVector::iterator i = hints.begin(); i != hints.end(); i++) {
273 for (EdgeVector::iterator j = candidates.begin(); j != candidates.end(); j++) {
274 NBEdge* poss_searched = (*j);
276 ? poss_searched->
myTo : poss_searched->
myFrom;
279 if (find(cont.begin(), cont.end(), hintedge) != cont.end()) {
280 return poss_searched;
295 size_t maxLength = 0;
296 std::string tid =
id +
"[";
297 for (EdgeCont::const_iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
298 if ((*i).first.find(tid) == 0) {
299 maxLength =
MAX2(maxLength, (*i).first.length());
304 std::vector<std::string> names;
305 names.push_back(
id +
"[1]");
306 names.push_back(
id +
"[0]");
307 while (names.size() > 0) {
309 std::string cid = names.back();
315 if (cid.length() + 3 < maxLength) {
316 names.push_back(cid +
"[1]");
317 names.push_back(cid +
"[0]");
354 if (
myEdges.count(newID) != 0) {
355 throw ProcessError(
"Attempt to rename edge using existing id '" + newID +
"'");
373 const std::string& firstEdgeName,
374 const std::string& secondEdgeName,
375 unsigned int noLanesFirstEdge,
unsigned int noLanesSecondEdge) {
386 return splitAt(dc, edge, pos, node, firstEdgeName, secondEdgeName,
387 noLanesFirstEdge, noLanesSecondEdge);
394 const std::string& firstEdgeName,
395 const std::string& secondEdgeName,
396 unsigned int noLanesFirstEdge,
unsigned int noLanesSecondEdge) {
398 std::pair<PositionVector, PositionVector> geoms =
401 geoms.first.pop_back();
406 geoms.second.pop_front();
414 for (
unsigned int i = 0; i < noLanesFirstEdge && i < edge->
getNumLanes(); i++) {
421 for (
unsigned int i = 0; i < noLanesSecondEdge && i < edge->
getNumLanes(); i++) {
435 if (noLanesFirstEdge == noLanesSecondEdge - 1) {
436 for (
unsigned int i = 0; i < one->
getNumLanes(); i++) {
470 std::vector<std::string>
472 std::vector<std::string> ret;
473 for (EdgeCont::const_iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
474 ret.push_back((*i).first);
484 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
485 NBEdge* edge = (*i).second;
489 toRemove.push_back(edge);
492 for (EdgeVector::iterator j = toRemove.begin(); j != toRemove.end(); ++j) {
500 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
501 if ((*i).second->getGeometry().size() < 3) {
504 (*i).second->splitGeometry(*
this, nc);
512 for (EdgeCont::const_iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
513 (*i).second->clearControllingTLInformation();
520 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
521 (*i).second->sortOutgoingConnectionsByAngle();
528 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
529 (*i).second->computeEdge2Edges(noLeftMovers);
536 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
537 (*i).second->computeLanes2Edges();
544 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
545 (*i).second->recheckLanes();
552 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
553 (*i).second->appendTurnaround(noTLSControlled);
560 for (std::set<std::string>::const_iterator it = ids.begin(); it != ids.end(); it++) {
561 myEdges[*it]->appendTurnaround(noTLSControlled);
568 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
569 (*i).second->computeEdgeShape();
576 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
577 (*i).second->computeLaneShapes();
592 unsigned int nolanes = 0;
598 NBEdge* tpledge = *(edges.begin());
599 NBNode* from = tpledge->getFromNode();
600 NBNode* to = tpledge->getToNode();
601 EdgeVector::const_iterator i;
602 for (i = edges.begin(); i != edges.end(); i++) {
604 assert((*i)->getFromNode() == from);
605 assert((*i)->getToNode() == to);
607 nolanes += (*i)->getNumLanes();
609 if (i != edges.begin()) {
614 speed += (*i)->getSpeed();
616 priority =
MAX2(priority, (*i)->getPriority());
618 speed /= edges.size();
622 NBEdge* newEdge =
new NBEdge(
id, from, to,
"", speed, nolanes, priority,
624 tpledge->getStreetName(), tpledge->myLaneSpreadFunction);
632 for (i = edges.begin(); i != edges.end(); i++) {
634 for (EdgeVector::iterator j = ev.begin(); j != ev.end(); j++) {
639 unsigned int currLane = 0;
640 for (i = edges.begin(); i != edges.end(); i++) {
642 currLane += (*i)->getNumLanes();
646 for (i = edges.begin(); i != edges.end(); i++) {
647 unsigned int noLanes = (*i)->getNumLanes();
648 for (
unsigned int j = 0; j < noLanes; j++, currLane++) {
654 for (i = edges.begin(); i != edges.end(); i++) {
662 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
663 std::string oppositeID;
664 if ((*i).first[0] ==
'-') {
665 oppositeID = (*i).first.substr(1);
667 oppositeID =
"-" + (*i).first;
683 size_t len =
id.length();
685 for (EdgeCont::const_iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
686 std::string curr = (*i).first;
689 if (curr.length() <= len) {
694 if (curr.substr(0, len) ==
id && curr[len] ==
'[') {
695 ret.push_back((*i).second);
699 size_t pos = curr.find(
id);
701 if (pos == std::string::npos) {
706 if (curr[pos - 1] !=
']' && curr[pos - 1] !=
'+') {
711 if (pos +
id.length() < curr.length()) {
712 if (curr[pos +
id.length()] !=
'[' && curr[pos +
id.length()] !=
'+') {
717 ret.push_back((*i).second);
726 std::set<NBEdge*> candidates;
727 for (EdgeCont::const_iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
731 candidates.insert(e);
735 std::set<NBEdge*> visited;
736 for (std::set<NBEdge*>::const_iterator i = candidates.begin(); i != candidates.end(); ++i) {
737 std::set<NBEdge*> loopEdges;
740 if (find(visited.begin(), visited.end(),
begin) != visited.end()) {
750 if (edges.size() < 2) {
754 EdgeVector::const_iterator me = find(edges.begin(), edges.end(), e);
757 loopEdges.insert(left);
761 if (find(candidates.begin(), candidates.end(), left) == candidates.end()) {
765 if (find(visited.begin(), visited.end(), left) != visited.end()) {
773 for (std::set<NBEdge*>::const_iterator j = loopEdges.begin(); j != loopEdges.end(); ++j) {
777 const EdgeVector& outgoing = (*j)->getToNode()->getOutgoingEdges();
778 for (EdgeVector::const_iterator k = incoming.begin(); k != incoming.end(); ++k) {
779 if (loopEdges.find(*k) != loopEdges.end()) {
785 for (EdgeVector::const_iterator l = outgoing.begin(); l != outgoing.end(); ++l) {
786 if (loopEdges.find(*l) != loopEdges.end()) {
787 (*k)->addEdge2EdgeConnection(*l);
789 (*k)->removeFromConnections(*l, -1);
796 (*j)->setJunctionPriority((*j)->getToNode(), 1000);
798 marked.push_back(loopEdges);