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),
100 for (
unsigned int i = 0; i <
myLanes->size(); i++) {
108 assert(laneNo < myLanes->size());
109 return *((*myLanes)[laneNo]);
115 assert(laneNo < myLanes->size());
122 LaneWrapperVector::const_iterator i =
131 std::vector<GUIGlID> ret;
137 ret.push_back(edge->
getGlID());
149 for (
unsigned int j = 0; j < g.
size(); j++) {
161 netsWrappers.reserve(size);
162 for (DictType::iterator i =
myDict.begin(); i !=
myDict.end(); ++i) {
164 netsWrappers.push_back(static_cast<GUIEdge*>((*i).second));
196 ret->
mkItem(
"allowed speed [m/s]",
false, getAllowedSpeed());
197 ret->
mkItem(
"occupancy [%]",
true,
199 ret->
mkItem(
"mean vehicle speed [m/s]",
true,
201 ret->
mkItem(
"flow [veh/h/lane]",
true,
203 ret->
mkItem(
"#vehicles",
true,
205 ret->
mkItem(
"vehicle ids",
false, getVehicleIDs());
208 ret->
mkItem(
"segment index",
false, segment->getIndex());
209 ret->
mkItem(
"segment length [m]",
false, segment->getLength());
210 ret->
mkItem(
"segment allowed speed [m/s]",
false, segment->getMaxSpeed());
211 ret->
mkItem(
"segment jam threshold [%]",
false, segment->getRelativeJamThreshold());
257 if (vehicleControl != 0) {
259 vehicleControl->secureVehicles();
260 size_t laneIndex = 0;
261 MESegment::Queue queue;
262 for (LaneWrapperVector::const_iterator l =
myLaneGeoms.begin(); l !=
myLaneGeoms.end(); ++l, ++laneIndex) {
264 const std::vector<SUMOReal>& shapeRotations = (*l)->getShapeRotations();
265 const std::vector<SUMOReal>& shapeLengths = (*l)->getShapeLengths();
268 glTranslated(laneBeg.
x(), laneBeg.
y(), 0);
269 glRotated(shapeRotations[0], 0, 0, 1);
274 for (MESegment* segment = MSGlobals::gMesoNet->getSegmentForEdge(*
this);
275 segment != 0; segment = segment->getNextSegment()) {
276 const SUMOReal length = segment->getLength();
277 if (laneIndex < segment->numQueues()) {
279 queue = segment->getQueue(laneIndex);
280 const SUMOReal avgCarSize = segment->getOccupancy() / segment->getCarNumber();
281 const size_t queueSize = queue.size();
282 for (
size_t i = 0; i < queueSize; i++) {
284 setVehicleColor(s, veh);
285 SUMOReal vehiclePosition = segmentOffset + length - i * avgCarSize;
287 while (vehiclePosition < segmentOffset) {
291 vehiclePosition += length;
294 while (shapeIndex < (
int)shapeRotations.size() - 1 && vehiclePosition > shapeOffset + shapeLengths[shapeIndex]) {
296 shapeOffset += shapeLengths[shapeIndex];
299 glTranslated(shape[shapeIndex].x(), shape[shapeIndex].y(), 0);
300 glRotated(shapeRotations[shapeIndex], 0, 0, 1);
303 glTranslated(xOff, -(vehiclePosition - shapeOffset),
GLO_VEHICLE);
305 glScaled(1, avgCarSize, 1);
306 glBegin(GL_TRIANGLES);
308 glVertex2d(0 - 1.25, 1);
309 glVertex2d(0 + 1.25, 1);
313 if (nameSettings.
show) {
315 Position(xOff, -(vehiclePosition - shapeOffset)),
320 segmentOffset += length;
324 vehicleControl->releaseVehicles();
333 if (drawEdgeName || drawInternalEdgeName || drawStreetName) {
341 if (angle > 90 && angle < 270) {
346 }
else if (drawInternalEdgeName) {
349 if (drawStreetName) {
355 for (std::set<MSPerson*>::const_iterator i =
myPersons.begin(); i !=
myPersons.end(); ++i) {
365 GUIEdge::getVehicleNo()
const {
367 for (MESegment* segment = MSGlobals::gMesoNet->getSegmentForEdge(*
this); segment != 0; segment = segment->getNextSegment()) {
368 vehNo += segment->getCarNumber();
370 return (
unsigned int)vehNo;
375 GUIEdge::getVehicleIDs()
const {
376 std::string result =
" ";
377 std::vector<const MEVehicle*> vehs;
378 for (MESegment* segment = MSGlobals::gMesoNet->getSegmentForEdge(*
this); segment != 0; segment = segment->getNextSegment()) {
379 std::vector<const MEVehicle*> segmentVehs = segment->getVehicles();
380 vehs.insert(vehs.end(), segmentVehs.begin(), segmentVehs.end());
382 for (std::vector<const MEVehicle*>::const_iterator it = vehs.begin(); it != vehs.end(); it++) {
383 result += (*it)->getID() +
" ";
390 GUIEdge::getFlow()
const {
392 for (MESegment* segment = MSGlobals::gMesoNet->getSegmentForEdge(*
this); segment != 0; segment = segment->getNextSegment()) {
393 flow += (
SUMOReal) segment->getCarNumber() * segment->getMeanSpeed();
395 return 3600 * flow / (*myLanes)[0]->getLength();
400 GUIEdge::getOccupancy()
const {
402 for (MESegment* segment = MSGlobals::gMesoNet->getSegmentForEdge(*
this); segment != 0; segment = segment->getNextSegment()) {
403 occ += segment->getOccupancy();
410 GUIEdge::getMeanSpeed()
const {
413 for (MESegment* segment = MSGlobals::gMesoNet->getSegmentForEdge(*
this); segment != 0; segment = segment->getNextSegment()) {
415 v += vehNo * segment->getMeanSpeed();
426 GUIEdge::getAllowedSpeed()
const {
427 return (*
myLanes)[0]->getSpeedLimit();
432 GUIEdge::getRelativeSpeed()
const {
433 return getMeanSpeed() / getAllowedSpeed();
439 GLHelper::setColor(s.edgeColorer.getScheme().getColor(getColorValue(s.edgeColorer.getActive())));
444 GUIEdge::getColorValue(
size_t activeScheme)
const {
445 switch (activeScheme) {
451 return getAllowedSpeed();
453 return getOccupancy();
455 return getMeanSpeed();
459 return getRelativeSpeed();
466 GUIEdge::getSegmentAtPosition(
const Position& pos) {
469 return MSGlobals::gMesoNet->getSegmentForEdge(*
this, lanePos);