void GNENet::joinSelectedJunctions(GNEUndoList* undoList) { std::vector<GNEJunction*> selected = retrieveJunctions(true); if (selected.size() < 2) { return; } undoList->p_begin("Join selected junctions"); EdgeVector allIncoming; EdgeVector allOutgoing; std::set<NBNode*> cluster; for (std::vector<GNEJunction*>::iterator it = selected.begin(); it != selected.end(); it++) { cluster.insert((*it)->getNBNode()); const EdgeVector& incoming = (*it)->getNBNode()->getIncomingEdges(); allIncoming.insert(allIncoming.end(), incoming.begin(), incoming.end()); const EdgeVector& outgoing = (*it)->getNBNode()->getOutgoingEdges(); allOutgoing.insert(allOutgoing.end(), outgoing.begin(), outgoing.end()); } // create new junction Position pos; bool setTL; std::string id; TrafficLightType type; myNetBuilder->getNodeCont().analyzeCluster(cluster, id, pos, setTL, type); // XXX this is not undone when calling 'undo' myNetBuilder->getNodeCont().registerJoinedCluster(cluster); GNEJunction* joined = createJunction(pos, undoList); if (setTL) { joined->setAttribute(SUMO_ATTR_TYPE, toString(NODETYPE_TRAFFIC_LIGHT), undoList); // XXX ticket831 //joined-><getTrafficLight>->setAttribute(SUMO_ATTR_TYPE, toString(type), undoList); } // remap edges for (EdgeVector::const_iterator it = allIncoming.begin(); it != allIncoming.end(); it++) { GNEEdge* oldEdge = myEdges[(*it)->getID()]; remapEdge(oldEdge, oldEdge->getSource(), joined, undoList, true); } for (EdgeVector::const_iterator it = allOutgoing.begin(); it != allOutgoing.end(); it++) { GNEEdge* oldEdge = myEdges[(*it)->getID()]; remapEdge(oldEdge, joined, oldEdge->getDest(), undoList, true); } // delete original junctions for (std::vector<GNEJunction*>::iterator it = selected.begin(); it != selected.end(); it++) { deleteJunction(*it, undoList); } joined->setAttribute(SUMO_ATTR_ID, id, undoList); undoList->p_end(); }
long GNETLSEditorFrame::onCmdDefCreate(FXObject*, FXSelector, void*) { GNEJunction* junction = myCurrentJunction; onCmdCancel(0, 0, 0); // abort because we onCmdOk assumes we wish to save an edited definition if (junction->getAttribute(SUMO_ATTR_TYPE) != toString(NODETYPE_TRAFFIC_LIGHT)) { junction->setAttribute(SUMO_ATTR_TYPE, toString(NODETYPE_TRAFFIC_LIGHT), myViewNet->getUndoList()); } else { myViewNet->getUndoList()->add(new GNEChange_TLS(junction, 0, true, true), true); } editJunction(junction); return 1; }
long GNETLSEditorFrame::onCmdDefDelete(FXObject*, FXSelector, void*) { GNEJunction* junction = myCurrentJunction; const bool changeType = myDefinitions.size() == 1; onCmdCancel(0, 0, 0); // abort because onCmdOk assumes we wish to save an edited definition if (changeType) { junction->setAttribute(SUMO_ATTR_TYPE, toString(NODETYPE_PRIORITY), myViewNet->getUndoList()); } else { NBTrafficLightDefinition* tlDef = myDefinitions[myProgramComboBox->getCurrentItem()]; myViewNet->getUndoList()->add(new GNEChange_TLS(junction, tlDef, false), true); } return 1; }