2019-02-08 00:24:46 +08:00
/*
Copyright ( c ) 2008 - 2019 Jan W . Krieger & Sebastian Isbaner ( contour plot )
This software is free software : you can redistribute it and / or modify
it under the terms of the GNU Lesser General Public License ( LGPL ) as published by
the Free Software Foundation , either version 2.1 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU Lesser General Public License ( LGPL ) for more details .
You should have received a copy of the GNU Lesser General Public License ( LGPL )
along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
# ifndef JKQTPGRAPHSIMAGEOVERLAYS_H
# define JKQTPGRAPHSIMAGEOVERLAYS_H
# include <QString>
# include <QPainter>
# include <QImage>
# include <QIcon>
2019-04-22 19:27:50 +08:00
# include "jkqtplotter/jkqtpgraphsscatter.h"
2019-02-08 00:24:46 +08:00
# include "jkqtplottertools/jkqtptools.h"
# include "jkqtplotter/jkqtpbaseelements.h"
# include "jkqtplotter/jkqtpgraphsimage.h"
# include "jkqtplottertools/jkqtp_imexport.h"
# include "jkqtplottertools/jkqtpimagetools.h"
/*! \brief class to plot an image from an 2-dimensional array of boolean values: alle \c true values are plotted in a given color, while the \c false pixels are drawn in another (default: transparent)
\ ingroup jkqtplotter_imagelots_overlays
\ image html overlayimage . png
*/
class JKQTP_LIB_EXPORT JKQTPOverlayImage : public JKQTPImageBase {
Q_OBJECT
public :
/** \brief class constructor */
JKQTPOverlayImage ( double x , double y , double width , double height , bool * data , int Nx , int Ny , QColor colTrue , JKQTBasePlotter * parent = nullptr ) ;
JKQTPOverlayImage ( JKQTBasePlotter * parent = nullptr ) ;
/** \brief class constructor */
JKQTPOverlayImage ( double x , double y , double width , double height , bool * data , int Nx , int Ny , QColor colTrue , JKQTPlotter * parent ) ;
JKQTPOverlayImage ( JKQTPlotter * parent ) ;
/** \brief plots the graph to the plotter object specified as parent */
virtual void draw ( JKQTPEnhancedPainter & painter ) override ;
/*! \brief return the plotted image only as a QImage */
virtual QImage drawImage ( ) ;
/** \brief plots a key marker inside the specified rectangle \a rect */
virtual void drawKeyMarker ( JKQTPEnhancedPainter & painter , QRectF & rect ) override ;
/** \brief returns the color to be used for the key label */
2019-04-22 19:27:50 +08:00
virtual QColor getKeyLabelColor ( ) const override ;
2019-02-08 00:24:46 +08:00
/*! \copydoc trueColor
\ see see trueColor for details */
2019-04-22 19:27:50 +08:00
void setTrueColor ( const QColor & __value ) ;
2019-02-08 00:24:46 +08:00
/*! \copydoc trueColor
\ see see trueColor for details */
2019-04-22 19:27:50 +08:00
QColor getTrueColor ( ) const ;
2019-02-08 00:24:46 +08:00
/*! \copydoc falseColor
\ see see falseColor for details */
2019-04-22 19:27:50 +08:00
void setFalseColor ( const QColor & __value ) ;
2019-02-08 00:24:46 +08:00
/*! \copydoc falseColor
\ see see falseColor for details */
2019-04-22 19:27:50 +08:00
QColor getFalseColor ( ) const ;
2019-02-08 00:24:46 +08:00
/*! \copydoc Nx
\ see see Nx for details */
2019-04-22 19:27:50 +08:00
void setNx ( int __value ) ;
2019-02-08 00:24:46 +08:00
/*! \copydoc Nx
\ see see Nx for details */
2019-04-22 19:27:50 +08:00
int getNx ( ) const ;
2019-02-08 00:24:46 +08:00
/*! \copydoc Ny
\ see see Ny for details */
2019-04-22 19:27:50 +08:00
void setNy ( int __value ) ;
2019-02-08 00:24:46 +08:00
/*! \copydoc Ny
\ see see Ny for details */
2019-04-22 19:27:50 +08:00
int getNy ( ) const ;
2019-02-08 00:24:46 +08:00
/*! \copydoc data
\ see see data for details */
2019-04-22 19:27:50 +08:00
virtual void setData ( bool * __value ) ;
2019-02-08 00:24:46 +08:00
/*! \copydoc data
\ see see data for details */
2019-04-22 19:27:50 +08:00
bool * getData ( ) const ;
2019-02-08 00:24:46 +08:00
2019-04-22 19:27:50 +08:00
/** \brief set the plot-data to a given array \a data with size \a Nx * \a Ny in row-major ordering */
virtual void setData ( bool * data , int Nx , int Ny ) ;
2019-02-08 00:24:46 +08:00
2019-04-22 19:27:50 +08:00
/** \brief return the data used for plotting as a QVector<double> in row-major data-ordering */
2019-02-08 00:24:46 +08:00
QVector < double > getDataAsDoubleVector ( ) const ;
protected :
/** \brief points to the data array, holding the image */
bool * data ;
/** \brief width of the data array data in pt */
int Nx ;
/** \brief height of the data array data in pt */
int Ny ;
/** \brief color for \c true pixels */
QColor trueColor ;
/** \brief color for \c false pixels */
QColor falseColor ;
protected :
2019-04-22 19:27:50 +08:00
/** \brief action that calls saveImagePlotAsImage() */
2019-02-08 00:24:46 +08:00
QAction * actSaveImage ;
2019-04-22 19:27:50 +08:00
/** \brief action that calls copyImagePlotAsImage() */
2019-02-08 00:24:46 +08:00
QAction * actCopyImage ;
public :
2019-04-22 19:27:50 +08:00
/** \copydoc JKQTPImageBase::setTitle() */
2019-02-08 00:24:46 +08:00
virtual void setTitle ( const QString & title ) override ;
2019-04-22 19:27:50 +08:00
/** \copydoc JKQTPImageBase::setParent() */
2019-02-08 00:24:46 +08:00
virtual void setParent ( JKQTBasePlotter * parent ) override ;
public slots :
2019-04-22 19:27:50 +08:00
/** \brief save the plotted image as a file with \a filename and format \a outputFormat */
2019-02-08 00:24:46 +08:00
void saveImagePlotAsImage ( const QString & filename = QString ( " " ) , const QByteArray & outputFormat = QByteArray ( ) ) ;
2019-04-22 19:27:50 +08:00
/** \brief copy the plotted image as an image into the clipboard */
2019-02-08 00:24:46 +08:00
void copyImagePlotAsImage ( ) ;
} ;
/*! \brief class to plot an image from an 2-dimensional array of boolean values: alle \c true values are plotted in a given color, while the \c false pixels are drawn in another (default: transparent)
\ ingroup jkqtplotter_imagelots_overlays
In contrast to JKQTPOverlayImage this class draws ist contents as rectangles , not as semi - transparent image . This may lead to nicer results , but could be slower .
Also it is possible to draw other types of markers ( cross , circles , . . . )
\ image html overlayimageenhanced . png
*/
class JKQTP_LIB_EXPORT JKQTPOverlayImageEnhanced : public JKQTPOverlayImage {
Q_OBJECT
public :
2019-04-22 19:27:50 +08:00
enum OverlayImageEnhancedDrawMode {
DrawAsRectangles ,
DrawAsImage ,
DrawAsSymbols
} ;
2019-02-08 00:24:46 +08:00
/** \brief class constructor */
JKQTPOverlayImageEnhanced ( double x , double y , double width , double height , bool * data , int Nx , int Ny , QColor colTrue , JKQTBasePlotter * parent = nullptr ) ;
JKQTPOverlayImageEnhanced ( JKQTBasePlotter * parent = nullptr ) ;
/** \brief class constructor */
JKQTPOverlayImageEnhanced ( double x , double y , double width , double height , bool * data , int Nx , int Ny , QColor colTrue , JKQTPlotter * parent ) ;
JKQTPOverlayImageEnhanced ( JKQTPlotter * parent ) ;
/** \brief plots the graph to the plotter object specified as parent */
virtual void draw ( JKQTPEnhancedPainter & painter ) override ;
/** \brief plots a key marker inside the specified rectangle \a rect */
virtual void drawKeyMarker ( JKQTPEnhancedPainter & painter , QRectF & rect ) override ;
/*! \copydoc symbol
\ see see symbol for details */
2019-04-22 19:27:50 +08:00
void setSymbolType ( JKQTPGraphSymbols __value ) ;
2019-02-08 00:24:46 +08:00
/*! \copydoc symbol
\ see see symbol for details */
2019-04-22 19:27:50 +08:00
JKQTPGraphSymbols getSymbol ( ) const ;
/*! \copydoc symbolLineWidth
\ see see symbolLineWidth for details */
void setSymbolLineWidth ( double __value ) ;
/*! \copydoc symbolLineWidth
\ see see symbolLineWidth for details */
double getSymbolLineWidth ( ) const ;
2019-05-18 02:46:52 +08:00
/*! \copydoc drawMode
\ see see drawMode for details */
2019-04-22 19:27:50 +08:00
void setDrawMode ( OverlayImageEnhancedDrawMode __value ) ;
2019-05-18 02:46:52 +08:00
/*! \copydoc drawMode
\ see see drawMode for details */
2019-04-22 19:27:50 +08:00
OverlayImageEnhancedDrawMode getDrawMode ( ) const ;
2019-02-08 00:24:46 +08:00
/*! \copydoc symbolSizeFactor
\ see see symbolSizeFactor for details */
2019-04-22 19:27:50 +08:00
void setSymbolSizeFactor ( double __value ) ;
2019-02-08 00:24:46 +08:00
/*! \copydoc symbolSizeFactor
\ see see symbolSizeFactor for details */
2019-04-22 19:27:50 +08:00
double getSymbolSizeFactor ( ) const ;
2019-02-08 00:24:46 +08:00
protected :
/** \brief which symbol to use for the datapoints */
JKQTPGraphSymbols symbol ;
/** \brief width (in pt) of the lines used to plot the symbol for the data points */
2019-04-22 19:27:50 +08:00
double symbolLineWidth ;
2019-02-08 00:24:46 +08:00
2019-04-22 19:27:50 +08:00
/** \brief indicates whether to draw filled rectangles, or symbols */
OverlayImageEnhancedDrawMode drawMode ;
2019-02-08 00:24:46 +08:00
/** \brief a rescaling factor for the symbols */
double symbolSizeFactor ;
} ;
/*! \brief class to plot an image from an 2-dimensional array of boolean values: alle \c true values are plotted in a given color, while the \c false pixels are drawn in another (default: transparent)
\ ingroup jkqtplotter_imagelots_overlays
In contrast to JKQTPOverlayImage this class draws ist contents as rectangles , not as semi - transparent image . This may lead to nicer results , but could be slower .
Also it is possible to draw other types of markers ( cross , circles , . . . )
\ image html overlayimageenhanced . png
*/
class JKQTP_LIB_EXPORT JKQTPColumnOverlayImageEnhanced : public JKQTPOverlayImageEnhanced {
Q_OBJECT
public :
JKQTPColumnOverlayImageEnhanced ( JKQTBasePlotter * parent = nullptr ) ;
JKQTPColumnOverlayImageEnhanced ( JKQTPlotter * parent ) ;
/*! \copydoc imageColumn
\ see see imageColumn for details */
2019-04-22 19:27:50 +08:00
virtual void setImageColumn ( int __value ) ;
2019-02-08 00:24:46 +08:00
/*! \copydoc imageColumn
\ see see imageColumn for details */
2019-04-22 19:27:50 +08:00
int getImageColumn ( ) const ;
2019-02-08 00:24:46 +08:00
/** \brief plots the graph to the plotter object specified as parent */
virtual void draw ( JKQTPEnhancedPainter & painter ) override ;
/** \copydoc JKQTPGraph::usesColumn() */
virtual bool usesColumn ( int c ) const override ;
protected :
2019-04-22 19:27:50 +08:00
/** \brief column to read overlay image from */
2019-02-08 00:24:46 +08:00
int imageColumn ;
} ;
# endif // JKQTPGRAPHSIMAGEOVERLAYS_H