2015-07-11 18:56:02 +08:00
/*
2019-01-20 23:15:10 +08:00
Copyright ( c ) 2008 - 2019 Jan W . Krieger ( < jan @ jkrieger . de > , < j . krieger @ dkfz . de > )
2015-07-11 18:56:02 +08:00
2015-07-12 22:34:27 +08:00
2015-07-11 18:56:02 +08:00
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
2019-02-08 00:24:46 +08:00
the Free Software Foundation , either version 2.1 of the License , or
2015-07-11 18:56:02 +08:00
( 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/>.
*/
# include <QFileInfo>
# if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
# include <QtGlobal>
# include <QtWidgets>
# else
# include <QtGui>
# endif
# include <QSvgGenerator>
# include <QDebug>
# include <QElapsedTimer>
# include <QPrintPreviewWidget>
# include <QDialog>
2018-11-26 03:25:44 +08:00
# include "jkqtplotter/jkqtpbaseplotter.h"
2018-12-19 00:13:18 +08:00
# include "jkqtplottergui/jkqtpgraphsmodel.h"
# include "jkqtplottergui/jkqtpenhancedtableview.h"
2018-08-19 23:03:46 +08:00
# include <QPrinter>
2015-07-11 18:56:02 +08:00
# include <QPrinterInfo>
# include <QPrintDialog>
# include <QGridLayout>
# include <QCheckBox>
# include <QDialogButtonBox>
# include <QApplication>
# include <QFileDialog>
# include <QInputDialog>
# include <QVBoxLayout>
2015-08-04 23:38:29 +08:00
# ifdef QFWIDLIB_LIBRARY
# include "qftools.h"
# endif
2018-12-19 00:13:18 +08:00
# include "jkqtplotter/jkqtpgraphsboxplot.h"
# include "jkqtplotter/jkqtpgraphsbarchart.h"
# include "jkqtplotter/jkqtpgraphsfilledcurve.h"
2019-04-22 19:27:50 +08:00
# include "jkqtplotter/jkqtpgraphsspecialline.h"
2018-12-19 00:13:18 +08:00
# include "jkqtplotter/jkqtpgraphsimpulses.h"
2019-04-22 19:27:50 +08:00
# include "jkqtplotter/jkqtpgraphsscatter.h"
2018-12-28 05:52:00 +08:00
# include "jkqtplotter/jkqtpgraphsgeometric.h"
# include "jkqtplotter/jkqtpgraphsimage.h"
2019-02-08 00:24:46 +08:00
# include "jkqtplotter/jkqtpgraphsimagergb.h"
2015-07-11 18:56:02 +08:00
static QString globalUserSettigsFilename = " " ;
static QString globalUserSettigsPrefix = " " ;
2019-01-26 03:16:04 +08:00
static QList < JKQTPPaintDeviceAdapter * > jkqtpPaintDeviceAdapters ;
static QList < JKQTPSaveDataAdapter * > jkqtpSaveDataAdapters ;
2015-07-11 18:56:02 +08:00
2018-12-03 01:30:12 +08:00
2019-02-08 00:24:46 +08:00
2019-01-20 17:49:29 +08:00
void initJKQTBasePlotterResources ( )
2018-12-03 01:30:12 +08:00
{
Q_INIT_RESOURCE ( jkqtpbaseplotter ) ;
2019-01-20 17:49:29 +08:00
initJKQTMathTextResources ( ) ;
2018-12-03 01:30:12 +08:00
}
2019-01-26 19:28:44 +08:00
void JKQTBasePlotter : : setDefaultJKQTBasePrinterUserSettings ( QString userSettigsFilename , const QString & userSettigsPrefix )
2015-07-11 18:56:02 +08:00
{
globalUserSettigsFilename = userSettigsFilename ;
globalUserSettigsPrefix = userSettigsPrefix ;
}
2019-01-26 03:16:04 +08:00
void JKQTBasePlotter : : registerPaintDeviceAdapter ( JKQTPPaintDeviceAdapter * adapter )
2015-07-11 18:56:02 +08:00
{
jkqtpPaintDeviceAdapters . append ( adapter ) ;
}
2019-01-26 03:16:04 +08:00
void JKQTBasePlotter : : deregisterPaintDeviceAdapter ( JKQTPPaintDeviceAdapter * adapter )
2015-07-11 18:56:02 +08:00
{
if ( jkqtpPaintDeviceAdapters . contains ( adapter ) ) jkqtpPaintDeviceAdapters . removeAll ( adapter ) ;
}
2019-01-26 03:16:04 +08:00
bool JKQTBasePlotter : : registerSaveDataAdapter ( JKQTPSaveDataAdapter * adapter )
2015-07-11 18:56:02 +08:00
{
if ( adapter ) {
QString format = adapter - > getFilter ( ) ;
for ( int i = 0 ; i < jkqtpSaveDataAdapters . size ( ) ; i + + ) {
if ( jkqtpSaveDataAdapters [ i ] & & jkqtpSaveDataAdapters [ i ] - > getFilter ( ) = = format ) {
return false ;
}
}
jkqtpSaveDataAdapters . append ( adapter ) ;
return true ;
}
return false ;
}
2019-01-26 03:16:04 +08:00
bool JKQTBasePlotter : : deregisterSaveDataAdapter ( JKQTPSaveDataAdapter * adapter )
2015-07-11 18:56:02 +08:00
{
if ( jkqtpSaveDataAdapters . contains ( adapter ) ) jkqtpSaveDataAdapters . removeAll ( adapter ) ;
return true ;
}
2019-01-20 17:49:29 +08:00
JKQTBasePlotter : : textSizeData JKQTBasePlotter : : getTextSizeDetail ( const QFont & fm , const QString & text , QPainter & painter )
2015-07-11 18:56:02 +08:00
{
return getTextSizeDetail ( fm . family ( ) , fm . pointSizeF ( ) , text , painter ) ;
}
2019-01-20 17:49:29 +08:00
JKQTBasePlotter : : textSizeData JKQTBasePlotter : : getTextSizeDetail ( const QString & fontName , double fontSize , const QString & text , QPainter & painter )
2015-07-11 18:56:02 +08:00
{
2019-01-20 17:49:29 +08:00
JKQTBasePlotter : : textSizeKey dh ( fontName , fontSize , text , painter . device ( ) ) ;
2019-02-08 00:24:46 +08:00
if ( s_TextSizeDataCache . contains ( dh ) ) return s_TextSizeDataCache [ dh ] ;
2019-01-20 17:49:29 +08:00
JKQTBasePlotter : : textSizeData d ;
2019-02-08 00:24:46 +08:00
mathText . setFontRomanOrSpecial ( fontName ) ;
2019-01-26 03:16:04 +08:00
mathText . setFontSize ( fontSize ) ;
2015-07-11 18:56:02 +08:00
mathText . parse ( text ) ;
mathText . getSizeDetail ( painter , d . width , d . ascent , d . descent , d . strikeoutPos ) ;
2019-02-08 00:24:46 +08:00
s_TextSizeDataCache [ dh ] = d ;
2015-07-11 18:56:02 +08:00
//qDebug()<<"+++ textsize hash size: "<<tbrh.size();
return d ;
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : getTextSizeDetail ( const QString & fontName , double fontSize , const QString & text , QPainter & painter , double & width , double & ascent , double & descent , double & strikeoutPos )
2015-07-11 18:56:02 +08:00
{
2019-02-08 00:24:46 +08:00
if ( ! text . isEmpty ( ) ) {
JKQTBasePlotter : : textSizeData d = getTextSizeDetail ( fontName , fontSize , text , painter ) ;
width = d . width ;
ascent = d . ascent ;
descent = d . descent ;
strikeoutPos = d . strikeoutPos ;
} else {
width = 0 ;
ascent = 0 ;
descent = 0 ;
strikeoutPos = 0 ;
}
2015-07-11 18:56:02 +08:00
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : getTextSizeDetail ( const QFont & fm , const QString & text , QPainter & painter , double & width , double & ascent , double & descent , double & strikeoutPos )
2015-07-11 18:56:02 +08:00
{
getTextSizeDetail ( fm . family ( ) , fm . pointSizeF ( ) , text , painter , width , ascent , descent , strikeoutPos ) ;
}
2019-01-20 17:49:29 +08:00
QSizeF JKQTBasePlotter : : getTextSizeSize ( const QFont & fm , const QString & text , QPainter & painter )
2015-07-11 18:56:02 +08:00
{
return getTextSizeSize ( fm . family ( ) , fm . pointSizeF ( ) , text , painter ) ;
}
2019-01-20 17:49:29 +08:00
QSizeF JKQTBasePlotter : : getTextSizeSize ( const QString & fontName , double fontSize , const QString & text , QPainter & painter )
2015-07-11 18:56:02 +08:00
{
2019-02-08 00:24:46 +08:00
if ( text . isEmpty ( ) ) return QSizeF ( 0 , 0 ) ;
2019-01-20 17:49:29 +08:00
JKQTBasePlotter : : textSizeData d = getTextSizeDetail ( fontName , fontSize , text , painter ) ;
2015-07-11 18:56:02 +08:00
return QSizeF ( d . width , d . ascent + d . descent ) ;
}
// define this to get timing information about painting on the debug output
//#define JKQTBP_DEBUGTIMING
# undef JKQTBP_DEBUGTIMING
/**************************************************************************************************************************
2019-01-26 03:16:04 +08:00
* JKQTBasePlotter
2015-07-11 18:56:02 +08:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2019-01-20 17:49:29 +08:00
JKQTBasePlotter : : JKQTBasePlotter ( bool datastore_internal , QObject * parent , JKQTPDatastore * datast ) :
2019-02-08 00:24:46 +08:00
QObject ( parent ) , plotterStyle ( JKQTPGetSystemDefaultBaseStyle ( ) ) , m_plotsModel ( nullptr ) , xAxis ( nullptr ) , yAxis ( nullptr )
2015-07-11 18:56:02 +08:00
{
2019-02-08 00:24:46 +08:00
initJKQTBasePlotterResources ( ) ;
2018-11-18 18:59:30 +08:00
dataColumnsListWidget = nullptr ;
2015-07-11 18:56:02 +08:00
printMagnification = 1.0 ;
printZoomFactor = 1.0 ;
printSizeX_Millimeter = 1.0 ;
printSizeY_Millimeter = 1.0 ;
paintMagnification = 1.0 ;
printDoUpdate = true ;
emitPlotSignals = true ;
2019-02-03 21:04:48 +08:00
masterPlotterX = nullptr ;
masterPlotterY = nullptr ;
2015-07-11 18:56:02 +08:00
masterSynchronizeWidth = false ;
masterSynchronizeHeight = false ;
fontSizePrintMultiplier = 1 ;
lineWidthPrintMultiplier = 1 ;
fontSizeMultiplier = 1 ;
lineWidthMultiplier = 1 ;
userSettigsFilename = globalUserSettigsFilename ;
userSettigsPrefix = globalUserSettigsPrefix ;
currentPrinter = QPrinterInfo : : defaultPrinter ( ) . printerName ( ) ;
if ( datastore_internal ) {
2019-01-20 17:49:29 +08:00
datastore = new JKQTPDatastore ( ) ;
2015-07-11 18:56:02 +08:00
datastoreInternal = true ;
} else {
datastore = datast ;
datastoreInternal = false ;
}
2019-01-20 17:49:29 +08:00
xAxis = new JKQTPHorizontalAxis ( this ) ;
yAxis = new JKQTPVerticalAxis ( this ) ;
m_plotsModel = new JKQTPGraphsModel ( this ) ;
2018-08-19 23:03:46 +08:00
connect ( this , SIGNAL ( plotUpdated ( ) ) , m_plotsModel , SLOT ( plotUpdated ( ) ) ) ;
2015-07-11 18:56:02 +08:00
emitSignals = false ;
2019-02-08 00:24:46 +08:00
setWidgetSize ( 400 , 300 ) ;
internalPlotWidth = 400 ;
internalPlotHeight = 300 ;
2015-07-11 18:56:02 +08:00
initSettings ( ) ;
emitSignals = true ;
2019-01-20 23:15:10 +08:00
actSavePlot = new QAction ( QIcon ( " :/JKQTPlotter/jkqtp_saveplot.png " ) , " Save Plot " , this ) ;
2015-07-11 18:56:02 +08:00
actSavePlot - > setToolTip ( " Save plot as image file (PDF, PS; PNG, ...). " ) ;
2019-01-20 23:15:10 +08:00
actSaveData = new QAction ( QIcon ( " :/JKQTPlotter/jkqtp_savedata.png " ) , " Save Data " , this ) ;
2015-07-11 18:56:02 +08:00
actSaveData - > setToolTip ( " Save Data of the plot as file (CSV, ...). " ) ;
2019-01-20 23:15:10 +08:00
actCopyData = new QAction ( QIcon ( " :/JKQTPlotter/jkqtp_copydata.png " ) , " Copy Data " , this ) ;
2015-07-11 18:56:02 +08:00
actCopyData - > setToolTip ( " Copy Data of the plot to the clipboard to be pasted into Excel etc. " ) ;
2019-01-20 23:15:10 +08:00
actCopyMatlab = new QAction ( QIcon ( " :/JKQTPlotter/jkqtp_copymatlab.png " ) , " Copy Data to Matlab " , this ) ;
2015-07-11 18:56:02 +08:00
actCopyMatlab - > setToolTip ( " Copy Data of the plot to the clipboard in Matlab script format. " ) ;
2019-01-20 23:15:10 +08:00
actCopyPixelImage = new QAction ( QIcon ( " :/JKQTPlotter/jkqtp_copyimg.png " ) , " Copy Image " , this ) ;
2015-07-11 18:56:02 +08:00
actCopyPixelImage - > setToolTip ( " Copy the plot as a pixel image to the clipboard " ) ;
2019-01-20 23:15:10 +08:00
actSavePDF = new QAction ( QIcon ( " :/JKQTPlotter/jkqtp_savepdf.png " ) , " Save P&DF " , this ) ;
2015-07-11 18:56:02 +08:00
actSavePDF - > setToolTip ( " Save as PDF " ) ;
//toolbar->addAction(actSavePDF);
# if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0))
2019-01-20 23:15:10 +08:00
actSavePS = new QAction ( QIcon ( " :/JKQTPlotter/jkqtp_saveps.png " ) , " Save P&S " , this ) ;
2015-07-11 18:56:02 +08:00
actSavePS - > setToolTip ( " Save as PostScript " ) ;
//toolbar->addAction(actSavePS);
# endif
2019-01-20 23:15:10 +08:00
actSaveSVG = new QAction ( QIcon ( " :/JKQTPlotter/jkqtp_savesvg.png " ) , " Save S&VG " , this ) ;
2015-07-11 18:56:02 +08:00
actSaveSVG - > setToolTip ( " Save as Scalable Vector Graphics (SVG) " ) ;
//toolbar->addAction(actSaveSVG);
2019-01-20 23:15:10 +08:00
actSavePix = new QAction ( QIcon ( " :/JKQTPlotter/jkqtp_savepix.png " ) , " Save &Image " , this ) ;
2015-07-11 18:56:02 +08:00
actSavePix - > setToolTip ( " Save as Pixel Image (PNG, JPEG, TIFF ...) " ) ;
//toolbar->addAction(actSavePix);
2019-01-20 23:15:10 +08:00
actPrint = new QAction ( QIcon ( " :/JKQTPlotter/jkqtp_print.png " ) , " &Print " , this ) ;
2015-07-11 18:56:02 +08:00
actPrint - > setToolTip ( " Print " ) ;
//toolbar->addSeparator();
2019-01-20 23:15:10 +08:00
actSaveCSV = new QAction ( QIcon ( " :/JKQTPlotter/jkqtp_savecsv.png " ) , " Save &CSV " , this ) ;
2015-07-11 18:56:02 +08:00
actSaveCSV - > setToolTip ( " Save the data which is used for the plot as Comma Separated Values (CSV) " ) ;
//toolbar->addAction(actSaveCSV);
//toolbar->addSeparator();
2019-01-20 23:15:10 +08:00
actZoomAll = new QAction ( QIcon ( " :/JKQTPlotter/jkqtp_zoomall.png " ) , " Zoom &All " , this ) ;
2015-07-11 18:56:02 +08:00
actZoomAll - > setToolTip ( " Zoom to view all data " ) ;
2019-01-20 23:15:10 +08:00
actZoomIn = new QAction ( QIcon ( " :/JKQTPlotter/jkqtp_zoomin.png " ) , " Zoom &In " , this ) ;
2015-07-11 18:56:02 +08:00
actZoomIn - > setToolTip ( " Zoom in around the center of the plot " ) ;
2019-01-20 23:15:10 +08:00
actZoomOut = new QAction ( QIcon ( " :/JKQTPlotter/jkqtp_zoomout.png " ) , " Zoom &Out " , this ) ;
2015-07-11 18:56:02 +08:00
actZoomOut - > setToolTip ( " Zoom out " ) ;
2019-01-20 23:15:10 +08:00
actShowPlotData = new QAction ( QIcon ( " :/JKQTPlotter/jkqtp_showplotdata.png " ) , " &Show Plot Data " , this ) ;
2015-07-11 18:56:02 +08:00
actShowPlotData - > setToolTip ( " opens a dialog that contains all data used for the plot in a table. " ) ;
connect ( actSavePlot , SIGNAL ( triggered ( ) ) , this , SLOT ( saveImage ( ) ) ) ;
connect ( actSaveData , SIGNAL ( triggered ( ) ) , this , SLOT ( saveData ( ) ) ) ;
connect ( actCopyData , SIGNAL ( triggered ( ) ) , this , SLOT ( copyData ( ) ) ) ;
connect ( actCopyPixelImage , SIGNAL ( triggered ( ) ) , this , SLOT ( copyPixelImage ( ) ) ) ;
connect ( actCopyMatlab , SIGNAL ( triggered ( ) ) , this , SLOT ( copyDataMatlab ( ) ) ) ;
connect ( actShowPlotData , SIGNAL ( triggered ( ) ) , this , SLOT ( showPlotData ( ) ) ) ;
connect ( actSavePDF , SIGNAL ( triggered ( ) ) , this , SLOT ( saveAsPDF ( ) ) ) ;
# if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0))
connect ( actSavePS , SIGNAL ( triggered ( ) ) , this , SLOT ( saveAsPS ( ) ) ) ;
# endif
connect ( actSaveSVG , SIGNAL ( triggered ( ) ) , this , SLOT ( saveAsSVG ( ) ) ) ;
connect ( actSavePix , SIGNAL ( triggered ( ) ) , this , SLOT ( saveAsPixelImage ( ) ) ) ;
connect ( actPrint , SIGNAL ( triggered ( ) ) , this , SLOT ( print ( ) ) ) ;
connect ( actSaveCSV , SIGNAL ( triggered ( ) ) , this , SLOT ( saveAsCSV ( ) ) ) ;
connect ( actZoomAll , SIGNAL ( triggered ( ) ) , this , SLOT ( zoomToFit ( ) ) ) ;
connect ( actZoomIn , SIGNAL ( triggered ( ) ) , this , SLOT ( zoomIn ( ) ) ) ;
connect ( actZoomOut , SIGNAL ( triggered ( ) ) , this , SLOT ( zoomOut ( ) ) ) ;
2019-02-08 00:24:46 +08:00
setWidgetSize ( 400 , 300 ) ;
2015-07-11 18:56:02 +08:00
}
2019-01-20 17:49:29 +08:00
JKQTBasePlotter : : ~ JKQTBasePlotter ( ) {
2015-07-11 18:56:02 +08:00
clearGraphs ( false ) ;
2018-11-18 18:59:30 +08:00
if ( datastoreInternal & & datastore ! = nullptr ) delete datastore ;
2015-07-11 18:56:02 +08:00
delete xAxis ;
delete yAxis ;
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : setGrid ( bool val ) {
2019-01-26 20:00:40 +08:00
xAxis - > setDrawGrid ( val ) ;
yAxis - > setDrawGrid ( val ) ;
2015-07-11 18:56:02 +08:00
} ;
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : useExternalDatastore ( JKQTPDatastore * newStore ) {
2018-11-18 18:59:30 +08:00
if ( datastoreInternal & & datastore ! = nullptr ) {
2015-07-11 18:56:02 +08:00
delete datastore ;
2018-11-18 18:59:30 +08:00
datastore = nullptr ;
2015-07-11 18:56:02 +08:00
}
datastore = newStore ;
datastoreInternal = false ;
} ;
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : useAsInternalDatastore ( JKQTPDatastore * newStore ) {
2018-11-18 18:59:30 +08:00
if ( datastoreInternal & & datastore ! = nullptr ) {
2015-07-11 18:56:02 +08:00
delete datastore ;
2018-11-18 18:59:30 +08:00
datastore = nullptr ;
2015-07-11 18:56:02 +08:00
}
datastore = newStore ;
datastoreInternal = true ;
if ( emitPlotSignals ) emit plotUpdated ( ) ;
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : useInternalDatastore ( ) {
2015-07-11 18:56:02 +08:00
if ( ! datastoreInternal ) {
2019-01-20 17:49:29 +08:00
datastore = new JKQTPDatastore ( ) ;
2015-07-11 18:56:02 +08:00
datastoreInternal = true ;
}
if ( emitPlotSignals ) emit plotUpdated ( ) ;
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : forceInternalDatastore ( ) {
2018-11-18 18:59:30 +08:00
if ( datastoreInternal & & datastore ! = nullptr ) {
2015-07-11 18:56:02 +08:00
delete datastore ;
2018-11-18 18:59:30 +08:00
datastore = nullptr ;
2015-07-11 18:56:02 +08:00
}
2019-01-20 17:49:29 +08:00
datastore = new JKQTPDatastore ( ) ;
2015-07-11 18:56:02 +08:00
datastoreInternal = true ;
if ( emitPlotSignals ) emit plotUpdated ( ) ;
}
2019-01-26 19:28:44 +08:00
bool JKQTBasePlotter : : isEmittingSignalsEnabled ( ) const {
return this - > emitSignals ;
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : initSettings ( ) {
2015-07-11 18:56:02 +08:00
useClipping = true ;
//doDrawing=true;
2019-02-08 00:24:46 +08:00
maintainAspectRatio = false ;
aspectRatio = 1 ;
2015-07-11 18:56:02 +08:00
2019-02-08 00:24:46 +08:00
maintainAxisAspectRatio = false ;
axisAspectRatio = 1 ;
2015-07-11 18:56:02 +08:00
gridPrinting = false ;
gridPrintingList . clear ( ) ;
gridPrintingCurrentX = 0 ;
gridPrintingCurrentY = 0 ;
2019-02-08 00:24:46 +08:00
internalPlotBorderLeft_notIncludingOutsidePlotSections = internalPlotBorderLeft = plotterStyle . plotBorderLeft ;
internalPlotBorderRight_notIncludingOutsidePlotSections = internalPlotBorderRight = plotterStyle . plotBorderRight ;
internalPlotBorderTop_notIncludingOutsidePlotSections = internalPlotBorderTop = plotterStyle . plotBorderTop ;
internalPlotBorderBottom_notIncludingOutsidePlotSections = internalPlotBorderBottom = plotterStyle . plotBorderBottom ;
2015-07-11 18:56:02 +08:00
//plotWidth=700;
//plotHeight=150;
xAxis - > setRange ( - 10 , 10 ) ;
yAxis - > setRange ( - 10 , 10 ) ;
plotLabel = " " ;
if ( emitPlotSignals ) emit plotUpdated ( ) ;
}
2018-12-03 01:30:12 +08:00
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : zoomIn ( double factor ) {
2015-07-11 18:56:02 +08:00
//std::cout<<(double)event->delta()/120.0<<": "<<factor<<std::endl;
2019-02-08 00:24:46 +08:00
double xmin = p2x ( static_cast < long > ( round ( static_cast < double > ( internalPlotWidth ) / 2.0 - static_cast < double > ( internalPlotWidth ) / ( 2.0 * factor ) ) ) ) ;
double xmax = p2x ( static_cast < long > ( round ( static_cast < double > ( internalPlotWidth ) / 2.0 + static_cast < double > ( internalPlotWidth ) / ( 2.0 * factor ) ) ) ) ;
double ymin = p2y ( static_cast < long > ( round ( static_cast < double > ( internalPlotHeight ) / 2.0 + static_cast < double > ( internalPlotHeight ) / ( 2.0 * factor ) ) ) ) ;
double ymax = p2y ( static_cast < long > ( round ( static_cast < double > ( internalPlotHeight ) / 2.0 - static_cast < double > ( internalPlotHeight ) / ( 2.0 * factor ) ) ) ) ;
2015-07-11 18:56:02 +08:00
xAxis - > setRange ( xmin , xmax ) ;
yAxis - > setRange ( ymin , ymax ) ;
if ( emitPlotSignals ) emit plotUpdated ( ) ;
if ( emitSignals ) emit zoomChangedLocally ( xAxis - > getMin ( ) , xAxis - > getMax ( ) , yAxis - > getMin ( ) , yAxis - > getMax ( ) , this ) ;
}
2019-02-08 00:24:46 +08:00
void JKQTBasePlotter : : zoomOut ( double factor ) {
zoomIn ( 1.0 / factor ) ;
}
void JKQTBasePlotter : : setMaintainAspectRatio ( bool value ) {
maintainAspectRatio = value ;
redrawPlot ( ) ;
}
void JKQTBasePlotter : : setMaintainAxisAspectRatio ( bool value ) {
maintainAxisAspectRatio = value ;
redrawPlot ( ) ;
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : zoom ( double nxmin , double nxmax , double nymin , double nymax ) {
2015-07-11 18:56:02 +08:00
// only react on double clicks inside event
double xmin = nxmin ;
double xmax = nxmax ;
double ymin = nymin ;
double ymax = nymax ;
xAxis - > setRange ( xmin , xmax ) ;
yAxis - > setRange ( ymin , ymax ) ;
if ( emitPlotSignals ) emit plotUpdated ( ) ;
if ( emitSignals ) emit zoomChangedLocally ( xAxis - > getMin ( ) , xAxis - > getMax ( ) , yAxis - > getMin ( ) , yAxis - > getMax ( ) , this ) ;
}
2019-01-26 19:28:44 +08:00
2019-02-08 00:24:46 +08:00
void JKQTBasePlotter : : setWidgetSize ( int wid , int heigh ) {
2015-07-11 18:56:02 +08:00
widgetWidth = wid ;
widgetHeight = heigh ;
if ( emitPlotSignals ) emit plotUpdated ( ) ;
}
2019-02-08 00:24:46 +08:00
int JKQTBasePlotter : : getWidth ( ) {
return widgetWidth ;
}
int JKQTBasePlotter : : getHeight ( ) {
return widgetHeight ;
}
double JKQTBasePlotter : : getXMin ( ) const {
return xAxis - > getMin ( ) ;
}
double JKQTBasePlotter : : getXMax ( ) const {
return xAxis - > getMax ( ) ;
}
double JKQTBasePlotter : : getYMin ( ) const {
return yAxis - > getMin ( ) ;
}
double JKQTBasePlotter : : getYMax ( ) const {
return yAxis - > getMax ( ) ;
}
double JKQTBasePlotter : : getAbsoluteXMin ( ) const {
return xAxis - > getAbsoluteMin ( ) ;
}
double JKQTBasePlotter : : getAbsoluteXMax ( ) const {
return xAxis - > getAbsoluteMax ( ) ;
}
double JKQTBasePlotter : : getAbsoluteYMin ( ) const {
return yAxis - > getAbsoluteMin ( ) ;
}
double JKQTBasePlotter : : getAbsoluteYMax ( ) const {
return yAxis - > getAbsoluteMax ( ) ;
}
void JKQTBasePlotter : : addGridPrintingPlotter ( size_t x , size_t y , JKQTBasePlotter * plotter ) {
JKQTPGridPrintingItem i ;
i . x = x ;
i . y = y ;
i . plotter = plotter ;
gridPrintingList . push_back ( i ) ;
}
void JKQTBasePlotter : : clearGridPrintingPlotters ( ) {
gridPrintingList . clear ( ) ;
}
2015-07-11 18:56:02 +08:00
2019-02-08 00:24:46 +08:00
void JKQTBasePlotter : : setWidgetWidth ( int wid ) {
2015-07-11 18:56:02 +08:00
widgetWidth = wid ;
if ( emitPlotSignals ) emit plotUpdated ( ) ;
}
2019-02-08 00:24:46 +08:00
void JKQTBasePlotter : : setWidgetHeight ( int heigh ) {
2015-07-11 18:56:02 +08:00
widgetHeight = heigh ;
if ( emitPlotSignals ) emit plotUpdated ( ) ;
}
2019-01-26 19:28:44 +08:00
void JKQTBasePlotter : : saveSettings ( QSettings & settings , const QString & group ) const {
2015-07-11 18:56:02 +08:00
2019-02-08 00:24:46 +08:00
plotterStyle . saveSettings ( settings , group ) ;
settings . setValue ( group + " apect_ratio " , aspectRatio ) ;
settings . setValue ( group + " maintain_apect_ratio " , maintainAspectRatio ) ;
settings . setValue ( group + " axis_apect_ratio " , axisAspectRatio ) ;
settings . setValue ( group + " maintain_axis_apect_ratio " , maintainAxisAspectRatio ) ;
mathText . saveSettings ( settings , group + " math_text. " ) ;
xAxis - > saveSettings ( settings , group + " xaxis_ " ) ;
yAxis - > saveSettings ( settings , group + " yaxis_ " ) ;
saveUserSettings ( ) ;
}
const JKQTBasePlotterStyle & JKQTBasePlotter : : getCurrentPlotterStyle ( ) const
{
return plotterStyle ;
}
void JKQTBasePlotter : : setCurrentPlotterStyle ( const JKQTBasePlotterStyle & style )
{
plotterStyle = style ;
propagateStyle ( ) ;
}
void JKQTBasePlotter : : propagateStyle ( ) {
bool old = emitPlotSignals ;
emitPlotSignals = false ;
xAxis - > setCurrentAxisStyle ( plotterStyle . xAxisStyle ) ;
yAxis - > setCurrentAxisStyle ( plotterStyle . yAxisStyle ) ;
for ( int i = 0 ; i < graphs . size ( ) ; i + + ) {
JKQTPColorPaletteTools * palTools = dynamic_cast < JKQTPColorPaletteTools * > ( graphs [ i ] ) ;
if ( palTools ) {
palTools - > getColorBarRightAxis ( ) - > setCurrentAxisStyle ( plotterStyle . rightColorbarAxisStyle ) ;
palTools - > getColorBarTopAxis ( ) - > setCurrentAxisStyle ( plotterStyle . topColorbarAxisStyle ) ;
2015-07-11 18:56:02 +08:00
}
2019-02-08 00:24:46 +08:00
JKQTPMathImage * matImg = dynamic_cast < JKQTPMathImage * > ( graphs [ i ] ) ;
if ( matImg ) {
matImg - > getColorBarRightAxis ( ) - > setCurrentAxisStyle ( plotterStyle . rightColorbarAxisStyle ) ;
matImg - > getColorBarTopAxis ( ) - > setCurrentAxisStyle ( plotterStyle . topColorbarAxisStyle ) ;
matImg - > getModifierColorBarRightAxis ( ) - > setCurrentAxisStyle ( plotterStyle . rightColorbarAxisStyle ) ;
matImg - > getModifierColorBarTopAxis ( ) - > setCurrentAxisStyle ( plotterStyle . topColorbarAxisStyle ) ;
}
JKQTPRGBMathImage * matImgRGB = dynamic_cast < JKQTPRGBMathImage * > ( graphs [ i ] ) ;
if ( matImgRGB ) {
matImgRGB - > getColorBarRightAxis ( ) - > setCurrentAxisStyle ( plotterStyle . rightColorbarAxisStyle ) ;
matImgRGB - > getColorBarTopAxis ( ) - > setCurrentAxisStyle ( plotterStyle . topColorbarAxisStyle ) ;
matImgRGB - > getColorBarRightAxisG ( ) - > setCurrentAxisStyle ( plotterStyle . rightColorbarAxisStyle ) ;
matImgRGB - > getColorBarTopAxisG ( ) - > setCurrentAxisStyle ( plotterStyle . topColorbarAxisStyle ) ;
matImgRGB - > getColorBarRightAxisB ( ) - > setCurrentAxisStyle ( plotterStyle . rightColorbarAxisStyle ) ;
matImgRGB - > getColorBarTopAxisB ( ) - > setCurrentAxisStyle ( plotterStyle . topColorbarAxisStyle ) ;
2015-07-11 18:56:02 +08:00
}
}
2019-02-08 00:24:46 +08:00
emitPlotSignals = old ;
if ( emitPlotSignals ) emit plotUpdated ( ) ;
}
2015-07-11 18:56:02 +08:00
2019-02-08 00:24:46 +08:00
void JKQTBasePlotter : : loadCurrentPlotterStyle ( const QSettings & settings , const QString & group )
{
plotterStyle . loadSettings ( settings , group ) ;
propagateStyle ( ) ;
}
2015-07-11 18:56:02 +08:00
2019-02-08 00:24:46 +08:00
void JKQTBasePlotter : : saveCurrentPlotterStyle ( QSettings & settings , const QString & group ) const
{
plotterStyle . saveSettings ( settings , group ) ;
2015-07-11 18:56:02 +08:00
}
2019-01-26 19:28:44 +08:00
void JKQTBasePlotter : : loadUserSettings ( const QSettings & settings , const QString & group ) {
2015-07-11 18:56:02 +08:00
currentSaveDirectory = settings . value ( group + " currentSaveDirectory " , currentSaveDirectory ) . toString ( ) ;
currentFileFormat = settings . value ( group + " currentFileFormat " , currentFileFormat ) . toString ( ) ;
currentDataFileFormat = settings . value ( group + " currentDataFileFormat " , currentFileFormat ) . toString ( ) ;
printZoomFactor = settings . value ( group + " printZoomFactor " , printZoomFactor ) . toDouble ( ) ;
printSizeX_Millimeter = settings . value ( group + " printSizeX " , printSizeX_Millimeter ) . toDouble ( ) ;
printSizeY_Millimeter = settings . value ( group + " printSizeY " , printSizeY_Millimeter ) . toDouble ( ) ;
printMagnification = settings . value ( group + " printMagnification " , printMagnification ) . toDouble ( ) ;
printSetAbsolutePageSize = settings . value ( group + " printSetAbsoluteSize " , printSetAbsolutePageSize ) . toBool ( ) ;
printAspect = settings . value ( group + " printAspect " , printAspect ) . toDouble ( ) ;
fontSizePrintMultiplier = settings . value ( group + " fontSizePrintMultiplier " , fontSizePrintMultiplier ) . toDouble ( ) ;
lineWidthPrintMultiplier = settings . value ( group + " lineWidthPrintMultiplier " , lineWidthPrintMultiplier ) . toDouble ( ) ;
printKeepAspect = settings . value ( group + " printKeepAspect " , printKeepAspect ) . toBool ( ) ;
exportUnitInMM = settings . value ( group + " exportUnitInMM " , exportUnitInMM ) . toBool ( ) ;
currentPrinter = settings . value ( group + " printer " , currentPrinter ) . toString ( ) ;
2019-02-08 00:24:46 +08:00
int count = settings . value ( group + " selections/count " , 0 ) . toInt ( ) ;
2015-07-11 18:56:02 +08:00
getDataColumnsByUserSaved . clear ( ) ;
for ( int i = 0 ; i < count ; i + + ) {
2019-01-26 19:28:44 +08:00
const QString itg = QString ( " item%1 " ) . arg ( i ) ;
2019-02-08 00:24:46 +08:00
QString n = settings . value ( group + " selections/ " + itg + " /name " , " " ) . toString ( ) ;
QStringList item = settings . value ( group + " selections/ " + itg + " /items " , QStringList ( ) ) . toStringList ( ) ;
2015-07-11 18:56:02 +08:00
if ( ! n . isEmpty ( ) ) {
getDataColumnsByUserSaved [ n ] = item ;
}
}
}
2019-01-26 19:28:44 +08:00
void JKQTBasePlotter : : saveUserSettings ( QSettings & settings , const QString & group ) const {
2015-07-11 18:56:02 +08:00
settings . setValue ( group + " printer " , currentPrinter ) ;
//qDebug()<<settings.fileName()<<group<<currentSaveDirectory<<QDir(currentSaveDirectory).absolutePath();
settings . setValue ( group + " currentSaveDirectory " , QDir ( currentSaveDirectory ) . absolutePath ( ) ) ;
settings . setValue ( group + " currentFileFormat " , currentFileFormat ) ;
settings . setValue ( group + " currentDataFileFormat " , currentDataFileFormat ) ;
settings . setValue ( group + " printZoomFactor " , printZoomFactor ) ;
settings . setValue ( group + " printSizeX " , printSizeX_Millimeter ) ;
settings . setValue ( group + " printSizeY " , printSizeY_Millimeter ) ;
settings . setValue ( group + " printMagnification " , printMagnification ) ;
settings . setValue ( group + " printSetAbsoluteSize " , printSetAbsolutePageSize ) ;
settings . setValue ( group + " printAspect " , printAspect ) ;
settings . setValue ( group + " printKeepAspect " , printKeepAspect ) ;
settings . setValue ( group + " fontSizePrintMultiplier " , fontSizePrintMultiplier ) ;
settings . setValue ( group + " lineWidthPrintMultiplier " , lineWidthPrintMultiplier ) ;
settings . setValue ( group + " exportUnitInMM " , exportUnitInMM ) ;
//settings.setValue(group+"", );
settings . beginGroup ( group + " selections " ) ;
QStringList keys = getDataColumnsByUserSaved . keys ( ) ;
settings . setValue ( " count " , keys . size ( ) ) ;
for ( int i = 0 ; i < keys . size ( ) ; i + + ) {
settings . beginGroup ( QString ( " item%1 " ) . arg ( i ) ) ;
settings . setValue ( " name " , keys [ i ] ) ;
settings . setValue ( " items " , getDataColumnsByUserSaved [ keys [ i ] ] ) ;
settings . endGroup ( ) ;
}
settings . endGroup ( ) ;
}
2019-01-26 19:28:44 +08:00
void JKQTBasePlotter : : loadSettings ( const QSettings & settings , const QString & group ) {
2015-07-11 18:56:02 +08:00
QString g = group + " / " ;
if ( group . isEmpty ( ) ) g = " " ;
2019-02-08 00:24:46 +08:00
plotterStyle . loadSettings ( settings , group ) ;
propagateStyle ( ) ;
2015-07-11 18:56:02 +08:00
aspectRatio = settings . value ( g + " apect_ratio " , aspectRatio ) . toDouble ( ) ;
maintainAspectRatio = settings . value ( g + " maintain_apect_ratio " , maintainAspectRatio ) . toBool ( ) ;
axisAspectRatio = settings . value ( g + " axis_apect_ratio " , axisAspectRatio ) . toDouble ( ) ;
maintainAxisAspectRatio = settings . value ( g + " maintain_axis_apect_ratio " , maintainAxisAspectRatio ) . toBool ( ) ;
2019-02-08 00:24:46 +08:00
mathText . loadSettings ( settings , g + " math_text/ " ) ;
2015-07-11 18:56:02 +08:00
xAxis - > loadSettings ( settings , g + " xaxis_ " ) ;
yAxis - > loadSettings ( settings , g + " yaxis_ " ) ;
loadUserSettings ( ) ;
if ( emitPlotSignals ) emit plotUpdated ( ) ;
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : setXY ( double xminn , double xmaxx , double yminn , double ymaxx ) {
2015-07-11 18:56:02 +08:00
xAxis - > setRange ( xminn , xmaxx ) ;
yAxis - > setRange ( yminn , ymaxx ) ;
if ( maintainAxisAspectRatio ) {
double mid = ( yAxis - > getMax ( ) + yAxis - > getMin ( ) ) / 2.0 ;
double w = fabs ( xmaxx - xminn ) / axisAspectRatio ;
yAxis - > setRange ( mid - w / 2.0 , mid + w / 2.0 ) ;
}
2019-02-03 21:04:48 +08:00
if ( emitSignals ) emit zoomChangedLocally ( xAxis - > getMin ( ) , xAxis - > getMax ( ) , yAxis - > getMin ( ) , yAxis - > getMax ( ) , this ) ;
2015-07-11 18:56:02 +08:00
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : setX ( double xminn , double xmaxx ) {
2015-07-11 18:56:02 +08:00
xAxis - > setRange ( xminn , xmaxx ) ;
if ( maintainAxisAspectRatio ) {
double mid = ( yAxis - > getMax ( ) + yAxis - > getMin ( ) ) / 2.0 ;
double w = fabs ( xmaxx - xminn ) / axisAspectRatio ;
yAxis - > setRange ( mid - w / 2.0 , mid + w / 2.0 ) ;
}
2019-02-03 21:04:48 +08:00
if ( emitSignals ) emit zoomChangedLocally ( xAxis - > getMin ( ) , xAxis - > getMax ( ) , yAxis - > getMin ( ) , yAxis - > getMax ( ) , this ) ;
2015-07-11 18:56:02 +08:00
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : setY ( double yminn , double ymaxx ) {
2015-07-11 18:56:02 +08:00
yAxis - > setRange ( yminn , ymaxx ) ;
if ( maintainAxisAspectRatio ) {
double mid = ( xAxis - > getMax ( ) + xAxis - > getMin ( ) ) / 2.0 ;
double w = fabs ( ymaxx - yminn ) * axisAspectRatio ;
xAxis - > setRange ( mid - w / 2.0 , mid + w / 2.0 ) ;
}
2019-02-03 21:04:48 +08:00
if ( emitSignals ) emit zoomChangedLocally ( xAxis - > getMin ( ) , xAxis - > getMax ( ) , yAxis - > getMin ( ) , yAxis - > getMax ( ) , this ) ;
2015-07-11 18:56:02 +08:00
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : setAbsoluteX ( double xminn , double xmaxx ) {
2015-07-11 18:56:02 +08:00
xAxis - > setAbsoluteRange ( xminn , xmaxx ) ;
2019-02-03 21:04:48 +08:00
if ( emitSignals ) emit zoomChangedLocally ( xAxis - > getMin ( ) , xAxis - > getMax ( ) , yAxis - > getMin ( ) , yAxis - > getMax ( ) , this ) ;
2015-07-11 18:56:02 +08:00
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : setAbsoluteY ( double yminn , double ymaxx ) {
2015-07-11 18:56:02 +08:00
yAxis - > setAbsoluteRange ( yminn , ymaxx ) ;
2019-02-03 21:04:48 +08:00
if ( emitSignals ) emit zoomChangedLocally ( xAxis - > getMin ( ) , xAxis - > getMax ( ) , yAxis - > getMin ( ) , yAxis - > getMax ( ) , this ) ;
2015-07-11 18:56:02 +08:00
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : setAbsoluteXY ( double xminn , double xmaxx , double yminn , double ymaxx ) {
2015-07-11 18:56:02 +08:00
xAxis - > setAbsoluteRange ( xminn , xmaxx ) ;
yAxis - > setAbsoluteRange ( yminn , ymaxx ) ;
2019-02-03 21:04:48 +08:00
if ( emitSignals ) emit zoomChangedLocally ( xAxis - > getMin ( ) , xAxis - > getMax ( ) , yAxis - > getMin ( ) , yAxis - > getMax ( ) , this ) ;
2015-07-11 18:56:02 +08:00
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : calcPlotScaling ( JKQTPEnhancedPainter & painter ) {
2015-07-11 18:56:02 +08:00
# ifdef JKQTBP_AUTOTIMER
2019-01-20 17:49:29 +08:00
JKQTPAutoOutputTimer jkaat ( QString ( " JKQTBasePlotter[%1]::calcPlotScaling() " ).arg(objectName())) ;
2015-07-11 18:56:02 +08:00
# endif
2019-02-03 21:04:48 +08:00
//qDebug()<<"this="<<this<<" --> calcPlotScaling()";
2015-07-11 18:56:02 +08:00
if ( emitSignals ) emit beforePlotScalingRecalculate ( ) ;
2019-01-26 03:16:04 +08:00
//qDebug()<<"start JKQTBasePlotter::calcPlotScaling";
2015-07-11 18:56:02 +08:00
// if the key is plotted outside , then we have to add place for it (i.e. change the plotBorders
2019-02-08 00:24:46 +08:00
internalPlotBorderBottom = plotterStyle . plotBorderBottom ;
internalPlotBorderLeft = plotterStyle . plotBorderLeft ;
internalPlotBorderRight = plotterStyle . plotBorderRight ;
internalPlotBorderTop = plotterStyle . plotBorderTop ;
internalTitleHeight = 0 ;
2015-07-11 18:56:02 +08:00
if ( ! plotLabel . isEmpty ( ) ) {
2019-02-08 00:24:46 +08:00
QSizeF s = getTextSizeSize ( plotterStyle . plotLabelFontName , plotterStyle . plotLabelFontSize * fontSizeMultiplier , plotLabel , painter ) ;
internalPlotBorderTop + = s . height ( ) * 1.2 ;
internalTitleHeight = s . height ( ) * 1.2 ;
2015-07-11 18:56:02 +08:00
}
double keyWidth , keyHeight ;
QFont f = painter . font ( ) ;
2019-02-08 00:24:46 +08:00
f . setFamily ( plotterStyle . defaultFontName ) ;
f . setPointSizeF ( plotterStyle . keyStyle . fontSize * fontSizeMultiplier ) ;
2015-07-11 18:56:02 +08:00
QFontMetricsF kfm ( f ) ;
getKeyExtent ( painter , & keyWidth , & keyHeight ) ;
2019-02-08 00:24:46 +08:00
internalPlotKeyBorderTop = 0 ;
internalPlotKeyBorderBottom = 0 ;
internalPlotKeyBorderLeft = 0 ;
internalPlotKeyBorderRight = 0 ;
if ( plotterStyle . keyStyle . position = = JKQTPKeyOutsideTopRight ) {
internalPlotKeyBorderTop = keyHeight + 2 * plotterStyle . keyStyle . yMargin * kfm . width ( ' X ' ) + ceil ( 2 * plotterStyle . keyStyle . frameWidth ) + plotterStyle . keyStyle . yOffset * kfm . width ( ' X ' ) + 2 ;
internalPlotBorderTop = internalPlotBorderTop + internalPlotKeyBorderTop ;
} else if ( plotterStyle . keyStyle . position = = JKQTPKeyOutsideTopLeft ) {
internalPlotKeyBorderTop = keyHeight + 2 * plotterStyle . keyStyle . yMargin * kfm . width ( ' X ' ) + ceil ( 2 * plotterStyle . keyStyle . frameWidth ) + plotterStyle . keyStyle . yOffset * kfm . width ( ' X ' ) + 2 ;
internalPlotBorderTop = internalPlotBorderTop + internalPlotKeyBorderTop ;
} else if ( plotterStyle . keyStyle . position = = JKQTPKeyOutsideLeftTop ) {
internalPlotKeyBorderLeft = keyWidth + 2 * plotterStyle . keyStyle . xMargin * kfm . width ( ' X ' ) + ceil ( 2 * plotterStyle . keyStyle . frameWidth ) + plotterStyle . keyStyle . xOffset * kfm . width ( ' X ' ) + 2 ;
internalPlotBorderLeft = internalPlotBorderLeft + internalPlotKeyBorderLeft ;
} else if ( plotterStyle . keyStyle . position = = JKQTPKeyOutsideLeftBottom ) {
internalPlotKeyBorderLeft = keyWidth + 2 * plotterStyle . keyStyle . xMargin * kfm . width ( ' X ' ) + ceil ( 2 * plotterStyle . keyStyle . frameWidth ) + plotterStyle . keyStyle . xOffset * kfm . width ( ' X ' ) + 2 ;
internalPlotBorderLeft = internalPlotBorderLeft + internalPlotKeyBorderLeft ;
} else if ( plotterStyle . keyStyle . position = = JKQTPKeyOutsideBottomRight ) {
internalPlotKeyBorderBottom = keyHeight + 2 * plotterStyle . keyStyle . yMargin * kfm . width ( ' X ' ) + ceil ( 2 * plotterStyle . keyStyle . frameWidth ) + plotterStyle . keyStyle . yOffset * kfm . width ( ' X ' ) + 2 ;
internalPlotBorderBottom = internalPlotBorderBottom + internalPlotKeyBorderBottom ;
} else if ( plotterStyle . keyStyle . position = = JKQTPKeyOutsideBottomLeft ) {
internalPlotKeyBorderBottom = keyHeight + 2 * plotterStyle . keyStyle . yMargin * kfm . width ( ' X ' ) + ceil ( 2 * plotterStyle . keyStyle . frameWidth ) + plotterStyle . keyStyle . yOffset * kfm . width ( ' X ' ) + 2 ;
internalPlotBorderBottom = internalPlotBorderBottom + internalPlotKeyBorderBottom ;
} else if ( plotterStyle . keyStyle . position = = JKQTPKeyOutsideRightTop ) {
internalPlotKeyBorderRight = keyWidth + 2 * plotterStyle . keyStyle . xMargin * kfm . width ( ' X ' ) + ceil ( 2 * plotterStyle . keyStyle . frameWidth ) + plotterStyle . keyStyle . xOffset * kfm . width ( ' X ' ) + 2 ;
internalPlotBorderRight = internalPlotBorderRight + internalPlotKeyBorderRight ;
} else if ( plotterStyle . keyStyle . position = = JKQTPKeyOutsideRightBottom ) {
internalPlotKeyBorderRight = keyWidth + 2 * plotterStyle . keyStyle . xMargin * kfm . width ( ' X ' ) + ceil ( 2 * plotterStyle . keyStyle . frameWidth ) + plotterStyle . keyStyle . xOffset * kfm . width ( ' X ' ) + 2 ;
internalPlotBorderRight = internalPlotBorderRight + internalPlotKeyBorderRight ;
2015-07-11 18:56:02 +08:00
}
/*if (displayMousePosition) {
QFontMetrics fm = fontMetrics ( ) ;
QString test = " <EFBFBD> Aquator" ;
int labelHeight = fm . size ( Qt : : TextSingleLine , test ) . height ( ) * 1.5 ;
2018-11-18 18:59:30 +08:00
//if (mousePosLabel!=nullptr) labelHeight=mousePosLabel->height();
2019-02-08 00:24:46 +08:00
internalPlotBorderTop = internalPlotBorderTop + ( labelHeight - plotBorderTop ) * 1.1 ;
2015-07-11 18:56:02 +08:00
} */
// read additional size required for coordinate axes
QSizeF s = xAxis - > getSize1 ( painter ) ;
2019-02-08 00:24:46 +08:00
internalPlotBorderBottom + = s . height ( ) ;
2015-07-11 18:56:02 +08:00
s = xAxis - > getSize2 ( painter ) ;
2019-02-08 00:24:46 +08:00
internalPlotBorderTop + = s . height ( ) ;
2015-07-11 18:56:02 +08:00
s = yAxis - > getSize1 ( painter ) ;
2019-02-08 00:24:46 +08:00
internalPlotBorderLeft + = s . width ( ) ;
2015-07-11 18:56:02 +08:00
s = yAxis - > getSize2 ( painter ) ;
2019-02-08 00:24:46 +08:00
internalPlotBorderRight + = s . width ( ) ;
2015-07-11 18:56:02 +08:00
2019-02-08 00:24:46 +08:00
internalPlotBorderTop_notIncludingOutsidePlotSections = internalPlotBorderTop ;
internalPlotBorderLeft_notIncludingOutsidePlotSections = internalPlotBorderLeft ;
internalPlotBorderBottom_notIncludingOutsidePlotSections = internalPlotBorderBottom ;
internalPlotBorderRight_notIncludingOutsidePlotSections = internalPlotBorderRight ;
2015-07-11 18:56:02 +08:00
// read additional space required by graphs
for ( int i = 0 ; i < graphs . size ( ) ; i + + ) {
2019-02-03 21:04:48 +08:00
if ( graphs [ i ] - > isVisible ( ) ) {
2015-07-11 18:56:02 +08:00
int leftSpace , rightSpace , topSpace , bottomSpace ;
graphs [ i ] - > getOutsideSize ( painter , leftSpace , rightSpace , topSpace , bottomSpace ) ;
2019-02-08 00:24:46 +08:00
internalPlotBorderBottom + = bottomSpace ;
internalPlotBorderTop + = topSpace ;
internalPlotBorderLeft + = leftSpace ;
internalPlotBorderRight + = rightSpace ;
2015-07-11 18:56:02 +08:00
}
}
2019-01-26 03:16:04 +08:00
//qDebug()<<" end JKQTBasePlotter::calcPlotScaling";
2015-07-11 18:56:02 +08:00
// synchronize to a master-plotter
2019-02-03 21:04:48 +08:00
if ( masterPlotterX ) {
2015-07-11 18:56:02 +08:00
if ( masterSynchronizeWidth ) {
2019-02-08 00:24:46 +08:00
internalPlotBorderLeft = masterPlotterX - > internalPlotBorderLeft ;
internalPlotBorderRight = masterPlotterX - > internalPlotBorderRight ;
2015-07-11 18:56:02 +08:00
}
2019-02-03 21:04:48 +08:00
}
if ( masterPlotterY ) {
2015-07-11 18:56:02 +08:00
if ( masterSynchronizeHeight ) {
2019-02-08 00:24:46 +08:00
internalPlotBorderTop = masterPlotterY - > internalPlotBorderTop ;
internalPlotBorderBottom = masterPlotterY - > internalPlotBorderBottom ;
2015-07-11 18:56:02 +08:00
}
}
// first we calculate the width and height of the plot from the widget dimensions and
// the supplied border sizes
2019-02-08 00:24:46 +08:00
internalPlotWidth = widgetWidth / paintMagnification - internalPlotBorderLeft - internalPlotBorderRight ;
internalPlotHeight = widgetHeight / paintMagnification - internalPlotBorderTop - internalPlotBorderBottom ;
2015-07-11 18:56:02 +08:00
////////////////////////////////////////////////////////////////////
// ENSURE ASPECT RATIO (if activated)
////////////////////////////////////////////////////////////////////
if ( maintainAspectRatio & & ( ! xAxis - > isLogAxis ( ) ) & & ( ! xAxis - > isLogAxis ( ) ) ) {
2019-02-08 00:24:46 +08:00
double currRatio = static_cast < double > ( internalPlotWidth ) / static_cast < double > ( internalPlotHeight ) ;
double newPlotWidth = internalPlotWidth ;
double newPlotHeight = internalPlotHeight ;
2015-07-11 18:56:02 +08:00
double dx = 0 ;
double dy = 0 ;
if ( currRatio ! = aspectRatio ) {
if ( aspectRatio > = currRatio ) {
2019-02-08 00:24:46 +08:00
newPlotWidth = aspectRatio * static_cast < double > ( internalPlotHeight ) ;
2015-07-11 18:56:02 +08:00
} else {
2019-02-08 00:24:46 +08:00
newPlotHeight = static_cast < double > ( internalPlotWidth ) / aspectRatio ;
2015-07-11 18:56:02 +08:00
}
2019-02-08 00:24:46 +08:00
dx = internalPlotWidth - newPlotWidth ;
dy = internalPlotHeight - newPlotHeight ;
2015-07-11 18:56:02 +08:00
if ( dx < 0 ) {
2019-02-08 00:24:46 +08:00
newPlotWidth = internalPlotWidth ;
newPlotHeight = static_cast < double > ( internalPlotWidth ) / aspectRatio ;
2015-07-11 18:56:02 +08:00
} else if ( dy < 0 ) {
2019-02-08 00:24:46 +08:00
newPlotWidth = aspectRatio * static_cast < double > ( internalPlotHeight ) ;
newPlotHeight = internalPlotHeight ;
2015-07-11 18:56:02 +08:00
}
2019-02-08 00:24:46 +08:00
dx = internalPlotWidth - newPlotWidth ;
dy = internalPlotHeight - newPlotHeight ;
2015-07-11 18:56:02 +08:00
if ( ( dx < 0 ) | | ( dy < 0 ) ) {
2019-02-08 00:24:46 +08:00
newPlotWidth = internalPlotWidth ;
newPlotHeight = internalPlotHeight ;
2015-07-11 18:56:02 +08:00
}
}
2019-02-08 00:24:46 +08:00
//if (newPlotWidth>widgetWidth-internalPlotBorderLeft-internalPlotBorderRight) newPlotWidth=widgetWidth-internalPlotBorderLeft-internalPlotBorderRight;
//if (newPlotHeight>widgetHeight-internalPlotBorderTop-internalPlotBorderBottom) newPlotHeight=widgetHeight-internalPlotBorderTop-internalPlotBorderBottom;
dx = internalPlotWidth - newPlotWidth ;
dy = internalPlotHeight - newPlotHeight ;
internalPlotBorderBottom + = dy / 2.0 ;
internalPlotBorderTop + = dy / 2.0 ;
internalPlotBorderLeft + = dx / 2.0 ;
internalPlotBorderRight + = dx / 2.0 ;
internalPlotWidth = widgetWidth / paintMagnification - internalPlotBorderLeft - internalPlotBorderRight ;
internalPlotHeight = widgetHeight / paintMagnification - internalPlotBorderTop - internalPlotBorderBottom ;
2015-07-11 18:56:02 +08:00
}
xAxis - > calcPlotScaling ( true ) ;
yAxis - > calcPlotScaling ( true ) ;
////////////////////////////////////////////////////////////////////
// ENSURE ASPECT RATIO OF PLOT 1x1 PIXELS (if activated)
////////////////////////////////////////////////////////////////////
if ( maintainAxisAspectRatio & & ( ! xAxis - > isLogAxis ( ) ) & & ( ! xAxis - > isLogAxis ( ) ) ) {
double cplotWidth = fabs ( xAxis - > getMax ( ) - xAxis - > getMin ( ) ) ;
double newPlotWidth = cplotWidth ;
double xmid = ( xAxis - > getMax ( ) + xAxis - > getMin ( ) ) / 2.0 ;
double cplotHeight = fabs ( yAxis - > getMax ( ) - yAxis - > getMin ( ) ) ;
double newPlotHeight = cplotHeight ;
double ymid = ( yAxis - > getMax ( ) + yAxis - > getMin ( ) ) / 2.0 ;
double currRatio = fabs ( cplotWidth / cplotHeight ) ;
if ( currRatio ! = axisAspectRatio ) {
//if (axisAspectRatio<=currRatio) {
newPlotWidth = axisAspectRatio * cplotHeight ;
//} else {
// newPlotHeight=cplotWidth/axisAspectRatio;
//}
}
xAxis - > setRange ( xmid - newPlotWidth / 2.0 , xmid + newPlotWidth / 2.0 ) ;
yAxis - > setRange ( ymid - newPlotHeight / 2.0 , ymid + newPlotHeight / 2.0 ) ;
xAxis - > calcPlotScaling ( true ) ;
yAxis - > calcPlotScaling ( true ) ;
}
2019-02-03 21:04:48 +08:00
//if (emitPlotSignals) emit plotScalingRecalculated();
emit plotScalingRecalculated ( ) ;
2015-07-11 18:56:02 +08:00
}
2019-02-08 00:24:46 +08:00
void JKQTBasePlotter : : drawSystemGrid ( JKQTPEnhancedPainter & painter ) {
2015-07-11 18:56:02 +08:00
# ifdef JKQTBP_AUTOTIMER
2019-02-08 00:24:46 +08:00
JKQTPAutoOutputTimer jkaaot ( " JKQTBasePlotter::drawSystemGrid " ) ;
2015-07-11 18:56:02 +08:00
# endif
2019-02-08 00:24:46 +08:00
//qDebug()<<"start JKQTBasePlotter::drawSystemGrid";
2015-07-11 18:56:02 +08:00
xAxis - > drawGrids ( painter ) ;
yAxis - > drawGrids ( painter ) ;
2019-02-08 00:24:46 +08:00
//qDebug()<<" end JKQTBasePlotter::drawSystemGrid";
2015-07-11 18:56:02 +08:00
}
2019-02-08 00:24:46 +08:00
void JKQTBasePlotter : : drawSystemXAxis ( JKQTPEnhancedPainter & painter ) {
2015-07-11 18:56:02 +08:00
# ifdef JKQTBP_AUTOTIMER
2019-02-08 00:24:46 +08:00
JKQTPAutoOutputTimer jkaaot ( " JKQTBasePlotter::drawSystemXAxis " ) ;
2015-07-11 18:56:02 +08:00
# endif
2019-02-08 00:24:46 +08:00
//qDebug()<<"start JKQTBasePlotter::drawSystemXAxis";
2015-07-11 18:56:02 +08:00
xAxis - > drawAxes ( painter ) ;
2019-02-08 00:24:46 +08:00
//qDebug()<<" end JKQTBasePlotter::drawSystemXAxis";
2015-07-11 18:56:02 +08:00
}
2019-02-08 00:24:46 +08:00
void JKQTBasePlotter : : drawSystemYAxis ( JKQTPEnhancedPainter & painter ) {
2015-07-11 18:56:02 +08:00
# ifdef JKQTBP_AUTOTIMER
2019-02-08 00:24:46 +08:00
JKQTPAutoOutputTimer jkaaot ( " JKQTBasePlotter::drawSystemYAxis " ) ;
2015-07-11 18:56:02 +08:00
# endif
2019-02-08 00:24:46 +08:00
//qDebug()<<"start JKQTBasePlotter::drawSystemYAxis";
2015-07-11 18:56:02 +08:00
yAxis - > drawAxes ( painter ) ;
2019-02-08 00:24:46 +08:00
//qDebug()<<" end JKQTBasePlotter::drawSystemYAxis";
2015-07-11 18:56:02 +08:00
}
2019-01-20 17:49:29 +08:00
JKQTBasePlotter : : JKQTPPen JKQTBasePlotter : : getPlotStyle ( int i ) const {
2015-07-11 18:56:02 +08:00
int colorI = - 1 ;
int styleI = 0 ;
2019-02-08 00:24:46 +08:00
int symbolI = 0 ;
int brushI = 0 ;
2015-07-11 18:56:02 +08:00
for ( int k = 0 ; k < = i ; k + + ) {
colorI + + ;
2019-02-08 00:24:46 +08:00
if ( colorI > = plotterStyle . defaultGraphColors . size ( ) ) {
2015-07-11 18:56:02 +08:00
styleI + + ;
2019-02-08 00:24:46 +08:00
brushI + + ;
2015-07-11 18:56:02 +08:00
colorI = 0 ;
2019-02-08 00:24:46 +08:00
if ( styleI > = plotterStyle . defaultGraphPenStyles . size ( ) ) styleI = 0 ;
if ( brushI > = plotterStyle . defaultGraphFillStyles . size ( ) ) brushI = 0 ;
}
symbolI + + ;
if ( symbolI > = plotterStyle . defaultGraphSymbols . size ( ) ) {
symbolI = 0 ;
2015-07-11 18:56:02 +08:00
}
}
JKQTPPen p ;
//std::cout<<"plotstyle "<<i<<std::endl;
//std::cout<<"color "<<colorI<<std::endl;
//std::cout<<"style "<<styleI<<std::endl;
2019-02-08 00:24:46 +08:00
p . setColor ( plotterStyle . defaultGraphColors [ colorI ] ) ;
p . setFillColor ( JKQTPGetDerivedColor ( plotterStyle . graphFillColorDerivationMode , p . color ( ) ) ) ;
p . setErrorColor ( JKQTPGetDerivedColor ( plotterStyle . graphErrorColorDerivationMode , p . color ( ) ) ) ;
p . setErrorFillColor ( JKQTPGetDerivedColor ( plotterStyle . graphErrorFillColorDerivationMode , p . errorColor ( ) ) ) ;
p . setWidthF ( qMax ( JKQTPlotterDrawinTools : : ABS_MIN_LINEWIDTH , plotterStyle . defaultGraphWidth ) ) ;
p . setErrorWidth ( qMax ( JKQTPlotterDrawinTools : : ABS_MIN_LINEWIDTH , plotterStyle . defaultGraphWidth ) ) ;
p . setSymbolSize ( qMax ( JKQTPlotterDrawinTools : : ABS_MIN_LINEWIDTH , plotterStyle . defaultGraphSymbolSize ) ) ;
2019-04-22 19:27:50 +08:00
p . setSymbolFillColor ( JKQTPGetDerivedColor ( plotterStyle . graphFillColorDerivationMode , p . color ( ) ) ) ;
2019-02-08 00:24:46 +08:00
p . setSymbolLineWidthF ( qMax ( JKQTPlotterDrawinTools : : ABS_MIN_LINEWIDTH , plotterStyle . defaultGraphSymbolLineWidth ) ) ;
p . setStyle ( plotterStyle . defaultGraphPenStyles [ styleI ] ) ;
2019-04-22 19:27:50 +08:00
p . setSymbolType ( plotterStyle . defaultGraphSymbols [ symbolI ] ) ;
2019-02-08 00:24:46 +08:00
p . setFillStyle ( plotterStyle . defaultGraphFillStyles [ brushI ] ) ;
p . setErrorFillStyle ( plotterStyle . defaultGraphFillStyles [ brushI ] ) ;
2015-07-11 18:56:02 +08:00
return p ;
}
2019-01-20 17:49:29 +08:00
int JKQTBasePlotter : : getNextStyle ( ) {
2015-07-11 18:56:02 +08:00
int res = 0 ;
while ( usedStyles . contains ( res ) ) res + + ;
//std::cout<<res<<std::endl;
usedStyles . push_back ( res ) ;
return res ;
} ;
2019-02-08 00:24:46 +08:00
void JKQTBasePlotter : : drawKey ( JKQTPEnhancedPainter & painter ) {
2015-07-11 18:56:02 +08:00
# ifdef JKQTBP_AUTOTIMER
2019-01-20 17:49:29 +08:00
JKQTPAutoOutputTimer jkaaot ( " JKQTBasePlotter::plotKey " ) ;
2015-07-11 18:56:02 +08:00
# endif
2019-01-26 03:16:04 +08:00
//qDebug()<<"start JKQTBasePlotter::plotKey";
2015-07-11 18:56:02 +08:00
2019-02-08 00:24:46 +08:00
QFont kf ( plotterStyle . defaultFontName , plotterStyle . keyStyle . fontSize * fontSizeMultiplier ) ;
2015-07-11 18:56:02 +08:00
QFontMetricsF kfm ( kf ) ;
// get the size of the key and if keyWidth>0 && keyHeight>0 draw the frame and the contents
double keyWidth = 0 ;
double keyHeight = 0 ;
getKeyExtent ( painter , & keyWidth , & keyHeight ) ;
2019-02-08 00:24:46 +08:00
double keyRectangleWidth = keyWidth + 2.0 * plotterStyle . keyStyle . xMargin * kfm . width ( ' X ' ) + 2.0 * plotterStyle . keyStyle . frameWidth * lineWidthPrintMultiplier ;
double keyRectangleHeight = keyHeight + 2.0 * plotterStyle . keyStyle . yMargin * kfm . width ( ' X ' ) + 2.0 * plotterStyle . keyStyle . frameWidth * lineWidthPrintMultiplier ;
2015-07-11 18:56:02 +08:00
if ( ( keyWidth > 0 ) & & ( keyHeight > 0 ) ) {
// key position
2019-02-08 00:24:46 +08:00
double x0 , y0 ; // Position without plotterStyle.keyStyle.xOffset/plotterStyle.keyStyle.yOffset
double x , y ; // position of the key rectangle (=x0+plotterStyle.keyStyle.xOffset, y0+plotterStyle.keyStyle.yOffset)
switch ( plotterStyle . keyStyle . position ) {
2019-01-20 17:49:29 +08:00
case JKQTPKeyOutsideTopRight :
2019-02-08 00:24:46 +08:00
x0 = internalPlotBorderLeft + internalPlotWidth + internalPlotBorderRight - keyRectangleWidth ;
x = x0 - plotterStyle . keyStyle . xOffset * kfm . width ( ' X ' ) ;
y0 = internalTitleHeight ;
y = y0 + plotterStyle . keyStyle . yOffset * kfm . width ( ' X ' ) ;
2015-07-11 18:56:02 +08:00
break ;
2019-01-20 17:49:29 +08:00
case JKQTPKeyOutsideTopLeft :
2019-02-08 00:24:46 +08:00
x0 = internalPlotBorderLeft ;
x = x0 + plotterStyle . keyStyle . xOffset * kfm . width ( ' X ' ) ;
y0 = internalTitleHeight ;
y = y0 + plotterStyle . keyStyle . yOffset * kfm . width ( ' X ' ) ;
2015-07-11 18:56:02 +08:00
break ;
2019-01-20 17:49:29 +08:00
case JKQTPKeyOutsideBottomRight :
2019-02-08 00:24:46 +08:00
x0 = internalPlotBorderLeft + internalPlotWidth - keyRectangleWidth ;
x = x0 - plotterStyle . keyStyle . xOffset * kfm . width ( ' X ' ) ;
y0 = internalPlotBorderTop + internalPlotHeight + internalPlotBorderBottom - keyRectangleHeight ;
y = y0 - plotterStyle . keyStyle . yOffset * kfm . width ( ' X ' ) ;
2015-07-11 18:56:02 +08:00
break ;
2019-01-20 17:49:29 +08:00
case JKQTPKeyOutsideBottomLeft :
2019-02-08 00:24:46 +08:00
x0 = internalPlotBorderLeft ;
x = x0 + plotterStyle . keyStyle . xOffset * kfm . width ( ' X ' ) ;
y0 = internalPlotBorderTop + internalPlotHeight + internalPlotBorderBottom - keyRectangleHeight ;
y = y0 - plotterStyle . keyStyle . yOffset * kfm . width ( ' X ' ) ;
2015-07-11 18:56:02 +08:00
break ;
2019-01-20 17:49:29 +08:00
case JKQTPKeyOutsideRightTop :
2019-02-08 00:24:46 +08:00
x0 = internalPlotBorderLeft + internalPlotWidth + internalPlotBorderRight - keyRectangleWidth ;
x = x0 - plotterStyle . keyStyle . xOffset * kfm . width ( ' X ' ) ;
y0 = internalPlotBorderTop ;
y = y0 + plotterStyle . keyStyle . yOffset * kfm . width ( ' X ' ) ;
2015-07-11 18:56:02 +08:00
break ;
2019-01-20 17:49:29 +08:00
case JKQTPKeyOutsideRightBottom :
2019-02-08 00:24:46 +08:00
x0 = internalPlotBorderLeft + internalPlotWidth + internalPlotBorderRight - keyRectangleWidth ;
x = x0 - plotterStyle . keyStyle . xOffset * kfm . width ( ' X ' ) ;
y0 = internalPlotBorderTop + internalPlotHeight - keyRectangleHeight ;
y = y0 - plotterStyle . keyStyle . yOffset * kfm . width ( ' X ' ) ;
2015-07-11 18:56:02 +08:00
break ;
2019-01-20 17:49:29 +08:00
case JKQTPKeyOutsideLeftTop :
2019-02-08 00:24:46 +08:00
x0 = 0 ;
x = x0 + plotterStyle . keyStyle . xOffset * kfm . width ( ' X ' ) ;
y0 = internalPlotBorderTop ;
y = y0 + plotterStyle . keyStyle . yOffset * kfm . width ( ' X ' ) ;
2015-07-11 18:56:02 +08:00
break ;
2019-01-20 17:49:29 +08:00
case JKQTPKeyOutsideLeftBottom :
2019-02-08 00:24:46 +08:00
x0 = 0 ;
x = x0 + plotterStyle . keyStyle . xOffset * kfm . width ( ' X ' ) ;
y0 = internalPlotBorderTop + internalPlotHeight - keyRectangleHeight ;
y = y0 - plotterStyle . keyStyle . yOffset * kfm . width ( ' X ' ) ;
2015-07-11 18:56:02 +08:00
break ;
2019-01-20 17:49:29 +08:00
case JKQTPKeyInsideBottomRight :
2019-02-08 00:24:46 +08:00
x0 = internalPlotBorderLeft + internalPlotWidth - keyRectangleWidth ;
x = x0 - plotterStyle . keyStyle . xOffset * kfm . width ( ' X ' ) ;
y0 = internalPlotBorderTop + internalPlotHeight - keyRectangleHeight ;
y = y0 - plotterStyle . keyStyle . yOffset * kfm . width ( ' X ' ) ;
2015-07-11 18:56:02 +08:00
break ;
2019-01-20 17:49:29 +08:00
case JKQTPKeyInsideBottomLeft :
2019-02-08 00:24:46 +08:00
x0 = internalPlotBorderLeft ;
x = x0 + plotterStyle . keyStyle . xOffset * kfm . width ( ' X ' ) ;
y0 = internalPlotBorderTop + internalPlotHeight - keyRectangleHeight ;
y = y0 - plotterStyle . keyStyle . yOffset * kfm . width ( ' X ' ) ;
2015-07-11 18:56:02 +08:00
break ;
2019-01-20 17:49:29 +08:00
case JKQTPKeyInsideTopLeft :
2019-02-08 00:24:46 +08:00
x0 = internalPlotBorderLeft ;
x = x0 + plotterStyle . keyStyle . xOffset * kfm . width ( ' X ' ) ;
y0 = internalPlotBorderTop ;
y = y0 + plotterStyle . keyStyle . yOffset * kfm . width ( ' X ' ) ;
2015-07-11 18:56:02 +08:00
break ;
2019-01-20 17:49:29 +08:00
case JKQTPKeyInsideTopRight :
2015-07-11 18:56:02 +08:00
default :
2019-02-08 00:24:46 +08:00
x0 = internalPlotBorderLeft + internalPlotWidth - keyRectangleWidth ;
x = x0 - plotterStyle . keyStyle . xOffset * kfm . width ( ' X ' ) ;
y0 = internalPlotBorderTop ;
y = y0 + plotterStyle . keyStyle . yOffset * kfm . width ( ' X ' ) ;
2015-07-11 18:56:02 +08:00
break ;
}
2019-02-08 00:24:46 +08:00
QRectF rectKey ;
{
// save old brushes and pens
painter . save ( ) ; auto __finalpaint = JKQTPFinally ( [ & painter ] ( ) { painter . restore ( ) ; } ) ;
QPen pf = painter . pen ( ) ;
QBrush bf = painter . brush ( ) ;
pf . setColor ( plotterStyle . keyStyle . frameColor ) ;
pf . setWidthF ( qMax ( JKQTPlotterDrawinTools : : ABS_MIN_LINEWIDTH , pt2px ( painter , plotterStyle . keyStyle . frameWidth * lineWidthMultiplier ) ) ) ;
pf . setStyle ( Qt : : SolidLine ) ;
bf . setColor ( plotterStyle . keyStyle . backgroundColor ) ;
bf . setStyle ( Qt : : SolidPattern ) ;
painter . setBrush ( bf ) ;
if ( ! plotterStyle . keyStyle . frameVisible ) {
QPen pff = pf ;
pff . setColor ( plotterStyle . keyStyle . backgroundColor ) ;
pff . setWidthF ( JKQTPlotterDrawinTools : : ABS_MIN_LINEWIDTH ) ;
painter . setPen ( pff ) ;
} else {
painter . setPen ( pf ) ;
}
2015-07-11 18:56:02 +08:00
2019-02-08 00:24:46 +08:00
rectKey = QRectF ( x , y , keyRectangleWidth , keyRectangleHeight ) ;
if ( plotterStyle . keyStyle . frameRounding < = 0 ) {
painter . drawRect ( rectKey ) ;
} else {
painter . drawRoundedRect ( rectKey , pt2px ( painter , plotterStyle . keyStyle . frameRounding ) , pt2px ( painter , plotterStyle . keyStyle . frameRounding ) ) ;
}
y = y + plotterStyle . keyStyle . yMargin * kfm . width ( ' X ' ) + plotterStyle . keyStyle . frameWidth * lineWidthMultiplier / 2.0 ;
x = x + plotterStyle . keyStyle . xMargin * kfm . width ( ' X ' ) + plotterStyle . keyStyle . frameWidth * lineWidthMultiplier / 2.0 ;
2015-07-11 18:56:02 +08:00
2019-02-08 00:24:46 +08:00
painter . setPen ( pf ) ;
2015-07-11 18:56:02 +08:00
2019-02-08 00:24:46 +08:00
if ( useClipping ) {
QRegion cregion ( x , y , keyRectangleWidth , keyRectangleHeight ) ;
painter . setClipping ( true ) ;
painter . setClipRegion ( cregion ) ;
painter . setClipping ( true ) ;
}
2015-07-11 18:56:02 +08:00
2019-02-08 00:24:46 +08:00
drawKeyContents ( painter , x , y , keyWidth , keyHeight ) ;
2015-07-11 18:56:02 +08:00
2019-02-08 00:24:46 +08:00
if ( useClipping ) painter . setClipping ( false ) ;
2015-07-11 18:56:02 +08:00
}
2019-02-08 00:24:46 +08:00
if ( plotterStyle . debugShowRegionBoxes ) {
painter . save ( ) ; auto __finalpaint = JKQTPFinally ( [ & painter ] ( ) { painter . restore ( ) ; } ) ;
QPen p ( " orange " ) ;
QColor col = p . color ( ) ; col . setAlphaF ( 0.8 ) ; p . setColor ( col ) ;
p . setWidthF ( plotterStyle . debugRegionLineWidth ) ;
p . setStyle ( Qt : : DashLine ) ;
painter . setPen ( p ) ;
painter . setBrush ( QBrush ( QColor ( Qt : : transparent ) ) ) ;
painter . drawRect ( rectKey ) ;
p . setStyle ( Qt : : SolidLine ) ;
painter . setPen ( p ) ;
painter . drawLine ( x0 , y0 , rectKey . x ( ) , rectKey . y ( ) ) ;
2015-07-11 18:56:02 +08:00
2019-02-08 00:24:46 +08:00
}
2015-07-11 18:56:02 +08:00
}
2019-02-08 00:24:46 +08:00
//qDebug()<<" end JKQTBasePlotter::plotKey";
2015-07-11 18:56:02 +08:00
}
2019-02-08 00:24:46 +08:00
void JKQTBasePlotter : : drawPlot ( JKQTPEnhancedPainter & painter , bool showOverlays ) {
2015-07-11 18:56:02 +08:00
# ifdef JKQTBP_AUTOTIMER
2019-01-20 17:49:29 +08:00
JKQTPAutoOutputTimer jkaaot ( " JKQTBasePlotter::paintPlot " ) ;
2015-07-11 18:56:02 +08:00
# endif
2019-01-26 03:16:04 +08:00
//qDebug()<<"start JKQTBasePlotter::paintPlot";
2015-07-11 18:56:02 +08:00
// draw background
2019-02-08 00:24:46 +08:00
{
painter . save ( ) ; auto __finalpaint = JKQTPFinally ( [ & painter ] ( ) { painter . restore ( ) ; } ) ;
painter . setPen ( plotterStyle . widgetBackgroundColor ) ;
if ( plotterStyle . widgetBackgroundColor ! = Qt : : transparent ) painter . fillRect ( QRectF ( 0 , 0 , widgetWidth / paintMagnification , widgetHeight / paintMagnification ) , QBrush ( plotterStyle . widgetBackgroundColor ) ) ;
}
QRectF rPlotBack ( internalPlotBorderLeft , internalPlotBorderTop , internalPlotWidth , internalPlotHeight ) ;
2015-07-11 18:56:02 +08:00
painter . setRenderHint ( JKQTPEnhancedPainter : : NonCosmeticDefaultPen , true ) ;
2019-02-08 00:24:46 +08:00
painter . setRenderHint ( JKQTPEnhancedPainter : : Antialiasing , plotterStyle . useAntiAliasingForSystem ) ;
painter . setRenderHint ( JKQTPEnhancedPainter : : TextAntialiasing , plotterStyle . useAntiAliasingForText ) ;
if ( plotterStyle . plotFrameVisible ) {
painter . save ( ) ; auto __finalpaint = JKQTPFinally ( [ & painter ] ( ) { painter . restore ( ) ; } ) ;
QPen p ( plotterStyle . plotFrameColor ) ;
p . setWidthF ( qMax ( JKQTPlotterDrawinTools : : ABS_MIN_LINEWIDTH , pt2px ( painter , plotterStyle . plotFrameWidth * lineWidthMultiplier ) ) ) ;
painter . setPen ( p ) ;
painter . setBrush ( QBrush ( plotterStyle . plotBackgroundColor ) ) ;
if ( plotterStyle . plotFrameRounding < = 0 ) {
painter . drawRect ( rPlotBack ) ;
} else {
painter . drawRoundedRect ( rPlotBack , pt2px ( painter , plotterStyle . plotFrameRounding ) , pt2px ( painter , plotterStyle . plotFrameRounding ) ) ;
}
} else {
painter . save ( ) ; auto __finalpaint = JKQTPFinally ( [ & painter ] ( ) { painter . restore ( ) ; } ) ;
painter . setBrush ( QBrush ( plotterStyle . plotBackgroundColor ) ) ;
QPen p ( plotterStyle . plotBackgroundColor ) ;
p . setWidthF ( 0 ) ;
painter . setPen ( p ) ;
if ( plotterStyle . plotFrameRounding < = 0 ) {
painter . drawRect ( rPlotBack ) ;
} else {
painter . drawRoundedRect ( rPlotBack , pt2px ( painter , plotterStyle . plotFrameRounding ) , pt2px ( painter , plotterStyle . plotFrameRounding ) ) ;
}
}
drawSystemGrid ( painter ) ;
2015-07-11 18:56:02 +08:00
if ( ! plotLabel . isEmpty ( ) ) {
2019-02-08 00:24:46 +08:00
mathText . setFontSize ( plotterStyle . plotLabelFontSize * fontSizeMultiplier ) ;
mathText . setFontRomanOrSpecial ( plotterStyle . plotLabelFontName ) ;
2015-07-11 18:56:02 +08:00
mathText . parse ( plotLabel ) ;
double a = 0 , d = 0 , so = 0 , w = 0 ;
2019-02-08 00:24:46 +08:00
getTextSizeDetail ( plotterStyle . plotLabelFontName , plotterStyle . plotLabelFontSize * fontSizeMultiplier , plotLabel , painter , w , a , d , so ) ;
2015-07-11 18:56:02 +08:00
QSizeF s = QSizeF ( w , a + d ) ;
2019-02-08 00:24:46 +08:00
mathText . draw ( painter , internalPlotBorderLeft + ( internalPlotWidth - s . width ( ) ) / 2.0 , plotterStyle . plotBorderTop + a * 1.2 ) ;
if ( plotterStyle . debugShowRegionBoxes ) {
painter . save ( ) ; auto __finalpaint = JKQTPFinally ( [ & painter ] ( ) { painter . restore ( ) ; } ) ;
QPen p ( " blue " ) ;
QColor col = p . color ( ) ; col . setAlphaF ( 0.8 ) ; p . setColor ( col ) ;
p . setWidthF ( plotterStyle . debugRegionLineWidth ) ;
painter . setBrush ( QBrush ( QColor ( Qt : : transparent ) ) ) ;
painter . setPen ( p ) ;
painter . drawRect ( internalPlotBorderLeft , plotterStyle . plotBorderTop , internalPlotWidth , s . height ( ) ) ;
}
}
painter . setRenderHint ( JKQTPEnhancedPainter : : Antialiasing , plotterStyle . useAntiAliasingForGraphs ) ;
painter . setRenderHint ( JKQTPEnhancedPainter : : TextAntialiasing , plotterStyle . useAntiAliasingForText ) ;
{
painter . save ( ) ; auto __finalpaint = JKQTPFinally ( [ & painter ] ( ) { painter . restore ( ) ; } ) ;
drawGraphs ( painter ) ;
}
painter . setRenderHint ( JKQTPEnhancedPainter : : Antialiasing , plotterStyle . useAntiAliasingForSystem ) ;
painter . setRenderHint ( JKQTPEnhancedPainter : : TextAntialiasing , plotterStyle . useAntiAliasingForText ) ;
drawSystemXAxis ( painter ) ;
drawSystemYAxis ( painter ) ;
painter . setRenderHint ( JKQTPEnhancedPainter : : Antialiasing , plotterStyle . useAntiAliasingForGraphs ) ;
painter . setRenderHint ( JKQTPEnhancedPainter : : TextAntialiasing , plotterStyle . useAntiAliasingForText ) ;
if ( plotterStyle . keyStyle . visible ) drawKey ( painter ) ;
painter . setRenderHint ( JKQTPEnhancedPainter : : TextAntialiasing , plotterStyle . useAntiAliasingForText ) ;
if ( showOverlays ) drawOverlaysWithHints ( painter ) ;
if ( plotterStyle . debugShowRegionBoxes ) {
painter . save ( ) ; auto __finalpaint = JKQTPFinally ( [ & painter ] ( ) { painter . restore ( ) ; } ) ;
QPen p ( " red " ) ;
QColor col = p . color ( ) ; col . setAlphaF ( 0.8 ) ; p . setColor ( col ) ;
p . setWidthF ( plotterStyle . debugRegionLineWidth ) ;
p . setStyle ( Qt : : DashLine ) ;
painter . setPen ( p ) ;
painter . setBrush ( QBrush ( QColor ( Qt : : transparent ) ) ) ;
painter . drawRect ( internalPlotBorderLeft , internalPlotBorderTop , internalPlotWidth , internalPlotHeight ) ;
p . setColor ( QColor ( " maroon " ) ) ;
col = p . color ( ) ; col . setAlphaF ( 0.8 ) ; p . setColor ( col ) ;
p . setWidthF ( plotterStyle . debugRegionLineWidth ) ;
p . setStyle ( Qt : : DotLine ) ;
painter . setPen ( p ) ;
painter . drawRect ( internalPlotBorderLeft_notIncludingOutsidePlotSections , internalPlotBorderTop_notIncludingOutsidePlotSections , widgetWidth - internalPlotBorderLeft_notIncludingOutsidePlotSections - internalPlotBorderRight_notIncludingOutsidePlotSections , widgetHeight - internalPlotBorderTop_notIncludingOutsidePlotSections - internalPlotBorderBottom_notIncludingOutsidePlotSections ) ;
p . setColor ( QColor ( " yellow " ) ) ;
col = p . color ( ) ; col . setAlphaF ( 0.8 ) ; p . setColor ( col ) ;
p . setWidthF ( plotterStyle . debugRegionLineWidth ) ;
p . setStyle ( Qt : : SolidLine ) ;
painter . setPen ( p ) ;
painter . drawRect ( 0 , 0 , widgetWidth , widgetHeight ) ;
}
2019-01-26 03:16:04 +08:00
//qDebug()<<" end JKQTBasePlotter::paintPlot";
2015-07-11 18:56:02 +08:00
}
2019-02-08 00:24:46 +08:00
void JKQTBasePlotter : : drawOverlaysWithHints ( JKQTPEnhancedPainter & painter ) {
2015-07-11 18:56:02 +08:00
painter . setRenderHint ( JKQTPEnhancedPainter : : NonCosmeticDefaultPen , true ) ;
2019-02-08 00:24:46 +08:00
painter . setRenderHint ( JKQTPEnhancedPainter : : Antialiasing , plotterStyle . useAntiAliasingForGraphs ) ;
painter . setRenderHint ( JKQTPEnhancedPainter : : TextAntialiasing , plotterStyle . useAntiAliasingForText ) ;
painter . save ( ) ; auto __finalpaint = JKQTPFinally ( [ & painter ] ( ) { painter . restore ( ) ; } ) ;
# ifdef JKQTBP_AUTOTIMER
JKQTPAutoOutputTimer jkaaot ( " JKQTBasePlotter::drawOverlaysWithHints " ) ;
# endif
if ( overlays . isEmpty ( ) ) return ;
if ( useClipping ) {
QRegion cregion ( internalPlotBorderLeft , internalPlotBorderTop , internalPlotWidth , internalPlotHeight ) ;
painter . setClipping ( true ) ;
painter . setClipRegion ( cregion ) ;
}
for ( int j = 0 ; j < overlays . size ( ) ; j + + ) {
JKQTPOverlayElement * g = overlays [ j ] ;
if ( g - > isVisible ( ) ) g - > draw ( painter ) ;
}
if ( useClipping ) {
painter . setClipping ( false ) ;
}
2015-07-11 18:56:02 +08:00
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : gridPrintingCalc ( ) {
2015-07-11 18:56:02 +08:00
gridPrintingRows . clear ( ) ;
gridPrintingColumns . clear ( ) ;
if ( ! gridPrinting ) {
gridPrintingSize = QSize ( widgetWidth / paintMagnification , widgetHeight / paintMagnification ) ;
gridPrintingRows . push_back ( widgetHeight / paintMagnification ) ;
gridPrintingColumns . push_back ( widgetWidth / paintMagnification ) ;
} else {
// first find min and max columns/rows
size_t cmin = gridPrintingCurrentX ;
size_t cmax = gridPrintingCurrentX ;
size_t rmin = gridPrintingCurrentY ;
size_t rmax = gridPrintingCurrentY ;
for ( int i = 0 ; i < gridPrintingList . size ( ) ; i + + ) {
size_t c = gridPrintingList [ i ] . x ;
size_t r = gridPrintingList [ i ] . y ;
if ( c < cmin ) cmin = c ;
if ( c > cmax ) cmax = c ;
if ( r < rmin ) rmin = r ;
if ( r > rmax ) rmax = r ;
}
// fill gridPrintingRows and gridPrintingColumns
for ( size_t i = 0 ; i < = cmax ; i + + ) { gridPrintingColumns . push_back ( 0 ) ; }
for ( size_t i = 0 ; i < = rmax ; i + + ) { gridPrintingRows . push_back ( 0 ) ; }
gridPrintingColumns [ gridPrintingCurrentX ] = widgetWidth / paintMagnification ;
gridPrintingRows [ gridPrintingCurrentY ] = widgetHeight / paintMagnification ;
for ( int i = 0 ; i < gridPrintingList . size ( ) ; i + + ) {
int cw = gridPrintingList [ i ] . plotter - > widgetWidth / paintMagnification ;
int ch = gridPrintingList [ i ] . plotter - > widgetHeight / paintMagnification ;
size_t c = gridPrintingList [ i ] . x ;
size_t r = gridPrintingList [ i ] . y ;
if ( cw > gridPrintingColumns [ c ] ) gridPrintingColumns [ c ] = cw ;
if ( ch > gridPrintingRows [ r ] ) gridPrintingRows [ r ] = ch ;
}
int w = 0 ;
int h = 0 ;
for ( int i = 0 ; i < gridPrintingColumns . size ( ) ; i + + ) { w + = gridPrintingColumns [ i ] ; } ;
for ( int i = 0 ; i < gridPrintingRows . size ( ) ; i + + ) { h + = gridPrintingRows [ i ] ; } ;
gridPrintingSize = QSize ( w , h ) ;
}
}
2019-02-08 00:24:46 +08:00
void JKQTBasePlotter : : gridPaint ( JKQTPEnhancedPainter & painter , QSizeF pageRect , bool showOverlays , bool scaleIfTooLarge , bool scaleIfTooSmall ) {
2015-07-11 18:56:02 +08:00
# ifdef JKQTBP_AUTOTIMER
2019-01-20 17:49:29 +08:00
JKQTPAutoOutputTimer jkaaot ( " JKQTBasePlotter::gridPaint " ) ;
2015-07-11 18:56:02 +08:00
# endif
calcPlotScaling ( painter ) ;
if ( ! gridPrinting ) {
2019-01-26 20:00:40 +08:00
double scale = static_cast < double > ( pageRect . width ( ) ) / static_cast < double > ( widgetWidth ) * paintMagnification ;
if ( /*(scale*static_cast<double>(widgetWidth)>static_cast<double>(pageRect.width())) ||*/ ( scale * static_cast < double > ( widgetHeight ) / paintMagnification > static_cast < double > ( pageRect . height ( ) ) ) & & scaleIfTooLarge ) {
scale = static_cast < double > ( pageRect . height ( ) ) / static_cast < double > ( widgetHeight ) * paintMagnification ;
2015-07-11 18:56:02 +08:00
}
if ( ! scaleIfTooSmall & & scale > 1.0 ) scale = 1.0 ;
if ( ! scaleIfTooLarge & & ! scaleIfTooSmall ) scale = 1.0 ;
# ifdef SHOW_JKQTPLOTTER_DEBUG
qDebug ( ) < < " gridPaint: scale= " < < scale ;
# endif
2019-02-08 00:24:46 +08:00
painter . save ( ) ; auto __finalpaint = JKQTPFinally ( [ & painter ] ( ) { painter . restore ( ) ; } ) ;
2015-07-11 18:56:02 +08:00
// scale the plot so it fits on the page
painter . scale ( scale , scale ) ;
2019-02-08 00:24:46 +08:00
drawPlot ( painter , showOverlays ) ;
2015-07-11 18:56:02 +08:00
} else {
QList < double > fsm , lwm , pm ;
QList < QColor > backg ;
for ( int i = 0 ; i < gridPrintingList . size ( ) ; i + + ) {
2019-01-26 03:16:04 +08:00
fsm . append ( gridPrintingList [ i ] . plotter - > getFontSizeMultiplier ( ) ) ;
lwm . append ( gridPrintingList [ i ] . plotter - > getLineWidthMultiplier ( ) ) ;
2019-01-26 20:00:40 +08:00
pm . append ( gridPrintingList [ i ] . plotter - > getPaintMagnification ( ) ) ;
2019-01-26 03:16:04 +08:00
backg . append ( gridPrintingList [ i ] . plotter - > getExportBackgroundColor ( ) ) ;
gridPrintingList [ i ] . plotter - > setFontSizeMultiplier ( fontSizeMultiplier ) ;
gridPrintingList [ i ] . plotter - > setLineWidthMultiplier ( lineWidthMultiplier ) ;
2019-01-26 20:00:40 +08:00
gridPrintingList [ i ] . plotter - > setPaintMagnification ( paintMagnification ) ;
2019-01-26 03:16:04 +08:00
gridPrintingList [ i ] . plotter - > setBackgroundColor ( gridPrintingList [ i ] . plotter - > getExportBackgroundColor ( ) ) ;
2015-07-11 18:56:02 +08:00
gridPrintingList [ i ] . plotter - > calcPlotScaling ( painter ) ;
}
gridPrintingCalc ( ) ; // ensure the grid plot has been calculated
// scale the plot so it fits on the page
2019-01-26 20:00:40 +08:00
double scale = static_cast < double > ( pageRect . width ( ) ) / static_cast < double > ( gridPrintingSize . width ( ) ) ;
if ( /*(scale*static_cast<double>(gridPrintingSize.width())>static_cast<double>(pageRect.width())) ||*/ ( scale * static_cast < double > ( gridPrintingSize . height ( ) ) > static_cast < double > ( pageRect . height ( ) ) ) & & scaleIfTooLarge ) {
scale = static_cast < double > ( pageRect . height ( ) ) / static_cast < double > ( gridPrintingSize . height ( ) ) ;
2015-07-11 18:56:02 +08:00
}
if ( ! scaleIfTooSmall & & scale > 1.0 ) scale = 1.0 ;
if ( ! scaleIfTooLarge & & ! scaleIfTooSmall ) scale = 1.0 ;
# ifdef SHOW_JKQTPLOTTER_DEBUG
qDebug ( ) < < " gridPaint: scale= " < < scale ;
# endif
2019-02-08 00:24:46 +08:00
painter . save ( ) ; auto __finalpaint = JKQTPFinally ( [ & painter ] ( ) { painter . restore ( ) ; } ) ;
2015-07-11 18:56:02 +08:00
painter . scale ( scale , scale ) ;
2019-02-08 00:24:46 +08:00
{
// plot this plotter
painter . save ( ) ; auto __finalpaint = JKQTPFinally ( [ & painter ] ( ) { painter . restore ( ) ; } ) ;
2015-07-11 18:56:02 +08:00
int t_x = 0 ;
int t_y = 0 ;
2019-02-08 00:24:46 +08:00
//std::cout<<"printing this ...\n";
for ( size_t i = 0 ; i < gridPrintingCurrentX ; i + + ) { t_x + = gridPrintingColumns [ i ] ; }
for ( size_t i = 0 ; i < gridPrintingCurrentY ; i + + ) { t_y + = gridPrintingRows [ i ] ; }
//std::cout<<"printing this @ "<<t_x<<", "<<t_y<<" ...\n";
2015-07-11 18:56:02 +08:00
painter . translate ( t_x , t_y ) ;
2019-02-08 00:24:46 +08:00
drawPlot ( painter , showOverlays ) ;
//std::cout<<"this printed ...\n";
// plot all the other plotters
for ( int i = 0 ; i < gridPrintingList . size ( ) ; i + + ) {
//std::cout<<"printing "<<i<<" ...\n";
painter . save ( ) ; auto __finalpaint = JKQTPFinally ( [ & painter ] ( ) { painter . restore ( ) ; } ) ;
int t_x = 0 ;
int t_y = 0 ;
//std::cout<<"printing "<<i<<" @g "<<gridPrintingList[i].x<<", "<<gridPrintingList[i].y<<" ...\n";
//std::cout<<"colrowlistsizes "<<gridPrintingColumns.size()<<", "<<gridPrintingRows.size()<<" ...\n";
for ( int j = 0 ; j < gridPrintingList [ i ] . x ; j + + ) { t_x + = gridPrintingColumns [ j ] ; }
for ( int j = 0 ; j < gridPrintingList [ i ] . y ; j + + ) { t_y + = gridPrintingRows [ j ] ; }
//std::cout<<"printing "<<i<<" @ "<<t_x<<", "<<t_y<<" ...\n";
painter . translate ( t_x , t_y ) ;
gridPrintingList [ i ] . plotter - > drawPlot ( painter , showOverlays ) ;
}
2015-07-11 18:56:02 +08:00
2019-02-08 00:24:46 +08:00
for ( int i = 0 ; i < gridPrintingList . size ( ) ; i + + ) {
gridPrintingList [ i ] . plotter - > setFontSizeMultiplier ( fsm [ i ] ) ;
gridPrintingList [ i ] . plotter - > setLineWidthMultiplier ( lwm [ i ] ) ;
gridPrintingList [ i ] . plotter - > setPaintMagnification ( pm [ i ] ) ;
gridPrintingList [ i ] . plotter - > setBackgroundColor ( backg [ i ] ) ;
gridPrintingList [ i ] . plotter - > redrawPlot ( ) ;
}
2015-07-11 18:56:02 +08:00
}
}
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : gridPaintOverlays ( JKQTPEnhancedPainter & painter , QSizeF pageRect )
2015-07-11 18:56:02 +08:00
{
if ( ! gridPrinting ) {
2019-01-26 20:00:40 +08:00
double scale = static_cast < double > ( pageRect . width ( ) ) / static_cast < double > ( widgetWidth ) * paintMagnification ;
if ( /*(scale*static_cast<double>(widgetWidth)/paintMagnification>static_cast<double>(pageRect.width())) ||*/ ( scale * static_cast < double > ( widgetHeight ) > static_cast < double > ( pageRect . height ( ) ) ) ) {
scale = static_cast < double > ( pageRect . height ( ) ) / static_cast < double > ( widgetHeight ) ;
2015-07-11 18:56:02 +08:00
}
2019-02-08 00:24:46 +08:00
painter . save ( ) ; auto __finalpaint = JKQTPFinally ( [ & painter ] ( ) { painter . restore ( ) ; } ) ;
2015-07-11 18:56:02 +08:00
// scale the plot so it fits on the page
painter . scale ( scale , scale ) ;
2019-02-08 00:24:46 +08:00
drawOverlaysWithHints ( painter ) ;
2015-07-11 18:56:02 +08:00
} else {
gridPrintingCalc ( ) ; // ensure the grid plot has been calculated
// scale the plot so it fits on the page
2019-01-26 20:00:40 +08:00
double scale = static_cast < double > ( pageRect . width ( ) ) / static_cast < double > ( gridPrintingSize . width ( ) ) ;
if ( /*(scale*static_cast<double>(gridPrintingSize.width())>static_cast<double>(pageRect.width())) ||*/ ( scale * static_cast < double > ( gridPrintingSize . height ( ) ) > static_cast < double > ( pageRect . height ( ) ) ) ) {
scale = static_cast < double > ( pageRect . height ( ) ) / static_cast < double > ( gridPrintingSize . height ( ) ) ;
2015-07-11 18:56:02 +08:00
}
2019-02-08 00:24:46 +08:00
painter . save ( ) ; auto __finalpaint = JKQTPFinally ( [ & painter ] ( ) { painter . restore ( ) ; } ) ;
2015-07-11 18:56:02 +08:00
painter . scale ( scale , scale ) ;
2019-02-08 00:24:46 +08:00
{
// plot this plotter
painter . save ( ) ; auto __finalpaint = JKQTPFinally ( [ & painter ] ( ) { painter . restore ( ) ; } ) ;
2015-07-11 18:56:02 +08:00
int t_x = 0 ;
int t_y = 0 ;
2019-02-08 00:24:46 +08:00
//std::cout<<"printing this ...\n";
for ( size_t i = 0 ; i < gridPrintingCurrentX ; i + + ) { t_x + = gridPrintingColumns [ i ] ; }
for ( size_t i = 0 ; i < gridPrintingCurrentY ; i + + ) { t_y + = gridPrintingRows [ i ] ; }
//std::cout<<"printing this @ "<<t_x<<", "<<t_y<<" ...\n";
2015-07-11 18:56:02 +08:00
painter . translate ( t_x , t_y ) ;
2019-02-08 00:24:46 +08:00
drawOverlaysWithHints ( painter ) ;
//std::cout<<"this printed ...\n";
// plot all the other plotters
for ( int i = 0 ; i < gridPrintingList . size ( ) ; i + + ) {
//std::cout<<"printing "<<i<<" ...\n";
painter . save ( ) ; auto __finalpaint = JKQTPFinally ( [ & painter ] ( ) { painter . restore ( ) ; } ) ;
int t_x = 0 ;
int t_y = 0 ;
//std::cout<<"printing "<<i<<" @g "<<gridPrintingList[i].x<<", "<<gridPrintingList[i].y<<" ...\n";
//std::cout<<"colrowlistsizes "<<gridPrintingColumns.size()<<", "<<gridPrintingRows.size()<<" ...\n";
for ( int j = 0 ; j < gridPrintingList [ i ] . x ; j + + ) { t_x + = gridPrintingColumns [ j ] ; }
for ( int j = 0 ; j < gridPrintingList [ i ] . y ; j + + ) { t_y + = gridPrintingRows [ j ] ; }
//std::cout<<"printing "<<i<<" @ "<<t_x<<", "<<t_y<<" ...\n";
painter . translate ( t_x , t_y ) ;
gridPrintingList [ i ] . plotter - > drawOverlaysWithHints ( painter ) ;
}
2015-07-11 18:56:02 +08:00
2019-02-08 00:24:46 +08:00
}
2015-07-11 18:56:02 +08:00
}
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : print ( QPrinter * printer , bool displayPreview ) {
2015-07-11 18:56:02 +08:00
loadUserSettings ( ) ;
QPrinter * p = printer ;
bool delP = false ;
// select a printer
2018-11-18 18:59:30 +08:00
if ( p = = nullptr ) {
2015-07-11 18:56:02 +08:00
p = new QPrinter ( ) ;
p - > setPrinterName ( currentPrinter ) ;
delP = true ;
2018-11-18 18:59:30 +08:00
QPrintDialog * dialog = new QPrintDialog ( p , nullptr ) ;
2015-07-11 18:56:02 +08:00
dialog - > setWindowTitle ( tr ( " Print Plot " ) ) ;
if ( dialog - > exec ( ) ! = QDialog : : Accepted ) {
delete p ;
2019-02-08 00:24:46 +08:00
delete dialog ;
2015-07-11 18:56:02 +08:00
return ;
}
currentPrinter = p - > printerName ( ) ;
2019-02-08 00:24:46 +08:00
delete dialog ;
2015-07-11 18:56:02 +08:00
}
p - > setPageMargins ( 10 , 10 , 10 , 10 , QPrinter : : Millimeter ) ;
if ( widgetWidth > widgetHeight ) {
p - > setOrientation ( QPrinter : : Landscape ) ;
} else {
p - > setOrientation ( QPrinter : : Portrait ) ;
}
printpreviewNew ( p , false , - 1.0 , - 1.0 , displayPreview ) ;
if ( delP ) delete p ;
saveUserSettings ( ) ;
}
2019-01-20 17:49:29 +08:00
bool JKQTBasePlotter : : printpreviewNew ( QPaintDevice * paintDevice , bool setAbsolutePaperSize , double printsizeX_inMM , double printsizeY_inMM , bool displayPreview ) {
2015-07-11 18:56:02 +08:00
QPrinter * printer = dynamic_cast < QPrinter * > ( paintDevice ) ;
QSvgGenerator * svg = dynamic_cast < QSvgGenerator * > ( paintDevice ) ;
double lw = lineWidthMultiplier ;
double fs = fontSizeMultiplier ;
double oldP = paintMagnification ;
2019-02-08 00:24:46 +08:00
QColor bc = plotterStyle . widgetBackgroundColor ;
plotterStyle . widgetBackgroundColor = plotterStyle . exportBackgroundColor ;
2015-07-11 18:56:02 +08:00
lineWidthMultiplier = lineWidthPrintMultiplier ;
fontSizeMultiplier = fontSizePrintMultiplier ;
2018-11-18 18:59:30 +08:00
exportPreviewLabel = nullptr ;
2015-07-11 18:56:02 +08:00
printMagnification = 1.0 ;
paintMagnification = 1.0 ;
gridPrintingCalc ( ) ;
2015-08-02 19:36:54 +08:00
//double resolution=paintDevice->logicalDpiX();
//if (printer) resolution=printer->resolution();
2015-07-11 18:56:02 +08:00
printAspect = gridPrintingSize . height ( ) / gridPrintingSize . width ( ) ;
if ( printer ) printPageSizeMM = printer - > pageRect ( QPrinter : : Millimeter ) . size ( ) ;
else printPageSizeMM = QSizeF ( paintDevice - > widthMM ( ) , paintDevice - > heightMM ( ) ) ;
2019-01-20 23:15:10 +08:00
printSizeX_Millimeter = double ( gridPrintingSize . width ( ) ) / 96.0 * 25.4 ; //double(resolution)*25.4; // convert current widget size in pt to millimeters, assuming 96dpi (default screen resolution)
2015-07-11 18:56:02 +08:00
printSizeY_Millimeter = double ( gridPrintingSize . height ( ) ) / 96.0 * 25.4 ; //double(resolution)*25.4;
if ( printsizeX_inMM > 0 ) printSizeX_Millimeter = printsizeX_inMM ;
if ( printsizeY_inMM > 0 ) printSizeY_Millimeter = printsizeY_inMM ;
bool startWithMagnification = false ;
if ( ! setAbsolutePaperSize ) {
if ( printSizeX_Millimeter > printPageSizeMM . width ( ) | | printSizeY_Millimeter > printPageSizeMM . height ( ) ) {
startWithMagnification = true ;
printMagnification = qMin ( printPageSizeMM . width ( ) / printSizeX_Millimeter , printPageSizeMM . height ( ) / printSizeY_Millimeter ) ;
}
}
printKeepAspect = true ;
printSetAbsolutePageSize = setAbsolutePaperSize ;
printKeepAbsoluteFontSizes = true ;
printScaleToPagesize = false ;
2018-11-18 18:59:30 +08:00
QDialog * dlg = new QDialog ( nullptr , Qt : : WindowMinMaxButtonsHint ) ;
2015-07-11 18:56:02 +08:00
dlg - > setSizeGripEnabled ( true ) ;
//printZoomFactor=0.95;
//printMagnification=1.5;
QGridLayout * layout = new QGridLayout ( ) ;
dlg - > setLayout ( layout ) ;
dlg - > setWindowTitle ( tr ( " Graph print/export preview ... " ) ) ;
2019-01-20 23:15:10 +08:00
dlg - > setWindowIcon ( QIcon ( " :/JKQTPlotter/jkqtp_exportprintpreview.png " ) ) ;
2015-07-11 18:56:02 +08:00
bool delPrinter = false ;
if ( svg ) {
printer = new QPrinter ( ) ;
printer - > setColorMode ( QPrinter : : Color ) ;
printer - > setOutputFormat ( QPrinter : : PdfFormat ) ;
printer - > setResolution ( svg - > logicalDpiX ( ) ) ;
printer - > setPageMargins ( 0 , 0 , 0 , 0 , QPrinter : : Millimeter ) ;
printer - > setColorMode ( QPrinter : : Color ) ;
delPrinter = true ;
} else if ( ! printer ) {
printer = new QPrinter ( ) ;
printer - > setOutputFormat ( QPrinter : : PdfFormat ) ;
printer - > setResolution ( paintDevice - > logicalDpiX ( ) ) ;
printer - > setPageMargins ( 0 , 0 , 0 , 0 , QPrinter : : Millimeter ) ;
printer - > setColorMode ( QPrinter : : Color ) ;
delPrinter = true ;
}
printPreview = new QPrintPreviewWidget ( printer , dlg ) ;
connect ( printPreview , SIGNAL ( paintRequested ( QPrinter * ) ) , this , SLOT ( printpreviewPaintRequestedNew ( QPrinter * ) ) ) ;
spinSizeX = new JKQTPEnhancedDoubleSpinBox ( dlg ) ;
spinSizeX - > setRange ( 10 , 100000 ) ;
spinSizeX - > setValue ( printSizeX_Millimeter ) ;
spinSizeX - > setSingleStep ( 10 ) ;
spinSizeX - > setDecimals ( 1 ) ;
spinSizeX - > setSuffix ( tr ( " mm " ) ) ;
spinSizeX - > setToolTip ( tr ( " set the size of the output in millimeters " ) ) ;
connect ( spinSizeX , SIGNAL ( valueChanged ( double ) ) , this , SLOT ( printpreviewSetSizeXNew ( double ) ) ) ;
connect ( spinSizeX , SIGNAL ( editingFinished ( ) ) , this , SLOT ( printpreviewUpdate ( ) ) ) ;
spinSizeY = new JKQTPEnhancedDoubleSpinBox ( dlg ) ;
spinSizeY - > setRange ( 10 , 100000 ) ;
spinSizeY - > setValue ( printSizeY_Millimeter ) ;
spinSizeY - > setSingleStep ( 10 ) ;
spinSizeY - > setDecimals ( 1 ) ;
spinSizeY - > setSuffix ( tr ( " mm " ) ) ;
spinSizeY - > setToolTip ( tr ( " set the size of the output in millimeters " ) ) ;
spinSizeY - > setEnabled ( false ) ;
connect ( spinSizeY , SIGNAL ( valueChanged ( double ) ) , this , SLOT ( printpreviewSetSizeYNew ( double ) ) ) ;
connect ( spinSizeY , SIGNAL ( editingFinished ( ) ) , this , SLOT ( printpreviewUpdate ( ) ) ) ;
QCheckBox * chkAspect = new QCheckBox ( tr ( " keep aspect ratio " ) , dlg ) ;
chkAspect - > setChecked ( true ) ;
chkAspect - > setToolTip ( tr ( " choose whether to keep the aspect ratio for the print/export, as on the screen. " ) ) ;
connect ( chkAspect , SIGNAL ( toggled ( bool ) ) , spinSizeY , SLOT ( setDisabled ( bool ) ) ) ;
connect ( chkAspect , SIGNAL ( toggled ( bool ) ) , this , SLOT ( printpreviewSetAspectRatio ( bool ) ) ) ;
if ( setAbsolutePaperSize ) {
layout - > addWidget ( new QLabel ( tr ( " paper/plot size: " ) ) , 0 , layout - > columnCount ( ) ) ;
} else if ( printer & & ! svg ) {
int y = layout - > columnCount ( ) ;
layout - > addWidget ( new QLabel ( tr ( " plot size: " ) ) , 0 , y ) ;
} else {
int y = layout - > columnCount ( ) ;
layout - > addWidget ( new QLabel ( tr ( " paper size: " ) ) , 1 , y ) ;
layout - > addWidget ( new QLabel ( tr ( " plot size: " ) ) , 0 , y ) ;
}
layout - > addWidget ( spinSizeX , 0 , layout - > columnCount ( ) ) ;
layout - > addWidget ( new QLabel ( tr ( " x " ) ) , 0 , layout - > columnCount ( ) ) ;
layout - > addWidget ( spinSizeY , 0 , layout - > columnCount ( ) ) ;
layout - > addWidget ( chkAspect , 0 , layout - > columnCount ( ) ) ;
if ( ! setAbsolutePaperSize & & printer & & ! svg ) {
if ( printer ) layout - > addWidget ( new QLabel ( tr ( " %1x%2 mm^2 " ) . arg ( printer - > pageRect ( QPrinter : : Millimeter ) . width ( ) ) . arg ( printer - > pageRect ( QPrinter : : Millimeter ) . height ( ) ) ) , 1 , layout - > columnCount ( ) - 4 , 1 , 4 ) ;
QCheckBox * chkSetMagnification = new QCheckBox ( tr ( " set by magnification: " ) , dlg ) ;
chkSetMagnification - > setChecked ( false ) ;
spinMagnification = new JKQTPEnhancedDoubleSpinBox ( dlg ) ;
spinMagnification - > setEnabled ( false ) ;
spinMagnification - > setRange ( 1 , 1000 ) ;
spinMagnification - > setValue ( printMagnification * 100.0 ) ;
spinMagnification - > setSingleStep ( 10 ) ;
spinMagnification - > setDecimals ( 0 ) ;
spinMagnification - > setSuffix ( tr ( " % " ) ) ;
spinMagnification - > setToolTip ( tr ( " use this to change the base size of the plot<br> "
" This will not change the size of the plot on<br> "
" the page, only it's appearance. A magn. of 100%<br> "
" will print the plot in the same proportions as<br> "
" on the screen, whereas 50% will use twice as much<br> "
" space for the plot, as on the screen. <i>This mainly<br> "
" influences the relative font size!</i> " ) ) ;
connect ( spinMagnification , SIGNAL ( valueChanged ( double ) ) , this , SLOT ( printpreviewSetMagnificationNew ( double ) ) ) ;
connect ( chkSetMagnification , SIGNAL ( toggled ( bool ) ) , spinMagnification , SLOT ( setEnabled ( bool ) ) ) ;
connect ( chkSetMagnification , SIGNAL ( toggled ( bool ) ) , spinSizeX , SLOT ( setDisabled ( bool ) ) ) ;
connect ( chkSetMagnification , SIGNAL ( toggled ( bool ) ) , spinSizeY , SLOT ( setDisabled ( bool ) ) ) ;
connect ( chkSetMagnification , SIGNAL ( toggled ( bool ) ) , chkAspect , SLOT ( setDisabled ( bool ) ) ) ;
connect ( spinMagnification , SIGNAL ( editingFinished ( ) ) , this , SLOT ( printpreviewUpdate ( ) ) ) ;
connect ( chkSetMagnification , SIGNAL ( toggled ( bool ) ) , this , SLOT ( printpreviewToggleMagnification ( bool ) ) ) ;
spinMagnification - > setEnabled ( startWithMagnification ) ;
chkSetMagnification - > setChecked ( startWithMagnification ) ;
layout - > addWidget ( chkSetMagnification , 0 , layout - > columnCount ( ) ) ;
layout - > addWidget ( spinMagnification , 0 , layout - > columnCount ( ) ) ;
}
JKQTPEnhancedDoubleSpinBox * spinLineWidthMult = new JKQTPEnhancedDoubleSpinBox ( dlg ) ;
spinLineWidthMult - > setRange ( 1 , 1000 ) ;
spinLineWidthMult - > setValue ( lineWidthPrintMultiplier * 100.0 ) ;
spinLineWidthMult - > setSingleStep ( 10 ) ;
spinLineWidthMult - > setDecimals ( 0 ) ;
spinLineWidthMult - > setSuffix ( tr ( " % " ) ) ;
spinLineWidthMult - > setToolTip ( tr ( " use this to change the relative width of the lines \n "
" in the exported/printed plot. " ) ) ;
connect ( spinLineWidthMult , SIGNAL ( editingFinished ( double ) ) , this , SLOT ( printpreviewSetLineWidthMultiplier ( double ) ) ) ;
QCheckBox * chkKeepAbsoluteFontSize = new QCheckBox ( tr ( " keep abs. fontsize " ) , dlg ) ;
chkKeepAbsoluteFontSize - > setChecked ( true ) ;
connect ( chkKeepAbsoluteFontSize , SIGNAL ( toggled ( bool ) ) , this , SLOT ( printpreviewSetKeepAbsFontsize ( bool ) ) ) ;
JKQTPEnhancedDoubleSpinBox * spinFontSizeMult = new JKQTPEnhancedDoubleSpinBox ( dlg ) ;
spinFontSizeMult - > setEnabled ( false ) ;
spinFontSizeMult - > setRange ( 1 , 1000 ) ;
spinFontSizeMult - > setValue ( fontSizePrintMultiplier * 100.0 ) ;
spinFontSizeMult - > setSingleStep ( 10 ) ;
spinFontSizeMult - > setDecimals ( 0 ) ;
spinFontSizeMult - > setSuffix ( tr ( " % " ) ) ;
spinFontSizeMult - > setToolTip ( tr ( " use this to change the relative size of the text fonts \n "
" in the exported/printed plot. " ) ) ;
connect ( spinFontSizeMult , SIGNAL ( editingFinished ( double ) ) , this , SLOT ( printpreviewSetFontSizeMultiplier ( double ) ) ) ;
connect ( chkKeepAbsoluteFontSize , SIGNAL ( toggled ( bool ) ) , spinFontSizeMult , SLOT ( setDisabled ( bool ) ) ) ;
layout - > addWidget ( new QLabel ( tr ( " linewidth mult.: " ) ) , 0 , layout - > columnCount ( ) ) ;
layout - > addWidget ( spinLineWidthMult , 0 , layout - > columnCount ( ) ) ;
int gpos = layout - > columnCount ( ) ;
layout - > addWidget ( chkKeepAbsoluteFontSize , 0 , gpos , 1 , 2 ) ;
layout - > addWidget ( new QLabel ( tr ( " font size mult.: " ) ) , 1 , gpos ) ;
layout - > addWidget ( spinFontSizeMult , 1 , gpos + 1 ) ;
layout - > addWidget ( new QWidget ( ) , 0 , layout - > columnCount ( ) ) ;
layout - > setColumnStretch ( layout - > columnCount ( ) - 1 , 1 ) ;
layout - > addWidget ( printPreview , layout - > rowCount ( ) , 0 , 1 , layout - > columnCount ( ) ) ;
QDialogButtonBox * buttonBox = new QDialogButtonBox ( QDialogButtonBox : : Ok | QDialogButtonBox : : Cancel ) ;
connect ( buttonBox , SIGNAL ( accepted ( ) ) , dlg , SLOT ( accept ( ) ) ) ;
connect ( buttonBox , SIGNAL ( rejected ( ) ) , dlg , SLOT ( reject ( ) ) ) ;
layout - > addWidget ( buttonBox , layout - > rowCount ( ) , 0 , 1 , layout - > columnCount ( ) ) ;
dlg - > resize ( 800 , 500 ) ;
bool res = false ;
if ( printer ) {
if ( ! displayPreview | | dlg - > exec ( ) = = QDialog : : Accepted ) {
qDebug ( ) < < svg < < printer < < delPrinter ;
if ( svg ) {
printpreviewPaintRequestedNew ( svg ) ;
} else if ( printer & & ! delPrinter ) {
if ( delPrinter ) {
printpreviewPaintRequestedNew ( paintDevice ) ;
} else {
printpreviewPaintRequestedNew ( printer ) ;
}
} else {
printpreviewPaintRequestedNew ( paintDevice ) ;
}
res = true ;
}
}
if ( ( svg | | delPrinter ) & & printer ) {
delete printer ;
}
delete dlg ;
2018-11-18 18:59:30 +08:00
printPreview = nullptr ;
2015-07-11 18:56:02 +08:00
lineWidthMultiplier = lw ;
fontSizeMultiplier = fs ;
2019-02-08 00:24:46 +08:00
plotterStyle . widgetBackgroundColor = bc ;
2015-07-11 18:56:02 +08:00
paintMagnification = oldP ;
2019-01-26 03:16:04 +08:00
mathText . setUseUnparsed ( false ) ;
2015-07-11 18:56:02 +08:00
return res ;
}
2019-01-20 17:49:29 +08:00
bool JKQTBasePlotter : : exportpreview ( QSizeF pageSize , bool unitIsMM ) {
2018-11-18 18:59:30 +08:00
printPreview = nullptr ;
2015-07-11 18:56:02 +08:00
printSizeX_Millimeter = pageSize . width ( ) ;
printSizeY_Millimeter = pageSize . height ( ) ;
printAspect = 1 ;
printKeepAspect = false ;
exportUnitInMM = unitIsMM ;
printSetAbsolutePageSize = true ;
printScaleToPagesize = false ;
printKeepAbsoluteFontSizes = true ;
2018-11-18 18:59:30 +08:00
QDialog * dlg = new QDialog ( nullptr , Qt : : WindowMinMaxButtonsHint ) ;
2015-07-11 18:56:02 +08:00
dlg - > setSizeGripEnabled ( true ) ;
//printZoomFactor=0.95;
//printMagnification=1.5;
QGridLayout * layout = new QGridLayout ( ) ;
dlg - > setLayout ( layout ) ;
dlg - > setWindowTitle ( tr ( " Graph export preview ... " ) ) ;
2019-01-20 23:15:10 +08:00
dlg - > setWindowIcon ( QIcon ( " :/JKQTPlotter/jkqtp_exportprintpreview.png " ) ) ;
2015-07-11 18:56:02 +08:00
/*printPreview=new QPrintPreviewWidget(p, dlg);
connect ( printPreview , SIGNAL ( paintRequested ( QPrinter * ) ) , this , SLOT ( printpreviewPaintRequested ( QPrinter * ) ) ) ; */
QScrollArea * scroll = new QScrollArea ( dlg ) ;
{
QPalette p ( scroll - > palette ( ) ) ;
// Set background colour to black
p . setColor ( QPalette : : Background , Qt : : darkGray ) ;
scroll - > setPalette ( p ) ;
}
exportPreviewLabel = new QLabel ( scroll ) ;
exportPreviewLabel - > setMargin ( 10 ) ;
scroll - > setWidget ( exportPreviewLabel ) ;
{
QPalette p ( exportPreviewLabel - > palette ( ) ) ;
// Set background colour to black
p . setColor ( QPalette : : Background , Qt : : darkGray ) ;
exportPreviewLabel - > setPalette ( p ) ;
}
printAspect = double ( widgetHeight ) / double ( widgetWidth ) ;
if ( gridPrinting ) {
gridPrintingCalc ( ) ;
printAspect = double ( gridPrintingSize . height ( ) ) / double ( gridPrintingSize . width ( ) ) ;
}
printSizeY_Millimeter = printSizeX_Millimeter * printAspect ;
printKeepAspect = true ;
JKQTPEnhancedDoubleSpinBox * spinSizeX = new JKQTPEnhancedDoubleSpinBox ( dlg ) ;
spinSizeX - > setRange ( 1 , 10000 ) ;
spinSizeX - > setValue ( printSizeX_Millimeter ) ;
spinSizeX - > setSingleStep ( 10 ) ;
if ( unitIsMM ) spinSizeX - > setDecimals ( 1 ) ;
else spinSizeX - > setDecimals ( 0 ) ;
if ( unitIsMM ) spinSizeX - > setSuffix ( tr ( " mm " ) ) ;
spinSizeX - > setToolTip ( tr ( " set the size of the output page " ) ) ;
connect ( spinSizeX , SIGNAL ( editingFinished ( double ) ) , this , SLOT ( printpreviewSetSizeX ( double ) ) ) ;
spinSizeY = new JKQTPEnhancedDoubleSpinBox ( dlg ) ;
spinSizeY - > setRange ( 1 , 10000 ) ;
spinSizeY - > setValue ( printSizeY_Millimeter ) ;
spinSizeY - > setSingleStep ( 10 ) ;
if ( unitIsMM ) spinSizeY - > setDecimals ( 1 ) ;
else spinSizeY - > setDecimals ( 0 ) ;
if ( unitIsMM ) spinSizeY - > setSuffix ( tr ( " mm " ) ) ;
spinSizeY - > setToolTip ( tr ( " set the size of the output page " ) ) ;
spinSizeY - > setEnabled ( false ) ;
connect ( spinSizeY , SIGNAL ( editingFinished ( double ) ) , this , SLOT ( printpreviewSetSizeY ( double ) ) ) ;
QCheckBox * chkAspect = new QCheckBox ( tr ( " keep aspect ratio " ) , dlg ) ;
chkAspect - > setChecked ( true ) ;
chkAspect - > setToolTip ( tr ( " choose whether to keep the aspect ratio for the print/export, as on the screen. " ) ) ;
connect ( chkAspect , SIGNAL ( toggled ( bool ) ) , spinSizeY , SLOT ( setDisabled ( bool ) ) ) ;
connect ( chkAspect , SIGNAL ( toggled ( bool ) ) , this , SLOT ( printpreviewSetAspectRatio ( bool ) ) ) ;
layout - > addWidget ( new QLabel ( tr ( " page size: " ) ) , 0 , layout - > columnCount ( ) ) ;
layout - > addWidget ( spinSizeX , 0 , layout - > columnCount ( ) ) ;
layout - > addWidget ( new QLabel ( tr ( " x " ) ) , 0 , layout - > columnCount ( ) ) ;
layout - > addWidget ( spinSizeY , 0 , layout - > columnCount ( ) ) ;
layout - > addWidget ( chkAspect , 0 , layout - > columnCount ( ) ) ;
JKQTPEnhancedDoubleSpinBox * spinMagnification = new JKQTPEnhancedDoubleSpinBox ( dlg ) ;
spinMagnification - > setRange ( 1 , 1000 ) ;
spinMagnification - > setValue ( printMagnification * 100.0 ) ;
spinMagnification - > setSingleStep ( 10 ) ;
spinMagnification - > setDecimals ( 0 ) ;
spinMagnification - > setSuffix ( tr ( " % " ) ) ;
spinMagnification - > setToolTip ( tr ( " use this to change the base size of the plot<br> "
" This will not change the size of the plot on<br> "
" the page, only it's appearance. A magn. of 100%<br> "
" will print the plot in the same proportions as<br> "
" on the screen, whereas 50% will use twice as much<br> "
" space for the plot, as on the screen. <i>This mainly<br> "
" influences the relative font size!</i> " ) ) ;
connect ( spinMagnification , SIGNAL ( editingFinished ( double ) ) , this , SLOT ( printpreviewSetMagnification ( double ) ) ) ;
layout - > addWidget ( new QLabel ( tr ( " magnification: " ) ) , 0 , layout - > columnCount ( ) ) ;
layout - > addWidget ( spinMagnification , 0 , layout - > columnCount ( ) ) ;
JKQTPEnhancedDoubleSpinBox * spinLineWidthMult = new JKQTPEnhancedDoubleSpinBox ( dlg ) ;
spinLineWidthMult - > setRange ( 1 , 1000 ) ;
spinLineWidthMult - > setValue ( lineWidthPrintMultiplier * 100.0 ) ;
spinLineWidthMult - > setSingleStep ( 10 ) ;
spinLineWidthMult - > setDecimals ( 0 ) ;
spinLineWidthMult - > setSuffix ( tr ( " % " ) ) ;
spinLineWidthMult - > setToolTip ( tr ( " use this to change the relative width of the lines \n "
" in the exported/printed plot. " ) ) ;
connect ( spinLineWidthMult , SIGNAL ( editingFinished ( double ) ) , this , SLOT ( printpreviewSetLineWidthMultiplier ( double ) ) ) ;
JKQTPEnhancedDoubleSpinBox * spinFontSizeMult = new JKQTPEnhancedDoubleSpinBox ( dlg ) ;
spinFontSizeMult - > setRange ( 1 , 1000 ) ;
spinFontSizeMult - > setValue ( fontSizePrintMultiplier * 100.0 ) ;
spinFontSizeMult - > setSingleStep ( 10 ) ;
spinFontSizeMult - > setDecimals ( 0 ) ;
spinFontSizeMult - > setSuffix ( tr ( " % " ) ) ;
spinFontSizeMult - > setToolTip ( tr ( " use this to change the relative size of the text fonts \n "
" in the exported/printed plot. " ) ) ;
connect ( spinFontSizeMult , SIGNAL ( editingFinished ( double ) ) , this , SLOT ( printpreviewSetFontSizeMultiplier ( double ) ) ) ;
layout - > addWidget ( new QLabel ( tr ( " magnification: " ) ) , 0 , layout - > columnCount ( ) ) ;
layout - > addWidget ( spinMagnification , 0 , layout - > columnCount ( ) ) ;
layout - > addWidget ( new QLabel ( tr ( " linewidth mult.: " ) ) , 0 , layout - > columnCount ( ) ) ;
layout - > addWidget ( spinLineWidthMult , 0 , layout - > columnCount ( ) ) ;
layout - > addWidget ( new QLabel ( tr ( " font size mult.: " ) ) , 0 , layout - > columnCount ( ) ) ;
layout - > addWidget ( spinFontSizeMult , 0 , layout - > columnCount ( ) ) ;
layout - > addWidget ( new QWidget ( ) , 0 , layout - > columnCount ( ) ) ;
layout - > setColumnStretch ( layout - > columnCount ( ) - 1 , 1 ) ;
layout - > addWidget ( scroll , layout - > rowCount ( ) , 0 , 1 , layout - > columnCount ( ) ) ;
QDialogButtonBox * buttonBox = new QDialogButtonBox ( QDialogButtonBox : : Ok | QDialogButtonBox : : Cancel ) ;
connect ( buttonBox , SIGNAL ( accepted ( ) ) , dlg , SLOT ( accept ( ) ) ) ;
connect ( buttonBox , SIGNAL ( rejected ( ) ) , dlg , SLOT ( reject ( ) ) ) ;
layout - > addWidget ( buttonBox , layout - > rowCount ( ) , 0 , 1 , layout - > columnCount ( ) ) ;
dlg - > resize ( 800 , 500 ) ;
updatePreviewLabel ( ) ;
bool result = false ;
if ( dlg - > exec ( ) = = QDialog : : Accepted ) {
result = true ;
}
return result ;
}
2019-02-08 00:24:46 +08:00
void JKQTBasePlotter : : setFontSizeMultiplier ( double __value )
{
this - > fontSizeMultiplier = __value ;
}
void JKQTBasePlotter : : setLineWidthMultiplier ( double __value )
{
this - > lineWidthMultiplier = __value ;
}
void JKQTBasePlotter : : setPrintMagnification ( double __value )
{
this - > printMagnification = __value ;
}
double JKQTBasePlotter : : getPrintMagnification ( ) const
{
return this - > printMagnification ;
}
void JKQTBasePlotter : : setPaintMagnification ( double __value )
{
this - > paintMagnification = __value ;
}
double JKQTBasePlotter : : getPaintMagnification ( ) const
{
return this - > paintMagnification ;
}
void JKQTBasePlotter : : updatePreviewLabel ( ) {
double factor = 1 ;
if ( exportUnitInMM ) factor = 600.0 / double ( printSizeX_Millimeter ) ;
QImage pix ( double ( printSizeX_Millimeter ) * factor * 1.1 , double ( printSizeY_Millimeter ) * factor * 1.1 , QImage : : Format_ARGB32 ) ;
pix . fill ( Qt : : transparent ) ;
JKQTPEnhancedPainter painter ;
painter . begin ( & pix ) ;
exportpreviewPaintRequested ( painter , QSize ( double ( printSizeX_Millimeter ) * factor , double ( printSizeY_Millimeter ) * factor ) ) ;
painter . end ( ) ;
if ( exportPreviewLabel ) {
QPixmap pm ;
pm . convertFromImage ( pix ) ;
2015-07-11 18:56:02 +08:00
exportPreviewLabel - > setPixmap ( pm ) ;
exportPreviewLabel - > resize ( pm . size ( ) ) ;
}
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : printpreviewPaintRequested ( QPrinter * printer ) {
2015-07-11 18:56:02 +08:00
double lw = lineWidthMultiplier ;
double fs = fontSizeMultiplier ;
2019-02-08 00:24:46 +08:00
QColor bc = plotterStyle . widgetBackgroundColor ;
plotterStyle . widgetBackgroundColor = plotterStyle . exportBackgroundColor ;
2015-07-11 18:56:02 +08:00
lineWidthMultiplier = lineWidthPrintMultiplier ;
fontSizeMultiplier = fontSizePrintMultiplier ;
bool oldEmitPlotSignals = emitPlotSignals ;
emitPlotSignals = false ;
QApplication : : setOverrideCursor ( QCursor ( Qt : : WaitCursor ) ) ;
QApplication : : processEvents ( ) ;
int oldWidgetWidth = widgetWidth ;
int oldWidgetHeight = widgetHeight ;
//widgetWidth=widgetWidth/printMagnification;
//widgetHeight=widgetHeight/printMagnification;
double oldpm = paintMagnification ;
paintMagnification = printMagnification ;
if ( printSetAbsolutePageSize ) {
# ifdef SHOW_JKQTPLOTTER_DEBUG
qDebug ( ) < < " set printing abs. size to " < < QSizeF ( printSizeX_Millimeter , printSizeY_Millimeter ) < < " mm^2 " ;
# endif
//printer->setPaperSize(QPrinter::Custom);
printer - > setOrientation ( QPrinter : : Portrait ) ;
printer - > setPaperSize ( QSizeF ( printSizeX_Millimeter , printSizeY_Millimeter ) , QPrinter : : Millimeter ) ;
if ( ! gridPrinting ) widgetHeight = widgetWidth * printSizeY_Millimeter / printSizeX_Millimeter ;
}
JKQTPEnhancedPainter painter ;
painter . begin ( printer ) ;
if ( ! printSetAbsolutePageSize ) {
# ifdef SHOW_JKQTPLOTTER_DEBUG
qDebug ( ) < < " scale printing to " < < printZoomFactor ;
# endif
painter . scale ( printZoomFactor , printZoomFactor ) ;
}
if ( printKeepAbsoluteFontSizes ) {
if ( printZoomFactor ! = 1.0 ) {
fontSizeMultiplier = 1.0 / printZoomFactor ;
}
}
# ifdef SHOW_JKQTPLOTTER_DEBUG
qDebug ( ) < < " printSetAbsoluteSize = " < < printSetAbsolutePageSize ;
qDebug ( ) < < " printScaleToPagesize = " < < printScaleToPagesize ;
qDebug ( ) < < " printKeepAbsoluteFontSizes = " < < printKeepAbsoluteFontSizes ;
qDebug ( ) < < " print with widget size " < < widgetWidth < < widgetHeight ;
qDebug ( ) < < " print with paper size " < < printer - > pageRect ( ) . size ( ) < < " " ;
QSizeF sl = QSizeF ( QSizeF ( printer - > pageRect ( ) . size ( ) ) . width ( ) / printer - > logicalDpiX ( ) * 25.4 , QSizeF ( printer - > pageRect ( ) . size ( ) ) . height ( ) / printer - > logicalDpiY ( ) * 25.4 ) ;
qDebug ( ) < < " print with paper size " < < sl < < " mm^2 " ;
qDebug ( ) < < " paintMagnification = " < < paintMagnification ;
qDebug ( ) < < " lineWidthMultiplier = " < < lineWidthMultiplier ;
qDebug ( ) < < " fontSizeMultiplier = " < < fontSizeMultiplier ;
qDebug ( ) < < " printer resolution = " < < printer - > resolution ( ) < < " dpi " ;
2019-02-08 00:24:46 +08:00
qDebug ( ) < < " \n plotLabelFontSize = " < < plotterStyle . plotLabelFontSize < < " pt " ;
qDebug ( ) < < " plotterStyle.keyStyle.fontSize = " < < plotterStyle . keyStyle . fontSize < < " pt " ;
2019-01-26 20:00:40 +08:00
qDebug ( ) < < " x-axis label fontsize = " < < xAxis - > getLabelFontSize ( ) < < " pt " ;
qDebug ( ) < < " y-axis label fontsize = " < < yAxis - > getLabelFontSize ( ) < < " pt " ;
2015-07-11 18:56:02 +08:00
# endif
gridPaint ( painter , printer - > pageRect ( ) . size ( ) , true , printScaleToPagesize , printScaleToPagesize ) ;
painter . end ( ) ;
widgetWidth = oldWidgetWidth ;
widgetHeight = oldWidgetHeight ;
QApplication : : restoreOverrideCursor ( ) ;
QApplication : : processEvents ( ) ;
emitPlotSignals = oldEmitPlotSignals ;
lineWidthMultiplier = lw ;
fontSizeMultiplier = fs ;
paintMagnification = oldpm ;
2019-02-08 00:24:46 +08:00
plotterStyle . widgetBackgroundColor = bc ;
2015-07-11 18:56:02 +08:00
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : printpreviewPaintRequestedNew ( QPrinter * printer ) {
2015-07-11 18:56:02 +08:00
QPaintDevice * paintDevice = dynamic_cast < QPaintDevice * > ( printer ) ;
printpreviewPaintRequestedNew ( paintDevice ) ;
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : printpreviewPaintRequestedNew ( QPaintDevice * paintDevice )
2015-07-11 18:56:02 +08:00
{
//QPaintDevice* paintDevice=dynamic_cast<QPaintDevice*>(printer);
QPrinter * printer = dynamic_cast < QPrinter * > ( paintDevice ) ;
QSvgGenerator * svg = dynamic_cast < QSvgGenerator * > ( paintDevice ) ;
double lw = lineWidthMultiplier ;
double fs = fontSizeMultiplier ;
2019-02-08 00:24:46 +08:00
QColor bc = plotterStyle . widgetBackgroundColor ;
plotterStyle . widgetBackgroundColor = plotterStyle . exportBackgroundColor ;
2015-07-11 18:56:02 +08:00
lineWidthMultiplier = lineWidthPrintMultiplier ;
fontSizeMultiplier = fontSizePrintMultiplier ;
bool oldEmitPlotSignals = emitPlotSignals ;
emitPlotSignals = false ;
QApplication : : setOverrideCursor ( QCursor ( Qt : : WaitCursor ) ) ;
QApplication : : processEvents ( ) ;
int oldWidgetWidth = widgetWidth ;
int oldWidgetHeight = widgetHeight ;
double oldpm = paintMagnification ;
paintMagnification = 1.0 ;
gridPrintingCalc ( ) ;
if ( printSetAbsolutePageSize ) {
# ifdef SHOW_JKQTPLOTTER_DEBUG
qDebug ( ) < < " set printing abs. size to " < < QSizeF ( printSizeX_Millimeter , printSizeY_Millimeter ) < < " mm^2 " ;
# endif
if ( printer ) {
printer - > setOrientation ( QPrinter : : Portrait ) ;
printer - > setPaperSize ( QSizeF ( printSizeX_Millimeter , printSizeY_Millimeter ) , QPrinter : : Millimeter ) ;
} else if ( svg ) {
QRectF siz = QRectF ( 0 , 0 , printSizeX_Millimeter , printSizeY_Millimeter ) ;
svg - > setSize ( QSize ( ceil ( siz . width ( ) * svg - > resolution ( ) / 25.4 ) , ceil ( siz . height ( ) * svg - > resolution ( ) / 25.4 ) ) ) ;
svg - > setViewBox ( QRect ( 0 , 0 , - 1 , - 1 ) ) ; //*25.4/double(svg->resolution()), printSizeY_Millimeter*25.4/double(svg->resolution())));
}
}
paintMagnification = gridPrintingSize . width ( ) / ( printSizeX_Millimeter / 25.4 * double ( paintDevice - > logicalDpiX ( ) ) ) ;
if ( ! gridPrinting ) widgetHeight = widgetWidth * printSizeY_Millimeter / printSizeX_Millimeter ;
JKQTPEnhancedPainter painter ;
if ( printer ) painter . begin ( printer ) ;
else if ( svg ) painter . begin ( svg ) ;
else painter . begin ( paintDevice ) ;
if ( printKeepAbsoluteFontSizes ) {
fontSizeMultiplier = 1.0 ; //1.0/paintMagnification;
}
if ( svg ) {
lineWidthMultiplier = lineWidthMultiplier * 72.0 / 96.0 ;
fontSizeMultiplier = fontSizeMultiplier * 72.0 / 96.0 ;
}
# ifdef SHOW_JKQTPLOTTER_DEBUG
qDebug ( ) < < " \n \n \n ========================================================================== " ;
qDebug ( ) < < " printAspect = " < < printAspect ;
qDebug ( ) < < " printKeepAspect = " < < printKeepAspect ;
qDebug ( ) < < " printSetAbsoluteSize = " < < printSetAbsolutePageSize ;
qDebug ( ) < < " printScaleToPagesize = " < < printScaleToPagesize ;
qDebug ( ) < < " printKeepAbsoluteFontSizes = " < < printKeepAbsoluteFontSizes ;
qDebug ( ) < < " print with widget size " < < widgetWidth < < widgetHeight ;
if ( printer ) {
qDebug ( ) < < " print with paper size " < < printer - > pageRect ( ) . size ( ) < < " " ;
QSizeF sl = QSizeF ( QSizeF ( printer - > pageRect ( ) . size ( ) ) . width ( ) / printer - > logicalDpiX ( ) * 25.4 , QSizeF ( printer - > pageRect ( ) . size ( ) ) . height ( ) / printer - > logicalDpiY ( ) * 25.4 ) ;
qDebug ( ) < < " print with paper size " < < sl < < " mm^2 " ;
} else if ( svg ) {
qDebug ( ) < < " print with paper size " < < svg - > size ( ) < < " " ;
QSizeF sl = QSizeF ( QSizeF ( svg - > viewBoxF ( ) . size ( ) ) . width ( ) / svg - > resolution ( ) * 25.4 , QSizeF ( svg - > size ( ) ) . height ( ) / svg - > resolution ( ) * 25.4 ) ;
qDebug ( ) < < " print with paper size " < < sl < < " mm^2 " ;
}
qDebug ( ) < < " plot size " < < printSizeX_Millimeter < < printSizeY_Millimeter < < " mm^2 " ;
qDebug ( ) < < " paintMagnification = " < < paintMagnification ;
qDebug ( ) < < " lineWidthMultiplier = " < < lineWidthMultiplier ;
qDebug ( ) < < " fontSizeMultiplier = " < < fontSizeMultiplier ;
qDebug ( ) < < " printer resolution = " < < paintDevice - > logicalDpiX ( ) < < " dpi " ;
2019-02-08 00:24:46 +08:00
qDebug ( ) < < " \n plotLabelFontSize = " < < plotterStyle . plotLabelFontSize < < " pt " ;
qDebug ( ) < < " plotterStyle.keyStyle.fontSize = " < < plotterStyle . keyStyle . fontSize < < " pt " ;
2019-01-26 20:00:40 +08:00
qDebug ( ) < < " x-axis label fontsize = " < < xAxis - > getLabelFontSize ( ) < < " pt " ;
qDebug ( ) < < " y-axis label fontsize = " < < yAxis - > getLabelFontSize ( ) < < " pt " ;
2015-07-11 18:56:02 +08:00
# endif
if ( printer ) gridPaint ( painter , printer - > pageRect ( ) . size ( ) , true , printScaleToPagesize , printScaleToPagesize ) ;
else if ( svg ) gridPaint ( painter , svg - > size ( ) , true , printScaleToPagesize , printScaleToPagesize ) ;
else gridPaint ( painter , QSizeF ( paintDevice - > width ( ) , paintDevice - > height ( ) ) , true , printScaleToPagesize , printScaleToPagesize ) ;
painter . end ( ) ;
widgetWidth = oldWidgetWidth ;
widgetHeight = oldWidgetHeight ;
QApplication : : restoreOverrideCursor ( ) ;
QApplication : : processEvents ( ) ;
emitPlotSignals = oldEmitPlotSignals ;
lineWidthMultiplier = lw ;
fontSizeMultiplier = fs ;
paintMagnification = oldpm ;
2019-02-08 00:24:46 +08:00
plotterStyle . widgetBackgroundColor = bc ;
2015-07-11 18:56:02 +08:00
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : exportpreviewPaintRequested ( JKQTPEnhancedPainter & painter , QSize size ) {
2015-07-11 18:56:02 +08:00
double lw = lineWidthMultiplier ;
double fs = fontSizeMultiplier ;
2019-02-08 00:24:46 +08:00
QColor bc = plotterStyle . widgetBackgroundColor ;
plotterStyle . widgetBackgroundColor = plotterStyle . exportBackgroundColor ;
2015-07-11 18:56:02 +08:00
lineWidthMultiplier = lineWidthPrintMultiplier ;
fontSizeMultiplier = fontSizePrintMultiplier ;
bool oldEmitPlotSignals = emitPlotSignals ;
emitPlotSignals = false ;
QApplication : : setOverrideCursor ( QCursor ( Qt : : WaitCursor ) ) ;
QApplication : : processEvents ( ) ;
int oldWidgetWidth = widgetWidth ;
int oldWidgetHeight = widgetHeight ;
widgetWidth = size . width ( ) ;
widgetHeight = size . height ( ) ;
gridPaint ( painter , size ) ;
widgetWidth = oldWidgetWidth ;
widgetHeight = oldWidgetHeight ;
QApplication : : restoreOverrideCursor ( ) ;
QApplication : : processEvents ( ) ;
emitPlotSignals = oldEmitPlotSignals ;
lineWidthMultiplier = lw ;
fontSizeMultiplier = fs ;
2019-02-08 00:24:46 +08:00
plotterStyle . widgetBackgroundColor = bc ;
2015-07-11 18:56:02 +08:00
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : printpreviewSetZoom ( double value ) {
2015-07-11 18:56:02 +08:00
printZoomFactor = value / 100.0 ;
if ( printPreview ) printPreview - > updatePreview ( ) ;
if ( exportPreviewLabel ) updatePreviewLabel ( ) ;
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : printpreviewSetSizeX ( double value ) {
2015-07-11 18:56:02 +08:00
printSizeX_Millimeter = value ;
if ( printKeepAspect ) {
printSizeY_Millimeter = printSizeX_Millimeter * printAspect ;
spinSizeY - > setValue ( printSizeY_Millimeter ) ;
}
if ( printDoUpdate ) {
if ( printPreview ) printPreview - > updatePreview ( ) ;
if ( exportPreviewLabel ) updatePreviewLabel ( ) ;
}
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : printpreviewSetSizeY ( double value ) {
2015-07-11 18:56:02 +08:00
if ( printKeepAspect ) return ;
printSizeY_Millimeter = value ;
if ( printDoUpdate ) {
if ( printPreview ) printPreview - > updatePreview ( ) ;
if ( exportPreviewLabel ) updatePreviewLabel ( ) ;
}
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : printpreviewSetSizeXNew ( double value ) {
2015-07-11 18:56:02 +08:00
printSizeX_Millimeter = value ;
if ( printKeepAspect ) {
printSizeY_Millimeter = printSizeX_Millimeter * printAspect ;
spinSizeY - > setValue ( printSizeY_Millimeter ) ;
}
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : printpreviewSetSizeYNew ( double value ) {
2015-07-11 18:56:02 +08:00
printSizeY_Millimeter = value ;
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : printpreviewSetMagnification ( double value ) {
2015-07-11 18:56:02 +08:00
printMagnification = value / 100.0 ;
if ( printPreview ) printPreview - > updatePreview ( ) ;
if ( exportPreviewLabel ) updatePreviewLabel ( ) ;
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : printpreviewSetMagnificationNew ( double value )
2015-07-11 18:56:02 +08:00
{
printMagnification = value / 100.0 ;
printDoUpdate = false ;
if ( spinSizeY ) {
spinSizeY - > setValue ( printMagnification * printPageSizeMM . height ( ) ) ;
}
if ( spinSizeX ) {
spinSizeX - > setValue ( printMagnification * printPageSizeMM . width ( ) ) ;
}
printDoUpdate = true ;
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : printpreviewSetAspectRatio ( bool checked ) {
2015-07-11 18:56:02 +08:00
printKeepAspect = checked ;
if ( printKeepAspect ) {
printSizeY_Millimeter = printSizeX_Millimeter * printAspect ;
spinSizeY - > setValue ( printSizeY_Millimeter ) ;
}
if ( printPreview ) printPreview - > updatePreview ( ) ;
if ( exportPreviewLabel ) updatePreviewLabel ( ) ;
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : printpreviewSetKeepAbsFontsize ( bool checked )
2015-07-11 18:56:02 +08:00
{
printKeepAbsoluteFontSizes = checked ;
if ( printPreview ) printPreview - > updatePreview ( ) ;
if ( exportPreviewLabel ) updatePreviewLabel ( ) ;
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : printpreviewToggleMagnification ( bool checked )
2015-07-11 18:56:02 +08:00
{
if ( checked ) {
if ( spinMagnification ) printpreviewSetMagnificationNew ( spinMagnification - > value ( ) ) ;
}
printpreviewUpdate ( ) ;
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : printpreviewSetLineWidthMultiplier ( double value ) {
2015-07-11 18:56:02 +08:00
lineWidthPrintMultiplier = value / 100.0 ;
if ( printPreview ) printPreview - > updatePreview ( ) ;
if ( exportPreviewLabel ) updatePreviewLabel ( ) ;
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : printpreviewSetFontSizeMultiplier ( double value ) {
2015-07-11 18:56:02 +08:00
fontSizePrintMultiplier = value / 100.0 ;
if ( printPreview ) printPreview - > updatePreview ( ) ;
if ( exportPreviewLabel ) updatePreviewLabel ( ) ;
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : printpreviewUpdate ( )
2015-07-11 18:56:02 +08:00
{
if ( printDoUpdate ) {
if ( printPreview ) printPreview - > updatePreview ( ) ;
if ( exportPreviewLabel ) updatePreviewLabel ( ) ;
}
}
2019-02-08 00:24:46 +08:00
void JKQTBasePlotter : : draw ( JKQTPEnhancedPainter & painter , const QRect & rect , bool showOverlays ) {
2015-07-11 18:56:02 +08:00
# ifdef JKQTBP_AUTOTIMER
2019-02-08 00:24:46 +08:00
JKQTPAutoOutputTimer jkaaot ( QString ( " JKQTBasePlotter::draw(rect, %1) " ).arg(showOverlays)) ;
2015-07-11 18:56:02 +08:00
# endif
bool oldEmitPlotSignals = emitPlotSignals ;
emitPlotSignals = false ;
# ifdef JKQTBP_DEBUGTIMING
QString on = objectName ( ) ;
if ( on . isEmpty ( ) & & parent ( ) ) on = parent ( ) - > objectName ( ) ;
qDebug ( ) < < on < < " ::draw ... " ;
QElapsedTimer timeAll ;
timeAll . start ( ) ;
# endif
//resize(rect.width(), rect.height());
2019-02-08 00:24:46 +08:00
{
painter . save ( ) ; auto __finalpaint = JKQTPFinally ( [ & painter ] ( ) { painter . restore ( ) ; } ) ;
painter . translate ( rect . topLeft ( ) ) ;
# ifdef JKQTBP_DEBUGTIMING
QElapsedTimer time ;
time . start ( ) ;
# endif
gridPaint ( painter , rect . size ( ) , showOverlays ) ;
# ifdef JKQTBP_DEBUGTIMING
qDebug ( ) < < on < < " ::draw ... gridPaint = " < < time . nsecsElapsed ( ) / 1000 < < " usecs = " < < static_cast < double > ( time . nsecsElapsed ( ) ) / 1000000.0 < < " msecs " ;
# endif
}
2015-07-11 18:56:02 +08:00
emitPlotSignals = oldEmitPlotSignals ;
}
2019-01-26 19:28:44 +08:00
void JKQTBasePlotter : : drawOverlays ( JKQTPEnhancedPainter & painter , const QRect & rect )
2015-07-11 18:56:02 +08:00
{
//resize(rect.width(), rect.height());
2019-02-08 00:24:46 +08:00
painter . save ( ) ; auto __finalpaint = JKQTPFinally ( [ & painter ] ( ) { painter . restore ( ) ; } ) ;
2015-07-11 18:56:02 +08:00
painter . translate ( rect . topLeft ( ) ) ;
gridPaintOverlays ( painter , rect . size ( ) ) ;
2019-02-08 00:24:46 +08:00
2015-07-11 18:56:02 +08:00
}
2019-02-08 00:24:46 +08:00
void JKQTBasePlotter : : draw ( JKQTPEnhancedPainter & painter , const QPoint & pos , bool showOverlays ) {
2015-07-11 18:56:02 +08:00
# ifdef JKQTBP_AUTOTIMER
2019-02-08 00:24:46 +08:00
JKQTPAutoOutputTimer jkaaot ( QString ( " JKQTBasePlotter::draw(pos, %1) " ).arg(showOverlays)) ;
2015-07-11 18:56:02 +08:00
# endif
bool oldEmitPlotSignals = emitPlotSignals ;
emitPlotSignals = false ;
# ifdef JKQTBP_DEBUGTIMING
QString on = objectName ( ) ;
if ( on . isEmpty ( ) & & parent ( ) ) on = parent ( ) - > objectName ( ) ;
qDebug ( ) < < on < < " ::draw ... " ;
QElapsedTimer timeAll ;
timeAll . start ( ) ;
# endif
QRect rect = QRect ( pos , QSize ( widgetWidth / paintMagnification , widgetHeight / paintMagnification ) ) ;
2019-02-08 00:24:46 +08:00
{
painter . save ( ) ; auto __finalpaint = JKQTPFinally ( [ & painter ] ( ) { painter . restore ( ) ; } ) ;
painter . translate ( rect . topLeft ( ) ) ;
# ifdef JKQTBP_DEBUGTIMING
QElapsedTimer time ;
time . start ( ) ;
# endif
gridPaint ( painter , rect . size ( ) , showOverlays ) ;
# ifdef JKQTBP_DEBUGTIMING
qDebug ( ) < < on < < " ::draw ... gridPaint = " < < time . nsecsElapsed ( ) / 1000 < < " usecs = " < < static_cast < double > ( time . nsecsElapsed ( ) ) / 1000000.0 < < " msecs " ;
# endif
}
2015-07-11 18:56:02 +08:00
emitPlotSignals = oldEmitPlotSignals ;
}
2019-02-08 00:24:46 +08:00
void JKQTBasePlotter : : drawNonGrid ( JKQTPEnhancedPainter & painter , const QRect & rect , bool showOverlays ) {
2015-07-11 18:56:02 +08:00
# ifdef JKQTBP_AUTOTIMER
2019-02-08 00:24:46 +08:00
JKQTPAutoOutputTimer jkaaot ( QString ( " JKQTBasePlotter::drawNonGrid(rect, %1) " ).arg(showOverlays)) ;
2015-07-11 18:56:02 +08:00
# endif
bool oldEmitPlotSignals = emitPlotSignals ;
emitPlotSignals = false ;
# ifdef JKQTBP_DEBUGTIMING
QString on = objectName ( ) ;
if ( on . isEmpty ( ) & & parent ( ) ) on = parent ( ) - > objectName ( ) ;
qDebug ( ) < < on < < " ::drawNonGrid ... " ;
QElapsedTimer timeAll ;
timeAll . start ( ) ;
# endif
2019-02-08 00:24:46 +08:00
painter . save ( ) ; auto __finalpaint = JKQTPFinally ( [ & painter ] ( ) { painter . restore ( ) ; } ) ;
2015-07-11 18:56:02 +08:00
painter . translate ( rect . topLeft ( ) ) ;
# ifdef JKQTBP_DEBUGTIMING
QElapsedTimer time ;
time . start ( ) ;
# endif
calcPlotScaling ( painter ) ;
# ifdef JKQTBP_DEBUGTIMING
2019-01-26 20:00:40 +08:00
qDebug ( ) < < on < < " ::drawNonGrid ... calcPlotScaling = " < < time . nsecsElapsed ( ) / 1000 < < " usecs = " < < static_cast < double > ( time . nsecsElapsed ( ) ) / 1000000.0 < < " msecs " ;
2015-07-11 18:56:02 +08:00
# endif
2019-02-08 00:24:46 +08:00
{
double scale = static_cast < double > ( rect . width ( ) ) / static_cast < double > ( widgetWidth ) * paintMagnification ;
if ( ( scale * static_cast < double > ( widgetWidth ) / paintMagnification > static_cast < double > ( rect . width ( ) ) ) | | ( scale * static_cast < double > ( widgetHeight ) / paintMagnification > static_cast < double > ( rect . height ( ) ) ) ) {
scale = static_cast < double > ( rect . height ( ) ) / static_cast < double > ( widgetHeight ) * paintMagnification ;
}
painter . save ( ) ; auto __finalpaint = JKQTPFinally ( [ & painter ] ( ) { painter . restore ( ) ; } ) ;
// scale the plot so it fits on the page
painter . scale ( scale , scale ) ;
# ifdef JKQTBP_DEBUGTIMING
time . start ( ) ;
# endif
drawPlot ( painter , showOverlays ) ;
# ifdef JKQTBP_DEBUGTIMING
qDebug ( ) < < on < < " ::drawNonGrid ... paintPlot = " < < time . nsecsElapsed ( ) / 1000 < < " usecs = " < < static_cast < double > ( time . nsecsElapsed ( ) ) / 1000000.0 < < " msecs " ;
# endif
# ifdef JKQTBP_DEBUGTIMING
qDebug ( ) < < on < < " ::drawNonGrid ... DONE = " < < timeAll . nsecsElapsed ( ) / 1000 < < " usecs = " < < static_cast < double > ( timeAll . nsecsElapsed ( ) ) / 1000000.0 < < " msecs " ;
# endif
2015-07-11 18:56:02 +08:00
}
emitPlotSignals = oldEmitPlotSignals ;
}
2019-02-08 00:24:46 +08:00
void JKQTBasePlotter : : drawNonGrid ( JKQTPEnhancedPainter & painter , const QPoint & pos , bool showOverlays ) {
2015-07-11 18:56:02 +08:00
# ifdef JKQTBP_AUTOTIMER
2019-02-08 00:24:46 +08:00
JKQTPAutoOutputTimer jkaaot ( QString ( " JKQTBasePlotter::drawNonGrid(pos, %1) " ).arg(showOverlays)) ;
2015-07-11 18:56:02 +08:00
# endif
bool oldEmitPlotSignals = emitPlotSignals ;
emitPlotSignals = false ;
# ifdef JKQTBP_DEBUGTIMING
QString on = objectName ( ) ;
if ( on . isEmpty ( ) & & parent ( ) ) on = parent ( ) - > objectName ( ) ;
qDebug ( ) < < on < < " ::drawNonGrid ... " ;
QElapsedTimer timeAll ;
timeAll . start ( ) ;
# endif
QRect rect = QRect ( pos , QSize ( widgetWidth / paintMagnification , widgetHeight / paintMagnification ) ) ;
2019-02-08 00:24:46 +08:00
painter . save ( ) ; auto __finalpaint = JKQTPFinally ( [ & painter ] ( ) { painter . restore ( ) ; } ) ;
2015-07-11 18:56:02 +08:00
painter . translate ( rect . topLeft ( ) ) ;
# ifdef JKQTBP_DEBUGTIMING
QElapsedTimer time ;
time . start ( ) ;
# endif
calcPlotScaling ( painter ) ;
# ifdef JKQTBP_DEBUGTIMING
2019-01-26 20:00:40 +08:00
qDebug ( ) < < on < < " ::drawNonGrid ... calcPlotScaling = " < < time . nsecsElapsed ( ) / 1000 < < " usecs = " < < static_cast < double > ( time . nsecsElapsed ( ) ) / 1000000.0 < < " msecs " ;
2015-07-11 18:56:02 +08:00
# endif
2019-02-08 00:24:46 +08:00
{
double scale = static_cast < double > ( rect . width ( ) ) / static_cast < double > ( widgetWidth ) * paintMagnification ;
if ( ( scale * static_cast < double > ( widgetWidth ) / paintMagnification > static_cast < double > ( rect . width ( ) ) ) | | ( scale * static_cast < double > ( widgetHeight ) / paintMagnification > static_cast < double > ( rect . height ( ) ) ) ) {
scale = static_cast < double > ( rect . height ( ) ) / static_cast < double > ( widgetHeight ) * paintMagnification ;
}
painter . save ( ) ; auto __finalpaint = JKQTPFinally ( [ & painter ] ( ) { painter . restore ( ) ; } ) ;
// scale the plot so it fits on the page
painter . scale ( scale , scale ) ;
# ifdef JKQTBP_DEBUGTIMING
time . start ( ) ;
# endif
drawPlot ( painter , showOverlays ) ;
# ifdef JKQTBP_DEBUGTIMING
qDebug ( ) < < on < < " ::drawNonGrid ... paintPlot = " < < time . nsecsElapsed ( ) / 1000 < < " usecs = " < < static_cast < double > ( time . nsecsElapsed ( ) ) / 1000000.0 < < " msecs " ;
# endif
}
# ifdef JKQTBP_DEBUGTIMING
qDebug ( ) < < on < < " ::drawNonGrid ... DONE = " < < timeAll . nsecsElapsed ( ) / 1000 < < " usecs = " < < static_cast < double > ( timeAll . nsecsElapsed ( ) ) / 1000000.0 < < " msecs " ;
# endif
emitPlotSignals = oldEmitPlotSignals ;
}
void JKQTBasePlotter : : drawNonGridOverlays ( JKQTPEnhancedPainter & painter , const QPoint & pos ) {
# ifdef JKQTBP_AUTOTIMER
JKQTPAutoOutputTimer jkaaot ( QString ( " JKQTBasePlotter::drawNonGridOverlays(point) " )) ;
# endif
QRect rect = QRect ( pos , QSize ( widgetWidth / paintMagnification , widgetHeight / paintMagnification ) ) ;
painter . save ( ) ; auto __finalpaint = JKQTPFinally ( [ & painter ] ( ) { painter . restore ( ) ; } ) ;
painter . translate ( rect . topLeft ( ) ) ;
2019-01-26 20:00:40 +08:00
double scale = static_cast < double > ( rect . width ( ) ) / static_cast < double > ( widgetWidth ) * paintMagnification ;
if ( ( scale * static_cast < double > ( widgetWidth ) / paintMagnification > static_cast < double > ( rect . width ( ) ) ) | | ( scale * static_cast < double > ( widgetHeight ) / paintMagnification > static_cast < double > ( rect . height ( ) ) ) ) {
scale = static_cast < double > ( rect . height ( ) ) / static_cast < double > ( widgetHeight ) * paintMagnification ;
2015-07-11 18:56:02 +08:00
}
2019-02-08 00:24:46 +08:00
{
painter . save ( ) ; auto __finalpaint = JKQTPFinally ( [ & painter ] ( ) { painter . restore ( ) ; } ) ;
// scale the plot so it fits on the page
painter . scale ( scale , scale ) ;
drawOverlaysWithHints ( painter ) ;
}
}
void JKQTBasePlotter : : setEmittingPlotSignalsEnabled ( bool __value )
{
this - > emitPlotSignals = __value ;
}
bool JKQTBasePlotter : : isEmittingPlotSignalsEnabled ( ) const
{
return this - > emitPlotSignals ;
}
int JKQTBasePlotter : : getPlotBorderTop ( ) const { return this - > plotterStyle . plotBorderTop ; }
int JKQTBasePlotter : : getPlotBorderLeft ( ) const { return this - > plotterStyle . plotBorderLeft ; }
int JKQTBasePlotter : : getPlotBorderBottom ( ) const { return this - > plotterStyle . plotBorderBottom ; }
int JKQTBasePlotter : : getPlotBorderRight ( ) const { return this - > plotterStyle . plotBorderRight ; }
bool JKQTBasePlotter : : doesMaintainAspectRatio ( ) const { return this - > maintainAspectRatio ; }
void JKQTBasePlotter : : setAspectRatio ( double __value )
{
if ( this - > aspectRatio ! = __value ) {
this - > aspectRatio = __value ;
redrawPlot ( ) ;
}
}
double JKQTBasePlotter : : getAspectRatio ( ) const
{
return this - > aspectRatio ;
}
bool JKQTBasePlotter : : doesMaintainAxisAspectRatio ( ) const { return this - > maintainAxisAspectRatio ; }
double JKQTBasePlotter : : getAxisAspectRatio ( ) const
{
return this - > axisAspectRatio ;
}
bool JKQTBasePlotter : : isUsingAntiAliasingForSystem ( ) const
{
return this - > plotterStyle . useAntiAliasingForSystem ;
}
bool JKQTBasePlotter : : isUsingAntiAliasingForGraphs ( ) const
{
return this - > plotterStyle . useAntiAliasingForGraphs ;
}
bool JKQTBasePlotter : : isUsingAntiAliasingForText ( ) const
{
return this - > plotterStyle . useAntiAliasingForText ;
}
void JKQTBasePlotter : : setGraphWidth ( double __value )
{
if ( this - > plotterStyle . defaultGraphWidth ! = __value ) {
this - > plotterStyle . defaultGraphWidth = __value ;
redrawPlot ( ) ;
}
}
double JKQTBasePlotter : : getGraphWidth ( ) const
{
return this - > plotterStyle . defaultGraphWidth ;
}
void JKQTBasePlotter : : setBackgroundColor ( const QColor & __value )
{
if ( this - > plotterStyle . widgetBackgroundColor ! = __value ) {
this - > plotterStyle . widgetBackgroundColor = __value ;
redrawPlot ( ) ;
}
}
QColor JKQTBasePlotter : : getBackgroundColor ( ) const
{
return this - > plotterStyle . widgetBackgroundColor ;
}
void JKQTBasePlotter : : setExportBackgroundColor ( const QColor & __value )
{
if ( this - > plotterStyle . exportBackgroundColor ! = __value ) {
this - > plotterStyle . exportBackgroundColor = __value ;
redrawPlot ( ) ;
}
}
QColor JKQTBasePlotter : : getExportBackgroundColor ( ) const
{
return this - > plotterStyle . exportBackgroundColor ;
}
QColor JKQTBasePlotter : : getPlotBackgroundColor ( ) const
{
return this - > plotterStyle . plotBackgroundColor ;
}
void JKQTBasePlotter : : setKeyFontSize ( double __value )
{
if ( this - > plotterStyle . keyStyle . fontSize ! = __value ) {
this - > plotterStyle . keyStyle . fontSize = __value ;
redrawPlot ( ) ;
}
}
double JKQTBasePlotter : : getKeyFontSize ( ) const
{
return this - > plotterStyle . keyStyle . fontSize ;
}
void JKQTBasePlotter : : setKeyTextColor ( const QColor & __value )
{
if ( this - > plotterStyle . keyStyle . textColor ! = __value ) {
this - > plotterStyle . keyStyle . textColor = __value ;
redrawPlot ( ) ;
}
}
QColor JKQTBasePlotter : : getKeyTextColor ( ) const
{
return this - > plotterStyle . keyStyle . textColor ;
}
void JKQTBasePlotter : : setKeyItemWidth ( double __value )
{
if ( this - > plotterStyle . keyStyle . itemWidth ! = __value ) {
this - > plotterStyle . keyStyle . itemWidth = __value ;
redrawPlot ( ) ;
}
}
double JKQTBasePlotter : : getKeyItemWidth ( ) const
{
return this - > plotterStyle . keyStyle . itemWidth ;
}
void JKQTBasePlotter : : setKeyItemHeight ( double __value )
{
if ( this - > plotterStyle . keyStyle . itemHeight ! = __value ) {
this - > plotterStyle . keyStyle . itemHeight = __value ;
redrawPlot ( ) ;
}
}
double JKQTBasePlotter : : getKeyItemHeight ( ) const
{
return this - > plotterStyle . keyStyle . itemHeight ;
}
void JKQTBasePlotter : : setKeyYSeparation ( double __value )
{
if ( this - > plotterStyle . keyStyle . ySeparation ! = __value ) {
this - > plotterStyle . keyStyle . ySeparation = __value ;
redrawPlot ( ) ;
}
}
double JKQTBasePlotter : : getKeyYSeparation ( ) const
{
return this - > plotterStyle . keyStyle . ySeparation ;
}
void JKQTBasePlotter : : setKeyLineLength ( double __value )
{
if ( this - > plotterStyle . keyStyle . sampleLineLength ! = __value ) {
this - > plotterStyle . keyStyle . sampleLineLength = __value ;
redrawPlot ( ) ;
}
}
double JKQTBasePlotter : : getKeyLineLength ( ) const
{
return this - > plotterStyle . keyStyle . sampleLineLength ;
}
void JKQTBasePlotter : : setKeyXMargin ( double __value )
{
if ( this - > plotterStyle . keyStyle . xMargin ! = __value ) {
this - > plotterStyle . keyStyle . xMargin = __value ;
redrawPlot ( ) ;
}
}
double JKQTBasePlotter : : getKeyXMargin ( ) const
{
return this - > plotterStyle . keyStyle . xMargin ;
}
void JKQTBasePlotter : : setKeyYMargin ( double __value )
{
if ( this - > plotterStyle . keyStyle . yMargin ! = __value ) {
this - > plotterStyle . keyStyle . yMargin = __value ;
redrawPlot ( ) ;
}
}
double JKQTBasePlotter : : getKeyYMargin ( ) const
{
return this - > plotterStyle . keyStyle . yMargin ;
}
void JKQTBasePlotter : : setKeyXSeparation ( double __value )
{
if ( this - > plotterStyle . keyStyle . xSeparation ! = __value ) {
this - > plotterStyle . keyStyle . xSeparation = __value ;
redrawPlot ( ) ;
}
}
double JKQTBasePlotter : : getKeyXSeparation ( ) const
{
return this - > plotterStyle . keyStyle . xSeparation ;
}
void JKQTBasePlotter : : setKeyXOffset ( double __value )
{
if ( this - > plotterStyle . keyStyle . xOffset ! = __value ) {
this - > plotterStyle . keyStyle . xOffset = __value ;
redrawPlot ( ) ;
}
}
double JKQTBasePlotter : : getKeyXOffset ( ) const
{
return this - > plotterStyle . keyStyle . xOffset ;
}
void JKQTBasePlotter : : setKeyYOffset ( double __value )
{
if ( this - > plotterStyle . keyStyle . yOffset ! = __value ) {
this - > plotterStyle . keyStyle . yOffset = __value ;
redrawPlot ( ) ;
}
}
double JKQTBasePlotter : : getKeyYOffset ( ) const
{
return this - > plotterStyle . keyStyle . yOffset ;
}
void JKQTBasePlotter : : setShowKey ( bool __value )
{
if ( this - > plotterStyle . keyStyle . visible ! = __value ) {
this - > plotterStyle . keyStyle . visible = __value ;
redrawPlot ( ) ;
}
}
bool JKQTBasePlotter : : getShowKey ( ) const
{
return this - > plotterStyle . keyStyle . visible ;
}
void JKQTBasePlotter : : setShowKeyFrame ( bool __value )
{
if ( this - > plotterStyle . keyStyle . frameVisible ! = __value ) {
this - > plotterStyle . keyStyle . frameVisible = __value ;
redrawPlot ( ) ;
}
}
bool JKQTBasePlotter : : getShowKeyFrame ( ) const
{
return this - > plotterStyle . keyStyle . frameVisible ;
}
void JKQTBasePlotter : : setKeyFrameColor ( const QColor & __value )
{
if ( this - > plotterStyle . keyStyle . frameColor ! = __value ) {
this - > plotterStyle . keyStyle . frameColor = __value ;
redrawPlot ( ) ;
}
}
QColor JKQTBasePlotter : : getKeyFrameColor ( ) const
{
return this - > plotterStyle . keyStyle . frameColor ;
}
void JKQTBasePlotter : : setKeyBackgroundColor ( const QColor & __value )
{
if ( this - > plotterStyle . keyStyle . backgroundColor ! = __value ) {
this - > plotterStyle . keyStyle . backgroundColor = __value ;
redrawPlot ( ) ;
}
}
void JKQTBasePlotter : : setKeyFrameWidth ( double __value )
{
if ( this - > plotterStyle . keyStyle . frameWidth ! = __value ) {
this - > plotterStyle . keyStyle . frameWidth = __value ;
redrawPlot ( ) ;
}
}
void JKQTBasePlotter : : setKeyFrameRounding ( double __value )
{
if ( this - > plotterStyle . keyStyle . frameRounding ! = __value ) {
this - > plotterStyle . keyStyle . frameRounding = __value ;
redrawPlot ( ) ;
}
}
double JKQTBasePlotter : : getKeyFrameWidth ( ) const
{
return this - > plotterStyle . keyStyle . frameWidth ;
}
double JKQTBasePlotter : : getKeyFrameRounding ( ) const
{
return this - > plotterStyle . keyStyle . frameRounding ;
}
void JKQTBasePlotter : : setKeyAutosize ( bool __value )
{
if ( this - > plotterStyle . keyStyle . autosize ! = __value ) {
this - > plotterStyle . keyStyle . autosize = __value ;
redrawPlot ( ) ;
}
}
bool JKQTBasePlotter : : getKeyAutosize ( ) const
{
return this - > plotterStyle . keyStyle . autosize ;
}
void JKQTBasePlotter : : setKeyPosition ( const JKQTPKeyPosition & __value )
{
if ( this - > plotterStyle . keyStyle . position ! = __value ) {
this - > plotterStyle . keyStyle . position = __value ;
redrawPlot ( ) ;
}
}
JKQTPKeyPosition JKQTBasePlotter : : getKeyPosition ( ) const
{
return this - > plotterStyle . keyStyle . position ;
}
void JKQTBasePlotter : : setKeyLayout ( const JKQTPKeyLayout & __value )
{
if ( this - > plotterStyle . keyStyle . layout ! = __value ) {
this - > plotterStyle . keyStyle . layout = __value ;
redrawPlot ( ) ;
}
}
JKQTPKeyLayout JKQTBasePlotter : : getKeyLayout ( ) const
{
return this - > plotterStyle . keyStyle . layout ;
}
QColor JKQTBasePlotter : : getDefaultTextColor ( ) const
{
return this - > plotterStyle . defaultTextColor ;
}
double JKQTBasePlotter : : getDefaultTextSize ( ) const
{
return this - > plotterStyle . defaultFontSize ;
}
QString JKQTBasePlotter : : getDefaultTextFontName ( ) const
{
return this - > plotterStyle . defaultFontName ;
}
void JKQTBasePlotter : : setDefaultTextColor ( QColor __value )
{
if ( this - > plotterStyle . defaultTextColor ! = __value ) {
this - > plotterStyle . defaultTextColor = __value ;
redrawPlot ( ) ;
}
}
void JKQTBasePlotter : : setDefaultTextSize ( float __value )
{
if ( this - > plotterStyle . defaultFontSize ! = __value ) {
this - > plotterStyle . defaultFontSize = __value ;
redrawPlot ( ) ;
}
}
void JKQTBasePlotter : : setDefaultTextFontName ( const QString & __value )
{
if ( this - > plotterStyle . defaultFontName ! = __value ) {
this - > plotterStyle . defaultFontName = __value ;
redrawPlot ( ) ;
}
}
void JKQTBasePlotter : : setPlotLabelFontSize ( double __value )
{
if ( this - > plotterStyle . plotLabelFontSize ! = __value ) {
this - > plotterStyle . plotLabelFontSize = __value ;
redrawPlot ( ) ;
}
}
double JKQTBasePlotter : : getPlotLabelFontSize ( ) const
{
return this - > plotterStyle . plotLabelFontSize ;
}
void JKQTBasePlotter : : setplotLabelFontName ( const QString & __value )
{
if ( this - > plotterStyle . plotLabelFontName ! = __value ) {
this - > plotterStyle . plotLabelFontName = __value ;
redrawPlot ( ) ;
}
}
QString JKQTBasePlotter : : getplotLabelFontName ( ) const
{
return this - > plotterStyle . plotLabelFontName ;
}
void JKQTBasePlotter : : setPlotLabel ( const QString & __value )
{
if ( this - > plotLabel ! = __value ) {
this - > plotLabel = __value ;
redrawPlot ( ) ;
}
}
QString JKQTBasePlotter : : getPlotLabel ( ) const
{
return this - > plotLabel ;
}
QColor JKQTBasePlotter : : getKeyBackgroundColor ( ) const
{
return this - > plotterStyle . keyStyle . backgroundColor ;
}
void JKQTBasePlotter : : setPlotBackgroundColor ( const QColor & __value )
{
if ( this - > plotterStyle . plotBackgroundColor ! = __value ) {
this - > plotterStyle . plotBackgroundColor = __value ;
redrawPlot ( ) ;
}
}
bool JKQTBasePlotter : : isPlotFrameVisible ( ) const
{
return plotterStyle . plotFrameVisible ;
}
QColor JKQTBasePlotter : : getPlotFrameColor ( ) const
{
return plotterStyle . plotFrameColor ;
}
double JKQTBasePlotter : : getPlotFrameWidth ( ) const
{
return plotterStyle . plotFrameWidth ;
}
double JKQTBasePlotter : : getPlotFrameRounding ( ) const
{
return plotterStyle . plotFrameRounding ;
}
void JKQTBasePlotter : : setPlotFrameWidth ( double __value )
{
if ( this - > plotterStyle . plotFrameWidth ! = __value ) {
this - > plotterStyle . plotFrameWidth = __value ;
redrawPlot ( ) ;
}
2015-07-11 18:56:02 +08:00
}
2019-02-08 00:24:46 +08:00
void JKQTBasePlotter : : setPlotFrameRounding ( double __value )
{
if ( this - > plotterStyle . plotFrameRounding ! = __value ) {
this - > plotterStyle . plotFrameRounding = __value ;
redrawPlot ( ) ;
2015-07-11 18:56:02 +08:00
}
}
2019-02-08 00:24:46 +08:00
void JKQTBasePlotter : : setPlotFrameColor ( QColor __value )
2019-01-26 19:28:44 +08:00
{
2019-02-08 00:24:46 +08:00
if ( this - > plotterStyle . plotFrameColor ! = __value ) {
this - > plotterStyle . plotFrameColor = __value ;
redrawPlot ( ) ;
}
2019-01-26 19:28:44 +08:00
}
2019-02-08 00:24:46 +08:00
void JKQTBasePlotter : : setPlotFrameVisible ( bool __value )
2019-01-26 19:28:44 +08:00
{
2019-02-08 00:24:46 +08:00
if ( this - > plotterStyle . plotFrameVisible ! = __value ) {
this - > plotterStyle . plotFrameVisible = __value ;
redrawPlot ( ) ;
}
}
void JKQTBasePlotter : : setUseAntiAliasingForText ( bool __value )
{
if ( this - > plotterStyle . useAntiAliasingForText ! = __value ) {
this - > plotterStyle . useAntiAliasingForText = __value ;
redrawPlot ( ) ;
}
}
void JKQTBasePlotter : : setUseAntiAliasingForGraphs ( bool __value )
{
if ( this - > plotterStyle . useAntiAliasingForGraphs ! = __value ) {
this - > plotterStyle . useAntiAliasingForGraphs = __value ;
redrawPlot ( ) ;
}
}
void JKQTBasePlotter : : setUseAntiAliasingForSystem ( bool __value )
{
if ( this - > plotterStyle . useAntiAliasingForSystem ! = __value ) {
this - > plotterStyle . useAntiAliasingForSystem = __value ;
redrawPlot ( ) ;
}
}
void JKQTBasePlotter : : setAxisAspectRatio ( double __value )
{
if ( this - > axisAspectRatio ! = __value ) {
this - > axisAspectRatio = __value ;
redrawPlot ( ) ;
}
2019-01-26 19:28:44 +08:00
}
2019-01-29 05:14:27 +08:00
void JKQTBasePlotter : : setGridPrinting ( bool __value )
{
this - > gridPrinting = __value ;
}
bool JKQTBasePlotter : : getGridPrinting ( ) const
{
return this - > gridPrinting ;
}
void JKQTBasePlotter : : setGridPrintingCurrentX ( size_t __value )
{
this - > gridPrintingCurrentX = __value ;
}
size_t JKQTBasePlotter : : getGridPrintingCurrentX ( ) const
{
return this - > gridPrintingCurrentX ;
}
void JKQTBasePlotter : : setGridPrintingCurrentY ( size_t __value )
{
this - > gridPrintingCurrentY = __value ;
}
size_t JKQTBasePlotter : : getGridPrintingCurrentY ( ) const
{
return this - > gridPrintingCurrentY ;
}
void JKQTBasePlotter : : setGridPrintingCurrentPos ( size_t x , size_t y )
{
gridPrintingCurrentX = x ;
gridPrintingCurrentY = y ;
}
2019-02-08 00:24:46 +08:00
void JKQTBasePlotter : : setCurrentSaveDirectory ( const QString & __value )
{
this - > currentSaveDirectory = __value ;
}
QString JKQTBasePlotter : : getCurrentSaveDirectory ( ) const
{
return this - > currentSaveDirectory ;
}
void JKQTBasePlotter : : setCurrentFileFormat ( const QString & __value )
{
this - > currentFileFormat = __value ;
}
QString JKQTBasePlotter : : getCurrentFileFormat ( ) const
{
return this - > currentFileFormat ;
}
void JKQTBasePlotter : : setCSVdecimalSeparator ( const QString & __value )
{
plotterStyle . CSVdecimalSeparator = __value ;
}
void JKQTBasePlotter : : setCSVcommentInitializer ( const QString & __value )
{
plotterStyle . CSVcommentInitializer = __value ;
}
void JKQTBasePlotter : : enableDebugShowRegionBoxes ( bool enabled )
{
if ( plotterStyle . debugShowRegionBoxes ! = enabled ) {
plotterStyle . debugShowRegionBoxes = enabled ;
redrawPlot ( ) ;
}
}
bool JKQTBasePlotter : : isDebugShowRegionBoxesEnabled ( ) const
{
return plotterStyle . debugShowRegionBoxes ;
}
QString JKQTBasePlotter : : getCSVcommentInitializer ( ) const
{
return plotterStyle . CSVcommentInitializer ;
}
JKQTMathText * JKQTBasePlotter : : getMathText ( ) {
return & mathText ;
}
const JKQTMathText * JKQTBasePlotter : : getMathText ( ) const {
return & mathText ;
}
JKQTPHorizontalAxis * JKQTBasePlotter : : getXAxis ( ) {
return xAxis ;
}
JKQTPVerticalAxis * JKQTBasePlotter : : getYAxis ( ) {
return yAxis ;
}
const JKQTPHorizontalAxis * JKQTBasePlotter : : getXAxis ( ) const {
return xAxis ;
}
const JKQTPVerticalAxis * JKQTBasePlotter : : getYAxis ( ) const {
return yAxis ;
}
QAction * JKQTBasePlotter : : getActionSavePlot ( ) const { return this - > actSavePlot ; }
QAction * JKQTBasePlotter : : getActionSaveData ( ) const { return this - > actSaveData ; }
QAction * JKQTBasePlotter : : getActionCopyData ( ) const { return this - > actCopyData ; }
QAction * JKQTBasePlotter : : getActionCopyPixelImage ( ) const { return this - > actCopyPixelImage ; }
QAction * JKQTBasePlotter : : getActionCopyMatlab ( ) const { return this - > actCopyMatlab ; }
QAction * JKQTBasePlotter : : getActionSavePDF ( ) const { return this - > actSavePDF ; }
# if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0))
QAction * JKQTBasePlotter : : getActionSavePS ( ) const { return this - > actSavePS ; }
# endif
QAction * JKQTBasePlotter : : getActionSavePix ( ) const { return this - > actSavePix ; }
QAction * JKQTBasePlotter : : getActionSaveSVG ( ) const { return this - > actSaveSVG ; }
QAction * JKQTBasePlotter : : getActionPrint ( ) const { return this - > actPrint ; }
QAction * JKQTBasePlotter : : getActionSaveCSV ( ) const { return this - > actSaveCSV ; }
QAction * JKQTBasePlotter : : getActionZoomAll ( ) const { return this - > actZoomAll ; }
QAction * JKQTBasePlotter : : getActionZoomIn ( ) const { return this - > actZoomIn ; }
QAction * JKQTBasePlotter : : getActionZoomOut ( ) const { return this - > actZoomOut ; }
QAction * JKQTBasePlotter : : getActionShowPlotData ( ) const { return this - > actShowPlotData ; }
JKQTBasePlotter : : AdditionalActionsMap JKQTBasePlotter : : getLstAdditionalPlotterActions ( ) const { return this - > lstAdditionalPlotterActions ; }
QString JKQTBasePlotter : : getCSVdecimalSeparator ( ) const
{
return plotterStyle . CSVdecimalSeparator ;
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : registerAdditionalAction ( const QString & key , QAction * act )
2015-07-11 18:56:02 +08:00
{
if ( ! lstAdditionalPlotterActions . contains ( key ) ) {
QList < QPointer < QAction > > l ;
lstAdditionalPlotterActions . insert ( key , l ) ;
}
lstAdditionalPlotterActions [ key ] . append ( act ) ;
AdditionalActionsMapIterator it ( lstAdditionalPlotterActions ) ;
while ( it . hasNext ( ) ) {
it . next ( ) ;
for ( int i = it . value ( ) . size ( ) - 1 ; i > = 0 ; i - - ) {
if ( ! it . value ( ) . at ( i ) ) {
lstAdditionalPlotterActions [ it . key ( ) ] . removeAt ( i ) ;
}
}
}
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : deregisterAdditionalAction ( QAction * act )
2015-07-11 18:56:02 +08:00
{
AdditionalActionsMapIterator it ( lstAdditionalPlotterActions ) ;
while ( it . hasNext ( ) ) {
it . next ( ) ;
for ( int i = it . value ( ) . size ( ) - 1 ; i > = 0 ; i - - ) {
if ( it . value ( ) . at ( i ) = = act ) {
lstAdditionalPlotterActions [ it . key ( ) ] . removeAt ( i ) ;
}
}
}
}
2019-02-08 00:24:46 +08:00
bool JKQTBasePlotter : : getMasterSynchronizeWidth ( ) const { return this - > masterSynchronizeWidth ; }
bool JKQTBasePlotter : : getMasterSynchronizeHeight ( ) const { return this - > masterSynchronizeHeight ; }
void JKQTBasePlotter : : setFontSizePrintMultiplier ( double __value )
{
this - > fontSizePrintMultiplier = __value ;
}
double JKQTBasePlotter : : getFontSizePrintMultiplier ( ) const
{
return this - > fontSizePrintMultiplier ;
}
void JKQTBasePlotter : : setLineWidthPrintMultiplier ( double __value )
{
this - > lineWidthPrintMultiplier = __value ;
}
double JKQTBasePlotter : : getLineWidthPrintMultiplier ( ) const
{
return this - > lineWidthPrintMultiplier ;
}
double JKQTBasePlotter : : getFontSizeMultiplier ( ) const { return this - > fontSizeMultiplier ; }
double JKQTBasePlotter : : getLineWidthMultiplier ( ) const { return this - > lineWidthMultiplier ; }
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : copyData ( ) {
2015-07-11 18:56:02 +08:00
loadUserSettings ( ) ;
QString result = " " ;
QString qfresult ;
QSet < int > cols = getDataColumnsByUser ( ) ;
{
QTextStream txt ( & result ) ;
QLocale loc = QLocale : : system ( ) ;
loc . setNumberOptions ( QLocale : : OmitGroupSeparator ) ;
QChar dp = loc . decimalPoint ( ) ;
QString sep = " \t " ;
datastore - > saveCSV ( txt , cols , sep , QString ( dp ) , " " , " \" " ) ;
txt . flush ( ) ;
}
{
QTextStream txt ( & qfresult ) ;
datastore - > saveCSV ( txt , cols , " , " , " . " , " #! " , " \" " ) ;
txt . flush ( ) ;
}
QClipboard * clipboard = QApplication : : clipboard ( ) ;
QMimeData * mime = new QMimeData ( ) ;
mime - > setText ( result ) ;
mime - > setData ( " jkqtplotter/csv " , qfresult . toUtf8 ( ) ) ;
clipboard - > setMimeData ( mime ) ;
//clipboard->setText(result);
saveUserSettings ( ) ;
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : copyDataMatlab ( ) {
2015-07-11 18:56:02 +08:00
loadUserSettings ( ) ;
QString result = " " ;
{
QTextStream txt ( & result ) ;
datastore - > saveMatlab ( txt , getDataColumnsByUser ( ) ) ;
txt . flush ( ) ;
}
QClipboard * clipboard = QApplication : : clipboard ( ) ;
clipboard - > setText ( result ) ;
saveUserSettings ( ) ;
}
2019-01-26 19:28:44 +08:00
void JKQTBasePlotter : : saveData ( const QString & filename , const QString & format ) {
2015-07-11 18:56:02 +08:00
loadUserSettings ( ) ;
QStringList fileformats ;
QStringList fileformatIDs ;
fileformats < < tr ( " Comma Separated Values (*.csv *.dat) " ) ;
fileformatIDs < < " csv " ;
fileformats < < tr ( " Tab Separated Values (*.txt) " ) ;
fileformatIDs < < " tab " ;
fileformats < < tr ( " Semicolon Separated Values [German Excel] (*.csv *.dat *.txt) " ) ;
fileformatIDs < < " gex " ;
fileformats < < tr ( " Semicolon Separated Values (*.csv *.dat *.txt) " ) ;
fileformatIDs < < " sem " ;
fileformats < < tr ( " SYLK spreadsheet (*.slk) " ) ;
fileformatIDs < < " slk " ;
fileformats < < tr ( " DIF: Data Interchange Format (*.dif) " ) ;
fileformatIDs < < " dif " ;
fileformats < < tr ( " Matlab Script (*.m) " ) ;
fileformatIDs < < " m " ;
for ( int i = 0 ; i < jkqtpSaveDataAdapters . size ( ) ; i + + ) {
fileformats < < jkqtpSaveDataAdapters [ i ] - > getFilter ( ) ;
fileformatIDs < < QString ( " custom%1 " ) . arg ( i ) ;
}
QString fn = filename ;
QString fmt = format . toLower ( ) ;
if ( fmt . isEmpty ( ) ) {
QString e = QFileInfo ( filename ) . suffix ( ) . toLower ( ) ; // jkqtp_tolower(extract_file_ext(fn.toStdString()));
if ( e = = " csv " | | e = = " dat " ) {
fmt = " csv " ;
} else if ( e = = " txt " ) {
fmt = " tab " ;
} else if ( ( e = = " slk " ) | | ( e = = " sylk " ) ) {
fmt = " slk " ;
} else if ( e = = " dif " ) {
fmt = " dif " ;
} else if ( e = = " m " ) {
fmt = " m " ;
}
}
if ( fn . isEmpty ( ) ) {
QString selectedFilter = currentDataFileFormat ;
//qDebug()<<"before: currentSaveDirectory="<<currentSaveDirectory;
2018-11-18 18:59:30 +08:00
fn = QFileDialog : : getSaveFileName ( nullptr , tr ( " Save Plot Data " ) ,
2015-07-11 18:56:02 +08:00
currentSaveDirectory ,
fileformats . join ( " ;; " ) ,
& selectedFilter ) ;
if ( ! fn . isEmpty ( ) ) {
currentSaveDirectory = QFileInfo ( fn ) . absolutePath ( ) ;
currentDataFileFormat = selectedFilter ;
}
//qDebug()<<"after: currentSaveDirectory="<<currentSaveDirectory;
fmt = " csv " ;
for ( int i = 0 ; i < fileformats . size ( ) ; i + + ) {
if ( selectedFilter . contains ( fileformats [ i ] ) ) {
fmt = fileformatIDs [ i ] ;
}
}
}
saveUserSettings ( ) ;
if ( ! fn . isEmpty ( ) ) {
if ( fmt = = " csv " ) {
saveAsCSV ( fn ) ;
} else if ( fmt = = " tab " ) {
saveAsTabSV ( fn ) ;
} else if ( fmt = = " gex " ) {
saveAsGerExcelCSV ( fn ) ;
} else if ( fmt = = " sem " ) {
saveAsSemicolonSV ( fn ) ;
} else if ( fmt = = " slk " ) {
saveAsSYLK ( fn ) ;
} else if ( fmt = = " dif " ) {
saveAsDIF ( fn ) ;
} else if ( fmt = = " m " ) {
saveAsMatlab ( fn ) ;
} else if ( fmt . startsWith ( " custom " ) ) {
QString fidx = fmt ;
fidx = fidx . remove ( 0 , 6 ) ;
int idx = fidx . toInt ( ) ;
if ( idx > = 0 & & idx < jkqtpSaveDataAdapters . size ( ) & & jkqtpSaveDataAdapters [ idx ] ) {
QStringList cn ;
QList < QVector < double > > dataset = datastore - > getData ( & cn ) ;
jkqtpSaveDataAdapters [ idx ] - > saveJKQTPData ( fn , dataset , cn ) ;
}
}
}
}
2019-01-26 19:28:44 +08:00
void JKQTBasePlotter : : saveAsCSV ( const QString & filename ) {
2019-02-08 00:24:46 +08:00
saveAsCSV ( filename , plotterStyle . CSVdecimalSeparator , plotterStyle . CSVcommentInitializer ) ;
}
void JKQTBasePlotter : : saveAsCSV ( const QString & filename , const QString & decimalSeparator , const QString & commentInitializer )
{
2015-07-11 18:56:02 +08:00
loadUserSettings ( ) ;
QString fn = filename ;
if ( fn . isEmpty ( ) ) {
2018-11-18 18:59:30 +08:00
fn = QFileDialog : : getSaveFileName ( nullptr , tr ( " Save Plot Data " ) ,
2015-07-11 18:56:02 +08:00
currentSaveDirectory ,
tr ( " Comma Separated Values (*.csv *.dat) " ) ) ;
if ( ! fn . isEmpty ( ) ) currentSaveDirectory = QFileInfo ( fn ) . absolutePath ( ) ;
}
if ( ! fn . isEmpty ( ) ) {
2019-02-08 00:24:46 +08:00
datastore - > saveCSV ( fn , getDataColumnsByUser ( ) , " , " , decimalSeparator , commentInitializer ) ;
2015-07-11 18:56:02 +08:00
}
saveUserSettings ( ) ;
2019-02-08 00:24:46 +08:00
}
void JKQTBasePlotter : : saveAsSemicolonSV ( const QString & filename ) {
saveAsSemicolonSV ( filename , plotterStyle . CSVdecimalSeparator , plotterStyle . CSVcommentInitializer ) ;
2015-07-11 18:56:02 +08:00
}
2019-02-08 00:24:46 +08:00
void JKQTBasePlotter : : saveAsSemicolonSV ( const QString & filename , const QString & decimalSeparator , const QString & commentInitializer ) {
2015-07-11 18:56:02 +08:00
loadUserSettings ( ) ;
QString fn = filename ;
if ( fn . isEmpty ( ) ) {
2018-11-18 18:59:30 +08:00
fn = QFileDialog : : getSaveFileName ( nullptr , tr ( " Save Plot Data " ) ,
2015-07-11 18:56:02 +08:00
currentSaveDirectory ,
2019-02-08 00:24:46 +08:00
tr ( " Comma Separated Values (*.csv *.dat) " ) ) ;
2015-07-11 18:56:02 +08:00
if ( ! fn . isEmpty ( ) ) currentSaveDirectory = QFileInfo ( fn ) . absolutePath ( ) ;
}
if ( ! fn . isEmpty ( ) ) {
2019-02-08 00:24:46 +08:00
datastore - > saveCSV ( fn , getDataColumnsByUser ( ) , " ; " , decimalSeparator , commentInitializer ) ;
2015-07-11 18:56:02 +08:00
}
saveUserSettings ( ) ;
}
2019-02-08 00:24:46 +08:00
void JKQTBasePlotter : : saveAsTabSV ( const QString & filename ) {
saveAsTabSV ( filename , plotterStyle . CSVdecimalSeparator , plotterStyle . CSVcommentInitializer ) ;
}
void JKQTBasePlotter : : saveAsTabSV ( const QString & filename , const QString & decimalSeparator , const QString & commentInitializer ) {
2015-07-11 18:56:02 +08:00
loadUserSettings ( ) ;
QString fn = filename ;
if ( fn . isEmpty ( ) ) {
2018-11-18 18:59:30 +08:00
fn = QFileDialog : : getSaveFileName ( nullptr , tr ( " Save Plot Data " ) ,
2015-07-11 18:56:02 +08:00
currentSaveDirectory ,
2019-02-08 00:24:46 +08:00
tr ( " Tabulator Separated Values (*.txt) " ) ) ;
2015-07-11 18:56:02 +08:00
if ( ! fn . isEmpty ( ) ) currentSaveDirectory = QFileInfo ( fn ) . absolutePath ( ) ;
}
if ( ! fn . isEmpty ( ) ) {
2019-02-08 00:24:46 +08:00
datastore - > saveCSV ( fn , getDataColumnsByUser ( ) , " \t " , decimalSeparator , commentInitializer ) ;
2015-07-11 18:56:02 +08:00
}
saveUserSettings ( ) ;
}
2019-02-08 00:24:46 +08:00
void JKQTBasePlotter : : saveAsSYLK ( const QString & filename ) {
2015-07-11 18:56:02 +08:00
loadUserSettings ( ) ;
QString fn = filename ;
if ( fn . isEmpty ( ) ) {
2018-11-18 18:59:30 +08:00
fn = QFileDialog : : getSaveFileName ( nullptr , tr ( " Save Plot Data " ) ,
2015-07-11 18:56:02 +08:00
currentSaveDirectory ,
2019-02-08 00:24:46 +08:00
tr ( " SYLK spreadsheet (*.slk) " ) ) ;
2015-07-11 18:56:02 +08:00
if ( ! fn . isEmpty ( ) ) currentSaveDirectory = QFileInfo ( fn ) . absolutePath ( ) ;
}
if ( ! fn . isEmpty ( ) ) {
2019-02-08 00:24:46 +08:00
datastore - > saveSYLK ( fn , getDataColumnsByUser ( ) ) ;
2015-07-11 18:56:02 +08:00
}
saveUserSettings ( ) ;
}
2019-02-08 00:24:46 +08:00
void JKQTBasePlotter : : saveAsMatlab ( const QString & filename ) {
2015-07-11 18:56:02 +08:00
loadUserSettings ( ) ;
QString fn = filename ;
if ( fn . isEmpty ( ) ) {
2018-11-18 18:59:30 +08:00
fn = QFileDialog : : getSaveFileName ( nullptr , tr ( " Save Plot Data " ) ,
2015-07-11 18:56:02 +08:00
currentSaveDirectory ,
2019-02-08 00:24:46 +08:00
tr ( " Matlab Script (*.m) " ) ) ;
2015-07-11 18:56:02 +08:00
if ( ! fn . isEmpty ( ) ) currentSaveDirectory = QFileInfo ( fn ) . absolutePath ( ) ;
}
if ( ! fn . isEmpty ( ) ) {
2019-02-08 00:24:46 +08:00
datastore - > saveMatlab ( fn , getDataColumnsByUser ( ) ) ;
2015-07-11 18:56:02 +08:00
}
saveUserSettings ( ) ;
}
2019-02-08 00:24:46 +08:00
void JKQTBasePlotter : : saveAsDIF ( const QString & filename ) {
2015-07-11 18:56:02 +08:00
loadUserSettings ( ) ;
QString fn = filename ;
if ( fn . isEmpty ( ) ) {
2018-11-18 18:59:30 +08:00
fn = QFileDialog : : getSaveFileName ( nullptr , tr ( " Save Plot Data " ) ,
2015-07-11 18:56:02 +08:00
currentSaveDirectory ,
2019-02-08 00:24:46 +08:00
tr ( " DIF: Data Interchange Format (*.dif) " ) ) ;
2015-07-11 18:56:02 +08:00
if ( ! fn . isEmpty ( ) ) currentSaveDirectory = QFileInfo ( fn ) . absolutePath ( ) ;
}
if ( ! fn . isEmpty ( ) ) {
2019-02-08 00:24:46 +08:00
datastore - > saveDIF ( fn , getDataColumnsByUser ( ) ) ;
2015-07-11 18:56:02 +08:00
}
saveUserSettings ( ) ;
}
2019-02-08 00:24:46 +08:00
2019-01-26 19:28:44 +08:00
void JKQTBasePlotter : : saveAsGerExcelCSV ( const QString & filename ) {
2015-07-11 18:56:02 +08:00
loadUserSettings ( ) ;
QString fn = filename ;
if ( fn . isEmpty ( ) ) {
2018-11-18 18:59:30 +08:00
fn = QFileDialog : : getSaveFileName ( nullptr , tr ( " Save Plot Data " ) ,
2015-07-11 18:56:02 +08:00
currentSaveDirectory ,
tr ( " Tabulator Separated Values (*.txt) " ) ) ;
if ( ! fn . isEmpty ( ) ) currentSaveDirectory = QFileInfo ( fn ) . absolutePath ( ) ;
}
if ( ! fn . isEmpty ( ) ) {
datastore - > saveCSV ( fn , getDataColumnsByUser ( ) , " ; " , " , " , " " , " \" " ) ;
}
saveUserSettings ( ) ;
}
2019-01-26 19:28:44 +08:00
void JKQTBasePlotter : : saveAsPDF ( const QString & filename , bool displayPreview ) {
2015-07-11 18:56:02 +08:00
loadUserSettings ( ) ;
QString fn = filename ;
if ( fn . isEmpty ( ) ) {
2018-11-18 18:59:30 +08:00
fn = QFileDialog : : getSaveFileName ( nullptr , tr ( " Save Plot " ) ,
2015-07-11 18:56:02 +08:00
currentSaveDirectory ,
tr ( " PDF File (*.pdf) " ) ) ;
if ( ! fn . isEmpty ( ) ) currentSaveDirectory = QFileInfo ( fn ) . absolutePath ( ) ;
}
if ( ! fn . isEmpty ( ) ) {
QPrinter * printer = new QPrinter ;
bool doLandscape = widgetWidth > widgetHeight ;
if ( gridPrinting ) {
gridPrintingCalc ( ) ;
doLandscape = gridPrintingSize . width ( ) > gridPrintingSize . height ( ) ;
}
if ( doLandscape ) {
printer - > setOrientation ( QPrinter : : Landscape ) ;
} else {
printer - > setOrientation ( QPrinter : : Portrait ) ;
}
printer - > setOutputFormat ( QPrinter : : PdfFormat ) ;
printer - > setColorMode ( QPrinter : : Color ) ;
printer - > setOutputFileName ( fn ) ;
printer - > setPageMargins ( 0 , 0 , 0 , 0 , QPrinter : : Millimeter ) ;
printer - > setColorMode ( QPrinter : : Color ) ;
printpreviewNew ( printer , true , - 1.0 , - 1.0 , displayPreview ) ;
delete printer ;
}
saveUserSettings ( ) ;
}
2019-01-26 19:28:44 +08:00
void JKQTBasePlotter : : saveAsPS ( const QString & filename , bool displayPreview ) {
2015-07-11 18:56:02 +08:00
# if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0))
loadUserSettings ( ) ;
QString fn = filename ;
if ( fn . isEmpty ( ) ) {
2018-11-18 18:59:30 +08:00
fn = QFileDialog : : getSaveFileName ( nullptr , tr ( " Save Plot " ) ,
2015-07-11 18:56:02 +08:00
currentSaveDirectory ,
tr ( " PostScript File (*.ps) " ) ) ;
if ( ! fn . isEmpty ( ) ) currentSaveDirectory = QFileInfo ( fn ) . absolutePath ( ) ;
}
if ( ! fn . isEmpty ( ) ) {
QPrinter * printer = new QPrinter ;
bool doLandscape = widgetWidth > widgetHeight ;
if ( gridPrinting ) {
gridPrintingCalc ( ) ;
doLandscape = gridPrintingSize . width ( ) > gridPrintingSize . height ( ) ;
}
if ( doLandscape ) {
printer - > setOrientation ( QPrinter : : Landscape ) ;
} else {
printer - > setOrientation ( QPrinter : : Portrait ) ;
}
printer - > setOutputFormat ( QPrinter : : PostScriptFormat ) ;
printer - > setColorMode ( QPrinter : : Color ) ;
printer - > setOutputFileName ( fn ) ;
printer - > setPageMargins ( 0 , 0 , 0 , 0 , QPrinter : : Millimeter ) ;
printpreviewNew ( printer , true , - 1.0 , - 1.0 , displayPreview ) ;
delete printer ;
}
saveUserSettings ( ) ;
# else
saveAsPDF ( filename + " .pdf " , displayPreview ) ;
# endif
}
2019-01-26 19:28:44 +08:00
void JKQTBasePlotter : : saveImage ( const QString & filename , bool displayPreview ) {
2015-07-11 18:56:02 +08:00
loadUserSettings ( ) ;
QString fn = filename ;
QStringList filt ;
filt < < tr ( " Portable Document Format PDF [Qt] (*.pdf) " ) ;
# if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0))
filt < < tr ( " PostScript [Qt] (*.ps) " ) ;
# endif
filt < < tr ( " Scalable Vector Graphics [Qt] (*.svg) " ) ;
filt < < tr ( " PNG Image [Qt] (*.png) " ) ;
filt < < tr ( " BMP Image [Qt] (*.bmp) " ) ;
filt < < tr ( " TIFF Image [Qt] (*.tif *.tiff) " ) ;
filt < < tr ( " JPEG Image [Qt] (*.jpg *.jpeg) " ) ;
const int filtStartSize = filt . size ( ) ;
for ( int i = 0 ; i < jkqtpPaintDeviceAdapters . size ( ) ; i + + ) {
filt < < jkqtpPaintDeviceAdapters [ i ] - > getFilter ( ) ;
}
int qtwritersidx = filt . size ( ) ;
QList < QByteArray > writerformats = QImageWriter : : supportedImageFormats ( ) ;
for ( int i = 0 ; i < writerformats . size ( ) ; i + + ) {
filt < < QString ( " %1 Image (*.%2) " ) . arg ( QString ( writerformats [ i ] ) . toUpper ( ) ) . arg ( QString ( writerformats [ i ] . toLower ( ) ) ) ;
}
/*filt<<tr("X11 Bitmap [Qt] (*.xbm)");
filt < < tr ( " X11 Pixmap [Qt] (*.xpm) " ) ; */
QString selFormat = " " ;
if ( fn . isEmpty ( ) ) {
selFormat = currentFileFormat ;
2018-11-18 18:59:30 +08:00
fn = QFileDialog : : getSaveFileName ( nullptr , tr ( " Save Plot " ) ,
2015-07-11 18:56:02 +08:00
currentSaveDirectory ,
filt . join ( " ;; " ) , & selFormat ) ;
if ( ! fn . isEmpty ( ) ) {
currentSaveDirectory = QFileInfo ( fn ) . absolutePath ( ) ;
currentFileFormat = selFormat ;
}
}
//qDebug()<<"fn="<<fn<<" selFormat="<<selFormat;
saveUserSettings ( ) ;
if ( ! fn . isEmpty ( ) ) {
int filtID = filt . indexOf ( selFormat ) ;
bool isWithSpecialDeviceAdapter = filtID > = filtStartSize & & filtID < filtStartSize + jkqtpPaintDeviceAdapters . size ( ) ;
int adapterID = filtID - filtStartSize ;
QString e = QFileInfo ( filename ) . suffix ( ) . toLower ( ) ;
if ( ! isWithSpecialDeviceAdapter ) {
for ( int i = 0 ; i < jkqtpPaintDeviceAdapters . size ( ) ; i + + ) {
if ( jkqtpPaintDeviceAdapters [ i ] - > getFileExtension ( ) . contains ( e ) ) {
adapterID = i ;
isWithSpecialDeviceAdapter = true ;
break ;
}
}
}
//qDebug()<<"filtID="<<filtID<<" isWithSpecialDeviceAdapter="<<isWithSpecialDeviceAdapter<<" adapterID="<<adapterID;
int ids = 0 ;
if ( filtID = = ids + + ) {
saveAsPDF ( fn , displayPreview ) ;
# if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0))
} else if ( filtID = = ids + + ) {
saveAsPS ( fn , displayPreview ) ;
# endif
} else if ( filtID = = ids + + ) {
saveAsSVG ( fn , displayPreview ) ;
} else if ( isWithSpecialDeviceAdapter & & adapterID > = 0 & & adapterID < jkqtpPaintDeviceAdapters . size ( ) ) {
QString tempFM = " " ;
if ( QFile : : exists ( fn ) ) {
2015-08-04 23:38:29 +08:00
# ifdef QFWIDLIB_LIBRARY
QFTemporaryFile * tf = new QFTemporaryFile ( ) ;
# else
2015-07-11 18:56:02 +08:00
QTemporaryFile * tf = new QTemporaryFile ( ) ;
2015-08-04 23:38:29 +08:00
# endif
2015-07-11 18:56:02 +08:00
tf - > open ( ) ;
tempFM = tf - > fileName ( ) ;
tf - > close ( ) ;
delete tf ;
QFile : : copy ( fn , tempFM ) ;
}
2019-01-26 03:16:04 +08:00
mathText . setUseUnparsed ( ! jkqtpPaintDeviceAdapters [ adapterID ] - > useLatexParser ( ) ) ;
2015-07-11 18:56:02 +08:00
gridPrintingCalc ( ) ;
QPaintDevice * svg = jkqtpPaintDeviceAdapters [ adapterID ] - > createPaintdevice ( fn , gridPrintingSize . width ( ) , gridPrintingSize . height ( ) ) ;
if ( ! printpreviewNew ( svg , jkqtpPaintDeviceAdapters [ adapterID ] - > getSetAbsolutePaperSize ( ) , jkqtpPaintDeviceAdapters [ adapterID ] - > getPrintSizeXInMM ( ) , jkqtpPaintDeviceAdapters [ adapterID ] - > getPrintSizeYInMM ( ) , displayPreview ) ) {
delete svg ;
if ( QFile : : exists ( tempFM ) ) {
QFile : : copy ( tempFM , fn ) ;
QFile : : remove ( tempFM ) ;
}
} else {
delete svg ;
svg = jkqtpPaintDeviceAdapters [ adapterID ] - > createPaintdeviceMM ( fn , printSizeX_Millimeter , printSizeY_Millimeter ) ;
printpreviewPaintRequestedNew ( svg ) ;
delete svg ;
}
} else {
saveAsPixelImage ( fn , displayPreview , writerformats . value ( filtID - qtwritersidx , QByteArray ( ) ) ) ;
}
}
}
2019-01-26 19:28:44 +08:00
void JKQTBasePlotter : : saveAsPixelImage ( const QString & filename , bool displayPreview , const QByteArray & outputFormat ) {
2015-07-11 18:56:02 +08:00
loadUserSettings ( ) ;
QString fn = filename ;
QStringList filt ;
QList < QByteArray > writerformats = QImageWriter : : supportedImageFormats ( ) ;
for ( int i = 0 ; i < writerformats . size ( ) ; i + + ) {
filt < < QString ( " %1 Image (*.%2) " ) . arg ( QString ( writerformats [ i ] ) . toUpper ( ) ) . arg ( QString ( writerformats [ i ] . toLower ( ) ) ) ;
}
/*filt<<tr("PNG Image (*.png)");
filt < < tr ( " BMP Image (*.bmp) " ) ;
filt < < tr ( " TIFF Image (*.tif *.tiff) " ) ;
filt < < tr ( " JPEG Image (*.jpg *.jpeg) " ) ;
filt < < tr ( " X11 Bitmap (*.xbm) " ) ;
filt < < tr ( " X11 Pixmap (*.xpm) " ) ; */
QString selFormat ;
if ( fn . isEmpty ( ) ) {
selFormat = currentFileFormat ;
2018-11-18 18:59:30 +08:00
fn = QFileDialog : : getSaveFileName ( nullptr , tr ( " Save Plot " ) ,
2015-07-11 18:56:02 +08:00
currentSaveDirectory ,
filt . join ( " ;; " ) , & selFormat ) ;
if ( ! fn . isEmpty ( ) ) currentSaveDirectory = QFileInfo ( fn ) . absolutePath ( ) ;
}
saveUserSettings ( ) ;
if ( ! fn . isEmpty ( ) ) {
int filtID = filt . indexOf ( selFormat ) ;
//QString ext=tolower(extract_file_ext(fn.toStdString()));
QString form = " NONE " ;
if ( filtID > = 0 & & filtID < writerformats . size ( ) ) {
form = writerformats [ filtID ] ;
}
if ( outputFormat . size ( ) > 0 ) {
form = outputFormat ;
}
/*if (filtID==2 || ext=="tif" || ext=="tiff") { // currentFileFormat
form = " TIFF " ;
} else if ( filtID = = 0 | | ext = = " png " ) {
form = " PNG " ;
} else if ( filtID = = 1 | | ext = = " bmp " ) {
form = " BMP " ;
} else if ( filtID = = 3 | | ext = = " jpg " | | ext = = " jpeg " ) {
form = " JPEG " ;
} else if ( ext = = " ppm " ) {
form = " PPM " ;
} else if ( filtID = = 4 | | ext = = " xbm " ) {
form = " XBM " ;
} else if ( filtID = = 5 | | ext = = " xpm " ) {
form = " XPM " ;
} */
gridPrintingCalc ( ) ;
//std::cout<<gridPrintingSize.width()<<", "<<gridPrintingSize.height()<<std::endl;
if ( ! displayPreview ) {
printSizeX_Millimeter = widgetWidth ;
printSizeY_Millimeter = widgetHeight ;
}
if ( ! displayPreview | | exportpreview ( gridPrintingSize , false ) ) {
QImage png ( QSize ( double ( printSizeX_Millimeter ) * 1.1 , double ( printSizeY_Millimeter ) * 1.1 ) , QImage : : Format_ARGB32 ) ;
png . fill ( Qt : : transparent ) ;
JKQTPEnhancedPainter painter ;
painter . begin ( & png ) ;
painter . setRenderHint ( JKQTPEnhancedPainter : : NonCosmeticDefaultPen , true ) ;
painter . setRenderHint ( JKQTPEnhancedPainter : : Antialiasing ) ;
painter . setRenderHint ( JKQTPEnhancedPainter : : TextAntialiasing ) ;
painter . setRenderHint ( JKQTPEnhancedPainter : : SmoothPixmapTransform ) ;
painter . setRenderHint ( JKQTPEnhancedPainter : : HighQualityAntialiasing ) ;
/*calcPlotScaling(painter);
gridPaint ( painter , png . rect ( ) . size ( ) ) ; */ \
//qDebug()<<QSize(printSizeX_Millimeter, printSizeY_Millimeter);
exportpreviewPaintRequested ( painter , QSize ( printSizeX_Millimeter , printSizeY_Millimeter ) ) ;
painter . end ( ) ;
if ( form = = " NONE " ) png . save ( fn ) ;
else png . save ( fn , form . toLatin1 ( ) . data ( ) ) ;
}
}
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : copyPixelImage ( ) {
2015-07-11 18:56:02 +08:00
/*qDebug()<<gridPrintingSize.width()<<", "<<gridPrintingSize.height();
qDebug ( ) < < widgetWidth < < " , " < < widgetHeight ;
qDebug ( ) < < paintMagnification ; */
/* QImage png(gridPrintingSize, QImage::Format_ARGB32);
{
JKQTPEnhancedPainter painter ;
painter . begin ( & png ) ;
painter . setRenderHint ( JKQTPEnhancedPainter : : Antialiasing ) ;
painter . setRenderHint ( JKQTPEnhancedPainter : : TextAntialiasing ) ;
painter . setRenderHint ( JKQTPEnhancedPainter : : SmoothPixmapTransform ) ;
painter . setRenderHint ( JKQTPEnhancedPainter : : HighQualityAntialiasing ) ;
//calcPlotScaling(painter);
gridPaint ( painter , gridPrintingSize ) ;
painter . end ( ) ;
}
QClipboard * clipboard = QApplication : : clipboard ( ) ;
qDebug ( ) < < " clipboard before adding content: \n " < < clipboard - > mimeData ( ) - > formats ( ) ;
clipboard - > setImage ( png ) ;
qDebug ( ) < < " clipboard after adding content: \n " < < clipboard - > mimeData ( ) - > formats ( ) ;
*/
gridPrintingCalc ( ) ;
//std::cout<<gridPrintingSize.width()<<", "<<gridPrintingSize.height()<<std::endl;
printSizeX_Millimeter = gridPrintingSize . width ( ) ;
printSizeY_Millimeter = gridPrintingSize . height ( ) ;
if ( exportpreview ( gridPrintingSize , false ) ) {
QApplication : : setOverrideCursor ( QCursor ( Qt : : WaitCursor ) ) ;
//if (exportpreview(gridPrintingSize, false)) {
QImage png ( QSize ( double ( printSizeX_Millimeter ) , double ( printSizeY_Millimeter ) ) , QImage : : Format_ARGB32 ) ;
{
png . fill ( Qt : : transparent ) ;
JKQTPEnhancedPainter painter ;
painter . begin ( & png ) ;
painter . setRenderHint ( JKQTPEnhancedPainter : : NonCosmeticDefaultPen , true ) ;
painter . setRenderHint ( JKQTPEnhancedPainter : : Antialiasing ) ;
painter . setRenderHint ( JKQTPEnhancedPainter : : TextAntialiasing ) ;
painter . setRenderHint ( JKQTPEnhancedPainter : : SmoothPixmapTransform ) ;
painter . setRenderHint ( JKQTPEnhancedPainter : : HighQualityAntialiasing ) ;
/*calcPlotScaling(painter);
gridPaint ( painter , png . rect ( ) . size ( ) ) ; */
exportpreviewPaintRequested ( painter , QSize ( printSizeX_Millimeter , printSizeY_Millimeter ) ) ;
painter . end ( ) ;
}
QByteArray svgdata ;
{
QBuffer buffer ( & svgdata ) ;
QSvgGenerator * svg = new QSvgGenerator ;
svg - > setResolution ( 96 ) ;
//svg->setResolution(300);
QSize size = QSize ( printSizeX_Millimeter , printSizeX_Millimeter ) ;
double factor = double ( size . width ( ) ) / double ( widgetWidth ) * paintMagnification ;
// TODO: CORRECT THIS
//qDebug()<<size;
svg - > setSize ( size ) ;
svg - > setOutputDevice ( & buffer ) ;
JKQTPEnhancedPainter painter ;
painter . begin ( svg ) ;
painter . scale ( factor , factor ) ;
printAspect = printSizeY_Millimeter / printSizeX_Millimeter ;
exportpreviewPaintRequested ( painter , QSize ( widgetWidth / paintMagnification , widgetWidth / paintMagnification * printAspect ) ) ;
painter . end ( ) ;
delete svg ;
}
QClipboard * clipboard = QApplication : : clipboard ( ) ;
//qDebug()<<"clipboard before adding content:\n"<<clipboard->mimeData()->formats();
//clipboard->setImage(png);
clipboard - > clear ( ) ;
2015-08-26 22:11:41 +08:00
clipboard - > setPixmap ( QPixmap : : fromImage ( png ) ) ;
2015-07-11 18:56:02 +08:00
QMimeData * mime = new QMimeData ( ) ;
2015-08-26 22:11:41 +08:00
mime - > setImageData ( QPixmap : : fromImage ( png ) ) ;
QBuffer pngbuf ;
png . save ( & pngbuf , " png " ) ;
mime - > setData ( " image/x-png " , pngbuf . data ( ) ) ;
png . save ( & pngbuf , " bmp " ) ;
mime - > setData ( " image/bmp " , pngbuf . data ( ) ) ;
2015-07-11 18:56:02 +08:00
mime - > setData ( " image/svg+xml " , svgdata ) ;
clipboard - > setMimeData ( mime ) ;
//qDebug()<<"clipboard after adding content:\n"<<clipboard->mimeData()->formats();
QApplication : : restoreOverrideCursor ( ) ;
//}
}
}
2019-01-26 19:28:44 +08:00
void JKQTBasePlotter : : saveAsSVG ( const QString & filename , bool displayPreview ) {
2015-07-11 18:56:02 +08:00
loadUserSettings ( ) ;
QString fn = filename ;
if ( fn . isEmpty ( ) ) {
2018-11-18 18:59:30 +08:00
fn = QFileDialog : : getSaveFileName ( nullptr , tr ( " Save Plot " ) ,
2015-07-11 18:56:02 +08:00
currentSaveDirectory ,
tr ( " SVG Image (*.svg) " ) ) ;
if ( ! fn . isEmpty ( ) ) currentSaveDirectory = QFileInfo ( fn ) . absolutePath ( ) ;
}
if ( ! fn . isEmpty ( ) ) {
QString tempFM = " " ;
if ( QFile : : exists ( fn ) ) {
2015-08-04 23:38:29 +08:00
# ifdef QFWIDLIB_LIBRARY
QFTemporaryFile * tf = new QFTemporaryFile ( ) ;
# else
QTemporaryFile * tf = new QTemporaryFile ( ) ;
# endif
2015-07-11 18:56:02 +08:00
tf - > open ( ) ;
tempFM = tf - > fileName ( ) ;
tf - > close ( ) ;
delete tf ;
QFile : : copy ( fn , tempFM ) ;
}
gridPrintingCalc ( ) ;
QSvgGenerator * svg = new QSvgGenerator ;
svg - > setResolution ( 96 ) ;
QSize size = QSize ( gridPrintingSize . width ( ) * 25.4 / svg - > resolution ( ) , gridPrintingSize . height ( ) * 25.4 / svg - > resolution ( ) ) ;
svg - > setSize ( size ) ;
svg - > setFileName ( fn ) ;
if ( ! printpreviewNew ( svg , true , - 1.0 , - 1.0 , displayPreview ) ) {
if ( QFile : : exists ( tempFM ) ) {
QFile : : copy ( tempFM , fn ) ;
QFile : : remove ( tempFM ) ;
}
}
delete svg ;
}
saveUserSettings ( ) ;
}
2019-02-08 00:24:46 +08:00
void JKQTBasePlotter : : setPlotBorder ( int left , int right , int top , int bottom ) {
plotterStyle . plotBorderTop = top ;
plotterStyle . plotBorderLeft = left ;
plotterStyle . plotBorderBottom = bottom ;
plotterStyle . plotBorderRight = right ;
2015-07-11 18:56:02 +08:00
//updateGeometry();
if ( emitPlotSignals ) emit plotUpdated ( ) ;
}
2019-02-08 00:24:46 +08:00
void JKQTBasePlotter : : setPlotBorderLeft ( int left )
{
plotterStyle . plotBorderLeft = left ;
if ( emitPlotSignals ) emit plotUpdated ( ) ;
}
void JKQTBasePlotter : : setPlotBorderRight ( int right )
{
plotterStyle . plotBorderRight = right ;
if ( emitPlotSignals ) emit plotUpdated ( ) ;
}
void JKQTBasePlotter : : setPlotBorderTop ( int top )
{
plotterStyle . plotBorderTop = top ;
if ( emitPlotSignals ) emit plotUpdated ( ) ;
}
void JKQTBasePlotter : : setPlotBorderBottom ( int bottom )
{
plotterStyle . plotBorderBottom = bottom ;
if ( emitPlotSignals ) emit plotUpdated ( ) ;
}
2019-02-03 21:04:48 +08:00
void JKQTBasePlotter : : synchronizeToMaster ( JKQTBasePlotter * master , SynchronizationDirection synchronizeDirection , bool synchronizeAxisLength , bool synchronizeZoomingMasterToSlave , bool synchronizeZoomingSlaveToMaster ) {
// remove old connections
if ( masterPlotterX & & ( synchronizeDirection = = sdXAxis | | synchronizeDirection = = sdXYAxes ) ) {
disconnect ( masterPlotterX , SIGNAL ( zoomChangedLocally ( double , double , double , double , JKQTBasePlotter * ) ) ,
this , SLOT ( synchronizeXAxis ( double , double , double , double , JKQTBasePlotter * ) ) ) ;
2019-01-20 17:49:29 +08:00
disconnect ( this , SIGNAL ( zoomChangedLocally ( double , double , double , double , JKQTBasePlotter * ) ) ,
2019-02-03 21:04:48 +08:00
masterPlotterX , SLOT ( synchronizeXAxis ( double , double , double , double , JKQTBasePlotter * ) ) ) ;
2018-12-14 05:29:30 +08:00
}
2019-02-03 21:04:48 +08:00
if ( masterPlotterY & & ( synchronizeDirection = = sdYAxis | | synchronizeDirection = = sdXYAxes ) ) {
disconnect ( masterPlotterY , SIGNAL ( zoomChangedLocally ( double , double , double , double , JKQTBasePlotter * ) ) ,
this , SLOT ( synchronizeYAxis ( double , double , double , double , JKQTBasePlotter * ) ) ) ;
2019-01-20 17:49:29 +08:00
disconnect ( this , SIGNAL ( zoomChangedLocally ( double , double , double , double , JKQTBasePlotter * ) ) ,
2019-02-03 21:04:48 +08:00
masterPlotterY , SLOT ( synchronizeYAxis ( double , double , double , double , JKQTBasePlotter * ) ) ) ;
2018-12-14 05:29:30 +08:00
}
2019-02-03 21:04:48 +08:00
// store new connection settings
if ( synchronizeDirection = = sdXAxis | | synchronizeDirection = = sdXYAxes ) {
masterPlotterX = master ;
masterSynchronizeWidth = synchronizeAxisLength ;
}
if ( synchronizeDirection = = sdYAxis | | synchronizeDirection = = sdXYAxes ) {
masterPlotterY = master ;
masterSynchronizeHeight = synchronizeAxisLength ;
2018-12-14 05:29:30 +08:00
}
2019-02-03 21:04:48 +08:00
// connect widgets (if required)
if ( master ) {
if ( synchronizeDirection = = sdXAxis | | synchronizeDirection = = sdXYAxes ) {
if ( synchronizeZoomingMasterToSlave ) {
connect ( masterPlotterX , SIGNAL ( zoomChangedLocally ( double , double , double , double , JKQTBasePlotter * ) ) ,
this , SLOT ( synchronizeXAxis ( double , double , double , double , JKQTBasePlotter * ) ) ) ;
}
if ( synchronizeZoomingSlaveToMaster ) {
connect ( this , SIGNAL ( zoomChangedLocally ( double , double , double , double , JKQTBasePlotter * ) ) ,
masterPlotterX , SLOT ( synchronizeXAxis ( double , double , double , double , JKQTBasePlotter * ) ) ) ;
}
2018-12-14 05:29:30 +08:00
}
2019-02-03 21:04:48 +08:00
if ( synchronizeDirection = = sdYAxis | | synchronizeDirection = = sdXYAxes ) {
if ( synchronizeZoomingMasterToSlave ) {
connect ( masterPlotterY , SIGNAL ( zoomChangedLocally ( double , double , double , double , JKQTBasePlotter * ) ) ,
this , SLOT ( synchronizeYAxis ( double , double , double , double , JKQTBasePlotter * ) ) ) ;
}
if ( synchronizeZoomingSlaveToMaster ) {
connect ( this , SIGNAL ( zoomChangedLocally ( double , double , double , double , JKQTBasePlotter * ) ) ,
masterPlotterY , SLOT ( synchronizeYAxis ( double , double , double , double , JKQTBasePlotter * ) ) ) ;
2018-12-14 05:29:30 +08:00
2019-02-03 21:04:48 +08:00
}
2018-12-14 05:29:30 +08:00
}
}
2019-02-03 21:04:48 +08:00
2015-07-11 18:56:02 +08:00
}
2019-02-03 21:04:48 +08:00
void JKQTBasePlotter : : synchronizeXToMaster ( JKQTBasePlotter * master , bool synchronizeAxisLength , bool synchronizeZoomingMasterToSlave , bool synchronizeZoomingSlaveToMaster )
{
synchronizeToMaster ( master , sdXAxis , synchronizeAxisLength , synchronizeZoomingMasterToSlave , synchronizeZoomingSlaveToMaster ) ;
}
2018-12-14 05:29:30 +08:00
2019-02-03 21:04:48 +08:00
void JKQTBasePlotter : : synchronizeYToMaster ( JKQTBasePlotter * master , bool synchronizeAxisLength , bool synchronizeZoomingMasterToSlave , bool synchronizeZoomingSlaveToMaster )
{
synchronizeToMaster ( master , sdYAxis , synchronizeAxisLength , synchronizeZoomingMasterToSlave , synchronizeZoomingSlaveToMaster ) ;
}
void JKQTBasePlotter : : resetMasterSynchronization ( JKQTBasePlotter : : SynchronizationDirection synchronizeDirection ) {
synchronizeToMaster ( nullptr , synchronizeDirection , false , false , false ) ;
2018-12-14 05:29:30 +08:00
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : synchronizeXAxis ( double newxmin , double newxmax , double /*newymin*/ , double /*newymax*/ , JKQTBasePlotter * /*sender*/ ) {
2019-02-03 21:04:48 +08:00
bool oldemitSignals = emitSignals ;
emitSignals = false ;
2018-12-14 05:29:30 +08:00
setX ( newxmin , newxmax ) ;
2019-02-03 21:04:48 +08:00
emitSignals = oldemitSignals ;
2015-07-11 18:56:02 +08:00
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : synchronizeYAxis ( double /*newxmin*/ , double /*newxmax*/ , double newymin , double newymax , JKQTBasePlotter * /*sender*/ ) {
2019-02-03 21:04:48 +08:00
bool oldemitSignals = emitSignals ;
emitSignals = false ;
2018-12-14 05:29:30 +08:00
setY ( newymin , newymax ) ;
2019-02-03 21:04:48 +08:00
emitSignals = oldemitSignals ;
2018-12-14 05:29:30 +08:00
}
2015-07-11 18:56:02 +08:00
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : synchronizeXYAxis ( double newxmin , double newxmax , double newymin , double newymax , JKQTBasePlotter * /*sender*/ ) {
2019-02-03 21:04:48 +08:00
bool oldemitSignals = emitSignals ;
emitSignals = false ;
2018-12-14 05:29:30 +08:00
setXY ( newxmin , newxmax , newymin , newymax ) ;
2019-02-03 21:04:48 +08:00
emitSignals = oldemitSignals ;
2018-12-14 05:29:30 +08:00
}
2015-07-11 18:56:02 +08:00
2019-01-26 19:28:44 +08:00
size_t JKQTBasePlotter : : addGraph ( size_t xColumn , size_t yColumn , const QString & title , JKQTPGraphPlotstyle graphStyle ) {
2019-01-20 17:49:29 +08:00
if ( graphStyle = = JKQTPImpulsesHorizontal ) {
JKQTPImpulsesHorizontalGraph * gr = new JKQTPImpulsesHorizontalGraph ( this ) ;
2019-01-26 20:00:40 +08:00
gr - > setTitle ( title ) ;
gr - > setXColumn ( xColumn ) ;
gr - > setYColumn ( yColumn ) ;
2015-07-11 18:56:02 +08:00
return addGraph ( gr ) ;
2019-01-20 17:49:29 +08:00
} else if ( graphStyle = = JKQTPImpulsesVertical ) {
JKQTPImpulsesVerticalGraph * gr = new JKQTPImpulsesVerticalGraph ( this ) ;
2019-01-26 20:00:40 +08:00
gr - > setTitle ( title ) ;
gr - > setXColumn ( xColumn ) ;
gr - > setYColumn ( yColumn ) ;
2015-07-11 18:56:02 +08:00
return addGraph ( gr ) ;
2019-01-20 17:49:29 +08:00
} else if ( graphStyle = = JKQTPFilledCurveX ) {
JKQTPFilledCurveXGraph * gr = new JKQTPFilledCurveXGraph ( this ) ;
2019-01-26 20:00:40 +08:00
gr - > setTitle ( title ) ;
gr - > setXColumn ( xColumn ) ;
gr - > setYColumn ( yColumn ) ;
2015-07-11 18:56:02 +08:00
return addGraph ( gr ) ;
2019-01-20 17:49:29 +08:00
} else if ( graphStyle = = JKQTPFilledCurveY ) {
JKQTPFilledCurveYGraph * gr = new JKQTPFilledCurveYGraph ( this ) ;
2019-01-26 20:00:40 +08:00
gr - > setTitle ( title ) ;
gr - > setXColumn ( xColumn ) ;
gr - > setYColumn ( yColumn ) ;
2015-07-11 18:56:02 +08:00
return addGraph ( gr ) ;
2019-01-20 17:49:29 +08:00
} else if ( graphStyle = = JKQTPStepsX ) {
2019-04-22 19:27:50 +08:00
JKQTPSpecialLineHorizontalGraph * gr = new JKQTPSpecialLineHorizontalGraph ( this ) ;
2019-01-26 20:00:40 +08:00
gr - > setTitle ( title ) ;
gr - > setXColumn ( xColumn ) ;
gr - > setYColumn ( yColumn ) ;
2015-07-11 18:56:02 +08:00
return addGraph ( gr ) ;
2019-01-20 17:49:29 +08:00
} else if ( graphStyle = = JKQTPStepsY ) {
2019-04-22 19:27:50 +08:00
JKQTPSpecialLineVerticalGraph * gr = new JKQTPSpecialLineVerticalGraph ( this ) ;
2019-01-26 20:00:40 +08:00
gr - > setTitle ( title ) ;
gr - > setXColumn ( xColumn ) ;
gr - > setYColumn ( yColumn ) ;
2015-07-11 18:56:02 +08:00
return addGraph ( gr ) ;
} else {
2019-01-20 17:49:29 +08:00
JKQTPXYLineGraph * gr = new JKQTPXYLineGraph ( this ) ;
2019-01-26 20:00:40 +08:00
gr - > setTitle ( title ) ;
gr - > setXColumn ( xColumn ) ;
gr - > setYColumn ( yColumn ) ;
2019-04-22 19:27:50 +08:00
if ( graphStyle = = JKQTPPoints ) { gr - > setSymbolType ( JKQTPPlus ) ; gr - > setDrawLine ( false ) ; }
else if ( graphStyle = = JKQTPLinesPoints ) gr - > setSymbolType ( JKQTPPlus ) ;
2015-07-11 18:56:02 +08:00
return addGraph ( gr ) ;
}
return - 1 ;
}
2019-01-26 19:28:44 +08:00
size_t JKQTBasePlotter : : addGraph ( size_t xColumn , size_t yColumn , const QString & title , JKQTPGraphPlotstyle graphStyle , QColor color , JKQTPGraphSymbols symbol , Qt : : PenStyle penstyle , double width ) {
2019-01-20 17:49:29 +08:00
if ( graphStyle = = JKQTPImpulsesHorizontal ) {
JKQTPImpulsesHorizontalGraph * gr = new JKQTPImpulsesHorizontalGraph ( this ) ;
2019-01-26 20:00:40 +08:00
gr - > setTitle ( title ) ;
gr - > setXColumn ( xColumn ) ;
gr - > setYColumn ( yColumn ) ;
gr - > setColor ( color ) ;
2019-01-26 03:16:04 +08:00
gr - > setLineWidth ( width ) ;
2015-07-11 18:56:02 +08:00
return addGraph ( gr ) ;
2019-01-20 17:49:29 +08:00
} else if ( graphStyle = = JKQTPImpulsesVertical ) {
JKQTPImpulsesVerticalGraph * gr = new JKQTPImpulsesVerticalGraph ( this ) ;
2019-01-26 20:00:40 +08:00
gr - > setTitle ( title ) ;
gr - > setXColumn ( xColumn ) ;
gr - > setYColumn ( yColumn ) ;
gr - > setColor ( color ) ;
2019-01-26 03:16:04 +08:00
gr - > setLineWidth ( width ) ;
2015-07-11 18:56:02 +08:00
return addGraph ( gr ) ;
2019-01-20 17:49:29 +08:00
} else if ( graphStyle = = JKQTPFilledCurveX ) {
JKQTPFilledCurveXGraph * gr = new JKQTPFilledCurveXGraph ( this ) ;
2019-01-26 20:00:40 +08:00
gr - > setTitle ( title ) ;
gr - > setXColumn ( xColumn ) ;
gr - > setYColumn ( yColumn ) ;
2019-01-26 03:16:04 +08:00
gr - > setLineWidth ( width ) ;
2019-04-22 19:27:50 +08:00
gr - > setLineStyle ( penstyle ) ;
2019-01-26 20:00:40 +08:00
gr - > setFillColor ( color ) ;
2015-07-11 18:56:02 +08:00
return addGraph ( gr ) ;
2019-01-20 17:49:29 +08:00
} else if ( graphStyle = = JKQTPFilledCurveY ) {
JKQTPFilledCurveYGraph * gr = new JKQTPFilledCurveYGraph ( this ) ;
2019-01-26 20:00:40 +08:00
gr - > setTitle ( title ) ;
gr - > setXColumn ( xColumn ) ;
gr - > setYColumn ( yColumn ) ;
2019-01-26 03:16:04 +08:00
gr - > setLineWidth ( width ) ;
2019-04-22 19:27:50 +08:00
gr - > setLineStyle ( penstyle ) ;
2019-01-26 20:00:40 +08:00
gr - > setFillColor ( color ) ;
2015-07-11 18:56:02 +08:00
return addGraph ( gr ) ;
2019-01-20 17:49:29 +08:00
} else if ( graphStyle = = JKQTPStepsX ) {
2019-04-22 19:27:50 +08:00
JKQTPSpecialLineHorizontalGraph * gr = new JKQTPSpecialLineHorizontalGraph ( this ) ;
2019-01-26 20:00:40 +08:00
gr - > setTitle ( title ) ;
gr - > setXColumn ( xColumn ) ;
gr - > setYColumn ( yColumn ) ;
2019-01-26 03:16:04 +08:00
gr - > setLineWidth ( width ) ;
2019-04-22 19:27:50 +08:00
gr - > setLineStyle ( penstyle ) ;
2019-01-26 20:00:40 +08:00
gr - > setFillColor ( color ) ;
2015-07-11 18:56:02 +08:00
return addGraph ( gr ) ;
2019-01-20 17:49:29 +08:00
} else if ( graphStyle = = JKQTPStepsY ) {
2019-04-22 19:27:50 +08:00
JKQTPSpecialLineVerticalGraph * gr = new JKQTPSpecialLineVerticalGraph ( this ) ;
2019-01-26 20:00:40 +08:00
gr - > setTitle ( title ) ;
gr - > setXColumn ( xColumn ) ;
gr - > setYColumn ( yColumn ) ;
2019-01-26 03:16:04 +08:00
gr - > setLineWidth ( width ) ;
2019-04-22 19:27:50 +08:00
gr - > setYColumn ( penstyle ) ;
2019-01-26 20:00:40 +08:00
gr - > setFillColor ( color ) ;
2015-07-11 18:56:02 +08:00
return addGraph ( gr ) ;
} else {
2019-01-20 17:49:29 +08:00
JKQTPXYLineGraph * gr = new JKQTPXYLineGraph ( this ) ;
2019-01-26 20:00:40 +08:00
gr - > setTitle ( title ) ;
gr - > setXColumn ( xColumn ) ;
gr - > setYColumn ( yColumn ) ;
2019-01-26 03:16:04 +08:00
gr - > setLineWidth ( width ) ;
2019-04-22 19:27:50 +08:00
gr - > setLineStyle ( penstyle ) ;
gr - > setLineColor ( color ) ;
gr - > setSymbolColor ( color ) ;
gr - > setSymbolType ( symbol ) ;
if ( graphStyle = = JKQTPPoints ) { gr - > setSymbolType ( JKQTPPlus ) ; gr - > setDrawLine ( false ) ; }
else if ( graphStyle = = JKQTPLinesPoints ) gr - > setSymbolType ( JKQTPPlus ) ;
2015-07-11 18:56:02 +08:00
return addGraph ( gr ) ;
}
return - 1 ;
}
2019-01-20 17:49:29 +08:00
size_t JKQTBasePlotter : : addHorizontalBoxplot ( QString title , int posColumn , int medianColumn , int minColumn , int maxColumn , int percentile25Column , int percentile75Column , int meanColumn ) {
JKQTPBoxplotHorizontalGraph * box = new JKQTPBoxplotHorizontalGraph ( this ) ;
2019-04-22 23:19:52 +08:00
box - > setPositionColumn ( posColumn ) ;
2019-01-26 20:00:40 +08:00
box - > setMedianColumn ( medianColumn ) ;
box - > setMeanColumn ( meanColumn ) ;
box - > setMinColumn ( minColumn ) ;
box - > setMaxColumn ( maxColumn ) ;
box - > setPercentile25Column ( percentile25Column ) ;
box - > setPercentile75Column ( percentile75Column ) ;
box - > setTitle ( title ) ;
2015-07-11 18:56:02 +08:00
return addGraph ( box ) ;
}
2019-01-20 17:49:29 +08:00
size_t JKQTBasePlotter : : addVerticalBoxplot ( QString title , int posColumn , int medianColumn , int minColumn , int maxColumn , int percentile25Column , int percentile75Column , int meanColumn ) {
JKQTPBoxplotVerticalGraph * box = new JKQTPBoxplotVerticalGraph ( this ) ;
2019-04-22 23:19:52 +08:00
box - > setPositionColumn ( posColumn ) ;
2019-01-26 20:00:40 +08:00
box - > setMedianColumn ( medianColumn ) ;
box - > setMeanColumn ( meanColumn ) ;
box - > setMinColumn ( minColumn ) ;
box - > setMaxColumn ( maxColumn ) ;
box - > setPercentile25Column ( percentile25Column ) ;
box - > setPercentile75Column ( percentile75Column ) ;
box - > setTitle ( title ) ;
2015-07-11 18:56:02 +08:00
return addGraph ( box ) ;
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : addHorizontalBargraph ( size_t xColumn , QVector < size_t > yColumns , QStringList titles ) {
2015-07-11 18:56:02 +08:00
double w = 0.9 ;
2019-01-26 20:00:40 +08:00
double width = w / static_cast < double > ( yColumns . size ( ) ) ;
2015-07-11 18:56:02 +08:00
double s = - 1.0 * w / 2.0 + width / 2.0 ;
for ( int i = 0 ; i < yColumns . size ( ) ; i + + ) {
2019-01-20 17:49:29 +08:00
JKQTPBarVerticalGraph * g = new JKQTPBarVerticalGraph ( this ) ;
2019-01-26 20:00:40 +08:00
g - > setTitle ( titles [ i ] ) ;
g - > setXColumn ( xColumn ) ;
g - > setYColumn ( yColumns [ i ] ) ;
g - > setShift ( s ) ;
g - > setWidth ( width ) ;
2015-07-11 18:56:02 +08:00
//std::cout<<"shift="<<s<<" width="<<width<<std::endl;
s = s + width ;
addGraph ( g ) ;
}
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : addVerticalBargraph ( QVector < size_t > xColumns , size_t yColumn , QStringList titles ) {
2015-07-11 18:56:02 +08:00
double w = 0.9 ;
2019-01-26 20:00:40 +08:00
double width = w / static_cast < double > ( xColumns . size ( ) ) ;
2015-07-11 18:56:02 +08:00
double s = - 1.0 * w / 2.0 + width / 2.0 ;
for ( int i = 0 ; i < xColumns . size ( ) ; i + + ) {
2019-01-20 17:49:29 +08:00
JKQTPBarHorizontalGraph * g = new JKQTPBarHorizontalGraph ( this ) ;
2019-01-26 20:00:40 +08:00
g - > setTitle ( titles [ i ] ) ;
g - > setXColumn ( xColumns [ i ] ) ;
g - > setYColumn ( yColumn ) ;
g - > setShift ( s ) ;
g - > setWidth ( width ) ;
2015-07-11 18:56:02 +08:00
//std::cout<<"shift="<<s<<" width="<<width<<std::endl;
s = s + width ;
addGraph ( g ) ;
}
}
2019-01-26 19:28:44 +08:00
size_t JKQTBasePlotter : : addGraphWithXError ( size_t xColumn , size_t yColumn , size_t xErrorColumn , const QString & title , JKQTPGraphPlotstyle graphStyle , JKQTPErrorPlotstyle errorStyle ) {
2019-01-20 17:49:29 +08:00
if ( graphStyle = = JKQTPImpulsesHorizontal ) {
JKQTPImpulsesHorizontalErrorGraph * gr = new JKQTPImpulsesHorizontalErrorGraph ( this ) ;
2019-01-26 20:00:40 +08:00
gr - > setTitle ( title ) ;
gr - > setXColumn ( xColumn ) ;
gr - > setYColumn ( yColumn ) ;
gr - > setXErrorStyle ( errorStyle ) ;
gr - > setXErrorColumn ( xErrorColumn ) ;
2019-04-22 19:27:50 +08:00
gr - > setErrorColor ( gr - > getLineColor ( ) . darker ( ) ) ;
QColor fc = gr - > getLineColor ( ) ;
2015-07-11 18:56:02 +08:00
fc . setAlphaF ( 0.5 ) ;
2019-01-26 20:00:40 +08:00
gr - > setErrorFillColor ( fc ) ;
2015-07-11 18:56:02 +08:00
return addGraph ( gr ) ;
2019-01-20 17:49:29 +08:00
} else if ( graphStyle = = JKQTPFilledCurveY ) {
JKQTPFilledCurveYErrorGraph * gr = new JKQTPFilledCurveYErrorGraph ( this ) ;
2019-01-26 20:00:40 +08:00
gr - > setTitle ( title ) ;
gr - > setXColumn ( xColumn ) ;
gr - > setYColumn ( yColumn ) ;
gr - > setXErrorStyle ( errorStyle ) ;
gr - > setXErrorColumn ( xErrorColumn ) ;
2019-04-22 19:27:50 +08:00
gr - > setErrorColor ( gr - > getLineColor ( ) ) ;
QColor fc = gr - > getLineColor ( ) ;
2015-07-11 18:56:02 +08:00
fc . setAlphaF ( 0.5 ) ;
2019-01-26 20:00:40 +08:00
gr - > setErrorFillColor ( fc ) ;
2015-07-11 18:56:02 +08:00
return addGraph ( gr ) ;
} else {
2019-01-20 17:49:29 +08:00
JKQTPXYLineErrorGraph * gr = new JKQTPXYLineErrorGraph ( this ) ;
2019-01-26 20:00:40 +08:00
gr - > setTitle ( title ) ;
gr - > setXColumn ( xColumn ) ;
gr - > setYColumn ( yColumn ) ;
gr - > setYErrorColumn ( xErrorColumn ) ;
gr - > setYErrorStyle ( errorStyle ) ;
gr - > setXErrorStyle ( JKQTPNoError ) ;
2019-04-22 19:27:50 +08:00
gr - > setErrorColor ( gr - > getSymbolColor ( ) ) ;
QColor fc = gr - > getSymbolColor ( ) ;
2015-07-11 18:56:02 +08:00
fc . setAlphaF ( 0.5 ) ;
2019-01-26 20:00:40 +08:00
gr - > setErrorFillColor ( fc ) ;
2019-04-22 19:27:50 +08:00
if ( graphStyle = = JKQTPPoints ) { gr - > setSymbolType ( JKQTPPlus ) ; gr - > setDrawLine ( false ) ; }
else if ( graphStyle = = JKQTPLinesPoints ) gr - > setSymbolType ( JKQTPPlus ) ;
2015-07-11 18:56:02 +08:00
return addGraph ( gr ) ;
}
}
2019-01-26 19:28:44 +08:00
size_t JKQTBasePlotter : : addGraphWithYError ( size_t xColumn , size_t yColumn , size_t yErrorColumn , const QString & title , JKQTPGraphPlotstyle graphStyle , JKQTPErrorPlotstyle errorStyle ) {
2019-01-20 17:49:29 +08:00
if ( graphStyle = = JKQTPImpulsesVertical ) {
JKQTPImpulsesVerticalErrorGraph * gr = new JKQTPImpulsesVerticalErrorGraph ( this ) ;
2019-01-26 20:00:40 +08:00
gr - > setTitle ( title ) ;
gr - > setXColumn ( xColumn ) ;
gr - > setYColumn ( yColumn ) ;
gr - > setYErrorStyle ( errorStyle ) ;
gr - > setYErrorColumn ( yErrorColumn ) ;
2019-04-22 19:27:50 +08:00
gr - > setErrorColor ( gr - > getLineColor ( ) . darker ( ) ) ;
2019-01-26 20:00:40 +08:00
gr - > setErrorWidth ( gr - > getLineWidth ( ) / 3.0 ) ;
2019-04-22 19:27:50 +08:00
QColor fc = gr - > getLineColor ( ) ;
2015-07-11 18:56:02 +08:00
fc . setAlphaF ( 0.5 ) ;
2019-01-26 20:00:40 +08:00
gr - > setErrorFillColor ( fc ) ;
2015-07-11 18:56:02 +08:00
return addGraph ( gr ) ;
2019-01-20 17:49:29 +08:00
} else if ( graphStyle = = JKQTPFilledCurveX ) {
JKQTPFilledCurveXErrorGraph * gr = new JKQTPFilledCurveXErrorGraph ( this ) ;
2019-01-26 20:00:40 +08:00
gr - > setTitle ( title ) ;
gr - > setXColumn ( xColumn ) ;
gr - > setYColumn ( yColumn ) ;
gr - > setYErrorStyle ( errorStyle ) ;
gr - > setYErrorColumn ( yErrorColumn ) ;
2019-04-22 19:27:50 +08:00
gr - > setErrorColor ( gr - > getLineColor ( ) ) ;
QColor fc = gr - > getLineColor ( ) ;
2015-07-11 18:56:02 +08:00
fc . setAlphaF ( 0.5 ) ;
2019-01-26 20:00:40 +08:00
gr - > setErrorFillColor ( fc ) ;
2015-07-11 18:56:02 +08:00
return addGraph ( gr ) ;
} else {
2019-01-20 17:49:29 +08:00
JKQTPXYLineErrorGraph * gr = new JKQTPXYLineErrorGraph ( this ) ;
2019-01-26 20:00:40 +08:00
gr - > setTitle ( title ) ;
gr - > setXColumn ( xColumn ) ;
gr - > setYColumn ( yColumn ) ;
gr - > setYErrorColumn ( yErrorColumn ) ;
gr - > setYErrorStyle ( errorStyle ) ;
gr - > setXErrorStyle ( JKQTPNoError ) ;
2019-04-22 19:27:50 +08:00
gr - > setErrorColor ( gr - > getSymbolColor ( ) ) ;
QColor fc = gr - > getSymbolColor ( ) ;
2015-07-11 18:56:02 +08:00
fc . setAlphaF ( 0.5 ) ;
2019-01-26 20:00:40 +08:00
gr - > setErrorFillColor ( fc ) ;
2019-04-22 19:27:50 +08:00
if ( graphStyle = = JKQTPPoints ) { gr - > setSymbolType ( JKQTPPlus ) ; gr - > setDrawLine ( false ) ; }
else if ( graphStyle = = JKQTPLinesPoints ) gr - > setSymbolType ( JKQTPPlus ) ;
2015-07-11 18:56:02 +08:00
return addGraph ( gr ) ;
}
}
2019-01-26 19:28:44 +08:00
size_t JKQTBasePlotter : : addGraphWithXYError ( size_t xColumn , size_t yColumn , size_t xErrorColumn , size_t yErrorColumn , const QString & title , JKQTPGraphPlotstyle graphStyle ) {
2019-01-20 17:49:29 +08:00
JKQTPXYLineErrorGraph * gr = new JKQTPXYLineErrorGraph ( this ) ;
2019-01-26 20:00:40 +08:00
gr - > setTitle ( title ) ;
gr - > setXColumn ( xColumn ) ;
gr - > setYColumn ( yColumn ) ;
gr - > setYErrorColumn ( yErrorColumn ) ;
gr - > setYErrorStyle ( JKQTPErrorBars ) ;
gr - > setXErrorColumn ( xErrorColumn ) ;
gr - > setXErrorStyle ( JKQTPErrorBars ) ;
2019-04-22 19:27:50 +08:00
gr - > setErrorColor ( gr - > getSymbolColor ( ) ) ;
QColor fc = gr - > getSymbolColor ( ) ;
2015-07-11 18:56:02 +08:00
fc . setAlphaF ( 0.5 ) ;
2019-01-26 20:00:40 +08:00
gr - > setErrorFillColor ( fc ) ;
2019-04-22 19:27:50 +08:00
if ( graphStyle = = JKQTPPoints ) { gr - > setSymbolType ( JKQTPPlus ) ; gr - > setDrawLine ( false ) ; }
else if ( graphStyle = = JKQTPLinesPoints ) gr - > setSymbolType ( JKQTPPlus ) ;
2015-07-11 18:56:02 +08:00
return addGraph ( gr ) ;
}
2019-02-08 00:24:46 +08:00
void JKQTBasePlotter : : drawGraphs ( JKQTPEnhancedPainter & painter ) {
2015-07-11 18:56:02 +08:00
# ifdef JKQTBP_AUTOTIMER
2019-01-20 17:49:29 +08:00
JKQTPAutoOutputTimer jkaaot ( QString ( " JKQTBasePlotter::plotGraphs " ) ) ;
2015-07-11 18:56:02 +08:00
# endif
2018-11-18 18:59:30 +08:00
if ( datastore = = nullptr | | graphs . isEmpty ( ) ) return ;
2019-01-26 03:16:04 +08:00
//qDebug()<<"start JKQTBasePlotter::plotGraphs()";
2015-07-11 18:56:02 +08:00
if ( useClipping ) {
2019-02-08 00:24:46 +08:00
QRegion cregion ( internalPlotBorderLeft , internalPlotBorderTop , internalPlotWidth , internalPlotHeight ) ;
2015-07-11 18:56:02 +08:00
painter . setClipping ( true ) ;
painter . setClipRegion ( cregion ) ;
}
2019-02-08 00:24:46 +08:00
int ibTop = internalPlotBorderTop_notIncludingOutsidePlotSections - plotterStyle . plotBorderTop - internalTitleHeight ;
int ibLeft = internalPlotBorderLeft_notIncludingOutsidePlotSections - plotterStyle . plotBorderLeft ;
int ibBottom = internalPlotBorderBottom_notIncludingOutsidePlotSections - plotterStyle . plotBorderBottom ;
int ibRight = internalPlotBorderRight_notIncludingOutsidePlotSections - plotterStyle . plotBorderRight ;
2015-07-11 18:56:02 +08:00
for ( int j = 0 ; j < graphs . size ( ) ; j + + ) {
//int leftSpace, rightSpace, topSpace, bottomSpace;
2019-01-20 17:49:29 +08:00
JKQTPPlotElement * g = graphs [ j ] ;
2019-01-26 20:00:40 +08:00
//qDebug()<<" drawing JKQTPPlotElement"<<j<<g->getTitle()<<g->metaObject()->className();
2019-02-03 21:04:48 +08:00
if ( g - > isVisible ( ) ) g - > draw ( painter ) ;
2015-07-11 18:56:02 +08:00
}
if ( useClipping ) {
painter . setClipping ( false ) ;
}
for ( int j = 0 ; j < graphs . size ( ) ; j + + ) {
int leftSpace , rightSpace , topSpace , bottomSpace ;
2019-01-20 17:49:29 +08:00
JKQTPPlotElement * g = graphs [ j ] ;
2019-02-03 21:04:48 +08:00
if ( g - > isVisible ( ) ) {
2015-07-11 18:56:02 +08:00
g - > getOutsideSize ( painter , leftSpace , rightSpace , topSpace , bottomSpace ) ;
ibTop + = topSpace ;
ibLeft + = leftSpace ;
2019-02-08 00:24:46 +08:00
QRect rleft ( internalPlotBorderLeft + internalPlotKeyBorderLeft - ibLeft , internalPlotBorderTop , leftSpace , internalPlotHeight ) ;
QRect rright ( internalPlotBorderLeft + internalPlotWidth + ibRight - internalPlotKeyBorderRight , internalPlotBorderTop , rightSpace , internalPlotHeight ) ;
QRect rtop ( internalPlotBorderLeft , internalPlotBorderTop - ibTop + internalPlotKeyBorderTop , internalPlotWidth , topSpace ) ;
QRect rbottom ( internalPlotBorderLeft , internalPlotBorderTop + internalPlotHeight + ibBottom , internalPlotWidth , bottomSpace ) ;
g - > drawOutside ( painter , rleft , rright , rtop , rbottom ) ;
if ( plotterStyle . debugShowRegionBoxes ) {
painter . save ( ) ; auto __finalpaint = JKQTPFinally ( [ & painter ] ( ) { painter . restore ( ) ; } ) ;
QPen p ( " green " ) ;
p . setWidthF ( plotterStyle . debugRegionLineWidth ) ;
QColor col = p . color ( ) ; col . setAlphaF ( 0.8 ) ; p . setColor ( col ) ;
painter . setPen ( p ) ;
painter . setBrush ( QBrush ( QColor ( Qt : : transparent ) ) ) ;
if ( rleft . width ( ) > 0 & & rleft . height ( ) > 0 ) painter . drawRect ( rleft ) ;
if ( rright . width ( ) > 0 & & rright . height ( ) > 0 ) painter . drawRect ( rright ) ;
if ( rtop . width ( ) > 0 & & rtop . height ( ) > 0 ) painter . drawRect ( rtop ) ;
if ( rbottom . width ( ) > 0 & & rbottom . height ( ) > 0 ) painter . drawRect ( rbottom ) ;
}
2015-07-11 18:56:02 +08:00
ibRight + = rightSpace ;
ibBottom + = bottomSpace ;
}
}
2019-01-26 03:16:04 +08:00
//qDebug()<<" end JKQTBasePlotter::plotGraphs()";
2015-07-11 18:56:02 +08:00
}
2019-04-22 19:27:50 +08:00
void JKQTBasePlotter : : drawKeyContents ( JKQTPEnhancedPainter & painter , double x , double y , double /*width*/ , double /*height*/ ) {
2015-07-11 18:56:02 +08:00
# ifdef JKQTBP_AUTOTIMER
2019-01-20 17:49:29 +08:00
JKQTPAutoOutputTimer jkaaot ( QString ( " JKQTBasePlotter::plotKeyContents(%1, %2, %3, %4) " ).arg(x).arg(y).arg(width).arg(height)) ;
2015-07-11 18:56:02 +08:00
# endif
2019-02-08 00:24:46 +08:00
painter . save ( ) ; auto __finalpaint = JKQTPFinally ( [ & painter ] ( ) { painter . restore ( ) ; } ) ;
2015-07-11 18:56:02 +08:00
double key_text_width = 0 ;
double key_text_height = 0 ;
double dw , dh ;
int columns = 1 ;
int lines = 1 ;
getKeyExtent ( painter , & dw , & dh , & key_text_width , & key_text_height , & columns , & lines ) ;
# ifdef SHOW_JKQTPLOTTER_DEBUG
qDebug ( ) < < " key_item_height= " < < key_item_height ;
2019-02-08 00:24:46 +08:00
qDebug ( ) < < " plotKey(): dw= " < < dw < < " dh= " < < dh < < " key_text_width= " < < key_text_width < < " key_text_height= " < < key_text_height < < " columns= " < < columns < < " lines= " < < lines < < " plotterStyle.keyStyle.layout= " < < plotterStyle . keyStyle . layout ;
2015-07-11 18:56:02 +08:00
# endif
2019-02-08 00:24:46 +08:00
QFont kf ( plotterStyle . defaultFontName , plotterStyle . keyStyle . fontSize * fontSizeMultiplier ) ;
2015-07-11 18:56:02 +08:00
QFontMetricsF kfm ( kf ) ;
2019-02-08 00:24:46 +08:00
if ( plotterStyle . keyStyle . layout = = JKQTPKeyLayoutOneColumn ) {
2015-07-11 18:56:02 +08:00
for ( int i = 0 ; i < graphs . size ( ) ; i + + ) {
2019-01-20 17:49:29 +08:00
JKQTPPlotElement * g = graphs [ i ] ;
2015-07-11 18:56:02 +08:00
# ifdef JKQTBP_AUTOTIMER
2019-01-26 20:00:40 +08:00
jkaaot . write ( QString ( " one-col: graph %1: %2 " ) . arg ( i ) . arg ( g - > getTitle ( ) ) ) ;
2015-07-11 18:56:02 +08:00
# endif
2019-02-03 21:04:48 +08:00
if ( ! g - > getTitle ( ) . isEmpty ( ) & & g - > isVisible ( ) ) {
2019-02-08 00:24:46 +08:00
QSizeF fs = getTextSizeSize ( plotterStyle . defaultFontName , plotterStyle . keyStyle . fontSize * fontSizeMultiplier , g - > getTitle ( ) , painter ) ; // mt.getSize(painter);
double itheight = qMax ( plotterStyle . keyStyle . itemHeight * kfm . width ( ' X ' ) , fs . height ( ) ) ;
QRectF markerRect ( x , y + 1.5 * lineWidthMultiplier , plotterStyle . keyStyle . sampleLineLength * kfm . width ( ' X ' ) , itheight - 3.0 * lineWidthMultiplier ) ;
g - > drawKeyMarker ( painter , markerRect ) ;
mathText . setFontColor ( plotterStyle . keyStyle . textColor ) ;
mathText . setFontSize ( plotterStyle . keyStyle . fontSize * fontSizeMultiplier ) ;
mathText . setFontRomanOrSpecial ( plotterStyle . defaultFontName ) ;
2015-07-11 18:56:02 +08:00
2019-01-26 20:00:40 +08:00
mathText . parse ( g - > getTitle ( ) ) ;
2019-02-08 00:24:46 +08:00
QRectF txtRect ( x + ( plotterStyle . keyStyle . sampleLineLength + plotterStyle . keyStyle . xSeparation ) * kfm . width ( ' X ' ) , y , key_text_width , itheight ) ;
mathText . draw ( painter , Qt : : AlignLeft | Qt : : AlignVCenter , txtRect ) ;
2015-07-11 18:56:02 +08:00
//if (itheight<key_item_height*kfm.height()) itheight=key_item_height*kfm.height();
2019-02-08 00:24:46 +08:00
//y=y+itheight+(plotterStyle.keyStyle.ySeparation)*kfm.height();
y = y + key_text_height + ( plotterStyle . keyStyle . ySeparation ) * kfm . width ( ' X ' ) ;
if ( plotterStyle . debugShowRegionBoxes ) {
painter . save ( ) ; auto __finalpaint = JKQTPFinally ( [ & painter ] ( ) { painter . restore ( ) ; } ) ;
QPen p ( " orange " ) ;
QColor col = p . color ( ) ; col . setAlphaF ( 0.8 ) ; p . setColor ( col ) ;
p . setWidthF ( plotterStyle . debugRegionLineWidth / 2.0 ) ;
p . setStyle ( Qt : : DashLine ) ;
painter . setPen ( p ) ;
painter . setBrush ( QBrush ( QColor ( Qt : : transparent ) ) ) ;
painter . drawRect ( txtRect ) ;
painter . drawRect ( markerRect ) ;
}
2015-07-11 18:56:02 +08:00
}
}
2019-02-08 00:24:46 +08:00
} else if ( plotterStyle . keyStyle . layout = = JKQTPKeyLayoutOneRow ) {
2015-07-11 18:56:02 +08:00
for ( int i = 0 ; i < graphs . size ( ) ; i + + ) {
2019-01-20 17:49:29 +08:00
JKQTPPlotElement * g = graphs [ i ] ;
2015-07-11 18:56:02 +08:00
# ifdef JKQTBP_AUTOTIMER
2019-01-26 20:00:40 +08:00
jkaaot . write ( QString ( " one-row: graph %1: %2 " ) . arg ( i ) . arg ( g - > getTitle ( ) ) ) ;
2015-07-11 18:56:02 +08:00
# endif
2019-02-03 21:04:48 +08:00
if ( ! g - > getTitle ( ) . isEmpty ( ) & & g - > isVisible ( ) ) {
2019-02-08 00:24:46 +08:00
QSizeF fs = getTextSizeSize ( plotterStyle . defaultFontName , plotterStyle . keyStyle . fontSize * fontSizeMultiplier , g - > getTitle ( ) , painter ) ; // mt.getSize(painter);
double itheight = qMax ( plotterStyle . keyStyle . itemHeight * kfm . width ( ' X ' ) , fs . height ( ) ) ;
QRectF markerRect ( x , y + 1.5 * lineWidthMultiplier , plotterStyle . keyStyle . sampleLineLength * kfm . width ( ' X ' ) , itheight - 3.0 * lineWidthMultiplier ) ;
g - > drawKeyMarker ( painter , markerRect ) ;
mathText . setFontColor ( plotterStyle . keyStyle . textColor ) ;
mathText . setFontSize ( plotterStyle . keyStyle . fontSize * fontSizeMultiplier ) ;
mathText . setFontRomanOrSpecial ( plotterStyle . defaultFontName ) ;
2015-07-11 18:56:02 +08:00
2019-01-26 20:00:40 +08:00
mathText . parse ( g - > getTitle ( ) ) ;
2019-02-08 00:24:46 +08:00
QRectF txtRect ( x + ( plotterStyle . keyStyle . sampleLineLength + plotterStyle . keyStyle . xSeparation ) * kfm . width ( ' X ' ) , y , fs . width ( ) , itheight ) ;
mathText . draw ( painter , Qt : : AlignLeft | Qt : : AlignVCenter , txtRect ) ;
if ( plotterStyle . debugShowRegionBoxes ) {
painter . save ( ) ; auto __finalpaint = JKQTPFinally ( [ & painter ] ( ) { painter . restore ( ) ; } ) ;
QPen p ( " orange " ) ;
QColor col = p . color ( ) ; col . setAlphaF ( 0.8 ) ; p . setColor ( col ) ;
p . setWidthF ( plotterStyle . debugRegionLineWidth / 2.0 ) ;
p . setStyle ( Qt : : DashLine ) ;
painter . setPen ( p ) ;
painter . setBrush ( QBrush ( QColor ( Qt : : transparent ) ) ) ;
painter . drawRect ( txtRect ) ;
painter . drawRect ( markerRect ) ;
}
2015-07-11 18:56:02 +08:00
//if (itheight<key_item_height*kfm.height()) itheight=key_item_height*kfm.height();
2019-02-08 00:24:46 +08:00
//y=y+itheight+(plotterStyle.keyStyle.ySeparation)*kfm.height();
x = x + fs . width ( ) + ( 2.0 * plotterStyle . keyStyle . xSeparation + plotterStyle . keyStyle . sampleLineLength ) * kfm . width ( ' X ' ) ;
2015-07-11 18:56:02 +08:00
}
}
2019-02-08 00:24:46 +08:00
} else if ( plotterStyle . keyStyle . layout = = JKQTPKeyLayoutMultiColumn ) {
2019-01-26 20:00:40 +08:00
//int columns=floor(static_cast<double>(plotWidth)/static_cast<double>(key_item_width*kfm.width('X')));
2015-07-11 18:56:02 +08:00
bool colfirst = true ;
2019-02-08 00:24:46 +08:00
if ( plotterStyle . keyStyle . position = = JKQTPKeyInsideTopLeft | | plotterStyle . keyStyle . position = = JKQTPKeyInsideTopRight
| | plotterStyle . keyStyle . position = = JKQTPKeyOutsideTopLeft | | plotterStyle . keyStyle . position = = JKQTPKeyOutsideTopRight ) {
2015-07-11 18:56:02 +08:00
colfirst = false ;
}
int l = 1 ;
int c = 1 ;
double xx = x ;
double yy = y ;
for ( int i = 0 ; i < graphs . size ( ) ; i + + ) {
2019-01-20 17:49:29 +08:00
JKQTPPlotElement * g = graphs [ i ] ;
2015-07-11 18:56:02 +08:00
# ifdef JKQTBP_AUTOTIMER
2019-01-26 20:00:40 +08:00
jkaaot . write ( QString ( " multi-col: graph %1: %2 " ) . arg ( i ) . arg ( g - > getTitle ( ) ) ) ;
2015-07-11 18:56:02 +08:00
# endif
2019-02-03 21:04:48 +08:00
if ( ! g - > getTitle ( ) . isEmpty ( ) & & g - > isVisible ( ) ) {
2019-02-08 00:24:46 +08:00
//QSizeF fs=getTextSizeSize(plotterStyle.defaultFontName,plotterStyle.keyStyle.fontSize*fontSizeMultiplier,g->getTitle(),painter);// mt.getSize(painter);
double itheight = qMax ( plotterStyle . keyStyle . itemHeight * kfm . width ( ' X ' ) , key_text_height ) ;
QRectF markerRect ( xx , yy + 1.5 * lineWidthMultiplier , plotterStyle . keyStyle . sampleLineLength * kfm . width ( ' X ' ) , itheight - 3.0 * lineWidthMultiplier ) ;
g - > drawKeyMarker ( painter , markerRect ) ;
mathText . setFontColor ( plotterStyle . keyStyle . textColor ) ;
mathText . setFontSize ( plotterStyle . keyStyle . fontSize * fontSizeMultiplier ) ;
mathText . setFontRomanOrSpecial ( plotterStyle . defaultFontName ) ;
2019-01-26 20:00:40 +08:00
mathText . parse ( g - > getTitle ( ) ) ;
2015-07-11 18:56:02 +08:00
//QSizeF fs=mt.getSize(painter);
2019-02-08 00:24:46 +08:00
QRectF txtRect ( xx + ( plotterStyle . keyStyle . sampleLineLength + plotterStyle . keyStyle . xSeparation ) * kfm . width ( ' X ' ) , yy , key_text_width , key_text_height ) ;
mathText . draw ( painter , Qt : : AlignLeft | Qt : : AlignVCenter , txtRect ) ;
if ( plotterStyle . debugShowRegionBoxes ) {
painter . save ( ) ; auto __finalpaint = JKQTPFinally ( [ & painter ] ( ) { painter . restore ( ) ; } ) ;
QPen p ( " orange " ) ;
QColor col = p . color ( ) ; col . setAlphaF ( 0.8 ) ; p . setColor ( col ) ;
p . setWidthF ( plotterStyle . debugRegionLineWidth / 2.0 ) ;
p . setStyle ( Qt : : DashLine ) ;
painter . setPen ( p ) ;
painter . setBrush ( QBrush ( QColor ( Qt : : transparent ) ) ) ;
painter . drawRect ( txtRect ) ;
painter . drawRect ( markerRect ) ;
}
2015-07-11 18:56:02 +08:00
if ( colfirst ) {
2019-02-08 00:24:46 +08:00
yy = yy + key_text_height + ( plotterStyle . keyStyle . ySeparation ) * kfm . width ( ' X ' ) ;
2015-07-11 18:56:02 +08:00
l + + ;
if ( l > lines ) {
l = 1 ;
c + + ;
2019-02-08 00:24:46 +08:00
xx = xx + key_text_width + ( plotterStyle . keyStyle . sampleLineLength + 2.0 * plotterStyle . keyStyle . xSeparation ) * kfm . width ( ' X ' ) ;
/*if (plotterStyle.keyStyle.autosize) xx=xx+key_text_width+(key_line_length+3.0*plotterStyle.keyStyle.xSeparation)*kfm.width('X');
else xx = xx + ( key_item_width + 2.0 * plotterStyle . keyStyle . xSeparation ) * kfm . width ( ' X ' ) ; */
2015-07-11 18:56:02 +08:00
yy = y ;
}
} else {
2019-02-08 00:24:46 +08:00
/*if (plotterStyle.keyStyle.autosize) xx=xx+key_text_width+(key_line_length+3.0*plotterStyle.keyStyle.xSeparation)*kfm.width('X');
else xx = xx + ( key_item_width + 2.0 * plotterStyle . keyStyle . xSeparation ) * kfm . width ( ' X ' ) ; */
xx = xx + key_text_width + ( plotterStyle . keyStyle . sampleLineLength + 2.0 * plotterStyle . keyStyle . xSeparation ) * kfm . width ( ' X ' ) ;
2015-07-11 18:56:02 +08:00
c + + ;
if ( c > columns ) {
c = 1 ;
l + + ;
2019-02-08 00:24:46 +08:00
//yy=yy+(key_item_height+plotterStyle.keyStyle.ySeparation)*kfm.height();
yy = yy + itheight + ( plotterStyle . keyStyle . ySeparation ) * kfm . width ( ' X ' ) ;
2015-07-11 18:56:02 +08:00
xx = x ;
}
}
}
}
}
/*painter.setPen(pold);
painter . setBrush ( bold ) ; */
2019-02-08 00:24:46 +08:00
2015-07-11 18:56:02 +08:00
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : getKeyExtent ( JKQTPEnhancedPainter & painter , double * width , double * height , double * text_width , double * text_height , int * columns_count , int * lines_count ) {
2015-07-11 18:56:02 +08:00
# ifdef JKQTBP_AUTOTIMER
2019-01-20 17:49:29 +08:00
JKQTPAutoOutputTimer jkaaot ( " JKQTBasePlotter::getKeyExtent " ) ;
2015-07-11 18:56:02 +08:00
# endif
QFont f = painter . font ( ) ;
2019-02-08 00:24:46 +08:00
f . setFamily ( plotterStyle . defaultFontName ) ;
f . setPointSizeF ( plotterStyle . keyStyle . fontSize * fontSizeMultiplier ) ;
2015-07-11 18:56:02 +08:00
QFontMetricsF kfm ( f ) ;
2019-02-08 00:24:46 +08:00
if ( text_height ! = nullptr ) * text_height = plotterStyle . keyStyle . itemHeight * kfm . width ( ' X ' ) ;
if ( plotterStyle . keyStyle . layout = = JKQTPKeyLayoutOneColumn ) {
2015-07-11 18:56:02 +08:00
int keyHeight = graphs . size ( ) ;
double w = 0 ;
double h = 0 ;
painter . setFont ( f ) ;
2018-11-18 18:59:30 +08:00
if ( text_height ! = nullptr ) * text_height = 0 ;
2015-07-11 18:56:02 +08:00
for ( int i = 0 ; i < graphs . size ( ) ; i + + ) {
2019-02-03 21:04:48 +08:00
if ( graphs [ i ] - > getTitle ( ) . isEmpty ( ) | | ! graphs [ i ] - > isVisible ( ) ) {
2015-07-11 18:56:02 +08:00
keyHeight - - ;
} else {
2019-01-26 20:00:40 +08:00
//mt.parse(graphs[i]->getTitle());
2015-07-11 18:56:02 +08:00
//QSizeF fs=mt.getSize(painter);
2019-02-08 00:24:46 +08:00
QSizeF fs = getTextSizeSize ( plotterStyle . defaultFontName , plotterStyle . keyStyle . fontSize * fontSizeMultiplier , graphs [ i ] - > getTitle ( ) , painter ) ;
2015-07-11 18:56:02 +08:00
if ( fs . width ( ) > w ) w = fs . width ( ) ;
if ( text_height & & fs . height ( ) > * text_height ) * text_height = fs . height ( ) ;
2019-02-08 00:24:46 +08:00
h = h + qMax ( plotterStyle . keyStyle . itemHeight * kfm . width ( ' X ' ) , fs . height ( ) ) + plotterStyle . keyStyle . ySeparation * kfm . width ( ' X ' ) ;
2015-07-11 18:56:02 +08:00
}
}
2019-02-08 00:24:46 +08:00
if ( plotterStyle . keyStyle . autosize ) {
if ( width ) * width = w + ( plotterStyle . keyStyle . sampleLineLength + 2.0 * plotterStyle . keyStyle . xSeparation ) * kfm . width ( ' X ' ) ;
2018-11-18 18:59:30 +08:00
if ( text_width ! = nullptr ) * text_width = w + 2.0 * kfm . width ( ' X ' ) ;
2015-07-11 18:56:02 +08:00
} else {
2019-02-08 00:24:46 +08:00
if ( width ) * width = plotterStyle . keyStyle . itemWidth * kfm . width ( ' X ' ) ;
if ( text_width ! = nullptr ) * text_width = ( plotterStyle . keyStyle . itemWidth - ( plotterStyle . keyStyle . sampleLineLength + plotterStyle . keyStyle . xSeparation ) ) * kfm . width ( ' X ' ) ;
2015-07-11 18:56:02 +08:00
}
2019-02-08 00:24:46 +08:00
if ( h > plotterStyle . keyStyle . ySeparation * kfm . width ( ' X ' ) ) h = h - plotterStyle . keyStyle . ySeparation * kfm . width ( ' X ' ) ;
2015-07-11 18:56:02 +08:00
if ( height ) * height = h ; //keyHeight*key_item_height*kfm.width('X');
if ( columns_count ) * columns_count = 1 ;
if ( lines_count ) * lines_count = keyHeight ;
2019-02-08 00:24:46 +08:00
} else if ( plotterStyle . keyStyle . layout = = JKQTPKeyLayoutOneRow ) {
2015-07-11 18:56:02 +08:00
int keyWidth = graphs . size ( ) ;
double w = 0 ;
double h = 0 ;
painter . setFont ( f ) ;
2018-11-18 18:59:30 +08:00
if ( text_width ! = nullptr ) * text_width = 0 ;
2015-07-11 18:56:02 +08:00
for ( int i = 0 ; i < graphs . size ( ) ; i + + ) {
2019-02-03 21:04:48 +08:00
if ( graphs [ i ] - > getTitle ( ) . isEmpty ( ) | | ! graphs [ i ] - > isVisible ( ) ) {
2015-07-11 18:56:02 +08:00
keyWidth - - ;
} else {
2019-01-26 20:00:40 +08:00
//mt.parse(graphs[i]->getTitle());
2015-07-11 18:56:02 +08:00
//QSizeF fs=mt.getSize(painter);
2019-02-08 00:24:46 +08:00
QSizeF fs = getTextSizeSize ( plotterStyle . defaultFontName , plotterStyle . keyStyle . fontSize * fontSizeMultiplier , graphs [ i ] - > getTitle ( ) , painter ) ;
2015-07-11 18:56:02 +08:00
if ( fs . height ( ) > h ) h = fs . height ( ) ;
if ( text_width & & fs . width ( ) > * text_width ) * text_width = fs . width ( ) ;
2019-02-08 00:24:46 +08:00
w = w + fs . width ( ) + ( plotterStyle . keyStyle . sampleLineLength + 2.0 * plotterStyle . keyStyle . xSeparation ) * kfm . width ( ' X ' ) ;
2015-07-11 18:56:02 +08:00
}
}
2019-02-08 00:24:46 +08:00
if ( h < plotterStyle . keyStyle . itemHeight * kfm . width ( ' X ' ) ) h = plotterStyle . keyStyle . itemHeight * kfm . width ( ' X ' ) ;
if ( plotterStyle . keyStyle . autosize ) {
2015-07-11 18:56:02 +08:00
if ( height ) * height = h ;
2018-11-18 18:59:30 +08:00
if ( text_height ! = nullptr ) * text_height = h ;
2015-07-11 18:56:02 +08:00
} else {
if ( height ) * height = h ;
2019-02-08 00:24:46 +08:00
if ( text_height ! = nullptr ) * text_height = ( plotterStyle . keyStyle . itemHeight - ( plotterStyle . keyStyle . ySeparation ) ) * kfm . width ( ' X ' ) ;
2015-07-11 18:56:02 +08:00
}
2019-02-08 00:24:46 +08:00
if ( w > ( plotterStyle . keyStyle . xSeparation ) * kfm . width ( ' X ' ) ) w = w - ( plotterStyle . keyStyle . xSeparation ) * kfm . width ( ' X ' ) ;
2015-07-11 18:56:02 +08:00
if ( width ) * width = w ; //keyHeight*key_item_height*kfm.width('X');
if ( columns_count ) * columns_count = keyWidth ;
if ( lines_count ) * lines_count = 1 ;
2019-02-08 00:24:46 +08:00
} else if ( plotterStyle . keyStyle . layout = = JKQTPKeyLayoutMultiColumn ) {
2015-07-11 18:56:02 +08:00
// copied code in plotKeyContents()!!!
double keyHeight = graphs . size ( ) ;
double w = 0 ;
double txtH = 0 ;
QFont f = painter . font ( ) ;
2019-02-08 00:24:46 +08:00
f . setFamily ( plotterStyle . defaultFontName ) ;
f . setPointSizeF ( plotterStyle . keyStyle . fontSize * fontSizeMultiplier ) ;
2015-07-11 18:56:02 +08:00
painter . setFont ( f ) ;
for ( int i = 0 ; i < graphs . size ( ) ; i + + ) {
2019-02-03 21:04:48 +08:00
if ( graphs [ i ] - > getTitle ( ) . isEmpty ( ) | | ! graphs [ i ] - > isVisible ( ) ) {
2015-07-11 18:56:02 +08:00
keyHeight - - ;
} else {
2019-01-26 20:00:40 +08:00
//mt.parse(graphs[i]->getTitle());
2015-07-11 18:56:02 +08:00
//QSizeF fs=mt.getSize(painter);
2019-02-08 00:24:46 +08:00
QSizeF fs = getTextSizeSize ( plotterStyle . defaultFontName , plotterStyle . keyStyle . fontSize * fontSizeMultiplier , graphs [ i ] - > getTitle ( ) , painter ) ;
2015-07-11 18:56:02 +08:00
if ( fs . width ( ) > w ) w = fs . width ( ) ;
if ( fs . height ( ) > txtH ) txtH = fs . height ( ) ;
}
}
if ( text_height ) {
2019-02-08 00:24:46 +08:00
if ( plotterStyle . keyStyle . autosize ) * text_height = txtH ;
else * text_height = plotterStyle . keyStyle . itemHeight * kfm . width ( ' X ' ) ;
2015-07-11 18:56:02 +08:00
}
2019-02-08 00:24:46 +08:00
double columns = floor ( double ( internalPlotWidth ) / ( w + ( 2.0 * plotterStyle . keyStyle . xSeparation + plotterStyle . keyStyle . sampleLineLength ) * kfm . width ( ' X ' ) ) ) ;
if ( ! plotterStyle . keyStyle . autosize ) columns = floor ( double ( internalPlotWidth ) / ( ( plotterStyle . keyStyle . itemWidth + 2.0 * plotterStyle . keyStyle . xSeparation + plotterStyle . keyStyle . sampleLineLength ) * kfm . width ( ' X ' ) ) ) ;
2015-07-11 18:56:02 +08:00
columns = qMin ( columns , keyHeight ) ;
2019-01-26 20:00:40 +08:00
int lines = static_cast < int > ( ceil ( static_cast < double > ( keyHeight ) / static_cast < double > ( columns ) ) ) ;
lines = qMin ( static_cast < double > ( lines ) , keyHeight ) ;
2015-07-11 18:56:02 +08:00
2019-02-08 00:24:46 +08:00
if ( plotterStyle . keyStyle . position = = JKQTPKeyInsideTopLeft | | plotterStyle . keyStyle . position = = JKQTPKeyInsideTopRight
| | plotterStyle . keyStyle . position = = JKQTPKeyOutsideTopLeft | | plotterStyle . keyStyle . position = = JKQTPKeyOutsideTopRight ) {
if ( plotterStyle . keyStyle . autosize ) {
lines = static_cast < int > ( floor ( static_cast < double > ( internalPlotHeight ) / static_cast < double > ( txtH + ( plotterStyle . keyStyle . ySeparation ) * kfm . width ( ' X ' ) ) ) ) ;
2015-07-11 18:56:02 +08:00
} else {
2019-02-08 00:24:46 +08:00
lines = static_cast < int > ( floor ( static_cast < double > ( internalPlotHeight ) / static_cast < double > ( ( plotterStyle . keyStyle . itemHeight + plotterStyle . keyStyle . ySeparation ) * kfm . width ( ' X ' ) ) ) ) ;
2015-07-11 18:56:02 +08:00
}
2019-01-26 20:00:40 +08:00
columns = static_cast < int > ( ceil ( static_cast < double > ( keyHeight ) / static_cast < double > ( lines ) ) ) ;
lines = qMin ( static_cast < double > ( lines ) , keyHeight ) ;
2015-07-11 18:56:02 +08:00
}
if ( columns_count ) * columns_count = columns ;
if ( lines_count ) * lines_count = lines ;
2019-02-08 00:24:46 +08:00
if ( plotterStyle . keyStyle . autosize ) {
if ( width ) * width = ( w + ( plotterStyle . keyStyle . sampleLineLength + 3.0 * plotterStyle . keyStyle . xSeparation ) * kfm . width ( ' X ' ) ) * columns ;
if ( height ) * height = lines * ( txtH + plotterStyle . keyStyle . ySeparation * kfm . width ( ' X ' ) ) ;
if ( lines > 0 ) * height = * height - plotterStyle . keyStyle . ySeparation * kfm . width ( ' X ' ) ;
2018-11-18 18:59:30 +08:00
if ( text_width ! = nullptr ) * text_width = w ;
2015-07-11 18:56:02 +08:00
} else {
2019-02-08 00:24:46 +08:00
if ( width ) * width = ( plotterStyle . keyStyle . itemWidth + 2.0 * plotterStyle . keyStyle . xSeparation ) * kfm . width ( ' X ' ) * columns ;
if ( height ) * height = lines * ( plotterStyle . keyStyle . itemHeight + plotterStyle . keyStyle . ySeparation ) * kfm . width ( ' X ' ) ;
if ( lines > 0 ) * height = * height - plotterStyle . keyStyle . ySeparation * kfm . width ( ' X ' ) ;
if ( text_width ! = nullptr ) * text_width = ( plotterStyle . keyStyle . itemWidth - ( plotterStyle . keyStyle . sampleLineLength + plotterStyle . keyStyle . xSeparation ) ) * kfm . width ( ' X ' ) ;
2015-07-11 18:56:02 +08:00
}
# ifdef SHOW_JKQTPLOTTER_DEBUG
qDebug ( ) < < " getKeyExtent(): mult-column: columns= " < < columns < < " lines= " < < lines ;
# endif
}
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : loadUserSettings ( )
2015-07-11 18:56:02 +08:00
{
if ( ! userSettigsFilename . isEmpty ( ) ) {
QSettings set ( userSettigsFilename , QSettings : : IniFormat ) ;
set . sync ( ) ;
loadUserSettings ( set , userSettigsPrefix ) ;
}
}
2019-01-26 19:28:44 +08:00
void JKQTBasePlotter : : saveUserSettings ( ) const
2015-07-11 18:56:02 +08:00
{
if ( ! userSettigsFilename . isEmpty ( ) ) {
QSettings set ( userSettigsFilename , QSettings : : IniFormat ) ;
saveUserSettings ( set , userSettigsPrefix ) ;
set . sync ( ) ;
}
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : getGraphsXMinMax ( double & minx , double & maxx , double & smallestGreaterZero ) {
2015-07-11 18:56:02 +08:00
bool start = true ;
minx = 0 ;
maxx = 0 ;
smallestGreaterZero = 0 ;
for ( int i = 0 ; i < graphs . size ( ) ; i + + ) {
2019-02-03 21:04:48 +08:00
if ( graphs [ i ] - > isVisible ( ) ) {
2015-07-11 18:56:02 +08:00
double gminx = 0 ;
double gmaxx = 0 ;
double gsmallestGreaterZero = 0 ;
if ( graphs [ i ] - > getXMinMax ( gminx , gmaxx , gsmallestGreaterZero ) ) {
if ( ( gminx < minx ) | | start ) minx = gminx ;
if ( ( gmaxx > maxx ) | | start ) maxx = gmaxx ;
double xvsgz ;
xvsgz = gsmallestGreaterZero ; if ( ( xvsgz > 10.0 * DBL_MIN ) & & ( ( smallestGreaterZero < 10.0 * DBL_MIN ) | | ( xvsgz < smallestGreaterZero ) ) ) smallestGreaterZero = xvsgz ;
xvsgz = gmaxx ; if ( ( xvsgz > 10.0 * DBL_MIN ) & & ( ( smallestGreaterZero < 10.0 * DBL_MIN ) | | ( xvsgz < smallestGreaterZero ) ) ) smallestGreaterZero = xvsgz ;
xvsgz = gminx ; if ( ( xvsgz > 10.0 * DBL_MIN ) & & ( ( smallestGreaterZero < 10.0 * DBL_MIN ) | | ( xvsgz < smallestGreaterZero ) ) ) smallestGreaterZero = xvsgz ;
//std::cout<<" i="<<i<<": gminx="<<gminx<<" gmaxx="<<gmaxx<<" minx="<<minx<<" maxx="<<maxx<<std::endl;
start = false ;
}
}
}
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : getGraphsYMinMax ( double & miny , double & maxy , double & smallestGreaterZero ) {
2015-07-11 18:56:02 +08:00
bool start = true ;
miny = 0 ;
maxy = 0 ;
smallestGreaterZero = 0 ;
for ( int i = 0 ; i < graphs . size ( ) ; i + + ) {
2019-02-03 21:04:48 +08:00
if ( graphs [ i ] - > isVisible ( ) ) {
2015-07-11 18:56:02 +08:00
double gminy = 0 ;
double gmaxy = 0 ;
double gsmallestGreaterZero = 0 ;
if ( graphs [ i ] - > getYMinMax ( gminy , gmaxy , gsmallestGreaterZero ) ) {
if ( ( gminy < miny ) | | start ) miny = gminy ;
if ( ( gmaxy > maxy ) | | start ) maxy = gmaxy ;
double xvsgz ;
xvsgz = gsmallestGreaterZero ; if ( ( xvsgz > 10.0 * DBL_MIN ) & & ( ( smallestGreaterZero < 10.0 * DBL_MIN ) | | ( xvsgz < smallestGreaterZero ) ) ) smallestGreaterZero = xvsgz ;
xvsgz = gmaxy ; if ( ( xvsgz > 10.0 * DBL_MIN ) & & ( ( smallestGreaterZero < 10.0 * DBL_MIN ) | | ( xvsgz < smallestGreaterZero ) ) ) smallestGreaterZero = xvsgz ;
xvsgz = gminy ; if ( ( xvsgz > 10.0 * DBL_MIN ) & & ( ( smallestGreaterZero < 10.0 * DBL_MIN ) | | ( xvsgz < smallestGreaterZero ) ) ) smallestGreaterZero = xvsgz ;
start = false ;
}
}
}
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : zoomToFit ( bool zoomX , bool zoomY , bool includeX0 , bool includeY0 , double scaleX , double scaleY ) {
2019-01-26 03:16:04 +08:00
//std::cout<<"JKQTBasePlotter::zoomToFit():\n";
2015-07-11 18:56:02 +08:00
double xxmin ;
double xxmax ;
double xsmallestGreaterZero ;
if ( graphs . size ( ) < = 0 ) return ;
if ( zoomX ) {
getGraphsXMinMax ( xxmin , xxmax , xsmallestGreaterZero ) ;
//std::cout<<" xxmin="<<xxmin<<" xxmax="<<xxmax<<std::endl;
if ( JKQTPIsOKFloat ( xxmin ) & & JKQTPIsOKFloat ( xxmax ) ) {
bool doScale = true ;
if ( fabs ( xxmin - xxmax ) < 1e-305 ) {
xxmin = xAxis - > getMin ( ) ;
xxmax = xAxis - > getMax ( ) ;
doScale = false ;
}
if ( xAxis - > isLogAxis ( ) ) {
if ( ( xxmin < = 1e-305 ) & & ( xxmax < = 1e-305 ) ) { xxmin = 0.1 ; xxmax = 1.0 ; }
else if ( ( xxmin < = 1e-305 ) & & ( xxmax > 0 ) ) {
if ( xsmallestGreaterZero > 10.0 * DBL_MIN ) xxmin = xsmallestGreaterZero ;
2019-01-26 20:00:40 +08:00
else xxmin = xxmax / xAxis - > getLogAxisBase ( ) ;
2015-07-11 18:56:02 +08:00
}
if ( doScale ) {
double d = scaleX * ( log ( xxmax ) - log ( xxmin ) ) ; // new width
double c = ( log ( xxmax ) + log ( xxmin ) ) / 2.0 ; // center of interval
xxmin = exp ( c - d / 2.0 ) ;
xxmax = exp ( c + d / 2.0 ) ;
}
} else if ( doScale ) {
double d = scaleX * ( xxmax - xxmin ) ; // new width
double c = ( xxmax + xxmin ) / 2.0 ; // center of interval
xxmin = c - d / 2.0 ;
xxmax = c + d / 2.0 ;
}
if ( includeX0 & & ! xAxis - > isLogAxis ( ) ) {
if ( xxmin > 0 ) xxmin = 0 ;
else if ( xxmax < 0 ) xxmax = 0 ;
}
//std::cout<<" => xxmin="<<xxmin<<" xxmax="<<xxmax<<std::endl;
if ( JKQTPIsOKFloat ( xxmin ) & & JKQTPIsOKFloat ( xxmax ) ) {
setX ( xxmin , xxmax ) ;
} else if ( ! JKQTPIsOKFloat ( xxmin ) & & JKQTPIsOKFloat ( xxmax ) ) {
setX ( getXMin ( ) , xxmax ) ;
} else if ( JKQTPIsOKFloat ( xxmin ) & & ! JKQTPIsOKFloat ( xxmax ) ) {
setX ( xxmin , getXMax ( ) ) ;
}
}
}
double yymin ;
double yymax ;
double ysmallestGreaterZero ;
if ( zoomY ) {
getGraphsYMinMax ( yymin , yymax , ysmallestGreaterZero ) ;
//std::cout<<" yymin="<<yymin<<" yymax="<<yymax<<std::endl;
bool doScale = true ;
if ( fabs ( yymin - yymax ) < 1e-305 ) {
yymin = yAxis - > getMin ( ) ;
yymax = yAxis - > getMax ( ) ;
doScale = false ;
}
2019-01-26 20:00:40 +08:00
if ( yAxis - > getLogAxis ( ) ) {
2015-07-11 18:56:02 +08:00
if ( ( yymin < = 1e-305 ) & & ( yymax < = 1e-305 ) ) { yymin = 0.1 ; yymax = 1.0 ; }
else if ( ( yymin < = 1e-305 ) & & ( yymax > 0 ) ) {
if ( ysmallestGreaterZero > 10.0 * DBL_MIN ) yymin = ysmallestGreaterZero ;
2019-01-26 20:00:40 +08:00
else yymin = yymax / yAxis - > getLogAxisBase ( ) ;
2015-07-11 18:56:02 +08:00
}
if ( doScale ) {
double d = scaleY * ( log ( yymax ) - log ( yymin ) ) ; // new width
double c = ( log ( yymax ) + log ( yymin ) ) / 2.0 ; // center of interval
yymin = exp ( c - d / 2.0 ) ;
yymax = exp ( c + d / 2.0 ) ;
}
} else if ( doScale ) {
double d = scaleY * ( yymax - yymin ) ; // new width
double c = ( yymax + yymin ) / 2.0 ; // center of interval
yymin = c - d / 2.0 ;
yymax = c + d / 2.0 ;
}
2019-01-26 20:00:40 +08:00
if ( includeY0 & & ! yAxis - > getLogAxis ( ) ) {
2015-07-11 18:56:02 +08:00
if ( yymin > 0 ) yymin = 0 ;
else if ( yymax < 0 ) yymax = 0 ;
}
//std::cout<<" => yymin="<<yymin<<" yymax="<<yymax<<std::endl;
if ( JKQTPIsOKFloat ( yymin ) & & JKQTPIsOKFloat ( yymax ) ) {
setY ( yymin , yymax ) ;
} else if ( ! JKQTPIsOKFloat ( yymin ) & & JKQTPIsOKFloat ( yymax ) ) {
setY ( getYMin ( ) , yymax ) ;
} else if ( JKQTPIsOKFloat ( yymin ) & & ! JKQTPIsOKFloat ( yymax ) ) {
setY ( yymin , getYMax ( ) ) ;
}
}
//std::cout<<"end of zoomToFit\n";
//setXY(xxmin, xxmax, yymin, yymax);
if ( emitSignals ) emit zoomChangedLocally ( xAxis - > getMin ( ) , xAxis - > getMax ( ) , yAxis - > getMin ( ) , yAxis - > getMax ( ) , this ) ;
}
2019-01-20 17:49:29 +08:00
JKQTPOverlayElement * JKQTBasePlotter : : getOverlayElement ( size_t i ) {
2015-07-11 18:56:02 +08:00
return overlays [ i ] ;
}
2019-01-20 17:49:29 +08:00
size_t JKQTBasePlotter : : getOverlayElementCount ( ) {
2015-07-11 18:56:02 +08:00
return overlays . size ( ) ;
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : deleteOverlayElement ( size_t i , bool deletegraph ) {
2015-07-11 18:56:02 +08:00
if ( long ( i ) < 0 | | long ( i ) > = overlays . size ( ) ) return ;
2019-01-20 17:49:29 +08:00
JKQTPOverlayElement * g = overlays [ i ] ;
2015-07-11 18:56:02 +08:00
overlays . removeAt ( i ) ;
if ( deletegraph & & g ) delete g ;
if ( emitPlotSignals ) emit overlaysUpdated ( ) ;
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : deleteOverlayElement ( JKQTPOverlayElement * gr , bool deletegraph ) {
2015-07-11 18:56:02 +08:00
int i = overlays . indexOf ( gr ) ;
while ( i > = 0 ) {
overlays . removeAt ( i ) ;
i = overlays . indexOf ( gr ) ;
}
if ( deletegraph & & gr ) delete gr ;
if ( emitPlotSignals ) emit overlaysUpdated ( ) ;
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : clearOverlayElement ( bool deleteGraphs ) {
2015-07-11 18:56:02 +08:00
for ( int i = 0 ; i < overlays . size ( ) ; i + + ) {
2019-01-20 17:49:29 +08:00
JKQTPOverlayElement * g = overlays [ i ] ;
2015-07-11 18:56:02 +08:00
if ( g & & deleteGraphs ) delete g ;
}
overlays . clear ( ) ;
if ( emitPlotSignals ) emit overlaysUpdated ( ) ;
}
2019-01-20 17:49:29 +08:00
size_t JKQTBasePlotter : : addOverlayElement ( JKQTPOverlayElement * gr ) {
2015-07-11 18:56:02 +08:00
gr - > setParent ( this ) ;
for ( int i = 0 ; i < overlays . size ( ) ; i + + ) {
if ( overlays [ i ] = = gr ) return i ;
}
overlays . push_back ( gr ) ;
if ( emitPlotSignals ) emit overlaysUpdated ( ) ;
return overlays . size ( ) - 1 ;
}
2019-01-20 17:49:29 +08:00
bool JKQTBasePlotter : : containsOverlayElement ( JKQTPOverlayElement * gr ) const {
2015-07-11 18:56:02 +08:00
for ( int i = 0 ; i < overlays . size ( ) ; i + + ) {
if ( overlays [ i ] = = gr ) {
return true ;
}
}
return false ;
}
2019-01-20 17:49:29 +08:00
size_t JKQTBasePlotter : : moveOverlayElementTop ( JKQTPOverlayElement * gr ) {
2015-07-11 18:56:02 +08:00
gr - > setParent ( this ) ;
for ( int i = 0 ; i < overlays . size ( ) ; i + + ) {
if ( overlays [ i ] = = gr ) {
if ( i < overlays . size ( ) - 1 ) {
overlays . removeAt ( i ) ;
overlays . push_back ( gr ) ;
}
return overlays . size ( ) - 1 ;
}
}
overlays . push_back ( gr ) ;
if ( emitPlotSignals ) emit overlaysUpdated ( ) ;
return overlays . size ( ) - 1 ;
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : addOverlayElements ( const QList < JKQTPOverlayElement * > & gr ) {
2015-07-11 18:56:02 +08:00
for ( int i = 0 ; i < gr . size ( ) ; i + + ) {
addOverlayElement ( gr [ i ] ) ;
}
}
2019-01-20 17:49:29 +08:00
JKQTPPlotElement * JKQTBasePlotter : : getGraph ( size_t i ) {
2015-07-11 18:56:02 +08:00
return graphs [ i ] ;
} ;
2019-01-20 17:49:29 +08:00
size_t JKQTBasePlotter : : getGraphCount ( ) {
2015-07-11 18:56:02 +08:00
return graphs . size ( ) ;
} ;
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : deleteGraph ( size_t i , bool deletegraph ) {
2015-07-11 18:56:02 +08:00
if ( long ( i ) < 0 | | long ( i ) > = graphs . size ( ) ) return ;
2019-01-20 17:49:29 +08:00
JKQTPPlotElement * g = graphs [ i ] ;
2015-07-11 18:56:02 +08:00
graphs . removeAt ( i ) ;
if ( deletegraph & & g ) delete g ;
if ( emitPlotSignals ) emit plotUpdated ( ) ;
} ;
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : deleteGraph ( JKQTPPlotElement * gr , bool deletegraph ) {
2015-07-11 18:56:02 +08:00
int i = graphs . indexOf ( gr ) ;
while ( i > = 0 ) {
graphs . removeAt ( i ) ;
i = graphs . indexOf ( gr ) ;
}
if ( deletegraph & & gr ) delete gr ;
if ( emitPlotSignals ) emit plotUpdated ( ) ;
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : clearGraphs ( bool deleteGraphs ) {
2015-07-11 18:56:02 +08:00
for ( int i = 0 ; i < graphs . size ( ) ; i + + ) {
2019-01-20 17:49:29 +08:00
JKQTPPlotElement * g = graphs [ i ] ;
2015-07-11 18:56:02 +08:00
if ( g & & deleteGraphs ) delete g ;
}
graphs . clear ( ) ;
usedStyles . clear ( ) ;
if ( emitPlotSignals ) emit plotUpdated ( ) ;
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : setAllGraphsInvisible ( )
2015-07-11 18:56:02 +08:00
{
for ( int i = 0 ; i < graphs . size ( ) ; i + + ) {
2019-01-20 17:49:29 +08:00
JKQTPPlotElement * g = graphs [ i ] ;
2019-01-26 20:00:40 +08:00
g - > setVisible ( false ) ;
2015-07-11 18:56:02 +08:00
}
if ( emitPlotSignals ) emit plotUpdated ( ) ;
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : setAllGraphsVisible ( )
2015-07-11 18:56:02 +08:00
{
for ( int i = 0 ; i < graphs . size ( ) ; i + + ) {
2019-01-20 17:49:29 +08:00
JKQTPPlotElement * g = graphs [ i ] ;
2019-01-26 20:00:40 +08:00
g - > setVisible ( true ) ;
2015-07-11 18:56:02 +08:00
}
if ( emitPlotSignals ) emit plotUpdated ( ) ;
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : setGraphVisible ( int i , bool visible )
2015-07-11 18:56:02 +08:00
{
2019-01-20 17:49:29 +08:00
JKQTPPlotElement * g = graphs . value ( i , nullptr ) ;
2019-01-26 20:00:40 +08:00
if ( g ) g - > setVisible ( visible ) ;
2015-07-11 18:56:02 +08:00
if ( emitPlotSignals ) emit plotUpdated ( ) ;
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : setOnlyGraphVisible ( int gr )
2015-07-11 18:56:02 +08:00
{
for ( int i = 0 ; i < graphs . size ( ) ; i + + ) {
2019-01-20 17:49:29 +08:00
JKQTPPlotElement * g = graphs [ i ] ;
2019-01-26 20:00:40 +08:00
g - > setVisible ( false ) ;
2015-07-11 18:56:02 +08:00
}
2019-01-20 17:49:29 +08:00
JKQTPPlotElement * g = graphs . value ( gr , nullptr ) ;
2019-01-26 20:00:40 +08:00
if ( g ) g - > setVisible ( true ) ;
2015-07-11 18:56:02 +08:00
if ( emitPlotSignals ) emit plotUpdated ( ) ;
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : setOnlyNthGraphsVisible ( int start , int n )
2015-07-11 18:56:02 +08:00
{
for ( int i = 0 ; i < graphs . size ( ) ; i + + ) {
2019-01-20 17:49:29 +08:00
JKQTPPlotElement * g = graphs [ i ] ;
2019-01-26 20:00:40 +08:00
g - > setVisible ( false ) ;
2015-07-11 18:56:02 +08:00
}
for ( int i = start ; i < graphs . size ( ) ; i + = n ) {
2019-01-20 17:49:29 +08:00
JKQTPPlotElement * g = graphs . value ( i , nullptr ) ;
2019-01-26 20:00:40 +08:00
if ( g ) g - > setVisible ( true ) ;
2015-07-11 18:56:02 +08:00
}
if ( emitPlotSignals ) emit plotUpdated ( ) ;
}
2019-01-20 17:49:29 +08:00
size_t JKQTBasePlotter : : addGraph ( JKQTPPlotElement * gr ) {
2015-07-11 18:56:02 +08:00
gr - > setParent ( this ) ;
for ( int i = 0 ; i < graphs . size ( ) ; i + + ) {
if ( graphs [ i ] = = gr ) return i ;
}
graphs . push_back ( gr ) ;
if ( emitPlotSignals ) emit plotUpdated ( ) ;
return graphs . size ( ) - 1 ;
} ;
2019-01-20 17:49:29 +08:00
size_t JKQTBasePlotter : : moveGraphTop ( JKQTPPlotElement * gr ) {
2015-07-11 18:56:02 +08:00
gr - > setParent ( this ) ;
for ( int i = 0 ; i < graphs . size ( ) ; i + + ) {
if ( graphs [ i ] = = gr ) {
if ( i < graphs . size ( ) - 1 ) {
graphs . removeAt ( i ) ;
graphs . push_back ( gr ) ;
}
return graphs . size ( ) - 1 ;
}
}
graphs . push_back ( gr ) ;
if ( emitPlotSignals ) emit plotUpdated ( ) ;
return graphs . size ( ) - 1 ;
}
2019-01-20 17:49:29 +08:00
size_t JKQTBasePlotter : : moveGraphBottom ( JKQTPPlotElement * gr )
2015-07-11 18:56:02 +08:00
{
gr - > setParent ( this ) ;
for ( int i = 0 ; i < graphs . size ( ) ; i + + ) {
if ( graphs [ i ] = = gr ) {
if ( i < graphs . size ( ) - 1 ) {
graphs . removeAt ( i ) ;
graphs . push_front ( gr ) ;
}
return 0 ;
}
}
graphs . push_front ( gr ) ;
if ( emitPlotSignals ) emit plotUpdated ( ) ;
return graphs . size ( ) - 1 ;
} ;
2019-01-20 17:49:29 +08:00
bool JKQTBasePlotter : : containsGraph ( JKQTPPlotElement * gr ) const {
2015-07-11 18:56:02 +08:00
for ( int i = 0 ; i < graphs . size ( ) ; i + + ) {
if ( graphs [ i ] = = gr ) {
return true ;
}
}
return false ;
} ;
2019-01-26 03:16:04 +08:00
void JKQTBasePlotter : : setUserSettigsFilename ( const QString & filename , const QString & prefix )
2015-07-11 18:56:02 +08:00
{
userSettigsFilename = filename ;
userSettigsPrefix = prefix ;
}
2019-01-26 03:16:04 +08:00
void JKQTBasePlotter : : setUserSettigsFilename ( const QString & filename )
2015-07-11 18:56:02 +08:00
{
userSettigsFilename = filename ;
}
2019-01-26 03:16:04 +08:00
void JKQTBasePlotter : : setUserSettigsPrefix ( const QString & prefix )
2015-07-11 18:56:02 +08:00
{
userSettigsPrefix = prefix ;
}
2019-01-26 03:16:04 +08:00
QString JKQTBasePlotter : : getUserSettigsFilename ( ) const
2015-07-11 18:56:02 +08:00
{
return userSettigsFilename ;
}
2019-01-26 03:16:04 +08:00
QString JKQTBasePlotter : : getUserSettigsPrefix ( ) const
2015-07-11 18:56:02 +08:00
{
return userSettigsPrefix ;
}
2019-01-20 17:49:29 +08:00
QSet < int > JKQTBasePlotter : : getDataColumnsByUser ( ) {
2015-07-11 18:56:02 +08:00
loadUserSettings ( ) ;
QSet < int > set ;
QStringList cols = getDatastore ( ) - > getColumnNames ( ) ;
2018-11-18 18:59:30 +08:00
QDialog * dlg = new QDialog ( nullptr , Qt : : WindowMinMaxButtonsHint ) ;
2015-07-11 18:56:02 +08:00
dlg - > setSizeGripEnabled ( true ) ;
//printZoomFactor=0.95;
//printMagnification=1.5;
QGridLayout * layout = new QGridLayout ( ) ;
dlg - > setLayout ( layout ) ;
dlg - > setWindowTitle ( tr ( " Select columns to export ... " ) ) ;
dlg - > setWindowIcon ( QIcon ( ) ) ;
QLabel * lab = new QLabel ( tr ( " <center><b>Please check the columns that should be exported in the list!</b><br> "
" You may also save a selection to reuse it in future, by clicking \" Save \" . "
" A stored selection can be used by selecting its name in the dropdown field "
" above the list widget.</center> " ) , dlg ) ;
lab - > setWordWrap ( true ) ;
layout - > addWidget ( lab , 0 , 0 , 1 , 2 ) ;
dataColumnsCombobox = new QComboBox ( dlg ) ;
dataColumnsCombobox - > addItems ( getDataColumnsByUserSaved . keys ( ) ) ;
connect ( dataColumnsCombobox , SIGNAL ( currentIndexChanged ( QString ) ) , this , SLOT ( getDataColumnsByUserComboBoxSelected ( QString ) ) ) ;
layout - > addWidget ( dataColumnsCombobox , 1 , 0 ) ;
QPushButton * btn = new QPushButton ( tr ( " &save " ) , dlg ) ;
connect ( btn , SIGNAL ( clicked ( ) ) , this , SLOT ( getDataColumnsByUserSave ( ) ) ) ;
layout - > addWidget ( btn , 1 , 1 ) ;
dataColumnsListWidget = new QListWidget ( dlg ) ;
for ( int i = 0 ; i < cols . size ( ) ; i + + ) {
QListWidgetItem * item = new QListWidgetItem ( cols [ i ] , dataColumnsListWidget ) ;
item - > setCheckState ( Qt : : Checked ) ;
item - > setFlags ( Qt : : ItemIsSelectable | Qt : : ItemIsUserCheckable | Qt : : ItemIsEnabled ) ;
dataColumnsListWidget - > addItem ( item ) ;
}
connect ( dataColumnsListWidget , SIGNAL ( itemChanged ( QListWidgetItem * ) ) , this , SLOT ( getDataColumnsByUserItemChanged ( QListWidgetItem * ) ) ) ;
layout - > addWidget ( dataColumnsListWidget , 2 , 0 , 5 , 1 ) ;
btn = new QPushButton ( tr ( " select &all " ) , dlg ) ;
connect ( btn , SIGNAL ( clicked ( ) ) , this , SLOT ( getDataColumnsByUserCheckAll ( ) ) ) ;
layout - > addWidget ( btn , 2 , 1 ) ;
btn = new QPushButton ( tr ( " select &none " ) , dlg ) ;
connect ( btn , SIGNAL ( clicked ( ) ) , this , SLOT ( getDataColumnsByUserCheckNone ( ) ) ) ;
layout - > addWidget ( btn , 3 , 1 ) ;
QDialogButtonBox * buttonBox = new QDialogButtonBox ( QDialogButtonBox : : Ok | QDialogButtonBox : : Cancel ) ;
connect ( buttonBox , SIGNAL ( accepted ( ) ) , dlg , SLOT ( accept ( ) ) ) ;
connect ( buttonBox , SIGNAL ( rejected ( ) ) , dlg , SLOT ( reject ( ) ) ) ;
layout - > addWidget ( buttonBox , layout - > rowCount ( ) , 0 , 1 , layout - > columnCount ( ) ) ;
layout - > setRowStretch ( layout - > rowCount ( ) - 2 , 1 ) ;
layout - > setColumnStretch ( 0 , 1 ) ;
dlg - > resize ( 350 , 500 ) ;
dataColumnsCombobox - > setCurrentIndex ( - 1 ) ;
if ( dlg - > exec ( ) = = QDialog : : Accepted ) {
for ( int i = 0 ; i < dataColumnsListWidget - > count ( ) ; i + + ) {
if ( dataColumnsListWidget - > item ( i ) - > checkState ( ) = = Qt : : Checked ) {
set . insert ( i ) ;
}
}
}
delete dlg ;
2018-11-18 18:59:30 +08:00
dataColumnsListWidget = nullptr ;
2015-07-11 18:56:02 +08:00
saveUserSettings ( ) ;
return set ;
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : getDataColumnsByUserCheckAll ( ) {
2015-07-11 18:56:02 +08:00
if ( ! dataColumnsListWidget ) return ;
for ( int i = 0 ; i < dataColumnsListWidget - > count ( ) ; i + + ) {
dataColumnsListWidget - > item ( i ) - > setCheckState ( Qt : : Checked ) ;
}
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : getDataColumnsByUserCheckNone ( ) {
2015-07-11 18:56:02 +08:00
if ( ! dataColumnsListWidget ) return ;
for ( int i = 0 ; i < dataColumnsListWidget - > count ( ) ; i + + ) {
dataColumnsListWidget - > item ( i ) - > setCheckState ( Qt : : Unchecked ) ;
}
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : getDataColumnsByUserSave ( ) {
2015-07-11 18:56:02 +08:00
if ( ! dataColumnsListWidget ) return ;
QString name = tr ( " my selection name " ) ;
QStringList items = getDataColumnsByUserSaved . keys ( ) ;
items < < name ;
bool ok = false ;
2018-11-18 18:59:30 +08:00
name = QInputDialog : : getItem ( nullptr , tr ( " save columns selection " ) , tr ( " name for new selection: " ) , items , items . size ( ) - 1 , true , & ok ) ;
2015-07-11 18:56:02 +08:00
if ( ok ) {
QStringList data ;
for ( int i = 0 ; i < dataColumnsListWidget - > count ( ) ; i + + ) {
if ( dataColumnsListWidget - > item ( i ) - > checkState ( ) = = Qt : : Checked ) data . append ( dataColumnsListWidget - > item ( i ) - > text ( ) ) ;
}
data . sort ( ) ;
getDataColumnsByUserSaved [ name ] = data ;
disconnect ( dataColumnsCombobox , SIGNAL ( currentIndexChanged ( QString ) ) , this , SLOT ( getDataColumnsByUserComboBoxSelected ( QString ) ) ) ;
dataColumnsCombobox - > clear ( ) ;
dataColumnsCombobox - > addItems ( getDataColumnsByUserSaved . keys ( ) ) ;
dataColumnsCombobox - > setCurrentIndex ( dataColumnsCombobox - > findText ( name ) ) ;
connect ( dataColumnsCombobox , SIGNAL ( currentIndexChanged ( QString ) ) , this , SLOT ( getDataColumnsByUserComboBoxSelected ( QString ) ) ) ;
}
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : getDataColumnsByUserComboBoxSelected ( const QString & name ) {
2015-07-11 18:56:02 +08:00
if ( ! dataColumnsListWidget ) return ;
QStringList newItems = getDataColumnsByUserSaved . value ( name , QStringList ( ) ) ;
if ( getDataColumnsByUserSaved . contains ( name ) ) {
for ( int i = 0 ; i < dataColumnsListWidget - > count ( ) ; i + + ) {
if ( newItems . contains ( dataColumnsListWidget - > item ( i ) - > text ( ) ) & & ( ! dataColumnsListWidget - > item ( i ) - > text ( ) . isEmpty ( ) ) ) {
dataColumnsListWidget - > item ( i ) - > setCheckState ( Qt : : Checked ) ;
} else {
dataColumnsListWidget - > item ( i ) - > setCheckState ( Qt : : Unchecked ) ;
}
}
}
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : getDataColumnsByUserItemChanged ( QListWidgetItem * /*widgetitem*/ ) {
2015-07-11 18:56:02 +08:00
if ( ! dataColumnsListWidget ) return ;
QStringList data ;
for ( int i = 0 ; i < dataColumnsListWidget - > count ( ) ; i + + ) {
if ( dataColumnsListWidget - > item ( i ) - > checkState ( ) = = Qt : : Checked ) data . append ( dataColumnsListWidget - > item ( i ) - > text ( ) ) ;
}
data . sort ( ) ;
QMapIterator < QString , QStringList > it ( getDataColumnsByUserSaved ) ;
QString item = " " ;
while ( it . hasNext ( ) ) {
it . next ( ) ;
QStringList ld = it . value ( ) ;
ld . sort ( ) ;
if ( data = = ld ) {
item = it . key ( ) ;
}
}
disconnect ( dataColumnsCombobox , SIGNAL ( currentIndexChanged ( QString ) ) , this , SLOT ( getDataColumnsByUserComboBoxSelected ( QString ) ) ) ;
dataColumnsCombobox - > setCurrentIndex ( dataColumnsCombobox - > findText ( item ) ) ;
connect ( dataColumnsCombobox , SIGNAL ( currentIndexChanged ( QString ) ) , this , SLOT ( getDataColumnsByUserComboBoxSelected ( QString ) ) ) ;
}
2019-01-20 17:49:29 +08:00
void JKQTBasePlotter : : showPlotData ( ) {
2018-11-18 18:59:30 +08:00
QDialog * dlg = new QDialog ( nullptr , Qt : : Dialog | Qt : : WindowCloseButtonHint | Qt : : WindowMinMaxButtonsHint ) ;
2015-07-11 18:56:02 +08:00
dlg - > setWindowTitle ( tr ( " Plot data table " ) ) ;
dlg - > setSizeGripEnabled ( true ) ;
QVBoxLayout * layout = new QVBoxLayout ( ) ;
dlg - > setLayout ( layout ) ;
QToolBar * tb = new QToolBar ( " toolbar " , dlg ) ;
2019-01-20 23:15:10 +08:00
QAction * actClose = new QAction ( QIcon ( " :/JKQTPlotter/jkqtp_exit.png " ) , tr ( " &Close Window " ) , dlg ) ;
2015-07-11 18:56:02 +08:00
connect ( actClose , SIGNAL ( triggered ( ) ) , dlg , SLOT ( accept ( ) ) ) ;
tb - > addAction ( actClose ) ;
tb - > addSeparator ( ) ;
tb - > addAction ( actSaveData ) ;
tb - > addAction ( actCopyData ) ;
tb - > addAction ( actCopyMatlab ) ;
layout - > addWidget ( tb ) ;
JKQTPEnhancedTableView * tv = new JKQTPEnhancedTableView ( dlg ) ;
layout - > addWidget ( tv ) ;
2019-01-26 03:16:04 +08:00
tb - > addAction ( tv - > getActionPrint ( ) ) ;
2015-07-11 18:56:02 +08:00
2019-01-20 17:49:29 +08:00
JKQTPDatastoreModel * model = new JKQTPDatastoreModel ( getDatastore ( ) , this ) ;
2015-07-11 18:56:02 +08:00
tv - > setModel ( model ) ;
tv - > resizeColumnsToContents ( ) ;
tv - > resizeRowsToContents ( ) ;
dlg - > exec ( ) ;
delete dlg ;
}
2019-01-26 03:16:04 +08:00
void JKQTBasePlotter : : setEmittingSignalsEnabled ( bool enabled )
2015-07-11 18:56:02 +08:00
{
emitSignals = enabled ;
2019-01-26 20:00:40 +08:00
xAxis - > setDoUpdateScaling ( enabled ) ;
yAxis - > setDoUpdateScaling ( enabled ) ;
2015-07-11 18:56:02 +08:00
}
2019-02-08 00:24:46 +08:00
QHash < JKQTBasePlotter : : textSizeKey , JKQTBasePlotter : : textSizeData > JKQTBasePlotter : : s_TextSizeDataCache = QHash < JKQTBasePlotter : : textSizeKey , JKQTBasePlotter : : textSizeData > ( ) ;
2015-07-11 18:56:02 +08:00
2019-01-20 17:49:29 +08:00
JKQTBasePlotter : : textSizeKey : : textSizeKey ( const QFont & f , const QString & text , QPaintDevice * pd )
2015-07-11 18:56:02 +08:00
{
this - > text = text ;
this - > f = f ;
if ( pd ) {
ldpiX = pd - > logicalDpiX ( ) ;
ldpiY = pd - > logicalDpiY ( ) ;
pdpiX = pd - > physicalDpiX ( ) ;
pdpiY = pd - > physicalDpiY ( ) ;
} else {
ldpiX = 0 ;
ldpiY = 0 ;
pdpiX = 0 ;
pdpiY = 0 ;
}
}
2019-01-20 17:49:29 +08:00
JKQTBasePlotter : : textSizeKey : : textSizeKey ( const QString & fontName , double fontSize , const QString & text , QPaintDevice * pd )
2015-07-11 18:56:02 +08:00
{
QFont f ;
f . setFamily ( fontName ) ;
f . setPointSizeF ( fontSize ) ;
this - > text = text ;
this - > f = f ;
if ( pd ) {
ldpiX = pd - > logicalDpiX ( ) ;
ldpiY = pd - > logicalDpiY ( ) ;
pdpiX = pd - > physicalDpiX ( ) ;
pdpiY = pd - > physicalDpiY ( ) ;
} else {
ldpiX = 0 ;
ldpiY = 0 ;
pdpiX = 0 ;
pdpiY = 0 ;
}
}
2019-01-20 17:49:29 +08:00
bool JKQTBasePlotter : : textSizeKey : : operator = = ( const JKQTBasePlotter : : textSizeKey & other ) const
2015-07-11 18:56:02 +08:00
{
return ldpiX = = other . ldpiX & & ldpiY = = other . ldpiY & & text = = other . text & & f = = other . f ;
}
2019-01-20 17:49:29 +08:00
JKQTBasePlotter : : textSizeData : : textSizeData ( )
2015-07-11 18:56:02 +08:00
{
ascent = 0 ;
descent = 0 ;
width = 0 ;
strikeoutPos = 0 ;
}
2019-01-26 03:16:04 +08:00
bool JKQTPPaintDeviceAdapter : : useLatexParser ( ) const
2015-07-11 18:56:02 +08:00
{
return true ;
}
2019-01-26 03:16:04 +08:00
QPaintDevice * JKQTPPaintDeviceAdapter : : createPaintdeviceMM ( const QString & filename , double widthMM , double heightMM ) const
2015-07-11 18:56:02 +08:00
{
return createPaintdevice ( filename , widthMM / 25.4 * QApplication : : desktop ( ) - > logicalDpiX ( ) , heightMM / 25.4 * QApplication : : desktop ( ) - > logicalDpiY ( ) ) ;
}
2019-01-09 04:00:25 +08:00
2019-01-26 19:28:44 +08:00
JKQTPSaveDataAdapter : : ~ JKQTPSaveDataAdapter ( ) = default ;
2019-02-08 00:24:46 +08:00
JKQTBasePlotter : : JKQTPPen : : JKQTPPen ( ) :
m_color ( QColor ( " red " ) ) ,
m_fillColor ( QColor ( " red " ) . lighter ( ) ) ,
2019-04-22 19:27:50 +08:00
m_symbolFillColor ( QColor ( " red " ) . lighter ( ) ) ,
2019-02-08 00:24:46 +08:00
m_errorColor ( m_color . darker ( ) ) ,
m_errorFillColor ( m_color . lighter ( ) ) ,
m_width ( 2 ) ,
m_errorWidth ( 2 ) ,
m_symbolLineWidth ( 1 ) ,
m_style ( Qt : : SolidLine ) ,
m_symbolSize ( 12 ) ,
m_fillStyle ( Qt : : SolidPattern ) ,
m_errorFillStyle ( Qt : : SolidPattern ) ,
m_symbol ( JKQTPCross )
{
}
void JKQTBasePlotter : : JKQTPPen : : setSymbolSize ( double w )
{
m_symbolSize = w ;
}
void JKQTBasePlotter : : JKQTPPen : : setSymbolLineWidthF ( double w )
{
m_symbolLineWidth = w ;
}
void JKQTBasePlotter : : JKQTPPen : : setWidthF ( double w ) {
m_width = w ;
}
void JKQTBasePlotter : : JKQTPPen : : setWidth ( double w ) {
m_width = w ;
}
void JKQTBasePlotter : : JKQTPPen : : setErrorWidth ( double w )
{
m_errorWidth = w ;
}
double JKQTBasePlotter : : JKQTPPen : : width ( ) const {
return m_width ;
}
double JKQTBasePlotter : : JKQTPPen : : widthF ( ) const {
return m_width ;
}
double JKQTBasePlotter : : JKQTPPen : : errorWidthF ( ) const {
return m_errorWidth ;
}
double JKQTBasePlotter : : JKQTPPen : : symbolLineWidthF ( ) const
{
return m_symbolLineWidth ;
}
double JKQTBasePlotter : : JKQTPPen : : symbolSize ( ) const
{
return m_symbolSize ;
}
QColor JKQTBasePlotter : : JKQTPPen : : color ( ) const {
return m_color ;
}
2019-04-22 19:27:50 +08:00
QColor JKQTBasePlotter : : JKQTPPen : : symbolFillColor ( ) const {
return m_symbolFillColor ;
}
2019-02-08 00:24:46 +08:00
QColor JKQTBasePlotter : : JKQTPPen : : errorColor ( ) const {
return m_errorColor ;
}
void JKQTBasePlotter : : JKQTPPen : : setColor ( const QColor & col ) {
m_color = col ;
}
Qt : : PenStyle JKQTBasePlotter : : JKQTPPen : : style ( ) const {
return m_style ;
}
Qt : : PenStyle JKQTBasePlotter : : JKQTPPen : : errorStyle ( ) const {
return Qt : : SolidLine ;
}
void JKQTBasePlotter : : JKQTPPen : : setStyle ( Qt : : PenStyle s ) {
m_style = s ;
}
QColor JKQTBasePlotter : : JKQTPPen : : fillColor ( ) const {
return m_fillColor ;
}
QColor JKQTBasePlotter : : JKQTPPen : : errorFillColor ( ) const {
return m_errorFillColor ;
}
void JKQTBasePlotter : : JKQTPPen : : setFillColor ( const QColor & col ) {
m_fillColor = col ;
}
void JKQTBasePlotter : : JKQTPPen : : setErrorFillColor ( const QColor & col )
{
m_errorFillColor = col ;
}
void JKQTBasePlotter : : JKQTPPen : : setErrorColor ( const QColor & col )
{
m_errorColor = col ;
}
void JKQTBasePlotter : : JKQTPPen : : setFillStyle ( Qt : : BrushStyle s ) {
m_fillStyle = s ;
}
void JKQTBasePlotter : : JKQTPPen : : setErrorFillStyle ( Qt : : BrushStyle s ) {
m_errorFillStyle = s ;
}
2019-04-22 19:27:50 +08:00
void JKQTBasePlotter : : JKQTPPen : : setSymbolFillColor ( QColor c ) {
m_symbolFillColor = c ;
}
2019-02-08 00:24:46 +08:00
Qt : : BrushStyle JKQTBasePlotter : : JKQTPPen : : fillStyle ( ) const {
return m_fillStyle ;
}
Qt : : BrushStyle JKQTBasePlotter : : JKQTPPen : : errorFillStyle ( ) const
{
return m_errorFillStyle ;
}
JKQTPGraphSymbols JKQTBasePlotter : : JKQTPPen : : symbol ( ) const
{
return m_symbol ;
}
2019-04-22 19:27:50 +08:00
void JKQTBasePlotter : : JKQTPPen : : setSymbolType ( JKQTPGraphSymbols symbol )
2019-02-08 00:24:46 +08:00
{
m_symbol = symbol ;
}