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) {
301 const int NB_HITS_MAX = 1024 * 1024;
303 static GUIGlID hits[NB_HITS_MAX];
304 static GLint nb_hits = 0;
305 glSelectBuffer(NB_HITS_MAX, hits);
315 nb_hits = glRenderMode(GL_RENDER);
319 std::vector<GUIGlID> result;
320 for (
int i = 0; i < nb_hits; ++i) {
321 assert(i * 4 + 3 < NB_HITS_MAX);
322 result.push_back(hits[i * 4 + 3]);
346 glEnable(GL_DEPTH_TEST);
356 glTranslated(0, 0, .55);
357 glColor3d(0.5, 0.5, 0.5);
360 for (; ypos < yend;) {
361 glVertex2d(xmin, ypos);
362 glVertex2d(xend, ypos);
366 for (; xpos < xend;) {
367 glVertex2d(xpos, ymin);
368 glVertex2d(xpos, yend);
372 glTranslated(0, 0, -.55);
380 const std::string text(
"10000000000");
382 size_t pixelSize = (size_t)
m2p((
SUMOReal) length);
383 while (pixelSize <= 20) {
386 if (noDigits > text.length()) {
394 glMatrixMode(GL_PROJECTION);
397 glMatrixMode(GL_MODELVIEW);
402 glDisable(GL_TEXTURE_2D);
403 glDisable(GL_ALPHA_TEST);
405 glEnable(GL_DEPTH_TEST);
409 double o = double(15) / double(getHeight());
411 double oo = double(5) / double(getHeight());
414 glVertex2d(-.98, -1. + o);
415 glVertex2d(-.98 + len, -1. + o);
417 glVertex2d(-.98, -1. + o);
418 glVertex2d(-.98, -1. + o2);
420 glVertex2d(-.98 + len, -1. + o);
421 glVertex2d(-.98 + len, -1. + o2);
428 glRotated(180, 1, 0, 0);
430 glRotated(-180, 1, 0, 0);
433 glRotated(180, 1, 0, 0);
435 glRotated(-180, 1, 0, 0);
438 glMatrixMode(GL_PROJECTION);
440 glMatrixMode(GL_MODELVIEW);
466 if (o != 0 && dynamic_cast<GUIGlObject*>(o) != 0) {
467 if (applyZoom && zoomDist < 0) {
500 FXbool ret = FXGLCanvas::makeCurrent();
508 glViewport(0, 0, getWidth() - 1, getHeight() - 1);
546 FXEvent* e = (FXEvent*) data;
548 if (e->state & CONTROLMASK) {
650 myApp->getCursorPosition(x, y, b);
665 FXEvent* e = (FXEvent*) data;
666 if ((e->state & ALTMASK) != 0) {
667 setDefaultCursor(getApp()->getDefaultCursor(DEF_CROSSHAIR_CURSOR));
688 return FXGLCanvas::onKeyPress(o, sel, data);
694 FXEvent* e = (FXEvent*) data;
695 if ((e->state & ALTMASK) == 0) {
697 setDefaultCursor(getApp()->getDefaultCursor(DEF_ARROW_CURSOR));
699 return FXGLCanvas::onKeyRelease(o, sel, data);
712 std::string errorMessage;
713 FXString ext = FXPath::extension(destFile.c_str());
714 bool useGL2PS = ext ==
"ps" || ext ==
"eps" || ext ==
"pdf" || ext ==
"svg" || ext ==
"tex" || ext ==
"pgf";
725 glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
726 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
731 glDisable(GL_DITHER);
735 glEnable(GL_POLYGON_SMOOTH);
736 glEnable(GL_LINE_SMOOTH);
739 glDisable(GL_POLYGON_SMOOTH);
740 glDisable(GL_LINE_SMOOTH);
749 }
else if (ext ==
"eps") {
751 }
else if (ext ==
"pdf") {
753 }
else if (ext ==
"tex") {
755 }
else if (ext ==
"svg") {
757 }
else if (ext ==
"pgf") {
760 return "Could not save '" + destFile +
"'.\n Unrecognized format '" + std::string(ext.text()) +
"'.";
762 FILE* fp = fopen(destFile.c_str(),
"wb");
764 return "Could not save '" + destFile +
"'.\n Could not open file for writing";
768 glGetIntegerv(GL_VIEWPORT, viewport);
770 buffsize += 1024 * 1024;
773 GL_RGBA, 0, NULL, 0, 0, 0, buffsize, fp,
"out.eps");
774 glMatrixMode(GL_MODELVIEW);
776 glDisable(GL_TEXTURE_2D);
777 glDisable(GL_ALPHA_TEST);
779 glEnable(GL_DEPTH_TEST);
789 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
793 minB[0] = viewPort.
xmin();
794 minB[1] = viewPort.
ymin();
795 maxB[0] = viewPort.
xmax();
796 maxB[1] = viewPort.
ymax();
798 glEnable(GL_POLYGON_OFFSET_FILL);
799 glEnable(GL_POLYGON_OFFSET_LINE);
817 FXMALLOC(&buf, FXColor, getWidth()*getHeight());
819 glReadBuffer(GL_BACK);
821 glReadPixels(0, 0, getWidth(), getHeight(), GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*)buf);
825 size_t mwidth = getWidth();
826 size_t mheight = getHeight();
828 FXColor* pbb = buf + mwidth * (mheight - 1);
842 errorMessage =
"Could not save '" + destFile +
"'.";
845 errorMessage =
"Could not save '" + destFile +
"'.\n" + e.what();
929 GDALDataset* poDataset = (GDALDataset*)GDALOpen(d.
filename.c_str(), GA_ReadOnly);
930 if (poDataset == 0) {
933 const int xSize = poDataset->GetRasterXSize();
934 const int ySize = poDataset->GetRasterYSize();
937 double adfGeoTransform[6];
938 if (poDataset->GetGeoTransform(adfGeoTransform) == CE_None) {
939 Position topLeft(adfGeoTransform[0], adfGeoTransform[3]);
940 const double horizontalSize = xSize * adfGeoTransform[1];
941 const double verticalSize = ySize * adfGeoTransform[5];
942 Position bottomRight(topLeft.
x() + horizontalSize, topLeft.
y() + verticalSize);
944 d.
width = bottomRight.x() - topLeft.
x();
945 d.
height = topLeft.
y() - bottomRight.y();
946 d.
centerX = (topLeft.
x() + bottomRight.x()) / 2;
947 d.
centerY = (topLeft.
y() + bottomRight.y()) / 2;
962 const int picSize = xSize * ySize;
964 if (!FXMALLOC(&result, FXColor, picSize)) {
968 for (
int j = 0; j < picSize; j++) {
969 result[j] = FXRGB(0, 0, 0);
972 for (
int i = 1; i <= poDataset->GetRasterCount(); i++) {
973 GDALRasterBand* poBand = poDataset->GetRasterBand(i);
975 if (poBand->GetColorInterpretation() == GCI_RedBand) {
977 }
else if (poBand->GetColorInterpretation() == GCI_GreenBand) {
979 }
else if (poBand->GetColorInterpretation() == GCI_BlueBand) {
981 }
else if (poBand->GetColorInterpretation() == GCI_AlphaBand) {
988 assert(xSize == poBand->GetXSize() && ySize == poBand->GetYSize());
989 if (poBand->RasterIO(GF_Read, 0, 0, xSize, ySize, ((
unsigned char*)result) + shift, xSize, ySize, GDT_Byte, 4, 4 * xSize) == CE_Failure) {
994 GDALClose(poDataset);
996 return new FXImage(getApp(), result, IMAGE_OWNED | IMAGE_KEEP | IMAGE_SHMI | IMAGE_SHMP, xSize, ySize);
1008 for (std::vector<GUISUMOAbstractView::Decal>::iterator l =
myDecals.begin(); l !=
myDecals.end(); ++l) {
1032 glRotated(d.
rot, 0, 0, 1);
1079 glMatrixMode(GL_PROJECTION);
1084 glOrtho(0, getWidth(), 0, getHeight(), -
GLO_MAX - 1,
GLO_MAX + 1);
1085 glMatrixMode(GL_MODELVIEW);
1089 glScaled(scaleX, scaleY, 1);
1090 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.
virtual int Search(const float a_min[2], const float a_max[2], const GUIVisualizationSettings &c)
Find all within search rectangle.
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)
FXDEFMAP(GUIDialog_AppSettings) GUIDialog_AppSettingsMap[]
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< 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 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.
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.