72 #include <gdal_priv.h>
75 #ifdef CHECK_MEMORY_LEAKS
77 #endif // CHECK_MEMORY_LEAKS
116 LAYOUT_SIDE_TOP | LAYOUT_FILL_X | LAYOUT_FILL_Y, 0, 0, 0, 0),
121 myMouseHotspotX(app.getDefaultCursor()->getHotX()),
122 myMouseHotspotY(app.getDefaultCursor()->getHotY()),
124 myUseToolTips(false),
125 myAmInitialised(false),
126 myViewportChooser(0),
127 myVisualizationChanger(0) {
130 flags |= FLAG_ENABLED;
131 myInEditMode =
false;
135 myVisualizationSettings->
gaming = myApp->isGaming();
148 for (std::vector<GUISUMOAbstractView::Decal>::iterator it =
myDecals.begin(); it !=
myDecals.end(); ++it) {
201 if (getWidth() == 0 || getHeight() == 0) {
220 glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
221 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
226 glDisable(GL_DITHER);
230 glEnable(GL_POLYGON_SMOOTH);
231 glEnable(GL_LINE_SMOOTH);
234 glDisable(GL_POLYGON_SMOOTH);
235 glDisable(GL_LINE_SMOOTH);
263 selection.
grow(SENSITIVITY);
266 unsigned int idMax = 0;
268 for (std::vector<GUIGlID>::const_iterator it = ids.begin(); it != ids.end(); it++) {
285 layer =
dynamic_cast<Shape*
>(o)->getLayer();
288 if (layer > maxLayer) {
303 selection.
grow(radius);
305 std::vector<GUIGlID> result;
307 for (std::vector<GUIGlID>::const_iterator it = ids.begin(); it != ids.end(); it++) {
319 result.push_back(
id);
329 const int NB_HITS_MAX = 1024 * 1024;
331 static GUIGlID hits[NB_HITS_MAX];
332 static GLint nb_hits = 0;
333 glSelectBuffer(NB_HITS_MAX, hits);
343 nb_hits = glRenderMode(GL_RENDER);
347 std::vector<GUIGlID> result;
348 for (
int i = 0; i < nb_hits; ++i) {
349 assert(i * 4 + 3 < NB_HITS_MAX);
350 result.push_back(hits[i * 4 + 3]);
374 glEnable(GL_DEPTH_TEST);
384 glTranslated(0, 0, .55);
385 glColor3d(0.5, 0.5, 0.5);
388 for (; ypos < yend;) {
389 glVertex2d(xmin, ypos);
390 glVertex2d(xend, ypos);
394 for (; xpos < xend;) {
395 glVertex2d(xpos, ymin);
396 glVertex2d(xpos, yend);
400 glTranslated(0, 0, -.55);
408 const std::string text(
"10000000000");
410 size_t pixelSize = (size_t)
m2p((
SUMOReal) length);
411 while (pixelSize <= 20) {
414 if (noDigits > text.length()) {
422 glMatrixMode(GL_PROJECTION);
425 glMatrixMode(GL_MODELVIEW);
430 glDisable(GL_TEXTURE_2D);
431 glDisable(GL_ALPHA_TEST);
433 glEnable(GL_DEPTH_TEST);
437 double o = double(15) / double(getHeight());
439 double oo = double(5) / double(getHeight());
442 glVertex2d(-.98, -1. + o);
443 glVertex2d(-.98 + len, -1. + o);
445 glVertex2d(-.98, -1. + o);
446 glVertex2d(-.98, -1. + o2);
448 glVertex2d(-.98 + len, -1. + o);
449 glVertex2d(-.98 + len, -1. + o2);
456 glRotated(180, 1, 0, 0);
458 glRotated(-180, 1, 0, 0);
461 glRotated(180, 1, 0, 0);
463 glRotated(-180, 1, 0, 0);
466 glMatrixMode(GL_PROJECTION);
468 glMatrixMode(GL_MODELVIEW);
494 if (o != 0 && dynamic_cast<GUIGlObject*>(o) != 0) {
495 if (applyZoom && zoomDist < 0) {
528 FXbool ret = FXGLCanvas::makeCurrent();
536 glViewport(0, 0, getWidth() - 1, getHeight() - 1);
574 FXEvent* e = (FXEvent*) data;
576 if (e->state & CONTROLMASK) {
681 myApp->getCursorPosition(x, y, b);
696 FXEvent* e = (FXEvent*) data;
697 if ((e->state & ALTMASK) != 0) {
698 setDefaultCursor(getApp()->getDefaultCursor(DEF_CROSSHAIR_CURSOR));
719 return FXGLCanvas::onKeyPress(o, sel, data);
725 FXEvent* e = (FXEvent*) data;
726 if ((e->state & ALTMASK) == 0) {
728 setDefaultCursor(getApp()->getDefaultCursor(DEF_ARROW_CURSOR));
730 return FXGLCanvas::onKeyRelease(o, sel, data);
743 std::string errorMessage;
744 FXString ext = FXPath::extension(destFile.c_str());
745 bool useGL2PS = ext ==
"ps" || ext ==
"eps" || ext ==
"pdf" || ext ==
"svg" || ext ==
"tex" || ext ==
"pgf";
756 glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
757 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
762 glDisable(GL_DITHER);
766 glEnable(GL_POLYGON_SMOOTH);
767 glEnable(GL_LINE_SMOOTH);
770 glDisable(GL_POLYGON_SMOOTH);
771 glDisable(GL_LINE_SMOOTH);
780 }
else if (ext ==
"eps") {
782 }
else if (ext ==
"pdf") {
784 }
else if (ext ==
"tex") {
786 }
else if (ext ==
"svg") {
788 }
else if (ext ==
"pgf") {
791 return "Could not save '" + destFile +
"'.\n Unrecognized format '" + std::string(ext.text()) +
"'.";
793 FILE* fp = fopen(destFile.c_str(),
"wb");
795 return "Could not save '" + destFile +
"'.\n Could not open file for writing";
799 glGetIntegerv(GL_VIEWPORT, viewport);
801 buffsize += 1024 * 1024;
804 GL_RGBA, 0, NULL, 0, 0, 0, buffsize, fp,
"out.eps");
805 glMatrixMode(GL_MODELVIEW);
807 glDisable(GL_TEXTURE_2D);
808 glDisable(GL_ALPHA_TEST);
810 glEnable(GL_DEPTH_TEST);
820 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
824 minB[0] = viewPort.
xmin();
825 minB[1] = viewPort.
ymin();
826 maxB[0] = viewPort.
xmax();
827 maxB[1] = viewPort.
ymax();
829 glEnable(GL_POLYGON_OFFSET_FILL);
830 glEnable(GL_POLYGON_OFFSET_LINE);
848 FXMALLOC(&buf, FXColor, getWidth()*getHeight());
850 glReadBuffer(GL_BACK);
852 glReadPixels(0, 0, getWidth(), getHeight(), GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*)buf);
856 size_t mwidth = getWidth();
857 size_t mheight = getHeight();
859 FXColor* pbb = buf + mwidth * (mheight - 1);
873 errorMessage =
"Could not save '" + destFile +
"'.";
876 errorMessage =
"Could not save '" + destFile +
"'.\n" + e.what();
960 GDALDataset* poDataset = (GDALDataset*)GDALOpen(d.
filename.c_str(), GA_ReadOnly);
961 if (poDataset == 0) {
964 const int xSize = poDataset->GetRasterXSize();
965 const int ySize = poDataset->GetRasterYSize();
968 double adfGeoTransform[6];
969 if (poDataset->GetGeoTransform(adfGeoTransform) == CE_None) {
970 Position topLeft(adfGeoTransform[0], adfGeoTransform[3]);
971 const double horizontalSize = xSize * adfGeoTransform[1];
972 const double verticalSize = ySize * adfGeoTransform[5];
973 Position bottomRight(topLeft.
x() + horizontalSize, topLeft.
y() + verticalSize);
975 d.
width = bottomRight.x() - topLeft.
x();
976 d.
height = topLeft.
y() - bottomRight.y();
977 d.
centerX = (topLeft.
x() + bottomRight.x()) / 2;
978 d.
centerY = (topLeft.
y() + bottomRight.y()) / 2;
993 const int picSize = xSize * ySize;
995 if (!FXMALLOC(&result, FXColor, picSize)) {
999 for (
int j = 0; j < picSize; j++) {
1000 result[j] = FXRGB(0, 0, 0);
1003 for (
int i = 1; i <= poDataset->GetRasterCount(); i++) {
1004 GDALRasterBand* poBand = poDataset->GetRasterBand(i);
1006 if (poBand->GetColorInterpretation() == GCI_RedBand) {
1008 }
else if (poBand->GetColorInterpretation() == GCI_GreenBand) {
1010 }
else if (poBand->GetColorInterpretation() == GCI_BlueBand) {
1012 }
else if (poBand->GetColorInterpretation() == GCI_AlphaBand) {
1019 assert(xSize == poBand->GetXSize() && ySize == poBand->GetYSize());
1020 if (poBand->RasterIO(GF_Read, 0, 0, xSize, ySize, ((
unsigned char*)result) + shift, xSize, ySize, GDT_Byte, 4, 4 * xSize) == CE_Failure) {
1025 GDALClose(poDataset);
1027 return new FXImage(getApp(), result, IMAGE_OWNED | IMAGE_KEEP | IMAGE_SHMI | IMAGE_SHMP, xSize, ySize);
1039 for (std::vector<GUISUMOAbstractView::Decal>::iterator l =
myDecals.begin(); l !=
myDecals.end(); ++l) {
1063 glRotated(d.
rot, 0, 0, 1);
1110 glMatrixMode(GL_PROJECTION);
1115 glOrtho(0, getWidth(), 0, getHeight(), -
GLO_MAX - 1,
GLO_MAX + 1);
1116 glMatrixMode(GL_MODELVIEW);
1120 glScaled(scaleX, scaleY, 1);
1121 glTranslated(-bound.
xmin(), -bound.
ymin(), 0);
void paintGLGrid()
paints a grid
A decal (an image) that can be shown.
GL2PSDLL_API GLint gl2psBeginPage(const char *title, const char *producer, GLint viewport[4], GLint format, GLint sort, GLint options, GLint colormode, GLint colorsize, GL2PSrgba *colormap, GLint nr, GLint ng, GLint nb, GLint buffersize, FILE *stream, const char *filename)
virtual long onConfigure(FXObject *, FXSelector, void *)
void setValues(SUMOReal zoom, SUMOReal xoff, SUMOReal yoff)
Sets the given values into the dialog.
void showToolTips(bool val)
int pfDrawString(const char *c)
SUMOReal getHeight() const
Returns the height of the boundary.
GUICompleteSchemeStorage gSchemeStorage
bool showSizeLegend
Information whether the size legend shall be drawn.
void cartesian2geo(Position &cartesian) const
Converts the given cartesian (shifted) position to its geo (lat/long) representation.
FXImage * checkGDALImage(Decal &d)
check whether we can read image data or position with gdal
virtual void setViewport(SUMOReal zoom, SUMOReal xPos, SUMOReal yPos)=0
Sets the viewport Used for: Adapting a new viewport.
FXImage * image
The image pointer for later cleanup.
const SUMOReal SUMO_const_laneWidth
SUMOReal getWidth() const
Returns the width of the boudary.
void showToolTipFor(unsigned int id)
invokes the tooltip for the given object
virtual void setViewport(const Position &lookFrom, const Position &lookAt)
applies the given viewport settings
void setDefault(const std::string &name)
Makes the scheme with the given name the default.
Position getCenter() const
Returns the center of the boundary.
virtual void centerTo(GUIGlID id, bool applyZoom, SUMOReal zoomDist=20)
centers to the chosen artifact
bool myAmInitialised
Internal information whether doInit() was called.
void add(const Position &pos)
Adds the given position to this one.
virtual void recenterView()
recenters the view
FXint myWindowCursorPositionY
SUMORTree * myGrid
The visualization speed-up.
static GUIGlID add(FXImage *i)
Adds a texture to use.
void toggleSelection(GUIGlID id)
Toggles selection of an object.
bool gaming
whether the application is in gaming mode or not
virtual long onMouseMove(FXObject *, FXSelector, void *)
virtual SUMOReal getZoom() const =0
Returns the zoom factor computed stored in this changer.
SUMOReal ymin() const
Returns minimum y-coordinate.
The dialog to change the view (gui) settings.
static GeoConvHelper & getProcessing()
the coordinate transformation to use for input conversion and processing
#define GEO_OUTPUT_ACCURACY
bool x2cartesian(Position &from, bool includeInBoundary=true)
GUIMainWindow * myApp
The application.
#define GL2PS_DRAW_BACKGROUND
SUMOReal xmin() const
Returns minimum x-coordinate.
virtual SUMOTime getCurrentTimeStep() const
get the current simulation time
MFXMutex myDecalsLock
The mutex to use before accessing the decals list in order to avoid thread conficts.
void pfSetPosition(SUMOReal x, SUMOReal y)
SUMOReal p2m(SUMOReal pixel) const
pixels-to-meters conversion method
bool addAdditionalGLVisualisation(GUIGlObject *const which)
Adds an object to call its additional visualisation method.
virtual long onLeftBtnPress(FXObject *, FXSelector, void *)
bool myInEditMode
Information whether too-tip informations shall be generated.
virtual void openObjectDialog()
virtual Boundary getCenteringBoundary() const =0
Returns the boundary to which the view shall be centered in order to show the object.
virtual long onKeyRelease(FXObject *o, FXSelector sel, void *data)
GUIGlObject * getNetObject() const
Returns the network object.
SUMOReal getGridHeight() const
int glID
The gl-id of the texture that holds this image.
void setSnapshots(std::map< SUMOTime, std::string > snaps)
Sets the snapshot time to file map.
static const RGBColor BLACK
SUMOReal width
The width of the image (net coordinates in x-direction, in m)
GUIDialog_ViewSettings * myVisualizationChanger
bool isGaming() const
return whether the gui is in gaming mode
GUIDialog_EditViewport * myViewportChooser
A RT-tree for efficient storing of SUMO's GL-objects.
SUMOReal x() const
Returns the x-position.
bool dither
Information whether dithering shall be enabled.
GUIGlID getGlID() const
Returns the numerical id of the object.
SUMOReal xmax() const
Returns maximum x-coordinate.
A class that stores a 2D geometrical boundary.
int myMouseHotspotX
Offset to the mouse-hotspot from the mouse position.
#define WRITE_WARNING(msg)
SUMOReal scale
information about a lane's width (temporary, used for a single view)
unsigned char blue() const
Returns the blue-amount of the color.
virtual int getTrackedID() const
FXLabel & getCartesianLabel()
std::vector< GUIGlID > getObjectsAtPosition(Position pos, SUMOReal radius)
returns the ids of the object at position within the given (rectangular) radius using GL_SELECT ...
std::vector< Decal > myDecals
The list of decals to show.
GUIGlObjectType getType() const
Returns the type of the object as coded in GUIGlObjectType.
GUIGlID getObjectAtPosition(Position pos)
returns the id of the object at position using GL_SELECT
static FXbool scalePower2(FXImage *image, int maxSize=(2<< 29))
virtual int doPaintGL(int, const Boundary &)
bool removeAdditionalGLVisualisation(GUIGlObject *const which)
Removes an object from the list of objects that show additional things.
virtual long onPaint(FXObject *, FXSelector, void *)
std::string name
The name of this setting.
std::map< GUIGlObject *, int > myAdditionallyDrawn
List of objects for which GUIGlObject::drawGLAdditional is called.
Boundary getVisibleBoundary() const
virtual long onMiddleBtnPress(FXObject *, FXSelector, void *)
static void drawTexturedBox(unsigned int which, SUMOReal size)
Draws a named texture as a box with the given size.
virtual void setStatusBarText(const std::string &)
virtual long onKeyPress(FXObject *o, FXSelector sel, void *data)
virtual SUMOReal getXPos() const =0
Returns the x-offset of the field to show stored in this changer.
virtual long onMiddleBtnRelease(FXObject *, FXSelector, void *)
static void sleep(long ms)
bool isInEditMode()
returns true, if the edit button was pressed
A point in 2D or 3D with translation and scaling methods.
SUMOReal centerY
The center of the image in y-direction (net coordinates, in m)
#define GL2PS_USE_CURRENT_VIEWPORT
virtual GUIGLObjectPopupMenu * getPopUpMenu(GUIMainWindow &app, GUISUMOAbstractView &parent)=0
Returns an own popup-menu.
FXComboBox & getColoringSchemesCombo()
GL2PSDLL_API GLint gl2psEndPage(void)
unsigned char alpha() const
Returns the alpha-amount of the color.
static GUIGlObjectStorage gIDStorage
A single static instance of this class.
SUMOReal z() const
Returns the z-position.
virtual bool onLeftBtnRelease(void *data)
FXComboBox & getColoringSchemesCombo()
bool initialised
Whether this image was initialised (inserted as a texture)
virtual bool onRightBtnRelease(void *data)
virtual long onMouseWheel(FXObject *, FXSelector, void *)
void checkSnapshots()
Checks whether it is time for a snapshot.
virtual ~GUISUMOAbstractView()
destructor
std::string filename
The path to the file the image is located at.
void saveViewport(const SUMOReal x, const SUMOReal y, const SUMOReal zoom)
Makes the given viewport the default.
void pfSetScaleXY(SUMOReal sx, SUMOReal sy)
SUMOReal gridXSize
Information about the grid spacings.
std::map< SUMOTime, std::string > mySnapshots
static FXbool saveImage(const std::string &file, int width, int height, FXColor *data)
std::string toString(const T &t, std::streamsize accuracy=OUTPUT_ACCURACY)
void updatePositionInformation() const
#define GL2PS_SIMPLE_SORT
static void drawTextBox(const std::string &text, const Position &pos, const SUMOReal layer, const SUMOReal size, const RGBColor &txtColor=RGBColor::BLACK, const RGBColor &bgColor=RGBColor::WHITE, const RGBColor &borderColor=RGBColor::BLACK, const SUMOReal angle=0)
draw Text box with given parameters
GUIPerspectiveChanger * myChanger
The perspective changer.
std::string makeSnapshot(const std::string &destFile)
Takes a snapshots and writes it into the given file.
virtual void onLeftBtnPress(void *data)
GUIGLObjectPopupMenu * myPopup
The current popup-menu.
RGBColor backgroundColor
The background color to use.
void destroyPopup()
destoys the popup
bool antialiase
Information whether antialiase shall be enabled.
FXint myWindowCursorPositionX
Position of the cursor relative to the window.
Boundary getViewport(bool fixRatio=true)
void unlock()
release mutex lock
virtual void showViewportEditor()
FXbool makeCurrent()
A reimplementation due to some internal reasons.
SUMOReal height
The height of the image (net coordinates in y-direction, in m)
void applyGLTransform(bool fixRatio=true)
virtual long onLeftBtnRelease(FXObject *, FXSelector, void *)
void add(SUMOReal x, SUMOReal y)
Makes the boundary include the given coordinate.
SUMOReal centerX
The center of the image in x-direction (net coordinates, in m)
GUIVisualizationSettings & getDefault()
Returns the default scheme.
Boundary & grow(SUMOReal by)
extends the boundary by the given amount
void setViewport(GUISUMOAbstractView *view)
Sets the default viewport.
GUIVisualizationSettings * myVisualizationSettings
virtual void onMouseWheel(void *data)
SUMOReal m2p(SUMOReal meter) const
meter-to-pixels conversion method
void paintGL()
performs the painting of the simulation
SUMOReal y() const
Returns the y-position.
void setWindowCursorPosition(FXint x, FXint y)
Returns the information whether rotation is allowd.
void setCurrent(GUIVisualizationSettings *settings)
Sets current settings (called if reopened)
static FXImage * loadImage(FXApp *a, const std::string &file)
SUMOReal getGridWidth() const
static const GeoConvHelper & getFinal()
the coordinate transformation for writing the location element and for tracking the original coordina...
bool showGrid
Information whether a grid shall be shown.
void drawDecals()
Draws the stored decals.
static int getMaxTextureSize()
return maximum number of pixels in x and y direction
SUMOReal layer
The layer of the image.
virtual int Search(const float a_min[2], const float a_max[2], const GUIVisualizationSettings &c) const
Find all within search rectangle.
virtual void centerTo(const Position &pos, SUMOReal radius, bool applyZoom=true)=0
Centers the view to the given position, setting it to a size that covers the radius. Used for: Centering of vehicles and junctions.
bool skip2D
Whether this image should be skipped in 2D-views.
unsigned char green() const
Returns the green-amount of the color.
virtual void onMouseMove(void *data)
void updateToolTip()
A method that updates the tooltip.
A dialog to change the viewport.
SUMOReal ymax() const
Returns maximum y-coordinate.
virtual void onRightBtnPress(void *data)
virtual void onGamingClick(Position)
void unblockObject(GUIGlID id)
Marks an object as unblocked.
virtual SUMOReal getYPos() const =0
Returns the y-offset of the field to show stored in this changer.
void showViewschemeEditor()
virtual long onRightBtnPress(FXObject *, FXSelector, void *)
bool haveGrabbed() const
Returns the information whether one of the spin dialers is grabbed.
virtual long onMouseLeft(FXObject *, FXSelector, void *)
Position getPositionInformation() const
Returns the cursor's x/y position within the network.
GUIGlID getObjectUnderCursor()
returns the id of the object under the cursor using GL_SELECT
#define WRITE_MESSAGE(msg)
GUIGlObject * getObjectBlocking(GUIGlID id)
Returns the object from the container locking it.
const std::string & getFullName() const
Returns the full name appearing in the tool tip.
unsigned char red() const
Returns the red-amount of the color.
GUISelectedStorage gSelected
A global holder of selected objects.
FXDEFMAP(GUISUMOAbstractView) GUISUMOAbstractViewMap[]
SUMOReal rot
The rotation of the image in the ground plane (in degrees)
GUIGlChildWindow * myParent
The parent window.
virtual long onRightBtnRelease(FXObject *, FXSelector, void *)
static const Position INVALID
std::vector< GUIGlID > getObjectsInBoundary(const Boundary &bound)
returns the ids of all objects in the given boundary
void setOldValues(const Position &lookFrom, const Position &lookAt)
Resets old values.