61 #include <mesogui/GUIMEVehicleControl.h>
62 #include <mesosim/MESegment.h>
63 #include <mesosim/MELoop.h>
64 #include <mesosim/MEVehicle.h>
67 #ifdef CHECK_MEMORY_LEAKS
69 #endif // CHECK_MEMORY_LEAKS
77 :
MSEdge(id, numericalID, function, streetName),
91 assert(laneNo < myLanes->size());
92 return *((*myLanes)[laneNo]);
98 std::vector<GUIGlID> ret;
104 ret.push_back(edge->
getGlID());
114 for (std::vector<MSLane*>::const_iterator i =
myLanes->begin(); i !=
myLanes->end(); ++i) {
115 ret.
add((*i)->getShape().getBoxBoundary());
125 netsWrappers.reserve(size);
126 for (DictType::iterator i =
myDict.begin(); i !=
myDict.end(); ++i) {
128 netsWrappers.push_back(static_cast<GUIEdge*>((*i).second));
160 ret->
mkItem(
"allowed speed [m/s]",
false, getAllowedSpeed());
161 ret->
mkItem(
"occupancy [%]",
true,
163 ret->
mkItem(
"mean vehicle speed [m/s]",
true,
165 ret->
mkItem(
"flow [veh/h/lane]",
true,
167 ret->
mkItem(
"#vehicles",
true,
169 ret->
mkItem(
"vehicle ids",
false, getVehicleIDs());
172 ret->
mkItem(
"segment index",
false, segment->getIndex());
173 ret->
mkItem(
"segment length [m]",
false, segment->getLength());
174 ret->
mkItem(
"segment allowed speed [m/s]",
false, segment->getMaxSpeed());
175 ret->
mkItem(
"segment jam threshold [%]",
false, segment->getRelativeJamThreshold());
209 for (std::vector<MSLane*>::const_iterator i =
myLanes->begin(); i !=
myLanes->end(); ++i) {
224 if (vehicleControl != 0) {
226 vehicleControl->secureVehicles();
227 size_t laneIndex = 0;
228 MESegment::Queue queue;
229 for (std::vector<MSLane*>::const_iterator msl =
myLanes->begin(); msl !=
myLanes->end(); ++msl, ++laneIndex) {
236 glTranslated(laneBeg.
x(), laneBeg.
y(), 0);
237 glRotated(shapeRotations[0], 0, 0, 1);
242 for (MESegment* segment = MSGlobals::gMesoNet->getSegmentForEdge(*
this);
243 segment != 0; segment = segment->getNextSegment()) {
244 const SUMOReal length = segment->getLength();
245 if (laneIndex < segment->numQueues()) {
247 queue = segment->getQueue(laneIndex);
248 const SUMOReal avgCarSize = segment->getOccupancy() / segment->getCarNumber();
249 const size_t queueSize = queue.size();
250 for (
size_t i = 0; i < queueSize; ++i) {
252 setVehicleColor(s, veh);
253 SUMOReal vehiclePosition = segmentOffset + length - i * avgCarSize;
255 while (vehiclePosition < segmentOffset) {
259 vehiclePosition += length;
262 while (shapeIndex < (
int)shapeRotations.size() - 1 && vehiclePosition > shapeOffset + shapeLengths[shapeIndex]) {
264 shapeOffset += shapeLengths[shapeIndex];
267 glTranslated(shape[shapeIndex].x(), shape[shapeIndex].y(), 0);
268 glRotated(shapeRotations[shapeIndex], 0, 0, 1);
271 glTranslated(xOff, -(vehiclePosition - shapeOffset),
GLO_VEHICLE);
273 glScaled(1, avgCarSize, 1);
274 glBegin(GL_TRIANGLES);
276 glVertex2d(0 - 1.25, 1);
277 glVertex2d(0 + 1.25, 1);
281 if (nameSettings.
show) {
283 Position(xOff, -(vehiclePosition - shapeOffset)),
288 segmentOffset += length;
292 vehicleControl->releaseVehicles();
301 if (drawEdgeName || drawInternalEdgeName || drawStreetName) {
304 if (lane1 != 0 && lane2 != 0) {
310 if (angle > 90 && angle < 270) {
315 }
else if (drawInternalEdgeName) {
318 if (drawStreetName) {
325 for (std::set<MSPerson*>::const_iterator i =
myPersons.begin(); i !=
myPersons.end(); ++i) {
335 GUIEdge::getVehicleNo()
const {
337 for (MESegment* segment = MSGlobals::gMesoNet->getSegmentForEdge(*
this); segment != 0; segment = segment->getNextSegment()) {
338 vehNo += segment->getCarNumber();
340 return (
unsigned int)vehNo;
345 GUIEdge::getVehicleIDs()
const {
346 std::string result =
" ";
347 std::vector<const MEVehicle*> vehs;
348 for (MESegment* segment = MSGlobals::gMesoNet->getSegmentForEdge(*
this); segment != 0; segment = segment->getNextSegment()) {
349 std::vector<const MEVehicle*> segmentVehs = segment->getVehicles();
350 vehs.insert(vehs.end(), segmentVehs.begin(), segmentVehs.end());
352 for (std::vector<const MEVehicle*>::const_iterator it = vehs.begin(); it != vehs.end(); it++) {
353 result += (*it)->getID() +
" ";
360 GUIEdge::getFlow()
const {
362 for (MESegment* segment = MSGlobals::gMesoNet->getSegmentForEdge(*
this); segment != 0; segment = segment->getNextSegment()) {
363 flow += (
SUMOReal) segment->getCarNumber() * segment->getMeanSpeed();
365 return 3600 * flow / (*myLanes)[0]->getLength();
370 GUIEdge::getOccupancy()
const {
372 for (MESegment* segment = MSGlobals::gMesoNet->getSegmentForEdge(*
this); segment != 0; segment = segment->getNextSegment()) {
373 occ += segment->getOccupancy();
380 GUIEdge::getMeanSpeed()
const {
383 for (MESegment* segment = MSGlobals::gMesoNet->getSegmentForEdge(*
this); segment != 0; segment = segment->getNextSegment()) {
385 v += vehNo * segment->getMeanSpeed();
396 GUIEdge::getAllowedSpeed()
const {
397 return (*
myLanes)[0]->getSpeedLimit();
402 GUIEdge::getRelativeSpeed()
const {
403 return getMeanSpeed() / getAllowedSpeed();
409 GLHelper::setColor(s.edgeColorer.getScheme().getColor(getColorValue(s.edgeColorer.getActive())));
414 GUIEdge::getColorValue(
size_t activeScheme)
const {
415 switch (activeScheme) {
421 return getAllowedSpeed();
423 return getOccupancy();
425 return getMeanSpeed();
429 return getRelativeSpeed();
436 GUIEdge::getSegmentAtPosition(
const Position& pos) {
439 return MSGlobals::gMesoNet->getSegmentForEdge(*
this, lanePos);