64#include <unordered_set>
75#pragma warning(disable: 4435 5219 5220)
78#pragma GCC diagnostic push
79#pragma GCC diagnostic ignored "-Wpedantic"
83#pragma GCC diagnostic pop
128FXIMPLEMENT_ABSTRACT(
GUISUMOAbstractView, FXGLCanvas, GUISUMOAbstractViewMap, ARRAYNUMBER(GUISUMOAbstractViewMap))
135 FXGLCanvas(p, glVis, share, p,
MID_GLCANVAS, LAYOUT_SIDE_TOP | LAYOUT_FILL_X | LAYOUT_FILL_Y, 0, 0, 0, 0),
137 myGlChildWindowParent(parent),
139 myMouseHotspotX(app.getDefaultCursor()->getHotX()),
140 myMouseHotspotY(app.getDefaultCursor()->getHotY()),
141 myWindowCursorPositionX(getWidth() / 2),
142 myWindowCursorPositionY(getHeight() / 2) {
145 flags |= FLAG_ENABLED;
148 myVisualizationSettings->
gaming = myApp->isGaming();
168 additional.first->removeActiveAddVisualisation(
this, ~0);
221 double xNet = bound.
xmin() + bound.
getWidth() * x / getWidth();
223 double yNet = bound.
ymin() + bound.
getHeight() * (getHeight() - y) / getHeight();
296 if (getWidth() == 0 || getHeight() == 0) {
310 glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
311 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
316 glDisable(GL_DITHER);
319 glDisable(GL_LINE_SMOOTH);
396std::vector<GUIGlObject*>
402std::vector<GUIGlObject*>
412 positionBoundary.
add(pos);
413 positionBoundary.
grow(sensitivity);
417 double maxLayer = -std::numeric_limits<double>::max();
418 double minDist = std::numeric_limits<double>::max();
420 for (
const auto& i : ids) {
435 if (layer > maxLayer) {
439 }
else if (layer == maxLayer && dist < minDist) {
453 std::vector<GUIGlID> result;
457 selection.
grow(radius);
461 for (
const auto& i : ids) {
485std::vector<GUIGlObject*>
488 std::vector<GUIGlObject*> result;
492 selection.
grow(radius);
496 for (
const auto& i : ids) {
517 const int NB_HITS_MAX = 1024 * 1024;
519 static GUIGlID hits[NB_HITS_MAX];
520 static GLint nb_hits = 0;
521 glSelectBuffer(NB_HITS_MAX, hits);
534 nb_hits = glRenderMode(GL_RENDER);
538 std::vector<GUIGlID> result;
541 for (
int i = 0; i < nb_hits; ++i) {
544 for (
int j = 0; j < (int)numNames; j++) {
545 result.push_back(*ptr);
555std::vector<GUIGlObject*>
558 size_t internalLanes = 0;
559 for (
const auto&
object : objects) {
560 if ((object->getType() ==
GLO_LANE) && (
object->getMicrosimID().find(
':') != std::string::npos)) {
569 std::vector<GUIGlObject*> filteredObjects;
570 for (
const auto&
object : objects) {
571 if ((object->getType() ==
GLO_LANE) && (
object->getMicrosimID().find(
':') != std::string::npos)) {
574 filteredObjects.push_back(
object);
576 return filteredObjects;
584 if (
object !=
nullptr) {
601 glEnable(GL_DEPTH_TEST);
616 glTranslated(0, 0, .55);
617 glColor3d(0.5, 0.5, 0.5);
621 glVertex2d(xmin, yp);
622 glVertex2d(xmax, yp);
627 glVertex2d(xp, ymin);
628 glVertex2d(xp, ymax);
632 glTranslated(0, 0, -.55);
641 const std::string text(
"10000000000");
643 int pixelSize = (int)
m2p((
double) length);
644 while (pixelSize <= 20) {
647 if (noDigits > (
int)text.length()) {
650 pixelSize = (int)
m2p((
double) length);
654 glMatrixMode(GL_PROJECTION);
657 glMatrixMode(GL_MODELVIEW);
663 glDisable(GL_TEXTURE_2D);
664 glDisable(GL_ALPHA_TEST);
666 glEnable(GL_DEPTH_TEST);
668 glTranslated(0, 0, z);
670 double len = (double) pixelSize / (
double)(getWidth() - 1) * (
double) 2.0;
672 double o = double(15) / double(getHeight());
674 double oo = double(5) / double(getHeight());
677 glVertex2d(-.98, -1. + o);
678 glVertex2d(-.98 + len, -1. + o);
680 glVertex2d(-.98, -1. + o);
681 glVertex2d(-.98, -1. + o2);
683 glVertex2d(-.98 + len, -1. + o);
684 glVertex2d(-.98 + len, -1. + o2);
688 const double fontHeight = 0.1 * 300. / getHeight();
689 const double fontWidth = 0.1 * 300. / getWidth();
697 glMatrixMode(GL_PROJECTION);
699 glMatrixMode(GL_MODELVIEW);
708 std::string key =
"";
733 glMatrixMode(GL_PROJECTION);
736 glMatrixMode(GL_MODELVIEW);
741 glEnable(GL_DEPTH_TEST);
744 glTranslated(0, 0, z);
746 const bool fixed = scheme.
isFixed();
747 const int numColors = (int)scheme.
getColors().size();
752 double textX = left - 0.01;
755 const double top = -0.7;
756 const double bot = 0.9;
757 const double dy = (top - bot) / numColors;
758 const double bot2 = fixed ? bot : bot + dy / 2;
764 textX = right + 0.01;
771 glVertex2d(right, top);
772 glVertex2d(right, bot2);
773 glVertex2d(left, bot2);
774 glVertex2d(left, top);
775 glVertex2d(right, top);
776 glVertex2d(left, top);
777 glVertex2d(right, bot2);
778 glVertex2d(left, bot2);
781 const double fontHeight = 0.20 * 300. / getHeight();
782 const double fontWidth = 0.20 * 300. / getWidth();
784 const int fadeSteps = fixed ? 1 : 10;
785 double colorStep = dy / fadeSteps;
786 for (
int i = 0; i < numColors; i++) {
788 const double topi = top - i * dy;
791 if (i + 1 < numColors) {
799 glVertex2d(left, topi);
800 glVertex2d(right, topi);
801 glVertex2d(right, topi - 5 * colorStep);
802 glVertex2d(left, topi - 5 * colorStep);
806 glVertex2d(right, topi - 10 * colorStep);
807 glVertex2d(left, topi - 10 * colorStep);
810 glVertex2d(right, topi - 5 * colorStep);
811 glVertex2d(left, topi - 5 * colorStep);
815 for (
double j = 0.0; j < fadeSteps; j++) {
818 glVertex2d(left, topi - j * colorStep);
819 glVertex2d(right, topi - j * colorStep);
820 glVertex2d(right, topi - (j + 1) * colorStep);
821 glVertex2d(left, topi - (j + 1) * colorStep);
828 glVertex2d(left, topi);
829 glVertex2d(right, topi);
830 glVertex2d(right, bot2);
831 glVertex2d(left, bot2);
836 std::string name = scheme.
getNames()[i];
839 const double bgShift = 0.0;
840 const double textShift = 0.01;
841 const double textXShift = -0.005;
844 glTranslated(0, 0, 0.1);
846 glVertex2d(textX, topi + fontHeight * bgShift);
847 glVertex2d(textX - textDir * fontWidth * (
double)text.size() / 2.1, topi + fontHeight * bgShift);
848 glVertex2d(textX - textDir * fontWidth * (
double)text.size() / 2.1, topi + fontHeight * (0.8 + bgShift));
849 glVertex2d(textX, topi + fontHeight * (0.8 + bgShift));
851 glTranslated(0, 0, -0.1);
855 std::string name = scheme.
getName();
857 name =
"edgeData (" + key +
")";
859 name =
"edgeParam (" + key +
")";
861 name =
"laneParam (" + key +
")";
863 name =
"param (" + key +
")";
865 name =
"attribute (" + key +
")";
867 name = name.substr(3);
869 const double topN = -0.8;
870 const double bgShift = 0.0;
872 glTranslated(0, 0, 0.1);
874 glVertex2d(textX + textDir * 0.04, topN + fontHeight * bgShift - 0.01);
875 glVertex2d(textX + textDir * 0.04 - textDir * fontWidth * (
double)name.size() / 2.3, topN + fontHeight * bgShift - 0.01);
876 glVertex2d(textX + textDir * 0.04 - textDir * fontWidth * (
double)name.size() / 2.3, topN + fontHeight * (0.8 + bgShift));
877 glVertex2d(textX + textDir * 0.04, topN + fontHeight * (0.8 + bgShift));
879 glTranslated(0, 0, -0.1);
884 glMatrixMode(GL_PROJECTION);
886 glMatrixMode(GL_MODELVIEW);
905 glMatrixMode(GL_PROJECTION);
908 glMatrixMode(GL_MODELVIEW);
911 const double fontHeight = 0.2 * 300. / getHeight();
912 const double fontWidth = 0.2 * 300. / getWidth();
914#ifdef CHECK_ELEMENTCOUNTER
919 glMatrixMode(GL_PROJECTION);
921 glMatrixMode(GL_MODELVIEW);
947 if (o !=
nullptr &&
dynamic_cast<GUIGlObject*
>(o) !=
nullptr) {
950 if (applyZoom && zoomDist < 0) {
1000 FXbool ret = FXGLCanvas::makeCurrent();
1008 glViewport(0, 0, getWidth() - 1, getHeight() - 1);
1082 FXEvent* e = (FXEvent*) ptr;
1084 if ((e->state & CONTROLMASK) != 0) {
1099 if ((e->state & SHIFTMASK) != 0) {
1117 if (e->click_count == 2) {
1118 handle(
this, FXSEL(SEL_DOUBLECLICKED, 0), ptr);
1226 }
else if (!
myPopup->shown()) {
1250std::vector<GUIGlObject*>
1253 std::vector<GUIGlObject*> result;
1256 result.push_back(o);
1268 const bool altKeyPressed = ((ev->state & ALTMASK) != 0);
1272 if (objectsUnderCursor.empty()) {
1277 if (filtered.size() > 1 && (altKeyPressed
1278 || filtered[0]->getClickPriority() == filtered[1]->getClickPriority())) {
1282 myPopup = objectsUnderCursor.front()->getPopUpMenu(*
myApp, *
this);
1293 if (objects.size() > 0) {
1295 if (objects.size() == 1) {
1297 }
else if (filter) {
1299 std::vector<GUIGlObject*> filteredGLObjects;
1301 for (
const auto& glObject : objects) {
1303 if (glObject->getType() == objects.front()->getType()) {
1304 filteredGLObjects.push_back(glObject);
1324 const FXEvent* e = (FXEvent*) ptr;
1327 return myPopup->onKeyPress(o, sel, ptr);
1329 if (e->state & CONTROLMASK) {
1330 if (e->code == FX::KEY_Page_Up) {
1335 }
else if (e->code == FX::KEY_Page_Down) {
1342 FXGLCanvas::onKeyPress(o, sel, ptr);
1352 return myPopup->onKeyRelease(o, sel, ptr);
1354 FXGLCanvas::onKeyRelease(o, sel, ptr);
1363#ifdef DEBUG_SNAPSHOT
1364 std::cout <<
"add snapshot time=" << time <<
" file=" << file <<
"\n";
1367 mySnapshots[time].push_back(std::make_tuple(file, w, h));
1377 std::string errorMessage;
1378 FXString ext = FXPath::extension(destFile.c_str());
1379 const bool useGL2PS = ext ==
"ps" || ext ==
"eps" || ext ==
"pdf" || ext ==
"svg" || ext ==
"tex" || ext ==
"pgf";
1381 const bool useVideo = destFile ==
"" || ext ==
"h264" || ext ==
"hevc" || ext ==
"mp4";
1392 glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
1393 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
1396 glEnable(GL_DITHER);
1398 glDisable(GL_DITHER);
1401 glDisable(GL_LINE_SMOOTH);
1407 GLint format = GL2PS_PS;
1410 }
else if (ext ==
"eps") {
1412 }
else if (ext ==
"pdf") {
1414 }
else if (ext ==
"tex") {
1416 }
else if (ext ==
"svg") {
1418 }
else if (ext ==
"pgf") {
1421 return "Could not save '" + destFile +
"'.\n Unrecognized format '" + std::string(ext.text()) +
"'.";
1423 FILE* fp = fopen(destFile.c_str(),
"wb");
1425 return "Could not save '" + destFile +
"'.\n Could not open file for writing";
1428 GLint buffsize = 0, state = GL2PS_OVERFLOW;
1430 glGetIntegerv(GL_VIEWPORT, viewport);
1431 while (state == GL2PS_OVERFLOW) {
1432 buffsize += 1024 * 1024;
1433 gl2psBeginPage(destFile.c_str(),
"sumo-gui; https://sumo.dlr.de", viewport, format, GL2PS_SIMPLE_SORT,
1434 GL2PS_DRAW_BACKGROUND | GL2PS_USE_CURRENT_VIEWPORT,
1435 GL_RGBA, 0, NULL, 0, 0, 0, buffsize, fp,
"out.eps");
1436 glMatrixMode(GL_MODELVIEW);
1438 glDisable(GL_TEXTURE_2D);
1439 glDisable(GL_ALPHA_TEST);
1440 glDisable(GL_BLEND);
1441 glEnable(GL_DEPTH_TEST);
1450 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
1452 const float minB[2] = { (float)viewPort.
xmin(), (float)viewPort.
ymin() };
1453 const float maxB[2] = { (float)viewPort.
xmax(), (float)viewPort.
ymax() };
1455 glEnable(GL_POLYGON_OFFSET_FILL);
1456 glEnable(GL_POLYGON_OFFSET_LINE);
1460 state = gl2psEndPage();
1466 return "Could not save '" + destFile +
"', gl2ps was not enabled at compile time.";
1474 FXMALLOC(&buf, FXColor, getWidth()*getHeight());
1476 glReadBuffer(GL_BACK);
1478 glReadPixels(0, 0, getWidth(), getHeight(), GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*)buf);
1482 int mwidth = getWidth();
1483 int mheight = getHeight();
1485 FXColor* pbb = buf + mwidth * (mheight - 1);
1496 }
while (paa < pbb);
1502 errorMessage =
"video";
1503 }
catch (std::runtime_error& err) {
1504 errorMessage = err.what();
1509 errorMessage =
"Could not save '" + destFile +
"'.";
1512 errorMessage =
"Could not save '" + destFile +
"'.\n" + e.what();
1516 return errorMessage;
1530#ifdef DEBUG_SNAPSHOT
1531 std::cout <<
"check snapshots time=" << time <<
" registeredTimes=" <<
mySnapshots.size() <<
"\n";
1538 std::vector<std::tuple<std::string, int, int> > files = snapIt->second;
1541 for (
const auto& entry : files) {
1542#ifdef DEBUG_SNAPSHOT
1543 std::cout <<
"make snapshot time=" << time <<
" file=" << file <<
"\n";
1545 const std::string& error =
makeSnapshot(std::get<0>(entry), std::get<1>(entry), std::get<2>(entry));
1546 if (error !=
"" && error !=
"video") {
1554#ifdef DEBUG_SNAPSHOT
1555 std::cout <<
" files=" <<
toString(files) <<
" myApplicationSnapshots=" <<
joinToString(*myApplicationSnapshots,
",") <<
"\n";
1699std::vector<GUISUMOAbstractView::Decal>&
1721 GDALDataset* poDataset = (GDALDataset*)GDALOpen(d.
filename.c_str(), GA_ReadOnly);
1722 if (poDataset == 0) {
1725 const int xSize = poDataset->GetRasterXSize();
1726 const int ySize = poDataset->GetRasterYSize();
1728 if (d.
width <= 0.) {
1729 double adfGeoTransform[6];
1730 if (poDataset->GetGeoTransform(adfGeoTransform) == CE_None) {
1731 Position topLeft(adfGeoTransform[0], adfGeoTransform[3]);
1732 const double horizontalSize = xSize * adfGeoTransform[1];
1733 const double verticalSize = ySize * adfGeoTransform[5];
1734 Position bottomRight(topLeft.
x() + horizontalSize, topLeft.
y() + verticalSize);
1742 d.
width = bottomRight.
x() - topLeft.
x();
1743 d.
height = topLeft.
y() - bottomRight.
y();
1744 d.
centerX = (topLeft.
x() + bottomRight.
x()) / 2;
1745 d.
centerY = (topLeft.
y() + bottomRight.
y()) / 2;
1749 if (d.
width <= 0.) {
1756 const int picSize = xSize * ySize;
1758 if (!FXMALLOC(&result, FXColor, picSize)) {
1762 for (
int j = 0; j < picSize; j++) {
1763 result[j] = FXRGB(0, 0, 0);
1766 for (
int i = 1; i <= poDataset->GetRasterCount(); i++) {
1767 GDALRasterBand* poBand = poDataset->GetRasterBand(i);
1769 if (poBand->GetColorInterpretation() == GCI_RedBand) {
1771 }
else if (poBand->GetColorInterpretation() == GCI_GreenBand) {
1773 }
else if (poBand->GetColorInterpretation() == GCI_BlueBand) {
1775 }
else if (poBand->GetColorInterpretation() == GCI_AlphaBand) {
1781 assert(xSize == poBand->GetXSize() && ySize == poBand->GetYSize());
1782 if (poBand->RasterIO(GF_Read, 0, 0, xSize, ySize, ((
unsigned char*)result) + shift, xSize, ySize, GDT_Byte, 4, 4 * xSize) == CE_Failure) {
1787 GDALClose(poDataset);
1789 return new FXImage(getApp(), result, IMAGE_OWNED | IMAGE_KEEP | IMAGE_SHMI | IMAGE_SHMP, xSize, ySize);
1802 if (decal.skip2D || decal.filename.empty()) {
1805 if (!decal.initialised) {
1808 if (img ==
nullptr) {
1813 decal.initialised =
true;
1816 WRITE_ERROR(
"Could not load '" + decal.filename +
"'.\n" + e.what());
1817 decal.skip2D =
true;
1821 if (decal.screenRelative) {
1823 glTranslated(center.
x(), center.
y(), decal.layer);
1825 glTranslated(decal.centerX, decal.centerY, decal.layer);
1827 glRotated(decal.rot, 0, 0, 1);
1829 double halfWidth = decal.width / 2.;
1830 double halfHeight = decal.height / 2.;
1831 if (decal.screenRelative) {
1832 halfWidth =
p2m(halfWidth);
1833 halfHeight =
p2m(halfHeight);
1847 myApp->getCursorPosition(x, y, b);
1848 int appX =
myApp->getX();
1849 int popX = x + appX;
1850 int popY = y +
myApp->getY();
1856 const int rootWidth = getApp()->getRootWindow()->getWidth();
1857 const int rootHeight = getApp()->getRootWindow()->getHeight();
1858 if (popX <= rootWidth) {
1859 const int maxX = (appX < 0) ? 0 : rootWidth;
1860 popX =
MIN2(popX, maxX -
myPopup->getWidth() - 10);
1862 popY =
MIN2(popY, rootHeight -
myPopup->getHeight() - 50);
1912 glMatrixMode(GL_PROJECTION);
1917 glOrtho(0, getWidth(), 0, getHeight(), -
GLO_MAX - 1,
GLO_MAX + 1);
1918 glMatrixMode(GL_MODELVIEW);
1920 double scaleX = (double)getWidth() / bound.
getWidth();
1921 double scaleY = (double)getHeight() / bound.
getHeight();
1922 glScaled(scaleX, scaleY, 1);
1923 glTranslated(-bound.
xmin(), -bound.
ymin(), 0);
1964 if (rs.
hideMin && rs.
hideMax && minValue == std::numeric_limits<double>::infinity()) {
1976 if (minValue != std::numeric_limits<double>::infinity()) {
1984 || hasMissingData) {
1988 const double rawRange = maxValue - minValue;
1993 const double rawRange = maxValue - minValue;
1997 const double range = maxValue - minValue;
1999 const int steps = (int)rs.
colors.size() - 1;
2001 const int steps1 = steps / 2;
2002 const int steps2 = steps - steps1;
2005 for (
int i = 1; i < steps1; i++) {
2009 for (
int i = 1; i < steps2; i++) {
2013 for (
int i = 1; i < steps; i++) {
2023 myGLObject(object) {
2025 second.first =
object->getType();
2026 second.second =
object->getMicrosimID();
2031 myGLObject(object) {
2032 first =
object->getType();
2033 second.first =
object->getType();
2034 second.second =
object->getMicrosimID();
@ MID_GLCANVAS
GLCanvas - ID.
@ MID_REACHABILITY
show reachability from a given lane
@ MID_CLOSE_LANE
close lane
@ MID_CURSORDIALOG_FRONT
remove/select/mark front element
@ MID_CLOSE_EDGE
close edge
@ MID_SIMPLE_VIEW_COLORCHANGE
Informs the dialog about a value's change.
@ MID_ADD_REROUTER
add rerouter
GUICompleteSchemeStorage gSchemeStorage
@ MOVEVIEW
move view cursor
@ GLO_NETWORK
The network - empty.
GUISelectedStorage gSelected
A global holder of selected objects.
FXDEFMAP(GUISUMOAbstractView) GUISUMOAbstractViewMap[]
#define WRITE_WARNINGF(...)
#define WRITE_WARNING(msg)
const double SUMO_const_laneWidth
std::string joinToString(const std::vector< T > &v, const T_BETWEEN &between, std::streamsize accuracy=gPrecision)
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
#define TLC(context, string)
A class that stores a 2D geometrical boundary.
Position getCenter() const
Returns the center of the boundary.
void add(double x, double y, double z=0)
Makes the boundary include the given coordinate.
double ymin() const
Returns minimum y-coordinate.
double xmin() const
Returns minimum x-coordinate.
Boundary & grow(double by)
extends the boundary by the given amount
double getHeight() const
Returns the height of the boundary (y-axis)
double getWidth() const
Returns the width of the boudary (x-axis)
double ymax() const
Returns maximum y-coordinate.
double xmax() const
Returns maximum x-coordinate.
static void resetVertexCounter()
reset vertex counter
static void setColor(const RGBColor &c)
Sets the gl-color to this value.
static void pushName(unsigned int name)
push Name
static void checkCounterMatrix()
check counter matrix (for debug purposes)
static void popMatrix()
pop matrix
static int getMatrixCounter()
get matrix counter
static void checkCounterName()
check counter name (for debug purposes)
static void popName()
pop Name
static void pushMatrix()
push matrix
static void setGL2PS(bool active=true)
set GL2PS
static int getVertexCounter()
get vertex counter
static void drawText(const std::string &text, const Position &pos, const double layer, const double size, const RGBColor &col=RGBColor::BLACK, const double angle=0, const int align=0, double width=-1)
static void resetMatrixCounter()
reset matrix counter
GUIVisualizationSettings & getDefault()
Returns the default scheme.
void saveViewport(const double x, const double y, const double z, const double rot)
Makes the given viewport the default.
const std::vector< GUISUMOAbstractView::Decal > & getDecals()
Returns the default decals.
void setDefault(const std::string &name)
Makes the scheme with the given name the default.
void saveDecals(const std::vector< GUISUMOAbstractView::Decal > &decals)
Makes the given decals the default.
void setViewport(GUISUMOAbstractView *view)
Sets the default viewport.
Dialog for edit rerouter intervals.
static FXCursor * getCursor(GUICursor which)
returns a cursor previously defined in the enum GUICursor
A dialog to change the viewport.
void setOldValues(const Position &lookFrom, const Position &lookAt, double rotation)
Resets old values.
bool haveGrabbed() const
Returns the information whether one of the spin dialers is grabbed.
void setValues(double zoom, double xoff, double yoff, double rotation)
Sets the given values into the dialog.
void show()
overload show function to focus always in OK Button
The dialog to change the view (gui) settings.
void show()
show view settings dialog
void setCurrent(GUIVisualizationSettings *settings)
Sets current settings (called if reopened)
MFXComboBoxIcon * getColoringSchemesCombo()
return combobox with the current coloring schemes (standard, fastest standard, real world....
GUIMainWindow * getGUIMainWindowParent()
Returns the GUIMainWindow parent.
static const double INVALID_PRIORITY
static const GUIGlID INVALID_ID
virtual double getClickPriority() const
Returns the priority of receiving mouse clicks.
virtual Boundary getCenteringBoundary() const =0
GUIGlObjectType getType() const
Returns the type of the object as coded in GUIGlObjectType.
virtual Position getCenter() const
GUIGlID getGlID() const
Returns the numerical id of the object.
virtual GUIGLObjectPopupMenu * getPopUpMenu(GUIMainWindow &app, GUISUMOAbstractView &parent)=0
Returns an own popup-menu.
void unblockObject(GUIGlID id)
Marks an object as unblocked.
GUIGlObject * getNetObject() const
Returns the network object.
GUIGlObject * getObjectBlocking(GUIGlID id) const
Returns the object from the container locking it.
static GUIGlObjectStorage gIDStorage
A single static instance of this class.
Representation of a lane in the micro simulation (gui-version)
MFXStaticToolTip * getStaticTooltipView() const
get static toolTip for view
virtual double getDelay() const
Returns the delay (should be overwritten by subclasses if applicable)
FXLabel * getGeoLabel()
get geo label
bool isGaming() const
return whether the gui is in gaming mode
virtual void setBreakpoints(const std::vector< SUMOTime > &)
Sets the breakpoints of the parent application.
FXLabel * getTestLabel()
get test label
virtual void setStatusBarText(const std::string &)
get status bar text (can be implemented in children)
virtual void setDelay(double)
Sets the delay of the parent application.
FXLabel * getCartesianLabel()
get cartesian label
FXHorizontalFrame * getTestFrame()
get test frame
virtual void setViewportFrom(double xPos, double yPos, double zPos)=0
Alternative method for setting the viewport.
virtual long onKeyPress(void *data)
called when user press a key
virtual void setRotation(double rotation)=0
Sets the rotation.
virtual void onRightBtnPress(void *data)
called when user press right button
virtual void centerTo(const Position &pos, double radius, bool applyZoom=true)=0
Centers the view to the given position, setting it to a size that covers the radius....
virtual double getRotation() const =0
Returns the rotation of the canvas stored in this changer.
virtual bool onLeftBtnRelease(void *data)
called when user releases left button
virtual double getZoom() const =0
Returns the zoom factor computed stored in this changer.
virtual void onLeftBtnPress(void *data)
mouse functions
virtual bool onMiddleBtnRelease(void *data)
called when user releases middle button
virtual double getXPos() const =0
Returns the x-offset of the field to show stored in this changer.
virtual double getYPos() const =0
Returns the y-offset of the field to show stored in this changer.
virtual void onMiddleBtnPress(void *data)
called when user press middle button
virtual long onKeyRelease(void *data)
called when user releases a key
virtual void onMouseMove(void *data)
called when user moves mouse
virtual double getZPos() const =0
Returns the camera height corresponding to the current zoom factor.
virtual void onMouseWheel(void *data)
called when user changes mouse wheel
virtual bool onRightBtnRelease(void *data)
called when user releases right button
Boundary getViewport(bool fixRatio=true)
get viewport
virtual void setViewport(double zoom, double xPos, double yPos)=0
Sets the viewport Used for: Adapting a new viewport.
const std::vector< double > & getThresholds() const
const std::vector< std::string > & getNames() const
const std::string & getName() const
const std::vector< T > & getColors() const
int addColor(const T &color, const double threshold, const std::string &name="")
MFXComboBoxIcon * getColoringSchemesCombo()
get coloring schemes combo
bool myAmInitialised
Internal information whether doInit() was called.
Position snapToActiveGrid(const Position &pos, bool snapXY=true) const
Returns a position that is mapped to the closest grid point if the grid is active.
std::vector< GUIGlObject * > myCurrentObjectsDialog
vector with current objects dialog
std::string makeSnapshot(const std::string &destFile, const int w=-1, const int h=-1)
Takes a snapshots and writes it into the given file.
void updateToolTip()
A method that updates the tooltip.
void addDecals(const std::vector< Decal > &decals)
add decals
virtual void checkSnapshots()
Checks whether it is time for a snapshot.
void showViewschemeEditor()
show viewsscheme editor
static const double SENSITIVITY
virtual long onLeftBtnRelease(FXObject *, FXSelector, void *)
void displayLegend()
Draws a line with ticks, and the length information.
virtual long onVisualizationChange(FXObject *, FXSelector, void *)
hook to react on change in visualization settings
std::vector< GUIGlObject * > getGUIGlObjectsUnderCursor()
returns the GUIGlObject under the cursor using GL_SELECT (including overlapped objects)
long myFrameDrawTime
counter for measuring rendering time
void replacePopup(GUIGLObjectPopupMenu *popUp)
replace PopUp
std::vector< GUIGlID > getObjectsAtPosition(Position pos, double radius)
returns the ids of the object at position within the given (rectangular) radius using GL_SELECT
const SUMORTree * myGrid
The visualization speed-up.
void openObjectDialog(const std::vector< GUIGlObject * > &objects, const bool filter=true)
open object dialog for the given object
virtual void saveFrame(const std::string &destFile, FXColor *buf)
Adds a frame to a video snapshot which will be initialized if necessary.
virtual void recenterView()
recenters the view
virtual SUMOTime getCurrentTimeStep() const
get the current simulation time
void paintGLGrid() const
paints a grid
FXbool makeCurrent()
A reimplementation due to some internal reasons.
int myMouseHotspotX
Offset to the mouse-hotspot from the mouse position.
GUIMainWindow * getMainWindow() const
get main window
bool isInEditMode()
returns true, if the edit button was pressed
void buildMinMaxRainbow(const GUIVisualizationSettings &s, GUIColorScheme &scheme, const GUIVisualizationRainbowSettings &rs, double minValue, double maxValue, bool hasMissingData)
helper function for buildColorRainbow
virtual long onMiddleBtnRelease(FXObject *, FXSelector, void *)
virtual long onMouseMove(FXObject *, FXSelector, void *)
bool myPanning
Panning flag.
bool isAdditionalGLVisualisationEnabled(GUIGlObject *const which) const
Check if an object is added in the additional GL visualitation.
FXMutex myDecalsLockMutex
The mutex to use before accessing the decals list in order to avoid thread conflicts.
FXCondition mySnapshotCondition
the semaphore when waiting for snapshots to finish
virtual GUIGlID getToolTipID()
returns the id of object under cursor to show their tooltip
Position myPopupPosition
The current popup-menu position.
virtual void doInit()
doInit
FXint myWindowCursorPositionY
std::vector< GUIGlObject * > filterContextObjects(const std::vector< GUIGlObject * > &objects)
filter out duplicate and forbidden objects
GUIGlID getObjectUnderCursor(double sensitivity=SENSITIVITY)
returns the id of the front object under the cursor using GL_SELECT
virtual long onCmdCloseEdge(FXObject *, FXSelector, void *)
virtual int doPaintGL(int, const Boundary &)
paint GL
virtual void showViewportEditor()
show viewport editor
const GUIVisualizationSettings & getVisualisationSettings() const
get visualization settings (read only)
void setDelay(double delay)
Sets the delay of the parent application.
Boundary getVisibleBoundary() const
get visible boundary
Position screenPos2NetPos(int x, int y) const
Translate screen position to network position.
void addSnapshot(SUMOTime time, const std::string &file, const int w=-1, const int h=-1)
Sets the snapshot time to file map.
GUIPerspectiveChanger & getChanger() const
get changer
virtual void centerTo(GUIGlID id, bool applyZoom, double zoomDist=20)
centers to the chosen artifact
GUIMainWindow * myApp
The application.
GUIDialog_EditViewport * getViewportEditor()
get the viewport and create it on first access
virtual void zoom2Pos(Position &camera, Position &lookAt, double zoom)
zoom interface for 3D view
GUIGlID getObjectAtPosition(Position pos, double sensitivity=SENSITIVITY)
returns the id of the object at position using GL_SELECT
std::vector< GUIGlID > getObjectsInBoundary(Boundary bound)
returns the ids of all objects in the given boundary
virtual long onCmdCloseLane(FXObject *, FXSelector, void *)
interaction with the simulation
void drawFPS()
Draws frames-per-second indicator.
virtual long onMouseWheel(FXObject *, FXSelector, void *)
double getGridWidth() const
get grid width
std::vector< Decal > & getDecals()
The list of decals to show.
bool removeAdditionalGLVisualisation(GUIGlObject *const which)
Removes an object from the list of objects that show additional things.
GUIGlChildWindow * myGlChildWindowParent
The parent window.
GUIGlChildWindow * getGUIGlChildWindow()
get GUIGlChildWindow
double getDelay() const
Returns the delay of the parent application.
virtual void updatePositionInformationLabel() const
update position information labels
std::vector< GUIGlObject * > getGUIGlObjectsAtPosition(Position pos, double radius)
returns the GUIGlObjects at position within the given (rectangular) radius using GL_SELECT
virtual long onLeftBtnPress(FXObject *, FXSelector, void *)
virtual void setViewportFromToRot(const Position &lookFrom, const Position &lookAt, double rotation)
applies the given viewport settings
double p2m(double pixel) const
pixels-to-meters conversion method
std::vector< Decal > myDecals
The list of decals to show.
const Position & getPopupPosition() const
get position of current popup
double m2p(double meter) const
meter-to-pixels conversion method
virtual GUILane * getLaneUnderCursor()
returns the GUILane at cursor position (implementation depends on view)
virtual void openObjectDialogAtCursor(const FXEvent *ev)
open object dialog at the cursor position
virtual void onGamingClick(Position)
on gaming click
bool myInEditMode
Information whether too-tip informations shall be generated.
GUIVisualizationSettings * editVisualisationSettings() const
edit visualization settings (allow modify VisualizationSetings, use carefully)
GUIVisualizationSettings * myVisualizationSettings
visualization settings
void destroyPopup()
destroys the popup
Position getWindowCursorPosition() const
return windows cursor position
virtual long onKeyPress(FXObject *o, FXSelector sel, void *data)
keyboard functions
GUIDialog_EditViewport * myGUIDialogEditViewport
viewport chooser
void displayColorLegend(const GUIColorScheme &scheme, bool leftSide, const std::string &key)
Draws a legend for the given scheme.
virtual long onMiddleBtnPress(FXObject *, FXSelector, void *)
void paintGL()
FOX needs this.
virtual void stopTrack()
stop track
virtual Position getPositionInformation() const
Returns the cursor's x/y position within the network.
std::vector< GUIGlObject * > getGUIGlObjectsUnderSnappedCursor()
returns the GUIGlObject under the gripped cursor using GL_SELECT (including overlapped objects)
bool showToolTipFor(const GUIGlID idToolTip)
invokes the tooltip for the given object
virtual long onKeyRelease(FXObject *o, FXSelector sel, void *data)
GUIDialog_ViewSettings * myGUIDialogViewSettings
Visualization changer.
virtual void onGamingRightClick(Position)
void setWindowCursorPosition(FXint x, FXint y)
Returns the gl-id of the object under the given coordinates.
double getFPS() const
retrieve FPS
virtual long onCmdShowReachability(FXObject *, FXSelector, void *)
highlight edges according to reachability
std::map< GUIGlObject *, int > myAdditionallyDrawn
List of objects for which GUIGlObject::drawGLAdditional is called.
void drawDecals()
Draws the stored decals.
std::vector< GUIGlID > getObjectsUnderCursor()
returns the id of the objects under the cursor using GL_SELECT (including overlapped objects)
Boundary applyGLTransform(bool fixRatio=true)
applies gl-transformations to fit the Boundary given by myChanger onto the canvas....
virtual void updateViewportValues()
update the viewport chooser with the current view values
FXImage * checkGDALImage(Decal &d)
check whether we can read image data or position with gdal
double getGridHeight() const
get grid height
virtual void startTrack(int)
star track
virtual long onDoubleClicked(FXObject *, FXSelector, void *)
FXMutex & getDecalsLockMutex()
The mutex to use before accessing the decals list in order to avoid thread conflicts.
virtual bool is3DView() const
return whether this is a 3D view
void displayLegends()
Draws the configured legends.
FXMutex mySnapshotsMutex
The mutex to use before accessing the decals list in order to avoid thread conflicts.
virtual long onMouseLeft(FXObject *, FXSelector, void *)
virtual long onRightBtnRelease(FXObject *, FXSelector, void *)
FXint myWindowCursorPositionX
Position of the cursor relative to the window.
GUIPerspectiveChanger * myChanger
The perspective changer.
GUIGLObjectPopupMenu * myPopup
The current popup-menu.
virtual void copyViewportTo(GUISUMOAbstractView *view)
copy the viewport to the given view
void setBreakpoints(const std::vector< SUMOTime > &breakpoints)
Sets the breakpoints of the parent application.
void waitForSnapshots(const SUMOTime snapshotTime)
bool addAdditionalGLVisualisation(GUIGlObject *const which)
Adds an object to call its additional visualisation method.
virtual bool setColorScheme(const std::string &)
set color scheme
GUIGLObjectPopupMenu * getPopup() const
ge the current popup-menu
virtual long onCmdAddRerouter(FXObject *, FXSelector, void *)
std::vector< GUIGlObject * > filterInternalLanes(const std::vector< GUIGlObject * > &objects) const
filter internal lanes in Objects under cursor
virtual long onPaint(FXObject *, FXSelector, void *)
virtual long onRightBtnPress(FXObject *, FXSelector, void *)
virtual ~GUISUMOAbstractView()
destructor
virtual long onConfigure(FXObject *, FXSelector, void *)
mouse functions
std::map< SUMOTime, std::vector< std::tuple< std::string, int, int > > > mySnapshots
Snapshots.
void remove(GUIDialog_EditViewport *)
remove viewport
virtual GUIGlID getTrackedID() const
get tracked id
void openPopupDialog()
open popup dialog
void toggleSelection(GUIGlID id)
Toggles selection of an object.
static void drawTexturedBox(int which, double size)
Draws a named texture as a box with the given size.
static GUIGlID add(FXImage *i)
Adds a texture to use.
static int getMaxTextureSize()
return maximum number of pixels in x and y direction
Stores the information about how to visualize structures.
RGBColor backgroundColor
The background color to use.
static const std::string SCHEME_NAME_DATA_ATTRIBUTE_NUMERICAL
static const double MISSING_DATA
static const std::string SCHEME_NAME_EDGEDATA_NUMERICAL
bool dither
Information whether dithering shall be enabled.
GUIColorer vehicleColorer
The vehicle colorer.
bool drawForRectangleSelection
whether drawing is performed for the purpose of selecting objects using a rectangle
GUIVisualizationSizeSettings addSize
std::string name
The name of this setting.
bool drawJunctionShape
whether the shape of the junction should be drawn
std::string edgeData
key for coloring by edgeData
bool gaming
whether the application is in gaming mode or not
static const std::string SCHEME_NAME_LANE_PARAM_NUMERICAL
bool fps
Information whether frames-per-second should be drawn.
std::string vehicleParam
key for coloring by vehicle parameter
bool showGrid
Information whether a grid shall be shown.
bool showVehicleColorLegend
Information whether the vehicle color legend shall be drawn.
double scale
information about a lane's width (temporary, used for a single view)
GUIColorScheme & getLaneEdgeScheme()
Returns the current lane (edge) coloring schme.
static RGBColor COL_MISSING_DATA
bool showSizeLegend
Information whether the size legend shall be drawn.
double gridXSize
Information about the grid spacings.
bool showColorLegend
Information whether the edge color legend shall be drawn.
static const std::string SCHEME_NAME_EDGE_PARAM_NUMERICAL
scheme names
static const std::string SCHEME_NAME_PARAM_NUMERICAL
std::string edgeParam
key for coloring by edge parameter
double angle
The current view rotation angle.
const Position getOffset() const
Returns the network offset.
static const GeoConvHelper & getFinal()
the coordinate transformation for writing the location element and for tracking the original coordina...
void cartesian2geo(Position &cartesian) const
Converts the given cartesian (shifted) position to its geo (lat/long) representation.
static FXImage * loadImage(FXApp *a, const std::string &file)
static FXbool scalePower2(FXImage *image, int maxSize=(2<< 29))
static FXbool saveImage(const std::string &file, int width, int height, FXColor *data)
static void sleep(long ms)
static OptionsCont & getOptions()
Retrieves the options.
A point in 2D or 3D with translation and scaling methods.
void setx(double x)
set position x
void set(double x, double y)
set positions x and y
static const Position INVALID
used to indicate that a position is valid
double distanceTo2D(const Position &p2) const
returns the euclidean distance in the x-y-plane
double x() const
Returns the x-position.
void setz(double z)
set position z
Position rotateAround2D(double rad, const Position &origin)
rotate this position by rad around origin and return the result
double z() const
Returns the z-position.
void sety(double y)
set position y
double y() const
Returns the y-position.
static RGBColor interpolate(const RGBColor &minColor, const RGBColor &maxColor, double weight)
Interpolates between two colors.
static const RGBColor WHITE
unsigned char red() const
Returns the red-amount of the color.
unsigned char alpha() const
Returns the alpha-amount of the color.
unsigned char green() const
Returns the green-amount of the color.
unsigned char blue() const
Returns the blue-amount of the color.
static const RGBColor BLACK
static const RGBColor RED
named colors
A RT-tree for efficient storing of SUMO's GL-objects.
virtual int Search(const float a_min[2], const float a_max[2], const GUIVisualizationSettings &c) const
Find all within search rectangle.
static bool startsWith(const std::string &str, const std::string prefix)
Checks whether a given string starts with the prefix.
static long getCurrentMillis()
Returns the current time in milliseconds.
#define UNUSED_PARAMETER(x)
NLOHMANN_BASIC_JSON_TPL_DECLARATION void swap(nlohmann::NLOHMANN_BASIC_JSON_TPL &j1, nlohmann::NLOHMANN_BASIC_JSON_TPL &j2) noexcept(//NOLINT(readability-inconsistent-declaration-parameter-name) is_nothrow_move_constructible< nlohmann::NLOHMANN_BASIC_JSON_TPL >::value &&//NOLINT(misc-redundant-expression) is_nothrow_move_assignable< nlohmann::NLOHMANN_BASIC_JSON_TPL >::value)
exchanges the values of two JSON objects
comparator for resolving clicks
A decal (an image) that can be shown.
double centerX
The center of the image in x-direction (net coordinates, in m)
double height
The height of the image (net coordinates in y-direction, in m)
double width
The width of the image (net coordinates in x-direction, in m)
double centerY
The center of the image in y-direction (net coordinates, in m)
std::string filename
The path to the file the image is located at.
GUIGlObject * getGLObject() const
get GLObject
LayerObject(double layer, GUIGlObject *object)
constructor for shapes
bool hideMax
whether data above threshold should not be colored
bool setNeutral
whether the scale should be centered at a specific value
bool fixRange
whether the color scale should be fixed to the given min/max values
double minThreshold
threshold below which value should not be colored
std::vector< RGBColor > colors
color steps for the rainbow;
bool hideMin
whether data below threshold should not be colored
double neutralThreshold
neutral point of scale
double maxThreshold
threshold above which value should not be colored
double getExaggeration(const GUIVisualizationSettings &s, const GUIGlObject *o, double factor=20) const
return the drawing size including exaggeration and constantSize values