diff --git a/src/netedit/elements/demand/GNERouteHandler.cpp b/src/netedit/elements/demand/GNERouteHandler.cpp index 7dfd7624dc3c..059ca184e1c4 100644 --- a/src/netedit/elements/demand/GNERouteHandler.cpp +++ b/src/netedit/elements/demand/GNERouteHandler.cpp @@ -238,7 +238,7 @@ GNERouteHandler::buildEmbeddedRoute(const CommonXMLStructure::SumoBaseObject* su } else { // parse route edges const auto edges = parseEdges(SUMO_TAG_ROUTE, vehicleParameters.id, edgeIDs); - if (edges.size() > 0) { + if (edges.empty()) { return false; } else { // obtain type diff --git a/src/utils/handlers/AdditionalHandler.cpp b/src/utils/handlers/AdditionalHandler.cpp index eab8c9cb16e3..7b72e3e28fd7 100644 --- a/src/utils/handlers/AdditionalHandler.cpp +++ b/src/utils/handlers/AdditionalHandler.cpp @@ -839,6 +839,8 @@ AdditionalHandler::parseBusStopAttributes(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_PARKING_LENGTH, parkingLength); myCommonXMLStructure.getCurrentSumoBaseObject()->addColorAttribute(SUMO_ATTR_COLOR, color); myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -874,6 +876,8 @@ AdditionalHandler::parseTrainStopAttributes(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_PARKING_LENGTH, parkingLength); myCommonXMLStructure.getCurrentSumoBaseObject()->addColorAttribute(SUMO_ATTR_COLOR, color); myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -899,6 +903,8 @@ AdditionalHandler::parseAccessAttributes(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_POSITION, position); myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_LENGTH, length); myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -934,6 +940,8 @@ AdditionalHandler::parseContainerStopAttributes(const SUMOSAXAttributes& attrs) myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_PARKING_LENGTH, parkingLength); myCommonXMLStructure.getCurrentSumoBaseObject()->addColorAttribute(SUMO_ATTR_COLOR, color); myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -983,6 +991,8 @@ AdditionalHandler::parseChargingStationAttributes(const SUMOSAXAttributes& attrs myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_WAITINGTIME, waitingTime); myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_PARKING_AREA, parkingAreaID); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -1027,6 +1037,8 @@ AdditionalHandler::parseParkingAreaAttributes(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_LENGTH, length); myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ANGLE, angle); myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_LEFTHAND, lefthand); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -1060,6 +1072,8 @@ AdditionalHandler::parseParkingSpaceAttributes(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_LENGTH, length); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ANGLE, angle); myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_SLOPE, slope); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -1095,6 +1109,8 @@ AdditionalHandler::parseE1Attributes(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_NEXT_EDGES, nextEdges); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_DETECT_PERSONS, detectPersons); myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -1109,8 +1125,10 @@ AdditionalHandler::parseE2Attributes(const SUMOSAXAttributes& attrs) { // check attributes if (attrs.hasAttribute(SUMO_ATTR_LANE) && ((positionDef + endPosDef + lengthDef) > 2)) { writeError(TL("'pos', 'endPos' and 'length' cannot be defined together in a single lane area detector.")); + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } else if (attrs.hasAttribute(SUMO_ATTR_LANE) && ((positionDef + endPosDef + lengthDef) < 2)) { writeError(TL("A single lane area detector requires two parameters of those 'pos', 'endPos' and 'length'.")); + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } else { // needed attributes const std::string id = attrs.get(SUMO_ATTR_ID, "", parsedOk); @@ -1169,6 +1187,8 @@ AdditionalHandler::parseE2Attributes(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_JAM_DIST_THRESHOLD, jamDistThreshold); myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos); myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_SHOW_DETECTOR, show); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } } @@ -1209,6 +1229,8 @@ AdditionalHandler::parseE3Attributes(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_HALTING_SPEED_THRESHOLD, haltingSpeedThreshold); myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_OPEN_ENTRY, openEntry); myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_EXPECT_ARRIVAL, expectedArrival); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -1232,6 +1254,8 @@ AdditionalHandler::parseEntryAttributes(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_LANE, laneId); myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_POSITION, position); myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -1255,6 +1279,8 @@ AdditionalHandler::parseExitAttributes(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_LANE, laneId); myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_POSITION, position); myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -1288,6 +1314,8 @@ AdditionalHandler::parseE1InstantAttributes(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_DETECT_PERSONS, detectPersons); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name); myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -1317,6 +1345,8 @@ AdditionalHandler::parseTAZAttributes(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_EDGES, edges); myCommonXMLStructure.getCurrentSumoBaseObject()->addColorAttribute(SUMO_ATTR_COLOR, color); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -1337,6 +1367,8 @@ AdditionalHandler::parseTAZSourceAttributes(const SUMOSAXAttributes& attrs) { // add all attributes myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, edgeID); myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_WEIGHT, weight); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -1357,6 +1389,8 @@ AdditionalHandler::parseTAZSinkAttributes(const SUMOSAXAttributes& attrs) { // add all attributes myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, edgeID); myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_WEIGHT, weight); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -1382,6 +1416,8 @@ AdditionalHandler::parseVariableSpeedSignAttributes(const SUMOSAXAttributes& att myCommonXMLStructure.getCurrentSumoBaseObject()->addPositionAttribute(SUMO_ATTR_POSITION, pos); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VTYPES, vehicleTypes); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -1403,6 +1439,8 @@ AdditionalHandler::parseVariableSpeedSignStepAttributes(const SUMOSAXAttributes& // add all attributes myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_TIME, time); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_SPEED, speed); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -1448,6 +1486,8 @@ AdditionalHandler::parseCalibratorAttributes(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_JAM_DIST_THRESHOLD, jamThreshold); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_OUTPUT, output); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VTYPES, vehicleTypes); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -1457,36 +1497,42 @@ AdditionalHandler::parseCalibratorFlowAttributes(const SUMOSAXAttributes& attrs) // declare Ok Flag bool parsedOk = true; // check parent - if (myCommonXMLStructure.getCurrentSumoBaseObject()->getParentSumoBaseObject() && - myCommonXMLStructure.getCurrentSumoBaseObject()->getParentSumoBaseObject()->getTag() != SUMO_TAG_ROOTFILE) { + if (checkCalibratorFlowParents()) { // check that frecuency and trafficLight aren't defined together if (!attrs.hasAttribute(SUMO_ATTR_TYPE) && !attrs.hasAttribute(SUMO_ATTR_VEHSPERHOUR) && !attrs.hasAttribute(SUMO_ATTR_SPEED)) { writeError(TL("CalibratorFlows need either the attribute vehsPerHour or speed or type (or any combination of these)")); - } - // first parse flow - SUMOVehicleParameter* flowParameter = SUMOVehicleParserHelper::parseVehicleAttributes(SUMO_TAG_FLOW, attrs, false, true, true); - if (flowParameter) { - // set VPH and speed - if (attrs.hasAttribute(SUMO_ATTR_VEHSPERHOUR)) { - flowParameter->repetitionOffset = TIME2STEPS(3600. / attrs.get(SUMO_ATTR_VEHSPERHOUR, "", parsedOk)); - flowParameter->parametersSet |= VEHPARS_VPH_SET; - } - if (attrs.hasAttribute(SUMO_ATTR_SPEED)) { - flowParameter->calibratorSpeed = attrs.get(SUMO_ATTR_SPEED, "", parsedOk); - flowParameter->parametersSet |= VEHPARS_CALIBRATORSPEED_SET; - } - // set begin and end - flowParameter->depart = attrs.getSUMOTimeReporting(SUMO_ATTR_BEGIN, "", parsedOk); - flowParameter->repetitionEnd = attrs.getSUMOTimeReporting(SUMO_ATTR_END, "", parsedOk); - if (parsedOk) { - // set tag - myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_FLOW); - // set vehicle parameters - myCommonXMLStructure.getCurrentSumoBaseObject()->setVehicleParameter(flowParameter); - // delete flow parameter (because in XMLStructure we have a copy) - delete flowParameter; + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); + } else { + SUMOVehicleParameter* flowParameter = SUMOVehicleParserHelper::parseVehicleAttributes(SUMO_TAG_FLOW, attrs, false, true, true); + if (flowParameter) { + // set VPH and speed + if (attrs.hasAttribute(SUMO_ATTR_VEHSPERHOUR)) { + flowParameter->repetitionOffset = TIME2STEPS(3600. / attrs.get(SUMO_ATTR_VEHSPERHOUR, "", parsedOk)); + flowParameter->parametersSet |= VEHPARS_VPH_SET; + } + if (attrs.hasAttribute(SUMO_ATTR_SPEED)) { + flowParameter->calibratorSpeed = attrs.get(SUMO_ATTR_SPEED, "", parsedOk); + flowParameter->parametersSet |= VEHPARS_CALIBRATORSPEED_SET; + } + // set begin and end + flowParameter->depart = attrs.getSUMOTimeReporting(SUMO_ATTR_BEGIN, "", parsedOk); + flowParameter->repetitionEnd = attrs.getSUMOTimeReporting(SUMO_ATTR_END, "", parsedOk); + if (parsedOk) { + // set tag + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_FLOW); + // set vehicle parameters + myCommonXMLStructure.getCurrentSumoBaseObject()->setVehicleParameter(flowParameter); + // delete flow parameter (because in XMLStructure we have a copy) + delete flowParameter; + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); + } + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -1506,6 +1552,10 @@ AdditionalHandler::parseRerouterAttributes(const SUMOSAXAttributes& attrs) { const std::vector vehicleTypes = attrs.getOpt >(SUMO_ATTR_VTYPES, id.c_str(), parsedOk, std::vector()); const bool off = attrs.getOpt(SUMO_ATTR_OFF, id.c_str(), parsedOk, false); const bool optional = attrs.getOpt(SUMO_ATTR_OPTIONAL, id.c_str(), parsedOk, false); + // check attributes + if (!checkNegative(SUMO_TAG_REROUTER, id, SUMO_ATTR_PROB , probability, true)) { + parsedOk = false; + } // continue if flag is ok if (parsedOk) { // set tag @@ -1520,6 +1570,8 @@ AdditionalHandler::parseRerouterAttributes(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VTYPES, vehicleTypes); myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_OFF, off); myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_OPTIONAL, optional); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -1540,6 +1592,8 @@ AdditionalHandler::parseRerouterIntervalAttributes(const SUMOSAXAttributes& attr // add all attributes myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_BEGIN, begin); myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_END, end); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -1563,6 +1617,8 @@ AdditionalHandler::parseClosingLaneRerouteAttributes(const SUMOSAXAttributes& at myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, laneID); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ALLOW, allow); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_DISALLOW, disallow); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -1586,6 +1642,8 @@ AdditionalHandler::parseClosingRerouteAttributes(const SUMOSAXAttributes& attrs) myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, edgeID); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ALLOW, allow); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_DISALLOW, disallow); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -1597,19 +1655,21 @@ AdditionalHandler::parseDestProbRerouteAttributes(const SUMOSAXAttributes& attrs // needed attributes const std::string edgeID = attrs.get(SUMO_ATTR_ID, "", parsedOk); const double probability = attrs.getOpt(SUMO_ATTR_PROB, "", parsedOk, 1); + // check attributes + if (!checkNegative(SUMO_TAG_DEST_PROB_REROUTE, edgeID, SUMO_ATTR_PROB, probability, true)) { + parsedOk = false; + } // check parent checkParsedParent(SUMO_TAG_DEST_PROB_REROUTE, {SUMO_TAG_INTERVAL}, parsedOk); // continue if flag is ok if (parsedOk) { - if (probability < 0) { - writeError(TLF("Probability of % must be equal or greater than 0", toString(SUMO_TAG_DEST_PROB_REROUTE))); - } else { - // set tag - myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_DEST_PROB_REROUTE); - // add all attributes - myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, edgeID); - myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_PROB, probability); - } + // set tag + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_DEST_PROB_REROUTE); + // add all attributes + myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, edgeID); + myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_PROB, probability); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -1621,22 +1681,24 @@ AdditionalHandler::parseParkingAreaRerouteAttributes(const SUMOSAXAttributes& at // needed attributes const std::string parkingAreaID = attrs.get(SUMO_ATTR_ID, "", parsedOk); const double probability = attrs.getOpt(SUMO_ATTR_PROB, "", parsedOk, 1); + // check attributes + if (!checkNegative(SUMO_TAG_PARKING_AREA_REROUTE, parkingAreaID, SUMO_ATTR_PROB, probability, true)) { + parsedOk = false; + } // optional attributes const bool visible = attrs.getOpt(SUMO_ATTR_VISIBLE, "", parsedOk, false); // check parent checkParsedParent(SUMO_TAG_PARKING_AREA_REROUTE, {SUMO_TAG_INTERVAL}, parsedOk); // continue if flag is ok if (parsedOk) { - if (probability < 0) { - writeError(TLF("Probability of % must be equal or greater than 0", toString(SUMO_TAG_PARKING_AREA_REROUTE))); - } else { - // set tag - myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_PARKING_AREA_REROUTE); - // add all attributes - myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, parkingAreaID); - myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_PROB, probability); - myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_VISIBLE, visible); - } + // set tag + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_PARKING_AREA_REROUTE); + // add all attributes + myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, parkingAreaID); + myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_PROB, probability); + myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_VISIBLE, visible); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -1648,19 +1710,21 @@ AdditionalHandler::parseRouteProbRerouteAttributes(const SUMOSAXAttributes& attr // needed attributes const std::string routeID = attrs.get(SUMO_ATTR_ID, "", parsedOk); const double probability = attrs.getOpt(SUMO_ATTR_PROB, "", parsedOk, 1); + // check attributes + if (!checkNegative(SUMO_TAG_ROUTE_PROB_REROUTE, routeID, SUMO_ATTR_PROB, probability, true)) { + parsedOk = false; + } // check parent checkParsedParent(SUMO_TAG_ROUTE_PROB_REROUTE, {SUMO_TAG_INTERVAL}, parsedOk); // continue if flag is ok if (parsedOk) { - if (probability < 0) { - writeError(TLF("Probability of % must be equal or greater than 0", toString(SUMO_TAG_ROUTE_PROB_REROUTE))); - } else { - // set tag - myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ROUTE_PROB_REROUTE); - // add all attributes - myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, routeID); - myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_PROB, probability); - } + // set tag + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ROUTE_PROB_REROUTE); + // add all attributes + myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, routeID); + myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_PROB, probability); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -1690,6 +1754,8 @@ AdditionalHandler::parseRouteProbeAttributes(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name); myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_BEGIN, begin); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VTYPES, vehicleTypes); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -1713,6 +1779,8 @@ AdditionalHandler::parseVaporizerAttributes(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_BEGIN, begin); myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_END, end); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -1736,6 +1804,8 @@ AdditionalHandler::parseTractionSubstation(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->addPositionAttribute(SUMO_ATTR_POSITION, pos); myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_VOLTAGE, voltage); myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_CURRENTLIMIT, currentLimit); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -1765,6 +1835,8 @@ AdditionalHandler::parseOverheadWire(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ENDPOS, endPos); myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_OVERHEAD_WIRE_FORBIDDEN, forbiddenInnerLanes); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -1791,6 +1863,8 @@ AdditionalHandler::parseOverheadWireClamp(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_OVERHEAD_WIRECLAMP_LANESTART, wireClampLaneStart); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_OVERHEAD_WIRECLAMP_END, wireClampEnd); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_OVERHEAD_WIRECLAMP_LANEEND, wireClampLaneEnd); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -1830,6 +1904,8 @@ AdditionalHandler::parsePolyAttributes(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ANGLE, angle); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name); myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_RELATIVEPATH, relativePath); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -1912,6 +1988,8 @@ AdditionalHandler::parsePOIAttributes(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ANGLE, angle); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name); myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_RELATIVEPATH, relativePath); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -1933,6 +2011,8 @@ AdditionalHandler::parseJpsWalkableAreaAttributes(const SUMOSAXAttributes& attrs myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id); myCommonXMLStructure.getCurrentSumoBaseObject()->addPositionVectorAttribute(SUMO_ATTR_SHAPE, shapeStr); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -1954,40 +2034,26 @@ AdditionalHandler::parseJpsObstacleAttributes(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id); myCommonXMLStructure.getCurrentSumoBaseObject()->addPositionVectorAttribute(SUMO_ATTR_SHAPE, shapeStr); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } -void -AdditionalHandler::parseParameters(const SUMOSAXAttributes& attrs) { - // declare Ok Flag - bool parsedOk = true; - // get key - const std::string key = attrs.get(SUMO_ATTR_KEY, nullptr, parsedOk); - // get SumoBaseObject parent - CommonXMLStructure::SumoBaseObject* SumoBaseObjectParent = myCommonXMLStructure.getCurrentSumoBaseObject()->getParentSumoBaseObject(); - // check parent - if (SumoBaseObjectParent == nullptr) { - writeError(TL("Parameters must be defined within an object.")); - } else if (SumoBaseObjectParent->getTag() == SUMO_TAG_ROOTFILE) { - writeError(TL("Parameters cannot be defined in the additional file's root.")); - } else if (SumoBaseObjectParent->getTag() == SUMO_TAG_PARAM) { - writeError(TL("Parameters cannot be defined within another parameter.")); - } else if (parsedOk) { - // get tag str - const std::string parentTagStr = toString(SumoBaseObjectParent->getTag()); - // circumventing empty string value - const std::string value = attrs.hasAttribute(SUMO_ATTR_VALUE) ? attrs.getString(SUMO_ATTR_VALUE) : ""; - // show warnings if values are invalid - if (key.empty()) { - WRITE_WARNINGF(TL("Error parsing key from % generic parameter. Key cannot be empty."), parentTagStr); - } else if (!SUMOXMLDefinitions::isValidParameterKey(key)) { - WRITE_WARNINGF(TL("Error parsing key from % generic parameter. Key contains invalid characters."), parentTagStr); - } else { - WRITE_DEBUG("Inserting generic parameter '" + key + "|" + value + "' into " + parentTagStr); - // insert parameter in SumoBaseObjectParent - SumoBaseObjectParent->addParameter(key, value); - } +bool +AdditionalHandler::checkCalibratorFlowParents() { + const auto parentCalibrator = myCommonXMLStructure.getCurrentSumoBaseObject()->getParentSumoBaseObject(); + if (parentCalibrator == nullptr) { + return false; + } + const auto parentRootFile = parentCalibrator->getParentSumoBaseObject(); + if (parentRootFile != nullptr) { + return false; + } + if ((parentCalibrator->getTag() == SUMO_TAG_CALIBRATOR) || (parentCalibrator->getTag() == GNE_TAG_CALIBRATOR_LANE)){ + return true; + } else { + return writeError(TLF("Calibrator Flows has to be defined within of a %.", toString(SUMO_TAG_CALIBRATOR))); } } diff --git a/src/utils/handlers/AdditionalHandler.h b/src/utils/handlers/AdditionalHandler.h index c8d9812c30a7..73d26900688b 100644 --- a/src/utils/handlers/AdditionalHandler.h +++ b/src/utils/handlers/AdditionalHandler.h @@ -736,11 +736,11 @@ class AdditionalHandler : public CommonHandler { /// @brief parse juPedSim obstacle attributes void parseJpsObstacleAttributes(const SUMOSAXAttributes& attrs); - /// @brief parse generic parameters - void parseParameters(const SUMOSAXAttributes& attrs); - /// @} + /// @brief check calibrator flow parents + bool checkCalibratorFlowParents(); + /// @brief check detect persons bool checkDetectPersons(const SumoXMLTag currentTag, const std::string& id, const std::string& detectPersons); diff --git a/src/utils/handlers/CommonHandler.cpp b/src/utils/handlers/CommonHandler.cpp index 306ae18bf1f2..c66b9940fb69 100644 --- a/src/utils/handlers/CommonHandler.cpp +++ b/src/utils/handlers/CommonHandler.cpp @@ -43,6 +43,38 @@ CommonHandler::isErrorCreatingElement() const { } +void +CommonHandler::parseParameters(const SUMOSAXAttributes& attrs) { + // declare Ok Flag + bool parsedOk = true; + // get key + const std::string key = attrs.get(SUMO_ATTR_KEY, nullptr, parsedOk); + // get SumoBaseObject parent + CommonXMLStructure::SumoBaseObject* SumoBaseObjectParent = myCommonXMLStructure.getCurrentSumoBaseObject()->getParentSumoBaseObject(); + // check parent + if ((SumoBaseObjectParent == nullptr) || (SumoBaseObjectParent->getTag() == SUMO_TAG_ROOTFILE)) { + writeError(TL("Parameters must be defined within an object")); + } else if (SumoBaseObjectParent->getTag() == SUMO_TAG_PARAM) { + writeError(TL("Parameters cannot be defined within another parameter.")); + } else if ((SumoBaseObjectParent->getTag() == SUMO_TAG_NOTHING) && parsedOk) { + // get tag str + const std::string parentTagStr = toString(SumoBaseObjectParent->getTag()); + // circumventing empty string value + const std::string value = attrs.hasAttribute(SUMO_ATTR_VALUE) ? attrs.getString(SUMO_ATTR_VALUE) : ""; + // show warnings if values are invalid + if (key.empty()) { + writeError(TLF("Error parsing key from % generic parameter. Key cannot be empty", parentTagStr)); + } else if (!SUMOXMLDefinitions::isValidParameterKey(key)) { + writeError(TLF("Error parsing key from % generic parameter. Key contains invalid characters", parentTagStr)); + } else { + WRITE_DEBUG("Inserting generic parameter '" + key + "|" + value + "' into " + parentTagStr); + // insert parameter in SumoBaseObjectParent + SumoBaseObjectParent->addParameter(key, value); + } + } +} + + void CommonHandler::checkParsedParent(const SumoXMLTag currentTag, const std::vector& parentTags, bool& ok) { if (parentTags.size() > 0) { @@ -61,7 +93,7 @@ CommonHandler::checkParsedParent(const SumoXMLTag currentTag, const std::vector< CommonXMLStructure::SumoBaseObject* const parent = myCommonXMLStructure.getCurrentSumoBaseObject()->getParentSumoBaseObject(); if (parent == nullptr) { ok = writeError(TLF("'%' must be defined within the definition of a %.", toString(currentTag), tagsStr)); - } else if (std::find(parentTags.begin(), parentTags.end(), parent->getTag()) == parentTags.end()) { + } else if ((parent->getTag() != SUMO_TAG_NOTHING) && std::find(parentTags.begin(), parentTags.end(), parent->getTag()) == parentTags.end()) { if (parent->hasStringAttribute(SUMO_ATTR_ID)) { ok = writeError(TLF("'%' must be defined within the definition of a '%' (found % '%').", toString(currentTag), tagsStr, toString(parent->getTag()), parent->getStringAttribute(SUMO_ATTR_ID))); diff --git a/src/utils/handlers/CommonHandler.h b/src/utils/handlers/CommonHandler.h index b0d666d701d7..b38193082297 100644 --- a/src/utils/handlers/CommonHandler.h +++ b/src/utils/handlers/CommonHandler.h @@ -53,6 +53,9 @@ class CommonHandler { /// @brief flag for mark if a element wasn't created bool myErrorCreatingElement = false; + /// @brief parse generic parameters + void parseParameters(const SUMOSAXAttributes& attrs); + /// @name check functions /// @{ /// @brief check parsed parents diff --git a/src/utils/handlers/DataHandler.cpp b/src/utils/handlers/DataHandler.cpp index 191340238f69..2455ea632985 100644 --- a/src/utils/handlers/DataHandler.cpp +++ b/src/utils/handlers/DataHandler.cpp @@ -169,6 +169,8 @@ DataHandler::parseInterval(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id); myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_BEGIN, begin); myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_END, end); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -187,6 +189,8 @@ DataHandler::parseEdgeData(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_EDGE); // add all attributes myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -207,6 +211,8 @@ DataHandler::parseEdgeRelationData(const SUMOSAXAttributes& attrs) { // add all attributes myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_FROM, from); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_TO, to); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -227,6 +233,8 @@ DataHandler::parseTAZRelationData(const SUMOSAXAttributes& attrs) { // add all attributes myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_FROM, from); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_TO, to); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } diff --git a/src/utils/handlers/MeanDataHandler.cpp b/src/utils/handlers/MeanDataHandler.cpp index 638629fbaecf..fa8cbbe3fe59 100644 --- a/src/utils/handlers/MeanDataHandler.cpp +++ b/src/utils/handlers/MeanDataHandler.cpp @@ -191,6 +191,8 @@ MeanDataHandler::parseEdgeMeanData(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_MAX_TRAVELTIME, maxTravel); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VTYPES, vTypes); myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_HALTING_SPEED_THRESHOLD, speedThreshold); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -240,6 +242,8 @@ MeanDataHandler::parseLaneMeanData(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_MAX_TRAVELTIME, maxTravel); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VTYPES, vTypes); myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_HALTING_SPEED_THRESHOLD, speedThreshold); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } diff --git a/src/utils/handlers/RouteHandler.cpp b/src/utils/handlers/RouteHandler.cpp index eb3ad66f6663..e4ee236e0292 100644 --- a/src/utils/handlers/RouteHandler.cpp +++ b/src/utils/handlers/RouteHandler.cpp @@ -431,6 +431,8 @@ RouteHandler::parseVType(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->setVehicleTypeParameter(vehicleTypeParameter); // delete vehicleType parameter (because in XMLStructure we have a copy) delete vehicleTypeParameter; + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -445,18 +447,20 @@ RouteHandler::parseVTypeDistribution(const SUMOSAXAttributes& attrs) { const int deterministic = attrs.getOpt(SUMO_ATTR_DETERMINISTIC, id.c_str(), parsedOk, -1); const std::vector vTypes = attrs.getOpt >(SUMO_ATTR_VTYPES, id.c_str(), parsedOk); const std::vector probabilities = attrs.getOpt >(SUMO_ATTR_PROBS, id.c_str(), parsedOk); + // check distribution + if (vTypes.size() != probabilities.size()) { + parsedOk = writeErrorInvalidDistribution(SUMO_TAG_VTYPE_DISTRIBUTION, id); + } if (parsedOk) { - if (vTypes.size() != probabilities.size()) { - writeErrorInvalidDistribution(SUMO_TAG_VTYPE_DISTRIBUTION, id); - } else { - // set tag - myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_VTYPE_DISTRIBUTION); - // add all attributes - myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id); - myCommonXMLStructure.getCurrentSumoBaseObject()->addIntAttribute(SUMO_ATTR_DETERMINISTIC, deterministic); - myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VTYPES, vTypes); - myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleListAttribute(SUMO_ATTR_PROBS, probabilities); - } + // set tag + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_VTYPE_DISTRIBUTION); + // add all attributes + myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id); + myCommonXMLStructure.getCurrentSumoBaseObject()->addIntAttribute(SUMO_ATTR_DETERMINISTIC, deterministic); + myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VTYPES, vTypes); + myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleListAttribute(SUMO_ATTR_PROBS, probabilities); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -481,21 +485,23 @@ RouteHandler::parseRoute(const SUMOSAXAttributes& attrs) { const int repeat = attrs.getOpt(SUMO_ATTR_REPEAT, id.c_str(), parsedOk, 0); const SUMOTime cycleTime = attrs.getOptSUMOTimeReporting(SUMO_ATTR_CYCLETIME, id.c_str(), parsedOk, 0); const double probability = attrs.getOpt(SUMO_ATTR_PROB, id.c_str(), parsedOk, 0); + // check attributes + if (!checkNegative(SUMO_TAG_ROUTE, id, SUMO_ATTR_CYCLETIME, cycleTime, true)) { + parsedOk = false; + } if (parsedOk) { - if (cycleTime < 0) { - writeError(TLF("cycleTime of % must be equal or greater than 0", toString(SUMO_TAG_DEST_PROB_REROUTE))); - } else { - // set tag - myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ROUTE); - // add all attributes - myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id); - myCommonXMLStructure.getCurrentSumoBaseObject()->setVClass(vClass); - myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_EDGES, edges); - myCommonXMLStructure.getCurrentSumoBaseObject()->addColorAttribute(SUMO_ATTR_COLOR, color); - myCommonXMLStructure.getCurrentSumoBaseObject()->addIntAttribute(SUMO_ATTR_REPEAT, repeat); - myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_CYCLETIME, cycleTime); - myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_PROB, probability); - } + // set tag + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ROUTE); + // add all attributes + myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id); + myCommonXMLStructure.getCurrentSumoBaseObject()->setVClass(vClass); + myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_EDGES, edges); + myCommonXMLStructure.getCurrentSumoBaseObject()->addColorAttribute(SUMO_ATTR_COLOR, color); + myCommonXMLStructure.getCurrentSumoBaseObject()->addIntAttribute(SUMO_ATTR_REPEAT, repeat); + myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_CYCLETIME, cycleTime); + myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_PROB, probability); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } } @@ -510,17 +516,19 @@ RouteHandler::parseRouteDistribution(const SUMOSAXAttributes& attrs) { // optional attributes const std::vector routes = attrs.getOpt >(SUMO_ATTR_ROUTES, id.c_str(), parsedOk); const std::vector probabilities = attrs.getOpt >(SUMO_ATTR_PROBS, id.c_str(), parsedOk); + // check distribution + if (routes.size() != probabilities.size()) { + parsedOk = writeErrorInvalidDistribution(SUMO_TAG_ROUTE_DISTRIBUTION, id); + } if (parsedOk) { - if (routes.size() != probabilities.size()) { - writeErrorInvalidDistribution(SUMO_TAG_ROUTE_DISTRIBUTION, id); - } else { - // set tag - myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ROUTE_DISTRIBUTION); - // add all attributes - myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id); - myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_ROUTES, routes); - myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleListAttribute(SUMO_ATTR_PROBS, probabilities); - } + // set tag + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ROUTE_DISTRIBUTION); + // add all attributes + myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id); + myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_ROUTES, routes); + myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleListAttribute(SUMO_ATTR_PROBS, probabilities); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -535,8 +543,10 @@ RouteHandler::parseTrip(const SUMOSAXAttributes& attrs) { // check from/to edge/junction if ((attrs.hasAttribute(SUMO_ATTR_FROM) + attrs.hasAttribute(SUMO_ATTR_FROM_JUNCTION) + attrs.hasAttribute(SUMO_ATTR_FROM_TAZ)) > 1) { writeError(TL("Attributes 'from', 'fromJunction' and 'fromTaz' cannot be defined together")); + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } else if ((attrs.hasAttribute(SUMO_ATTR_TO) + attrs.hasAttribute(SUMO_ATTR_TO_JUNCTION) + attrs.hasAttribute(SUMO_ATTR_TO_TAZ)) > 1) { writeError(TL("Attributes 'to', 'toJunction' and 'toTaz' cannot be defined together")); + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } else if (attrs.hasAttribute(SUMO_ATTR_FROM_JUNCTION) && attrs.hasAttribute(SUMO_ATTR_TO_JUNCTION)) { // from-to attributes const std::string fromJunction = attrs.get(SUMO_ATTR_FROM_JUNCTION, tripParameter->id.c_str(), parsedOk); @@ -549,6 +559,8 @@ RouteHandler::parseTrip(const SUMOSAXAttributes& attrs) { // add other attributes myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_FROM_JUNCTION, fromJunction); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_TO_JUNCTION, toJunction); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } else if (attrs.hasAttribute(SUMO_ATTR_FROM_TAZ) && attrs.hasAttribute(SUMO_ATTR_TO_TAZ)) { // from-to attributes @@ -562,6 +574,8 @@ RouteHandler::parseTrip(const SUMOSAXAttributes& attrs) { // add other attributes myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_FROM_TAZ, fromJunction); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_TO_TAZ, toJunction); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } else { // from-to attributes @@ -578,10 +592,14 @@ RouteHandler::parseTrip(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_FROM, from); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_TO, to); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VIA, via); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } // delete trip parameter (because in XMLStructure we have a copy) delete tripParameter; + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -597,6 +615,8 @@ RouteHandler::parseVehicle(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->setVehicleParameter(vehicleParameter); // delete vehicle parameter (because in XMLStructure we have a copy) delete vehicleParameter; + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -613,8 +633,10 @@ RouteHandler::parseFlow(const SUMOSAXAttributes& attrs) { // check from/to edge/junction if ((attrs.hasAttribute(SUMO_ATTR_FROM) + attrs.hasAttribute(SUMO_ATTR_FROM_JUNCTION) + attrs.hasAttribute(SUMO_ATTR_FROM_TAZ)) > 1) { writeError(TL("Attributes 'from', 'fromJunction' and 'fromTaz' cannot be defined together")); + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } else if ((attrs.hasAttribute(SUMO_ATTR_TO) + attrs.hasAttribute(SUMO_ATTR_TO_JUNCTION) + attrs.hasAttribute(SUMO_ATTR_TO_TAZ)) > 1) { writeError(TL("Attributes 'to', 'toJunction' and 'toTaz' cannot be defined together")); + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } else if (attrs.hasAttribute(SUMO_ATTR_FROM) && attrs.hasAttribute(SUMO_ATTR_TO)) { // from-to attributes const std::string from = attrs.get(SUMO_ATTR_FROM, flowParameter->id.c_str(), parsedOk); @@ -628,6 +650,8 @@ RouteHandler::parseFlow(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_FROM, from); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_TO, to); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VIA, via); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } else if (attrs.hasAttribute(SUMO_ATTR_FROM_JUNCTION) && attrs.hasAttribute(SUMO_ATTR_TO_JUNCTION)) { // from-to attributes @@ -639,6 +663,8 @@ RouteHandler::parseFlow(const SUMOSAXAttributes& attrs) { // add other attributes myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_FROM_JUNCTION, fromJunction); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_TO_JUNCTION, toJunction); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } else if (attrs.hasAttribute(SUMO_ATTR_FROM_TAZ) && attrs.hasAttribute(SUMO_ATTR_TO_TAZ)) { // from-to attributes @@ -650,6 +676,8 @@ RouteHandler::parseFlow(const SUMOSAXAttributes& attrs) { // add other attributes myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_FROM_TAZ, fromJunction); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_TO_TAZ, toJunction); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } else if (attrs.hasAttribute(SUMO_ATTR_ROUTE)) { // from-to attributes @@ -659,6 +687,8 @@ RouteHandler::parseFlow(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_FLOW); // add other attributes myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ROUTE, route); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } else { // set tag @@ -666,6 +696,8 @@ RouteHandler::parseFlow(const SUMOSAXAttributes& attrs) { } // delete flow parameter (because in XMLStructure we have a copy) delete flowParameter; + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -693,6 +725,8 @@ RouteHandler::parseStop(const SUMOSAXAttributes& attrs) { // add stop attributes myCommonXMLStructure.getCurrentSumoBaseObject()->setPlanParameters(planParameters); myCommonXMLStructure.getCurrentSumoBaseObject()->setStopParameter(stop); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -708,6 +742,8 @@ RouteHandler::parsePerson(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->setVehicleParameter(personParameter); // delete person parameter (because in XMLStructure we have a copy) delete personParameter; + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -723,6 +759,8 @@ RouteHandler::parsePersonFlow(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->setVehicleParameter(personFlowParameter); // delete person flow parameter (because in XMLStructure we have a copy) delete personFlowParameter; + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -763,6 +801,8 @@ RouteHandler::parsePersonTrip(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ARRIVALPOS, arrivalPos); myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_WALKFACTOR, walkFactor); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_GROUP, group); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -770,7 +810,8 @@ RouteHandler::parsePersonTrip(const SUMOSAXAttributes& attrs) { void RouteHandler::parseWalk(const SUMOSAXAttributes& attrs) { if (attrs.hasAttribute(SUMO_ATTR_SPEED) && attrs.hasAttribute(SUMO_ATTR_DURATION)) { - WRITE_ERROR(TL("Speed and duration attributes cannot be defined together in walks")); + writeError(TL("Speed and duration attributes cannot be defined together in walks")); + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } else { // declare Ok Flag bool parsedOk = true; @@ -792,6 +833,8 @@ RouteHandler::parseWalk(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ARRIVALPOS, arrivalPos); myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_SPEED, speed); myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_DURATION, duration); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } } @@ -817,6 +860,8 @@ RouteHandler::parseRide(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_LINES, lines); myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ARRIVALPOS, arrivalPos); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_GROUP, group); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -832,6 +877,8 @@ RouteHandler::parseContainer(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->setVehicleParameter(containerParameter); // delete container parameter (because in XMLStructure we have a copy) delete containerParameter; + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -847,6 +894,8 @@ RouteHandler::parseContainerFlow(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->setVehicleParameter(containerFlowParameter); // delete container flow parameter (because in XMLStructure we have a copy) delete containerFlowParameter; + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -871,6 +920,8 @@ RouteHandler::parseTransport(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_LINES, lines); myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ARRIVALPOS, arrivalPos); myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_GROUP, group); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } @@ -878,7 +929,8 @@ RouteHandler::parseTransport(const SUMOSAXAttributes& attrs) { void RouteHandler::parseTranship(const SUMOSAXAttributes& attrs) { if (attrs.hasAttribute(SUMO_ATTR_SPEED) && attrs.hasAttribute(SUMO_ATTR_DURATION)) { - WRITE_ERROR(TL("Speed and duration attributes cannot be defined together in tranships")); + writeError(TL("Speed and duration attributes cannot be defined together in tranships")); + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } else { // declare Ok Flag bool parsedOk = true; @@ -900,6 +952,8 @@ RouteHandler::parseTranship(const SUMOSAXAttributes& attrs) { myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_DEPARTPOS, departPos); myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_SPEED, speed); myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_DURATION, duration); + } else { + myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_NOTHING); } } } @@ -915,43 +969,8 @@ RouteHandler::parseInterval(const SUMOSAXAttributes& attrs) { } -void -RouteHandler::parseParameters(const SUMOSAXAttributes& attrs) { - // declare Ok Flag - bool parsedOk = true; - // get key - const std::string key = attrs.get(SUMO_ATTR_KEY, nullptr, parsedOk); - // get SumoBaseObject parent - CommonXMLStructure::SumoBaseObject* SumoBaseObjectParent = myCommonXMLStructure.getCurrentSumoBaseObject()->getParentSumoBaseObject(); - // check parent - if (SumoBaseObjectParent == nullptr) { - writeError(TL("Parameters must be defined within an object")); - } else if (SumoBaseObjectParent->getTag() == SUMO_TAG_ROOTFILE) { - writeError(TL("Parameters cannot be defined in the additional file's root.")); - } else if (SumoBaseObjectParent->getTag() == SUMO_TAG_PARAM) { - writeError(TL("Parameters cannot be defined within another parameter.")); - } else if (parsedOk) { - // get tag str - const std::string parentTagStr = toString(SumoBaseObjectParent->getTag()); - // circumventing empty string value - const std::string value = attrs.hasAttribute(SUMO_ATTR_VALUE) ? attrs.getString(SUMO_ATTR_VALUE) : ""; - // show warnings if values are invalid - if (key.empty()) { - WRITE_WARNINGF(TL("Error parsing key from % generic parameter. Key cannot be empty"), parentTagStr); - } else if (!SUMOXMLDefinitions::isValidParameterKey(key)) { - WRITE_WARNINGF(TL("Error parsing key from % generic parameter. Key contains invalid characters"), parentTagStr); - } else { - WRITE_DEBUG("Inserting generic parameter '" + key + "|" + value + "' into " + parentTagStr); - // insert parameter in SumoBaseObjectParent - SumoBaseObjectParent->addParameter(key, value); - } - } -} - - bool -RouteHandler::parseNestedCFM(const SumoXMLTag tag, const SUMOSAXAttributes& attrs, - CommonXMLStructure::SumoBaseObject* vTypeObject) { +RouteHandler::parseNestedCFM(const SumoXMLTag tag, const SUMOSAXAttributes& attrs, CommonXMLStructure::SumoBaseObject* vTypeObject) { // write warning info WRITE_WARNINGF(TL("Defining car-following parameters in a nested element is deprecated in vType '%', use attributes instead!"), vTypeObject->getStringAttribute(SUMO_ATTR_ID)); // get vType to modify it diff --git a/src/utils/handlers/RouteHandler.h b/src/utils/handlers/RouteHandler.h index 2c94a2ed9ae5..1ae9724a26d8 100644 --- a/src/utils/handlers/RouteHandler.h +++ b/src/utils/handlers/RouteHandler.h @@ -212,18 +212,15 @@ class RouteHandler : public CommonHandler { /// @brief parse interval void parseInterval(const SUMOSAXAttributes& attrs); - /// @brief parse generic parameters - void parseParameters(const SUMOSAXAttributes& attrs); - /// @brief parse nested CarFollowingModel bool parseNestedCFM(const SumoXMLTag tag, const SUMOSAXAttributes& attrs, CommonXMLStructure::SumoBaseObject* vTypeObject); - /// @} - /// @brief parse stop parameters bool parseStopParameters(SUMOVehicleParameter::Stop& stop, const SUMOSAXAttributes& attrs); + /// @} + /// @brief check embedded route bool isEmbeddedRoute(const SUMOSAXAttributes& attrs) const; diff --git a/tests/tools/visualization/plotXMLAttributes/testsuite.tools b/tests/tools/visualization/plotXMLAttributes/testsuite.tools index 43430928ef28..1c49b2d2f65a 100644 --- a/tests/tools/visualization/plotXMLAttributes/testsuite.tools +++ b/tests/tools/visualization/plotXMLAttributes/testsuite.tools @@ -88,3 +88,6 @@ no_linebreaks_robust # xml input contains no linebreaks, using robust parser (all attributes in one element) no_linebreaks_robust2 + +# split value into list +vehroute_exitTimes diff --git a/tests/tools/visualization/plotXMLAttributes/vehroute_exitTimes/csv.tools b/tests/tools/visualization/plotXMLAttributes/vehroute_exitTimes/csv.tools new file mode 100644 index 000000000000..bc385c71c2cd --- /dev/null +++ b/tests/tools/visualization/plotXMLAttributes/vehroute_exitTimes/csv.tools @@ -0,0 +1,219 @@ +# "v0" +0.0 1.02 +0.0 1.52 +0.0 1.78 +0.0 2.07 +0.0 2.74 +0.0 3.24 +0.0 3.45 +0.0 4.05 +0.0 4.64 +0.0 6.85 +0.0 26.24 +0.0 27.74 +0.0 30.47 +0.0 31.48 +0.0 31.95 +0.0 35.01 +0.0 53.11 +0.0 56.71 +0.0 56.94 +0.0 57.33 +0.0 57.8 +0.0 58.33 +0.0 58.8 +0.0 67.47 +0.0 68.5 +0.0 69.7 +0.0 72.56 +0.0 72.96 +0.0 73.58 +0.0 73.94 +0.0 76.24 +0.0 80.75 +0.0 81.3 +0.0 81.69 +0.0 82.1 +0.0 82.94 +0.0 83.42 +0.0 84.03 +0.0 84.79 +0.0 85.06 +0.0 86.66 +0.0 89.54 +0.0 90.94 +0.0 92.83 +0.0 93.97 +0.0 94.42 +0.0 94.95 +0.0 95.83 +0.0 96.43 +0.0 103.44 +0.0 112.19 +0.0 119.26 +0.0 119.98 +0.0 129.48 +0.0 129.97 +0.0 130.47 +0.0 132.15 +0.0 133.59 +0.0 135.76 +0.0 138.83 +0.0 140.26 +0.0 141.06 +0.0 142.59 +0.0 146.98 +0.0 149.09 +0.0 152.75 +0.0 155.65 +0.0 163.66 +0.0 164.48 +0.0 169.21 +0.0 171.29 +0.0 171.6 +0.0 173.71 +0.0 174.82 +0.0 175.33 +0.0 175.68 +0.0 178.45 +0.0 178.72 +0.0 179.25 +0.0 180.95 +0.0 181.93 +0.0 184.03 +0.0 184.73 +0.0 185.42 +0.0 186.11 +0.0 187.76 +0.0 188.49 +0.0 189.11 +0.0 192.57 +0.0 194.33 +0.0 194.87 +0.0 200.63 +0.0 201.36 +0.0 202.92 +0.0 203.35 +0.0 206.46 +0.0 207.82 +0.0 209.93 +0.0 210.34 +0.0 211.61 +0.0 212.19 +0.0 212.77 +0.0 214.71 +0.0 215.08 +0.0 215.24 +0.0 217.9 +0.0 222.03 +0.0 222.5 +0.0 223.1 +0.0 223.47 +0.0 224.11 +0.0 225.51 +0.0 226.21 +0.0 230.99 +0.0 233.88 +0.0 239.2 +0.0 249.23 +0.0 250.63 +0.0 252.69 +0.0 258.52 +0.0 270.72 +0.0 277.62 +0.0 278.32 +0.0 279.26 +0.0 279.94 +0.0 280.88 +0.0 281.34 +0.0 284.99 +0.0 285.6 +0.0 286.46 +0.0 290.86 +0.0 291.1 +0.0 292.43 +0.0 292.84 +0.0 293.14 +0.0 293.45 +0.0 293.78 +0.0 294.71 +0.0 300.37 +0.0 302.25 +0.0 304.91 +0.0 305.66 +0.0 306.48 +0.0 308.14 +0.0 312.12 +0.0 312.53 +0.0 313.41 +0.0 313.86 +0.0 314.21 +0.0 314.54 +0.0 315.17 +0.0 318.92 +0.0 319.22 +0.0 319.67 +0.0 324.33 +0.0 324.78 +0.0 325.19 +0.0 325.31 +0.0 326.01 +0.0 326.8 +0.0 332.1 +0.0 338.03 +0.0 342.06 +0.0 345.13 +0.0 346.98 +0.0 347.99 +0.0 349.52 +0.0 350.77 +0.0 354.58 +0.0 355.6 +0.0 356.57 +0.0 357.06 +0.0 359.27 +0.0 361.88 +0.0 366.45 +0.0 368.59 +0.0 369.54 +0.0 373.74 +0.0 374.69 +0.0 375.26 +0.0 377.14 +0.0 379.62 +0.0 381.47 +0.0 384.21 +0.0 384.92 +0.0 386.6 +0.0 386.74 +0.0 386.9 +0.0 388.61 +0.0 390.5 +0.0 394.47 +0.0 396.54 +0.0 402.15 +0.0 403.62 +0.0 405.19 +0.0 411.57 +0.0 412.62 +0.0 413.02 +0.0 414.3 +0.0 422.45 +0.0 429.31 +0.0 430.75 +0.0 434.76 +0.0 440.6 +0.0 443.76 +0.0 458.75 +0.0 465.01 +0.0 476.7 +0.0 478.67 +0.0 483.06 +0.0 488.11 +0.0 494.95 +0.0 503.12 +0.0 505.45 +0.0 513.9 +0.0 521.78 + + diff --git a/tests/tools/visualization/plotXMLAttributes/vehroute_exitTimes/errors.tools b/tests/tools/visualization/plotXMLAttributes/vehroute_exitTimes/errors.tools new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/tools/visualization/plotXMLAttributes/vehroute_exitTimes/input_data.xml b/tests/tools/visualization/plotXMLAttributes/vehroute_exitTimes/input_data.xml new file mode 100644 index 000000000000..f72bfc2faeb7 --- /dev/null +++ b/tests/tools/visualization/plotXMLAttributes/vehroute_exitTimes/input_data.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/tests/tools/visualization/plotXMLAttributes/vehroute_exitTimes/options.tools b/tests/tools/visualization/plotXMLAttributes/vehroute_exitTimes/options.tools new file mode 100644 index 000000000000..f2f3052ff36b --- /dev/null +++ b/tests/tools/visualization/plotXMLAttributes/vehroute_exitTimes/options.tools @@ -0,0 +1,3 @@ +input_data.xml -o image.png --csv-output out.csv +-x @INDEX -y exitTimes --split-y +tools/visualization/plotXMLAttributes.py diff --git a/tests/tools/visualization/plotXMLAttributes/vehroute_exitTimes/output.tools b/tests/tools/visualization/plotXMLAttributes/vehroute_exitTimes/output.tools new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tools/assign/duaIterate_routeCosts.py b/tools/assign/duaIterate_routeCosts.py index 68f0a0943774..486bac242c25 100755 --- a/tools/assign/duaIterate_routeCosts.py +++ b/tools/assign/duaIterate_routeCosts.py @@ -177,10 +177,10 @@ def distinct(stepRoutes, verbose=True): etup = tuple(r.edges) if etup in counts: counts[etup][0] += 1 - routes2.append(r) else: # store information sufficient for identifying the route counts[etup] = [1, (r.vehID, r.index)] + routes2.append(r) result.append((step, routes2)) if verbose: print("Route usage counts in step %s (Count vehID routeIndex)" % step) @@ -208,15 +208,19 @@ def recompute_costs(baseDir, stepRoutes, netfile=None, tmpfileprefix="tmp"): tf.write('\n') for interval in sumolib.xml.parse_fast(dumpfile, "interval", ["begin"]): for r in routes: + # write a routeID for easier plotting vehID = "%s_%s_%s" % (r.vehID, r.index, interval.begin) + routeID = "%s_%s" % (r.vehID, r.index) tf.write(' \n' % (vehID, interval.begin)) tf.write(' \n' % ' '.join(map(numberToString, r.edges))) + tf.write(' \n' % routeID) tf.write(' \n') tf.write('\n') args = [DUAROUTER, '-c', duarDict[step], '--weight-files', dumpfile, '--skip-new-routes', + '--exit-times', '-r', tmp_input, '-o', tmp_output] if netfile: diff --git a/tools/visualization/plotXMLAttributes.py b/tools/visualization/plotXMLAttributes.py index 030cbc697908..22cbbd211fca 100755 --- a/tools/visualization/plotXMLAttributes.py +++ b/tools/visualization/plotXMLAttributes.py @@ -97,6 +97,10 @@ def getOptions(args=None): help="if --xattr is a list concatenate the values") optParser.add_option("--join-y", action="store_true", dest="joiny", default=False, help="if --yattr is a list concatenate the values") + optParser.add_option("--split-x", action="store_true", dest="splitx", default=False, + help="interpret the x value as a list of values") + optParser.add_option("--split-y", action="store_true", dest="splity", default=False, + help="interpret the y value as a list of values") optParser.add_option("--xfactor", help="multiplier for x-data", type=float, default=1) optParser.add_option("--yfactor", help="multiplier for y-data", type=float, default=1) optParser.add_option("--xbin", help="binning size for x-data", type=float) @@ -216,6 +220,16 @@ def onpick(event): mevent = event.mouseevent print("dataID=%s x=%d y=%d" % (event.artist.get_label(), mevent.xdata, mevent.ydata)) +def makeSplitter(splitx, ds_fun): + def splitter(file): + for dataID, x, y in ds_fun(file): + if splitx: + for x2 in x.split(): + yield dataID, x2, y + else: + for y2 in y.split(): + yield dataID, x, y2 + return splitter def getDataStream(options): # determine elements and nesting for the given attributes @@ -358,6 +372,11 @@ def datastream(xmlfile): if missingParents: print("Use options --xelem, --yelem, --idelem to resolve ambiguous elements") + if options.splitx: + datastream = makeSplitter(True, datastream) + if options.splity: + datastream = makeSplitter(False, datastream) + return datastream elif len(allElems) == 1: