void GNEJunction::invalidateTLS(GNEUndoList* undoList, const NBConnection& deletedConnection) { assert(undoList->hasCommandGroup()); // NBLoadedSUMOTLDef becomes invalid, replace with NBOwnTLDef which will be dynamically recomputed const std::set<NBTrafficLightDefinition*> tls = myNBNode.getControllingTLS(); // make a copy! for (std::set<NBTrafficLightDefinition*>::iterator it = tls.begin(); it != tls.end(); it++) { NBLoadedSUMOTLDef* tlDef = dynamic_cast<NBLoadedSUMOTLDef*>(*it); if (tlDef != 0) { NBTrafficLightDefinition* replacementDef = 0; std::string newID = tlDef->getID(); // + "_reguessed"; // changes due to reguessing will be visible in diff if (deletedConnection != NBConnection::InvalidConnection) { // create replacement before deleting the original because deletion will mess up saving original nodes NBLoadedSUMOTLDef* repl = new NBLoadedSUMOTLDef(tlDef, tlDef->getLogic()); repl->removeConnection(deletedConnection); replacementDef = repl; } else { replacementDef = new NBOwnTLDef(newID, tlDef->getOffset(), tlDef->getType()); } undoList->add(new GNEChange_TLS(this, tlDef, false), true); undoList->add(new GNEChange_TLS(this, replacementDef, true, false, newID), true); // the removed traffic light may have controlled more than one junction. These too have become invalid now const std::vector<NBNode*> coNodes = tlDef->getNodes(); // make a copy! for (std::vector<NBNode*>::const_iterator it_node = coNodes.begin(); it_node != coNodes.end(); it_node++) { GNEJunction* sharing = myNet->retrieveJunction((*it_node)->getID()); undoList->add(new GNEChange_TLS(sharing, tlDef, false), true); undoList->add(new GNEChange_TLS(sharing, replacementDef, true, false, newID), true); } } } }
void GNEConnection::setAttribute(SumoXMLAttr key, const std::string& value, GNEUndoList* undoList) { switch (key) { case SUMO_ATTR_FROM: case SUMO_ATTR_TO: case SUMO_ATTR_FROM_LANE: case SUMO_ATTR_TO_LANE: case SUMO_ATTR_PASS: case SUMO_ATTR_KEEP_CLEAR: case SUMO_ATTR_CONTPOS: case SUMO_ATTR_UNCONTROLLED: case SUMO_ATTR_VISIBILITY_DISTANCE: case SUMO_ATTR_SPEED: case SUMO_ATTR_CUSTOMSHAPE: case GNE_ATTR_SELECTED: case GNE_ATTR_GENERIC: // no special handling undoList->p_add(new GNEChange_Attribute(this, myNet, key, value)); break; case SUMO_ATTR_TLLINKINDEX: if (value != getAttribute(key)) { // trigger GNEChange_TLS undoList->p_begin("change tls linkIndex for connection"); // make a copy std::set<NBTrafficLightDefinition*> defs = getEdgeFrom()->getNBEdge()->getToNode()->getControllingTLS(); for (NBTrafficLightDefinition* tlDef : defs) { NBLoadedSUMOTLDef* sumoDef = dynamic_cast<NBLoadedSUMOTLDef*>(tlDef); NBTrafficLightLogic* tllogic = sumoDef ? sumoDef->getLogic() : tlDef->compute(OptionsCont::getOptions()); if (tllogic != nullptr) { NBLoadedSUMOTLDef* newDef = new NBLoadedSUMOTLDef(tlDef, tllogic); newDef->addConnection(getEdgeFrom()->getNBEdge(), getEdgeTo()->getNBEdge(), getLaneFrom()->getIndex(), getLaneTo()->getIndex(), parse<int>(value), false); std::vector<NBNode*> nodes = tlDef->getNodes(); for (NBNode* node : nodes) { GNEJunction* junction = getNet()->retrieveJunction(node->getID()); undoList->add(new GNEChange_TLS(junction, tlDef, false), true); undoList->add(new GNEChange_TLS(junction, newDef, true), true); } } else { WRITE_ERROR("Could not set attribute '" + toString(key) + "' (tls is broken)"); } } undoList->p_end(); } break; case SUMO_ATTR_DIR: throw InvalidArgument("Attribute of '" + toString(key) + "' cannot be modified"); case SUMO_ATTR_STATE: throw InvalidArgument("Attribute of '" + toString(key) + "' cannot be modified"); default: throw InvalidArgument(getTagStr() + " doesn't have an attribute of type '" + toString(key) + "'"); } }