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
76 const EdgeBasicFunction function,
const std::string& streetName,
const std::string& edgeType)
77 :
MSEdge(id, numericalID, function, streetName, edgeType),
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());
165 ret->
mkItem(
"vehicle ids",
false, getVehicleIDs());
168 ret->
mkItem(
"segment index",
false, segment->getIndex());
169 ret->
mkItem(
"segment length [m]",
false, segment->getLength());
170 ret->
mkItem(
"segment allowed speed [m/s]",
false, segment->getMaxSpeed());
171 ret->
mkItem(
"segment jam threshold [%]",
false, segment->getRelativeJamThreshold());
205 for (std::vector<MSLane*>::const_iterator i =
myLanes->begin(); i !=
myLanes->end(); ++i) {
220 if (vehicleControl != 0) {
222 vehicleControl->secureVehicles();
223 size_t laneIndex = 0;
224 MESegment::Queue queue;
225 for (std::vector<MSLane*>::const_iterator msl =
myLanes->begin(); msl !=
myLanes->end(); ++msl, ++laneIndex) {
232 glTranslated(laneBeg.
x(), laneBeg.
y(), 0);
233 glRotated(shapeRotations[0], 0, 0, 1);
238 for (MESegment* segment = MSGlobals::gMesoNet->getSegmentForEdge(*
this);
239 segment != 0; segment = segment->getNextSegment()) {
240 const SUMOReal length = segment->getLength();
241 if (laneIndex < segment->numQueues()) {
243 queue = segment->getQueue(laneIndex);
244 const SUMOReal avgCarSize = segment->getBruttoOccupancy() / segment->getCarNumber();
245 const size_t queueSize = queue.size();
246 for (
size_t i = 0; i < queueSize; ++i) {
248 setVehicleColor(s, veh);
249 SUMOReal vehiclePosition = segmentOffset + length - i * avgCarSize;
251 while (vehiclePosition < segmentOffset) {
255 vehiclePosition += length;
258 while (shapeIndex < (
int)shapeRotations.size() - 1 && vehiclePosition > shapeOffset + shapeLengths[shapeIndex]) {
260 shapeOffset += shapeLengths[shapeIndex];
263 glTranslated(shape[shapeIndex].x(), shape[shapeIndex].y(), 0);
264 glRotated(shapeRotations[shapeIndex], 0, 0, 1);
267 glTranslated(xOff, -(vehiclePosition - shapeOffset),
GLO_VEHICLE);
269 glScaled(1, avgCarSize, 1);
270 glBegin(GL_TRIANGLES);
272 glVertex2d(0 - 1.25, 1);
273 glVertex2d(0 + 1.25, 1);
277 if (nameSettings.
show) {
279 Position(xOff, -(vehiclePosition - shapeOffset)),
284 segmentOffset += length;
288 vehicleControl->releaseVehicles();
298 if (drawEdgeName || drawInternalEdgeName || drawCwaEdgeName || drawStreetName) {
301 if (lane1 != 0 && lane2 != 0) {
307 if (angle > 90 && angle < 270) {
312 }
else if (drawInternalEdgeName) {
314 }
else if (drawCwaEdgeName) {
317 if (drawStreetName) {
325 for (std::set<MSPerson*>::const_iterator i =
myPersons.begin(); i !=
myPersons.end(); ++i) {
336 GUIEdge::getVehicleNo()
const {
338 for (MESegment* segment = MSGlobals::gMesoNet->getSegmentForEdge(*
this); segment != 0; segment = segment->getNextSegment()) {
339 vehNo += segment->getCarNumber();
341 return (
unsigned int)vehNo;
346 GUIEdge::getVehicleIDs()
const {
347 std::string result =
" ";
348 std::vector<const MEVehicle*> vehs;
349 for (MESegment* segment = MSGlobals::gMesoNet->getSegmentForEdge(*
this); segment != 0; segment = segment->getNextSegment()) {
350 std::vector<const MEVehicle*> segmentVehs = segment->getVehicles();
351 vehs.insert(vehs.end(), segmentVehs.begin(), segmentVehs.end());
353 for (std::vector<const MEVehicle*>::const_iterator it = vehs.begin(); it != vehs.end(); it++) {
354 result += (*it)->getID() +
" ";
361 GUIEdge::getFlow()
const {
363 for (MESegment* segment = MSGlobals::gMesoNet->getSegmentForEdge(*
this); segment != 0; segment = segment->getNextSegment()) {
364 flow += (
SUMOReal) segment->getCarNumber() * segment->getMeanSpeed();
366 return 3600 * flow / (*myLanes)[0]->getLength();
371 GUIEdge::getBruttoOccupancy()
const {
373 for (MESegment* segment = MSGlobals::gMesoNet->getSegmentForEdge(*
this); segment != 0; segment = segment->getNextSegment()) {
374 occ += segment->getBruttoOccupancy();
381 GUIEdge::getMeanSpeed()
const {
384 for (MESegment* segment = MSGlobals::gMesoNet->getSegmentForEdge(*
this); segment != 0; segment = segment->getNextSegment()) {
386 v += vehNo * segment->getMeanSpeed();
397 GUIEdge::getAllowedSpeed()
const {
398 return (*
myLanes)[0]->getSpeedLimit();
403 GUIEdge::getRelativeSpeed()
const {
404 return getMeanSpeed() / getAllowedSpeed();
410 GLHelper::setColor(s.edgeColorer.getScheme().getColor(getColorValue(s.edgeColorer.getActive())));
415 GUIEdge::getColorValue(
size_t activeScheme)
const {
416 switch (activeScheme) {
422 return getAllowedSpeed();
424 return getBruttoOccupancy();
426 return getMeanSpeed();
430 return getRelativeSpeed();
437 GUIEdge::getSegmentAtPosition(
const Position& pos) {
440 return MSGlobals::gMesoNet->getSegmentForEdge(*
this, lanePos);