long GNEInspectorFrame::onCmdSetBlocking(FXObject*, FXSelector, void*) { if (myAdditional) { if (myCheckBlocked->getCheck() == 1) { myAdditional->setAttribute(GNE_ATTR_BLOCK_MOVEMENT, "true", getViewNet()->getUndoList()); } else { myAdditional->setAttribute(GNE_ATTR_BLOCK_MOVEMENT, "false", getViewNet()->getUndoList()); } } return 1; }
void GNEDetectorE1::setAttribute(SumoXMLAttr key, const std::string& value) { switch (key) { case SUMO_ATTR_ID: setAdditionalID(value); break; case SUMO_ATTR_LANE: changeLane(myViewNet->getNet()->retrieveLane(value)); break; case SUMO_ATTR_POSITION: myPosition = Position(parse<SUMOReal>(value), 0); updateGeometry(); getViewNet()->update(); break; case SUMO_ATTR_FREQUENCY: myFreq = parse<SUMOReal>(value); break; case SUMO_ATTR_FILE: myFilename = value; break; case SUMO_ATTR_SPLIT_VTYPE: mySplitByType = parse<bool>(value); break; default: throw InvalidArgument(toString(getType()) + " attribute '" + toString(key) + "' not allowed"); } }
void GNEDetector::changeLane(GNELane *newLane) { myLane->removeAdditional(this); myLane = newLane; myLane->addAdditional(this); updateGeometry(); getViewNet()->update(); }
void GNEVariableSpeedSignal::setAttribute(SumoXMLAttr key, const std::string& value) { switch (key) { case SUMO_ATTR_ID: setAdditionalID(value); break; case SUMO_ATTR_LANES: { // Declare variables std::vector<std::string> laneIds; std::vector<GNELane*> lanes; GNELane* lane; SUMOSAXAttributes::parseStringVector(value, laneIds); // Iterate over parsed lanes and obtain pointer to lanes for (int i = 0; i < (int)laneIds.size(); i++) { lane = myViewNet->getNet()->retrieveLane(laneIds.at(i), false); if (lane) { lanes.push_back(lane); } } // Set new childs setLaneChilds(lanes); break; } case SUMO_ATTR_POSITION: bool ok; myPosition = GeomConvHelper::parseShapeReporting(value, "user-supplied position", 0, ok, false)[0]; updateGeometry(); getViewNet()->update(); break; case SUMO_ATTR_FILE: myFilename = value; break; case GNE_ATTR_BLOCK_MOVEMENT: myBlocked = parse<bool>(value); getViewNet()->update(); break; default: throw InvalidArgument(toString(getType()) + " attribute '" + toString(key) + "' not allowed"); } }
void GNEDetectorEntry::setAttribute(SumoXMLAttr key, const std::string& value) { switch (key) { case SUMO_ATTR_ID: setAdditionalID(value); break; case SUMO_ATTR_LANE: changeLane(value); break; case SUMO_ATTR_POSITION: myPosition = Position(parse<SUMOReal>(value), 0); updateGeometry(); getViewNet()->update(); break; case GNE_ATTR_BLOCK_MOVEMENT: myBlocked = parse<bool>(value); getViewNet()->update(); break; default: throw InvalidArgument(toString(getType()) + " attribute '" + toString(key) + "' not allowed"); } }
void GNEContainerStop::setAttribute(SumoXMLAttr key, const std::string& value) { switch (key) { case SUMO_ATTR_ID: setAdditionalID(value); break; case SUMO_ATTR_LANE: changeLane(value); break; case SUMO_ATTR_STARTPOS: myStartPos = parse<SUMOReal>(value); updateGeometry(); getViewNet()->update(); break; case SUMO_ATTR_ENDPOS: if (parse<SUMOReal>(value) > myLane->getLaneParametricLenght()) { myEndPos = myLane->getLaneParametricLenght(); } else { myEndPos = parse<SUMOReal>(value); } updateGeometry(); getViewNet()->update(); break; case SUMO_ATTR_LINES: myLines.clear(); SUMOSAXAttributes::parseStringVector(value, myLines); getViewNet()->update(); break; case GNE_ATTR_BLOCK_MOVEMENT: myBlocked = parse<bool>(value); getViewNet()->update(); break; default: throw InvalidArgument(toString(getType()) + " attribute '" + toString(key) + "' not allowed"); } }
bool GNEContainerStop::isValid(SumoXMLAttr key, const std::string& value) { switch (key) { case SUMO_ATTR_ID: if (myViewNet->getNet()->getAdditional(getTag(), value) == NULL) { return true; } else { return false; } case SUMO_ATTR_LANE: if (myViewNet->getNet()->retrieveLane(value, false) != NULL) { return true; } else { return false; } case SUMO_ATTR_STARTPOS: return (canParse<SUMOReal>(value) && parse<SUMOReal>(value) >= 0 && parse<SUMOReal>(value) < (myEndPos - 1)); case SUMO_ATTR_ENDPOS: { if (canParse<SUMOReal>(value) && parse<SUMOReal>(value) >= 1 && parse<SUMOReal>(value) > myStartPos) { // If extension is larger than Lane if (parse<SUMOReal>(value) > myLane->getLaneParametricLenght()) { // Ask user if want to assign the lenght of lane as endPosition FXuint answer = FXMessageBox::question(getViewNet()->getApp(), MBOX_YES_NO, "EndPosition exceeds the size of the lane", "%s", "EndPosition exceeds the size of the lane. You want to assign the size of the lane as endPosition?"); if (answer == 1) { //1:yes, 2:no, 4:esc return true; } else { return false; } } else { return true; } } else { return false; } } case SUMO_ATTR_LINES: return isValidStringVector(value); case GNE_ATTR_BLOCK_MOVEMENT: return canParse<bool>(value); default: throw InvalidArgument(toString(getType()) + " attribute '" + toString(key) + "' not allowed"); } }
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(); }