62 if (!oc.
isSet(
"output-file")) {
66 std::map<SumoXMLAttr, std::string> attrs;
71 const int cornerDetail = oc.
getInt(
"junctions.corner-detail");
72 if (cornerDetail > 0) {
75 if (!oc.
isDefault(
"junctions.internal-link-detail")) {
78 if (oc.
getBool(
"rectangular-lane-cut")) {
95 bool origNames = oc.
getBool(
"output.original-names");
96 if (!oc.
getBool(
"no-internal-links")) {
98 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
107 bool noNames = !oc.
getBool(
"output.street-names");
108 for (std::map<std::string, NBEdge*>::const_iterator i = ec.
begin(); i != ec.
end(); ++i) {
109 writeEdge(device, *(*i).second, noNames, origNames);
117 std::set<NBNode*> roundaboutNodes;
118 const bool checkLaneFoesAll = oc.
getBool(
"check-lane-foes.all");
119 const bool checkLaneFoesRoundabout = !checkLaneFoesAll && oc.
getBool(
"check-lane-foes.roundabout");
120 if (checkLaneFoesRoundabout) {
122 for (std::set<EdgeSet>::const_iterator i = roundabouts.begin(); i != roundabouts.end(); ++i) {
123 for (EdgeSet::const_iterator j = (*i).begin(); j != (*i).end(); ++j) {
124 roundaboutNodes.insert((*j)->getToNode());
128 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
129 const bool checkLaneFoes = checkLaneFoesAll || (checkLaneFoesRoundabout && roundaboutNodes.count((*i).second) > 0);
133 const bool includeInternal = !oc.
getBool(
"no-internal-links");
134 if (includeInternal) {
137 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
146 int numConnections = 0;
147 for (std::map<std::string, NBEdge*>::const_iterator it_edge = ec.
begin(); it_edge != ec.
end(); it_edge++) {
148 NBEdge* from = it_edge->second;
149 const std::vector<NBEdge::Connection> connections = from->
getConnections();
150 numConnections += (int)connections.size();
151 for (std::vector<NBEdge::Connection>::const_iterator it_c = connections.begin(); it_c != connections.end(); it_c++) {
155 if (numConnections > 0) {
158 if (includeInternal) {
161 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
168 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
169 NBNode* node = (*i).second;
171 const std::vector<NBNode::Crossing>& crossings = node->
getCrossings();
172 for (std::vector<NBNode::Crossing>::const_iterator it = crossings.begin(); it != crossings.end(); it++) {
176 const std::vector<NBNode::WalkingArea>& WalkingAreas = node->
getWalkingAreas();
177 for (std::vector<NBNode::WalkingArea>::const_iterator it = WalkingAreas.begin(); it != WalkingAreas.end(); it++) {
178 if ((*it).nextCrossing !=
"") {
186 if (nextCrossing.
tlID !=
"") {
196 for (std::vector<std::string>::const_iterator it_sw = (*it).nextSidewalks.begin(); it_sw != (*it).nextSidewalks.end(); ++it_sw) {
199 for (std::vector<std::string>::const_iterator it_sw = (*it).prevSidewalks.begin(); it_sw != (*it).prevSidewalks.end(); ++it_sw) {
206 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
214 for (std::map<std::string, NBDistrict*>::const_iterator i = dc.
begin(); i != dc.
end(); i++) {
217 if (dc.
size() != 0) {
232 assert(succOpp != 0);
233 assert(predOpp != 0);
234 const std::vector<NBEdge::Connection>& connections = succOpp->
getConnections();
235 for (std::vector<NBEdge::Connection>::const_iterator it_c = connections.begin(); it_c != connections.end(); it_c++) {
237 if (succOpp != from &&
239 predOpp == conOpp.
toEdge &&
255 for (EdgeVector::const_iterator i = incoming.begin(); i != incoming.end(); i++) {
256 const std::vector<NBEdge::Connection>& elv = (*i)->getConnections();
257 if (elv.size() > 0) {
258 bool haveVia =
false;
260 std::string internalEdgeID =
"";
262 std::map<NBEdge*, double> lengthSum;
263 std::map<NBEdge*, int> numLanes;
264 for (std::vector<NBEdge::Connection>::const_iterator k = elv.begin(); k != elv.end(); ++k) {
266 numLanes[(*k).toEdge] += 1;
269 for (std::vector<NBEdge::Connection>::const_iterator k = elv.begin(); k != elv.end(); ++k) {
270 if ((*k).toEdge == 0) {
274 if (toEdge != (*k).toEdge) {
275 internalEdgeID = (*k).id;
280 toEdge = (*k).toEdge;
288 const NBEdge::Lane& successor = (*k).toEdge->getLanes()[(*k).toLane];
289 const double length = lengthSum[toEdge] / numLanes[toEdge];
293 writeLane(into, (*k).getInternalLaneID(), (*k).vmax,
297 haveVia = haveVia || (*k).haveVia;
303 for (std::vector<NBEdge::Connection>::const_iterator k = elv.begin(); k != elv.end(); ++k) {
307 if ((*k).toEdge == 0) {
311 const NBEdge::Lane& successor = (*k).toEdge->getLanes()[(*k).toLane];
318 0, origNames,
"", &n);
325 const std::vector<NBNode::Crossing>& crossings = n.
getCrossings();
326 for (std::vector<NBNode::Crossing>::const_iterator it = crossings.begin(); it != crossings.end(); it++) {
336 const std::vector<NBNode::WalkingArea>& WalkingAreas = n.
getWalkingAreas();
337 for (std::vector<NBNode::WalkingArea>::const_iterator it = WalkingAreas.begin(); it != WalkingAreas.end(); it++) {
377 const std::vector<NBEdge::Lane>& lanes = e.
getLanes();
380 for (
int i = 0; i < (int) lanes.size(); i++) {
395 const std::string& origID,
double length,
int index,
bool origNames,
396 const std::string& oppositeID,
const NBNode* node,
bool accelRamp) {
408 WRITE_WARNING(
"Lane '" + lID +
"' has a maximum allowed speed of 0.");
409 }
else if (speed < 0) {
410 throw ProcessError(
"Negative allowed speed (" +
toString(speed) +
") on lane '" + lID +
"', use --speed.minimum to prevent this.");
413 length = length - endOffset;
428 NBNode::CustomShapeMap::const_iterator it = cs.find(lID);
429 if (it != cs.end()) {
436 if (oppositeID !=
"" && oppositeID !=
"-") {
441 if (origNames && origID !=
"") {
459 std::string incLanes;
461 for (std::vector<NBEdge*>::const_iterator i = incoming.begin(); i != incoming.end(); ++i) {
462 int noLanes = (*i)->getNumLanes();
463 for (
int j = 0; j < noLanes; j++) {
464 incLanes += (*i)->getLaneID(j);
465 if (i != incoming.end() - 1 || j < noLanes - 1) {
470 const std::vector<NBNode::Crossing>& crossings = n.
getCrossings();
471 for (std::vector<NBNode::Crossing>::const_iterator it = crossings.begin(); it != crossings.end(); it++) {
472 incLanes +=
' ' + (*it).prevWalkingArea +
"_0";
476 std::string intLanes;
479 for (EdgeVector::const_iterator i = incoming.begin(); i != incoming.end(); i++) {
480 const std::vector<NBEdge::Connection>& elv = (*i)->getConnections();
481 for (std::vector<NBEdge::Connection>::const_iterator k = elv.begin(); k != elv.end(); ++k) {
482 if ((*k).toEdge == 0) {
489 intLanes += (*k).getInternalLaneID();
491 intLanes += (*k).viaID +
"_0";
498 for (std::vector<NBNode::Crossing>::const_iterator it = crossings.begin(); it != crossings.end(); it++) {
499 intLanes +=
' ' + (*it).id +
"_0";
528 std::vector<std::string> internalLaneIDs;
529 for (EdgeVector::const_iterator i = incoming.begin(); i != incoming.end(); i++) {
530 const std::vector<NBEdge::Connection>& elv = (*i)->getConnections();
531 for (std::vector<NBEdge::Connection>::const_iterator k = elv.begin(); k != elv.end(); ++k) {
532 if ((*k).toEdge != 0) {
533 internalLaneIDs.push_back((*k).getInternalLaneID());
537 const std::vector<NBNode::Crossing>& crossings = n.
getCrossings();
538 for (std::vector<NBNode::Crossing>::const_iterator it_c = crossings.begin(); it_c != crossings.end(); ++it_c) {
539 internalLaneIDs.push_back((*it_c).id +
"_0");
542 for (std::vector<NBEdge*>::const_iterator i = incoming.begin(); i != incoming.end(); i++) {
543 const std::vector<NBEdge::Connection>& elv = (*i)->getConnections();
544 for (std::vector<NBEdge::Connection>::const_iterator k = elv.begin(); k != elv.end(); ++k) {
545 if ((*k).toEdge == 0 || !(*k).haveVia) {
552 std::string incLanes = (*k).getInternalLaneID();
553 if ((*k).foeIncomingLanes.length() != 0) {
554 incLanes +=
" " + (*k).foeIncomingLanes;
557 const std::vector<int>& foes = (*k).foeInternalLinks;
558 std::vector<std::string> foeIDs;
559 for (std::vector<int>::const_iterator it = foes.begin(); it != foes.end(); ++it) {
560 foeIDs.push_back(internalLaneIDs[*it]);
592 if (style !=
PLAIN) {
593 if (includeInternal) {
620 for (std::vector<NBEdge*>::const_iterator i = incoming.begin(); i != incoming.end(); ++i) {
622 const std::vector<NBEdge::Connection>& connections = from->
getConnections();
623 for (std::vector<NBEdge::Connection>::const_iterator j = connections.begin(); j != connections.end(); ++j) {
643 const std::string& from,
const std::string& to,
644 int fromLane,
int toLane,
const std::string& via) {
663 std::vector<std::vector<std::string> > edgeIDs;
664 for (std::set<EdgeSet>::const_iterator i = roundabouts.begin(); i != roundabouts.end(); ++i) {
665 std::vector<std::string> tEdgeIDs;
666 for (EdgeSet::const_iterator j = (*i).begin(); j != (*i).end(); ++j) {
669 tEdgeIDs.push_back((*j)->getID());
671 std::sort(tEdgeIDs.begin(), tEdgeIDs.end());
672 edgeIDs.push_back(tEdgeIDs);
674 std::sort(edgeIDs.begin(), edgeIDs.end());
676 for (std::vector<std::vector<std::string> >::const_iterator i = edgeIDs.begin(); i != edgeIDs.end(); ++i) {
679 if (roundabouts.size() != 0) {
688 std::vector<std::string> validEdgeIDs;
689 std::vector<std::string> invalidEdgeIDs;
690 std::vector<std::string> nodeIDs;
691 for (std::vector<std::string>::const_iterator i = edgeIDs.begin(); i != edgeIDs.end(); ++i) {
695 validEdgeIDs.push_back(edge->
getID());
697 invalidEdgeIDs.push_back(*i);
700 std::sort(nodeIDs.begin(), nodeIDs.end());
701 if (validEdgeIDs.size() > 0) {
706 if (invalidEdgeIDs.size() > 0) {
708 +
joinToString(invalidEdgeIDs,
" ") +
"' no longer exist'");
727 for (
int i = 0; i < (int)sources.size(); i++) {
734 for (
int i = 0; i < (int)sinks.size(); i++) {
747 if (time == std::floor(time)) {
757 for (NBConnectionProhibits::const_iterator j = prohibitions.begin(); j != prohibitions.end(); j++) {
760 for (NBConnectionVector::const_iterator k = prohibiting.begin(); k != prohibiting.end(); k++) {
779 std::vector<NBTrafficLightLogic*> logics = tllCont.
getComputed();
780 for (std::vector<NBTrafficLightLogic*>::iterator it = logics.begin(); it != logics.end(); it++) {
787 (*it)->writeParams(into);
789 const std::vector<NBTrafficLightLogic::PhaseDefinition>& phases = (*it)->getPhases();
790 for (std::vector<NBTrafficLightLogic::PhaseDefinition>::const_iterator j = phases.begin(); j != phases.end(); ++j) {
798 if (logics.size() > 0) {
static void writeRoundabout(OutputDevice &into, const std::vector< std::string > &r, const NBEdgeCont &ec)
Writes a roundabout.
bool getKeepClear() const
Returns the keepClear flag.
LaneSpreadFunction getLaneSpreadFunction() const
Returns how this edge's lanes' lateral offset is computed.
std::string id
id of Connection
The information about how to spread the lanes from the given position.
int tlLinkNo
The index of this connection within the controlling traffic light.
void writePermissions(OutputDevice &into, SVCPermissions permissions)
writes allowed disallowed attributes if needed;
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
void close()
Closes the device and removes it from the dictionary.
static void writeLocation(OutputDevice &into)
writes the location element
A structure which describes a connection between edges or lanes.
const std::vector< NBEdge * > & getSourceEdges() const
Returns the sources.
LinkState getLinkState(const NBEdge *incoming, NBEdge *outgoing, int fromLane, int toLane, bool mayDefinitelyPass, const std::string &tlID) const
get link state
int toLane
The lane the connections yields in.
a list of node ids, used for controlling joining
NBTypeCont & getTypeCont()
Returns a reference to the type container.
int getInt(const std::string &name) const
Returns the int-value of the named option (only for Option_Integer)
Whether vehicles must keep the junction clear.
PositionVector shape
The lane's shape.
whether a given shape is user-defined
a source within a district (connection road)
static void writeDistrict(OutputDevice &into, const NBDistrict &d)
Writes a district.
std::map< std::string, NBNode * >::const_iterator begin() const
Returns the pointer to the begin of the stored nodes.
std::string viaID
if Connection have a via, ID of it
NBEdge * toEdge
The edge the connections yields in.
begin/end of the description of a junction
begin/end of the description of a single lane
static const double UNSPECIFIED_VISIBILITY_DISTANCE
unspecified foe visibility for connections
std::map< std::string, NBNode * >::const_iterator end() const
Returns the pointer to the end of the stored nodes.
const CustomShapeMap & getCustomLaneShapes() const
sets a custom shape for an internal lane
A container for traffic light definitions and built programs.
a traffic assignment zone
static bool writeInternalEdges(OutputDevice &into, const NBEdgeCont &ec, const NBNode &n, bool origNames)
Writes internal edges (<edge ... with id[0]==':') of the given node.
void writePreferences(OutputDevice &into, SVCPermissions preferred)
writes allowed disallowed attributes if needed;
connectio between two lanes
int getPriority() const
Returns the priority of the edge.
double length
This lane's width.
const std::string & getTypeID() const
get ID of type
int SVCPermissions
bitset where each bit declares whether a certain SVC may use this edge/lane
bool hasCustomShape() const
return whether the shape was set by the user
std::map< std::string, NBDistrict * >::const_iterator end() const
Returns the pointer to the end of the stored districts.
The representation of a single edge during network building.
foe visibility distance of a link
const std::vector< Crossing > & getCrossings() const
return this junctions pedestrian crossings
static void writeProhibitions(OutputDevice &into, const NBConnectionProhibits &prohibitions)
writes the given prohibitions
static void writeLane(OutputDevice &into, const std::string &lID, double speed, SVCPermissions permissions, SVCPermissions preferred, double endOffset, double width, PositionVector shape, const std::string &origID, double length, int index, bool origNames, const std::string &oppositeID, const NBNode *node=0, bool accelRamp=false)
Writes a lane (<lane ...) of an edge.
static const double UNSPECIFIED_RADIUS
unspecified lane width
A container for districts.
static const double UNSPECIFIED_OFFSET
unspecified lane offset
link,node: the traffic light id responsible for this link
bool hasLoadedLength() const
Returns whether a length was set explicitly.
const std::vector< NBEdge::Lane > & getLanes() const
Returns the lane definitions.
bool mayDefinitelyPass
Information about being definitely free to drive (on-ramps)
double endOffset
This lane's offset to the intersection begin.
NBEdge * getFrom() const
returns the from-edge (start of the connection)
double visibility
custom foe visiblity for connection
std::string id
the (edge)-id of this walkingArea
std::map< std::string, NBEdge * >::const_iterator end() const
Returns the pointer to the end of the stored edges.
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
const std::string & getID() const
Returns the id.
std::map< std::string, NBDistrict * >::const_iterator begin() const
Returns the pointer to the begin of the stored districts.
bool isDefault(const std::string &name) const
Returns the information whether the named option has still the default value.
const SVCPermissions SVCAll
all VClasses are allowed
static void writeTrafficLights(OutputDevice &into, const NBTrafficLightLogicCont &tllCont)
writes the traffic light logics to the given device
static void writeInternalConnection(OutputDevice &into, const std::string &from, const std::string &to, int fromLane, int toLane, const std::string &via)
Writes a single internal connection.
const Crossing & getCrossing(const std::string &id) const
return the crossing with the given id
static std::string getOppositeInternalID(const NBEdgeCont &ec, const NBEdge *from, const NBEdge::Connection &con)
retrieve the id of the opposite direction internal lane if it exists
static const double UNSPECIFIED_WIDTH
unspecified lane width
prohibition of circulation between two edges
#define WRITE_WARNING(msg)
static OptionsCont & getOptions()
Retrieves the options.
bool accelRamp
Whether this lane is an acceleration lane.
bool priority
whether the pedestrians have priority
LinkDirection
The different directions a link between two lanes may take (or a stream between two edges)...
The link is a straight direction.
A class representing a single district.
bool keepClear
whether the junction must be kept clear when using this connection
std::map< std::string, PositionVector > CustomShapeMap
map for custon shapes
static std::string prohibitionConnection(const NBConnection &c)
the attribute value for a prohibition
An (internal) definition of a single lane of an edge.
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
SVCPermissions permissions
List of vehicle types that are allowed on this lane.
static void writeNetwork(const OptionsCont &oc, NBNetBuilder &nb)
Writes the network into a SUMO-file.
bool writeLogic(OutputDevice &into, const bool checkLaneFoes) const
writes the XML-representation of the logic as a bitset-logic XML representation
The turning radius at an intersection in m.
std::map< std::string, NBEdge * >::const_iterator begin() const
Returns the pointer to the begin of the stored edges.
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
std::string tlID
The id of the traffic light that controls this connection.
SVCPermissions preferred
List of vehicle types that are preferred on this lane.
This is an uncontrolled, minor link, has to brake.
const PositionVector & getShape() const
Returns the shape.
std::string getLaneID(int lane) const
get Lane ID (Secure)
static bool writeInternalConnections(OutputDevice &into, const NBNode &n)
Writes inner connections within the node.
int fromLane
The lane the connections starts at.
bool writeXMLHeader(const std::string &rootElement, const std::string &schemaFile, std::map< SumoXMLAttr, std::string > attrs=std::map< SumoXMLAttr, std::string >())
Writes an XML header with optional configuration.
A point in 2D or 3D with translation and scaling methods.
parameter associated to a certain key
NBEdgeCont & getEdgeCont()
static const double UNSPECIFIED_CONTPOS
unspecified internal junction position
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
static void writeEdge(OutputDevice &into, const NBEdge &e, bool noNames, bool origNames)
Writes an edge (<edge ...)
bool hasDefaultGeometry() const
Returns whether the geometry consists only of the node positions.
LinkState
The right-of-way state of a link between two lanes used when constructing a NBTrafficLightLogic, in MSLink and GNEInternalLane.
roundabout defined in junction
Storage for edges, including some functionality operating on multiple edges.
const std::string & getStreetName() const
Returns the street name of this edge.
const std::set< EdgeSet > getRoundabouts() const
Returns the determined roundabouts.
static void writePositionLong(const Position &pos, OutputDevice &dev)
Writes the given position to device in long format (one attribute per dimension)
edge: the shape in xml-definition
PositionVector getSubpart(double beginOffset, double endOffset) const
get subpart of a position vector
begin/end of the description of a neighboring lane
static std::string escapeXML(const std::string &orig, const bool maskDoubleHyphen=false)
Replaces the standard escapes by their XML entities.
double speed
The speed allowed on this lane.
double width
This lane's width.
double getFinalLength() const
get length that will be assigned to the lanes in the final network
std::vector< NBConnection > NBConnectionVector
Definition of a connection vector.
begin/end of the description of an edge
static void normaliseSum(std::vector< T > &v, T msum=1.0)
int size() const
Returns the number of districts inside the container.
LinkDirection getDirection(const NBEdge *const incoming, const NBEdge *const outgoing, bool leftHand=false) const
Returns the representation of the described stream's direction.
std::string origID
An original ID, if given.
const PositionVector & getShape() const
retrieve the junction shape
PositionVector simplified() const
return the same shape with intermediate colinear points removed
NBEdge * getTo() const
returns the to-edge (end of the connection)
int internalLaneIndex
The lane index of this internal lane within the internal edge.
const PositionVector & getGeometry() const
Returns the geometry of the edge.
const std::vector< double > & getSinkWeights() const
Returns the weights of the sinks.
double length() const
Returns the length.
std::map< NBConnection, NBConnectionVector > NBConnectionProhibits
Definition of a container for connection block dependencies Includes a list of all connections which ...
std::vector< NBTrafficLightLogic * > getComputed() const
Returns a list of all computed logics.
double getRadius() const
Returns the turning radius of this node.
std::string oppositeID
An opposite lane ID, if given.
a sink within a district (connection road)
the edges crossed by a pedestrian crossing
const EdgeVector & getIncomingEdges() const
Returns this node's incoming edges (The edges which yield in this node)
const std::vector< Connection > & getConnections() const
Returns the connections.
NBNodeCont & getNodeCont()
Returns a reference to the node container.
Instance responsible for building networks.
static OutputDevice & getDevice(const std::string &name)
Returns the described OutputDevice.
int tlLinkNo
the traffic light index of this crossing (if controlled)
std::vector< NBEdge * > EdgeVector
container for (sorted) edges
static bool writeInternalNodes(OutputDevice &into, const NBNode &n)
Writes internal junctions (<junction with id[0]==':' ...) of the given node.
NBEdge * retrieve(const std::string &id, bool retrieveExtracted=false) const
Returns the edge that has the given id.
const std::vector< NBEdge * > & getSinkEdges() const
Returns the sinks.
A definition of a pedestrian walking area.
double contPos
custom position for internal junction on this connection
A storage for options typed value containers)
SumoXMLNodeType getType() const
Returns the type of this node.
This is an uncontrolled, major link, may pass.
NBTrafficLightLogicCont & getTLLogicCont()
Returns a reference to the traffic light logics container.
const std::string SUMO_PARAM_ORIGID
The abstract direction of a link.
const Position & getPosition() const
Represents a single node (junction) during network building.
A definition of a pedestrian crossing.
const std::vector< WalkingArea > & getWalkingAreas() const
return this junctions pedestrian walking areas
Static storage of an output device and its base (abstract) implementation.
bool closeTag()
Closes the most recently opened tag.
static void writeJunction(OutputDevice &into, const NBNode &n, const bool checkLaneFoes)
Writes a junction (<junction ...)
link: the index of the link within the traffic light
std::string tlID
The id of the traffic light that controls this connection.
bool isMacroscopicConnector() const
Returns whether this edge was marked as a macroscopic connector.
const std::vector< double > & getSourceWeights() const
Returns the weights of the sources.
NBNode * getFromNode() const
Returns the origin node of the edge.
Container for nodes during the netbuilding process.
std::string getInternalLaneID() const
get ID of internal lane
bool haveVia
check if Connection have a Via
double getLoadedLength() const
Returns the length was set explicitly or the computed length if it wasn't set.
NBDistrictCont & getDistrictCont()
Returns a reference the districts container.
static const std::string MAJOR_VERSION
The version number for written files.
static void writeRoundabouts(OutputDevice &into, const std::set< EdgeSet > &roundabouts, const NBEdgeCont &ec)
Writes roundabouts.
NBNode * getToNode() const
Returns the destination node of the edge.
a single phase description
static std::string writeSUMOTime(SUMOTime time)
writes a SUMOTime as int if possible, otherwise as a float
std::string joinToString(const std::vector< T > &v, const T_BETWEEN &between, std::streamsize accuracy=gPrecision)
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
void lf()
writes a line feed if applicable
const SVCPermissions SVC_UNSPECIFIED
permissions not specified
static void writeConnection(OutputDevice &into, const NBEdge &from, const NBEdge::Connection &c, bool includeInternal, ConnectionStyle style=SUMONET)
Writes connections outgoing from the given edge (also used in NWWriter_XML)
PositionVector shape
The polygonal shape.
void writeTypes(OutputDevice &into) const
writes all types a s XML
The link has no direction (is a dead end link)
double width
This lane's width.