84const
double GNENet::Z_INITIALIZED = 1;
93#pragma warning(disable: 4355)
97 myApplicationWindow(applicationWindow),
98 myNetBuilder(netBuilder),
99 myAttributeCarriers(new
GNENetHelper::AttributeCarriers(this)),
221const std::map<std::string, int>&
288 const std::string junctionPrefix = oc.
getString(
"prefix") + oc.
getString(
"node-prefix");
305 const std::string& suggestedName,
bool wasSplit,
bool allowDuplicateGeom,
bool recomputeConnections) {
308 if (outgoingEdge->getToNode() == dest->
getNBNode() && outgoingEdge->getGeometry().size() == 2) {
309 if (!allowDuplicateGeom) {
323 if (oppositeEdges.size() > 0) {
325 if ((oppositeEdges.front()->getID().size() > 1) && (oppositeEdges.front()->getID().front() ==
'-')) {
326 edgeID = oppositeEdges.front()->getID().substr(1);
328 edgeID =
"-" + oppositeEdges.front()->getID();
337 edgeID = edgeID +
toString(counter);
340 edgeID = suggestedName;
341 }
else if (edgeInfix.size() > 0) {
346 edgeID = src->
getID() + edgeInfix + dest->
getID();
363 edge =
new GNEEdge(
this, nbe, wasSplit);
367 double defaultSpeed = neteditOptions.getFloat(
"default.speed");
368 const std::string defaultType = neteditOptions.getString(
"default.type");
369 const int defaultNrLanes = neteditOptions.getInt(
"default.lanenumber");
370 const int defaultPriority = neteditOptions.getInt(
"default.priority");
377 defaultNrLanes, defaultPriority,
378 defaultWidth, defaultOffset, spread);
380 edge =
new GNEEdge(
this, nbe, wasSplit);
383 undoList->
begin(edge,
TL(
"create edge"));
386 if (recomputeConnections) {
456 std::vector<GNECrossing*> crossingsToRemove;
458 for (
const auto& junctionNeighbour : junctionNeighbours) {
460 for (
const auto& crossing : junctionNeighbour->getGNECrossings()) {
463 crossingsToRemove.push_back(crossing);
468 for (
const auto& crossing : crossingsToRemove) {
473 for (
const auto& edge : incidentEdges) {
494 while (lane->getChildAdditionals().size() > 0) {
498 while (lane->getChildDemandElements().size() > 0) {
502 while (lane->getChildGenericDatas().size() > 0) {
522 if (planParent->getChildDemandElements().size() == 1) {
539 if (recomputeConnections) {
555 if (oppLaneID !=
"") {
557 if (lane !=
nullptr) {
572 undoList->
begin(which,
TL(
"replace edge"));
577 std::vector<GNEAdditional*> copyOfLaneAdditionals = lane->getChildAdditionals();
578 for (
const auto& additional : copyOfLaneAdditionals) {
592 std::vector<GNEDemandElement*> copyOfLaneDemandElements = lane->getChildDemandElements();
593 for (
const auto& demandElement : copyOfLaneDemandElements) {
597 std::vector<GNEGenericData*> copyOfLaneGenericDatas = lane->getChildGenericDatas();
598 for (
const auto& demandElement : copyOfLaneGenericDatas) {
668 deleteEdge(edge, undoList, recomputeConnections);
688 if (recomputeConnections) {
697 undoList->
add(
new GNEChange_Lane(edge, lane, laneAttrs,
false, recomputeConnections),
true);
776 throw ProcessError(
TL(
"Trying to delete a default Vehicle Type"));
804 for (
const auto& dataInterval : copyOfDataIntervalChildren) {
817 for (
const auto& genericData : copyOfGenericDataChildren) {
865 undoList->
begin(lane,
TL(
"duplicate lane"));
868 if (recomputeConnections) {
873 undoList->
add(
new GNEChange_Lane(edge, newLane, laneAttrs,
true, recomputeConnections),
true);
881 bool addRestriction =
true;
887 addRestriction =
false;
896 if (addRestriction) {
908 std::vector<GNEConnection*> cons;
918 for (
auto c : cons) {
936 if (lane->isRestricted(vclass)) {
942 if (index > numLanes) {
952 }
else if (vclass ==
SVC_BUS) {
972 if (index > numLanes) {
989 if (lane->isRestricted(vclass)) {
999std::pair<GNEJunction*, GNEEdge*>
1002 undoList->
begin(edge,
TL(
"split edge"));
1004 if (newJunction ==
nullptr) {
1014 std::pair<PositionVector, PositionVector> newGeoms = oldEdgeGeometry.
splitAt(edgeSplitPosition);
1015 const double oldLength = oldEdgeGeometry.
length();
1016 const double relativeLength1 = oldLength != 0 ? newGeoms.first.length() / oldLength : 1;
1017 const double relativeLength2 = oldLength != 0 ? newGeoms.second.length() / oldLength : 1;
1025 const std::string::size_type sep_index = baseName.rfind(
'.');
1027 if (sep_index != std::string::npos) {
1028 std::string posString = baseName.substr(sep_index + 1);
1029 if (GNEAttributeCarrier::canParse<int>(posString.c_str())) {
1031 posBase = GNEAttributeCarrier::parse<int>(posString.c_str());
1032 baseName = baseName.substr(0, sep_index);
1039 undoList, baseName +
toString(posBase + (
int)edgeSplitPosition),
true,
false,
false);
1043 std::vector<NBNode::Crossing> affectedCrossings;
1045 if (crossing->checkEdgeBelong(edge)) {
1051 newEdges.push_back(secondPart->
getNBEdge());
1053 newEdges.push_back(nbEdge);
1056 nbC.
edges = newEdges;
1057 affectedCrossings.push_back(nbC);
1063 newGeoms.first.pop_back();
1064 newGeoms.first.erase(newGeoms.first.begin());
1069 newGeoms.second.pop_back();
1070 newGeoms.second.erase(newGeoms.second.begin());
1080 for (
int i = 0; i < (int)edge->
getChildLanes().size(); ++i) {
1084 for (
const auto& nbC : affectedCrossings) {
1089 for (
const auto& additional : childAdditionals) {
1090 additional->splitEdgeGeometry(edgeSplitPosition, edge, secondPart, undoList);
1093 for (
int i = 0; i < (int)edge->
getChildLanes().size(); i++) {
1094 for (
const auto& additional : edge->
getChildLanes().at(i)->getChildAdditionals()) {
1100 for (
const auto& demandElement : childDemandElements) {
1101 demandElement->splitEdgeGeometry(edgeSplitPosition, edge, secondPart, undoList);
1104 for (
int i = 0; i < (int)edge->
getChildLanes().size(); i++) {
1105 for (
const auto& demandElement : edge->
getChildLanes().at(i)->getChildDemandElements()) {
1106 demandElement->splitEdgeGeometry(laneSplitPosition, edge->
getChildLanes().at(i), secondPart->
getChildLanes().at(i), undoList);
1112 return std::make_pair(newJunction, secondPart);
1119 undoList->
begin(edge,
TL(
"split edges"));
1121 auto newStuff =
splitEdge(edge, pos, undoList, newJunction);
1122 newJunction = newStuff.first;
1124 splitEdge(oppositeEdge, pos, undoList, newJunction);
1131 if (nbEdge->guessOpposite(
true)) {
1142 undoList->
begin(edge,
TL(
"reverse edge"));
1159 if (reversed !=
nullptr) {
1162 undoList->
begin(edge,
TL(
"add reversed edge"));
1163 if (!disconnected) {
1166 assert(reversed != 0);
1180 reversed =
createEdge(src, dest, edge, undoList,
"-" + edge->
getID(),
false,
true);
1181 assert(reversed != 0);
1196 undoList->
begin(moved,
TL(
"merge junctions"));
1199 for (
const auto& incomingNBEdge : incomingNBEdges) {
1210 for (
const auto& outgoingNBEdge : outgoingNBEdges) {
1228 for (
NBEdge* edge : roundabout) {
1229 if (edge->getFromNode() == junction->
getNBNode()) {
1230 undoList->
begin(junction,
TL(
"select roundabout"));
1231 for (
const auto& roundaboutEdge : roundabout) {
1246 undoList->
begin(junction,
TL(
"create roundabout"));
1260 std::vector<GNEEdge*> edges;
1267 std::reverse(edges.begin(), edges.end());
1269 const double lefthandSign = lefthand ? -1 : 1;
1270 std::vector<GNEJunction*> newJunctions;
1271 GNEEdge* templateEdge =
nullptr;
1272 GNEEdge* prevOpposite =
nullptr;
1274 std::vector<std::pair<NBNode::Crossing, std::vector<std::string>>> oldCrossings;
1276 std::vector<std::string> edgeIDs;
1277 for (
auto e : crossing->getCrossingEdges()) {
1278 edgeIDs.push_back(e->getID());
1280 oldCrossings.push_back(std::make_pair(*crossing->getNBCrossing(), edgeIDs));
1282 std::map<std::string, std::string> edgeRename;
1286 if (edge == prevOpposite) {
1287 newJunction = newJunctions.back();
1290 if (edge->getToJunction() == junction) {
1291 if (templateEdge ==
nullptr) {
1292 templateEdge = edge;
1295 NBEdge* e = edge->getNBEdge();
1299 templateEdge = edge;
1304 prevOpposite = edge->
getOppositeEdges().size() > 0 ? edge->getOppositeEdges().front() :
nullptr;
1305 const double geomLength = edge->getNBEdge()->getGeometry().length2D();
1306 const double splitOffset = (edge->getToJunction() == junction
1307 ?
MAX2(POSITION_EPS, geomLength - radius)
1308 :
MIN2(geomLength - POSITION_EPS, radius));
1309 Position pos = edge->getNBEdge()->getGeometry().positionAtOffset2D(splitOffset);
1310 auto newStuff =
splitEdge(edge, pos, undoList, newJunction);
1311 newJunction = newStuff.first;
1312 if (edge->getFromJunction() == junction) {
1314 edgeRename[newStuff.second->getID()] = edge->
getID();
1316 if (newJunctions.empty() || newJunction != newJunctions.back()) {
1317 newJunctions.push_back(newJunction);
1324 for (
auto item : edgeRename) {
1329 for (
auto nbCItem : oldCrossings) {
1331 nbCItem.first.edges.clear();
1333 for (
const std::string& ce : nbCItem.second) {
1334 bool foundCE =
false;
1335 for (
NBEdge* je : nj->getNBNode()->getEdges()) {
1336 if (je->getID() == ce) {
1338 nbCItem.first.edges.push_back(je);
1346 if (nbCItem.first.edges.size() == nbCItem.second.size()) {
1354 for (
int i = 0; i < (int)newJunctions.size(); i++) {
1355 GNEJunction* from = newJunctions[(i + 1) % newJunctions.size()];
1363 int numSegments =
MAX2(2, (
int)ceil(angleDiff * radius / resolution));
1365 for (
int j = 1; j < numSegments; j++) {
1366 const double angle = angle1 + lefthandSign * j * angleDiff / numSegments;
1367 innerGeom.push_back(center +
Position(cos(angle) * radius, sin(angle) * radius));
1385 if (junction.second->getPositionInView() == pos) {
1400 neteditOptions.resetWritable();
1411 for (
int i = 0; i < (int)edgeType.second->getLaneTypes().size(); i++) {
1413 edgeType.second->getLaneTypes().at(i)->speed,
1414 edgeType.second->getLaneTypes().at(i)->permissions,
1415 edgeType.second->getLaneTypes().at(i)->width,
1416 edgeType.second->getLaneTypes().at(i)->attrs);
1422 sumoOptions.resetWritable();
1423 neteditOptions.resetDefault(
"output-file");
1436 if (netconvertOptions.
getFullName().find(
"netedit") != std::string::npos) {
1439 const std::vector<std::string> toReset = {
1440 "sumo-net-file",
"plain-output-prefix",
1441 "additional-files",
"route-files",
"data-files",
"meandata-files",
1442 "sumocfg-file",
"netecfg-file",
"netccfg-file",
"gui-settings-file",
1443 "selection-file",
"test-file",
"tls-file",
"edgetypes-file",
1444 "ignore-missing-inputs",
"autosave-netconvert-file",
1445 "default.action-step-length",
"default.speeddev"
1447 for (
const std::string& opt : toReset) {
1499 if (volatileOptions) {
1500 window->
setStatusBarText(
TL(
"Forced computing junctions with volatile options ..."));
1508 if (volatileOptions) {
1517 if (volatileOptions) {
1526 if (volatileOptions) {
1528 if (bucket->getFilename().size() > 0) {
1532 if (!generalHandler.
parse()) {
1533 WRITE_ERROR(
TL(
"Loading of additional file failed: ") + bucket->getFilename());
1535 WRITE_MESSAGE(
TL(
"Loading of additional file successfully: ") + bucket->getFilename());
1541 if (volatileOptions) {
1543 if (bucket->getFilename().size() > 0) {
1547 if (!generalHandler.
parse()) {
1548 WRITE_ERROR(
TL(
"Loading of route file failed: ") + bucket->getFilename());
1550 WRITE_MESSAGE(
TL(
"Loading of route file successfully: ") + bucket->getFilename());
1556 if (volatileOptions) {
1558 if (bucket->getFilename().size() > 0) {
1562 if (!dataHandler.
parse()) {
1563 WRITE_ERROR(
TL(
"Loading of data file failed: ") + bucket->getFilename());
1565 WRITE_MESSAGE(
TL(
"Loading of data file successfully: ") + bucket->getFilename());
1571 if (volatileOptions) {
1573 if (bucket->getFilename().size() > 0) {
1577 if (!generalHandler.
parse()) {
1578 WRITE_ERROR(
TL(
"Loading of meandata file failed: ") + bucket->getFilename());
1580 WRITE_MESSAGE(
TL(
"Loading of meandata file successfully: ") + bucket->getFilename());
1606 for (
const auto& demandElement : demandElements.second) {
1607 demandElement.second->computePathElement();
1619 for (
const auto& genericData : genericDataTag.second) {
1620 genericData.second->computePathElement();
1635 for (
auto it : tlsDefs) {
1636 it->setParticipantsInformation();
1637 it->setTLControllingInformation();
1648 if (requireSaving) {
1663 if (selectedJunctions.size() < 2) {
1668 std::set<NBNode*, ComparatorIdLess> cluster;
1669 for (
const auto& selectedJunction : selectedJunctions) {
1670 cluster.insert(selectedJunction->getNBNode());
1671 const EdgeVector& incoming = selectedJunction->getNBNode()->getIncomingEdges();
1672 allIncoming.insert(allIncoming.end(), incoming.begin(), incoming.end());
1673 const EdgeVector& outgoing = selectedJunction->getNBNode()->getOutgoingEdges();
1674 allOutgoing.insert(allOutgoing.end(), outgoing.begin(), outgoing.end());
1680 std::string
id =
"cluster";
1688 if ((junction.second->getPositionInView() == pos) && (cluster.find(junction.second->getNBNode()) == cluster.end())) {
1691 TL(
"Position of joined junction"),
1692 TL(
"There is another unselected junction in the same position of joined junction."),
1693 TL(
"It will be joined with the other selected junctions. Continue?"));
1706 pos.
setx(pos.
x() + 0.1);
1707 pos.
sety(pos.
y() + 0.1);
1721 std::vector<NBNode::Crossing> oldCrossings;
1722 for (
const auto& selectedJunction : selectedJunctions) {
1723 const auto crossings = selectedJunction->getGNECrossings();
1724 for (
auto crossing : crossings) {
1729 for (
const auto& selectedJunction : selectedJunctions) {
1730 selectedJunction->setLogicValid(
false, undoList);
1733 for (
const auto& incomingEdge : allIncoming) {
1734 if (std::find(allOutgoing.begin(), allOutgoing.end(), incomingEdge) == allOutgoing.end()) {
1739 for (
const auto& outgoingEdge : allOutgoing) {
1743 edgesWithin.insert(outgoingEdge);
1750 for (
const auto& nbc : oldCrossings) {
1752 for (
NBEdge* e : nbc.edges) {
1753 if (edgesWithin.count(e) != 0) {
1761 nbc.customTLIndex, nbc.customTLIndex2, nbc.customShape,
1762 false,
true),
true);
1766 for (
const auto& selectedJunction : selectedJunctions) {
1770 if (pos != oldPos) {
1781 std::vector<GNECrossing*> myNetCrossings;
1783 myNetCrossings.reserve(myNetCrossings.size() + junction.second->getGNECrossings().size());
1784 myNetCrossings.insert(myNetCrossings.end(), junction.second->getGNECrossings().begin(), junction.second->getGNECrossings().end());
1787 std::vector<GNECrossing*> myInvalidCrossings;
1788 for (
auto i = myNetCrossings.begin(); i != myNetCrossings.end(); i++) {
1789 if (!(*i)->getNBCrossing()->valid) {
1790 myInvalidCrossings.push_back(*i);
1794 if (myInvalidCrossings.empty()) {
1797 TL(
"Clear crossings"),
1798 TL(
"There are no invalid crossings to remove."));
1800 std::string plural = myInvalidCrossings.size() == 1 ? (
"") : (
"s");
1804 TL(
"Crossings will be cleared. Continue?"));
1808 for (
const auto& crossing : myInvalidCrossings) {
1823 std::vector<GNEJunction*> toRemove;
1825 if (junction.second->getNBNode()->getEdges().size() == 0) {
1826 toRemove.push_back(junction.second);
1829 for (
auto junction : toRemove) {
1839 std::vector<GNEDemandElement*> routesWithoutChildren;
1843 if (route.second->getChildDemandElements().empty()) {
1844 routesWithoutChildren.push_back(route.second);
1848 if (routesWithoutChildren.size() > 0) {
1852 for (
const auto& i : routesWithoutChildren) {
1865 std::set<std::pair<std::string, GNEDemandElement*> > mySortedRoutes;
1869 bool hasStops =
false;
1870 for (
const auto& stop : route.second->getChildDemandElements()) {
1871 if (stop->getTagProperty()->isVehicleStop()) {
1880 std::vector<std::vector<GNEDemandElement*> > routesToMerge;
1881 auto index = mySortedRoutes.begin();
1883 for (
auto i = mySortedRoutes.begin(); i != mySortedRoutes.end(); i++) {
1884 if (routesToMerge.empty()) {
1885 routesToMerge.push_back({i->second});
1887 if (index->first == i->first) {
1888 routesToMerge.back().push_back(i->second);
1890 routesToMerge.push_back({i->second});
1896 bool thereIsRoutesToMerge =
false;
1897 for (
const auto& i : routesToMerge) {
1899 thereIsRoutesToMerge =
true;
1903 if (thereIsRoutesToMerge) {
1907 for (
const auto& routes : routesToMerge) {
1908 if (routes.size() > 1) {
1910 for (
int i = 1; i < (int)routes.size(); i++) {
1912 while (routes.at(i)->getChildDemandElements().size() > 0) {
1913 routes.at(i)->getChildDemandElements().front()->setAttribute(
SUMO_ATTR_ROUTE, routes.at(0)->getID(), undoList);
1929 std::map<GNEDemandElement*, std::string> personPlanMap;
1931 for (
const auto& persontag : {
1935 if (person.second->getChildDemandElements().size() > 0) {
1939 while (personPlan) {
1957 if (personPlanMap.size() > 0) {
1961 for (
const auto& personPlan : personPlanMap) {
1974 std::vector<GNEDemandElement*> invalidDemandElements;
1981 invalidDemandElements.push_back(route.second);
1987 invalidDemandElements.push_back(flow.second);
1993 invalidDemandElements.push_back(trip.second);
1997 if (invalidDemandElements.size() > 0) {
2001 for (
const auto& invalidDemandElement : invalidDemandElements) {
2014 undoList->
begin(junction,
TL(
"replace junction by geometry"));
2020 for (
auto edgePair : edgesToJoin) {
2026 for (
auto con : connections) {
2058 if (endpoints.size() < 2) {
2062 undoList->
begin(junction,
TL(
"split junction"));
2064 std::map<std::pair<std::string, GNEEdge*>, std::vector<NBEdge::Connection>> straightConnections;
2066 for (
const auto& c : e->getNBEdge()->getConnections()) {
2068 straightConnections[std::make_pair(e->getID(), e)].push_back(c);
2073 for (
const auto& pair : endpoints) {
2075 const std::string& origID = pair.second;
2077 std::string newID = origID !=
"" ? origID : newJunction->
getID();
2084 if (e->getNBEdge()->getGeometry().back().almostSame(pos) || e->getNBEdge()->getParameter(
"origTo") == newID) {
2091 if (e->getNBEdge()->getGeometry().front().almostSame(pos) || e->getNBEdge()->getParameter(
"origFrom") == newID) {
2096 if (newID != newJunction->
getID()) {
2106 for (
const auto& item : straightConnections) {
2107 GNEEdge* in = item.first.second;
2108 std::map<std::pair<std::string, NBEdge*>,
GNEEdge*> newEdges;
2109 for (
auto& c : item.second) {
2115 if (newEdges.count(std::make_pair(c.toEdge->getID(), c.toEdge)) == 0) {
2118 newEdges[std::make_pair(c.toEdge->getID(), c.toEdge)] = newEdge;
2122 newEdge = newEdges[std::make_pair(c.toEdge->getID(), c.toEdge)];
2145 for (
auto i : connections) {
2154 undoList->
begin(junction,
TL(
"reset junction connections"));
2168 while (additionalMap.second.size() > 0) {
2182 while (demandElementsMap.second.size() > 0) {
2189 for (
const auto& type : types) {
2214 while (meanDataMap.second.size() > 0) {
2258 std::vector<GNEAdditional*> invalidAdditionals;
2261 for (
const auto& addditional : additionalPair.second) {
2263 if (!addditional.second->isAdditionalValid()) {
2264 invalidAdditionals.push_back(addditional.second);
2269 if (invalidAdditionals.size() > 0) {
2281 if ((bucket->getNumElements() > 0) || (bucket->isDefaultBucket() && (bucket->getFilename().size() > 0))) {
2322 std::vector<GNEDemandElement*> invalidSingleLaneDemandElements;
2325 for (
const auto& demandElement : demandElementSet.second) {
2327 demandElement.second->computePathElement();
2330 invalidSingleLaneDemandElements.push_back(demandElement.second);
2335 if (invalidSingleLaneDemandElements.size() > 0) {
2347 if ((bucket->getNumElements() > 0) || (bucket->isDefaultBucket() && (bucket->getFilename().size() > 0))) {
2375 if ((bucket->getNumElements() > 0) || (bucket->isDefaultBucket() && (bucket->getFilename().size() > 0))) {
2381 if (dataSet.second->getFileBucket() == bucket) {
2382 dataSet.second->writeDataSet(device);
2399 double minimumBegin = 0;
2406 if (interval.second->getAttributeDouble(
SUMO_ATTR_BEGIN) < minimumBegin) {
2410 return minimumBegin;
2416 double maximumEnd = 0;
2423 if (interval.second->getAttributeDouble(
SUMO_ATTR_END) > maximumEnd) {
2424 maximumEnd = interval.second->getAttributeDouble(
SUMO_ATTR_END);
2438 if ((bucket->getNumElements() > 0) || (bucket->isDefaultBucket() && (bucket->getFilename().size() > 0))) {
2506 std::map<double, std::map<std::pair<SumoXMLTag, std::string>,
GNEDemandElement*> > vehiclesSortedByDepart;
2508 for (
const auto& demandElement : demandElementTag.second) {
2509 if ((demandElement.second->getFileBucket() == fileBucket) &&
2510 (demandElement.second->getTagProperty()->isVehicle() || demandElement.second->getTagProperty()->isPerson() || demandElement.second->getTagProperty()->isContainer())) {
2511 vehiclesSortedByDepart[demandElement.second->getAttributeDouble(
SUMO_ATTR_DEPART)][std::make_pair(demandElement.second->getTagProperty()->getTag(), demandElement.second->getID())] = demandElement.second;
2516 if (vehiclesSortedByDepart.size() > 0) {
2517 device << (
" <!-- Vehicles, persons and containers (sorted by depart) -->\n");
2518 for (
const auto& vehicleTag : vehiclesSortedByDepart) {
2519 for (
const auto& vehicle : vehicleTag.second) {
2520 vehicle.second->writeDemandElement(device);
2541 std::map<std::string, std::vector<GNEAdditional*> > sortedAdditionals;
2542 for (
const auto& tag : tags) {
2544 if ((fileBucket ==
nullptr) || (additional.second->getFileBucket() == fileBucket)) {
2545 if ((tag ==
SUMO_TAG_VAPORIZER) || (sortedAdditionals.count(additional.second->getID()) == 0)) {
2546 sortedAdditionals[additional.second->getID()].push_back(additional.second);
2553 for (
const auto& additionalVector : sortedAdditionals) {
2554 for (
const auto& additional : additionalVector.second) {
2555 additional->writeAdditional(device);
2563 std::map<std::string, GNEDemandElement*> sortedDemandElements;
2565 if (demandElement.second->getFileBucket() == fileBucket) {
2566 sortedDemandElements[demandElement.second->getID()] = demandElement.second;
2569 for (
const auto& demandElement : sortedDemandElements) {
2570 demandElement.second->writeDemandElement(device);
2577 std::map<std::string, GNEDemandElement*> sortedElements;
2580 if (routeDistribution.second->getFileBucket() == fileBucket) {
2581 sortedElements[routeDistribution.second->getID()] = routeDistribution.second;
2584 for (
const auto& element : sortedElements) {
2585 element.second->writeDemandElement(device);
2592 std::map<std::string, GNEDemandElement*> sortedRoutes;
2594 if (route.second->getFileBucket() == fileBucket) {
2595 sortedRoutes[route.second->getID()] = route.second;
2598 for (
const auto& route : sortedRoutes) {
2599 route.second->writeDemandElement(device);
2606 std::map<std::string, GNEDemandElement*> sortedElements;
2609 if (vTypeDistribution.second->getFileBucket() == fileBucket) {
2610 sortedElements[vTypeDistribution.second->getID()] = vTypeDistribution.second;
2613 for (
const auto& element : sortedElements) {
2614 element.second->writeDemandElement(device);
2621 std::map<std::string, GNEDemandElement*> sortedVTypes;
2623 if (vType.second->getFileBucket() == fileBucket) {
2624 sortedVTypes[vType.second->getID()] = vType.second;
2627 for (
const auto& vType : sortedVTypes) {
2628 vType.second->writeDemandElement(device);
2635 std::map<std::string, GNEMeanData*> sortedMeanDatas;
2637 if (meanData.second->getFileBucket() == fileBucket) {
2638 if (sortedMeanDatas.count(meanData.second->getID()) == 0) {
2639 sortedMeanDatas[meanData.second->getID()] = meanData.second;
2645 for (
const auto& additional : sortedMeanDatas) {
2646 additional.second->writeMeanData(device);
2655 const bool defaultVType = GNEAttributeCarrier::parse<bool>(vType.second->getAttribute(
GNE_ATTR_DEFAULT_VTYPE));
2658 if ((vType.second->getParentDemandElements().size() == 0) && (!defaultVType || (defaultVType && defaultVTypeModified))) {
2659 if (vType.second->getFileBucket() == fileBucket) {
2660 device << (
" <!-- VTypes -->\n");
2672 if (route.second->getFileBucket() == fileBucket) {
2673 device << (
" <!-- Routes -->\n");
2684 if (routeProbe.second->getFileBucket() == fileBucket) {
2685 device << (
" <!-- Rerouter -->\n");
2696 if (routeProbe.second->getFileBucket() == fileBucket) {
2697 device << (
" <!-- VariableSpeedSigns -->\n");
2708 if (routeProbe.second->getFileBucket() == fileBucket) {
2709 device << (
" <!-- RouteProbes -->\n");
2720 if (routeProbe.second->getFileBucket() == fileBucket) {
2721 device << (
" <!-- Vaporizers -->\n");
2732 for (
const auto& additional : additionalTag.second) {
2733 if (additional.second->getTagProperty()->isCalibrator() &&
2734 (additional.second->getFileBucket() == fileBucket)) {
2735 device << (
" <!-- Calibrators -->\n");
2747 for (
const auto& additional : additionalTag.second) {
2748 if (additional.second->getTagProperty()->isStoppingPlace() &&
2749 (additional.second->getFileBucket() == fileBucket)) {
2750 device << (
" <!-- StoppingPlaces -->\n");
2762 for (
const auto& additional : additionalTag.second) {
2763 if (additional.second->getTagProperty()->isDetector() &&
2764 (additional.second->getFileBucket() == fileBucket)) {
2765 device << (
" <!-- Detectors -->\n");
2777 for (
const auto& additional : additionalTag.second) {
2778 if (additional.second->getTagProperty()->isShapeElement() &&
2779 (additional.second->getFileBucket() == fileBucket) &&
2780 !additional.second->getTagProperty()->isJuPedSimElement()) {
2781 device << (
" <!-- Shapes -->\n");
2793 for (
const auto& additional : additionalTag.second) {
2794 if (additional.second->getTagProperty()->isJuPedSimElement() &&
2795 ((fileBucket ==
nullptr) || (additional.second->getFileBucket() == fileBucket))) {
2796 device << (
" <!-- JuPedSim elements -->\n");
2808 if (
TAZ.second->getFileBucket() == fileBucket) {
2809 device << (
" <!-- TAZs -->\n");
2820 for (
const auto& additional : additionalTag.second) {
2821 if (additional.second->getTagProperty()->isWireElement() &&
2822 (additional.second->getFileBucket() == fileBucket)) {
2823 device << (
" <!-- Wires -->\n");
2835 if (meanDataEdge.second->getFileBucket() == fileBucket) {
2836 device << (
" <!-- MeanDataEdges -->\n");
2847 if (meanDataLane.second->getFileBucket() == fileBucket) {
2848 device << (
" <!-- MeanDataLanes -->\n");
2860 device.
openTag(
"additionals");
2882 for (
int i = 0; i < (int)edgeType.second->getLaneTypes().size(); i++) {
2884 edgeType.second->getLaneTypes().at(i)->speed,
2885 edgeType.second->getLaneTypes().at(i)->permissions,
2886 edgeType.second->getLaneTypes().at(i)->width,
2887 edgeType.second->getLaneTypes().at(i)->attrs);
2926 dataInterval.second->updateGenericDataIDs();
2927 dataInterval.second->updateAttributeColors();
2982 throw ProcessError(
TL(
"Network size exceeds 1 Lightyear. Please reconsider your inputs.") + std::string(
"\n"));
2991 for (
const auto& lane : edge.second->getChildLanes()) {
2992 lane->updateGeometry();
3004 edge.second->remakeGNEConnections();
3006 for (
const auto& connection : edge.second->getGNEConnections()) {
3007 connection->updateGeometry();
3016 std::set<std::string> liveExplicitTurnarounds;
3019 liveExplicitTurnarounds.insert(explicitTurnarounds);
3033 if (neteditOptions.
getBool(
"numerical-ids") || neteditOptions.
isSet(
"reserved-ids")) {
3037 if (!neteditOptions.
getBool(
"offset.disable-normalization")) {
3040 edge.second->updateGeometry();
3057 if (volatileOptions) {
3085 junction.second->updateCenteringBoundary(
false);
3092 edge.second->updateCenteringBoundary(
false);
3098 edge.second->remakeGNEConnections(
true);
3103 junction.second->setLogicValid(
true,
nullptr);
3105 junction.second->updateGeometryAfterNetbuild();
3107 junction.second->rebuildGNEWalkingAreas();
3112 edge.second->updateGeometry();
3123 std::vector<std::string> values = GNEAttributeCarrier::parse<std::vector<std::string> >(ac->
getAttribute(key));
3124 std::vector<std::string> newValues;
3125 bool lastBy =
false;
3126 for (
auto v : values) {
3127 if (v == which && !lastBy) {
3129 newValues.push_back(by);
3131 newValues.push_back(v);
@ MID_COPY_VIEW_GEOBOUNDARY
Copy view geo-coordinate boundary - popup entry.
@ GLO_NETWORK
The network - empty.
#define WRITE_WARNINGF(...)
#define WRITE_MESSAGE(msg)
std::set< NBEdge * > EdgeSet
container for unique edges
std::vector< NBEdge * > EdgeVector
container for (sorted) edges
const std::string & getVehicleClassNames(SVCPermissions permissions, bool expand)
Returns the ids of the given classes, divided using a ' '.
long long int SVCPermissions
bitset where each bit declares whether a certain SVC may use this edge/lane
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types.
@ SVC_IGNORING
vehicles ignoring classes
@ SVC_BICYCLE
vehicle is a bicycle
@ SVC_BUS
vehicle is a bus
@ SVC_PEDESTRIAN
pedestrian
SumoXMLTag
Numbers representing SUMO-XML - element names.
@ SUMO_TAG_TRACTION_SUBSTATION
A traction substation.
@ SUMO_TAG_REROUTER
A rerouter.
@ GNE_TAG_MULTI_LANE_AREA_DETECTOR
an e2 detector over multiple lanes (placed here due create Additional Frame)
@ SUMO_TAG_ROUTEPROBE
a routeprobe detector
@ SUMO_TAG_TAZ
a traffic assignment zone
@ SUMO_TAG_CHARGING_STATION
A Charging Station.
@ SUMO_TAG_VTYPE
description of a vehicle/person/container type
@ SUMO_TAG_CONTAINER_STOP
A container stop.
@ SUMO_TAG_BUS_STOP
A bus stop.
@ SUMO_TAG_POI
begin/end of the description of a Point of interest
@ SUMO_TAG_MEANDATA_LANE
a lane based mean data detector
@ SUMO_TAG_ROUTE_DISTRIBUTION
distribution of a route
@ SUMO_TAG_OVERHEAD_WIRE_CLAMP
An overhead wire clamp (connection of wires in opposite directions)
@ GNE_TAG_POIGEO
Point of interest over view with GEO attributes.
@ SUMO_TAG_FLOW
a flow definition using from and to edges or a route
@ SUMO_TAG_CONNECTION
connectioon between two lanes
@ SUMO_TAG_PARKING_AREA
A parking area.
@ GNE_TAG_CALIBRATOR_LANE
A calibrator placed over lane.
@ SUMO_TAG_TYPES
types (edge)
@ SUMO_TAG_JUNCTION
begin/end of the description of a junction
@ SUMO_TAG_CROSSING
crossing between edges for pedestrians
@ SUMO_TAG_ROUTE
description of a route
@ SUMO_TAG_MEANDATA_EDGE
an edge based mean data detector
@ SUMO_TAG_POLY
begin/end of the description of a polygon
@ SUMO_TAG_OVERHEAD_WIRE_SECTION
An overhead wire section.
@ SUMO_TAG_TRAIN_STOP
A train stop (alias for bus stop)
@ SUMO_TAG_VTYPE_DISTRIBUTION
distribution of a vehicle type
@ SUMO_TAG_LANE
begin/end of the description of a single lane
@ SUMO_TAG_INSTANT_INDUCTION_LOOP
An instantenous induction loop.
@ GNE_TAG_POILANE
Point of interest over Lane.
@ GNE_TAG_JPS_OBSTACLE
polygon used for draw juPedSim obstacles
@ SUMO_TAG_VAPORIZER
vaporizer of vehicles
@ SUMO_TAG_LANE_AREA_DETECTOR
alternative tag for e2 detector
@ GNE_TAG_ROUTE_EMBEDDED
embedded route
@ SUMO_TAG_INDUCTION_LOOP
alternative tag for e1 detector
@ GNE_TAG_JPS_WALKABLEAREA
polygon used for draw juPedSim walkable areas
@ SUMO_TAG_CALIBRATOR
A calibrator placed over edge.
@ SUMO_TAG_ENTRY_EXIT_DETECTOR
alternative tag for e3 detector
@ SUMO_TAG_VSS
A variable speed sign.
@ GNE_TAG_STOPPERSON_EDGE
@ SUMO_TAG_TRIP
a single trip definition (used by router)
@ SUMO_TAG_EDGE
begin/end of the description of an edge
LaneSpreadFunction
Numbers representing special SUMO-XML-attribute values Information how the edge's lateral offset shal...
@ STRAIGHT
The link is a straight direction.
SumoXMLNodeType
Numbers representing special SUMO-XML-attribute values for representing node- (junction-) types used ...
SumoXMLAttr
Numbers representing SUMO-XML - attributes.
@ GNE_ATTR_OPPOSITE
to busStop (used by personPlans)
@ GNE_ATTR_SELECTED
element is selected
@ SUMO_ATTR_BEGIN
weights: time range begin
@ SUMO_ATTR_EDGES
the edges of a route
@ GNE_ATTR_DEFAULT_VTYPE
Flag to check if VType is a default VType.
@ GNE_ATTR_MODIFICATION_STATUS
whether a feature has been loaded,guessed,modified or approved
@ SUMO_ATTR_SHAPE
edge: the shape in xml-definition
@ SUMO_ATTR_TLTYPE
node: the type of traffic light
@ GNE_ATTR_SHAPE_END
last coordinate of edge shape
@ SUMO_ATTR_END
weights: time range end
@ GNE_ATTR_DEFAULT_VTYPE_MODIFIED
Flag to check if a default VType was modified.
@ GNE_ATTR_SHAPE_START
first coordinate of edge shape
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
A class that stores a 2D geometrical boundary.
void add(double x, double y, double z=0)
Makes the boundary include the given coordinate.
bool isInitialised() const
check if Boundary is Initialised
double ymin() const
Returns minimum y-coordinate.
void reset()
Resets the boundary.
double getHeight() const
Returns the height of the boundary (y-axis)
double getWidth() const
Returns the width of the boudary (x-axis)
static void drawBoundary(const GUIVisualizationSettings &s, const Boundary &b)
Draw a boundary (used for debugging)
std::string getDefaultFilename(const FileBucket::Type type) const
functions related with filenames
const std::vector< FileBucket * > & getFileBuckets(const FileBucket::Type type) const
get vector with all fileBuckets related with the given file type
OptionsCont & getSumoOptions()
get SUMO options container
void setStatusBarText(const std::string &statusBarText)
set text of the statusBar
GNEUndoList * getUndoList()
get pointer to undoList
GNEViewNet * getViewNet()
get pointer to viewNet
GNEApplicationWindowHelper::FileBucketHandler * getFileBucketHandler() const
get file bucket handler
const GNETagPropertiesDatabase * getTagPropertiesDatabase() const
get tag properties database
bool isUndoRedoAllowed() const
bool isAttributeCarrierSelected() const
check if attribute carrier is selected
void setInGrid(bool value)
mark if this AC was inserted in grid or not
static const std::string FALSE_STR
true value in string format(used for comparing boolean values in getAttribute(...))
const std::string getID() const override
get ID (all Attribute Carriers have one)
const std::string & getTagStr() const
get tag assigned to this object in string format
static const std::string FEATURE_GUESSED
feature has been reguessed (may still be unchanged be we can't tell (yet)
const GNETagProperties * getTagProperty() const
get tagProperty associated with this Attribute Carrier
bool inGrid() const
check if this AC was inserted in grid
static std::string parseIDs(const std::vector< T > &ACs)
parses a list of specific Attribute Carriers into a string of IDs
virtual void setAttribute(SumoXMLAttr key, const std::string &value, GNEUndoList *undoList)=0
virtual std::string getAttribute(SumoXMLAttr key) const =0
virtual GUIGlObject * getGUIGlObject()=0
get GUIGlObject associated with this AttributeCarrier
static void changeAttribute(GNEAttributeCarrier *AC, SumoXMLAttr key, const std::string &value, GNEUndoList *undoList, const bool force=false)
change attribute
static void registerJoin(const std::set< NBNode *, ComparatorIdLess > &cluster, NBNodeCont &nc, GNEUndoList *undoList)
change attribute
the function-object for an editing operation (abstract base)
NBConnection getNBConnection() const
get NBConnection
GNEEdge * getEdgeFrom() const
get the name of the edge the vehicles leave
NBEdge::Connection & getNBEdgeConnection() const
get Edge::Connection
NBNode::Crossing * getNBCrossing() const
get referente to NBode::Crossing
GNEDataSet * getDataSetParent() const
Returns a pointer to GNEDataSet parent.
const std::vector< GNEGenericData * > & getGenericDataChildren() const
get generic data children
const std::map< const double, GNEDataInterval * > & getDataIntervalChildren() const
get data interval children
GNEDemandElement * getNextChildDemandElement(const GNEDemandElement *demandElement) const
get next child demand element to the given demand element
GNEDemandElement * getPreviousChildDemandElement(const GNEDemandElement *demandElement) const
get previous child demand element to the given demand element
Result getResult() const
get result to indicate if this dialog was closed accepting or rejecting changes
void setAttribute(SumoXMLAttr key, const std::string &value, GNEUndoList *undoList) override
NBEdge * getNBEdge() const
returns the internal NBEdge
GNEEdge * getReverseEdge() const
get reverse edge (if exist)
std::vector< GNEEdge * > getOppositeEdges() const
get opposite edges
GNEJunction * getFromJunction() const
get from Junction (only used to increase readability)
bool wasSplit()
whether this edge was created from a split
void copyTemplate(const GNEEdgeTemplate *edgeTemplate, GNEUndoList *undoList)
copy edge attributes from edgetemplate
const std::vector< GNEConnection * > & getGNEConnections() const
returns a reference to the GNEConnection vector
GNEJunction * getToJunction() const
get from Junction (only used to increase readability)
std::string getAttribute(SumoXMLAttr key) const override
GNEDataInterval * getDataIntervalParent() const
get data interval parent
const GNEHierarchicalContainerChildren< GNEEdge * > & getChildEdges() const
get child edges
const GNEHierarchicalContainerParents< GNEAdditional * > & getParentAdditionals() const
get parent additionals
const GNEHierarchicalContainerChildren< GNEGenericData * > & getChildGenericDatas() const
return child generic data elements
const GNEHierarchicalContainerChildren< GNELane * > & getChildLanes() const
get child lanes
const GNEHierarchicalContainerChildren< GNEAdditional * > & getChildAdditionals() const
return child additionals
const GNEHierarchicalContainerChildrenSet< GNETAZSourceSink * > & getChildTAZSourceSinks() const
return child TAZSourceSinks (Set)
void addChildElement(ChildType *element)
add child without updating parent (ONLY used if we're creating elements without undo-redo)
const GNEHierarchicalContainerParents< GNEJunction * > & getParentJunctions() const
get parent junctions
const GNEHierarchicalContainerChildren< GNEDemandElement * > & getChildDemandElements() const
return child demand elements
void clearInspection()
clear inspection
const std::vector< GNEEdge * > & getGNEIncomingEdges() const
Returns incoming GNEEdges.
const std::vector< GNECrossing * > & getGNECrossings() const
Returns GNECrossings.
void replaceIncomingConnections(GNEEdge *which, GNEEdge *by, GNEUndoList *undoList)
replace one edge by another in all tls connections
void markAsModified(GNEUndoList *undoList)
prevent re-guessing connections at this junction
void invalidateTLS(GNEUndoList *undoList, const NBConnection &deletedConnection=NBConnection::InvalidConnection, const NBConnection &addedConnection=NBConnection::InvalidConnection)
std::vector< GNEConnection * > getGNEConnections() const
Returns all GNEConnections vinculated with this junction.
void setAttribute(SumoXMLAttr key, const std::string &value, GNEUndoList *undoList) override
Position getPositionInView() const
Returns position of hierarchical element in view.
bool isValid(SumoXMLAttr key, const std::string &value) override
void removeConnectionsFrom(GNEEdge *edge, GNEUndoList *undoList, bool updateTLS, int lane=-1)
remove all connections from the given edge
const std::vector< GNEEdge * > & getGNEOutgoingEdges() const
Returns incoming GNEEdges.
void removeEdgeFromCrossings(GNEEdge *edge, GNEUndoList *undoList)
removes the given edge from all pedestrian crossings
NBNode * getNBNode() const
Return net build node.
std::vector< GNEJunction * > getJunctionNeighbours() const
return GNEJunction neighbours
void setLogicValid(bool valid, GNEUndoList *undoList, const std::string &status=FEATURE_GUESSED)
void removeConnectionsTo(GNEEdge *edge, GNEUndoList *undoList, bool updateTLS, int lane=-1)
remove all connections to the given edge
int getIndex() const
returns the index of the lane
std::vector< GNEConnection * > getGNEOutcomingConnections()
returns a vector with the outgoing GNEConnections of this lane
void setAttribute(SumoXMLAttr key, const std::string &value, GNEUndoList *undoList) override
GNEEdge * getParentEdge() const
get parent edge
void buildTemplates()
build templates
struct used for saving all attribute carriers of net, in different formats
std::vector< GNEEdge * > retrieveEdges(GNEJunction *from, GNEJunction *to) const
get all edges by from and to GNEJunction
const std::unordered_map< SumoXMLTag, std::unordered_map< const GUIGlObject *, GNEDemandElement * >, std::hash< int > > & getDemandElements() const
get demand elements
GNEEdgeType * registerEdgeType(GNEEdgeType *edgeType)
registers a edge in containers
GNELane * retrieveLane(const std::string &id, bool hardFail=true, bool checkVolatileChange=false) const
get lane by id
void clearDemandElements()
clear demand elements
GNEEdge * registerEdge(GNEEdge *edge)
registers an edge with containers
const std::unordered_map< SumoXMLTag, std::unordered_map< const GUIGlObject *, GNEGenericData * >, std::hash< int > > & getGenericDatas() const
get all generic datas
GNECrossing * retrieveCrossing(const GUIGlObject *glObject, bool hardFail=true) const
get Crossing by AC
void remapJunctionAndEdgeIds()
remap junction and edge IDs
std::string generateEdgeID() const
generate edge ID
void clearAdditionals()
clear additionals
const std::unordered_map< SumoXMLTag, std::map< const std::string, GNEMeanData * >, std::hash< int > > & getMeanDatas() const
get meanDatas
GNEJunction * registerJunction(GNEJunction *junction, bool afterVolatile)
registers a junction in containers
GNEJunction * retrieveJunction(const std::string &id, bool hardFail=true) const
get junction by id
const std::map< const std::string, GNEDataSet * > & getDataSets() const
get demand elements
const std::map< std::string, GNEEdge * > & getEdges() const
map with the ID and pointer to edges of net
void addDefaultVTypes()
add default VTypes
std::vector< GNEJunction * > getSelectedJunctions() const
return selected junctions
GNEEdge * retrieveEdge(const std::string &id, bool hardFail=true) const
get edge by id
const std::unordered_map< const GNEAttributeCarrier *, GNEDataInterval * > & getDataIntervals() const
get all data intervals of network
void clearEdges()
clear edges
const std::map< std::string, GNEJunction * > & getJunctions() const
get junctions
const std::map< std::string, GNEEdgeType * > & getEdgeTypes() const
map with the ID and pointer to edgeTypes of net
void clearJunctions()
clear junctions
const std::unordered_map< SumoXMLTag, std::unordered_map< const GUIGlObject *, GNEAdditional * >, std::hash< int > > & getAdditionals() const
get additionals
GNEConnection * retrieveConnection(const std::string &id, bool hardFail=true) const
get Connection by id
class for GNEChange_ReplaceEdgeInTLS
void dataElementsSaved()
mark demand elements as saved
void requireSaveNetwork()
inform that network has to be saved
void demandElementsSaved()
mark demand elements as saved
void additionalsSaved()
mark additionals as saved
void TLSSaved()
mark TLS as saved
void meanDatasSaved()
mark mean data elements as saved
void networkSaved()
mark network as saved
void clearAdditionalElements(GNEUndoList *undoList)
clear additionals
void removeSolitaryJunctions(GNEUndoList *undoList)
removes junctions that have no edges
GNEPathManager * myDataPathManager
Data path manager.
void deleteEdge(GNEEdge *edge, GNEUndoList *undoList, bool recomputeConnections)
removes edge
void writeAdditionalByType(OutputDevice &device, const FileBucket *fileBucket, const std::vector< SumoXMLTag > tags) const
write additional element by type and sorted by ID
bool joinSelectedJunctions(GNEUndoList *undoList)
join selected junctions
bool writeJuPedSimComment(OutputDevice &device, const FileBucket *fileBucket) const
write JuPedSim comment
double getDataSetIntervalMaximumEnd() const
get maximum interval
void deleteLane(GNELane *lane, GNEUndoList *undoList, bool recomputeConnections)
removes lane
static const double Z_INITIALIZED
marker for whether the z-boundary is initialized
void deleteCrossing(GNECrossing *crossing, GNEUndoList *undoList)
remove crossing
SUMORTree & getGrid()
Returns the RTree used for visualisation speed-up.
bool writeRouteProbeComment(OutputDevice &device, const FileBucket *fileBucket) const
write routeProbe comment
void deleteAdditional(GNEAdditional *additional, GNEUndoList *undoList)
remove additional
bool saveMeanDatas()
save meanData elements of the network
void disableUpdateGeometry()
disable update geometry of elements after inserting or removing an element in net
void saveTLSPrograms(const std::string &filename)
save TLS Programs elements of the network
void computeAndUpdate(OptionsCont &neteditOptions, bool volatileOptions)
recompute the network and update lane geometries
NBNetBuilder * getNetBuilder() const
get net builder
void writeVTypeDistributions(OutputDevice &device, const FileBucket *fileBucket) const
write vTypeDistributions sorted by ID
void addGLObjectIntoGrid(GNEAttributeCarrier *AC)
add GL Object into net
GNEPathManager * getDataPathManager()
get data path manager
void reverseEdge(GNEEdge *edge, GNEUndoList *undoList)
reverse edge
bool writeTAZComment(OutputDevice &device, const FileBucket *fileBucket) const
write TAZ comment
void requireRecompute(const bool requireSaving=true)
inform the net about the need for recomputation
void removeGLObjectFromGrid(GNEAttributeCarrier *AC)
add GL Object into net
void saveJoined(const std::string &filename)
save log of joined junctions (and nothing else)
NBTrafficLightLogicCont & getTLLogicCont()
returns the tllcont of the underlying netbuilder
bool restrictLane(SUMOVehicleClass vclass, GNELane *lane, GNEUndoList *undoList)
transform lane to restricted lane
GNENetHelper::SavingStatus * getSavingStatus() const
get saving status
void mergeJunctions(GNEJunction *moved, const GNEJunction *target, GNEUndoList *undoList)
merge the given junctions edges between the given junctions will be deleted
void writeAdditionalFileElements(OutputDevice &device, const FileBucket *fileBucket)
write additionals demand elements and meanData in output device
bool myNeedRecompute
whether the net needs recomputation
void deleteDemandElement(GNEDemandElement *demandElement, GNEUndoList *undoList)
remove demand element
void duplicateLane(GNELane *lane, GNEUndoList *undoList, bool recomputeConnections)
duplicates lane
const Boundary & getZBoundary() const
Returns the Z boundary (stored in the x() coordinate) values of 0 do not affect the boundary.
const Boundary & getBoundary() const
returns the bounder of the network
void saveEdgeTypes(const std::string &filename)
save edgeTypes elements of the network
void deleteNetworkElement(GNENetworkElement *networkElement, GNEUndoList *undoList)
delete network element
void writeMeanDatas(OutputDevice &device, const FileBucket *fileBucket, SumoXMLTag tag) const
write meanData element by type and sorted by ID
bool writeStoppingPlaceComment(OutputDevice &device, const FileBucket *fileBucket) const
write stoppingPlace comment
SUMORTree myGrid
the rtree which contains all GUIGlObjects (so named for historical reasons)
void clearDataElements(GNEUndoList *undoList)
clear data elements
void deleteDataInterval(GNEDataInterval *dataInterval, GNEUndoList *undoList)
remove data interval
bool saveDataElements()
save data set elements of the network
void deleteConnection(GNEConnection *connection, GNEUndoList *undoList)
remove connection
void clearDemandElements(GNEUndoList *undoList)
clear demand elements
GNEPathManager * getDemandPathManager()
get demand path manager
void adjustPersonPlans(GNEUndoList *undoList)
adjust person plans
GNENetHelper::ACTemplate * getACTemplates() const
get all attribute carriers templates used in this net
void computeNetwork(GNEApplicationWindow *window, bool force=false, bool volatileOptions=false)
trigger full netbuild computation param[in] window The window to inform about delay param[in] force W...
void cleanInvalidDemandElements(GNEUndoList *undoList)
clean invalid demand elements
bool myUpdateDataEnabled
Flag to enable or disable update data elements after inserting or removing element in net.
void cleanUnusedRoutes(GNEUndoList *undoList)
clean unused routes
NBNetBuilder * myNetBuilder
The internal netbuilder.
void removeExplicitTurnaround(std::string id)
remove edge id from the list of explicit turnarounds
bool writeCalibratorComment(OutputDevice &device, const FileBucket *fileBucket) const
write calibrator comment
void computeJunction(GNEJunction *junction)
trigger recomputation of junction shape and logic param[in] window The window to inform about delay
void resetJunctionConnections(GNEJunction *junction, GNEUndoList *undoList)
reset junction's connections
bool writeRouteComment(OutputDevice &device, const FileBucket *fileBucket) const
write route comment
void deleteMeanData(GNEMeanData *meanData, GNEUndoList *undoList)
remove generic data
void replaceIncomingEdge(GNEEdge *which, GNEEdge *by, GNEUndoList *undoList)
replaces edge
void deleteGenericData(GNEGenericData *genericData, GNEUndoList *undoList)
remove generic data
std::pair< GNEJunction *, GNEEdge * > splitEdge(GNEEdge *edge, const Position &pos, GNEUndoList *undoList, GNEJunction *newJunction=0)
split edge at position by inserting a new junction
Boundary getCenteringBoundary() const override
Returns the boundary to which the view shall be centered in order to show the object.
bool writeShapesComment(OutputDevice &device, const FileBucket *fileBucket) const
write shape comment
bool writeMeanDataEdgeComment(OutputDevice &device, const FileBucket *fileBucket) const
write meanDataEdge comment
GNENetHelper::AttributeCarriers * getAttributeCarriers() const
get all attribute carriers used in this net
void writeRoutes(OutputDevice &device, const FileBucket *fileBucket) const
write route sorted by ID
bool writeMeanDataLaneComment(OutputDevice &device, const FileBucket *fileBucket) const
write Wire comment
GNEEdge * addReversedEdge(GNEEdge *edge, const bool disconnected, GNEUndoList *undoList)
add reversed edge
GNEApplicationWindow * getGNEApplicationWindow() const
get tag properties database
void changeEdgeEndpoints(GNEEdge *edge, const std::string &newSourceID, const std::string &newDestID)
modifies endpoins of the given edge
bool myUpdateGeometryEnabled
Flag to enable or disable update geometry of elements after inserting or removing element in net.
void splitEdgesBidi(GNEEdge *edge, GNEEdge *oppositeEdge, const Position &pos, GNEUndoList *undoList)
split all edges at position by inserting one new junction
GNENetHelper::SavingStatus * mySavingStatus
saving status module
void clearMeanDataElements(GNEUndoList *undoList)
clear meanDatas
unsigned int myEdgeIDCounter
void expandBoundary(const Boundary &newBoundary)
expand boundary
void writeVTypes(OutputDevice &device, const FileBucket *fileBucket) const
write vTypes sorted by ID
void disableUpdateData()
disable update data elements after inserting or removing an element in net
bool writeRerouterComment(OutputDevice &device, const FileBucket *fileBucket) const
write rerouter comment
bool removeRestrictedLane(SUMOVehicleClass vclass, GNEEdge *edge, GNEUndoList *undoList)
remove restricted lane
void deleteTAZSourceSink(GNETAZSourceSink *TAZSourceSink, GNEUndoList *undoList)
remove TAZSourceSink
GNEApplicationWindow * myApplicationWindow
pointer to application window
GNEEdge * createEdge(GNEJunction *src, GNEJunction *dest, GNEEdge *edgeTemplate, GNEUndoList *undoList, const std::string &suggestedName="", bool wasSplit=false, bool allowDuplicateGeom=false, bool recomputeConnections=true)
creates a new edge (unless an edge with the same geometry already exists)
std::set< std::string > myExplicitTurnarounds
list of edge ids for which turn-arounds must be added explicitly
bool saveAdditionals()
save additional elements
const std::map< std::string, int > & getEdgesAndNumberOfLanes() const
et edges and number of lanes
void writeRouteDistributions(OutputDevice &device, const FileBucket *fileBucket) const
write route distributions sorted by ID
void addZValueInBoundary(const double z)
add Z in net boundary
static const std::map< SumoXMLAttr, std::string > EMPTY_HEADER
variable used for write headers in additional, demand and data elements
bool isUpdateGeometryEnabled() const
check if update geometry after inserting or removing has to be updated
bool addRestrictedLane(SUMOVehicleClass vclass, GNEEdge *edge, int index, GNEUndoList *undoList)
add restricted lane to edge
void saveNetwork()
save the network
bool writeVTypeComment(OutputDevice &device, const FileBucket *fileBucket) const
write vType comment
bool saveJuPedSimElements(const std::string &filename)
save JuPedSim elements
bool checkJunctionPosition(const Position &pos)
return true if there are already a Junction in the given position, false in other case
bool addGreenVergeLane(GNEEdge *edge, int index, GNEUndoList *undoList)
add restricted lane to edge
const GNETagPropertiesDatabase * getTagPropertiesDatabase() const
get tag properties database (used for simplify code)
bool isNetRecomputed() const
check if net require recomputing
GNEPathManager * myNetworkPathManager
Network path manager.
bool isUpdateDataEnabled() const
check if update data after inserting or removing has to be updated
void deleteDataSet(GNEDataSet *dataSet, GNEUndoList *undoList)
remove data set
static void replaceInListAttribute(GNEAttributeCarrier *ac, SumoXMLAttr key, const std::string &which, const std::string &by, GNEUndoList *undoList)
replace in list attribute
bool writeWireComment(OutputDevice &device, const FileBucket *fileBucket) const
write Wire comment
void initJunctionsAndEdges(bool afterVolatile)
Init Junctions and edges.
bool cleanInvalidCrossings(GNEUndoList *undoList)
clear invalid crossings
GNEPathManager * getNetworkPathManager()
get network path manager
void splitJunction(GNEJunction *junction, bool reconnect, GNEUndoList *undoList)
replace the selected junction by a list of junctions for each unique edge endpoint
void selectRoundabout(GNEJunction *junction, GNEUndoList *undoList)
select all roundabout edges and junctions for the current roundabout
void joinRoutes(GNEUndoList *undoList)
join routes
void replaceJunctionByGeometry(GNEJunction *junction, GNEUndoList *undoList)
replace the selected junction by geometry node(s) and merge the edges
void createRoundabout(GNEJunction *junction, GNEUndoList *undoList)
transform the given junction into a roundabout
GNEViewParent * getViewParent() const
get view parent (used for simplify code)
GNEJunction * createJunction(const Position &pos, GNEUndoList *undoList)
creates a new junction
void savePlain(const std::string &prefix, const OptionsCont &netconvertOptions)
save plain xml representation of the network (and nothing else)
unsigned int myJunctionIDCounter
bool writeDetectorComment(OutputDevice &device, const FileBucket *fileBucket) const
write detector comment
std::map< std::string, int > myEdgesAndNumberOfLanes
map with the Edges and their number of lanes
bool writeVariableSpeedSignComment(OutputDevice &device, const FileBucket *fileBucket) const
write variable speed sign comment
GNEPathManager * myDemandPathManager
Demand path manager.
void addExplicitTurnaround(std::string id)
add edge id to the list of explicit turnarounds
void initGNEConnections()
initialize GNEConnections
void deleteJunction(GNEJunction *junction, GNEUndoList *undoList)
removes junction and all incident edges
NBEdgeCont & getEdgeCont()
returns the NBEdgeCont of the underlying netbuilder
GNENet()=delete
Invalidated default constructor.
unsigned int & getJunctionIDCounter()
bool saveDemandElements()
save demand element elements of the network
GNENetHelper::AttributeCarriers * myAttributeCarriers
attributeCarriers module
void computeDataElements(GNEApplicationWindow *window)
compute data elements param[in] window The window to inform about delay
GNENetHelper::ACTemplate * myACTemplates
attributeCarriers templates
GNEUndoList * getUndoList() const
get undo list(used for simplify code)
GUIParameterTableWindow * getParameterWindow(GUIMainWindow &app, GUISUMOAbstractView &parent) override
Returns an own parameter window.
void writeDemandByType(OutputDevice &device, const FileBucket *fileBucket, SumoXMLTag tag) const
write demand element by type and sorted by ID
void drawGL(const GUIVisualizationSettings &s) const override
Draws the object.
int getNumberOfTLSPrograms() const
get number of TLS Programs
GNEViewNet * getViewNet() const
get view net (used for simplify code)
bool writeVaporizerComment(OutputDevice &device, const FileBucket *fileBucket) const
write vaporizer comment
GUIGLObjectPopupMenu * getPopUpMenu(GUIMainWindow &app, GUISUMOAbstractView &parent) override
Returns an own popup-menu.
void enableUpdateGeometry()
void clearJunctionConnections(GNEJunction *junction, GNEUndoList *undoList)
clear junction's connections
Boundary myZBoundary
the z boundary (stored in the x-coordinate), values of 0 are ignored
double getDataSetIntervalMinimumBegin() const
get minimum interval
void computeDemandElements(GNEApplicationWindow *window)
compute demand elements param[in] window The window to inform about delay
unsigned int & getEdgeIDCounter()
GUIGlObject * getGUIGlObject() override
get GUIGlObject associated with this AttributeCarrier
void updatePathCalculator()
update DijkstraRouter (needed a good calculation of dijkstra path after modifying network)
bool isPathCalculatorUpdated() const
check if pathCalculator is updated
PathCalculator * getPathCalculator()
obtain instance of PathCalculator
void invalidateJunctionPath(const GNEJunction *junction)
invalidate junction path
void clearSegments()
clear segments
void invalidateLanePath(const GNELane *lane)
invalidate lane path
bool isPlacedInRTree() const
return true if Tag correspond to an element that has to be placed in RTREE
SumoXMLTag getTag() const
get Tag vinculated with this attribute Property
const std::vector< const GNEAttributeProperties * > & getAttributeProperties() const
get all attribute properties
bool hasAttribute(SumoXMLAttr attr) const
check if current TagProperties owns the attribute "attr"
void end()
End undo command sub-group. If the sub-group is still empty, it will be deleted; otherwise,...
void begin(GUIIcon icon, const std::string &description)
Begin undo command sub-group with current supermode. This begins a new group of commands that are tre...
void add(GNEChange *command, bool doit=false, bool merge=true)
Add new command, executing it if desired. The new command will be merged with the previous command if...
const GNEViewNetHelper::EditModes & getEditModes() const
get edit modes
GNEViewParent * getViewParent() const
get the net object
GNEUndoList * getUndoList() const
get the undoList object
A single child window which contains a view of the simulation area.
GNEInspectorFrame * getInspectorFrame() const
get frame for inspect elements
static FXMenuCommand * buildFXMenuCommand(FXComposite *p, const std::string &text, FXIcon *icon, FXObject *tgt, FXSelector sel, const bool disable=false)
build menu command
const std::string & getMicrosimID() const
Returns the id of the object as known to microsim.
void buildPositionCopyEntry(GUIGLObjectPopupMenu *ret, const GUIMainWindow &app, bool addSeparator=true) const
Builds an entry which allows to copy the cursor position if geo projection is used,...
void buildCenterPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to center to the object.
void buildPopupHeader(GUIGLObjectPopupMenu *ret, GUIMainWindow &app, bool addSeparator=true)
Builds the header.
void setNetObject(GUIGlObject *object)
Sets the given object as the "network" object.
static GUIGlObjectStorage gIDStorage
A single static instance of this class.
A window containing a gl-object's parameter.
void closeBuilding(const Parameterised *p=0)
Closes the building of the table.
void destroyPopup()
destroys the popup
Stores the information about how to visualize structures.
static const GeoConvHelper & getFinal()
the coordinate transformation for writing the location element and for tracking the original coordina...
const Boundary & getConvBoundary() const
Returns the converted boundary.
static double angleDiff(const double angle1, const double angle2)
Returns the difference of the second angle to the first angle in radiants.
Storage for edges, including some functionality operating on multiple edges.
const std::set< EdgeSet > getRoundabouts() const
Returns the determined roundabouts.
NBEdge * retrieve(const std::string &id, bool retrieveExtracted=false) const
Returns the edge that has the given id.
bool insert(NBEdge *edge, bool ignorePrunning=false)
Adds an edge to the dictionary.
std::vector< std::string > getAllNames() const
Returns all ids of known edges.
The representation of a single edge during network building.
SVCPermissions getPermissions(int lane=-1) const
get the union of allowed classes over all lanes or for a specific lane
const std::vector< Connection > & getConnections() const
Returns the connections.
double getLoadedLength() const
Returns the length was set explicitly or the computed length if it wasn't set.
void reinitNodes(NBNode *from, NBNode *to)
Resets nodes but keeps all other values the same (used when joining)
NBNode * getToNode() const
Returns the destination node of the edge.
static const double UNSPECIFIED_FRICTION
unspecified lane friction
Lane & getLaneStruct(int lane)
const PositionVector & getGeometry() const
Returns the geometry of the edge.
EdgeBuildingStep getStep() const
The building step of this edge.
bool hasLoadedLength() const
Returns whether a length was set explicitly.
@ LANES2LANES_RECHECK
Lanes to lanes - relationships are computed; should be rechecked.
int getNumLanes() const
Returns the number of lanes.
void resetNodeBorder(const NBNode *node)
double getTotalWidth() const
Returns the combined width of all lanes of this edge.
std::string getLaneID(int lane) const
get lane ID
int getPriority() const
Returns the priority of the edge.
static const double UNSPECIFIED_WIDTH
unspecified lane width
static const double UNSPECIFIED_OFFSET
unspecified lane offset
const PositionVector getInnerGeometry() const
Returns the geometry of the edge without the endpoints.
double getFinalLength() const
get length that will be assigned to the lanes in the final network
Instance responsible for building networks.
NBNodeCont & getNodeCont()
Returns a reference to the node container.
NBEdgeCont & getEdgeCont()
NBTypeCont & getTypeCont()
Returns a reference to the type container.
NBTrafficLightLogicCont & getTLLogicCont()
Returns a reference to the traffic light logics container.
void compute(OptionsCont &oc, const std::set< std::string > &explicitTurnarounds=std::set< std::string >(), bool mayAddOrRemove=true)
Performs the network building steps.
A definition of a pedestrian crossing.
PositionVector customShape
optional customShape for this crossing
int customTLIndex
the custom traffic light index of this crossing (if controlled)
bool priority
whether the pedestrians have priority
EdgeVector edges
The edges being crossed.
double width
This crossing's width.
NBNode * retrieve(const std::string &id) const
Returns the node with the given name.
std::vector< std::string > getAllNames() const
get all node names
void analyzeCluster(NodeSet cluster, std::string &id, Position &pos, bool &hasTLS, TrafficLightType &type, SumoXMLNodeType &nodeType)
Represents a single node (junction) during network building.
LinkDirection getDirection(const NBEdge *const incoming, const NBEdge *const outgoing, bool leftHand=false) const
Returns the representation of the described stream's direction.
const std::set< NBTrafficLightDefinition * > & getControllingTLS() const
Returns the traffic lights that were assigned to this node (The set of tls that control this node)
static const double UNSPECIFIED_RADIUS
unspecified lane width
const EdgeVector & getIncomingEdges() const
Returns this node's incoming edges (The edges which yield in this node)
std::vector< std::pair< Position, std::string > > getEndPoints() const
return list of unique endpoint coordinates of all edges at this node
std::vector< std::pair< NBEdge *, NBEdge * > > getEdgesToJoin() const
get edges to join
const EdgeVector & getOutgoingEdges() const
Returns this node's outgoing edges (The edges which start at this node)
const Position & getPosition() const
const EdgeVector & getEdges() const
Returns all edges which participate in this node (Edges that start or end at this node)
void updateSurroundingGeometry()
update geometry of node and surrounding edges
double getRadius() const
Returns the turning radius of this node.
bool checkIsRemovable() const
check if node is removable
bool isTLControlled() const
Returns whether this node is controlled by any tls.
static void sortNodesEdges(NBNodeCont &nc, bool useNodeShape=false)
Sorts a node's edges clockwise regarding driving direction.
A container for traffic light definitions and built programs.
bool computeSingleLogic(OptionsCont &oc, NBTrafficLightDefinition *def)
Computes a specific traffic light logic (using by netedit)
void writeEdgeTypes(OutputDevice &into, const std::set< std::string > &typeIDs=std::set< std::string >()) const
writes all EdgeTypes (and their lanes) as XML
void insertEdgeType(const std::string &id, int numLanes, double maxSpeed, int prio, SVCPermissions permissions, LaneSpreadFunction spreadType, double width, bool oneWayIsDefault, double sidewalkWidth, double bikeLaneWidth, double widthResolution, double maxWidth, double minWidth)
Adds a edgeType into the list.
void clearTypes()
clear types
void insertLaneType(const std::string &edgeTypeID, int index, double maxSpeed, SVCPermissions permissions, double width, const std::set< SumoXMLAttr > &attrs)
Adds a laneType into the list.
static void writeNetwork(const OptionsCont &oc, NBNetBuilder &nb)
Writes the network stored in the given net builder.
static void writeTrafficLights(OutputDevice &into, const NBTrafficLightLogicCont &tllCont, ConnectionStyle style=SUMONET)
writes the traffic light logics to the given device
static void writeJoinedJunctions(const std::string &filename, NBNodeCont &nc)
Writes the joined-juncionts to file.
static void writeNetwork(const OptionsCont &oc, const std::string &prefix, NBNetBuilder &nb)
Writes the network into XML-files (nodes, edges, connections, traffic lights)
A storage for options typed value containers)
void resetDefault()
Resets all options to default.
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
double getFloat(const std::string &name) const
Returns the double-value of the named option (only for Option_Float)
void setApplicationName(const std::string &appName, const std::string &fullName)
Sets the application name.
OptionsCont * clone() const
make a copy of this OptionsCont instance
void removeSubTopic(const std::string &topic)
Removes the given sub-topic.
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
void removeOption(const std::string &name)
Removes an option from its subtopic.
bool exists(const std::string &name) const
Returns the information whether the named option is known.
const std::string & getFullName() const
get options full name
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
static OptionsCont & getOptions()
Retrieves the options.
Static storage of an output device and its base (abstract) implementation.
void close()
Closes the device and removes it from the dictionary.
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
static OutputDevice & getDevice(const std::string &name, bool usePrefix=true)
Returns the described OutputDevice.
bool writeXMLHeader(const std::string &rootElement, const std::string &schemaFile, std::map< SumoXMLAttr, std::string > attrs=std::map< SumoXMLAttr, std::string >(), bool includeConfig=true)
Writes an XML header with optional configuration.
A point in 2D or 3D with translation and scaling methods.
void setx(double x)
set position x
double x() const
Returns the x-position.
double angleTo2D(const Position &other) const
returns the angle in the plane of the vector pointing from here to the other position (in radians bet...
void sety(double y)
set position y
double y() const
Returns the y-position.
void append(const PositionVector &v, double sameThreshold=2.0)
double length() const
Returns the length.
double nearest_offset_to_point2D(const Position &p, bool perpendicular=true) const
return the nearest offest to point 2D
std::pair< PositionVector, PositionVector > splitAt(double where, bool use2D=false) const
Returns the two lists made when this list vector is splitted at the given point.
void move2side(double amount, double maxExtension=100)
move position vector to side using certain amount
PositionVector reverse() const
reverse position vector
A RT-tree for efficient storing of SUMO's GL-objects.
void addAdditionalGLObject(GUIGlObject *o, const double exaggeration=1)
Adds an additional object (detector/shape/trigger) for visualisation.
void removeAdditionalGLObject(GUIGlObject *o, const double exaggeration=1)
Removes an additional object (detector/shape/trigger) from being visualised.
static StringBijection< SumoXMLNodeType > NodeTypes
node types
bool hasString(const std::string &str) const
check if the given string exist
T get(const std::string &str) const
get key
static std::string trim(const std::string s, const std::string &t=" \t\n")
remove leading and trailing whitespace
static std::string replace(std::string str, const std::string &what, const std::string &by)
Replaces all occurrences of the second string by the third string within the first string.
static double toDouble(const std::string &sData)
converts a string into the double value described by it by calling the char-type converter
bool isCurrentSupermodeDemand() const
@check if current supermode is Demand
A structure which describes a connection between edges or lanes.
An (internal) definition of a single lane of an edge.