void GNEConnectorFrame::initTargets() { // gather potential targets NBNode* nbn = myCurrentLane->getParentEdge().getGNEJunctionDestiny()->getNBNode(); const EdgeVector& outgoing = nbn->getOutgoingEdges(); for (EdgeVector::const_iterator it = outgoing.begin(); it != outgoing.end(); it++) { GNEEdge* edge = myViewNet->getNet()->retrieveEdge((*it)->getID()); const GNEEdge::LaneVector& lanes = edge->getLanes(); for (GNEEdge::LaneVector::const_iterator it_lane = lanes.begin(); it_lane != lanes.end(); it_lane++) { myPotentialTargets.insert(*it_lane); } } // set color for existing connections const int fromIndex = myCurrentLane->getIndex(); NBEdge* srcEdge = myCurrentLane->getParentEdge().getNBEdge(); std::vector<NBEdge::Connection> connections = srcEdge->getConnectionsFromLane(fromIndex); for (std::set<GNELane*>::iterator it = myPotentialTargets.begin(); it != myPotentialTargets.end(); it++) { switch (getLaneStatus(connections, *it)) { case CONNECTED: (*it)->setSpecialColor(&targetColor); break; case CONNECTED_PASS: (*it)->setSpecialColor(&targetPassColor); break; case CONFLICTED: (*it)->setSpecialColor(&conflictColor); break; case UNCONNECTED: (*it)->setSpecialColor(&potentialTargetColor); break; } } }
void GNEConnectorFrame::handleLaneClick(GNELane* lane, bool mayDefinitelyPass, bool allowConflict, bool toggle) { if (myCurrentLane == 0) { myCurrentLane = lane; myCurrentLane->setSpecialColor(&sourceColor); initTargets(); buildIinternalLanes(lane->getParentEdge().getNBEdge()->getToNode()); myNumChanges = 0; myViewNet->getUndoList()->p_begin("modify connections"); } else if (myPotentialTargets.count(lane) || allowConflict) { const unsigned int fromIndex = myCurrentLane->getIndex(); GNEEdge& srcEdge = myCurrentLane->getParentEdge(); GNEEdge& destEdge = lane->getParentEdge(); const std::string& destEdgeID = destEdge.getMicrosimID(); std::vector<NBEdge::Connection> connections = srcEdge.getNBEdge()->getConnectionsFromLane(fromIndex); bool changed = false; NBConnection deletedConnection = NBConnection::InvalidConnection; LaneStatus status = getLaneStatus(connections, lane); if (status == CONFLICTED && allowConflict) { status = UNCONNECTED; } switch (status) { case UNCONNECTED: if (toggle) { myViewNet->getUndoList()->add(new GNEChange_Connection(&srcEdge, fromIndex, destEdgeID, lane->getIndex(), mayDefinitelyPass, true), true); lane->setSpecialColor(mayDefinitelyPass ? &targetPassColor : &targetColor); changed = true; } break; case CONNECTED: case CONNECTED_PASS: myViewNet->getUndoList()->add(new GNEChange_Connection(&srcEdge, fromIndex, destEdgeID, lane->getIndex(), status == CONNECTED_PASS, false), true); lane->setSpecialColor(&potentialTargetColor); changed = true; deletedConnection = NBConnection(srcEdge.getNBEdge(), fromIndex, destEdge.getNBEdge(), lane->getIndex(), (int)getTLLLinkNumber(connections, lane)); break; case CONFLICTED: myViewNet->setStatusBarText("Another lane from the same edge already connects to that lane"); break; } if (changed) { myNumChanges += 1; GNEJunction* affected = myViewNet->getNet()->retrieveJunction(srcEdge.getDest()->getMicrosimID()); affected->invalidateTLS(myViewNet->getUndoList(), deletedConnection); buildIinternalLanes(myCurrentLane->getParentEdge().getNBEdge()->getToNode()); } } else { myViewNet->setStatusBarText("Invalid target for connection"); } updateDescription(); }
void GNEConnectorFrame::handleLaneClick(GNELane* lane, bool mayDefinitelyPass, bool allowConflict, bool toggle) { if (myCurrentLane == 0) { myCurrentLane = lane; myCurrentLane->setSpecialColor(&sourceColor); initTargets(); myNumChanges = 0; myViewNet->getUndoList()->p_begin("modify connections"); } else if (myPotentialTargets.count(lane) || allowConflict) { const int fromIndex = myCurrentLane->getIndex(); GNEEdge& srcEdge = myCurrentLane->getParentEdge(); GNEEdge& destEdge = lane->getParentEdge(); std::vector<NBEdge::Connection> connections = srcEdge.getNBEdge()->getConnectionsFromLane(fromIndex); bool changed = false; LaneStatus status = getLaneStatus(connections, lane); if (status == CONFLICTED && allowConflict) { status = UNCONNECTED; } switch (status) { case UNCONNECTED: if (toggle) { // create new connection NBEdge::Connection newCon(fromIndex, destEdge.getNBEdge(), lane->getIndex(), mayDefinitelyPass); myViewNet->getUndoList()->add(new GNEChange_Connection(&srcEdge, newCon, true), true); lane->setSpecialColor(mayDefinitelyPass ? &targetPassColor : &targetColor); srcEdge.getGNEJunctionDestiny()->invalidateTLS(myViewNet->getUndoList()); } break; case CONNECTED: case CONNECTED_PASS: { // remove connection GNEConnection* con = srcEdge.retrieveConnection(fromIndex, destEdge.getNBEdge(), lane->getIndex()); myViewNet->getNet()->deleteConnection(con, myViewNet->getUndoList()); lane->setSpecialColor(&potentialTargetColor); changed = true; break; } case CONFLICTED: myViewNet->setStatusBarText("Another lane from the same edge already connects to that lane"); break; } if (changed) { myNumChanges += 1; } } else { myViewNet->setStatusBarText("Invalid target for connection"); } updateDescription(); }