142 myFrameParent(frameParent),
144 myCurrentTemplateAC(
nullptr) {
148 setCurrentTagType(myTagType, onlyDrawables,
false);
150 setCurrentTag(tag,
false);
179 return myCurrentTemplateAC;
191 case GNETagProperties::TagType::NETWORKELEMENT:
192 setText(
"network elements");
194 case GNETagProperties::TagType::ADDITIONALELEMENT:
195 setText(
"Additional elements");
197 case GNETagProperties::TagType::SHAPE:
198 setText(
"Shape elements");
200 case GNETagProperties::TagType::TAZELEMENT:
201 setText(
"TAZ elements");
203 case GNETagProperties::TagType::VEHICLE:
206 case GNETagProperties::TagType::STOP:
209 case GNETagProperties::TagType::PERSON:
212 case GNETagProperties::TagType::PERSONPLAN:
213 setText(
"Person plans");
215 case GNETagProperties::TagType::CONTAINER:
216 setText(
"Container");
218 case GNETagProperties::TagType::CONTAINERPLAN:
219 setText(
"Container plans");
221 case GNETagProperties::TagType::PERSONTRIP:
222 setText(
"Person trips");
224 case GNETagProperties::TagType::WALK:
227 case GNETagProperties::TagType::RIDE:
230 case GNETagProperties::TagType::STOPPERSON:
231 setText(
"Person stops");
237 for (
const auto &
ACTemplate : myACTemplates) {
240 myACTemplates.clear();
241 myTagsMatchBox->clearItems();
245 for (
const auto &tagProperty : tagProperties) {
246 if ((!onlyDrawables || tagProperty.isDrawable()) && (!tagProperty.requireProj() || proj)) {
247 myACTemplates.push_back(
new ACTemplate(myFrameParent->getViewNet()->getNet(), tagProperty));
248 myTagsMatchBox->appendIconItem(tagProperty.getFieldString().c_str(),
GUIIconSubSys::getIcon(tagProperty.getGUIIcon()), tagProperty.getBackGroundColor());
252 myTagsMatchBox->setTextColor(FXRGB(0, 0, 0));
254 myTagsMatchBox->setNumVisible((
int)myTagsMatchBox->getNumItems());
256 myCurrentTemplateAC = myACTemplates.front()->
getAC();
258 if (notifyFrameParent) {
259 myFrameParent->tagSelected();
267 myCurrentTemplateAC =
nullptr;
269 for (
int i = 0; i < (int)myACTemplates.size(); i++) {
270 if (myACTemplates.at(i)->getAC() && (myACTemplates.at(i)->getAC()->getTagProperty().getTag() == newTag)) {
272 myCurrentTemplateAC = myACTemplates.at(i)->getAC();
273 myTagsMatchBox->setCurrentItem(i);
275 myTagsMatchBox->setTextColor(FXRGB(0, 0, 0));
279 if (notifyFrameParent) {
280 myFrameParent->tagSelected();
288 myFrameParent->tagSelected();
295 for (
int i = 0; i < (int)myACTemplates.size(); i++) {
296 if (myACTemplates.at(i)->getAC() && myACTemplates.at(i)->getAC()->getTagProperty().getFieldString() == myTagsMatchBox->getText().text()) {
298 myCurrentTemplateAC = myACTemplates.at(i)->getAC();
299 myTagsMatchBox->setCurrentItem(i);
301 myTagsMatchBox->setTextColor(FXRGB(0, 0, 0));
303 myFrameParent->tagSelected();
305 WRITE_DEBUG((
"Selected item '" + myTagsMatchBox->getText() +
"' in TagSelector").text());
310 myCurrentTemplateAC =
nullptr;
312 myTagsMatchBox->setTextColor(FXRGB(255, 0, 0));
314 WRITE_DEBUG(
"Selected invalid item in TagSelector");
316 myFrameParent->tagSelected();
330 switch (tagProperty.
getTag()) {
485 throw ProcessError(
"Non-supported tagProperty in ACTemplate");
502 myCurrentDemandElement(nullptr),
503 myDemandElementTags({demandElementTag}) {
507 refreshDemandElementSelector();
515 myFrameParent(frameParent),
516 myCurrentDemandElement(nullptr) {
518 for (
const auto& tagType : tagTypes) {
520 for (
const auto& tagProperty : tagProperties) {
538 return myCurrentDemandElement;
542 const std::vector<SumoXMLTag>&
544 return myDemandElementTags;
551 if (std::find(myDemandElementTags.begin(), myDemandElementTags.end(), demandElement->
getTagProperty().
getTag()) != myDemandElementTags.end()) {
553 myDemandElementsMatchBox->setItem(demandElement->
getID().c_str(), demandElement->
getIcon());
555 myCurrentDemandElement = demandElement;
557 myFrameParent->demandElementSelected();
565 refreshDemandElementSelector();
567 if (myCurrentDemandElement) {
568 myDemandElementsMatchBox->setItem(myCurrentDemandElement->getID().c_str(), myCurrentDemandElement->getIcon());
569 }
else if (myDemandElementTags.size() == 1) {
572 myDemandElementsMatchBox->setItem(defaultVType->getID().c_str(), defaultVType->getIcon());
575 myDemandElementsMatchBox->setItem(defaultPType->getID().c_str(), defaultPType->getIcon());
578 onCmdSelectDemandElement(
nullptr, 0,
nullptr);
598 const auto& demandElements = myFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getDemandElements();
600 myDemandElementsMatchBox->clearItems();
602 for (
const auto& demandElementTag : myDemandElementTags) {
609 for (
const auto& vType : demandElements.at(demandElementTag)) {
612 myDemandElementsMatchBox->appendIconItem(vType->getID().c_str(), vType->getIcon());
619 for (
const auto& pType : demandElements.at(demandElementTag)) {
622 myDemandElementsMatchBox->appendIconItem(pType->getID().c_str(), pType->getIcon());
627 for (
const auto& demandElement : demandElements.at(demandElementTag)) {
628 myDemandElementsMatchBox->appendIconItem(demandElement->getID().c_str(), demandElement->getIcon());
633 if (myDemandElementsMatchBox->getNumItems() < 10) {
634 myDemandElementsMatchBox->setNumVisible((
int)myDemandElementsMatchBox->getNumItems());
636 myDemandElementsMatchBox->setNumVisible(10);
639 if (myDemandElementsMatchBox->getNumItems() == 0) {
640 myCurrentDemandElement =
nullptr;
641 }
else if (myCurrentDemandElement) {
642 for (
int i = 0; i < myDemandElementsMatchBox->getNumItems(); i++) {
643 if (myDemandElementsMatchBox->getItem(i).text() == myCurrentDemandElement->getID()) {
644 myDemandElementsMatchBox->setCurrentItem(i, FALSE);
650 myCurrentDemandElement = myFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getDefaultVType();
652 myCurrentDemandElement = myFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getDefaultPType();
655 myCurrentDemandElement =
nullptr;
657 for (
auto i = myDemandElementTags.begin(); (i != myDemandElementTags.end()) && (myCurrentDemandElement ==
nullptr); i++) {
658 if (demandElements.at(*i).size() > 0) {
659 myCurrentDemandElement = *demandElements.at(*i).begin();
669 if (myCurrentDemandElement ==
nullptr) {
672 if (!myCurrentDemandElement->getTagProperty().isPerson()) {
675 if (myCurrentDemandElement->getChildDemandElements().empty()) {
700 return lastPersonPlan->
getParentAdditionals().back()->getParentLanes().front()->getParentEdge();
712 if (myCurrentDemandElement ==
nullptr) {
715 if (!myCurrentDemandElement->getTagProperty().isContainer()) {
718 if (myCurrentDemandElement->getChildDemandElements().empty()) {
739 return lastContainerPlan->
getParentAdditionals().back()->getParentLanes().front()->getParentEdge();
749 for (
const auto& demandElementTag : myDemandElementTags) {
750 for (
const auto& demandElement : myFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getDemandElements().at(demandElementTag)) {
751 if (demandElement->getID() == myDemandElementsMatchBox->getText().text()) {
753 myDemandElementsMatchBox->setTextColor(FXRGB(0, 0, 0));
755 myCurrentDemandElement = demandElement;
757 myFrameParent->demandElementSelected();
759 WRITE_DEBUG((
"Selected item '" + myDemandElementsMatchBox->getText() +
"' in DemandElementSelector").text());
765 myCurrentDemandElement =
nullptr;
767 myFrameParent->demandElementSelected();
769 myDemandElementsMatchBox->setTextColor(FXRGB(255, 0, 0));
771 WRITE_DEBUG(
"Selected invalid item in DemandElementSelector");
781 myFrameParent(frameParent),
783 myClickedAC(nullptr),
784 myClickedJunction(nullptr),
785 myClickedEdge(nullptr),
786 myClickedLane(nullptr),
787 myClickedCrossing(nullptr),
788 myClickedConnection(nullptr),
789 myClickedShape(nullptr),
790 myClickedTAZElement(nullptr),
791 myClickedAdditional(nullptr),
792 myClickedDemandElement(nullptr),
793 myClickedDataSet(nullptr),
794 myClickedDataInterval(nullptr),
795 myClickedGenericData(nullptr) {
811 refreshHierarchicalElementTree();
813 myTreeListDinamic->show();
824 myClickedAC =
nullptr;
825 myClickedJunction =
nullptr;
826 myClickedEdge =
nullptr;
827 myClickedLane =
nullptr;
828 myClickedCrossing =
nullptr;
829 myClickedConnection =
nullptr;
830 myClickedShape =
nullptr;
831 myClickedTAZElement =
nullptr;
832 myClickedAdditional =
nullptr;
833 myClickedDemandElement =
nullptr;
834 myClickedDataSet =
nullptr;
835 myClickedDataInterval =
nullptr;
836 myClickedGenericData =
nullptr;
838 myTreeListDinamic->hide();
847 myTreeListDinamic->clearItems();
848 myTreeItemToACMap.clear();
849 myTreeItemsConnections.clear();
852 showHierarchicalElementChildren(myHE, showAttributeCarrierParents());
869 FXEvent* e = (FXEvent*)eventData;
871 FXTreeItem* item = myTreeListDinamic->getItemAt(e->win_x, e->win_y);
873 if (item && (myTreeItemsConnections.find(item) == myTreeItemsConnections.end())) {
874 createPopUpMenu(e->root_x, e->root_y, myTreeItemToACMap[item]);
883 if (myClickedJunction) {
884 myFrameParent->myViewNet->centerTo(myClickedJunction->getGlID(),
true, -1);
885 }
else if (myClickedEdge) {
886 myFrameParent->myViewNet->centerTo(myClickedEdge->getGlID(),
true, -1);
887 }
else if (myClickedLane) {
888 myFrameParent->myViewNet->centerTo(myClickedLane->getGlID(),
true, -1);
889 }
else if (myClickedCrossing) {
890 myFrameParent->myViewNet->centerTo(myClickedCrossing->getGlID(),
true, -1);
891 }
else if (myClickedConnection) {
892 myFrameParent->myViewNet->centerTo(myClickedConnection->getGlID(),
true, -1);
893 }
else if (myClickedAdditional) {
894 myFrameParent->myViewNet->centerTo(myClickedAdditional->getGlID(),
true, -1);
895 }
else if (myClickedShape) {
896 myFrameParent->myViewNet->centerTo(myClickedShape->getGlID(),
true, -1);
897 }
else if (myClickedTAZElement) {
898 myFrameParent->myViewNet->centerTo(myClickedTAZElement->getGlID(),
true, -1);
899 }
else if (myClickedDemandElement) {
900 myFrameParent->myViewNet->centerTo(myClickedDemandElement->getGlID(),
true, -1);
901 }
else if (myClickedGenericData) {
902 myFrameParent->myViewNet->centerTo(myClickedGenericData->getGlID(),
true, -1);
905 myFrameParent->myViewNet->updateViewNet();
912 if ((myHE !=
nullptr) && (myClickedAC !=
nullptr)) {
913 myFrameParent->myViewNet->getViewParent()->getInspectorFrame()->inspectChild(myClickedAC, myHE);
922 if (myClickedJunction) {
923 myFrameParent->myViewNet->getNet()->deleteJunction(myClickedJunction, myFrameParent->myViewNet->getUndoList());
924 }
else if (myClickedEdge) {
925 myFrameParent->myViewNet->getNet()->deleteEdge(myClickedEdge, myFrameParent->myViewNet->getUndoList(),
false);
926 }
else if (myClickedLane) {
927 myFrameParent->myViewNet->getNet()->deleteLane(myClickedLane, myFrameParent->myViewNet->getUndoList(),
false);
928 }
else if (myClickedCrossing) {
929 myFrameParent->myViewNet->getNet()->deleteCrossing(myClickedCrossing, myFrameParent->myViewNet->getUndoList());
930 }
else if (myClickedConnection) {
931 myFrameParent->myViewNet->getNet()->deleteConnection(myClickedConnection, myFrameParent->myViewNet->getUndoList());
932 }
else if (myClickedAdditional) {
933 myFrameParent->myViewNet->getNet()->deleteAdditional(myClickedAdditional, myFrameParent->myViewNet->getUndoList());
934 }
else if (myClickedShape) {
935 myFrameParent->myViewNet->getNet()->deleteShape(myClickedShape, myFrameParent->myViewNet->getUndoList());
936 }
else if (myClickedTAZElement) {
937 myFrameParent->myViewNet->getNet()->deleteTAZElement(myClickedTAZElement, myFrameParent->myViewNet->getUndoList());
938 }
else if (myClickedDemandElement) {
940 if ((myClickedDemandElement->getTagProperty().getTag() ==
SUMO_TAG_VTYPE) && (GNEAttributeCarrier::parse<bool>(myClickedDemandElement->getAttribute(
GNE_ATTR_DEFAULT_VTYPE)))) {
943 }
else if (myClickedDemandElement->getTagProperty().isPersonPlan() && (myClickedDemandElement->getParentDemandElements().front()->getChildDemandElements().size() == 1)) {
945 myFrameParent->myViewNet->getNet()->deleteDemandElement(myClickedDemandElement->getParentDemandElements().front(), myFrameParent->myViewNet->getUndoList());
947 myFrameParent->myViewNet->getNet()->deleteDemandElement(myClickedDemandElement, myFrameParent->myViewNet->getUndoList());
949 }
else if (myClickedDataSet) {
950 myFrameParent->myViewNet->getNet()->deleteDataSet(myClickedDataSet, myFrameParent->myViewNet->getUndoList());
951 }
else if (myClickedDataInterval) {
953 if (myClickedDataInterval->getDataSetParent()->getDataIntervalChildren().size() == 1) {
954 myFrameParent->myViewNet->getNet()->deleteDataSet(myClickedDataInterval->getDataSetParent(), myFrameParent->myViewNet->getUndoList());
956 myFrameParent->myViewNet->getNet()->deleteDataInterval(myClickedDataInterval, myFrameParent->myViewNet->getUndoList());
958 }
else if (myClickedGenericData) {
960 if (myClickedGenericData->getDataIntervalParent()->getGenericDataChildren().size() == 1) {
962 if (myClickedGenericData->getDataIntervalParent()->getDataSetParent()->getDataIntervalChildren().size() == 1) {
963 myFrameParent->myViewNet->getNet()->deleteDataSet(myClickedGenericData->getDataIntervalParent()->getDataSetParent(), myFrameParent->myViewNet->getUndoList());
965 myFrameParent->myViewNet->getNet()->deleteDataInterval(myClickedGenericData->getDataIntervalParent(), myFrameParent->myViewNet->getUndoList());
968 myFrameParent->myViewNet->getNet()->deleteGenericData(myClickedGenericData, myFrameParent->myViewNet->getUndoList());
972 myFrameParent->myViewNet->updateViewNet();
974 refreshHierarchicalElementTree();
976 if (myFrameParent->myViewNet->getInspectedAttributeCarriers().size() == 1) {
977 if (myFrameParent->myViewNet->getInspectedAttributeCarriers().front() != myClickedAC) {
978 myFrameParent->myViewNet->getViewParent()->getInspectorFrame()->inspectSingleElement(myFrameParent->myViewNet->getInspectedAttributeCarriers().front());
981 myFrameParent->myViewNet->getViewParent()->getInspectorFrame()->inspectSingleElement(
nullptr);
991 if (myClickedDemandElement) {
992 myFrameParent->myViewNet->getUndoList()->begin(myClickedDemandElement->getTagProperty().getGUIIcon(), (
"moving up " + myClickedDemandElement->getTagStr()).c_str());
994 myFrameParent->myViewNet->getUndoList()->add(
new GNEChange_Children(myClickedDemandElement->getParentDemandElements().at(0), myClickedDemandElement,
995 GNEChange_Children::Operation::MOVE_BACK),
true);
996 myFrameParent->myViewNet->getUndoList()->end();
999 refreshHierarchicalElementTree();
1007 if (myClickedDemandElement) {
1008 myFrameParent->myViewNet->getUndoList()->begin(myClickedDemandElement->getTagProperty().getGUIIcon(), (
"moving down " + myClickedDemandElement->getTagStr()).c_str());
1010 myFrameParent->myViewNet->getUndoList()->add(
new GNEChange_Children(myClickedDemandElement->getParentDemandElements().at(0), myClickedDemandElement,
1011 GNEChange_Children::Operation::MOVE_FRONT),
true);
1012 myFrameParent->myViewNet->getUndoList()->end();
1015 refreshHierarchicalElementTree();
1023 const auto& attributeCarriers = myFrameParent->myViewNet->getNet()->getAttributeCarriers();
1027 myClickedAC = clickedAC;
1029 myClickedJunction = attributeCarriers->retrieveJunction(clickedAC->
getID(),
false);
1030 myClickedEdge = attributeCarriers->retrieveEdge(clickedAC->
getID(),
false);
1031 myClickedLane = attributeCarriers->retrieveLane(clickedAC,
false);
1032 myClickedCrossing = attributeCarriers->retrieveCrossing(clickedAC,
false);
1033 myClickedConnection = attributeCarriers->retrieveConnection(clickedAC,
false);
1034 myClickedShape = attributeCarriers->retrieveShape(clickedAC,
false);
1035 myClickedTAZElement = attributeCarriers->retrieveTAZElement(clickedAC,
false);
1036 myClickedAdditional = attributeCarriers->retrieveAdditional(clickedAC,
false);
1037 myClickedDemandElement = attributeCarriers->retrieveDemandElement(clickedAC,
false);
1038 myClickedDataSet = attributeCarriers->retrieveDataSet(clickedAC,
false);
1039 myClickedDataInterval = attributeCarriers->retrieveDataInterval(clickedAC,
false);
1040 myClickedGenericData = attributeCarriers->retrieveGenericData(clickedAC,
false);
1042 FXMenuPane* pane =
new FXMenuPane(myTreeListDinamic);
1044 new MFXMenuHeader(pane, myFrameParent->myViewNet->getViewParent()->getGUIMainWindow()->getBoldFont(), myClickedAC->getPopUpID().c_str(), myClickedAC->getIcon());
1046 new FXMenuSeparator(pane);
1050 if (myClickedAC->getTagProperty().isVehicleType() || (myClickedAC->getTagProperty().getTag() ==
SUMO_TAG_DATASET) ||
1052 centerMenuCommand->disable();
1059 inspectMenuCommand->disable();
1060 deleteMenuCommand->disable();
1101 myClickedAC =
nullptr;
1102 myClickedJunction =
nullptr;
1103 myClickedEdge =
nullptr;
1104 myClickedLane =
nullptr;
1105 myClickedCrossing =
nullptr;
1106 myClickedConnection =
nullptr;
1107 myClickedShape =
nullptr;
1108 myClickedTAZElement =
nullptr;
1109 myClickedAdditional =
nullptr;
1110 myClickedDemandElement =
nullptr;
1111 myClickedDataSet =
nullptr;
1112 myClickedDataInterval =
nullptr;
1113 myClickedGenericData =
nullptr;
1121 const auto& attributeCarriers = myFrameParent->myViewNet->getNet()->getAttributeCarriers();
1123 if (myHE->getTagProperty().isNetworkElement()) {
1125 switch (myHE->getTagProperty().getTag()) {
1128 GNEEdge* edge = attributeCarriers->retrieveEdge(myHE->getID(),
false);
1133 junctionDestinyItem->setExpanded(
true);
1136 myTreeItemToACMap[junctionDestinyItem] = edge->
getToJunction();
1138 return junctionDestinyItem;
1145 GNELane* lane = attributeCarriers->retrieveLane(myHE->getID(),
false);
1152 junctionDestinyItem->setExpanded(
true);
1154 FXTreeItem* edgeItem = myTreeListDinamic->insertItem(
nullptr, junctionDestinyItem, edge->
getHierarchyName().c_str(), edge->
getIcon(), edge->
getIcon());
1155 edgeItem->setExpanded(
true);
1158 myTreeItemToACMap[junctionDestinyItem] = edge->
getToJunction();
1159 myTreeItemToACMap[edgeItem] = edge;
1168 GNEJunction* junction = attributeCarriers->retrieveCrossing(myHE)->getParentJunction();
1170 FXTreeItem* junctionItem = myTreeListDinamic->insertItem(
nullptr,
nullptr, junction->
getHierarchyName().c_str(), junction->
getIcon(), junction->
getIcon());
1171 junctionItem->setExpanded(
true);
1173 myTreeItemToACMap[junctionItem] = junction;
1175 return junctionItem;
1179 GNEConnection* connection = attributeCarriers->retrieveConnection(myHE->getID(),
false);
1183 edgeFromItem->setExpanded(
true);
1186 edgeToItem->setExpanded(
true);
1188 FXTreeItem* connectionItem = myTreeListDinamic->insertItem(
nullptr, edgeToItem, connection->
getHierarchyName().c_str(), connection->
getIcon(), connection->
getIcon());
1189 connectionItem->setExpanded(
true);
1191 myTreeItemToACMap[edgeFromItem] = connection->
getEdgeFrom();
1192 myTreeItemToACMap[edgeToItem] = connection->
getEdgeTo();
1193 myTreeItemToACMap[connectionItem] = connection;
1195 return connectionItem;
1213 junctionDestinyItem->setExpanded(
true);
1215 FXTreeItem* edgeItem = myTreeListDinamic->insertItem(
nullptr, junctionDestinyItem, edge->
getHierarchyName().c_str(), edge->
getIcon(), edge->
getIcon());
1216 edgeItem->setExpanded(
true);
1219 laneItem->setExpanded(
true);
1222 myTreeItemToACMap[junctionDestinyItem] = edge->
getToJunction();
1223 myTreeItemToACMap[edgeItem] = edge;
1224 myTreeItemToACMap[laneItem] = lane;
1227 }
else if (myHE->getTagProperty().isAdditionalElement()) {
1229 const GNEAdditional* additional = attributeCarriers->retrieveAdditional(myHE);
1231 FXTreeItem* root =
nullptr;
1268 addListItem(
nullptr, (
"..." +
toString((
int)additional->
getParentEdges().size() - 2) +
" edges...").c_str(), 0,
false);
1282 addListItem(
nullptr, (
"..." +
toString((
int)additional->
getParentLanes().size() - 2) +
" lanes...").c_str(), 0,
false);
1290 }
else if (myHE->getTagProperty().isTAZElement()) {
1294 FXTreeItem* root =
nullptr;
1331 addListItem(
nullptr, (
"..." +
toString((
int)TAZElement->
getParentEdges().size() - 2) +
" edges...").c_str(), 0,
false);
1345 addListItem(
nullptr, (
"..." +
toString((
int)TAZElement->
getParentLanes().size() - 2) +
" lanes...").c_str(), 0,
false);
1353 }
else if (myHE->getTagProperty().isDemandElement()) {
1357 FXTreeItem* root =
nullptr;
1394 addListItem(
nullptr, (
"..." +
toString((
int)demandElement->
getParentEdges().size() - 2) +
" edges...").c_str(), 0,
false);
1408 addListItem(
nullptr, (
"..." +
toString((
int)demandElement->
getParentLanes().size() - 2) +
" lanes...").c_str(), 0,
false);
1416 }
else if (myHE->getTagProperty().isDataElement()) {
1421 return addListItem(myFrameParent->myViewNet->getNet()->getAttributeCarriers()->retrieveDataSet(myHE->getID()));
1427 FXTreeItem* root =
nullptr;
1466 addListItem(dataElement->
getParentEdges().front(),
nullptr,
"from ");
1472 addListItem(
nullptr, (
"..." +
toString((
int)dataElement->
getParentEdges().size() - 2) +
" edges...").c_str(), 0,
false);
1477 addListItem(dataElement->
getParentEdges().back(),
nullptr,
"to ");
1490 addListItem(
nullptr, (
"..." +
toString((
int)dataElement->
getParentLanes().size() - 2) +
" lanes...").c_str(), 0,
false);
1516 FXTreeItem* junctionItem = addListItem(HE, itemParent);
1519 showHierarchicalElementChildren(edge, junctionItem);
1523 showHierarchicalElementChildren(crossing, junctionItem);
1533 FXTreeItem* edgeItem = addListItem(HE, itemParent);
1535 for (
const auto& lane : edge->
getLanes()) {
1536 showHierarchicalElementChildren(lane, edgeItem);
1540 showHierarchicalElementChildren(additional, edgeItem);
1544 showHierarchicalElementChildren(shape, edgeItem);
1549 addListItem(TAZElement, edgeItem);
1553 showHierarchicalElementChildren(demandElement, edgeItem);
1571 showHierarchicalElementChildren(genericDatas, edgeItem);
1581 FXTreeItem* laneItem = addListItem(HE, itemParent);
1584 showHierarchicalElementChildren(additional, laneItem);
1588 showHierarchicalElementChildren(shape, laneItem);
1593 addListItem(TAZElement, laneItem);
1597 showHierarchicalElementChildren(demandElement, laneItem);
1603 FXTreeItem* incomingConnections = addListItem(laneItem,
"Incomings", incomingLaneConnections.front()->getIcon(),
false);
1605 for (
const auto& connection : incomingLaneConnections) {
1606 showHierarchicalElementChildren(connection, incomingConnections);
1613 FXTreeItem* outgoingConnections = addListItem(laneItem,
"Outgoing", outcomingLaneConnections.front()->getIcon(),
false);
1615 for (
const auto& connection : outcomingLaneConnections) {
1616 showHierarchicalElementChildren(connection, outgoingConnections);
1625 addListItem(HE, itemParent);
1633 FXTreeItem* treeItem = addListItem(HE, itemParent);
1636 showHierarchicalElementChildren(edge, treeItem);
1640 showHierarchicalElementChildren(lane, treeItem);
1643 std::vector<GNEAdditional*> symbols;
1645 if (additional->getTagProperty().isSymbol()) {
1646 symbols.push_back(additional);
1649 if (symbols.size() > 0) {
1651 const auto additionalParent = symbols.front()->getParentAdditionals().front();
1652 const std::string symbolType = additionalParent->getTagProperty().hasAttribute(
SUMO_ATTR_EDGES) ?
"Edges" :
"Lanes";
1654 FXTreeItem* symbolListItem = addListItem(treeItem, symbolType,
GUIIconSubSys::getIcon(symbolIcon),
false);
1656 for (
const auto& symbol : symbols) {
1657 showHierarchicalElementChildren(symbol, symbolListItem);
1662 if (!additional->getTagProperty().isSymbol()) {
1663 showHierarchicalElementChildren(additional, treeItem);
1668 showHierarchicalElementChildren(shape, treeItem);
1673 addListItem(TAZElement, treeItem);
1677 showHierarchicalElementChildren(demandElement, treeItem);
1681 FXTreeItem* dataElementItem = addListItem(HE, itemParent);
1687 showHierarchicalElementChildren(interval.second, dataElementItem);
1693 showHierarchicalElementChildren(genericData, dataElementItem);
1703 FXTreeItem* item = myTreeListDinamic->insertItem(
nullptr, itemParent, (prefix + AC->
getHierarchyName() + sufix).c_str(), AC->
getIcon(), AC->
getIcon());
1705 myTreeItemToACMap[item] = AC;
1707 item->setExpanded(
true);
1716 FXTreeItem* item = myTreeListDinamic->insertItem(
nullptr, itemParent, text.c_str(), icon, icon);
1718 item->setExpanded(expanded);
1729 myFrameParent(frameParent),
1730 myDeleteLastCreatedPoint(false) {
1736 std::ostringstream information;
1738 <<
"- 'Start drawing' or ENTER\n"
1739 <<
" to create shape.\n"
1740 <<
"- 'Stop drawing' or ENTER to\n"
1741 <<
" finish shape creation.\n"
1742 <<
"- 'Abort drawing' or ESC to\n"
1743 <<
" abort shape creation.\n"
1744 <<
"- 'Shift + Click' to remove\n"
1745 <<
" last inserted point.";
1760 FXGroupBoxModule::show();
1768 FXGroupBoxModule::hide();
1777 myStartDrawingButton->disable();
1778 myStopDrawingButton->enable();
1779 myAbortDrawingButton->enable();
1787 if (myFrameParent->shapeDrawed()) {
1789 myTemporalShape.clear();
1791 myStartDrawingButton->enable();
1792 myStopDrawingButton->disable();
1793 myAbortDrawingButton->disable();
1804 myTemporalShape.clear();
1806 myStartDrawingButton->enable();
1807 myStopDrawingButton->disable();
1808 myAbortDrawingButton->disable();
1814 if (myStopDrawingButton->isEnabled()) {
1815 myTemporalShape.push_back(P);
1817 throw ProcessError(
"A new point cannot be added if drawing wasn't started");
1824 if (myTemporalShape.size() > 1) {
1825 myTemporalShape.pop_back();
1832 return myTemporalShape;
1838 return myStopDrawingButton->isEnabled();
1844 myDeleteLastCreatedPoint = value;
1850 return myDeleteLastCreatedPoint;
1880 myFrameParent(frameParent) {
1895 for (
int i = 0; i < myParentsList->getNumItems(); i++) {
1896 if (myParentsList->isItemSelected(i)) {
1897 return myParentsList->getItem(i)->getText().text();
1907 for (
int i = 0; i < myParentsList->getNumItems(); i++) {
1908 myParentsList->getItem(i)->setSelected(
false);
1911 for (
int i = 0; i < myParentsList->getNumItems(); i++) {
1912 if (myParentsList->getItem(i)->getText().text() ==
id) {
1913 myParentsList->getItem(i)->setSelected(
true);
1917 myParentsList->recalc();
1925 for (
const auto& tagIt : listOfTags) {
1926 if (std::find(additionalTypeParents.begin(), additionalTypeParents.end(), tagIt.getTag()) != additionalTypeParents.end()) {
1927 myParentTags = additionalTypeParents;
1928 myParentsLabel->setText((
"Parent type: " + tagIt.getFieldString()).c_str());
1929 refreshSelectorParentModul();
1940 myParentTags.clear();
1948 std::set<std::string> selectedItems;
1949 for (
int i = 0; i < myParentsList->getNumItems(); i++) {
1950 if (myParentsList->isItemSelected(i)) {
1951 selectedItems.insert(myParentsList->getItem(i)->getText().text());
1954 myParentsList->clearItems();
1955 if (myParentTags.size() > 0) {
1957 std::set<std::string> IDs;
1959 for (
const auto& parentTag : myParentTags) {
1960 for (
const auto& additional : myFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getAdditionals().at(parentTag)) {
1961 IDs.insert(additional->getID().c_str());
1965 for (
const auto& ID : IDs) {
1966 const int item = myParentsList->appendItem(ID.c_str());
1967 if (selectedItems.find(ID) != selectedItems.end()) {
1968 myParentsList->selectItem(item);
1980 myFrameParent(frameParent),
1990 myFrameParent(frameParent),
1991 myFilteredTag(filteredTag),
2004 myOverlappedACs.clear();
2011 if (myFrameParent->getViewNet()->getEditModes().isCurrentSupermodeDemand() &&
2012 !AC->getTagProperty().isDemandElement()) {
2016 if (myFrameParent->getViewNet()->getEditModes().isCurrentSupermodeData() &&
2017 !AC->getTagProperty().isGenericData()) {
2021 if ((myFilteredTag !=
SUMO_TAG_NOTHING) && (AC->getTagProperty().getTag() != myFilteredTag)) {
2025 myOverlappedACs.push_back(AC);
2029 if (myOverlappedACs.size() > 1) {
2030 mySavedClickedPosition = clickedPosition;
2034 myCurrentIndexButton->setText((
"1 / " +
toString(myOverlappedACs.size())).c_str());
2036 myOverlappedElementList->clearItems();
2037 for (
int i = 0; i < (int)myOverlappedACs.size(); i++) {
2038 myOverlappedElementList->insertItem(i, myOverlappedACs.at(i)->getID().c_str(), myOverlappedACs.at(i)->getIcon());
2041 myOverlappedElementList->getItem(0)->setSelected(TRUE);
2043 myOverlappedElementList->hide();
2069 return (
int)myOverlappedACs.size();
2075 return (mySavedClickedPosition.distanceSquaredTo2D(clickedPosition) < 0.25);
2084 if (checkSavedPosition(clickedPosition)) {
2086 onCmdNextElement(0, 0, 0);
2102 if (checkSavedPosition(clickedPosition)) {
2104 onCmdPreviousElement(0, 0, 0);
2118 if (myOverlappedElementList->getNumItems() > 0) {
2120 myOverlappedElementList->getItem((
int)myItemIndex)->setSelected(FALSE);
2122 if (myItemIndex > 0) {
2125 myItemIndex = (myOverlappedACs.size() - 1);
2128 myOverlappedElementList->getItem((
int)myItemIndex)->setSelected(TRUE);
2129 myOverlappedElementList->update();
2131 myCurrentIndexButton->setText((
toString(myItemIndex + 1) +
" / " +
toString(myOverlappedACs.size())).c_str());
2133 myFrameParent->selectedOverlappedElement(myOverlappedACs.at(myItemIndex));
2144 if (myOverlappedElementList->getNumItems() > 0) {
2146 myOverlappedElementList->getItem((
int)myItemIndex)->setSelected(FALSE);
2148 myItemIndex = (myItemIndex + 1) % myOverlappedACs.size();
2150 myOverlappedElementList->getItem((
int)myItemIndex)->setSelected(TRUE);
2151 myOverlappedElementList->update();
2153 myCurrentIndexButton->setText((
toString(myItemIndex + 1) +
" / " +
toString(myOverlappedACs.size())).c_str());
2155 myFrameParent->selectedOverlappedElement(myOverlappedACs.at(myItemIndex));
2166 if (myOverlappedElementList->shown()) {
2167 myOverlappedElementList->hide();
2169 myOverlappedElementList->show();
2171 if (myOverlappedElementList->getNumItems() <= 10) {
2172 myOverlappedElementList->setHeight(23 * myOverlappedElementList->getNumItems());
2174 myOverlappedElementList->setHeight(230);
2176 myOverlappedElementList->recalc();
2184 for (
int i = 0; i < myOverlappedElementList->getNumItems(); i++) {
2185 if (myOverlappedElementList->getItem(i)->isSelected()) {
2188 myCurrentIndexButton->setText((
toString(myItemIndex + 1) +
" / " +
toString(myOverlappedACs.size())).c_str());
2190 myFrameParent->selectedOverlappedElement(myOverlappedACs.at(myItemIndex));
2202 FXDialogBox* helpDialog =
new FXDialogBox(getCollapsableFrame(),
"GEO attributes Help",
GUIDesignDialogBox);
2203 std::ostringstream help;
2205 <<
" - Click in the same position\n"
2206 <<
" for inspect next element\n"
2207 <<
" - Shift + Click in the same\n"
2208 <<
" position for inspect\n"
2209 <<
" previous element";
2213 helpDialog->create();
2220 myFrameParent(nullptr),
2221 myPreviousElement(nullptr),
2222 myCurrentIndexButton(nullptr),
2223 myNextElement(nullptr),
2224 myOverlappedElementList(nullptr),
2225 myHelpButton(nullptr),
2243 myOverlappedElementList->hide();
2254 myFromBusStop(
nullptr),
2255 myToBusStop(
nullptr),
2256 myConflictVClass(
false),
2257 myConflictDisconnected(
false) {
2259 if (edge->getNBEdge()->getNumLanesThatAllow(vClass) == 0) {
2260 myConflictVClass =
true;
2266 myFromBusStop(nullptr),
2267 myToBusStop(nullptr),
2268 myConflictVClass(false),
2269 myConflictDisconnected(false) {
2285 const std::vector<GNEEdge*>&
2292 return myFromBusStop;
2303 return myConflictVClass;
2309 return myConflictDisconnected;
2314 myFromBusStop(nullptr),
2315 myToBusStop(nullptr),
2316 myConflictVClass(false),
2317 myConflictDisconnected(false) {
2344 "SHIFT-click: ignore vClass",
2348 "CTRL-click: add disconnected",
2352 "BACKSPACE: undo click",
2363 bool showPathCreator =
true;
2365 abortPathCreation();
2367 myFinishCreationButton->disable();
2368 myAbortCreationButton->disable();
2369 myRemoveLastInsertedElement->disable();
2374 myCreationMode |= REQUIRE_FIRSTELEMENT;
2378 myCreationMode |= CONSECUTIVE_EDGES;
2380 myCreationMode |= NONCONSECUTIVE_EDGES;
2387 myCreationMode |= SHOW_CANDIDATE_EDGES;
2388 myCreationMode |= START_EDGE;
2389 myCreationMode |= END_EDGE;
2395 myCreationMode |= SINGLE_ELEMENT;
2396 myCreationMode |=
ROUTE;
2402 myCreationMode |= SHOW_CANDIDATE_EDGES;
2403 myCreationMode |= START_EDGE;
2404 myCreationMode |= END_EDGE;
2408 myCreationMode |= SHOW_CANDIDATE_EDGES;
2409 myCreationMode |= START_EDGE;
2410 myCreationMode |= END_EDGE;
2416 myCreationMode |= SHOW_CANDIDATE_EDGES;
2417 myCreationMode |= ONLY_FROMTO;
2418 myCreationMode |= START_EDGE;
2419 myCreationMode |= END_EDGE;
2425 myCreationMode |= SHOW_CANDIDATE_EDGES;
2426 myCreationMode |= ONLY_FROMTO;
2427 myCreationMode |= END_BUSSTOP;
2431 myCreationMode |= SINGLE_ELEMENT;
2432 myCreationMode |= END_BUSSTOP;
2435 myCreationMode |= SINGLE_ELEMENT;
2436 myCreationMode |= START_EDGE;
2440 myCreationMode |= ONLY_FROMTO;
2441 myCreationMode |= START_EDGE;
2442 myCreationMode |= END_EDGE;
2445 showPathCreator =
false;
2449 if (showPathCreator) {
2489 if (((myCreationMode & CONSECUTIVE_EDGES) + (myCreationMode & NONCONSECUTIVE_EDGES) +
2490 (myCreationMode & START_EDGE) + (myCreationMode & END_EDGE)) == 0) {
2494 if ((myCreationMode & SINGLE_ELEMENT) && (mySelectedEdges.size() == 1)) {
2498 if (mySelectedEdges.size() > 0) {
2500 if (mySelectedEdges.back() == edge) {
2507 if (myCreationMode & Mode::CONSECUTIVE_EDGES) {
2509 const auto& outgoingEdges = mySelectedEdges.back()->getToJunction()->getGNEOutgoingEdges();
2510 if (std::find(outgoingEdges.begin(), outgoingEdges.end(), edge) == outgoingEdges.end()) {
2519 if (mySelectedEdges.size() == 2 && (myCreationMode & Mode::ONLY_FROMTO)) {
2528 if (!shiftKeyPressed) {
2530 WRITE_WARNING(
"Invalid edge (SHIFT + click to add an invalid vClass edge)");
2535 if (!controlKeyPressed) {
2537 WRITE_WARNING(
"Invalid edge (CONTROL + click to add a disconnected edge)");
2544 mySelectedEdges.push_back(edge);
2546 myAbortCreationButton->enable();
2548 myFinishCreationButton->enable();
2550 myFrameParent->myViewNet->getViewParent()->getGNEAppWindows()->disableUndoRedo(
"route creation");
2552 if (mySelectedEdges.size() > 1) {
2553 myRemoveLastInsertedElement->enable();
2555 myRemoveLastInsertedElement->disable();
2560 updateInfoRouteLabel();
2567 std::vector<GNEEdge*>
2569 return mySelectedEdges;
2576 if ((myCreationMode & END_BUSSTOP) == 0) {
2580 if (myToStoppingPlace) {
2583 myToStoppingPlace = stoppingPlace;
2586 myAbortCreationButton->enable();
2588 myFinishCreationButton->enable();
2590 myFrameParent->myViewNet->getViewParent()->getGNEAppWindows()->disableUndoRedo(
"route creation");
2592 if (myToStoppingPlace) {
2593 myRemoveLastInsertedElement->enable();
2595 myRemoveLastInsertedElement->disable();
2600 updateInfoRouteLabel();
2609 if (myToStoppingPlace && (myToStoppingPlace->getTagProperty().getTag() == expectedTag)) {
2610 return myToStoppingPlace;
2620 if ((myCreationMode &
ROUTE) == 0) {
2631 updateInfoRouteLabel();
2643 updateInfoRouteLabel();
2654 const std::vector<GNEFrameModuls::PathCreator::Path>&
2662 return (myShowCandidateEdges->getCheck() == TRUE);
2669 for (
const auto& edge : myFrameParent->myViewNet->getNet()->getAttributeCarriers()->getEdges()) {
2670 edge.second->resetCandidateFlags();
2673 if (mySelectedEdges.size() > 0) {
2675 if ((myShowCandidateEdges->getCheck() == TRUE) && (myCreationMode & SHOW_CANDIDATE_EDGES)) {
2677 for (
const auto& edge : myFrameParent->myViewNet->getNet()->getAttributeCarriers()->getEdges()) {
2678 edge.second->setConflictedCandidate(
true);
2681 setSpecialCandidates(mySelectedEdges.back());
2683 for (
const auto& edge : myFrameParent->myViewNet->getNet()->getAttributeCarriers()->getEdges()) {
2684 edge.second->setConflictedCandidate(
true);
2687 setPossibleCandidates(mySelectedEdges.back(), myVClass);
2690 for (
const auto& edge : mySelectedEdges) {
2691 edge->resetCandidateFlags();
2692 edge->setSourceCandidate(
true);
2695 mySelectedEdges.back()->resetCandidateFlags();
2696 mySelectedEdges.back()->setTargetCandidate(
true);
2697 }
else if (myShowCandidateEdges->getCheck() == TRUE && (myCreationMode & SHOW_CANDIDATE_EDGES)) {
2699 for (
const auto& edge : myFrameParent->myViewNet->getNet()->getAttributeCarriers()->getEdges()) {
2700 if (edge.second->getNBEdge()->getNumLanesThatAllow(myVClass) > 0) {
2701 edge.second->setPossibleCandidate(
true);
2703 edge.second->setSpecialCandidate(
true);
2708 myFrameParent->myViewNet->updateViewNet();
2712 #if defined(_MSC_VER) && _MSC_VER == 1800
2713 #pragma warning(push)
2714 #pragma warning(disable: 4100) // do not warn about "unused" parameters which get optimized away
2718 if (myPath.size() > 0) {
2719 const double lineWidth = 0.35;
2720 const double lineWidthin = 0.25;
2724 glTranslated(0, 0,
GLO_MAX - 0.1);
2728 for (
int i = 0; i < (int)myPath.size(); i++) {
2732 for (
int j = 0; j < (int)path.
getSubPath().size(); j++) {
2734 if (((i == 0) && (j == 0)) || (j > 0)) {
2738 if ((j + 1) < (
int)path.
getSubPath().size()) {
2748 glTranslated(0, 0, 0.1);
2750 for (
int i = 0; i < (int)myPath.size(); i++) {
2754 if ((myCreationMode & SHOW_CANDIDATE_EDGES) == 0) {
2764 for (
int j = 0; j < (int)path.
getSubPath().size(); j++) {
2766 if (((i == 0) && (j == 0)) || (j > 0)) {
2770 if ((j + 1) < (
int)path.
getSubPath().size()) {
2784 #if defined(_MSC_VER) && _MSC_VER == 1800
2785 #pragma warning(pop)
2792 myFrameParent->createPath();
2799 if ((mySelectedEdges.size() > 0) || myToStoppingPlace || myRoute) {
2801 myFrameParent->myViewNet->getViewParent()->getGNEAppWindows()->enableUndoRedo();
2805 myFinishCreationButton->disable();
2806 myAbortCreationButton->disable();
2807 myRemoveLastInsertedElement->disable();
2809 updateInfoRouteLabel();
2813 myFrameParent->getViewNet()->updateViewNet();
2820 if (mySelectedEdges.size() > 1) {
2822 mySelectedEdges.back()->resetCandidateFlags();
2824 mySelectedEdges.pop_back();
2826 if ((mySelectedEdges.size() > 0) && mySelectedEdges.back()->isSourceCandidate()) {
2827 mySelectedEdges.back()->setSourceCandidate(
false);
2828 mySelectedEdges.back()->setTargetCandidate(
true);
2831 if (mySelectedEdges.size() > 1) {
2832 myRemoveLastInsertedElement->enable();
2834 myRemoveLastInsertedElement->disable();
2839 updateInfoRouteLabel();
2843 myFrameParent->myViewNet->updateViewNet();
2859 abortPathCreation();
2867 removeLastElement();
2875 if (myShowCandidateEdges->getCheck() == TRUE) {
2876 myShiftLabel->show();
2877 myControlLabel->show();
2879 myShiftLabel->hide();
2880 myControlLabel->hide();
2892 if (myPath.size() > 0) {
2897 for (
const auto& path : myPath) {
2898 for (
const auto& edge : path.getSubPath()) {
2899 length += edge->getNBEdge()->getLength();
2900 speed += edge->getNBEdge()->getSpeed();
2902 pathSize += (int)path.getSubPath().size();
2905 std::ostringstream information;
2907 <<
"- Selected edges: " <<
toString(mySelectedEdges.size()) <<
"\n"
2908 <<
"- Path edges: " <<
toString(pathSize) <<
"\n"
2909 <<
"- Length: " <<
toString(length) <<
"\n"
2910 <<
"- Average speed: " <<
toString(speed / pathSize);
2912 myInfoRouteLabel->setText(information.str().c_str());
2914 myInfoRouteLabel->setText(
"No edges selected");
2922 for (
const auto& edge : myFrameParent->myViewNet->getNet()->getAttributeCarriers()->getEdges()) {
2923 edge.second->resetCandidateFlags();
2926 mySelectedEdges.clear();
2927 myToStoppingPlace =
nullptr;
2932 updateInfoRouteLabel();
2941 std::vector<GNEEdge*> edges;
2944 edges = myRoute->getParentEdges();
2947 for (
const auto& edge : mySelectedEdges) {
2948 edges.push_back(edge);
2951 if (myToStoppingPlace) {
2952 edges.push_back(myToStoppingPlace->getParentLanes().front()->getParentEdge());
2956 if (edges.size() == 1) {
2957 myPath.push_back(
Path(myVClass, edges.front()));
2960 for (
int i = 1; i < (int)edges.size(); i++) {
2961 myPath.push_back(
Path(myFrameParent->getViewNet(), myVClass, edges.at(i - 1), edges.at(i)));
2970 myFrameParent->getViewNet()->getNet()->getPathManager()->getPathCalculator()->calculateReachability(
SVC_PEDESTRIAN, originEdge);
2972 for (
const auto& edge : myFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getEdges()) {
2973 for (
const auto& lane : edge.second->getLanes()) {
2974 if (lane->getReachability() > 0) {
2975 lane->getParentEdge()->resetCandidateFlags();
2976 lane->getParentEdge()->setSpecialCandidate(
true);
2985 myFrameParent->getViewNet()->getNet()->getPathManager()->getPathCalculator()->calculateReachability(vClass, originEdge);
2987 for (
const auto& edge : myFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getEdges()) {
2988 for (
const auto& lane : edge.second->getLanes()) {
2989 if (lane->getReachability() > 0) {
2990 lane->getParentEdge()->resetCandidateFlags();
2991 lane->getParentEdge()->setPossibleCandidate(
true);
3004 FXLabel* legendLabel =
nullptr;
3048 FXLabel* colorLabel =
new FXLabel(horizontalFrameColors,
"",
nullptr,
GUIDesignLabelLeft);