本文整理汇总了C++中SUMOSAXAttributes::getStringReporting方法的典型用法代码示例。如果您正苦于以下问题:C++ SUMOSAXAttributes::getStringReporting方法的具体用法?C++ SUMOSAXAttributes::getStringReporting怎么用?C++ SUMOSAXAttributes::getStringReporting使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类SUMOSAXAttributes
的用法示例。
在下文中一共展示了SUMOSAXAttributes::getStringReporting方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: st
void
MSRouteHandler::openVehicleTypeDistribution(const SUMOSAXAttributes& attrs) {
bool ok = true;
myCurrentVTypeDistributionID = attrs.getStringReporting(SUMO_ATTR_ID, 0, ok);
if (ok) {
myCurrentVTypeDistribution = new RandomDistributor<MSVehicleType*>();
if (attrs.hasAttribute(SUMO_ATTR_VTYPES) || attrs.hasAttribute(SUMO_ATTR_VTYPES__DEPRECATED)) {
std::string vTypes;
if (!myHaveWarnedAboutDeprecatedVTypes && attrs.hasAttribute(SUMO_ATTR_VTYPES__DEPRECATED)) {
myHaveWarnedAboutDeprecatedVTypes = true;
WRITE_WARNING("'" + toString(SUMO_ATTR_VTYPES__DEPRECATED) + "' is deprecated, please use '" + toString(SUMO_ATTR_VTYPES) + "' instead.");
vTypes = attrs.getStringReporting(SUMO_ATTR_VTYPES__DEPRECATED, myCurrentVTypeDistributionID.c_str(), ok);
} else {
vTypes = attrs.getStringReporting(SUMO_ATTR_VTYPES, myCurrentVTypeDistributionID.c_str(), ok);
}
StringTokenizer st(vTypes);
while (st.hasNext()) {
std::string vtypeID = st.next();
MSVehicleType* type = MSNet::getInstance()->getVehicleControl().getVType(vtypeID);
if (type == 0) {
throw ProcessError("Unknown vtype '" + vtypeID + "' in distribution '" + myCurrentVTypeDistributionID + "'.");
}
myCurrentVTypeDistribution->add(type->getDefaultProbability(), type);
}
}
}
}
示例2: pos
bool
NIXMLEdgesHandler::setNodes(const SUMOSAXAttributes &attrs) throw() {
// the names and the coordinates of the beginning and the end node
// may be found, try
bool ok = true;
std::string begNodeID = myIsUpdate ? myCurrentEdge->getFromNode()->getID() : "";
std::string endNodeID = myIsUpdate ? myCurrentEdge->getToNode()->getID() : "";
begNodeID = attrs.hasAttribute(SUMO_ATTR_FROMNODE) ? attrs.getStringReporting(SUMO_ATTR_FROMNODE, "edge", 0, ok) : begNodeID;
endNodeID = attrs.hasAttribute(SUMO_ATTR_TONODE) ? attrs.getStringReporting(SUMO_ATTR_TONODE, "edge", 0, ok) : endNodeID;
if (!ok) {
return false;
}
// or their positions !!! deprecated
SUMOReal begNodeXPos = tryGetPosition(attrs, SUMO_ATTR_XFROM, "XFrom");
SUMOReal begNodeYPos = tryGetPosition(attrs, SUMO_ATTR_YFROM, "YFrom");
SUMOReal endNodeXPos = tryGetPosition(attrs, SUMO_ATTR_XTO, "XTo");
SUMOReal endNodeYPos = tryGetPosition(attrs, SUMO_ATTR_YTO, "YTo");
if (begNodeXPos!=SUMOXML_INVALID_POSITION&&begNodeYPos!=SUMOXML_INVALID_POSITION) {
Position2D pos(begNodeXPos, begNodeYPos);
GeoConvHelper::x2cartesian(pos);
begNodeXPos = pos.x();
begNodeYPos = pos.y();
}
if (endNodeXPos!=SUMOXML_INVALID_POSITION&&endNodeYPos!=SUMOXML_INVALID_POSITION) {
Position2D pos(endNodeXPos, endNodeYPos);
GeoConvHelper::x2cartesian(pos);
endNodeXPos = pos.x();
endNodeYPos = pos.y();
}
// check the obtained values for nodes
myFromNode = insertNodeChecking(Position2D(begNodeXPos, begNodeYPos), begNodeID, "from");
myToNode = insertNodeChecking(Position2D(endNodeXPos, endNodeYPos), endNodeID, "to");
return myFromNode!=0&&myToNode!=0;
}
示例3: toString
void
NIImporter_SUMO::addConnection(const SUMOSAXAttributes& attrs) {
bool ok = true;
std::string fromID = attrs.getStringReporting(SUMO_ATTR_FROM, 0, ok);
if (myEdges.count(fromID) == 0) {
WRITE_ERROR("Unknown edge '" + fromID + "' given in connection.");
return;
}
EdgeAttrs* from = myEdges[fromID];
Connection conn;
conn.toEdgeID = attrs.getStringReporting(SUMO_ATTR_TO, 0, ok);
unsigned int fromLaneIdx = attrs.getIntReporting(SUMO_ATTR_FROM_LANE, 0, ok);
conn.toLaneIdx = attrs.getIntReporting(SUMO_ATTR_TO_LANE, 0, ok);
conn.tlID = attrs.getOptStringReporting(SUMO_ATTR_TLID, 0, ok, "");
conn.mayDefinitelyPass = false; // (attrs.getStringReporting(SUMO_ATTR_STATE, 0, ok, "") == "M");
if (conn.tlID != "") {
conn.tlLinkNo = attrs.getIntReporting(SUMO_ATTR_TLLINKINDEX, 0, ok);
}
if (from->lanes.size() <= (size_t) fromLaneIdx) {
WRITE_ERROR("Invalid lane index '" + toString(fromLaneIdx) + "' for connection from '" + fromID + "'.");
return;
}
from->lanes[fromLaneIdx]->connections.push_back(conn);
}
示例4: toString
void
NIImporter_SUMO::addConnection(const SUMOSAXAttributes& attrs) {
bool ok = true;
std::string fromID = attrs.getStringReporting(SUMO_ATTR_FROM, 0, ok);
if (myEdges.count(fromID) == 0) {
WRITE_ERROR("Unknown edge '" + fromID + "' given in connection.");
return;
}
EdgeAttrs* from = myEdges[fromID];
Connection conn;
conn.toEdgeID = attrs.getStringReporting(SUMO_ATTR_TO, 0, ok);
unsigned int fromLaneIdx = attrs.getIntReporting(SUMO_ATTR_FROM_LANE, 0, ok);
conn.toLaneIdx = attrs.getIntReporting(SUMO_ATTR_TO_LANE, 0, ok);
conn.tlID = attrs.getOptStringReporting(SUMO_ATTR_TLID, 0, ok, "");
conn.mayDefinitelyPass = attrs.getOptBoolReporting(SUMO_ATTR_PASS, 0, ok, false);
const size_t suffixSize = NBRampsComputer::ADDED_ON_RAMP_EDGE.size();
if (!conn.mayDefinitelyPass && conn.toEdgeID.size() > suffixSize &&
conn.toEdgeID.substr(conn.toEdgeID.size() - suffixSize) == NBRampsComputer::ADDED_ON_RAMP_EDGE) {
WRITE_MESSAGE("Infering connection attribute pass=\"1\" from to-edge id '" + conn.toEdgeID + "'");
conn.mayDefinitelyPass = true;
}
if (conn.tlID != "") {
conn.tlLinkNo = attrs.getIntReporting(SUMO_ATTR_TLLINKINDEX, 0, ok);
}
if (from->lanes.size() <= (size_t) fromLaneIdx) {
WRITE_ERROR("Invalid lane index '" + toString(fromLaneIdx) + "' for connection from '" + fromID + "'.");
return;
}
from->lanes[fromLaneIdx]->connections.push_back(conn);
}
示例5: lon
void
NIImporter_OpenStreetMap::NodesHandler::myStartElement(int element, const SUMOSAXAttributes& attrs) {
++myHierarchyLevel;
if (element == SUMO_TAG_NODE) {
bool ok = true;
if (myHierarchyLevel != 2) {
WRITE_ERROR("Node element on wrong XML hierarchy level (id='" + toString(attrs.getIntReporting(SUMO_ATTR_ID, 0, ok)) + "', level='" + toString(myHierarchyLevel) + "').");
return;
}
int id = attrs.getIntReporting(SUMO_ATTR_ID, 0, ok);
std::string action = attrs.hasAttribute("action") ? attrs.getStringSecure("action", "") : "";
if (action == "delete") {
return;
}
if (!ok) {
return;
}
myLastNodeID = -1;
if (myToFill.find(id) == myToFill.end()) {
myLastNodeID = id;
// assume we are loading multiple files...
// ... so we won't report duplicate nodes
bool ok = true;
double tlat, tlon;
std::istringstream lon(attrs.getStringReporting(SUMO_ATTR_LON, toString(id).c_str(), ok));
if (!ok) {
return;
}
lon >> tlon;
if (lon.fail()) {
WRITE_ERROR("Node's '" + toString(id) + "' lon information is not numeric.");
return;
}
std::istringstream lat(attrs.getStringReporting(SUMO_ATTR_LAT, toString(id).c_str(), ok));
if (!ok) {
return;
}
lat >> tlat;
if (lat.fail()) {
WRITE_ERROR("Node's '" + toString(id) + "' lat information is not numeric.");
return;
}
NIOSMNode* toAdd = new NIOSMNode();
toAdd->id = id;
toAdd->tlsControlled = false;
toAdd->lat = tlat;
toAdd->lon = tlon;
myIsInValidNodeTag = true;
std::set<NIOSMNode*, CompareNodes>::iterator similarNode = myUniqueNodes.find(toAdd);
if (similarNode == myUniqueNodes.end()) {
myUniqueNodes.insert(toAdd);
} else {
delete toAdd;
toAdd = *similarNode;
WRITE_MESSAGE("Found duplicate nodes. Substituting " + toString(id) + " with " + toString(toAdd->id));
}
myToFill[id] = toAdd;
}
示例6: getLaneAttrsFromID
void
NIImporter_SUMO::addSuccEdge(const SUMOSAXAttributes& attrs) {
bool ok = true;
std::string edge_id = attrs.getStringReporting(SUMO_ATTR_EDGE, 0, ok);
myCurrentEdge = 0;
if (myEdges.count(edge_id) == 0) {
WRITE_ERROR("Unknown edge '" + edge_id + "' given in succedge.");
return;
}
myCurrentEdge = myEdges[edge_id];
std::string lane_id = attrs.getStringReporting(SUMO_ATTR_LANE, 0, ok);
myCurrentLane = getLaneAttrsFromID(myCurrentEdge, lane_id);
}
示例7: conn
void
NIXMLTrafficLightsHandler::removeTlConnection(const SUMOSAXAttributes& attrs) {
bool ok = true;
std::string tlID = attrs.getStringReporting(SUMO_ATTR_TLID, 0, ok);
// does the traffic light still exist?
const std::map<std::string, NBTrafficLightDefinition*>& programs = myTLLCont.getPrograms(tlID);
if (programs.size() > 0) {
// parse identifying attributes
NBEdge* from = retrieveEdge(attrs, SUMO_ATTR_FROM, ok);
NBEdge* to = retrieveEdge(attrs, SUMO_ATTR_TO, ok);
if (!ok) {
return;
}
int fromLane = retrieveLaneIndex(attrs, SUMO_ATTR_FROM_LANE, from, ok);
int toLane = retrieveLaneIndex(attrs, SUMO_ATTR_TO_LANE, to, ok);
if (!ok) {
return;
}
int tlIndex = attrs.getIntReporting(SUMO_ATTR_TLLINKINDEX, 0, ok);
NBConnection conn(from, fromLane, to, toLane, tlIndex);
// remove the connection from all definitions
std::map<std::string, NBTrafficLightDefinition*>::const_iterator it;
for (it = programs.begin(); it != programs.end(); it++) {
NBLoadedSUMOTLDef* tlDef = dynamic_cast<NBLoadedSUMOTLDef*>(it->second);
if (tlDef) {
tlDef->removeConnection(conn, false);
} else {
throw ProcessError("Corrupt traffic light definition '"
+ tlID + "' (program '" + it->first + "')");
}
}
}
}
示例8: EdgeAttrs
void
NIImporter_SUMO::addEdge(const SUMOSAXAttributes& attrs) {
// get the id, report an error if not given or empty...
bool ok = true;
std::string id = attrs.getStringReporting(SUMO_ATTR_ID, 0, ok);
if (!ok) {
return;
}
myCurrentEdge = new EdgeAttrs();
myCurrentEdge->builtEdge = 0;
myCurrentEdge->id = id;
// get the function
myCurrentEdge->func = attrs.getOptStringReporting(SUMO_ATTR_FUNCTION, id.c_str(), ok, "normal");
if (myCurrentEdge->func == toString(EDGEFUNC_INTERNAL)) {
return; // skip internal edges
}
// get the type
myCurrentEdge->type = attrs.getOptStringReporting(SUMO_ATTR_TYPE, id.c_str(), ok, "");
// get the origin and the destination node
myCurrentEdge->fromNode = attrs.getOptStringReporting(SUMO_ATTR_FROM, id.c_str(), ok, "");
myCurrentEdge->toNode = attrs.getOptStringReporting(SUMO_ATTR_TO, id.c_str(), ok, "");
myCurrentEdge->priority = attrs.getOptIntReporting(SUMO_ATTR_PRIORITY, id.c_str(), ok, -1);
myCurrentEdge->type = attrs.getOptStringReporting(SUMO_ATTR_TYPE, id.c_str(), ok, "");
myCurrentEdge->shape = GeomConvHelper::parseShapeReporting(
attrs.getOptStringReporting(SUMO_ATTR_SHAPE, id.c_str(), ok, ""),
attrs.getObjectType(), id.c_str(), ok, true);
NILoader::transformCoordinates(myCurrentEdge->shape, true, myLocation);
myCurrentEdge->length = attrs.getOptSUMORealReporting(SUMO_ATTR_LENGTH, id.c_str(), ok, NBEdge::UNSPECIFIED_LOADED_LENGTH);
myCurrentEdge->maxSpeed = 0;
myCurrentEdge->streetName = attrs.getOptStringReporting(SUMO_ATTR_NAME, id.c_str(), ok, "");
std::string lsfS = toString(LANESPREAD_RIGHT);
if (attrs.hasAttribute(SUMO_ATTR_SPREADFUNC__DEPRECATED)) {
lsfS = attrs.getStringReporting(SUMO_ATTR_SPREADFUNC__DEPRECATED, id.c_str(), ok);
if (!myHaveWarnedAboutDeprecatedSpreadType) {
WRITE_WARNING("'" + toString(SUMO_ATTR_SPREADFUNC__DEPRECATED) + "' is deprecated; please use '" + toString(SUMO_ATTR_SPREADTYPE) + "'.");
myHaveWarnedAboutDeprecatedSpreadType = true;
}
} else {
lsfS = attrs.getOptStringReporting(SUMO_ATTR_SPREADTYPE, id.c_str(), ok, lsfS);
}
if (SUMOXMLDefinitions::LaneSpreadFunctions.hasString(lsfS)) {
myCurrentEdge->lsf = SUMOXMLDefinitions::LaneSpreadFunctions.get(lsfS);
} else {
WRITE_ERROR("Unknown spreadType '" + lsfS + "' for edge '" + id + "'.");
}
}
示例9: toString
void
MSRouteHandler::openRoute(const SUMOSAXAttributes& attrs) {
// check whether the id is really necessary
std::string rid;
if (myCurrentRouteDistribution != 0) {
myActiveRouteID = myCurrentRouteDistributionID + "#" + toString(myCurrentRouteDistribution->getProbs().size()); // !!! document this
rid = "distribution '" + myCurrentRouteDistributionID + "'";
} else if (myVehicleParameter != 0) {
// ok, a vehicle is wrapping the route,
// we may use this vehicle's id as default
myActiveRouteID = "!" + myVehicleParameter->id; // !!! document this
if (attrs.hasAttribute(SUMO_ATTR_ID)) {
WRITE_WARNING("Ids of internal routes are ignored (vehicle '" + myVehicleParameter->id + "').");
}
} else {
bool ok = true;
myActiveRouteID = attrs.getStringReporting(SUMO_ATTR_ID, 0, ok, false);
if (!ok) {
return;
}
rid = "'" + myActiveRouteID + "'";
}
if (myVehicleParameter != 0) { // have to do this here for nested route distributions
rid = "for vehicle '" + myVehicleParameter->id + "'";
}
bool ok = true;
if (attrs.hasAttribute(SUMO_ATTR_EDGES)) {
MSEdge::parseEdgesList(attrs.getStringReporting(SUMO_ATTR_EDGES, myActiveRouteID.c_str(), ok), myActiveRoute, rid);
}
myActiveRouteRefID = attrs.getOptStringReporting(SUMO_ATTR_REFID, myActiveRouteID.c_str(), ok, "");
if (attrs.hasAttribute(SUMO_ATTR_REFID__DEPRECATED)) {
myActiveRouteRefID = attrs.getOptStringReporting(SUMO_ATTR_REFID__DEPRECATED, myActiveRouteID.c_str(), ok, "");
if (!myHaveWarnedAboutDeprecatedRefID) {
myHaveWarnedAboutDeprecatedRefID = true;
WRITE_WARNING("'" + toString(SUMO_ATTR_REFID__DEPRECATED) + "' is deprecated, please use '" + toString(SUMO_ATTR_REFID) + "' instead.");
}
}
if (myActiveRouteRefID != "" && MSRoute::dictionary(myActiveRouteRefID) == 0) {
WRITE_ERROR("Invalid reference to route '" + myActiveRouteRefID + "' in route " + rid + ".");
}
myActiveRouteProbability = attrs.getOptSUMORealReporting(SUMO_ATTR_PROB, myActiveRouteID.c_str(), ok, DEFAULT_VEH_PROB);
myActiveRouteColor = attrs.hasAttribute(SUMO_ATTR_COLOR) ? RGBColor::parseColorReporting(attrs.getString(SUMO_ATTR_COLOR), attrs.getObjectType(), myActiveRouteID.c_str(), true, ok) : RGBColor::getDefaultColor();
}
示例10: readPosition
void
NIImporter_SUMO::addJunction(const SUMOSAXAttributes& attrs) {
// get the id, report an error if not given or empty...
bool ok = true;
std::string id = attrs.getStringReporting(SUMO_ATTR_ID, 0, ok);
if (!ok) {
return;
}
if (id[0] == ':') { // internal node
return;
}
SumoXMLNodeType type = NODETYPE_UNKNOWN;
std::string typeS = attrs.getStringReporting(SUMO_ATTR_TYPE, id.c_str(), ok);
if (SUMOXMLDefinitions::NodeTypes.hasString(typeS)) {
type = SUMOXMLDefinitions::NodeTypes.get(typeS);
if (type == NODETYPE_DEAD_END_DEPRECATED) { // patch legacy type
type = NODETYPE_DEAD_END;
}
} else {
WRITE_WARNING("Unknown node type '" + typeS + "' for junction '" + id + "'.");
}
Position pos = readPosition(attrs, id, ok);
NILoader::transformCoordinates(pos, true, myLocation);
// the network may have been built with the option "plain.keep-edge-shape" this
// makes accurate reconstruction of legacy networks impossible. We ought to warn about this
std::string shapeS = attrs.getStringReporting(SUMO_ATTR_SHAPE, id.c_str(), ok, false);
if (shapeS != "") {
PositionVector shape = GeomConvHelper::parseShapeReporting(
shapeS, attrs.getObjectType(), id.c_str(), ok, false);
shape.push_back_noDoublePos(shape[0]); // need closed shape
if (!shape.around(pos) && shape.distance(pos) > 1) { // MAGIC_THRESHOLD
// WRITE_WARNING("Junction '" + id + "': distance between pos and shape is " + toString(shape.distance(pos)));
mySuspectKeepShape = true;
}
}
NBNode* node = new NBNode(id, pos, type);
if (!myNodeCont.insert(node)) {
WRITE_ERROR("Problems on adding junction '" + id + "'.");
delete node;
return;
}
}
示例11:
void
NIImporter_SUMO::addLane(const SUMOSAXAttributes &attrs) {
myCurrentLane = new LaneAttrs;
bool ok = true;
myCurrentLane->maxSpeed = attrs.getOptSUMORealReporting(SUMO_ATTR_MAXSPEED, "lane", 0, ok, -1);
myCurrentLane->depart = attrs.getOptBoolReporting(SUMO_ATTR_DEPART, 0, 0, ok, false);
if (attrs.hasAttribute(SUMO_ATTR_SHAPE)) {
// @deprecated At some time, SUMO_ATTR_SHAPE will be mandatory
myCurrentLane->shape = GeomConvHelper::parseShapeReporting(attrs.getStringReporting(SUMO_ATTR_SHAPE, "lane", 0, ok), "lane", 0, ok, false);
}
}
示例12:
void
MSRouteHandler::openRoute(const SUMOSAXAttributes &attrs) {
// check whether the id is really necessary
if (myVehicleParameter!=0) {
// ok, a vehicle is wrapping the route,
// we may use this vehicle's id as default
myActiveRouteID = "!" + myVehicleParameter->id; // !!! document this
} else {
bool ok = true;
myActiveRouteID = attrs.getStringReporting(SUMO_ATTR_ID, "route", 0, ok, false);
if (!ok) {
return;
}
}
bool ok = true;
if (attrs.hasAttribute(SUMO_ATTR_EDGES)) {
MSEdge::parseEdgesList(attrs.getStringReporting(SUMO_ATTR_EDGES, "route", myActiveRouteID.c_str(), ok), myActiveRoute, myActiveRouteID);
}
myActiveRouteProbability = attrs.getOptSUMORealReporting(SUMO_ATTR_PROB, "route", myActiveRouteID.c_str(), ok, DEFAULT_VEH_PROB);
myActiveRouteColor = attrs.hasAttribute(SUMO_ATTR_COLOR) ? RGBColor::parseColorReporting(attrs.getString(SUMO_ATTR_COLOR), "route", myActiveRouteID.c_str(), true, ok) : RGBColor::getDefaultColor();
}
示例13: if
bool
NIXMLEdgesHandler::setNodes(const SUMOSAXAttributes& attrs) {
// the names and the coordinates of the beginning and the end node
// may be found, try
bool ok = true;
std::string begNodeID = myIsUpdate ? myCurrentEdge->getFromNode()->getID() : "";
std::string endNodeID = myIsUpdate ? myCurrentEdge->getToNode()->getID() : "";
std::string oldBegID = begNodeID;
std::string oldEndID = endNodeID;
if (attrs.hasAttribute(SUMO_ATTR_FROM)) {
begNodeID = attrs.getStringReporting(SUMO_ATTR_FROM, 0, ok);
} else if (!myIsUpdate) {
WRITE_ERROR("The from-node is not given for edge '" + myCurrentID + "'.");
ok = false;
}
if (attrs.hasAttribute(SUMO_ATTR_TO)) {
endNodeID = attrs.getStringReporting(SUMO_ATTR_TO, 0, ok);
} else if (!myIsUpdate) {
WRITE_ERROR("The to-node is not given for edge '" + myCurrentID + "'.");
ok = false;
}
if (!ok) {
return false;
}
myFromNode = myNodeCont.retrieve(begNodeID);
myToNode = myNodeCont.retrieve(endNodeID);
if (myFromNode == 0) {
WRITE_ERROR("Edge's '" + myCurrentID + "' from-node '" + begNodeID + "' is not known.");
}
if (myToNode == 0) {
WRITE_ERROR("Edge's '" + myCurrentID + "' to-node '" + endNodeID + "' is not known.");
}
if (myFromNode != 0 && myToNode != 0) {
if (myIsUpdate && (myFromNode->getID() != oldBegID || myToNode->getID() != oldEndID)) {
myShape = PositionVector();
}
}
return myFromNode != 0 && myToNode != 0;
}
示例14: toString
void
NIXMLEdgesHandler::deleteEdge(const SUMOSAXAttributes& attrs) {
bool ok = true;
myCurrentID = attrs.getStringReporting(SUMO_ATTR_ID, 0, ok);
if (!ok) {
return;
}
NBEdge* edge = myEdgeCont.retrieve(myCurrentID);
if (edge == 0) {
WRITE_WARNING("Ignoring tag '" + toString(SUMO_TAG_DELETE) + "' for unknown edge '" +
myCurrentID + "'");
return;
}
myEdgeCont.extract(myDistrictCont, edge, true);
}
示例15: st
void
MSRouteHandler::openVehicleTypeDistribution(const SUMOSAXAttributes &attrs) {
if (attrs.setIDFromAttributes("vtypeDistribution", myCurrentVTypeDistributionID)) {
myCurrentVTypeDistribution = new RandomDistributor<MSVehicleType*>();
if (attrs.hasAttribute(SUMO_ATTR_VTYPES)) {
bool ok = true;
StringTokenizer st(attrs.getStringReporting(SUMO_ATTR_VTYPES, "vtypeDistribution", myCurrentVTypeDistributionID.c_str(), ok));
while (st.hasNext()) {
std::string vtypeID = st.next();
MSVehicleType *type = MSNet::getInstance()->getVehicleControl().getVType(vtypeID);
if (type==0) {
throw ProcessError("Unknown vtype '" + vtypeID + "' in distribution '" + myCurrentVTypeDistributionID + "'.");
}
myCurrentVTypeDistribution->add(type->getDefaultProbability(), type);
}
}
}
}