void GNEFrame::ACHierarchy::showAttributeCarrierChilds(GNEAttributeCarrier *AC, FXTreeItem* itemParent) { // Switch gl type of ac switch (AC->getTag()) { case SUMO_TAG_JUNCTION: { // retrieve junction GNEJunction* junction = myFrameParent->getViewNet()->getNet()->retrieveJunction(AC->getID(), false); if(junction) { // insert junction item FXTreeItem* junctionItem = addACIntoList(AC, itemParent); // insert edges for (auto i : junction->getGNEEdges()) { showAttributeCarrierChilds(i, junctionItem); } // insert crossings for (auto i : junction->getGNECrossings()) { showAttributeCarrierChilds(i, junctionItem); } } break; } case SUMO_TAG_EDGE: { // retrieve edge GNEEdge* edge = myFrameParent->getViewNet()->getNet()->retrieveEdge(AC->getID(), false); if(edge) { // insert edge item FXTreeItem* edgeItem = addACIntoList(AC, itemParent); // insert lanes for (int i = 0; i < (int)edge->getLanes().size(); i++) { showAttributeCarrierChilds(edge->getLanes().at(i), edgeItem); } // insert additionals of edge for (auto i : edge->getAdditionalChilds()) { showAttributeCarrierChilds(i, edgeItem); } } break; } case SUMO_TAG_LANE: { // retrieve lane GNELane* lane = myFrameParent->getViewNet()->getNet()->retrieveLane(AC->getID(), false); if(lane) { // insert lane item FXTreeItem* laneItem = addACIntoList(AC, itemParent); // insert additionals of lanes for (auto i : lane->getAdditionalChilds()) { showAttributeCarrierChilds(i, laneItem); } // insert incoming connections of lanes (by default isn't expanded) if (lane->getGNEIncomingConnections().size() > 0) { std::vector<GNEConnection*> incomingLaneConnections = lane->getGNEIncomingConnections(); FXTreeItem* incomingConnections = myTreelist->insertItem(0, laneItem, "Incomings", incomingLaneConnections.front()->getIcon(), lane->getGNEIncomingConnections().front()->getIcon()); myTreeItemsConnections.insert(incomingConnections); incomingConnections->setExpanded(false); // insert incoming connections for (auto i : incomingLaneConnections) { showAttributeCarrierChilds(i, incomingConnections); } } // insert outcoming connections of lanes (by default isn't expanded) if (lane->getGNEOutcomingConnections().size() > 0) { std::vector<GNEConnection*> outcomingLaneConnections = lane->getGNEOutcomingConnections(); FXTreeItem* outgoingConnections = myTreelist->insertItem(0, laneItem, "Outcomings", outcomingLaneConnections.front()->getIcon(), lane->getGNEOutcomingConnections().front()->getIcon()); myTreeItemsConnections.insert(outgoingConnections); outgoingConnections->setExpanded(false); // insert outcoming connections for (auto i : outcomingLaneConnections) { showAttributeCarrierChilds(i, outgoingConnections); } } } break; } case SUMO_TAG_POI: case SUMO_TAG_POLY: case SUMO_TAG_CROSSING: case SUMO_TAG_CONNECTION: { // insert connection item addACIntoList(AC, itemParent); break; } default: { // check if is an additional if(GNEAttributeCarrier::getTagProperties(AC->getTag()).isAdditional()) { // retrieve additional GNEAdditional *additional = myFrameParent->getViewNet()->getNet()->retrieveAdditional(AC->getTag(), AC->getID(), false); if(additional) { // insert additional item FXTreeItem* additionalItem = addACIntoList(AC, itemParent); // insert additionals childs for (auto i : additional->getAdditionalChilds()) { showAttributeCarrierChilds(i, additionalItem); } } } break; } } }
void GNEDeleteFrame::removeAttributeCarrier(GNEAttributeCarrier* ac, bool ignoreOptions) { // obtain clicked position Position clickedPosition = myViewNet->getPositionInformation(); if (myDeleteOptions->deleteOnlyGeometryPoints() && !ignoreOptions) { // check type of of GL object switch (ac->getTag()) { case SUMO_TAG_EDGE: { GNEEdge* edge = dynamic_cast<GNEEdge*>(ac); assert(edge); if (edge->getVertexIndex(clickedPosition, false) != -1) { edge->deleteGeometryPoint(clickedPosition); } break; } case SUMO_TAG_POLY: { GNEPoly* polygon = dynamic_cast<GNEPoly*>(ac); assert(polygon); if (polygon->getVertexIndex(clickedPosition, false) != -1) { polygon->deleteGeometryPoint(clickedPosition); } break; } default: { break; } } } else { // check type of of GL object switch (ac->getTag()) { case SUMO_TAG_JUNCTION: { GNEJunction* junction = dynamic_cast<GNEJunction*>(ac); assert(junction); // obtain number of additionals of junction's childs int numberOfAdditionals = 0; for (auto i : junction->getGNEEdges()) { numberOfAdditionals += (int)i->getAdditionalChilds().size(); for (auto j : i->getLanes()) { UNUSED_PARAMETER(j); numberOfAdditionals += (int)i->getAdditionalChilds().size(); } } // Check if junction can be deleted if (myDeleteOptions->forceDeleteAdditionals() || ignoreOptions) { myViewNet->getNet()->deleteJunction(junction, myViewNet->getUndoList()); } else { if (numberOfAdditionals > 0) { // write warning if netedit is running in testing mode if (OptionsCont::getOptions().getBool("gui-testing-debug")) { WRITE_WARNING("Opening FXMessageBox 'Force deletion needed'"); } std::string plural = numberOfAdditionals > 1 ? "s" : ""; // Open warning DialogBox FXMessageBox::warning(getViewNet()->getApp(), MBOX_OK, ("Problem deleting " + toString(junction->getTag())).c_str(), "%s", (toString(junction->getTag()) + " '" + junction->getID() + "' cannot be deleted because owns " + toString(numberOfAdditionals) + " additional child" + plural + ".\n Check 'Force deletion of additionals' to force deletion.").c_str()); // write warning if netedit is running in testing mode if (OptionsCont::getOptions().getBool("gui-testing-debug")) { WRITE_WARNING("Closed FXMessageBox 'Force deletion needed' with 'OK'"); } } else { myViewNet->getNet()->deleteJunction(junction, myViewNet->getUndoList()); } } break; } case SUMO_TAG_EDGE: { GNEEdge* edge = dynamic_cast<GNEEdge*>(ac); assert(edge); // check if click was over a geometry point or over a shape's edge if (edge->getVertexIndex(clickedPosition, false) != -1) { edge->deleteGeometryPoint(clickedPosition); } else { int numberOfAdditionalChilds = (int)edge->getAdditionalChilds().size(); int numberOfAdditionalParents = (int)edge->getAdditionalParents().size(); // Iterate over lanes and obtain total number of additional childs for (auto i : edge->getLanes()) { numberOfAdditionalChilds += (int)i->getAdditionalChilds().size(); } // Check if edge can be deleted if (myDeleteOptions->forceDeleteAdditionals() || ignoreOptions) { // when deleting a single edge, keep all unaffected connections as they were myViewNet->getNet()->deleteEdge(edge, myViewNet->getUndoList(), false); } else { if (numberOfAdditionalChilds > 0) { // write warning if netedit is running in testing mode if (OptionsCont::getOptions().getBool("gui-testing-debug")) { WRITE_WARNING("Opening FXMessageBox 'Force deletion needed'"); } std::string plural = numberOfAdditionalChilds > 1 ? "s" : ""; // Open warning DialogBox FXMessageBox::warning(getViewNet()->getApp(), MBOX_OK, ("Problem deleting " + toString(edge->getTag())).c_str(), "%s", (toString(edge->getTag()) + " '" + edge->getID() + "' cannot be deleted because owns " + toString(numberOfAdditionalChilds) + " additional" + plural + ".\n Check 'Force deletion of additionals' to force deletion.").c_str()); // write warning if netedit is running in testing mode if (OptionsCont::getOptions().getBool("gui-testing-debug")) { WRITE_WARNING("Closed FXMessageBox 'Force deletion needed' with 'OK'"); } } else if (numberOfAdditionalParents > 0) { // write warning if netedit is running in testing mode if (OptionsCont::getOptions().getBool("gui-testing-debug")) { WRITE_WARNING("Opening FXMessageBox 'Force deletion needed'"); } std::string plural = numberOfAdditionalParents > 1 ? "s" : ""; // Open warning DialogBox FXMessageBox::warning(getViewNet()->getApp(), MBOX_OK, ("Problem deleting " + toString(edge->getTag())).c_str(), "%s", (toString(edge->getTag()) + " '" + edge->getID() + "' cannot be deleted because is part of " + toString(numberOfAdditionalParents) + " additional" + plural + ".\n Check 'Force deletion of additionals' to force deletion.").c_str()); // write warning if netedit is running in testing mode if (OptionsCont::getOptions().getBool("gui-testing-debug")) { WRITE_WARNING("Closed FXMessageBox 'Force deletion needed' with 'OK'"); } } else { // when deleting a single edge, keep all unaffected connections as they were myViewNet->getNet()->deleteEdge(edge, myViewNet->getUndoList(), false); } } } break; } case SUMO_TAG_LANE: { GNELane* lane = dynamic_cast<GNELane*>(ac); assert(lane); // Check if lane can be deleted if (myDeleteOptions->forceDeleteAdditionals() || ignoreOptions) { // when deleting a single lane, keep all unaffected connections as they were myViewNet->getNet()->deleteLane(lane, myViewNet->getUndoList(), false); } else { if (lane->getAdditionalChilds().size() == 0) { // when deleting a single lane, keep all unaffected connections as they were myViewNet->getNet()->deleteLane(lane, myViewNet->getUndoList(), false); } else { // write warning if netedit is running in testing mode if (OptionsCont::getOptions().getBool("gui-testing-debug")) { WRITE_WARNING("Opening FXMessageBox 'Force deletion needed'"); } // open warning box FXMessageBox::warning(getViewNet()->getApp(), MBOX_OK, ("Problem deleting " + toString(lane->getTag())).c_str(), "%s", (toString(lane->getTag()) + " '" + lane->getID() + "' cannot be deleted because it has " + toString(lane->getAdditionalChilds().size()) + " additional childs.\n Check 'Force deletion of Additionals' to force deletion.").c_str()); // write warning if netedit is running in testing mode if (OptionsCont::getOptions().getBool("gui-testing-debug")) { WRITE_WARNING("Closed FXMessageBox 'Force deletion needed' with 'OK'"); } } } break; } case SUMO_TAG_CROSSING: { GNECrossing* crossing = dynamic_cast<GNECrossing*>(ac); assert(crossing); myViewNet->getNet()->deleteCrossing(crossing, myViewNet->getUndoList()); break; } case SUMO_TAG_CONNECTION: { GNEConnection* connection = dynamic_cast<GNEConnection*>(ac); assert(connection); myViewNet->getNet()->deleteConnection(connection, myViewNet->getUndoList()); break; } default: { // obtain tag property (only for improve code legibility) const auto &tagValue = GNEAttributeCarrier::getTagProperties(ac->getTag()); if(tagValue.isAdditional()) { GNEAdditional* additional = dynamic_cast<GNEAdditional*>(ac); assert(additional); myViewNet->getViewParent()->getAdditionalFrame()->removeAdditional(additional); } else if(tagValue.isShape()) { GNEShape* shape = dynamic_cast<GNEShape*>(ac); assert(shape); myViewNet->getNet()->deleteShape(shape, myViewNet->getUndoList()); } break; } } } // update view to show changes myViewNet->update(); }