145 myFrameParent(frameParent),
147 myCurrentTemplateAC(
nullptr) {
151 setCurrentTagType(myTagType, onlyDrawables,
false);
153 setCurrentTag(tag,
false);
183 for (
const auto&
ACTemplate : myACTemplates) {
194 return myCurrentTemplateAC;
206 case GNETagProperties::TagType::NETWORKELEMENT:
207 setText(
"network elements");
209 case GNETagProperties::TagType::ADDITIONALELEMENT:
210 setText(
"Additional elements");
212 case GNETagProperties::TagType::SHAPE:
213 setText(
"Shape elements");
215 case GNETagProperties::TagType::TAZELEMENT:
216 setText(
"TAZ elements");
218 case GNETagProperties::TagType::WIRE:
219 setText(
"Wire elements");
221 case GNETagProperties::TagType::VEHICLE:
224 case GNETagProperties::TagType::STOP:
227 case GNETagProperties::TagType::PERSON:
230 case GNETagProperties::TagType::PERSONPLAN:
231 setText(
"Person plans");
233 case GNETagProperties::TagType::CONTAINER:
234 setText(
"Container");
236 case GNETagProperties::TagType::CONTAINERPLAN:
237 setText(
"Container plans");
239 case GNETagProperties::TagType::PERSONTRIP:
240 setText(
"Person trips");
242 case GNETagProperties::TagType::WALK:
245 case GNETagProperties::TagType::RIDE:
248 case GNETagProperties::TagType::STOPPERSON:
249 setText(
"Person stops");
255 for (
const auto&
ACTemplate : myACTemplates) {
258 myACTemplates.clear();
259 myTagsMatchBox->clearItems();
263 for (
const auto& tagProperty : tagProperties) {
264 if ((!onlyDrawables || tagProperty.isDrawable()) && (!tagProperty.requireProj() || proj)) {
265 myACTemplates.push_back(
new ACTemplate(myFrameParent->getViewNet()->getNet(), tagProperty));
266 myTagsMatchBox->appendIconItem(tagProperty.getFieldString().c_str(),
GUIIconSubSys::getIcon(tagProperty.getGUIIcon()), tagProperty.getBackGroundColor());
270 myTagsMatchBox->setTextColor(FXRGB(0, 0, 0));
272 myTagsMatchBox->setNumVisible((
int)myTagsMatchBox->getNumItems() + 1);
274 myCurrentTemplateAC = myACTemplates.front()->
getAC();
276 if (notifyFrameParent) {
277 myFrameParent->tagSelected();
285 myCurrentTemplateAC =
nullptr;
287 for (
int i = 0; i < (int)myACTemplates.size(); i++) {
288 if (myACTemplates.at(i)->getAC() && (myACTemplates.at(i)->getAC()->getTagProperty().getTag() == newTag)) {
290 myCurrentTemplateAC = myACTemplates.at(i)->getAC();
291 myTagsMatchBox->setCurrentItem(i);
293 myTagsMatchBox->setTextColor(FXRGB(0, 0, 0));
297 if (notifyFrameParent) {
298 myFrameParent->tagSelected();
306 myFrameParent->tagSelected();
313 for (
int i = 0; i < (int)myACTemplates.size(); i++) {
314 if (myACTemplates.at(i)->getAC() && myACTemplates.at(i)->getAC()->getTagProperty().getFieldString() == myTagsMatchBox->getText().text()) {
316 myCurrentTemplateAC = myACTemplates.at(i)->getAC();
317 myTagsMatchBox->setCurrentItem(i);
319 myTagsMatchBox->setTextColor(FXRGB(0, 0, 0));
321 myFrameParent->tagSelected();
323 WRITE_DEBUG((
"Selected item '" + myTagsMatchBox->getText() +
"' in TagSelector").text());
328 myCurrentTemplateAC =
nullptr;
330 myTagsMatchBox->setTextColor(FXRGB(255, 0, 0));
332 WRITE_DEBUG(
"Selected invalid item in TagSelector");
334 myFrameParent->tagSelected();
348 switch (tagProperty.
getTag()) {
526 throw ProcessError(
"Non-supported tagProperty in ACTemplate");
543 myCurrentDemandElement(defaultElement),
544 myDemandElementTags({demandElementTag}) {
548 refreshDemandElementSelector();
556 myFrameParent(frameParent),
557 myCurrentDemandElement(nullptr) {
559 for (
const auto& tagType : tagTypes) {
561 for (
const auto& tagProperty : tagProperties) {
579 return myCurrentDemandElement;
583 const std::vector<SumoXMLTag>&
585 return myDemandElementTags;
592 if (std::find(myDemandElementTags.begin(), myDemandElementTags.end(), demandElement->
getTagProperty().
getTag()) != myDemandElementTags.end()) {
594 myDemandElementsMatchBox->setItem(demandElement->
getID().c_str(), demandElement->
getIcon());
596 myCurrentDemandElement = demandElement;
598 myFrameParent->demandElementSelected();
606 refreshDemandElementSelector();
608 if (myCurrentDemandElement) {
609 myDemandElementsMatchBox->setItem(myCurrentDemandElement->getID().c_str(), myCurrentDemandElement->getIcon());
610 }
else if (myDemandElementTags.size() == 1) {
613 myDemandElementsMatchBox->setItem(defaultVType->getID().c_str(), defaultVType->getIcon());
616 onCmdSelectDemandElement(
nullptr, 0,
nullptr);
636 const auto& demandElements = myFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getDemandElements();
638 myDemandElementsMatchBox->clearItems();
640 for (
const auto& demandElementTag : myDemandElementTags) {
650 for (
const auto& vType : demandElements.at(demandElementTag)) {
653 myDemandElementsMatchBox->appendIconItem(vType->getID().c_str(), vType->getIcon());
658 for (
const auto& demandElement : demandElements.at(demandElementTag)) {
659 myDemandElementsMatchBox->appendIconItem(demandElement->getID().c_str(), demandElement->getIcon());
664 if (myDemandElementsMatchBox->getNumItems() < 10) {
665 myDemandElementsMatchBox->setNumVisible((
int)myDemandElementsMatchBox->getNumItems() + 1);
667 myDemandElementsMatchBox->setNumVisible(10);
670 if (myDemandElementsMatchBox->getNumItems() == 0) {
671 myCurrentDemandElement =
nullptr;
672 }
else if (myCurrentDemandElement) {
673 for (
int i = 0; i < myDemandElementsMatchBox->getNumItems(); i++) {
674 if (myDemandElementsMatchBox->getItem(i).text() == myCurrentDemandElement->getID()) {
675 myDemandElementsMatchBox->setCurrentItem(i, FALSE);
681 myCurrentDemandElement = myFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getDefaultType();
684 myCurrentDemandElement =
nullptr;
686 for (
auto i = myDemandElementTags.begin(); (i != myDemandElementTags.end()) && (myCurrentDemandElement ==
nullptr); i++) {
687 if (demandElements.at(*i).size() > 0) {
688 myCurrentDemandElement = *demandElements.at(*i).begin();
698 if (myCurrentDemandElement ==
nullptr) {
701 if (!myCurrentDemandElement->getTagProperty().isPerson()) {
704 if (myCurrentDemandElement->getChildDemandElements().empty()) {
729 return lastPersonPlan->
getParentAdditionals().back()->getParentLanes().front()->getParentEdge();
741 if (myCurrentDemandElement ==
nullptr) {
744 if (!myCurrentDemandElement->getTagProperty().isContainer()) {
747 if (myCurrentDemandElement->getChildDemandElements().empty()) {
768 return lastContainerPlan->
getParentAdditionals().back()->getParentLanes().front()->getParentEdge();
778 for (
const auto& demandElementTag : myDemandElementTags) {
779 for (
const auto& demandElement : myFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getDemandElements().at(demandElementTag)) {
780 if (demandElement->getID() == myDemandElementsMatchBox->getText().text()) {
782 myDemandElementsMatchBox->setTextColor(FXRGB(0, 0, 0));
784 myCurrentDemandElement = demandElement;
786 myFrameParent->demandElementSelected();
788 WRITE_DEBUG((
"Selected item '" + myDemandElementsMatchBox->getText() +
"' in DemandElementSelector").text());
794 myCurrentDemandElement =
nullptr;
796 myFrameParent->demandElementSelected();
798 myDemandElementsMatchBox->setTextColor(FXRGB(255, 0, 0));
800 WRITE_DEBUG(
"Selected invalid item in DemandElementSelector");
810 myFrameParent(frameParent),
812 myClickedAC(nullptr),
813 myClickedJunction(nullptr),
814 myClickedEdge(nullptr),
815 myClickedLane(nullptr),
816 myClickedCrossing(nullptr),
817 myClickedConnection(nullptr),
818 myClickedAdditional(nullptr),
819 myClickedDemandElement(nullptr),
820 myClickedDataSet(nullptr),
821 myClickedDataInterval(nullptr),
822 myClickedGenericData(nullptr) {
838 refreshHierarchicalElementTree();
840 myTreeListDinamic->show();
851 myClickedAC =
nullptr;
852 myClickedJunction =
nullptr;
853 myClickedEdge =
nullptr;
854 myClickedLane =
nullptr;
855 myClickedCrossing =
nullptr;
856 myClickedConnection =
nullptr;
857 myClickedAdditional =
nullptr;
858 myClickedDemandElement =
nullptr;
859 myClickedDataSet =
nullptr;
860 myClickedDataInterval =
nullptr;
861 myClickedGenericData =
nullptr;
863 myTreeListDinamic->hide();
872 myTreeListDinamic->clearItems();
873 myTreeItemToACMap.clear();
874 myTreeItemsConnections.clear();
877 showHierarchicalElementChildren(myHE, showAttributeCarrierParents());
894 FXEvent* e = (FXEvent*)eventData;
896 FXTreeItem* item = myTreeListDinamic->getItemAt(e->win_x, e->win_y);
898 if (item && (myTreeItemsConnections.find(item) == myTreeItemsConnections.end())) {
899 createPopUpMenu(e->root_x, e->root_y, myTreeItemToACMap[item]);
908 if (myClickedJunction) {
909 myFrameParent->getViewNet()->centerTo(myClickedJunction->getGlID(),
true, -1);
910 }
else if (myClickedEdge) {
911 myFrameParent->getViewNet()->centerTo(myClickedEdge->getGlID(),
true, -1);
912 }
else if (myClickedLane) {
913 myFrameParent->getViewNet()->centerTo(myClickedLane->getGlID(),
true, -1);
914 }
else if (myClickedCrossing) {
915 myFrameParent->getViewNet()->centerTo(myClickedCrossing->getGlID(),
true, -1);
916 }
else if (myClickedConnection) {
917 myFrameParent->getViewNet()->centerTo(myClickedConnection->getGlID(),
true, -1);
918 }
else if (myClickedAdditional) {
919 myFrameParent->getViewNet()->centerTo(myClickedAdditional->getGlID(),
true, -1);
920 }
else if (myClickedDemandElement) {
921 myFrameParent->getViewNet()->centerTo(myClickedDemandElement->getGlID(),
true, -1);
922 }
else if (myClickedGenericData) {
923 myFrameParent->getViewNet()->centerTo(myClickedGenericData->getGlID(),
true, -1);
926 myFrameParent->getViewNet()->updateViewNet();
933 if ((myHE !=
nullptr) && (myClickedAC !=
nullptr)) {
934 myFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->inspectChild(myClickedAC, myHE);
943 if (myClickedJunction) {
944 myFrameParent->getViewNet()->getNet()->deleteJunction(myClickedJunction, myFrameParent->getViewNet()->getUndoList());
945 }
else if (myClickedEdge) {
946 myFrameParent->getViewNet()->getNet()->deleteEdge(myClickedEdge, myFrameParent->getViewNet()->getUndoList(),
false);
947 }
else if (myClickedLane) {
948 myFrameParent->getViewNet()->getNet()->deleteLane(myClickedLane, myFrameParent->getViewNet()->getUndoList(),
false);
949 }
else if (myClickedCrossing) {
950 myFrameParent->getViewNet()->getNet()->deleteCrossing(myClickedCrossing, myFrameParent->getViewNet()->getUndoList());
951 }
else if (myClickedConnection) {
952 myFrameParent->getViewNet()->getNet()->deleteConnection(myClickedConnection, myFrameParent->getViewNet()->getUndoList());
953 }
else if (myClickedAdditional) {
954 myFrameParent->getViewNet()->getNet()->deleteAdditional(myClickedAdditional, myFrameParent->getViewNet()->getUndoList());
955 }
else if (myClickedDemandElement) {
957 if ((myClickedDemandElement->getTagProperty().getTag() ==
SUMO_TAG_VTYPE) && (GNEAttributeCarrier::parse<bool>(myClickedDemandElement->getAttribute(
GNE_ATTR_DEFAULT_VTYPE)))) {
960 }
else if (myClickedDemandElement->getTagProperty().isPersonPlan() && (myClickedDemandElement->getParentDemandElements().front()->getChildDemandElements().size() == 1)) {
962 myFrameParent->getViewNet()->getNet()->deleteDemandElement(myClickedDemandElement->getParentDemandElements().front(), myFrameParent->getViewNet()->getUndoList());
964 myFrameParent->getViewNet()->getNet()->deleteDemandElement(myClickedDemandElement, myFrameParent->getViewNet()->getUndoList());
966 }
else if (myClickedDataSet) {
967 myFrameParent->getViewNet()->getNet()->deleteDataSet(myClickedDataSet, myFrameParent->getViewNet()->getUndoList());
968 }
else if (myClickedDataInterval) {
970 if (myClickedDataInterval->getDataSetParent()->getDataIntervalChildren().size() == 1) {
971 myFrameParent->getViewNet()->getNet()->deleteDataSet(myClickedDataInterval->getDataSetParent(), myFrameParent->getViewNet()->getUndoList());
973 myFrameParent->getViewNet()->getNet()->deleteDataInterval(myClickedDataInterval, myFrameParent->getViewNet()->getUndoList());
975 }
else if (myClickedGenericData) {
977 if (myClickedGenericData->getDataIntervalParent()->getGenericDataChildren().size() == 1) {
979 if (myClickedGenericData->getDataIntervalParent()->getDataSetParent()->getDataIntervalChildren().size() == 1) {
980 myFrameParent->getViewNet()->getNet()->deleteDataSet(myClickedGenericData->getDataIntervalParent()->getDataSetParent(), myFrameParent->getViewNet()->getUndoList());
982 myFrameParent->getViewNet()->getNet()->deleteDataInterval(myClickedGenericData->getDataIntervalParent(), myFrameParent->getViewNet()->getUndoList());
985 myFrameParent->getViewNet()->getNet()->deleteGenericData(myClickedGenericData, myFrameParent->getViewNet()->getUndoList());
989 myFrameParent->getViewNet()->updateViewNet();
991 refreshHierarchicalElementTree();
993 if (myFrameParent->getViewNet()->getInspectedAttributeCarriers().size() == 1) {
994 if (myFrameParent->getViewNet()->getInspectedAttributeCarriers().front() != myClickedAC) {
995 myFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->inspectSingleElement(myFrameParent->getViewNet()->getInspectedAttributeCarriers().front());
998 myFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->inspectSingleElement(
nullptr);
1008 if (myClickedDemandElement) {
1009 myFrameParent->getViewNet()->getUndoList()->begin(myClickedDemandElement->getTagProperty().getGUIIcon(), (
"moving up " + myClickedDemandElement->getTagStr()).c_str());
1011 myFrameParent->getViewNet()->getUndoList()->add(
new GNEChange_Children(myClickedDemandElement->getParentDemandElements().at(0), myClickedDemandElement,
1012 GNEChange_Children::Operation::MOVE_BACK),
true);
1013 myFrameParent->getViewNet()->getUndoList()->end();
1016 refreshHierarchicalElementTree();
1024 if (myClickedDemandElement) {
1025 myFrameParent->getViewNet()->getUndoList()->begin(myClickedDemandElement->getTagProperty().getGUIIcon(), (
"moving down " + myClickedDemandElement->getTagStr()).c_str());
1027 myFrameParent->getViewNet()->getUndoList()->add(
new GNEChange_Children(myClickedDemandElement->getParentDemandElements().at(0), myClickedDemandElement,
1028 GNEChange_Children::Operation::MOVE_FRONT),
true);
1029 myFrameParent->getViewNet()->getUndoList()->end();
1032 refreshHierarchicalElementTree();
1040 const auto& attributeCarriers = myFrameParent->getViewNet()->getNet()->getAttributeCarriers();
1044 myClickedAC = clickedAC;
1046 myClickedJunction = attributeCarriers->retrieveJunction(clickedAC->
getID(),
false);
1047 myClickedEdge = attributeCarriers->retrieveEdge(clickedAC->
getID(),
false);
1048 myClickedLane = attributeCarriers->retrieveLane(clickedAC,
false);
1049 myClickedCrossing = attributeCarriers->retrieveCrossing(clickedAC,
false);
1050 myClickedConnection = attributeCarriers->retrieveConnection(clickedAC,
false);
1051 myClickedAdditional = attributeCarriers->retrieveAdditional(clickedAC,
false);
1052 myClickedDemandElement = attributeCarriers->retrieveDemandElement(clickedAC,
false);
1053 myClickedDataSet = attributeCarriers->retrieveDataSet(clickedAC,
false);
1054 myClickedDataInterval = attributeCarriers->retrieveDataInterval(clickedAC,
false);
1055 myClickedGenericData = attributeCarriers->retrieveGenericData(clickedAC,
false);
1057 FXMenuPane* pane =
new FXMenuPane(myTreeListDinamic);
1059 new MFXMenuHeader(pane, myFrameParent->getViewNet()->getViewParent()->getGUIMainWindow()->getBoldFont(), myClickedAC->getPopUpID().c_str(), myClickedAC->getIcon());
1061 new FXMenuSeparator(pane);
1065 if (myClickedAC->getTagProperty().isVehicleType() || (myClickedAC->getTagProperty().getTag() ==
SUMO_TAG_DATASET) ||
1067 centerMenuCommand->disable();
1074 inspectMenuCommand->disable();
1075 deleteMenuCommand->disable();
1116 myClickedAC =
nullptr;
1117 myClickedJunction =
nullptr;
1118 myClickedEdge =
nullptr;
1119 myClickedLane =
nullptr;
1120 myClickedCrossing =
nullptr;
1121 myClickedConnection =
nullptr;
1122 myClickedAdditional =
nullptr;
1123 myClickedDemandElement =
nullptr;
1124 myClickedDataSet =
nullptr;
1125 myClickedDataInterval =
nullptr;
1126 myClickedGenericData =
nullptr;
1134 const auto& attributeCarriers = myFrameParent->getViewNet()->getNet()->getAttributeCarriers();
1136 if (myHE->getTagProperty().isNetworkElement()) {
1138 switch (myHE->getTagProperty().getTag()) {
1141 GNEEdge* edge = attributeCarriers->retrieveEdge(myHE->getID(),
false);
1146 junctionDestinyItem->setExpanded(
true);
1149 myTreeItemToACMap[junctionDestinyItem] = edge->
getToJunction();
1151 return junctionDestinyItem;
1158 GNELane* lane = attributeCarriers->retrieveLane(myHE->getID(),
false);
1165 junctionDestinyItem->setExpanded(
true);
1167 FXTreeItem* edgeItem = myTreeListDinamic->insertItem(
nullptr, junctionDestinyItem, edge->
getHierarchyName().c_str(), edge->
getIcon(), edge->
getIcon());
1168 edgeItem->setExpanded(
true);
1171 myTreeItemToACMap[junctionDestinyItem] = edge->
getToJunction();
1172 myTreeItemToACMap[edgeItem] = edge;
1181 GNEJunction* junction = attributeCarriers->retrieveCrossing(myHE)->getParentJunction();
1183 FXTreeItem* junctionItem = myTreeListDinamic->insertItem(
nullptr,
nullptr, junction->
getHierarchyName().c_str(), junction->
getIcon(), junction->
getIcon());
1184 junctionItem->setExpanded(
true);
1186 myTreeItemToACMap[junctionItem] = junction;
1188 return junctionItem;
1192 GNEConnection* connection = attributeCarriers->retrieveConnection(myHE->getID(),
false);
1196 edgeFromItem->setExpanded(
true);
1199 edgeToItem->setExpanded(
true);
1201 FXTreeItem* connectionItem = myTreeListDinamic->insertItem(
nullptr, edgeToItem, connection->
getHierarchyName().c_str(), connection->
getIcon(), connection->
getIcon());
1202 connectionItem->setExpanded(
true);
1204 myTreeItemToACMap[edgeFromItem] = connection->
getEdgeFrom();
1205 myTreeItemToACMap[edgeToItem] = connection->
getEdgeTo();
1206 myTreeItemToACMap[connectionItem] = connection;
1208 return connectionItem;
1220 GNELane* lane = attributeCarriers->retrieveLane(POILane->getParentLanes().at(0)->getID());
1226 junctionDestinyItem->setExpanded(
true);
1228 FXTreeItem* edgeItem = myTreeListDinamic->insertItem(
nullptr, junctionDestinyItem, edge->
getHierarchyName().c_str(), edge->
getIcon(), edge->
getIcon());
1229 edgeItem->setExpanded(
true);
1232 laneItem->setExpanded(
true);
1235 myTreeItemToACMap[junctionDestinyItem] = edge->
getToJunction();
1236 myTreeItemToACMap[edgeItem] = edge;
1237 myTreeItemToACMap[laneItem] = lane;
1240 }
else if (myHE->getTagProperty().isAdditionalElement()) {
1242 const GNEAdditional* additional = attributeCarriers->retrieveAdditional(myHE);
1244 FXTreeItem* root =
nullptr;
1281 addListItem(
nullptr, (
"..." +
toString((
int)additional->
getParentEdges().size() - 2) +
" edges...").c_str(), 0,
false);
1295 addListItem(
nullptr, (
"..." +
toString((
int)additional->
getParentLanes().size() - 2) +
" lanes...").c_str(), 0,
false);
1303 }
else if (myHE->getTagProperty().isTAZElement()) {
1307 FXTreeItem* root =
nullptr;
1344 addListItem(
nullptr, (
"..." +
toString((
int)TAZElement->
getParentEdges().size() - 2) +
" edges...").c_str(), 0,
false);
1358 addListItem(
nullptr, (
"..." +
toString((
int)TAZElement->
getParentLanes().size() - 2) +
" lanes...").c_str(), 0,
false);
1366 }
else if (myHE->getTagProperty().isDemandElement()) {
1370 FXTreeItem* root =
nullptr;
1407 addListItem(
nullptr, (
"..." +
toString((
int)demandElement->
getParentEdges().size() - 2) +
" edges...").c_str(), 0,
false);
1421 addListItem(
nullptr, (
"..." +
toString((
int)demandElement->
getParentLanes().size() - 2) +
" lanes...").c_str(), 0,
false);
1429 }
else if (myHE->getTagProperty().isDataElement()) {
1434 return addListItem(myFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveDataSet(myHE->getID()));
1440 FXTreeItem* root =
nullptr;
1479 addListItem(dataElement->
getParentEdges().front(),
nullptr,
"from ");
1485 addListItem(
nullptr, (
"..." +
toString((
int)dataElement->
getParentEdges().size() - 2) +
" edges...").c_str(), 0,
false);
1490 addListItem(dataElement->
getParentEdges().back(),
nullptr,
"to ");
1503 addListItem(
nullptr, (
"..." +
toString((
int)dataElement->
getParentLanes().size() - 2) +
" lanes...").c_str(), 0,
false);
1529 FXTreeItem* junctionItem = addListItem(HE, itemParent);
1532 showHierarchicalElementChildren(edge, junctionItem);
1536 showHierarchicalElementChildren(crossing, junctionItem);
1546 FXTreeItem* edgeItem = addListItem(HE, itemParent);
1548 for (
const auto& lane : edge->
getLanes()) {
1549 showHierarchicalElementChildren(lane, edgeItem);
1553 showHierarchicalElementChildren(additional, edgeItem);
1557 showHierarchicalElementChildren(demandElement, edgeItem);
1575 showHierarchicalElementChildren(genericDatas, edgeItem);
1585 FXTreeItem* laneItem = addListItem(HE, itemParent);
1588 showHierarchicalElementChildren(additional, laneItem);
1592 showHierarchicalElementChildren(demandElement, laneItem);
1598 FXTreeItem* incomingConnections = addListItem(laneItem,
"Incomings", incomingLaneConnections.front()->getIcon(),
false);
1600 for (
const auto& connection : incomingLaneConnections) {
1601 showHierarchicalElementChildren(connection, incomingConnections);
1608 FXTreeItem* outgoingConnections = addListItem(laneItem,
"Outgoing", outcomingLaneConnections.front()->getIcon(),
false);
1610 for (
const auto& connection : outcomingLaneConnections) {
1611 showHierarchicalElementChildren(connection, outgoingConnections);
1620 addListItem(HE, itemParent);
1628 FXTreeItem* treeItem = addListItem(HE, itemParent);
1631 showHierarchicalElementChildren(edge, treeItem);
1635 showHierarchicalElementChildren(lane, treeItem);
1638 std::vector<GNEAdditional*> symbols;
1640 if (additional->getTagProperty().isSymbol()) {
1641 symbols.push_back(additional);
1644 if (symbols.size() > 0) {
1646 const auto additionalParent = symbols.front()->getParentAdditionals().front();
1647 const std::string symbolType = additionalParent->getTagProperty().hasAttribute(
SUMO_ATTR_EDGES) ?
"Edges" :
"Lanes";
1649 FXTreeItem* symbolListItem = addListItem(treeItem, symbolType,
GUIIconSubSys::getIcon(symbolIcon),
false);
1651 for (
const auto& symbol : symbols) {
1652 showHierarchicalElementChildren(symbol, symbolListItem);
1657 if (!additional->getTagProperty().isSymbol()) {
1658 showHierarchicalElementChildren(additional, treeItem);
1663 showHierarchicalElementChildren(demandElement, treeItem);
1667 FXTreeItem* dataElementItem = addListItem(HE, itemParent);
1673 showHierarchicalElementChildren(interval.second, dataElementItem);
1679 showHierarchicalElementChildren(genericData, dataElementItem);
1689 FXTreeItem* item = myTreeListDinamic->insertItem(
nullptr, itemParent, (prefix + AC->
getHierarchyName() + sufix).c_str(), AC->
getIcon(), AC->
getIcon());
1691 myTreeItemToACMap[item] = AC;
1693 item->setExpanded(
true);
1702 FXTreeItem* item = myTreeListDinamic->insertItem(
nullptr, itemParent, text.c_str(), icon, icon);
1704 item->setExpanded(expanded);
1715 myFrameParent(frameParent),
1716 myDeleteLastCreatedPoint(false) {
1722 std::ostringstream information;
1724 <<
"- 'Start drawing' or ENTER\n"
1725 <<
" to create shape.\n"
1726 <<
"- 'Stop drawing' or ENTER to\n"
1727 <<
" finish shape creation.\n"
1728 <<
"- 'Abort drawing' or ESC to\n"
1729 <<
" abort shape creation.\n"
1730 <<
"- 'Shift + Click' to remove\n"
1731 <<
" last inserted point.";
1746 FXGroupBoxModule::show();
1754 FXGroupBoxModule::hide();
1763 myStartDrawingButton->disable();
1764 myStopDrawingButton->enable();
1765 myAbortDrawingButton->enable();
1773 if (myFrameParent->shapeDrawed()) {
1775 myTemporalShape.clear();
1777 myStartDrawingButton->enable();
1778 myStopDrawingButton->disable();
1779 myAbortDrawingButton->disable();
1790 myTemporalShape.clear();
1792 myStartDrawingButton->enable();
1793 myStopDrawingButton->disable();
1794 myAbortDrawingButton->disable();
1800 if (myStopDrawingButton->isEnabled()) {
1801 myTemporalShape.push_back(P);
1803 throw ProcessError(
"A new point cannot be added if drawing wasn't started");
1810 if (myTemporalShape.size() > 1) {
1811 myTemporalShape.pop_back();
1818 return myTemporalShape;
1824 return myStopDrawingButton->isEnabled();
1830 myDeleteLastCreatedPoint = value;
1836 return myDeleteLastCreatedPoint;
1866 myFrameParent(frameParent) {
1881 for (
int i = 0; i < myParentsList->getNumItems(); i++) {
1882 if (myParentsList->isItemSelected(i)) {
1883 return myParentsList->getItem(i)->getText().text();
1893 for (
int i = 0; i < myParentsList->getNumItems(); i++) {
1894 myParentsList->getItem(i)->setSelected(
false);
1897 for (
int i = 0; i < myParentsList->getNumItems(); i++) {
1898 if (myParentsList->getItem(i)->getText().text() ==
id) {
1899 myParentsList->getItem(i)->setSelected(
true);
1903 myParentsList->recalc();
1909 if (parentTags.size() > 0) {
1910 myParentTags = parentTags;
1911 myParentsLabel->setText((
"Parent type: " +
toString(parentTags.front())).c_str());
1912 refreshSelectorParentModule();
1915 myParentTags.clear();
1923 myParentTags.clear();
1931 std::set<std::string> selectedItems;
1932 for (
int i = 0; i < myParentsList->getNumItems(); i++) {
1933 if (myParentsList->isItemSelected(i)) {
1934 selectedItems.insert(myParentsList->getItem(i)->getText().text());
1937 myParentsList->clearItems();
1938 if (myParentTags.size() > 0) {
1940 std::set<std::string> IDs;
1942 for (
const auto& parentTag : myParentTags) {
1946 if (tagProperty.isAdditionalElement()) {
1947 for (
const auto& additional : myFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getAdditionals().at(parentTag)) {
1948 IDs.insert(additional->getID().c_str());
1953 for (
const auto& ID : IDs) {
1954 const int item = myParentsList->appendItem(ID.c_str());
1955 if (selectedItems.find(ID) != selectedItems.end()) {
1956 myParentsList->selectItem(item);
1968 myFrameParent(frameParent),
1978 myFrameParent(frameParent),
1979 myFilteredTag(filteredTag),
1992 myOverlappedACs.clear();
1999 if (myFrameParent->getViewNet()->getEditModes().isCurrentSupermodeDemand() &&
2000 !AC->getTagProperty().isDemandElement()) {
2004 if (myFrameParent->getViewNet()->getEditModes().isCurrentSupermodeData() &&
2005 !AC->getTagProperty().isGenericData()) {
2009 if ((myFilteredTag !=
SUMO_TAG_NOTHING) && (AC->getTagProperty().getTag() != myFilteredTag)) {
2013 myOverlappedACs.push_back(AC);
2017 if (myOverlappedACs.size() > 1) {
2018 mySavedClickedPosition = clickedPosition;
2022 myCurrentIndexButton->setText((
"1 / " +
toString(myOverlappedACs.size())).c_str());
2024 myOverlappedElementList->clearItems();
2025 for (
int i = 0; i < (int)myOverlappedACs.size(); i++) {
2026 myOverlappedElementList->insertItem(i, myOverlappedACs.at(i)->getID().c_str(), myOverlappedACs.at(i)->getIcon());
2029 myOverlappedElementList->getItem(0)->setSelected(TRUE);
2031 myOverlappedElementList->hide();
2057 return (
int)myOverlappedACs.size();
2063 return (mySavedClickedPosition.distanceSquaredTo2D(clickedPosition) < 0.25);
2072 if (checkSavedPosition(clickedPosition)) {
2074 onCmdNextElement(0, 0, 0);
2090 if (checkSavedPosition(clickedPosition)) {
2092 onCmdPreviousElement(0, 0, 0);
2106 if (myOverlappedElementList->getNumItems() > 0) {
2108 myOverlappedElementList->getItem((
int)myItemIndex)->setSelected(FALSE);
2110 if (myItemIndex > 0) {
2113 myItemIndex = (myOverlappedACs.size() - 1);
2116 myOverlappedElementList->getItem((
int)myItemIndex)->setSelected(TRUE);
2117 myOverlappedElementList->update();
2119 myCurrentIndexButton->setText((
toString(myItemIndex + 1) +
" / " +
toString(myOverlappedACs.size())).c_str());
2121 myFrameParent->selectedOverlappedElement(myOverlappedACs.at(myItemIndex));
2132 if (myOverlappedElementList->getNumItems() > 0) {
2134 myOverlappedElementList->getItem((
int)myItemIndex)->setSelected(FALSE);
2136 myItemIndex = (myItemIndex + 1) % myOverlappedACs.size();
2138 myOverlappedElementList->getItem((
int)myItemIndex)->setSelected(TRUE);
2139 myOverlappedElementList->update();
2141 myCurrentIndexButton->setText((
toString(myItemIndex + 1) +
" / " +
toString(myOverlappedACs.size())).c_str());
2143 myFrameParent->selectedOverlappedElement(myOverlappedACs.at(myItemIndex));
2154 if (myOverlappedElementList->shown()) {
2155 myOverlappedElementList->hide();
2157 myOverlappedElementList->show();
2159 if (myOverlappedElementList->getNumItems() <= 10) {
2160 myOverlappedElementList->setHeight(23 * myOverlappedElementList->getNumItems());
2162 myOverlappedElementList->setHeight(230);
2164 myOverlappedElementList->recalc();
2172 for (
int i = 0; i < myOverlappedElementList->getNumItems(); i++) {
2173 if (myOverlappedElementList->getItem(i)->isSelected()) {
2176 myCurrentIndexButton->setText((
toString(myItemIndex + 1) +
" / " +
toString(myOverlappedACs.size())).c_str());
2178 myFrameParent->selectedOverlappedElement(myOverlappedACs.at(myItemIndex));
2190 FXDialogBox* helpDialog =
new FXDialogBox(getCollapsableFrame(),
"GEO attributes Help",
GUIDesignDialogBox);
2191 std::ostringstream help;
2193 <<
" - Click in the same position\n"
2194 <<
" for inspect next element\n"
2195 <<
" - Shift + Click in the same\n"
2196 <<
" position for inspect\n"
2197 <<
" previous element";
2201 helpDialog->create();
2208 myFrameParent(nullptr),
2209 myPreviousElement(nullptr),
2210 myCurrentIndexButton(nullptr),
2211 myNextElement(nullptr),
2212 myOverlappedElementList(nullptr),
2213 myHelpButton(nullptr),
2231 myOverlappedElementList->hide();
2242 myFromBusStop(
nullptr),
2243 myToBusStop(
nullptr),
2244 myConflictVClass(
false),
2245 myConflictDisconnected(
false) {
2247 if (edge->getNBEdge()->getNumLanesThatAllow(vClass) == 0) {
2248 myConflictVClass =
true;
2254 myFromBusStop(nullptr),
2255 myToBusStop(nullptr),
2256 myConflictVClass(false),
2257 myConflictDisconnected(false) {
2273 const std::vector<GNEEdge*>&
2280 return myFromBusStop;
2291 return myConflictVClass;
2297 return myConflictDisconnected;
2302 myFromBusStop(nullptr),
2303 myToBusStop(nullptr),
2304 myConflictVClass(false),
2305 myConflictDisconnected(false) {
2332 "SHIFT-click: ignore vClass",
2336 "CTRL-click: add disconnected",
2340 "BACKSPACE: undo click",
2351 bool showPathCreator =
true;
2353 abortPathCreation();
2355 myFinishCreationButton->disable();
2356 myAbortCreationButton->disable();
2357 myRemoveLastInsertedElement->disable();
2362 myCreationMode |= REQUIRE_FIRSTELEMENT;
2366 myCreationMode |= CONSECUTIVE_EDGES;
2368 myCreationMode |= NONCONSECUTIVE_EDGES;
2375 myCreationMode |= SHOW_CANDIDATE_EDGES;
2376 myCreationMode |= START_EDGE;
2377 myCreationMode |= END_EDGE;
2383 myCreationMode |= SINGLE_ELEMENT;
2384 myCreationMode |=
ROUTE;
2390 myCreationMode |= SHOW_CANDIDATE_EDGES;
2391 myCreationMode |= START_EDGE;
2392 myCreationMode |= END_EDGE;
2396 myCreationMode |= SHOW_CANDIDATE_JUNCTIONS;
2397 myCreationMode |= START_JUNCTION;
2398 myCreationMode |= END_JUNCTION;
2399 myCreationMode |= ONLY_FROMTO;
2403 myCreationMode |= SHOW_CANDIDATE_EDGES;
2404 myCreationMode |= START_EDGE;
2405 myCreationMode |= END_EDGE;
2411 myCreationMode |= SHOW_CANDIDATE_EDGES;
2412 myCreationMode |= ONLY_FROMTO;
2413 myCreationMode |= START_EDGE;
2414 myCreationMode |= END_EDGE;
2420 myCreationMode |= SHOW_CANDIDATE_EDGES;
2421 myCreationMode |= ONLY_FROMTO;
2422 myCreationMode |= END_BUSSTOP;
2427 myCreationMode |= SHOW_CANDIDATE_JUNCTIONS;
2428 myCreationMode |= START_JUNCTION;
2429 myCreationMode |= END_JUNCTION;
2430 myCreationMode |= ONLY_FROMTO;
2434 myCreationMode |= SINGLE_ELEMENT;
2435 myCreationMode |= END_BUSSTOP;
2438 myCreationMode |= SINGLE_ELEMENT;
2439 myCreationMode |= START_EDGE;
2443 myCreationMode |= ONLY_FROMTO;
2444 myCreationMode |= START_EDGE;
2445 myCreationMode |= END_EDGE;
2448 showPathCreator =
false;
2453 updateJunctionColors();
2455 if (showPathCreator) {
2493 if (((myCreationMode & START_JUNCTION) + (myCreationMode & END_JUNCTION)) == 0) {
2497 if ((myCreationMode & SINGLE_ELEMENT) && (mySelectedJunctions.size() == 1)) {
2501 if (mySelectedJunctions.size() > 0) {
2503 if (mySelectedJunctions.back() == junction) {
2511 if (mySelectedJunctions.size() == 2 && (myCreationMode & Mode::ONLY_FROMTO)) {
2518 mySelectedJunctions.push_back(junction);
2520 myAbortCreationButton->enable();
2522 myFinishCreationButton->enable();
2524 myFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->disableUndoRedo(
"route creation");
2526 if (mySelectedJunctions.size() > 1) {
2527 myRemoveLastInsertedElement->enable();
2529 myRemoveLastInsertedElement->disable();
2534 updateInfoRouteLabel();
2536 updateJunctionColors();
2544 if (((myCreationMode & CONSECUTIVE_EDGES) + (myCreationMode & NONCONSECUTIVE_EDGES) +
2545 (myCreationMode & START_EDGE) + (myCreationMode & END_EDGE)) == 0) {
2549 if ((myCreationMode & SINGLE_ELEMENT) && (mySelectedEdges.size() == 1)) {
2553 if (mySelectedEdges.size() > 0) {
2555 if (mySelectedEdges.back() == edge) {
2562 if (myCreationMode & Mode::CONSECUTIVE_EDGES) {
2564 const auto& outgoingEdges = mySelectedEdges.back()->getToJunction()->getGNEOutgoingEdges();
2565 if (std::find(outgoingEdges.begin(), outgoingEdges.end(), edge) == outgoingEdges.end()) {
2574 if (mySelectedEdges.size() == 2 && (myCreationMode & Mode::ONLY_FROMTO)) {
2583 if (!shiftKeyPressed) {
2585 WRITE_WARNING(
"Invalid edge (SHIFT + click to add an invalid vClass edge)");
2590 if (!controlKeyPressed) {
2592 WRITE_WARNING(
"Invalid edge (CONTROL + click to add a disconnected edge)");
2599 mySelectedEdges.push_back(edge);
2601 myAbortCreationButton->enable();
2603 myFinishCreationButton->enable();
2605 myFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->disableUndoRedo(
"route creation");
2607 if (mySelectedEdges.size() > 1) {
2608 myRemoveLastInsertedElement->enable();
2610 myRemoveLastInsertedElement->disable();
2615 updateInfoRouteLabel();
2622 const std::vector<GNEEdge*>&
2624 return mySelectedEdges;
2628 const std::vector<GNEJunction*>&
2630 return mySelectedJunctions;
2637 if ((myCreationMode & END_BUSSTOP) == 0) {
2641 if (myToStoppingPlace) {
2644 myToStoppingPlace = stoppingPlace;
2647 myAbortCreationButton->enable();
2649 myFinishCreationButton->enable();
2651 myFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->disableUndoRedo(
"route creation");
2653 if (myToStoppingPlace) {
2654 myRemoveLastInsertedElement->enable();
2656 myRemoveLastInsertedElement->disable();
2661 updateInfoRouteLabel();
2670 if (myToStoppingPlace && (myToStoppingPlace->getTagProperty().getTag() == expectedTag)) {
2671 return myToStoppingPlace;
2681 if ((myCreationMode &
ROUTE) == 0) {
2692 updateInfoRouteLabel();
2704 updateInfoRouteLabel();
2715 const std::vector<GNEFrameModules::PathCreator::Path>&
2723 return (myShowCandidateEdges->getCheck() == TRUE);
2730 clearJunctionColors();
2732 if (myCreationMode & SHOW_CANDIDATE_JUNCTIONS) {
2734 for (
const auto& junction : myFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getJunctions()) {
2735 junction.second->resetCandidateFlags();
2736 junction.second->setPossibleCandidate(
true);
2740 if (mySelectedJunctions.size() > 0) {
2742 for (
const auto& junction : mySelectedJunctions) {
2743 junction->resetCandidateFlags();
2744 junction->setSourceCandidate(
true);
2747 mySelectedJunctions.back()->resetCandidateFlags();
2748 mySelectedJunctions.back()->setTargetCandidate(
true);
2751 myFrameParent->getViewNet()->updateViewNet();
2760 if (myShowCandidateEdges->getCheck() == TRUE && (myCreationMode & SHOW_CANDIDATE_EDGES)) {
2762 for (
const auto& edge : myFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getEdges()) {
2763 if (edge.second->getNBEdge()->getNumLanesThatAllow(myVClass) > 0) {
2764 edge.second->setPossibleCandidate(
true);
2766 edge.second->setSpecialCandidate(
true);
2771 if (mySelectedEdges.size() > 0) {
2773 if ((myShowCandidateEdges->getCheck() == TRUE) && (myCreationMode & SHOW_CANDIDATE_EDGES)) {
2775 for (
const auto& edge : myFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getEdges()) {
2776 edge.second->resetCandidateFlags();
2777 edge.second->setConflictedCandidate(
true);
2780 setSpecialCandidates(mySelectedEdges.back());
2782 for (
const auto& edge : myFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getEdges()) {
2783 edge.second->setConflictedCandidate(
true);
2786 setPossibleCandidates(mySelectedEdges.back(), myVClass);
2789 for (
const auto& edge : mySelectedEdges) {
2790 edge->resetCandidateFlags();
2791 edge->setSourceCandidate(
true);
2794 mySelectedEdges.back()->resetCandidateFlags();
2795 mySelectedEdges.back()->setTargetCandidate(
true);
2798 myFrameParent->getViewNet()->updateViewNet();
2805 for (
const auto& junction : myFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getJunctions()) {
2806 junction.second->resetCandidateFlags();
2814 for (
const auto& edge : myFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getEdges()) {
2815 edge.second->resetCandidateFlags();
2822 const double lineWidth = 0.35;
2823 const double lineWidthin = 0.25;
2827 glTranslated(0, 0,
GLO_MAX - 0.1);
2829 if (myPath.size() > 0) {
2833 for (
int i = 0; i < (int)myPath.size(); i++) {
2837 for (
int j = 0; j < (int)path.
getSubPath().size(); j++) {
2839 if (((i == 0) && (j == 0)) || (j > 0)) {
2843 if ((j + 1) < (
int)path.
getSubPath().size()) {
2853 glTranslated(0, 0, 0.1);
2855 for (
int i = 0; i < (int)myPath.size(); i++) {
2859 if ((myCreationMode & SHOW_CANDIDATE_EDGES) == 0) {
2869 for (
int j = 0; j < (int)path.
getSubPath().size(); j++) {
2871 if (((i == 0) && (j == 0)) || (j > 0)) {
2875 if ((j + 1) < (
int)path.
getSubPath().size()) {
2885 }
else if (mySelectedJunctions.size() > 0) {
2889 for (
int i = 0; i < (int)mySelectedJunctions.size() - 1; i++) {
2891 const Position posA = mySelectedJunctions.at(i)->getPositionInView();
2892 const Position posB = mySelectedJunctions.at(i + 1)->getPositionInView();
2893 const double rot = ((double)atan2((posB.
x() - posA.
x()), (posA.
y() - posB.
y())) * (double) 180.0 / (
double)
M_PI);
2907 myFrameParent->createPath();
2914 if ((mySelectedJunctions.size() > 0) || (mySelectedEdges.size() > 0) || myToStoppingPlace || myRoute) {
2916 myFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->enableUndoRedo();
2920 myFinishCreationButton->disable();
2921 myAbortCreationButton->disable();
2922 myRemoveLastInsertedElement->disable();
2924 updateInfoRouteLabel();
2926 updateJunctionColors();
2930 myFrameParent->getViewNet()->updateViewNet();
2937 if (mySelectedEdges.size() > 1) {
2939 mySelectedEdges.back()->resetCandidateFlags();
2941 mySelectedEdges.pop_back();
2943 if ((mySelectedEdges.size() > 0) && mySelectedEdges.back()->isSourceCandidate()) {
2944 mySelectedEdges.back()->setSourceCandidate(
false);
2945 mySelectedEdges.back()->setTargetCandidate(
true);
2948 if (mySelectedEdges.size() > 1) {
2949 myRemoveLastInsertedElement->enable();
2951 myRemoveLastInsertedElement->disable();
2956 updateInfoRouteLabel();
2958 updateJunctionColors();
2962 myFrameParent->getViewNet()->updateViewNet();
2978 abortPathCreation();
2986 removeLastElement();
2994 if (myShowCandidateEdges->getCheck() == TRUE) {
2995 myShiftLabel->show();
2996 myControlLabel->show();
2998 myShiftLabel->hide();
2999 myControlLabel->hide();
3011 if (myPath.size() > 0) {
3016 for (
const auto& path : myPath) {
3017 for (
const auto& edge : path.getSubPath()) {
3018 length += edge->getNBEdge()->getLength();
3019 speed += edge->getNBEdge()->getSpeed();
3021 pathSize += (int)path.getSubPath().size();
3024 std::ostringstream information;
3026 <<
"- Selected edges: " <<
toString(mySelectedEdges.size()) <<
"\n"
3027 <<
"- Path edges: " <<
toString(pathSize) <<
"\n"
3028 <<
"- Length: " <<
toString(length) <<
"\n"
3029 <<
"- Average speed: " <<
toString(speed / pathSize);
3031 myInfoRouteLabel->setText(information.str().c_str());
3033 myInfoRouteLabel->setText(
"No edges selected");
3041 clearJunctionColors();
3044 mySelectedJunctions.clear();
3045 mySelectedEdges.clear();
3046 myToStoppingPlace =
nullptr;
3051 updateInfoRouteLabel();
3060 std::vector<GNEEdge*> edges;
3063 edges = myRoute->getParentEdges();
3066 for (
const auto& edge : mySelectedEdges) {
3067 edges.push_back(edge);
3070 if (myToStoppingPlace) {
3071 edges.push_back(myToStoppingPlace->getParentLanes().front()->getParentEdge());
3075 if (edges.size() == 1) {
3076 myPath.push_back(
Path(myVClass, edges.front()));
3079 for (
int i = 1; i < (int)edges.size(); i++) {
3080 myPath.push_back(
Path(myFrameParent->getViewNet(), myVClass, edges.at(i - 1), edges.at(i)));
3089 myFrameParent->getViewNet()->getNet()->getPathManager()->getPathCalculator()->calculateReachability(
SVC_PEDESTRIAN, originEdge);
3091 for (
const auto& edge : myFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getEdges()) {
3092 for (
const auto& lane : edge.second->getLanes()) {
3093 if (lane->getReachability() > 0) {
3094 lane->getParentEdge()->resetCandidateFlags();
3095 lane->getParentEdge()->setSpecialCandidate(
true);
3104 myFrameParent->getViewNet()->getNet()->getPathManager()->getPathCalculator()->calculateReachability(vClass, originEdge);
3106 for (
const auto& edge : myFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getEdges()) {
3107 for (
const auto& lane : edge.second->getLanes()) {
3108 if (lane->getReachability() > 0) {
3109 lane->getParentEdge()->resetCandidateFlags();
3110 lane->getParentEdge()->setPossibleCandidate(
true);
3123 FXLabel* legendLabel =
nullptr;
3167 FXLabel* colorLabel =
new FXLabel(horizontalFrameColors,
"",
nullptr,
GUIDesignLabelLeft);