SUMO - Simulation of Urban MObility
SUMORouteHandler.cpp
Go to the documentation of this file.
00001 /****************************************************************************/
00010 // Parser for routes during their loading
00011 /****************************************************************************/
00012 // SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/
00013 // Copyright (C) 2001-2012 DLR (http://www.dlr.de/) and contributors
00014 /****************************************************************************/
00015 //
00016 //   This file is part of SUMO.
00017 //   SUMO is free software: you can redistribute it and/or modify
00018 //   it under the terms of the GNU General Public License as published by
00019 //   the Free Software Foundation, either version 3 of the License, or
00020 //   (at your option) any later version.
00021 //
00022 /****************************************************************************/
00023 
00024 
00025 // ===========================================================================
00026 // included modules
00027 // ===========================================================================
00028 #ifdef _MSC_VER
00029 #include <windows_config.h>
00030 #else
00031 #include <config.h>
00032 #endif
00033 
00034 #include <string>
00035 #include <map>
00036 #include <vector>
00037 #include <utils/xml/SUMOSAXHandler.h>
00038 #include <utils/xml/SUMOXMLDefinitions.h>
00039 #include <utils/common/MsgHandler.h>
00040 #include <utils/common/ToString.h>
00041 #include <utils/common/UtilExceptions.h>
00042 #include <utils/options/OptionsCont.h>
00043 #include <utils/xml/SUMOVehicleParserHelper.h>
00044 #include "SUMORouteHandler.h"
00045 
00046 #ifdef CHECK_MEMORY_LEAKS
00047 #include <foreign/nvwa/debug_new.h>
00048 #endif // CHECK_MEMORY_LEAKS
00049 
00050 
00051 // ===========================================================================
00052 // method definitions
00053 // ===========================================================================
00054 SUMORouteHandler::SUMORouteHandler(const std::string& file) :
00055     SUMOSAXHandler(file),
00056     myVehicleParameter(0),
00057     myLastDepart(0),
00058     myCurrentVType(0) {
00059 }
00060 
00061 
00062 SUMORouteHandler::~SUMORouteHandler() {
00063 }
00064 
00065 
00066 SUMOTime
00067 SUMORouteHandler::getLastDepart() const {
00068     return myLastDepart;
00069 }
00070 
00071 
00072 bool
00073 SUMORouteHandler::checkLastDepart() {
00074     if (myVehicleParameter->departProcedure == DEPART_GIVEN) {
00075         if (myVehicleParameter->depart < myLastDepart) {
00076             WRITE_WARNING("Route file should be sorted by departure time, ignoring '" + myVehicleParameter->id + "'!");
00077             return false;
00078         }
00079     }
00080     return true;
00081 }
00082 
00083 
00084 void 
00085 SUMORouteHandler::registerLastDepart() {
00086     if (myVehicleParameter->departProcedure == DEPART_GIVEN) {
00087         myLastDepart = myVehicleParameter->depart;
00088     }
00089     // else: we don't know when this vehicle will depart. keep the previous known depart time
00090 }
00091 
00092 
00093 void
00094 SUMORouteHandler::myStartElement(int element,
00095                                const SUMOSAXAttributes& attrs) {
00096     switch (element) {
00097         case SUMO_TAG_VEHICLE:
00098             delete myVehicleParameter;
00099             myVehicleParameter = SUMOVehicleParserHelper::parseVehicleAttributes(attrs);
00100             break;
00101         case SUMO_TAG_PERSON:
00102             delete myVehicleParameter;
00103             myVehicleParameter = SUMOVehicleParserHelper::parseVehicleAttributes(attrs);
00104             break;
00105         case SUMO_TAG_FLOW:
00106             delete myVehicleParameter;
00107             myVehicleParameter = SUMOVehicleParserHelper::parseFlowAttributes(attrs);
00108             break;
00109         case SUMO_TAG_VTYPE:
00110             myCurrentVType = SUMOVehicleParserHelper::beginVTypeParsing(attrs);
00111             break;
00112         case SUMO_TAG_VTYPE_DISTRIBUTION:
00113             openVehicleTypeDistribution(attrs);
00114             break;
00115         case SUMO_TAG_ROUTE:
00116             openRoute(attrs);
00117             break;
00118         case SUMO_TAG_ROUTE_DISTRIBUTION:
00119             openRouteDistribution(attrs);
00120             break;
00121         case SUMO_TAG_STOP:
00122             addStop(attrs);
00123             break;
00124         case SUMO_TAG_TRIP: {
00125             myVehicleParameter = SUMOVehicleParserHelper::parseVehicleAttributes(attrs);
00126             myVehicleParameter->setParameter |= VEHPARS_FORCE_REROUTE;
00127             myActiveRouteID = "!" + myVehicleParameter->id;
00128         }
00129         break;
00130         default:
00131             break;
00132     }
00133 }
00134 
00135 
00136 void
00137 SUMORouteHandler::myEndElement(int element) {
00138     switch (element) {
00139         case SUMO_TAG_ROUTE:
00140             closeRoute();
00141             break;
00142         case SUMO_TAG_PERSON:
00143             closePerson();
00144             delete myVehicleParameter;
00145             myVehicleParameter = 0;
00146             break;
00147         case SUMO_TAG_VEHICLE:
00148             if (myVehicleParameter->repetitionNumber > 0) {
00149                 myVehicleParameter->repetitionNumber++; // for backwards compatibility
00150                 // it is a flow, thus no break here
00151             } else {
00152                 closeVehicle();
00153                 delete myVehicleParameter;
00154                 myVehicleParameter = 0;
00155                 break;
00156             }
00157         case SUMO_TAG_FLOW:
00158             closeFlow();
00159             break;
00160         case SUMO_TAG_VTYPE_DISTRIBUTION__DEPRECATED:
00161         case SUMO_TAG_VTYPE_DISTRIBUTION:
00162             closeVehicleTypeDistribution();
00163             break;
00164         case SUMO_TAG_ROUTE_DISTRIBUTION:
00165             closeRouteDistribution();
00166             break;
00167         case SUMO_TAG_VTYPE__DEPRECATED:
00168         case SUMO_TAG_VTYPE:
00169             SUMOVehicleParserHelper::closeVTypeParsing(*myCurrentVType);
00170         break;
00171         default:
00172             break;
00173     }
00174 }
00175 
00176 
00177 bool
00178 SUMORouteHandler::checkStopPos(SUMOReal& startPos, SUMOReal& endPos, const SUMOReal laneLength,
00179                              const SUMOReal minLength, const bool friendlyPos) {
00180     if (minLength > laneLength) {
00181         return false;
00182     }
00183     if (startPos < 0) {
00184         startPos += laneLength;
00185     }
00186     if (endPos < 0) {
00187         endPos += laneLength;
00188     }
00189     if (endPos < minLength || endPos > laneLength) {
00190         if (!friendlyPos) {
00191             return false;
00192         }
00193         if (endPos < minLength) {
00194             endPos = minLength;
00195         }
00196         if (endPos > laneLength) {
00197             endPos = laneLength;
00198         }
00199     }
00200     if (startPos < 0 || startPos > endPos - minLength) {
00201         if (!friendlyPos) {
00202             return false;
00203         }
00204         if (startPos < 0) {
00205             startPos = 0;
00206         }
00207         if (startPos > endPos - minLength) {
00208             startPos = endPos - minLength;
00209         }
00210     }
00211     return true;
00212 }
00213 
00214 /****************************************************************************/
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Friends Defines