SUMO - Simulation of Urban MObility
|
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 /****************************************************************************/