57 #ifdef CHECK_MEMORY_LEAKS
59 #endif // CHECK_MEMORY_LEAKS
142 std::vector<OpenDriveEdge> innerEdges, outerEdges;
145 std::vector<std::string> files = oc.
getStringVector(
"opendrive-files");
146 for (std::vector<std::string>::const_iterator file = files.begin(); file != files.end(); ++file) {
148 WRITE_ERROR(
"Could not open opendrive file '" + *file +
"'.");
166 std::map<std::string, Boundary> posMap;
167 std::map<std::string, std::string> edge2junction;
169 for (std::vector<OpenDriveEdge>::iterator i = innerEdges.begin(); i != innerEdges.end(); ++i) {
173 if (posMap.find(e.
junction) == posMap.end()) {
179 for (std::map<std::string, Boundary>::iterator i = posMap.begin(); i != posMap.end(); ++i) {
181 throw ProcessError(
"Could not add node '" + (*i).first +
"'.");
185 for (std::vector<OpenDriveEdge>::iterator i = outerEdges.begin(); i != outerEdges.end(); ++i) {
187 for (std::vector<OpenDriveLink>::iterator j = e.
links.begin(); j != e.
links.end(); ++j) {
194 if (edge2junction.find(l.
elementID) != edge2junction.end()) {
206 for (std::vector<OpenDriveEdge>::iterator i = outerEdges.begin(); i != outerEdges.end(); ++i) {
208 for (std::vector<OpenDriveLink>::iterator j = e.
links.begin(); j != e.
links.end(); ++j) {
215 std::string id1 = e.
id;
220 std::string nid = id1 +
"." + id2;
225 throw ProcessError(
"Could not build node '" + nid +
"'.");
243 for (std::vector<OpenDriveEdge>::iterator i = outerEdges.begin(); i != outerEdges.end(); ++i) {
245 if (e.
to != 0 && e.
from != 0) {
248 for (std::vector<OpenDriveEdge>::iterator j = innerEdges.begin(); j != innerEdges.end(); ++j) {
250 for (std::vector<OpenDriveLink>::iterator k = ie.
links.begin(); k != ie.
links.end(); ++k) {
256 std::string nid = edge2junction[ie.
id];
269 for (std::vector<OpenDriveEdge>::iterator i = outerEdges.begin(); i != outerEdges.end(); ++i) {
272 std::string nid = e.
id +
".begin";
277 std::string nid = e.
id +
".end";
287 std::map<NBEdge*, std::map<int, int> > fromLaneMap;
288 std::map<NBEdge*, std::map<int, int> > toLaneMap;
291 for (std::vector<OpenDriveEdge>::iterator i = outerEdges.begin(); i != outerEdges.end(); ++i) {
297 if (noLanesRight != 0 || noLanesLeft != 0) {
302 if (noLanesRight > 0) {
307 throw ProcessError(
"Could not add edge '" + std::string(
"-") + e.
id +
"'.");
309 for (
unsigned int j = 0; j < noLanesRight; ++j) {
316 if (noLanesLeft > 0) {
324 for (
unsigned int j = 0; j < noLanesLeft; ++j) {
336 std::vector<Connection> connections;
339 for (std::vector<OpenDriveEdge>::iterator i = outerEdges.begin(); i != outerEdges.end(); ++i) {
341 for (std::vector<OpenDriveLink>::iterator j = e.
links.begin(); j != e.
links.end(); ++j) {
347 if (edge2junction.find(l.
elementID) != edge2junction.end()) {
355 if (p == outerEdges.end()) {
358 std::string id1 = e.
id;
359 std::string id2 = (*p).id;
363 std::string nid = id1 +
"." + id2;
374 for (std::vector<OpenDriveEdge>::iterator i = innerEdges.begin(); i != innerEdges.end(); ++i) {
376 std::string pred, succ;
378 for (std::vector<OpenDriveLink>::iterator j = e.
links.begin(); j != e.
links.end(); ++j) {
382 std::cout <<
"unsupported" << std::endl;
385 if (edge2junction.find(l.
elementID) != edge2junction.end()) {
387 std::cout <<
"unsupported" << std::endl;
392 std::cout <<
"double succ" << std::endl;
398 std::cout <<
"double pred" << std::endl;
406 std::cout <<
"Both dirs given!" << std::endl;
409 bool isReversed =
false;
416 if (succ ==
"" || pred ==
"") {
417 std::cout <<
"Missing edge." << std::endl;
420 std::vector<OpenDriveEdge>::iterator predEdge = std::find_if(outerEdges.begin(), outerEdges.end(),
edge_by_id_finder(pred));
421 if (predEdge == outerEdges.end()) {
424 std::vector<OpenDriveEdge>::iterator succEdge = std::find_if(outerEdges.begin(), outerEdges.end(),
edge_by_id_finder(succ));
425 if (succEdge == outerEdges.end()) {
428 NBEdge* fromEdge, *toEdge;
451 connections.push_back(c);
454 for (std::vector<Connection>::const_iterator i = connections.begin(); i != connections.end(); ++i) {
455 if ((*i).from == 0 || (*i).to == 0) {
456 std::cout <<
"Nope." << std::endl;
459 (*i).from->addEdge2EdgeConnection((*i).to);
460 std::map<int, int> fromMap = fromLaneMap[(*i).from];
461 std::map<int, int> toMap = fromLaneMap[(*i).to];
463 for (std::vector<std::pair<int, int> >::const_iterator j = (*i).lanes.begin(); j != (*i).lanes.end(); ++j, --index) {
464 int fromLane = fromMap[(*j).first];
465 int toLane = toMap[(*j).second];
466 if (static_cast<unsigned int>(fromLane) >= (*i).from->getNumLanes() || fromLane < 0) {
467 std::cout <<
"False " << std::endl;
469 if (static_cast<unsigned int>(toLane) >= (*i).to->getNumLanes() || toLane < 0) {
470 std::cout <<
"False " << std::endl;
475 std::vector<NBEdge::Connection>& cons = (*i).from->getConnections();
476 for (std::vector<NBEdge::Connection>::iterator k = cons.begin(); k != cons.end(); ++k) {
477 if ((*k).fromLane == fromLane && (*k).toEdge == (*i).to && (*k).toLane == toLane) {
478 (*k).origID = (*i).id +
" " +
toString(index);
491 LinkType lt,
const std::string& via,
492 std::vector<NIImporter_OpenDrive::Connection>& connections) {
516 if (from == 0 && to == 0) {
520 connections.push_back(c);
527 std::vector<NIImporter_OpenDrive::Connection>& connections) {
530 if (fromEdge == 0 || !node->
hasIncoming(fromEdge)) {
537 if (fromEdge != 0 && toEdge != 0) {
542 connections.push_back(c);
546 if (fromEdge == 0 || !node->
hasOutgoing(fromEdge)) {
553 if (fromEdge != 0 && toEdge != 0) {
558 connections.push_back(c);
568 const std::vector<OpenDriveLane>& fromLanes = fromLS.
lanesByDir.find(fromLaneDir)->second;
570 const std::vector<OpenDriveLane>& toLanes = toLS.
lanesByDir.find(toLaneDir)->second;
574 for (std::vector<OpenDriveLane>::const_iterator i = fromLanes.begin(); i != fromLanes.end(); ++i) {
579 c.
lanes.push_back(std::make_pair((*i).id, (*i).successor));
582 c.
lanes.push_back(std::make_pair((*i).id, (*i).predecessor));
585 for (std::vector<OpenDriveLane>::const_iterator i = toLanes.begin(); i != toLanes.end(); ++i) {
590 c.
lanes.push_back(std::make_pair((*i).predecessor, (*i).id));
593 c.
lanes.push_back(std::make_pair((*i).successor, (*i).id));
605 setLaneConnections(from2via, from, fromAtBegin, fromLaneDir, via, viaIsReversed, viaLaneDir);
608 for (std::vector<std::pair<int, int> >::const_iterator i = from2via.
lanes.begin(); i != from2via.
lanes.end(); ++i) {
609 int fromLane = (*i).first;
610 int viaLane = (*i).second;
611 for (std::vector<std::pair<int, int> >::const_iterator j = via2to.
lanes.begin(); j != via2to.
lanes.end(); ++j) {
612 if ((*j).first == viaLane) {
613 c.
lanes.push_back(std::make_pair(fromLane, (*j).second));
626 if (!nc.
insert(
id, pos)) {
640 throw ProcessError(
"Could not find node '" + nodeID +
"'.");
643 if (e.
to != 0 && e.
to != n) {
662 const std::string& edgeID,
663 const std::string& nodeID) {
680 const std::string& edgeID,
681 const std::string& nodeID) {
697 for (std::vector<OpenDriveEdge>::iterator i = edges.begin(); i != edges.end(); ++i) {
699 for (std::vector<OpenDriveGeometry>::iterator j = e.
geometries.begin(); j != e.
geometries.end(); ++j) {
701 std::vector<Position> geom;
720 for (std::vector<Position>::iterator k = geom.begin(); k != geom.end(); ++k) {
724 for (
unsigned int j = 0; j < e.
geom.
size(); ++j) {
732 std::vector<Position>
735 std::vector<Position> ret;
742 std::vector<Position>
745 std::vector<Position> ret;
750 std::vector<Point2D<double> > into;
752 for (std::vector<
Point2D<double> >::iterator i = into.begin(); i != into.end(); ++i) {
753 ret.push_back(
Position((*i).getX(), (*i).getY()));
759 std::vector<Position>
762 std::vector<Position> ret;
782 if (geo_posE - g.
s > g.
length) {
785 if (geo_posE - g.
s > g.
length) {
788 calcPointOnCurve(&endX, &endY, centerX, centerY, radius, geo_posE - geo_posS);
790 dist += (geo_posE - geo_posS);
791 if (curvature > 0.0) {
792 hdgE = g.
hdg + dist / fabs(radius);
794 hdgE = g.
hdg - dist / fabs(radius);
797 ret.push_back(
Position(startX, startY));
804 if (geo_posE - (g.
s + g.
length) < 0.001 && geo_posE - (g.
s + g.
length) > -0.001) {
812 std::vector<Position>
816 std::vector<Position> ret;
825 double x2 = normx * cos(hdg) - normy * sin(hdg);
826 double y2 = normx * sin(hdg) + normy * cos(hdg);
829 return Position(start.
x() + normx, start.
y() + normy);
846 normX = normX * cos(ad_hdg) + normY * sin(ad_hdg);
847 normY = tmpX * sin(ad_hdg) + normY * cos(ad_hdg);
850 normX = normX * cos(90 *
PI / 180) + turn * normY * sin(90 *
PI / 180);
851 normY = -1 * turn * tmpX * sin(90 *
PI / 180) + normY * cos(90 *
PI / 180);
853 normX = fabs(ad_radius) * normX;
854 normY = fabs(ad_radius) * normY;
864 double rotAngle = ad_length / fabs(ad_r);
865 double vx = *ad_x - ad_centerX;
866 double vy = *ad_y - ad_centerY;
876 vx = vx * cos(rotAngle) + turn * vy * sin(rotAngle);
877 vy = -1 * turn * tmpx * sin(rotAngle) + vy * cos(rotAngle);
878 *ad_x = vx + ad_centerX;
879 *ad_y = vy + ad_centerY;
895 unsigned int laneNum = 0;
896 const std::vector<OpenDriveLane>& dirLanes = lanesByDir.find(dir)->second;
897 for (std::vector<OpenDriveLane>::const_iterator i = dirLanes.begin(); i != dirLanes.end(); ++i) {
908 std::map<int, int> ret;
909 unsigned int sumoLane = 0;
910 const std::vector<OpenDriveLane>& dirLanes = lanesByDir.find(dir)->second;
912 for (std::vector<OpenDriveLane>::const_reverse_iterator i = dirLanes.rbegin(); i != dirLanes.rend(); ++i) {
914 ret[(*i).id] = sumoLane++;
918 for (std::vector<OpenDriveLane>::const_iterator i = dirLanes.begin(); i != dirLanes.end(); ++i) {
920 ret[(*i).id] = sumoLane++;
933 unsigned int maxLaneNum = 0;
934 for (std::vector<OpenDriveLaneSection>::const_iterator i = laneSections.begin(); i != laneSections.end(); ++i) {
935 maxLaneNum =
MAX2(maxLaneNum, (*i).getLaneNumber(dir));
945 for (std::vector<OpenDriveSignal>::const_iterator i = signals.begin(); i != signals.end(); ++i) {
947 if ((*i).type ==
"301" || (*i).type ==
"306") {
950 if ((*i).type ==
"205") {
970 std::vector<OpenDriveEdge>& innerEdges,
971 std::vector<OpenDriveEdge>& outerEdges)
989 if (majorVersion != 1 || minorVersion != 2) {
1043 std::vector<SUMOReal> vals;
1048 std::vector<SUMOReal> vals;
1055 std::vector<SUMOReal> vals;
1061 std::vector<SUMOReal> vals;
1129 const std::string& elementID,
1130 const std::string& contactPoint) {
1133 if (elementType ==
"road") {
1135 }
else if (elementType ==
"junction") {
1139 if (contactPoint ==
"start") {
1141 }
else if (contactPoint ==
"end") {