87const
double GNENet::Z_INITIALIZED = 1;
96#pragma warning(disable: 4355)
100 myNetBuilder(netBuilder),
101 myTagPropertiesDatabase(tagPropertiesDatabase),
102 myAttributeCarriers(new
GNENetHelper::AttributeCarriers(this)),
104 mySavingFilesHandler(new
GNENetHelper::SavingFilesHandler(this)),
200const std::map<std::string, int>&
281 const std::string& suggestedName,
bool wasSplit,
bool allowDuplicateGeom,
bool recomputeConnections) {
284 if (outgoingEdge->getToNode() == dest->
getNBNode() && outgoingEdge->getGeometry().size() == 2) {
285 if (!allowDuplicateGeom) {
299 if (oppositeEdges.size() > 0) {
301 if ((oppositeEdges.front()->getID().size() > 1) && (oppositeEdges.front()->getID().front() ==
'-')) {
302 edgeID = oppositeEdges.front()->getID().substr(1);
304 edgeID =
"-" + oppositeEdges.front()->getID();
313 edgeID = edgeID +
toString(counter);
316 edgeID = suggestedName;
317 }
else if (edgeInfix.size() > 0) {
322 edgeID = src->
getID() + edgeInfix + dest->
getID();
339 edge =
new GNEEdge(
this, nbe, wasSplit);
343 double defaultSpeed = neteditOptions.getFloat(
"default.speed");
344 const std::string defaultType = neteditOptions.getString(
"default.type");
345 const int defaultNrLanes = neteditOptions.getInt(
"default.lanenumber");
346 const int defaultPriority = neteditOptions.getInt(
"default.priority");
353 defaultNrLanes, defaultPriority,
354 defaultWidth, defaultOffset, spread);
356 edge =
new GNEEdge(
this, nbe, wasSplit);
359 undoList->
begin(edge,
TL(
"create edge"));
362 if (recomputeConnections) {
432 std::vector<GNECrossing*> crossingsToRemove;
434 for (
const auto& junctionNeighbour : junctionNeighbours) {
436 for (
const auto& crossing : junctionNeighbour->getGNECrossings()) {
439 crossingsToRemove.push_back(crossing);
444 for (
const auto& crossing : crossingsToRemove) {
449 for (
const auto& edge : incidentEdges) {
470 while (lane->getChildAdditionals().size() > 0) {
474 while (lane->getChildDemandElements().size() > 0) {
478 while (lane->getChildGenericDatas().size() > 0) {
498 if (planParent->getChildDemandElements().size() == 1) {
515 if (recomputeConnections) {
531 if (oppLaneID !=
"") {
533 if (lane !=
nullptr) {
548 undoList->
begin(which,
TL(
"replace edge"));
553 std::vector<GNEAdditional*> copyOfLaneAdditionals = lane->getChildAdditionals();
554 for (
const auto& additional : copyOfLaneAdditionals) {
568 std::vector<GNEDemandElement*> copyOfLaneDemandElements = lane->getChildDemandElements();
569 for (
const auto& demandElement : copyOfLaneDemandElements) {
573 std::vector<GNEGenericData*> copyOfLaneGenericDatas = lane->getChildGenericDatas();
574 for (
const auto& demandElement : copyOfLaneGenericDatas) {
644 deleteEdge(edge, undoList, recomputeConnections);
664 if (recomputeConnections) {
673 undoList->
add(
new GNEChange_Lane(edge, lane, laneAttrs,
false, recomputeConnections),
true);
752 throw ProcessError(
TL(
"Trying to delete a default Vehicle Type"));
780 for (
const auto& dataInterval : copyOfDataIntervalChildren) {
793 for (
const auto& genericData : copyOfGenericDataChildren) {
841 undoList->
begin(lane,
TL(
"duplicate lane"));
844 if (recomputeConnections) {
849 undoList->
add(
new GNEChange_Lane(edge, newLane, laneAttrs,
true, recomputeConnections),
true);
857 bool addRestriction =
true;
863 addRestriction =
false;
872 if (addRestriction) {
884 std::vector<GNEConnection*> cons;
894 for (
auto c : cons) {
912 if (lane->isRestricted(vclass)) {
918 if (index > numLanes) {
928 }
else if (vclass ==
SVC_BUS) {
948 if (index > numLanes) {
965 if (lane->isRestricted(vclass)) {
975std::pair<GNEJunction*, GNEEdge*>
978 undoList->
begin(edge,
TL(
"split edge"));
980 if (newJunction ==
nullptr) {
990 std::pair<PositionVector, PositionVector> newGeoms = oldEdgeGeometry.
splitAt(edgeSplitPosition);
991 const double oldLength = oldEdgeGeometry.
length();
992 const double relativeLength1 = oldLength != 0 ? newGeoms.first.length() / oldLength : 1;
993 const double relativeLength2 = oldLength != 0 ? newGeoms.second.length() / oldLength : 1;
1001 const std::string::size_type sep_index = baseName.rfind(
'.');
1003 if (sep_index != std::string::npos) {
1004 std::string posString = baseName.substr(sep_index + 1);
1005 if (GNEAttributeCarrier::canParse<int>(posString.c_str())) {
1007 posBase = GNEAttributeCarrier::parse<int>(posString.c_str());
1008 baseName = baseName.substr(0, sep_index);
1015 undoList, baseName +
toString(posBase + (
int)edgeSplitPosition),
true,
false,
false);
1019 std::vector<NBNode::Crossing> affectedCrossings;
1021 if (crossing->checkEdgeBelong(edge)) {
1027 newEdges.push_back(secondPart->
getNBEdge());
1029 newEdges.push_back(nbEdge);
1032 nbC.
edges = newEdges;
1033 affectedCrossings.push_back(nbC);
1039 newGeoms.first.pop_back();
1040 newGeoms.first.erase(newGeoms.first.begin());
1045 newGeoms.second.pop_back();
1046 newGeoms.second.erase(newGeoms.second.begin());
1056 for (
int i = 0; i < (int)edge->
getChildLanes().size(); ++i) {
1060 for (
const auto& nbC : affectedCrossings) {
1065 for (
const auto& additional : childAdditionals) {
1066 additional->splitEdgeGeometry(edgeSplitPosition, edge, secondPart, undoList);
1069 for (
int i = 0; i < (int)edge->
getChildLanes().size(); i++) {
1070 for (
const auto& additional : edge->
getChildLanes().at(i)->getChildAdditionals()) {
1076 for (
const auto& demandElement : childDemandElements) {
1077 demandElement->splitEdgeGeometry(edgeSplitPosition, edge, secondPart, undoList);
1080 for (
int i = 0; i < (int)edge->
getChildLanes().size(); i++) {
1081 for (
const auto& demandElement : edge->
getChildLanes().at(i)->getChildDemandElements()) {
1082 demandElement->splitEdgeGeometry(laneSplitPosition, edge->
getChildLanes().at(i), secondPart->
getChildLanes().at(i), undoList);
1088 return std::make_pair(newJunction, secondPart);
1095 undoList->
begin(edge,
TL(
"split edges"));
1097 auto newStuff =
splitEdge(edge, pos, undoList, newJunction);
1098 newJunction = newStuff.first;
1100 splitEdge(oppositeEdge, pos, undoList, newJunction);
1107 if (nbEdge->guessOpposite(
true)) {
1118 undoList->
begin(edge,
TL(
"reverse edge"));
1135 if (reversed !=
nullptr) {
1138 undoList->
begin(edge,
TL(
"add reversed edge"));
1139 if (!disconnected) {
1142 assert(reversed != 0);
1156 reversed =
createEdge(src, dest, edge, undoList,
"-" + edge->
getID(),
false,
true);
1157 assert(reversed != 0);
1172 undoList->
begin(moved,
TL(
"merge junctions"));
1175 for (
const auto& incomingNBEdge : incomingNBEdges) {
1186 for (
const auto& outgoingNBEdge : outgoingNBEdges) {
1204 for (
NBEdge* edge : roundabout) {
1205 if (edge->getFromNode() == junction->
getNBNode()) {
1206 undoList->
begin(junction,
TL(
"select roundabout"));
1207 for (
const auto& roundaboutEdge : roundabout) {
1222 undoList->
begin(junction,
TL(
"create roundabout"));
1236 std::vector<GNEEdge*> edges;
1243 std::reverse(edges.begin(), edges.end());
1245 const double lefthandSign = lefthand ? -1 : 1;
1246 std::vector<GNEJunction*> newJunctions;
1247 GNEEdge* templateEdge =
nullptr;
1248 GNEEdge* prevOpposite =
nullptr;
1250 std::vector<std::pair<NBNode::Crossing, std::vector<std::string>>> oldCrossings;
1252 std::vector<std::string> edgeIDs;
1253 for (
auto e : crossing->getCrossingEdges()) {
1254 edgeIDs.push_back(e->getID());
1256 oldCrossings.push_back(std::make_pair(*crossing->getNBCrossing(), edgeIDs));
1258 std::map<std::string, std::string> edgeRename;
1262 if (edge == prevOpposite) {
1263 newJunction = newJunctions.back();
1266 if (edge->getToJunction() == junction) {
1267 if (templateEdge ==
nullptr) {
1268 templateEdge = edge;
1271 NBEdge* e = edge->getNBEdge();
1275 templateEdge = edge;
1280 prevOpposite = edge->
getOppositeEdges().size() > 0 ? edge->getOppositeEdges().front() :
nullptr;
1281 const double geomLength = edge->getNBEdge()->getGeometry().length2D();
1282 const double splitOffset = (edge->getToJunction() == junction
1283 ?
MAX2(POSITION_EPS, geomLength - radius)
1284 :
MIN2(geomLength - POSITION_EPS, radius));
1285 Position pos = edge->getNBEdge()->getGeometry().positionAtOffset2D(splitOffset);
1286 auto newStuff =
splitEdge(edge, pos, undoList, newJunction);
1287 newJunction = newStuff.first;
1288 if (edge->getFromJunction() == junction) {
1290 edgeRename[newStuff.second->getID()] = edge->
getID();
1292 if (newJunctions.empty() || newJunction != newJunctions.back()) {
1293 newJunctions.push_back(newJunction);
1300 for (
auto item : edgeRename) {
1305 for (
auto nbCItem : oldCrossings) {
1307 nbCItem.first.edges.clear();
1309 for (
const std::string& ce : nbCItem.second) {
1310 bool foundCE =
false;
1311 for (
NBEdge* je : nj->getNBNode()->getEdges()) {
1312 if (je->getID() == ce) {
1314 nbCItem.first.edges.push_back(je);
1322 if (nbCItem.first.edges.size() == nbCItem.second.size()) {
1330 for (
int i = 0; i < (int)newJunctions.size(); i++) {
1331 GNEJunction* from = newJunctions[(i + 1) % newJunctions.size()];
1339 int numSegments =
MAX2(2, (
int)ceil(angleDiff * radius / resolution));
1341 for (
int j = 1; j < numSegments; j++) {
1342 const double angle = angle1 + lefthandSign * j * angleDiff / numSegments;
1343 innerGeom.push_back(center +
Position(cos(angle) * radius, sin(angle) * radius));
1361 if (junction.second->getPositionInView() == pos) {
1374 getApp()->beginWaitCursor();
1377 neteditOptions.set(
"output-file", neteditOptions.getString(
"net-file"));
1378 sumoOptions.resetWritable();
1379 sumoOptions.set(
"net-file", neteditOptions.getString(
"net-file"));
1387 for (
int i = 0; i < (int)edgeType.second->getLaneTypes().size(); i++) {
1389 edgeType.second->getLaneTypes().at(i)->speed,
1390 edgeType.second->getLaneTypes().at(i)->permissions,
1391 edgeType.second->getLaneTypes().at(i)->width,
1392 edgeType.second->getLaneTypes().at(i)->attrs);
1398 sumoOptions.resetWritable();
1399 neteditOptions.resetDefault(
"output-file");
1403 getApp()->endWaitCursor();
1432 edge.second->updateGeometry();
1437 edge.second->updateCenteringBoundary(
true);
1466 if (volatileOptions) {
1467 window->
setStatusBarText(
TL(
"Forced computing junctions with volatile options ..."));
1475 if (volatileOptions) {
1482 getApp()->beginWaitCursor();
1484 if (volatileOptions) {
1496 for (
const auto& file : additionalFiles) {
1500 if (!generalHandler.
parse()) {
1501 WRITE_ERROR(
TL(
"Loading of additional file failed: ") + file);
1503 WRITE_MESSAGE(
TL(
"Loading of additional file successfully: ") + file);
1512 if (!generalHandler.
parse()) {
1523 if (!dataHandler.
parse()) {
1534 if (!generalHandler.
parse()) {
1543 getApp()->endWaitCursor();
1561 for (
const auto& demandElement : demandElements.second) {
1562 demandElement.second->computePathElement();
1574 for (
const auto& genericData : genericDataTag.second) {
1575 genericData.second->computePathElement();
1590 for (
auto it : tlsDefs) {
1591 it->setParticipantsInformation();
1592 it->setTLControllingInformation();
1627 if (selectedJunctions.size() < 2) {
1632 std::set<NBNode*, ComparatorIdLess> cluster;
1633 for (
const auto& selectedJunction : selectedJunctions) {
1634 cluster.insert(selectedJunction->getNBNode());
1635 const EdgeVector& incoming = selectedJunction->getNBNode()->getIncomingEdges();
1636 allIncoming.insert(allIncoming.end(), incoming.begin(), incoming.end());
1637 const EdgeVector& outgoing = selectedJunction->getNBNode()->getOutgoingEdges();
1638 allOutgoing.insert(allOutgoing.end(), outgoing.begin(), outgoing.end());
1644 std::string
id =
"cluster";
1652 if ((junction.second->getPositionInView() == pos) && (cluster.find(junction.second->getNBNode()) == cluster.end())) {
1654 const std::string header =
TL(
"Position of joined junction");
1655 const std::string bodyA =
TL(
"There is another unselected junction in the same position of joined junction.");
1656 const std::string bodyB =
TL(
"It will be joined with the other selected junctions. Continue?");
1657 const auto answer = FXMessageBox::question(
getApp(), MBOX_YES_NO, header.c_str(),
"%s", (bodyA + std::string(
"\n") + bodyB).c_str());
1669 pos.
setx(pos.
x() + 0.1);
1670 pos.
sety(pos.
y() + 0.1);
1682 std::vector<NBNode::Crossing> oldCrossings;
1683 for (
const auto& selectedJunction : selectedJunctions) {
1684 const auto crossings = selectedJunction->getGNECrossings();
1685 for (
auto crossing : crossings) {
1690 for (
const auto& selectedJunction : selectedJunctions) {
1691 selectedJunction->setLogicValid(
false, undoList);
1694 for (
const auto& incomingEdge : allIncoming) {
1695 if (std::find(allOutgoing.begin(), allOutgoing.end(), incomingEdge) == allOutgoing.end()) {
1700 for (
const auto& outgoingEdge : allOutgoing) {
1704 edgesWithin.insert(outgoingEdge);
1711 for (
const auto& nbc : oldCrossings) {
1713 for (
NBEdge* e : nbc.edges) {
1714 if (edgesWithin.count(e) != 0) {
1722 nbc.customTLIndex, nbc.customTLIndex2, nbc.customShape,
1723 false,
true),
true);
1727 for (
const auto& selectedJunction : selectedJunctions) {
1733 if (pos != oldPos) {
1744 std::vector<GNECrossing*> myNetCrossings;
1746 myNetCrossings.reserve(myNetCrossings.size() + junction.second->getGNECrossings().size());
1747 myNetCrossings.insert(myNetCrossings.end(), junction.second->getGNECrossings().begin(), junction.second->getGNECrossings().end());
1750 std::vector<GNECrossing*> myInvalidCrossings;
1751 for (
auto i = myNetCrossings.begin(); i != myNetCrossings.end(); i++) {
1752 if (!(*i)->getNBCrossing()->valid) {
1753 myInvalidCrossings.push_back(*i);
1757 if (myInvalidCrossings.empty()) {
1759 const std::string header =
TL(
"Clear crossings");
1760 const std::string body =
TL(
"There are no invalid crossings to remove.");
1761 FXMessageBox::warning(
getApp(), MBOX_OK, (header).c_str(),
"%s", (body).c_str());
1763 std::string plural = myInvalidCrossings.size() == 1 ? (
"") : (
"s");
1765 const std::string header =
TL(
"Clear crossings");
1766 const std::string body =
TL(
"Crossings will be cleared. Continue?");
1767 const auto answer = FXMessageBox::question(
getApp(), MBOX_YES_NO, header.c_str(),
"%s", body.c_str());
1773 for (
auto i = myInvalidCrossings.begin(); i != myInvalidCrossings.end(); i++) {
1786 std::vector<GNEJunction*> toRemove;
1788 if (junction.second->getNBNode()->getEdges().size() == 0) {
1789 toRemove.push_back(junction.second);
1792 for (
auto junction : toRemove) {
1802 std::vector<GNEDemandElement*> routesWithoutChildren;
1806 if (route.second->getChildDemandElements().empty()) {
1807 routesWithoutChildren.push_back(route.second);
1811 if (routesWithoutChildren.size() > 0) {
1815 for (
const auto& i : routesWithoutChildren) {
1828 std::set<std::pair<std::string, GNEDemandElement*> > mySortedRoutes;
1832 bool hasStops =
false;
1833 for (
const auto& stop : route.second->getChildDemandElements()) {
1834 if (stop->getTagProperty()->isVehicleStop()) {
1843 std::vector<std::vector<GNEDemandElement*> > routesToMerge;
1844 auto index = mySortedRoutes.begin();
1846 for (
auto i = mySortedRoutes.begin(); i != mySortedRoutes.end(); i++) {
1847 if (routesToMerge.empty()) {
1848 routesToMerge.push_back({i->second});
1850 if (index->first == i->first) {
1851 routesToMerge.back().push_back(i->second);
1853 routesToMerge.push_back({i->second});
1859 bool thereIsRoutesToMerge =
false;
1860 for (
const auto& i : routesToMerge) {
1862 thereIsRoutesToMerge =
true;
1866 if (thereIsRoutesToMerge) {
1870 for (
const auto& routes : routesToMerge) {
1871 if (routes.size() > 1) {
1873 for (
int i = 1; i < (int)routes.size(); i++) {
1875 while (routes.at(i)->getChildDemandElements().size() > 0) {
1876 routes.at(i)->getChildDemandElements().front()->setAttribute(
SUMO_ATTR_ROUTE, routes.at(0)->getID(), undoList);
1892 std::map<GNEDemandElement*, std::string> personPlanMap;
1894 for (
const auto& persontag : {
1898 if (person.second->getChildDemandElements().size() > 0) {
1902 while (personPlan) {
1920 if (personPlanMap.size() > 0) {
1924 for (
const auto& personPlan : personPlanMap) {
1937 std::vector<GNEDemandElement*> invalidDemandElements;
1944 invalidDemandElements.push_back(route.second);
1950 invalidDemandElements.push_back(flow.second);
1956 invalidDemandElements.push_back(trip.second);
1960 if (invalidDemandElements.size() > 0) {
1964 for (
const auto& invalidDemandElement : invalidDemandElements) {
1977 undoList->
begin(junction,
TL(
"replace junction by geometry"));
1983 for (
auto edgePair : edgesToJoin) {
1989 for (
auto con : connections) {
2021 if (endpoints.size() < 2) {
2025 undoList->
begin(junction,
TL(
"split junction"));
2027 std::map<std::pair<std::string, GNEEdge*>, std::vector<NBEdge::Connection>> straightConnections;
2029 for (
const auto& c : e->getNBEdge()->getConnections()) {
2031 straightConnections[std::make_pair(e->getID(), e)].push_back(c);
2036 for (
const auto& pair : endpoints) {
2038 const std::string& origID = pair.second;
2040 std::string newID = origID !=
"" ? origID : newJunction->
getID();
2047 if (e->getNBEdge()->getGeometry().back().almostSame(pos) || e->getNBEdge()->getParameter(
"origTo") == newID) {
2054 if (e->getNBEdge()->getGeometry().front().almostSame(pos) || e->getNBEdge()->getParameter(
"origFrom") == newID) {
2059 if (newID != newJunction->
getID()) {
2069 for (
const auto& item : straightConnections) {
2070 GNEEdge* in = item.first.second;
2071 std::map<std::pair<std::string, NBEdge*>,
GNEEdge*> newEdges;
2072 for (
auto& c : item.second) {
2078 if (newEdges.count(std::make_pair(c.toEdge->getID(), c.toEdge)) == 0) {
2081 newEdges[std::make_pair(c.toEdge->getID(), c.toEdge)] = newEdge;
2085 newEdge = newEdges[std::make_pair(c.toEdge->getID(), c.toEdge)];
2108 for (
auto i : connections) {
2117 undoList->
begin(junction,
TL(
"reset junction connections"));
2131 while (additionalMap.second.size() > 0) {
2145 while (demandElementsMap.second.size() > 0) {
2152 for (
const auto& type : types) {
2177 while (meanDataMap.second.size() > 0) {
2227 std::vector<GNEAdditional*> invalidSingleLaneAdditionals;
2228 std::vector<GNEAdditional*> invalidMultiLaneAdditionals;
2231 for (
const auto& addditional : additionalPair.second) {
2233 if (addditional.second->getTagProperty()->hasAttribute(
SUMO_ATTR_LANE) && !addditional.second->isAdditionalValid()) {
2234 invalidSingleLaneAdditionals.push_back(addditional.second);
2235 }
else if (addditional.second->getTagProperty()->hasAttribute(
SUMO_ATTR_LANES) && !addditional.second->isAdditionalValid()) {
2236 invalidMultiLaneAdditionals.push_back(addditional.second);
2241 if (invalidSingleLaneAdditionals.size() > 0 || invalidMultiLaneAdditionals.size() > 0) {
2279 std::vector<GNEDemandElement*> invalidSingleLaneDemandElements;
2282 for (
const auto& demandElement : demandElementSet.second) {
2284 demandElement.second->computePathElement();
2287 invalidSingleLaneDemandElements.push_back(demandElement.second);
2292 if (invalidSingleLaneDemandElements.size() > 0) {
2322 double minimumBegin = 0;
2329 if (interval.second->getAttributeDouble(
SUMO_ATTR_BEGIN) < minimumBegin) {
2333 return minimumBegin;
2339 double maximumEnd = 0;
2346 if (interval.second->getAttributeDouble(
SUMO_ATTR_END) > maximumEnd) {
2347 maximumEnd = interval.second->getAttributeDouble(
SUMO_ATTR_END);
2366 getApp()->beginWaitCursor();
2372 for (
const auto& additionalsByFilename : additionalByFilenames) {
2379 writeVTypes(device, additionalsByFilename.second,
true);
2382 writeRoutes(device, additionalsByFilename.second,
true);
2388 writeAdditionalByType(device, additionalsByFilename.second, {SUMO_TAG_CALIBRATOR, GNE_TAG_CALIBRATOR_LANE});
2400 writeAdditionalByType(device, additionalsByFilename.second, {SUMO_TAG_LANE_AREA_DETECTOR, GNE_TAG_MULTI_LANE_AREA_DETECTOR});
2410 writeAdditionalByType(device, additionalsByFilename.second, {SUMO_TAG_POI, GNE_TAG_POILANE, GNE_TAG_POIGEO});
2429 getApp()->endWaitCursor();
2436 getApp()->beginWaitCursor();
2442 for (
const auto& demandByFilename : demandByFilenames) {
2449 writeVTypes(device, demandByFilename.second,
false);
2453 writeRoutes(device, demandByFilename.second,
false);
2456 std::map<double, std::map<std::pair<SumoXMLTag, std::string>,
GNEDemandElement*> > vehiclesSortedByDepart;
2458 for (
const auto& demandElement : demandElementTag.second) {
2459 if (demandElement.second->getTagProperty()->isVehicle() || demandElement.second->getTagProperty()->isPerson() || demandElement.second->getTagProperty()->isContainer()) {
2460 vehiclesSortedByDepart[demandElement.second->getAttributeDouble(
SUMO_ATTR_DEPART)][std::make_pair(demandElement.second->getTagProperty()->getTag(), demandElement.second->getID())] = demandElement.second;
2465 if (vehiclesSortedByDepart.size() > 0) {
2466 device << (
" <!-- Vehicles, persons and containers (sorted by depart) -->\n");
2467 for (
const auto& vehicleTag : vehiclesSortedByDepart) {
2468 for (
const auto& vehicle : vehicleTag.second) {
2469 if (demandByFilename.second.count(vehicle.second) > 0) {
2470 vehicle.second->writeDemandElement(device);
2481 getApp()->endWaitCursor();
2488 getApp()->beginWaitCursor();
2494 for (
const auto& dataByFilename : dataByFilenames) {
2499 if (dataByFilename.second.count(dataSet.second) > 0) {
2500 dataSet.second->writeDataSet(device);
2509 getApp()->endWaitCursor();
2516 getApp()->beginWaitCursor();
2522 for (
const auto& meanDataByFilename : meanDataByFilenames) {
2539 getApp()->endWaitCursor();
2545 const std::vector<SumoXMLTag> tags)
const {
2546 std::map<std::string, std::vector<GNEAdditional*> > sortedAdditionals;
2547 for (
const auto& tag : tags) {
2549 if ((tag ==
SUMO_TAG_VAPORIZER) || (sortedAdditionals.count(additional.second->getID()) == 0)) {
2550 sortedAdditionals[additional.second->getID()].push_back(additional.second);
2556 for (
const auto& additionalVector : sortedAdditionals) {
2557 for (
const auto& additional : additionalVector.second) {
2558 if (ACs.count(additional) > 0) {
2559 additional->writeAdditional(device);
2568 std::map<std::string, GNEDemandElement*> sortedDemandElements;
2570 if (ACs.count(demandElement.second) > 0) {
2571 sortedDemandElements[demandElement.second->getID()] = demandElement.second;
2574 for (
const auto& demandElement : sortedDemandElements) {
2575 demandElement.second->writeDemandElement(device);
2582 std::map<std::string, GNEDemandElement*> sortedElements;
2585 if (ACs.count(routeDistribution.second) > 0) {
2586 sortedElements[routeDistribution.second->getID()] = routeDistribution.second;
2589 for (
const auto& element : sortedElements) {
2590 element.second->writeDemandElement(device);
2592 sortedElements.clear();
2598 std::map<std::string, GNEDemandElement*> sortedRoutes;
2600 if (ACs.count(route.second) > 0) {
2603 for (
const auto vTypeChild : route.second->getChildDemandElements()) {
2610 if ((additionalFile && (route.second->getChildAdditionals().size() > 0)) ||
2611 (!additionalFile && (route.second->getChildAdditionals().size() == 0))) {
2612 sortedRoutes[route.second->getID()] = route.second;
2617 for (
const auto& route : sortedRoutes) {
2618 route.second->writeDemandElement(device);
2625 std::map<std::string, GNEDemandElement*> sortedElements;
2628 if (ACs.count(vTypeDistribution.second) > 0) {
2629 sortedElements[vTypeDistribution.second->getID()] = vTypeDistribution.second;
2632 for (
const auto& element : sortedElements) {
2633 element.second->writeDemandElement(device);
2635 sortedElements.clear();
2641 std::map<std::string, GNEDemandElement*> sortedVTypes;
2643 if (ACs.count(vType.second) > 0) {
2646 for (
const auto vTypeChild : vType.second->getChildDemandElements()) {
2653 if ((additionalFile && (vType.second->getChildAdditionals().size() > 0)) ||
2654 (!additionalFile && (vType.second->getChildAdditionals().size() == 0))) {
2655 sortedVTypes[vType.second->getID()] = vType.second;
2660 for (
const auto& vType : sortedVTypes) {
2661 vType.second->writeDemandElement(device);
2668 std::map<std::string, GNEMeanData*> sortedMeanDatas;
2670 if (ACs.count(meanData.second) > 0) {
2671 if (sortedMeanDatas.count(meanData.second->getID()) == 0) {
2672 sortedMeanDatas[meanData.second->getID()] = meanData.second;
2678 for (
const auto& additional : sortedMeanDatas) {
2679 additional.second->writeMeanData(device);
2688 const bool defaultVType = GNEAttributeCarrier::parse<bool>(vType.second->getAttribute(
GNE_ATTR_DEFAULT_VTYPE));
2691 if ((vType.second->getParentDemandElements().size() == 0) && (!defaultVType || (defaultVType && defaultVTypeModified))) {
2692 if (ACs.count(vType.second) > 0) {
2693 if (additionalFile && (vType.second->getChildAdditionals().size() != 0)) {
2694 device << (
" <!-- VTypes (used in calibratorFlows) -->\n");
2696 }
else if (!additionalFile && (vType.second->getChildAdditionals().size() == 0)) {
2697 device << (
" <!-- VTypes -->\n");
2710 if (ACs.count(route.second) > 0) {
2711 if (additionalFile && (route.second->getChildAdditionals().size() != 0)) {
2712 device << (
" <!-- Routes (used in RouteProbReroutes and calibratorFlows) -->\n");
2714 }
else if (!additionalFile && (route.second->getChildAdditionals().size() == 0)) {
2715 device << (
" <!-- Routes -->\n");
2726 for (
const auto& AC : ACs) {
2728 device << (
" <!-- RouteProbes -->\n");
2738 for (
const auto& AC : ACs) {
2739 if (AC->getTagProperty()->isCalibrator()) {
2740 device << (
" <!-- Calibrators -->\n");
2750 for (
const auto& AC : ACs) {
2751 if (AC->getTagProperty()->isStoppingPlace()) {
2752 device << (
" <!-- StoppingPlaces -->\n");
2762 for (
const auto& AC : ACs) {
2763 if (AC->getTagProperty()->isDetector()) {
2764 device << (
" <!-- Detectors -->\n");
2774 for (
const auto& AC : ACs) {
2775 if (AC->getTagProperty()->isAdditionalPureElement() &&
2776 !AC->getTagProperty()->isStoppingPlace() &&
2777 !AC->getTagProperty()->isDetector() &&
2778 !AC->getTagProperty()->isCalibrator() &&
2782 device << (
" <!-- Other additionals -->\n");
2792 for (
const auto& AC : ACs) {
2793 if (AC->getTagProperty()->isShapeElement() && !AC->getTagProperty()->isJuPedSimElement()) {
2794 device << (
" <!-- Shapes -->\n");
2804 for (
const auto& AC : ACs) {
2805 if (AC->getTagProperty()->isJuPedSimElement()) {
2806 device << (
" <!-- JuPedSim elements -->\n");
2816 for (
const auto& AC : ACs) {
2818 device << (
" <!-- TAZs -->\n");
2828 for (
const auto& AC : ACs) {
2829 if (AC->getTagProperty()->isWireElement()) {
2830 device << (
" <!-- Wires -->\n");
2841 device << (
" <!-- MeanDataEdges -->\n");
2851 device << (
" <!-- MeanDataLanes -->\n");
2862 device.
openTag(
"additionals");
2884 for (
int i = 0; i < (int)edgeType.second->getLaneTypes().size(); i++) {
2886 edgeType.second->getLaneTypes().at(i)->speed,
2887 edgeType.second->getLaneTypes().at(i)->permissions,
2888 edgeType.second->getLaneTypes().at(i)->width,
2889 edgeType.second->getLaneTypes().at(i)->attrs);
2928 dataInterval.second->updateGenericDataIDs();
2929 dataInterval.second->updateAttributeColors();
2984 throw ProcessError(
TL(
"Network size exceeds 1 Lightyear. Please reconsider your inputs.") + std::string(
"\n"));
2993 for (
const auto& lane : edge.second->getChildLanes()) {
2994 lane->updateGeometry();
3006 edge.second->remakeGNEConnections();
3008 for (
const auto& connection : edge.second->getGNEConnections()) {
3009 connection->updateGeometry();
3018 std::set<std::string> liveExplicitTurnarounds;
3021 liveExplicitTurnarounds.insert(explicitTurnarounds);
3035 if (neteditOptions.
getBool(
"numerical-ids") || neteditOptions.
isSet(
"reserved-ids")) {
3039 if (!neteditOptions.
getBool(
"offset.disable-normalization")) {
3042 edge.second->updateGeometry();
3053 if (volatileOptions) {
3079 junction.second->updateCenteringBoundary(
false);
3086 edge.second->updateCenteringBoundary(
false);
3092 edge.second->remakeGNEConnections(
true);
3097 junction.second->setLogicValid(
true,
nullptr);
3099 junction.second->updateGeometryAfterNetbuild();
3101 junction.second->rebuildGNEWalkingAreas();
3106 edge.second->updateGeometry();
3117 std::vector<std::string> values = GNEAttributeCarrier::parse<std::vector<std::string> >(ac->
getAttribute(key));
3118 std::vector<std::string> newValues;
3119 bool lastBy =
false;
3120 for (
auto v : values) {
3121 if (v == which && !lastBy) {
3123 newValues.push_back(by);
3125 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.
@ GNE_TAG_VTYPEREF
reference to a vType (used in VType distributions)
@ SUMO_TAG_ROUTEPROBE
a routeprobe detector
@ SUMO_TAG_TAZ
a traffic assignment zone
@ SUMO_TAG_VTYPE
description of a vehicle/person/container type
@ SUMO_TAG_ACCESS
An access point for a train stop.
@ SUMO_TAG_MEANDATA_LANE
a lane based mean data detector
@ SUMO_TAG_ROUTE_DISTRIBUTION
distribution of a route
@ SUMO_TAG_FLOW
a flow definition using from and to edges or a route
@ SUMO_TAG_CONNECTION
connectioon between two lanes
@ SUMO_TAG_PARKING_SPACE
A parking space for a single vehicle within a parking area.
@ 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_VTYPE_DISTRIBUTION
distribution of a vehicle type
@ SUMO_TAG_LANE
begin/end of the description of a single lane
@ GNE_TAG_JPS_OBSTACLE
polygon used for draw juPedSim obstacles
@ SUMO_TAG_TYPE
type (edge)
@ SUMO_TAG_VAPORIZER
vaporizer of vehicles
@ GNE_TAG_ROUTEREF
virtual element used to reference routes with distributions
@ GNE_TAG_ROUTE_EMBEDDED
embedded route
@ GNE_TAG_JPS_WALKABLEAREA
polygon used for draw juPedSim walkable areas
@ 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.
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)
The main window of Netedit.
OptionsCont & getSumoOptions()
get SUMO options container
void setStatusBarText(const std::string &statusBarText)
set text of the statusBar
bool isUndoRedoAllowed() const
const std::string getID() const
get ID (all Attribute Carriers have one)
bool isAttributeCarrierSelected() const
check if attribute carrier is selected
void setInGrid(bool value)
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
static const std::string False
true value in string format(used for comparing boolean values in getAttribute(...))
virtual void setAttribute(SumoXMLAttr key, const std::string &value, GNEUndoList *undoList)=0
virtual std::string getAttribute(SumoXMLAttr key) const =0
virtual GUIGlObject * getGUIGlObject()=0
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
This object is responsible for drawing a shape and for supplying a a popup menu. Messages are routete...
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
virtual std::string getAttribute(SumoXMLAttr key) const =0
GNEDemandElement * getPreviousChildDemandElement(const GNEDemandElement *demandElement) const
get previous child demand element to the given demand element
A road/street connecting two junctions (netedit-version)
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
std::string getAttribute(SumoXMLAttr key) const
GNEJunction * getToJunction() const
get from Junction (only used to increase readability)
void setAttribute(SumoXMLAttr key, const std::string &value, GNEUndoList *undoList)
FXuint openDialog(const std::vector< GNEAdditional * > &invalidSingleLaneAdditionals, const std::vector< GNEAdditional * > &invalidMultiLaneAdditionals)
open fix additional dialog
FXuint openDialog(const std::vector< GNEDemandElement * > &invalidDemandElements)
open fix demand elements dialog
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 setAttribute(SumoXMLAttr key, const std::string &value, GNEUndoList *undoList)
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.
Position getPositionInView() const
Returns position of hierarchical element in view.
void removeConnectionsFrom(GNEEdge *edge, GNEUndoList *undoList, bool updateTLS, int lane=-1)
remove all connections from the given edge
bool isValid(SumoXMLAttr key, const std::string &value)
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
This lane is powered by an underlying GNEEdge and basically knows how to draw itself.
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)
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
GNEJunction * registerJunction(GNEJunction *junction)
registers a junction in containers
const std::unordered_map< SumoXMLTag, std::map< const std::string, GNEMeanData * >, std::hash< int > > & getMeanDatas() const
get meanDatas
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
modul for handling saving files
ACsbyFilename getMeanDatasByFilename()
get meanDatas sorted by filenames (and also clear unused filenames)
ACsbyFilename getDatasByFilename()
get datas sorted by filenames (and also clear unused filenames)
void updateNeteditConfig()
update netedit config
ACsbyFilename getAdditionalsByFilename()
get additionals sorted by filenames (and also clear unused filenames)
ACsbyFilename getDemandsByFilename()
get demands sorted by filenames (and also clear unused filenames)
void dataElementsSaved()
mark demand elements as 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
A NBNetBuilder extended by visualisation and editing capabilities.
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
const GNETagPropertiesDatabase * myTagPropertiesDatabase
pointer to tagProperties database
bool joinSelectedJunctions(GNEUndoList *undoList)
join selected junctions
double getDataSetIntervalMaximumEnd() const
get maximum interval
Boundary getCenteringBoundary() const
Returns the boundary to which the view shall be centered in order to show the object.
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.
GNEViewNet * myViewNet
The net to be notified of about changes.
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 saveDemandElementsConfirmed()
save demand elements after confirming invalid objects
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 saveAdditionalsConfirmed()
save additionals after confirming invalid objects
void addGLObjectIntoGrid(GNEAttributeCarrier *AC)
add GL Object into net
GNEPathManager * getDataPathManager()
get data path manager
bool writeMeanDataLaneComment(OutputDevice &device) const
write Wire comment
void reverseEdge(GNEEdge *edge, GNEUndoList *undoList)
reverse edge
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 setViewNet(GNEViewNet *viewNet)
Set the net to be notified of network changes.
bool writeCalibratorComment(OutputDevice &device, const std::unordered_set< const GNEAttributeCarrier * > &ACs) const
write calibrator comment
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 writeAdditionalByType(OutputDevice &device, const std::unordered_set< const GNEAttributeCarrier * > &ACs, const std::vector< SumoXMLTag > tags) const
write additional element by type and sorted by ID
void saveEdgeTypes(const std::string &filename)
save edgeTypes elements of the network
void deleteNetworkElement(GNENetworkElement *networkElement, GNEUndoList *undoList)
delete network element
SUMORTree myGrid
the rtree which contains all GUIGlObjects (so named for historical reasons)
void clearDataElements(GNEUndoList *undoList)
clear data elements
bool writeDetectorComment(OutputDevice &device, const std::unordered_set< const GNEAttributeCarrier * > &ACs) const
write detector comment
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
bool writeMeanDataEdgeComment(OutputDevice &device) const
write meanDataEdge comment
void adjustPersonPlans(GNEUndoList *undoList)
adjust person plans
GNENetHelper::ACTemplate * getACTemplates() const
get all attribute carriers templates used in this net
bool writeShapesComment(OutputDevice &device, const std::unordered_set< const GNEAttributeCarrier * > &ACs) const
write shape comment
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
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
void deleteMeanData(GNEMeanData *meanData, GNEUndoList *undoList)
remove generic data
void replaceIncomingEdge(GNEEdge *which, GNEEdge *by, GNEUndoList *undoList)
replaces edge
void drawGL(const GUIVisualizationSettings &s) const
Draws the object.
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
GNENetHelper::AttributeCarriers * getAttributeCarriers() const
get all attribute carriers used in this net
bool writeOtherAdditionalsComment(OutputDevice &device, const std::unordered_set< const GNEAttributeCarrier * > &ACs) const
write other additional comment
GNEEdge * addReversedEdge(GNEEdge *edge, const bool disconnected, GNEUndoList *undoList)
add reversed edge
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 writeMeanDatas(OutputDevice &device, const std::unordered_set< const GNEAttributeCarrier * > &ACs, SumoXMLTag tag) const
write meanData element by type and sorted by ID
void initJunctionsAndEdges()
Init Junctions and edges.
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
void writeVTypeDistributions(OutputDevice &device, const std::unordered_set< const GNEAttributeCarrier * > &ACs) const
write vTypeDistributions sorted by ID
unsigned int myEdgeIDCounter
void expandBoundary(const Boundary &newBoundary)
expand boundary
void disableUpdateData()
disable update data elements after inserting or removing an element in net
void writeDemandByType(OutputDevice &device, const std::unordered_set< const GNEAttributeCarrier * > &ACs, SumoXMLTag tag) const
write demand element by type and sorted by ID
bool removeRestrictedLane(SUMOVehicleClass vclass, GNEEdge *edge, GNEUndoList *undoList)
remove restricted lane
void deleteTAZSourceSink(GNETAZSourceSink *TAZSourceSink, GNEUndoList *undoList)
remove TAZSourceSink
void writeVTypes(OutputDevice &device, const std::unordered_set< const GNEAttributeCarrier * > &ACs, const bool additionalFile) const
write vTypes sorted by ID
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
GNENetHelper::SavingFilesHandler * getSavingFilesHandler() const
get saving files handler
bool saveAdditionals()
save additional elements
const std::map< std::string, int > & getEdgesAndNumberOfLanes() const
et edges and number of lanes
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 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
GUIParameterTableWindow * getParameterWindow(GUIMainWindow &app, GUISUMOAbstractView &parent)
Returns an own parameter window.
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 saveJuPedSimElements(const std::unordered_set< const GNEAttributeCarrier * > &ACs, const std::string &file)
save JuPedSim elements
bool cleanInvalidCrossings(GNEUndoList *undoList)
clear invalid crossings
bool writeStoppingPlaceComment(OutputDevice &device, const std::unordered_set< const GNEAttributeCarrier * > &ACs) const
write stoppingPlace comment
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
GUIGLObjectPopupMenu * getPopUpMenu(GUIMainWindow &app, GUISUMOAbstractView &parent)
Returns an own popup-menu.
void writeRouteDistributions(OutputDevice &device, const std::unordered_set< const GNEAttributeCarrier * > &ACs) const
write route distributions sorted by ID
void replaceJunctionByGeometry(GNEJunction *junction, GNEUndoList *undoList)
replace the selected junction by geometry node(s) and merge the edges
bool writeRouteComment(OutputDevice &device, const std::unordered_set< const GNEAttributeCarrier * > &ACs, const bool additionalFile) const
write route comment
GNENetHelper::SavingFilesHandler * mySavingFilesHandler
saving files handler module
void createRoundabout(GNEJunction *junction, GNEUndoList *undoList)
transform the given junction into a roundabout
void requireRecompute()
inform the net about the need for recomputation
bool writeJuPedSimComment(OutputDevice &device, const std::unordered_set< const GNEAttributeCarrier * > &ACs) const
write JuPedSim comment
GNEJunction * createJunction(const Position &pos, GNEUndoList *undoList)
creates a new junction
bool writeRouteProbeComment(OutputDevice &device, const std::unordered_set< const GNEAttributeCarrier * > &ACs) const
write routeProbe comment
bool writeTAZComment(OutputDevice &device, const std::unordered_set< const GNEAttributeCarrier * > &ACs) const
write TAZ comment
unsigned int myJunctionIDCounter
std::map< std::string, int > myEdgesAndNumberOfLanes
map with the Edges and their number of lanes
GNEPathManager * myDemandPathManager
Demand path manager.
bool writeWireComment(OutputDevice &device, const std::unordered_set< const GNEAttributeCarrier * > &ACs) const
write Wire comment
void writeRoutes(OutputDevice &device, const std::unordered_set< const GNEAttributeCarrier * > &ACs, const bool additionalFile) const
write route sorted by ID
bool writeVTypeComment(OutputDevice &device, const std::unordered_set< const GNEAttributeCarrier * > &ACs, const bool additionalFile) const
write vType comment
void saveMeanDatasConfirmed()
save meanDatas
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.
void savePlain(const std::string &prefix)
save plain xml representation of the network (and nothing else)
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
FXApp * getApp()
get pointer to the main App
GNENetHelper::ACTemplate * myACTemplates
attributeCarriers templates
int getNumberOfTLSPrograms() const
get number of TLS Programs
GNEViewNet * getViewNet() const
get view net
void saveDataElementsConfirmed()
save data elements after confirming invalid objects
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()
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
GNEFixDemandElements * getFixDemandElementsDialog() const
get fix additional elements dialog
GNEFixAdditionalElements * getFixAdditionalElementsDialog() const
get fix additional elements dialog
GNEApplicationWindow * getGNEAppWindows() const
get GNE Application Windows
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)
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)
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)
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
void resetWritable()
Resets all options to be writeable.
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.
std::vector< std::string > getVector()
return vector of strings
static std::string trim(const std::string s, const std::string &t=" \t\n")
remove leading and trailing whitespace
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.