GUIParameterTableWindow* GUIEdge::getParameterWindow(GUIMainWindow& app, GUISUMOAbstractView& parent) { GUIParameterTableWindow* ret = 0; #ifdef HAVE_INTERNAL ret = new GUIParameterTableWindow(app, *this, 16); // add edge items ret->mkItem("length [m]", false, (*myLanes)[0]->getLength()); ret->mkItem("allowed speed [m/s]", false, getAllowedSpeed()); ret->mkItem("occupancy [%]", true, new FunctionBinding<GUIEdge, SUMOReal>(this, &GUIEdge::getBruttoOccupancy, 100.)); ret->mkItem("mean vehicle speed [m/s]", true, new FunctionBinding<GUIEdge, SUMOReal>(this, &GUIEdge::getMeanSpeed)); ret->mkItem("flow [veh/h/lane]", true, new FunctionBinding<GUIEdge, SUMOReal>(this, &GUIEdge::getFlow)); ret->mkItem("#vehicles", true, new CastingFunctionBinding<GUIEdge, SUMOReal, unsigned int>(this, &GUIEdge::getVehicleNo)); ret->mkItem("vehicle ids", false, getVehicleIDs()); // add segment items MESegment* segment = getSegmentAtPosition(parent.getPositionInformation()); ret->mkItem("segment index", false, segment->getIndex()); ret->mkItem("segment length [m]", false, segment->getLength()); ret->mkItem("segment allowed speed [m/s]", false, segment->getMaxSpeed()); ret->mkItem("segment jam threshold [%]", false, segment->getRelativeJamThreshold()); ret->mkItem("segment occupancy [%]", true, new FunctionBinding<MESegment, SUMOReal>(segment, &MESegment::getRelativeOccupancy)); ret->mkItem("segment mean vehicle speed [m/s]", true, new FunctionBinding<MESegment, SUMOReal>(segment, &MESegment::getMeanSpeed)); ret->mkItem("segment flow [veh/h/lane]", true, new FunctionBinding<MESegment, SUMOReal>(segment, &MESegment::getFlow)); ret->mkItem("segment #vehicles", true, new CastingFunctionBinding<MESegment, SUMOReal, size_t>(segment, &MESegment::getCarNumber)); ret->mkItem("segment leader leave time", true, new FunctionBinding<MESegment, SUMOReal>(segment, &MESegment::getEventTimeSeconds)); // close building ret->closeBuilding(); #else UNUSED_PARAMETER(app); UNUSED_PARAMETER(parent); #endif return ret; }
GUIParameterTableWindow* GUIEdge::getParameterWindow(GUIMainWindow& app, GUISUMOAbstractView& parent) { GUIParameterTableWindow* ret = 0; ret = new GUIParameterTableWindow(app, *this, 18); // add edge items ret->mkItem("length [m]", false, (*myLanes)[0]->getLength()); ret->mkItem("allowed speed [m/s]", false, getAllowedSpeed()); ret->mkItem("brutto occupancy [%]", true, new FunctionBinding<GUIEdge, SUMOReal>(this, &GUIEdge::getBruttoOccupancy, 100.)); ret->mkItem("mean vehicle speed [m/s]", true, new FunctionBinding<GUIEdge, SUMOReal>(this, &GUIEdge::getMeanSpeed)); ret->mkItem("flow [veh/h/lane]", true, new FunctionBinding<GUIEdge, SUMOReal>(this, &GUIEdge::getFlow)); ret->mkItem("routing speed [m/s]", true, new FunctionBinding<MSEdge, SUMOReal>(this, &MSEdge::getRoutingSpeed)); ret->mkItem("#vehicles", true, new CastingFunctionBinding<GUIEdge, SUMOReal, int>(this, &GUIEdge::getVehicleNo)); ret->mkItem("vehicle ids", false, getVehicleIDs()); // add segment items MESegment* segment = getSegmentAtPosition(parent.getPositionInformation()); ret->mkItem("segment index", false, segment->getIndex()); ret->mkItem("segment queues", false, segment->numQueues()); ret->mkItem("segment length [m]", false, segment->getLength()); ret->mkItem("segment allowed speed [m/s]", false, segment->getEdge().getSpeedLimit()); ret->mkItem("segment jam threshold [%]", false, segment->getRelativeJamThreshold() * 100); ret->mkItem("segment brutto occupancy [%]", true, new FunctionBinding<MESegment, SUMOReal>(segment, &MESegment::getRelativeOccupancy, 100)); ret->mkItem("segment mean vehicle speed [m/s]", true, new FunctionBinding<MESegment, SUMOReal>(segment, &MESegment::getMeanSpeed)); ret->mkItem("segment flow [veh/h/lane]", true, new FunctionBinding<MESegment, SUMOReal>(segment, &MESegment::getFlow)); ret->mkItem("segment #vehicles", true, new CastingFunctionBinding<MESegment, SUMOReal, int>(segment, &MESegment::getCarNumber)); ret->mkItem("segment leader leave time", true, new FunctionBinding<MESegment, SUMOReal>(segment, &MESegment::getEventTimeSeconds)); ret->mkItem("segment headway [s]", true, new FunctionBinding<MESegment, SUMOReal>(segment, &MESegment::getLastHeadwaySeconds)); // close building ret->closeBuilding(); return ret; }
void MELoop::teleportVehicle(MEVehicle* veh, MESegment* const toSegment) { const SUMOTime leaveTime = veh->getEventTime(); MESegment* const onSegment = veh->getSegment(); const bool teleporting = (onSegment == 0); // is the vehicle already teleporting? // try to find a place on the current edge MESegment* teleSegment = toSegment->getNextSegment(); while (teleSegment != 0 && !teleSegment->hasSpaceFor(veh, leaveTime)) { // @caution the time to get to the next segment here is ignored XXX teleSegment = teleSegment->getNextSegment(); } if (teleSegment != 0) { if (!teleporting) { // we managed to teleport in a single jump WRITE_WARNING("Teleporting vehicle '" + veh->getID() + "'; waited too long, from edge '" + onSegment->getEdge().getID() + "':" + toString(onSegment->getIndex()) + " to edge '" + teleSegment->getEdge().getID() + "':" + toString(teleSegment->getIndex()) + ", time " + time2string(leaveTime) + "."); MSNet::getInstance()->getVehicleControl().registerTeleportJam(); } changeSegment(veh, leaveTime, teleSegment, true); teleSegment->setEntryBlockTime(leaveTime); // teleports should not block normal flow } else { // teleport across the current edge and try insertion later if (!teleporting) { // announce start of multi-step teleport, arrival will be announced in changeSegment() WRITE_WARNING("Teleporting vehicle '" + veh->getID() + "'; waited too long, from edge '" + onSegment->getEdge().getID() + "':" + toString(onSegment->getIndex()) + ", time " + time2string(leaveTime) + "."); MSNet::getInstance()->getVehicleControl().registerTeleportJam(); // remove from current segment onSegment->send(veh, 0, leaveTime); // mark veh as teleporting veh->setSegment(0, 0); } // @caution microsim uses current travel time teleport duration const SUMOTime teleArrival = leaveTime + TIME2STEPS(veh->getEdge()->getLength() / veh->getEdge()->getSpeedLimit()); const bool atDest = veh->moveRoutePointer(); if (atDest) { // teleporting to end of route changeSegment(veh, teleArrival, 0, true); } else { veh->setEventTime(teleArrival); addLeaderCar(veh, 0); // teleporting vehicles must react to rerouters getSegmentForEdge(*veh->getEdge())->addReminders(veh); veh->activateReminders(MSMoveReminder::NOTIFICATION_JUNCTION); } } }
bool GUIEdge::setMultiColor(const GUIColorer& c) const { const int activeScheme = c.getActive(); mySegmentColors.clear(); switch (activeScheme) { case 10: // alternating segments for (MESegment* segment = MSGlobals::gMesoNet->getSegmentForEdge(*this); segment != 0; segment = segment->getNextSegment()) { mySegmentColors.push_back(c.getScheme().getColor(segment->getIndex() % 2)); } //std::cout << getID() << " scheme=" << c.getScheme().getName() << " schemeCols=" << c.getScheme().getColors().size() << " thresh=" << toString(c.getScheme().getThresholds()) << " segmentColors=" << mySegmentColors.size() << " [0]=" << mySegmentColors[0] << " [1]=" << mySegmentColors[1] << "\n"; return true; case 11: // by segment jammed state for (MESegment* segment = MSGlobals::gMesoNet->getSegmentForEdge(*this); segment != 0; segment = segment->getNextSegment()) { mySegmentColors.push_back(c.getScheme().getColor(segment->free() ? 0 : 1)); } return true; case 12: // by segment occupancy for (MESegment* segment = MSGlobals::gMesoNet->getSegmentForEdge(*this); segment != 0; segment = segment->getNextSegment()) { mySegmentColors.push_back(c.getScheme().getColor(segment->getRelativeOccupancy())); } return true; case 13: // by segment speed for (MESegment* segment = MSGlobals::gMesoNet->getSegmentForEdge(*this); segment != 0; segment = segment->getNextSegment()) { mySegmentColors.push_back(c.getScheme().getColor(segment->getMeanSpeed())); } return true; case 14: // by segment flow for (MESegment* segment = MSGlobals::gMesoNet->getSegmentForEdge(*this); segment != 0; segment = segment->getNextSegment()) { mySegmentColors.push_back(c.getScheme().getColor(3600 * segment->getCarNumber() * segment->getMeanSpeed() / segment->getLength())); } return true; case 15: // by segment relative speed for (MESegment* segment = MSGlobals::gMesoNet->getSegmentForEdge(*this); segment != 0; segment = segment->getNextSegment()) { mySegmentColors.push_back(c.getScheme().getColor(segment->getMeanSpeed() / getAllowedSpeed())); } return true; default: return false; } }