bool TraCIServerAPI_Junction::getPosition(const std::string& id, Position& p) { MSJunction* j = MSNet::getInstance()->getJunctionControl().get(id); if (j == 0) { return false; } p = j->getPosition(); return true; }
// =========================================================================== // method definitions // =========================================================================== bool TraCIServerAPI_Junction::processGet(TraCIServer& server, tcpip::Storage& inputStorage, tcpip::Storage& outputStorage) { // variable int variable = inputStorage.readUnsignedByte(); std::string id = inputStorage.readString(); // check variable if (variable != ID_LIST && variable != VAR_POSITION && variable != ID_COUNT && variable != VAR_SHAPE) { return server.writeErrorStatusCmd(CMD_GET_JUNCTION_VARIABLE, "Get Junction Variable: unsupported variable specified", outputStorage); } // begin response building tcpip::Storage tempMsg; // response-code, variableID, objectID tempMsg.writeUnsignedByte(RESPONSE_GET_JUNCTION_VARIABLE); tempMsg.writeUnsignedByte(variable); tempMsg.writeString(id); if (variable == ID_LIST) { std::vector<std::string> ids; MSNet::getInstance()->getJunctionControl().insertIDs(ids); tempMsg.writeUnsignedByte(TYPE_STRINGLIST); tempMsg.writeStringList(ids); } else if (variable == ID_COUNT) { std::vector<std::string> ids; MSNet::getInstance()->getJunctionControl().insertIDs(ids); tempMsg.writeUnsignedByte(TYPE_INTEGER); tempMsg.writeInt((int) ids.size()); } else { MSJunction* j = MSNet::getInstance()->getJunctionControl().get(id); if (j == 0) { return server.writeErrorStatusCmd(CMD_GET_JUNCTION_VARIABLE, "Junction '" + id + "' is not known", outputStorage); } switch (variable) { case ID_LIST: break; case VAR_POSITION: tempMsg.writeUnsignedByte(POSITION_2D); tempMsg.writeDouble(j->getPosition().x()); tempMsg.writeDouble(j->getPosition().y()); break; case VAR_SHAPE: tempMsg.writeUnsignedByte(TYPE_POLYGON); tempMsg.writeUnsignedByte((int)MIN2(static_cast<size_t>(255), j->getShape().size())); for (unsigned int iPoint = 0; iPoint < MIN2(static_cast<size_t>(255), j->getShape().size()); ++iPoint) { tempMsg.writeDouble(j->getShape()[iPoint].x()); tempMsg.writeDouble(j->getShape()[iPoint].y()); } break; default: break; } } server.writeStatusCmd(CMD_GET_JUNCTION_VARIABLE, RTYPE_OK, "", outputStorage); server.writeResponseWithLength(outputStorage, tempMsg); return true; }
// =========================================================================== // method definitions // =========================================================================== GUIJunctionWrapper::GUIJunctionWrapper(MSJunction& junction) : GUIGlObject(GLO_JUNCTION, junction.getID()), myJunction(junction) { if (myJunction.getShape().size() == 0) { Position pos = myJunction.getPosition(); myBoundary = Boundary(pos.x() - 1., pos.y() - 1., pos.x() + 1., pos.y() + 1.); } else { myBoundary = myJunction.getShape().getBoxBoundary(); } myMaxSize = MAX2(myBoundary.getWidth(), myBoundary.getHeight()); #ifdef HAVE_INTERNAL_LANES myIsInner = dynamic_cast<MSInternalJunction*>(&myJunction) != 0; #else myIsInner = false; #endif myAmWaterway = true; for (ConstMSEdgeVector::const_iterator it = myJunction.getIncoming().begin(); it != myJunction.getIncoming().end(); ++it) { if (!(*it)->isInternal() && !isWaterway((*it)->getPermissions())) { myAmWaterway = false; break; } } for (ConstMSEdgeVector::const_iterator it = myJunction.getOutgoing().begin(); it != myJunction.getOutgoing().end(); ++it) { if (!(*it)->isInternal() && !isWaterway((*it)->getPermissions())) { myAmWaterway = false; break; } } }
// =========================================================================== // method definitions // =========================================================================== GUIJunctionWrapper::GUIJunctionWrapper(GUIGlObjectStorage &idStorage, MSJunction &junction) throw() : GUIGlObject(idStorage, "junction:"+junction.getID()), myJunction(junction) { if (myJunction.getShape().size()==0) { Position2D pos = myJunction.getPosition(); myBoundary = Boundary(pos.x()-1., pos.y()-1., pos.x()+1., pos.y()+1.); } else { myBoundary = myJunction.getShape().getBoxBoundary(); } myMaxSize = MAX2(myBoundary.getWidth(), myBoundary.getHeight()); }
// =========================================================================== // method definitions // =========================================================================== GUIJunctionWrapper::GUIJunctionWrapper(MSJunction& junction) : GUIGlObject(GLO_JUNCTION, junction.getID()), myJunction(junction) { if (myJunction.getShape().size() == 0) { Position pos = myJunction.getPosition(); myBoundary = Boundary(pos.x() - 1., pos.y() - 1., pos.x() + 1., pos.y() + 1.); } else { myBoundary = myJunction.getShape().getBoxBoundary(); } myMaxSize = MAX2(myBoundary.getWidth(), myBoundary.getHeight()); #ifdef HAVE_INTERNAL_LANES myIsInner = dynamic_cast<MSInternalJunction*>(&myJunction) != 0; #else myIsInner = false; #endif }