#include <config.h>
#include <utils/gui/globjects/GLIncludes.h>
#include <utils/gui/globjects/GUIGlObject.h>
#include <utils/geom/PositionVector.h>
#include <guisim/GUILane.h>
#include <utils/gui/div/GLHelper.h>
#include <utils/gui/div/GUIParameterTableWindow.h>
#include <microsim/logging/FuncBinding_IntParam.h>
#include <microsim/logging/FunctionBinding.h>
#include <mesosim/MEInductLoop.h>
#include <mesosim/MESegment.h>
#include "GUIMEInductLoop.h"
GUIMEInductLoop::GUIMEInductLoop(const std::string& id, MESegment* s,
double position,
const std::string name, const std::string& vTypes,
const std::string& nextEdges,
int detectPersons,
bool ):
MEInductLoop(id, s, position, name, vTypes, nextEdges, detectPersons)
{}
GUIMEInductLoop::~GUIMEInductLoop() {}
GUIDetectorWrapper*
GUIMEInductLoop::buildDetectorGUIRepresentation() {
return new MyWrapper(*this, myPosition);
}
GUIMEInductLoop::MyWrapper::MyWrapper(GUIMEInductLoop& detector, double pos)
: GUIDetectorWrapper(GLO_E1DETECTOR_ME, detector.getID(), GUIIconSubSys::getIcon(GUIIcon::E1)),
myDetector(detector), myPosition(pos) {
const MSLane* lane = detector.mySegment->getEdge().getLanes()[0];
myFGPosition = lane->geometryPositionAtOffset(pos);
myBoundary.add(myFGPosition.x() + (double) 5.5, myFGPosition.y() + (double) 5.5);
myBoundary.add(myFGPosition.x() - (double) 5.5, myFGPosition.y() - (double) 5.5);
myFGRotation = -lane->getShape().rotationDegreeAtOffset(pos);
}
GUIMEInductLoop::MyWrapper::~MyWrapper() {}
double
GUIMEInductLoop::MyWrapper::getExaggeration(const GUIVisualizationSettings& s) const {
return s.addSize.getExaggeration(s, this);
}
Boundary
GUIMEInductLoop::MyWrapper::getCenteringBoundary() const {
Boundary b(myBoundary);
b.grow(20);
return b;
}
GUIParameterTableWindow*
GUIMEInductLoop::MyWrapper::getParameterWindow(GUIMainWindow& app,
GUISUMOAbstractView& ) {
GUIParameterTableWindow* ret = new GUIParameterTableWindow(app, *this);
ret->mkItem("position [m]", false, myPosition);
ret->mkItem("lane", false, myDetector.mySegment->getID());
ret->closeBuilding();
return ret;
}
void
GUIMEInductLoop::MyWrapper::drawGL(const GUIVisualizationSettings& s) const {
GLHelper::pushName(getGlID());
glPolygonOffset(0, -2);
double width = (double) 2.0 * s.scale;
glLineWidth(1.0);
const double exaggeration = getExaggeration(s);
glColor3d(1, 1, 0);
GLHelper::pushMatrix();
glTranslated(myFGPosition.x(), myFGPosition.y(), getType());
glRotated(myFGRotation, 0, 0, 1);
glScaled(exaggeration, exaggeration, exaggeration);
glBegin(GL_QUADS);
glVertex2d(0 - 1.0, 2);
glVertex2d(-1.0, -2);
glVertex2d(1.0, -2);
glVertex2d(1.0, 2);
glEnd();
glBegin(GL_LINES);
glVertex2d(0, 2 - .1);
glVertex2d(0, -2 + .1);
glEnd();
if (width * exaggeration > 1) {
glColor3d(1, 1, 1);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glBegin(GL_QUADS);
glVertex2d(0 - 1.0, 2);
glVertex2d(-1.0, -2);
glVertex2d(1.0, -2);
glVertex2d(1.0, 2);
glEnd();
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}
if (width * exaggeration > 1) {
glRotated(90, 0, 0, -1);
glColor3d(1, 1, 1);
glBegin(GL_LINES);
glVertex2d(0, 1.7);
glVertex2d(0, -1.7);
glEnd();
}
GLHelper::popMatrix();
drawName(getCenteringBoundary().getCenter(), s.scale, s.addName);
GLHelper::popName();
}
GUIMEInductLoop&
GUIMEInductLoop::MyWrapper::getLoop() {
return myDetector;
}