void GUINet::initGUIStructures() { // initialise detector storage for gui initDetectors(); // initialise the tl-map initTLMap(); // initialise edge storage for gui GUIEdge::fill(myEdgeWrapper); // initialise junction storage for gui size_t size = myJunctions->size(); myJunctionWrapper.reserve(size); const std::map<std::string, MSJunction*> &junctions = myJunctions->getMyMap(); for (std::map<std::string, MSJunction*>::const_iterator i=junctions.begin(); i!=junctions.end(); ++i) { myJunctionWrapper.push_back(new GUIJunctionWrapper(GUIGlObjectStorage::gIDStorage, *(*i).second)); } // build the visualization tree float *cmin = new float[2]; float *cmax = new float[2]; for (std::vector<GUIEdge*>::iterator i=myEdgeWrapper.begin(); i!=myEdgeWrapper.end(); ++i) { GUIEdge *edge = *i; Boundary b; const std::vector<MSLane*> &lanes = edge->getLanes(); for (std::vector<MSLane*>::const_iterator j=lanes.begin(); j!=lanes.end(); ++j) { b.add((*j)->getShape().getBoxBoundary()); } b.grow(2.); cmin[0] = b.xmin(); cmin[1] = b.ymin(); cmax[0] = b.xmax(); cmax[1] = b.ymax(); myGrid->Insert(cmin, cmax, edge); myBoundary.add(b); } for (std::vector<GUIJunctionWrapper*>::iterator i=myJunctionWrapper.begin(); i!=myJunctionWrapper.end(); ++i) { GUIJunctionWrapper *junction = *i; Boundary b = junction->getBoundary(); b.grow(2.); cmin[0] = b.xmin(); cmin[1] = b.ymin(); cmax[0] = b.xmax(); cmax[1] = b.ymax(); myGrid->Insert(cmin, cmax, junction); myBoundary.add(b); } const std::vector<GUIGlObject_AbstractAdd*> &a = GUIGlObject_AbstractAdd::getObjectList(); for (std::vector<GUIGlObject_AbstractAdd*>::const_iterator i=a.begin(); i!=a.end(); ++i) { GUIGlObject_AbstractAdd *o = *i; Boundary b = o->getCenteringBoundary(); cmin[0] = b.xmin(); cmin[1] = b.ymin(); cmax[0] = b.xmax(); cmax[1] = b.ymax(); myGrid->Insert(cmin, cmax, o); } delete[] cmin; delete[] cmax; myGrid->add(myBoundary); }
Boundary GUIPolygon::getCenteringBoundary() const { Boundary b; b.add(myShape.getBoxBoundary()); b.grow(10); return b; }
Boundary GUIEdge::getBoundary() const { Boundary ret; if (getPurpose() != MSEdge::EDGEFUNCTION_DISTRICT) { for (std::vector<MSLane*>::const_iterator i = myLanes->begin(); i != myLanes->end(); ++i) { ret.add((*i)->getShape().getBoxBoundary()); } } else { // take the starting coordinates of all follower edges and the endpoints // of all successor edges for (MSEdgeVector::const_iterator it = mySuccessors.begin(); it != mySuccessors.end(); ++it) { const std::vector<MSLane*>& lanes = (*it)->getLanes(); for (std::vector<MSLane*>::const_iterator it_lane = lanes.begin(); it_lane != lanes.end(); ++it_lane) { ret.add((*it_lane)->getShape().front()); } } for (MSEdgeVector::const_iterator it = myPredecessors.begin(); it != myPredecessors.end(); ++it) { const std::vector<MSLane*>& lanes = (*it)->getLanes(); for (std::vector<MSLane*>::const_iterator it_lane = lanes.begin(); it_lane != lanes.end(); ++it_lane) { ret.add((*it_lane)->getShape().back()); } } } ret.grow(10); return ret; }
std::vector<GUIGlID> GUISUMOAbstractView::getObjectsAtPosition(Position pos, SUMOReal radius) { Boundary selection; selection.add(pos); selection.grow(radius); const std::vector<GUIGlID> ids = getObjectsInBoundary(selection); std::vector<GUIGlID> result; // Interpret results for (std::vector<GUIGlID>::const_iterator it = ids.begin(); it != ids.end(); it++) { GUIGlID id = *it; GUIGlObject* o = GUIGlObjectStorage::gIDStorage.getObjectBlocking(id); if (o == 0) { continue; } if (o->getGlID() == 0) { continue; } //std::cout << "point selection hit " << o->getMicrosimID() << "\n"; GUIGlObjectType type = o->getType(); if (type != 0) { result.push_back(id); } GUIGlObjectStorage::gIDStorage.unblockObject(id); } return result; }
Boundary GUIPerson::getCenteringBoundary() const { Boundary b; // ensure that the vehicle is drawn, otherwise myPositionInVehicle will not be updated b.add(getPosition()); b.grow(MAX2(getVehicleType().getWidth(), getVehicleType().getLength())); return b; }
Boundary GUILane::getCenteringBoundary() const { Boundary b; b.add(myShape[0]); b.add(myShape[-1]); b.grow(20); return b; }
Boundary GUIEdge::getCenteringBoundary() const { Boundary b = getBoundary(); // ensure that vehicles and persons on the side are drawn even if the edge // is outside the view b.grow(10); return b; }
Boundary GUILaneWrapper::getCenteringBoundary() const throw() { Boundary b; b.add(myShape[0]); b.add(myShape[-1]); b.grow(20); return b; }
Boundary GUIParkingArea::getCenteringBoundary() const { Boundary b = myShape.getBoxBoundary(); for (std::map<unsigned int, LotSpaceDefinition >::const_iterator i = mySpaceOccupancies.begin(); i != mySpaceOccupancies.end(); i++) { b.add((*i).second.myPosition); } b.grow(20); return b; }
Boundary GUIEdge::getBoundary() const { Boundary ret; for (std::vector<MSLane*>::const_iterator i = myLanes->begin(); i != myLanes->end(); ++i) { ret.add((*i)->getShape().getBoxBoundary()); } ret.grow(10); return ret; }
GUIGlID GUISUMOAbstractView::getObjectAtPosition(Position pos) { const SUMOReal SENSITIVITY = 0.1; // meters Boundary selection; selection.add(pos); selection.grow(SENSITIVITY); const std::vector<GUIGlID> ids = getObjectsInBoundary(selection); // Interpret results unsigned int idMax = 0; int prevLayer = -1000; for (std::vector<GUIGlID>::const_iterator it = ids.begin(); it != ids.end(); it++) { GUIGlID id = *it; GUIGlObject* o = GUIGlObjectStorage::gIDStorage.getObjectBlocking(id); if (o == 0) { continue; } if (o->getGlID() == 0) { continue; } //std::cout << "point selection hit " << o->getMicrosimID() << "\n"; GUIGlObjectType type = o->getType(); if (type != 0) { int clayer = (int) type; // determine an "abstract" layer for shapes // this "layer" resembles the layer of the shape // taking into account the stac of other objects if (type == GLO_SHAPE) { if (dynamic_cast<GUIPolygon*>(o) != 0) { if (dynamic_cast<GUIPolygon*>(o)->getLayer() > 0) { clayer = GLO_MAX + dynamic_cast<GUIPolygon*>(o)->getLayer(); } if (dynamic_cast<GUIPolygon*>(o)->getLayer() < 0) { clayer = dynamic_cast<GUIPolygon*>(o)->getLayer(); } } if (dynamic_cast<GUIPointOfInterest*>(o) != 0) { if (dynamic_cast<GUIPointOfInterest*>(o)->getLayer() > 0) { clayer = GLO_MAX + dynamic_cast<GUIPointOfInterest*>(o)->getLayer(); } if (dynamic_cast<GUIPointOfInterest*>(o)->getLayer() < 0) { clayer = dynamic_cast<GUIPointOfInterest*>(o)->getLayer(); } } } // check whether the current object is above a previous one if (prevLayer == -1000 || prevLayer < clayer) { idMax = id; prevLayer = clayer; } } GUIGlObjectStorage::gIDStorage.unblockObject(id); } return idMax; }
Boundary GUIEdge::getBoundary() const { Boundary ret; for (LaneWrapperVector::const_iterator i = myLaneGeoms.begin(); i != myLaneGeoms.end(); ++i) { const PositionVector& g = (*i)->getShape(); for (unsigned int j = 0; j < g.size(); j++) { ret.add(g[j]); } } ret.grow(10); return ret; }
Boundary GNEDemandElement::getCenteringBoundary() const { // Return Boundary depending if myMovingGeometryBoundary is initialised (important for move geometry) if (myMove.movingGeometryBoundary.isInitialised()) { return myMove.movingGeometryBoundary; } else if (myGeometry.shape.size() > 0) { Boundary b = myGeometry.shape.getBoxBoundary(); b.grow(20); return b; } else { return Boundary(-0.1, -0.1, 0.1, 0.1); } }
Boundary GUITrafficLightLogicWrapper::getCenteringBoundary() const { Boundary ret; const MSTrafficLightLogic::LaneVectorVector& lanes = myTLLogic.getLaneVectors(); for (MSTrafficLightLogic::LaneVectorVector::const_iterator i = lanes.begin(); i != lanes.end(); ++i) { const MSTrafficLightLogic::LaneVector& lanes2 = (*i); for (MSTrafficLightLogic::LaneVector::const_iterator j = lanes2.begin(); j != lanes2.end(); ++j) { ret.add((*j)->getShape()[-1]); } } ret.grow(20); return ret; }
TraCIRTree* TraCIServerAPI_Lane::getTree() { TraCIRTree* t = new TraCIRTree(); const std::vector<MSEdge*>& edges = MSNet::getInstance()->getEdgeControl().getEdges(); for (std::vector<MSEdge*>::const_iterator i = edges.begin(); i != edges.end(); ++i) { const std::vector<MSLane*>& lanes = (*i)->getLanes(); for (std::vector<MSLane*>::const_iterator j = lanes.begin(); j != lanes.end(); ++j) { Boundary b = (*j)->getShape().getBoxBoundary(); b.grow(3.); t->addObject(*j, b); } } return t; }
Boundary GNECrossing::getCenteringBoundary() const { // make sure that shape isn't empty if (myShape.size() == 0) { // we need to use the center of junction parent as boundary if shape is empty return Boundary(myParentJunction->getPositionInView().x() - 0.1, myParentJunction->getPositionInView().y() - 0.1, myParentJunction->getPositionInView().x() + 0.1, myParentJunction->getPositionInView().x() + 0.1); } else { // use crossing boundary Boundary b = myShape.getBoxBoundary(); b.grow(10); return b; } }
GUIGlID GUISUMOAbstractView::getObjectAtPosition(Position pos) { const SUMOReal SENSITIVITY = 0.1; // meters Boundary selection; selection.add(pos); selection.grow(SENSITIVITY); const std::vector<GUIGlID> ids = getObjectsInBoundary(selection); // Interpret results unsigned int idMax = 0; SUMOReal maxLayer = -std::numeric_limits<SUMOReal>::max(); for (std::vector<GUIGlID>::const_iterator it = ids.begin(); it != ids.end(); it++) { GUIGlID id = *it; GUIGlObject* o = GUIGlObjectStorage::gIDStorage.getObjectBlocking(id); if (o == 0) { continue; } if (o->getGlID() == 0) { continue; } //std::cout << "point selection hit " << o->getMicrosimID() << "\n"; GUIGlObjectType type = o->getType(); if (type != 0) { SUMOReal layer = (SUMOReal)type; // determine an "abstract" layer for shapes // this "layer" resembles the layer of the shape // taking into account the stac of other objects if (type == GLO_POI || type == GLO_POLYGON) { layer = dynamic_cast<Shape*>(o)->getLayer(); } #ifdef HAVE_INTERNAL if (type == GLO_LANE && GUIVisualizationSettings::UseMesoSim) { // do not select lanes in meso mode continue; } #endif // check whether the current object is above a previous one if (layer > maxLayer) { idMax = id; maxLayer = layer; } } GUIGlObjectStorage::gIDStorage.unblockObject(id); } return idMax; }
Boundary GUIJunctionWrapper::getCenteringBoundary() const { Boundary b = myBoundary; b.grow(20); return b; }
Boundary GNEInternalLane::getCenteringBoundary() const { Boundary b = myShape.getBoxBoundary(); b.grow(10); return b; }
Boundary GNEConnection::getCenteringBoundary() const { Boundary b = getBoundary(); b.grow(20); return b; }
Boundary GUIEdge::getCenteringBoundary() const { Boundary b = getBoundary(); b.grow(20); return b; }
void GUINet::initGUIStructures() { // initialise detector storage for gui const std::vector<SumoXMLTag> types = myDetectorControl->getAvailableTypes(); for (std::vector<SumoXMLTag>::const_iterator i = types.begin(); i != types.end(); ++i) { const std::map<std::string, MSDetectorFileOutput*>& dets = myDetectorControl->getTypedDetectors(*i).getMyMap(); for (std::map<std::string, MSDetectorFileOutput*>::const_iterator j = dets.begin(); j != dets.end(); ++j) { GUIDetectorWrapper* wrapper = (*j).second->buildDetectorGUIRepresentation(); if (wrapper != 0) { myDetectorDict.push_back(wrapper); myGrid.addAdditionalGLObject(wrapper); } } } // initialise the tl-map initTLMap(); // initialise edge storage for gui GUIEdge::fill(myEdgeWrapper); // initialise junction storage for gui size_t size = myJunctions->size(); myJunctionWrapper.reserve(size); const std::map<std::string, MSJunction*>& junctions = myJunctions->getMyMap(); for (std::map<std::string, MSJunction*>::const_iterator i = junctions.begin(); i != junctions.end(); ++i) { myJunctionWrapper.push_back(new GUIJunctionWrapper(*(*i).second)); } // build the visualization tree float* cmin = new float[2]; float* cmax = new float[2]; for (std::vector<GUIEdge*>::iterator i = myEdgeWrapper.begin(); i != myEdgeWrapper.end(); ++i) { GUIEdge* edge = *i; Boundary b; const std::vector<MSLane*>& lanes = edge->getLanes(); for (std::vector<MSLane*>::const_iterator j = lanes.begin(); j != lanes.end(); ++j) { b.add((*j)->getShape().getBoxBoundary()); } // make sure persons are always drawn and selectable since they depend on their edge being drawn b.grow(MSPModel::SIDEWALK_OFFSET + 1); cmin[0] = b.xmin(); cmin[1] = b.ymin(); cmax[0] = b.xmax(); cmax[1] = b.ymax(); myGrid.Insert(cmin, cmax, edge); myBoundary.add(b); if (myBoundary.getWidth() > 10e16 || myBoundary.getHeight() > 10e16) { throw ProcessError("Network size exceeds 1 Lightyear. Please reconsider your inputs.\n"); } } for (std::vector<GUIJunctionWrapper*>::iterator i = myJunctionWrapper.begin(); i != myJunctionWrapper.end(); ++i) { GUIJunctionWrapper* junction = *i; Boundary b = junction->getBoundary(); b.grow(2.); cmin[0] = b.xmin(); cmin[1] = b.ymin(); cmax[0] = b.xmax(); cmax[1] = b.ymax(); myGrid.Insert(cmin, cmax, junction); myBoundary.add(b); } delete[] cmin; delete[] cmax; myGrid.add(myBoundary); }
Boundary GUIChargingStation::getCenteringBoundary() const { Boundary b = myFGShape.getBoxBoundary(); b.grow(20); return b; }
Boundary GNELane::getCenteringBoundary() const { Boundary b = getShape().getBoxBoundary(); b.grow(10); return b; }
Boundary GNEJunction::getCenteringBoundary() const { Boundary b = myBoundary; b.grow(20); return b; }
Boundary GUIContainerStop::getCenteringBoundary() const { Boundary b = myFGShape.getBoxBoundary(); b.grow(20); return b; }
Boundary GNECrossing::getCenteringBoundary() const { Boundary b = myShape.getBoxBoundary(); b.grow(10); return b; }
SUMOTime MSDevice_BTreceiver::BTreceiverUpdate::execute(SUMOTime /*currentTime*/) { // build rtree with senders NamedRTree rt; for (std::map<std::string, MSDevice_BTsender::VehicleInformation*>::const_iterator i = MSDevice_BTsender::sVehicles.begin(); i != MSDevice_BTsender::sVehicles.end(); ++i) { MSDevice_BTsender::VehicleInformation* vi = (*i).second; Boundary b = vi->getBoxBoundary(); b.grow(POSITION_EPS); const float cmin[2] = {(float) b.xmin(), (float) b.ymin()}; const float cmax[2] = {(float) b.xmax(), (float) b.ymax()}; rt.Insert(cmin, cmax, vi); } // check visibility for all receivers OptionsCont& oc = OptionsCont::getOptions(); bool allRecognitions = oc.getBool("device.btreceiver.all-recognitions"); bool haveOutput = oc.isSet("bt-output"); for (std::map<std::string, MSDevice_BTreceiver::VehicleInformation*>::iterator i = MSDevice_BTreceiver::sVehicles.begin(); i != MSDevice_BTreceiver::sVehicles.end();) { // collect surrounding vehicles MSDevice_BTreceiver::VehicleInformation* vi = (*i).second; Boundary b = vi->getBoxBoundary(); b.grow(vi->range); const float cmin[2] = {(float) b.xmin(), (float) b.ymin()}; const float cmax[2] = {(float) b.xmax(), (float) b.ymax()}; std::set<std::string> surroundingVehicles; Named::StoringVisitor sv(surroundingVehicles); rt.Search(cmin, cmax, sv); // loop over surrounding vehicles, check visibility status for (std::set<std::string>::const_iterator j = surroundingVehicles.begin(); j != surroundingVehicles.end(); ++j) { if ((*i).first == *j) { // seeing oneself? skip continue; } updateVisibility(*vi, *MSDevice_BTsender::sVehicles.find(*j)->second); } if (vi->haveArrived) { // vehicle has left the simulation; remove if (haveOutput) { writeOutput((*i).first, vi->seen, allRecognitions); } delete vi; MSDevice_BTreceiver::sVehicles.erase(i++); } else { // vehicle is still in the simulation; reset state vi->updates.erase(vi->updates.begin(), vi->updates.end() - 1); ++i; } } // remove arrived senders / reset state for (std::map<std::string, MSDevice_BTsender::VehicleInformation*>::iterator i = MSDevice_BTsender::sVehicles.begin(); i != MSDevice_BTsender::sVehicles.end();) { MSDevice_BTsender::VehicleInformation* vi = (*i).second; if (vi->haveArrived) { delete vi; MSDevice_BTsender::sVehicles.erase(i++); } else { vi->updates.erase(vi->updates.begin(), vi->updates.end() - 1); ++i; } } return DELTA_T; }
Boundary GUIBusStop::getCenteringBoundary() const { Boundary b = myFGShape.getBoxBoundary(); b.grow(SUMO_const_laneWidth); return b; }
Boundary GUIParkingArea::getCenteringBoundary() const { Boundary b = myShape.getBoxBoundary(); b.grow(20); return b; }