mirror of
https://github.com/jkriege2/JKQtPlotter.git
synced 2024-12-24 09:31:40 +08:00
- removed many compiler warnings
- enabled compiler-warnings in CMake-build - several bugfixes (also to appveyor.yml) - removed some function from JKQTBasePlotter, which were (messy) shortcuts to adding graphs
This commit is contained in:
parent
0399a41ec9
commit
77d799a742
@ -19,6 +19,9 @@ endif()
|
||||
if(NOT DEFINED BUILD_DECORATE_LIBNAMES_WITH_BUILDTYPE)
|
||||
option(BUILD_DECORATE_LIBNAMES_WITH_BUILDTYPE "If set, the build-type is appended to the library name" ON)
|
||||
endif()
|
||||
if(NOT DEFINED BUILD_HIGH_COMPILE_WARNING_LEVEL)
|
||||
option(BUILD_HIGH_COMPILE_WARNING_LEVEL "Set Compiler Warning level to high" OFF)
|
||||
endif()
|
||||
if(NOT DEFINED BUILD_EXAMPLES)
|
||||
option(BUILD_EXAMPLES "Build examples" ON)
|
||||
endif()
|
||||
@ -77,14 +80,9 @@ find_package(Qt5 5.0 REQUIRED Core Gui Widgets PrintSupport Svg Xml OpenGl)
|
||||
|
||||
|
||||
set (CMAKE_CXX_STANDARD 11)
|
||||
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
|
||||
|
||||
if(MSVC)
|
||||
if(BUILD_SHARED_LIBS)
|
||||
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
|
||||
endif()
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
|
||||
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
|
||||
|
||||
add_compile_options(/EHsc)
|
||||
# To enable M_PI, M_E,...
|
||||
add_definitions(/D_USE_MATH_DEFINES)
|
||||
@ -95,6 +93,9 @@ if(MSVC)
|
||||
add_definitions(/D_CRT_NO_VA_START_VALIDATION)
|
||||
else()
|
||||
add_compile_options(-fexceptions)
|
||||
if(BUILD_HIGH_COMPILE_WARNING_LEVEL)
|
||||
add_compile_options(-Wall -Wextra) # -Wimplicit-fallthrough -Wuninitialized -Wmaybe-uninitialized) # -Wmisleading-indentation -Weffc++)
|
||||
endif(BUILD_HIGH_COMPILE_WARNING_LEVEL)
|
||||
endif()
|
||||
|
||||
if(BUILD_INCLUDE_XITS_FONTS)
|
||||
|
@ -33,9 +33,6 @@ jkqtmathtext_simpletest.depends = jkqtmathtextlib
|
||||
jkqtmathtext_test.subdir = examples/jkqtmathtext_test
|
||||
jkqtmathtext_test.depends = jkqtplotterlib
|
||||
|
||||
jkqtplot_test.subdir = examples/jkqtplot_test
|
||||
jkqtplot_test.depends = jkqtplotterlib
|
||||
|
||||
jkqtplotter_simpletest.file = examples/simpletest/jkqtplotter_simpletest.pro
|
||||
jkqtplotter_simpletest.depends = jkqtplotterlib
|
||||
|
||||
|
29
appveyor.yml
29
appveyor.yml
@ -8,9 +8,20 @@ environment:
|
||||
QTVER: 5.11
|
||||
JOMDIR: C:\Qt\Tools\QtCreator\bin
|
||||
MINGWDIR: C:\Qt\Tools\mingw530_32
|
||||
|
||||
VSVER: 0
|
||||
|
||||
matrix:
|
||||
- QTABI: mingw53_32
|
||||
ARCH: x86
|
||||
MAKETOOL: mingw32-make
|
||||
CMAKE_GENERATOR: "MinGW Makefiles"
|
||||
USE_CMAKE: true
|
||||
MSBUILD_FLAGS:
|
||||
- QTABI: mingw53_32
|
||||
ARCH: x86
|
||||
QMAKESPEC: win32-g++
|
||||
MAKETOOL: mingw32-make
|
||||
USE_CMAKE: false
|
||||
- QTABI: msvc2017_64
|
||||
ARCH: x64
|
||||
VSVER: 2017
|
||||
@ -35,17 +46,6 @@ environment:
|
||||
QMAKESPEC: win32-msvc
|
||||
MAKETOOL: jom
|
||||
USE_CMAKE: false
|
||||
- QTABI: mingw53_32
|
||||
ARCH: x86
|
||||
MAKETOOL: mingw32-make
|
||||
CMAKE_GENERATOR: "MinGW Makefiles"
|
||||
USE_CMAKE: true
|
||||
MSBUILD_FLAGS:
|
||||
- QTABI: mingw53_32
|
||||
ARCH: x86
|
||||
QMAKESPEC: win32-g++
|
||||
MAKETOOL: mingw32-make
|
||||
USE_CMAKE: false
|
||||
|
||||
skip_tags: true
|
||||
|
||||
@ -57,6 +57,7 @@ configuration:
|
||||
- release
|
||||
- debug
|
||||
|
||||
|
||||
install:
|
||||
- IF %VSVER% GTR 14 (
|
||||
call "C:\Program Files (x86)\Microsoft Visual Studio\%VSVER%\Community\VC\Auxiliary\Build\vcvarsall.bat" %ARCH%
|
||||
@ -69,6 +70,8 @@ install:
|
||||
)
|
||||
- set PATH=C:\Qt\%QTVER%\%QTABI%\bin;%JOMDIR%;%PATH%
|
||||
- echo "BUILD ID Qt%QTVER%_%QTABI%_%APPVEYOR_BUILD_VERSION%_%CONFIGURATION%"
|
||||
# Rename sh.exe as sh.exe in PATH interferes with MinGW
|
||||
- rename "C:\Program Files\Git\usr\bin\sh.exe" "sh2.exe"
|
||||
|
||||
build_script:
|
||||
# - dir "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include"
|
||||
@ -83,7 +86,7 @@ build_script:
|
||||
cmake --version &&
|
||||
cmake -G "%CMAKE_GENERATOR%" "-DCMAKE_PREFIX_PATH=%QT5%" .. &&
|
||||
echo "Build..." &&
|
||||
cmake --build --config "%CMAKE_CONFIGURATION%" -- %MSBUILD_FLAGS% )
|
||||
cmake --build . --config "%CMAKE_CONFIGURATION%" -- %MSBUILD_FLAGS% )
|
||||
else (
|
||||
echo "Call QMake..." &&
|
||||
qmake.exe -v &&
|
||||
|
@ -12,6 +12,7 @@ The preferred way to build JKQTPlotter is using CMake. The CMake-build is define
|
||||
You can build JKQTPlotter (and also the examples) by:
|
||||
- Either opening the file <a href="https://github.com/jkriege2/JKQtPlotter/blob/master/CMakeLists.txt">CMakeLists.txt</a> in QTCreator (which has CMake integration)
|
||||
- Or by calling something like this from the source directory:
|
||||
|
||||
\code{.sh}
|
||||
$ mkdir build; cd build
|
||||
$ cmake ../
|
||||
|
@ -10,6 +10,7 @@ add_subdirectory(jkqtfastplotter_test)
|
||||
add_subdirectory(jkqtmathtext_simpletest)
|
||||
add_subdirectory(jkqtmathtext_test)
|
||||
|
||||
add_subdirectory(jkqtplot_test)
|
||||
|
||||
add_subdirectory(advplotstyling)
|
||||
add_subdirectory(barchart)
|
||||
|
@ -30,9 +30,9 @@ void ContourPlotAnimator::step() {
|
||||
const double Q4=-1.6e-19; // charge of charged particle 4
|
||||
const double Q4_x0=r2*cos(angle); // x-position of charged particle 4
|
||||
const double Q4_y0=-r2*sin(angle); // y-position of charged particle 4
|
||||
for (size_t iy=0; iy<NY; iy++ ) {
|
||||
for (size_t iy=0; iy<static_cast<size_t>(NY); iy++ ) {
|
||||
x=-w/2.0;
|
||||
for (size_t ix=0; ix<NX; ix++ ) {
|
||||
for (size_t ix=0; ix<static_cast<size_t>(NX); ix++ ) {
|
||||
const double r1=sqrt((x-Q1_x0)*(x-Q1_x0)+(y-Q1_y0)*(y-Q1_y0));
|
||||
const double r2=sqrt((x-Q2_x0)*(x-Q2_x0)+(y-Q2_y0)*(y-Q2_y0));
|
||||
const double r3=sqrt((x-Q3_x0)*(x-Q3_x0)+(y-Q3_y0)*(y-Q3_y0));
|
||||
|
@ -40,8 +40,10 @@ int main(int argc, char* argv[])
|
||||
auto biXCol=datastore->backInserter(XCol);
|
||||
auto biYCol=datastore->backInserter(YCol);
|
||||
for (double x=0; x<4.0*M_PI; x+=4.0*M_PI/50.0) {
|
||||
*++biXCol=x;
|
||||
*++biYCol=cos(x);
|
||||
*biXCol=x;
|
||||
*biYCol=cos(x);
|
||||
++biXCol;
|
||||
++biYCol;
|
||||
}
|
||||
// 2.3 combining with addLinearColumn() you can also use C++ STL algorithms:
|
||||
//size_t XCol=datastore->addLinearColumn(50, 0, 4.0*M_PI, "cos curve: x-data");
|
||||
|
@ -23,7 +23,7 @@ TestMain::TestMain(QWidget *parent) :
|
||||
y3=(double*)calloc(N1, sizeof(double));
|
||||
|
||||
|
||||
QGridLayout* gl=new QGridLayout(this);
|
||||
QGridLayout* gl=new QGridLayout();
|
||||
setLayout(gl);
|
||||
QTabWidget* t=new QTabWidget(this);
|
||||
gl->addWidget(t,0,0);
|
||||
|
38
examples/jkqtplot_test/CMakeLists.txt
Normal file
38
examples/jkqtplot_test/CMakeLists.txt
Normal file
@ -0,0 +1,38 @@
|
||||
cmake_minimum_required(VERSION 3.0)
|
||||
|
||||
set(EXAMPLE_NAME jkqtplot_test)
|
||||
set(EXENAME ${EXAMPLE_NAME})
|
||||
|
||||
message( STATUS ".. Building Example ${EXAMPLE_NAME}" )
|
||||
|
||||
|
||||
# Set up source files
|
||||
set(SOURCES jkqtplot_test.cpp testmain.cpp TestWidgetBarcharts.cpp TestWidgetContourPlots.cpp TestWidgetEmptyPlot.cpp TestWidgetFunctionPlots.cpp TestWidgetGeometry.cpp TestWidgetGraphs.cpp TestWidgetImages.cpp TestWidgetLogGraphs.cpp TestWidgetParamScatterPlots.cpp TestWidgetPeaksPlots.cpp TestWidgetRGBImages.cpp )
|
||||
# EmfEngine/src/EmfEngine.cpp
|
||||
# EmfEngine/src/EmfPaintDevice.cpp
|
||||
# QTeXEngine/src/QTeXPaintDevice.h
|
||||
# QTeXEngine/src/QTeXPaintEngine.h
|
||||
#)
|
||||
set(HEADERS testmain.h TestWidgetBarcharts.h TestWidgetContourPlots.h TestWidgetEmptyPlot.h TestWidgetFunctionPlots.h TestWidgetGeometry.h TestWidgetGraphs.h TestWidgetImages.h TestWidgetLogGraphs.h TestWidgetParamScatterPlots.h TestWidgetPeaksPlots.h TestWidgetRGBImages.h)
|
||||
# jkqtpemfengineadapter.h
|
||||
|
||||
# EmfEngine/src/EmfEngine.h
|
||||
# QTeXEngine/src/QTeXEngine.h
|
||||
#)
|
||||
set(RESOURCES jkqtplot_test.qrc )
|
||||
set(UIS )
|
||||
|
||||
add_executable(${EXENAME} WIN32 ${SOURCES} ${HEADERS} ${RESOURCES} ${UIS})
|
||||
target_include_directories(${EXENAME} PRIVATE ../../lib)
|
||||
if(BUILD_STATIC_LIBS)
|
||||
target_link_libraries(${EXENAME} JKQTPlotterLib${LIBNAME_ADDITION})
|
||||
elseif(BUILD_SHARED_LIBS)
|
||||
target_link_libraries(${EXENAME} JKQTPlotterSharedLib${LIBNAME_ADDITION})
|
||||
endif()
|
||||
|
||||
|
||||
|
||||
# Installation
|
||||
if(LIB_INSTALL)
|
||||
install(TARGETS ${EXENAME} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||
endif(LIB_INSTALL)
|
@ -14,7 +14,7 @@ TestWidgetBarcharts::TestWidgetBarcharts(QWidget *parent) :
|
||||
{
|
||||
|
||||
|
||||
QVBoxLayout* barchartLayout=new QVBoxLayout(this);
|
||||
QVBoxLayout* barchartLayout=new QVBoxLayout();
|
||||
setLayout(barchartLayout);
|
||||
resize(1000, 800);
|
||||
plotBarchart=new JKQTPlotter(true, this);
|
||||
|
@ -14,7 +14,7 @@ TestWidgetContourPlots::TestWidgetContourPlots(QWidget *parent) :
|
||||
|
||||
|
||||
// contour plot
|
||||
QHBoxLayout* layoutContour=new QHBoxLayout(this);
|
||||
QHBoxLayout* layoutContour=new QHBoxLayout();
|
||||
setLayout(layoutContour);
|
||||
JKQTPlotter* plotContour=new JKQTPlotter(true, this);
|
||||
plotContour->setPlotUpdateEnabled(false);
|
||||
|
@ -14,7 +14,7 @@ TestWidgetFunctionPlots::TestWidgetFunctionPlots(QWidget *parent) :
|
||||
{
|
||||
|
||||
|
||||
QVBoxLayout* plotFuncLayout=new QVBoxLayout(this);
|
||||
QVBoxLayout* plotFuncLayout=new QVBoxLayout();
|
||||
setLayout(plotFuncLayout);
|
||||
plotFuncPlt=new JKQTPlotter(true, this);
|
||||
plotFuncLayout->addWidget(plotFuncPlt);
|
||||
|
@ -12,7 +12,7 @@ TestWidgetGeometry::TestWidgetGeometry(QWidget *parent) :
|
||||
QWidget(parent)
|
||||
{
|
||||
// create third plotter with output of a geometric drawing
|
||||
QVBoxLayout* layout1=new QVBoxLayout(this);
|
||||
QVBoxLayout* layout1=new QVBoxLayout();
|
||||
setLayout(layout1);
|
||||
resize(1000, 800);
|
||||
JKQTPlotter* plotGeo=new JKQTPlotter(true, this);
|
||||
@ -36,16 +36,16 @@ TestWidgetGeometry::TestWidgetGeometry(QWidget *parent) :
|
||||
//plotGeo->getPlotter()->addGraph(line2);
|
||||
|
||||
JKQTPGeoRectangle* rect1=new JKQTPGeoRectangle(plotGeo->getPlotter(), 1,1,2,2, QColor("blue"),2, Qt::SolidLine, QColor("lightblue"));
|
||||
rect1->setAngle(30);
|
||||
rect1->setAngle(30);
|
||||
//plotGeo->getPlotter()->addGraph(rect1);
|
||||
JKQTPGeoRectangle* rect2=new JKQTPGeoRectangle(plotGeo->getPlotter(), 1,1,2,2, QColor("red"),2);
|
||||
rect2->setAngle(45);
|
||||
rect2->setAngle(45);
|
||||
//plotGeo->getPlotter()->addGraph(rect2);
|
||||
JKQTPGeoRectangle* rect3=new JKQTPGeoRectangle(plotGeo->getPlotter(), 1,1,2,4, QColor("green"),2);
|
||||
rect3->setAngle(-30);
|
||||
rect3->setAngle(-30);
|
||||
//plotGeo->getPlotter()->addGraph(rect3);
|
||||
JKQTPGeoEllipse* ell3=new JKQTPGeoEllipse(plotGeo->getPlotter(), 1,1,2,4, QColor("green"),2, Qt::SolidLine, QColor("lightgreen"), Qt::CrossPattern);
|
||||
ell3->setAngle(-30);
|
||||
ell3->setAngle(-30);
|
||||
//plotGeo->getPlotter()->addGraph(ell3);
|
||||
|
||||
QVector<QPointF> p;
|
||||
@ -57,7 +57,7 @@ TestWidgetGeometry::TestWidgetGeometry(QWidget *parent) :
|
||||
|
||||
// JKQTPGeoPolygon* poly=new JKQTPGeoPolygon(plotGeo->getPlotter(), p, QColor("black"), 1.5, Qt::SolidLine, QColor(128,128,0,128));
|
||||
//plotGeo->getPlotter()->addGraph(poly);
|
||||
// JKQTPGeoPolyLines* lines=new JKQTPGeoPolyLines(plotGeo->getPlotter(), p, QColor(255,255,0), 3);
|
||||
// JKQTPGeoPolyLines* lines=new JKQTPGeoPolyLines(plotGeo->getPlotter(), p, QColor(255,255,0), 3);
|
||||
//plotGeo->getPlotter()->addGraph(lines);
|
||||
|
||||
JKQTPGeoEllipse* ell1=new JKQTPGeoEllipse(plotGeo->getPlotter(), 0,0,2,4, QColor("black"),1.5, Qt::DotLine);
|
||||
|
@ -4,6 +4,7 @@
|
||||
#include <QDateTime>
|
||||
#include <QApplication>
|
||||
#include "jkqtplotter/graphs/jkqtpscatter.h"
|
||||
#include "jkqtplotter/graphs/jkqtpbarchart.h"
|
||||
#include "jkqtplotter/graphs/jkqtpboxplot.h"
|
||||
#include "jkqtplotter/graphs/jkqtpfilledcurve.h"
|
||||
#include "jkqtplotter/gui/jkqtpcomboboxes.h"
|
||||
@ -36,8 +37,8 @@ TestWidgetGraphs::TestWidgetGraphs(QWidget *parent) :
|
||||
QListView* listPlots=new QListView(this);
|
||||
listPlots->setModel(plot->getPlotter()->getPlotsModel());
|
||||
listPlots->setMaximumWidth(256);
|
||||
QVBoxLayout* layout=new QVBoxLayout(this);
|
||||
QGridLayout* layout_grid=new QGridLayout(this);
|
||||
QVBoxLayout* layout=new QVBoxLayout();
|
||||
QGridLayout* layout_grid=new QGridLayout();
|
||||
layout_grid->addWidget(plot,0,0,1,1);
|
||||
layout_grid->addWidget(plotBot,1,0,1,1);
|
||||
layout_grid->addWidget(listPlots,0,1,1,1);
|
||||
@ -47,7 +48,7 @@ TestWidgetGraphs::TestWidgetGraphs(QWidget *parent) :
|
||||
setLayout(layout);
|
||||
resize(1000, 800);
|
||||
|
||||
plotBot->synchronizeToMaster(plot, JKQTBasePlotter::sdXAxis, true, true, true);
|
||||
plotBot->synchronizeXToMaster(plot);
|
||||
plot->getPlotter()->setGridPrinting(true);
|
||||
plot->getPlotter()->addGridPrintingPlotter(0,1,plotBot->getPlotter());
|
||||
plot->getPlotter()->addGridPrintingPlotter(0,2,plotBot2->getPlotter());
|
||||
@ -103,16 +104,30 @@ TestWidgetGraphs::TestWidgetGraphs(QWidget *parent) :
|
||||
size_t cy21re=ds->addColumn(y21re, N2, "y21re");
|
||||
|
||||
|
||||
size_t id=plot->getPlotter()->addGraph(cx2, cy21, "$5\\cdot\\sin(x)$", JKQTPFilledCurveX);
|
||||
JKQTPFilledCurveXGraph* fcxgr=qobject_cast<JKQTPFilledCurveXGraph*>(plot->getPlotter()->getGraph(id));
|
||||
JKQTPFilledCurveXGraph* fcxgr;
|
||||
size_t id=plot->getPlotter()->addGraph(fcxgr=new JKQTPFilledCurveXGraph(plot));
|
||||
fcxgr->setXColumn(cx2);
|
||||
fcxgr->setYColumn(cy21);
|
||||
fcxgr->setTitle("$5\\cdot\\sin(x)$");
|
||||
qobject_cast<JKQTPFilledCurveXGraph*>(plot->getPlotter()->getGraph(id));
|
||||
if (fcxgr) {
|
||||
fcxgr->setBaseline(2);
|
||||
}
|
||||
|
||||
size_t yeb=plot->getPlotter()->addGraphWithXYError(cx2, cy21, cy22, cy22, "sine with errors", JKQTPFilledCurveX);
|
||||
JKQTPFilledCurveXErrorGraph* gELines;
|
||||
size_t yeb=plot->getPlotter()->addGraph(gELines=new JKQTPFilledCurveXErrorGraph(plot));
|
||||
gELines->setXColumn(cx2);
|
||||
gELines->setYErrorColumnLower(cy22);
|
||||
gELines->setYColumn(cy22);
|
||||
gELines->setYErrorColumn(cy21);
|
||||
gELines->setTitle("sine with errors");
|
||||
plteErrors=plot->getPlotter()->getGraph(yeb);
|
||||
setErrorLineStyle(0);
|
||||
yeb=plot->getPlotter()->addGraph(cx2, cy21, "$5\\cdot\\sin(x)$", JKQTPLinesPoints);
|
||||
JKQTPXYLineGraph* gLines;
|
||||
yeb=plot->getPlotter()->addGraph(gLines=new JKQTPXYLineGraph(plot));
|
||||
gLines->setXColumn(cx2);
|
||||
gLines->setYColumn(cy21);
|
||||
gLines->setTitle("$5\\cdot\\sin(x)$");
|
||||
plteSymbols=plot->getPlotter()->getGraph(yeb);
|
||||
|
||||
pltePlot2=new JKQTPXYLineErrorGraph(plotBot->getPlotter());
|
||||
@ -120,7 +135,7 @@ TestWidgetGraphs::TestWidgetGraphs(QWidget *parent) :
|
||||
pltePlot2->setYColumn(cy21r);
|
||||
pltePlot2->setTitle(tr("random numbers"));
|
||||
pltePlot2->setDrawLine(true);
|
||||
pltePlot2->setYErrorColumn(cy21re);
|
||||
pltePlot2->setYErrorColumn(static_cast<int>(cy21re));
|
||||
pltePlot2->setYErrorStyle(JKQTPErrorBarsPolygons);
|
||||
pltePlot2->setSymbolType(JKQTPFilledStar);
|
||||
plotBot->getPlotter()->addGraph(pltePlot2);
|
||||
@ -161,7 +176,33 @@ TestWidgetGraphs::TestWidgetGraphs(QWidget *parent) :
|
||||
cb.push_back(ds->addColumn(b3, N3, "b3"));
|
||||
QStringList ts;
|
||||
ts<<"bars 1"<<"bars 2"<<"bars 3";
|
||||
plot->getPlotter()->addVerticalBargraph(cb, cbp, ts);
|
||||
JKQTPBarVerticalGraph* gbar1;
|
||||
JKQTPBarVerticalGraph* gbar2;
|
||||
JKQTPBarVerticalGraph* gbar3;
|
||||
double w=0.9;
|
||||
double width=w/static_cast<double>(3);
|
||||
double s=-1.0*w/2.0+width/2.0;
|
||||
plot->getPlotter()->addGraph(gbar1=new JKQTPBarVerticalGraph(plot));
|
||||
gbar1->setXColumn(cbp);
|
||||
gbar1->setYColumn(cb[0]);
|
||||
gbar1->setTitle(ts[0]);
|
||||
gbar1->setShift(s);
|
||||
gbar1->setWidth(width);
|
||||
s=s+width;
|
||||
plot->getPlotter()->addGraph(gbar2=new JKQTPBarVerticalGraph(plot));
|
||||
gbar2->setXColumn(cbp);
|
||||
gbar2->setYColumn(cb[1]);
|
||||
gbar2->setTitle(ts[1]);
|
||||
gbar2->setShift(s);
|
||||
gbar2->setWidth(width);
|
||||
s=s+width;
|
||||
plot->getPlotter()->addGraph(gbar3=new JKQTPBarVerticalGraph(plot));
|
||||
gbar3->setXColumn(cbp);
|
||||
gbar3->setYColumn(cb[2]);
|
||||
gbar3->setTitle(ts[2]);
|
||||
gbar3->setShift(s);
|
||||
gbar3->setWidth(width);
|
||||
s=s+width;
|
||||
|
||||
JKQTPVerticalRange* r1=new JKQTPVerticalRange(plot->getPlotter());
|
||||
r1->setRangeMin(5);
|
||||
|
@ -30,7 +30,7 @@ class TestWidgetGraphs : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit TestWidgetGraphs(QWidget *parent = 0);
|
||||
explicit TestWidgetGraphs(QWidget *parent = nullptr);
|
||||
|
||||
signals:
|
||||
|
||||
@ -47,8 +47,8 @@ class TestWidgetGraphs : public QWidget
|
||||
void setKeyPos2(JKQTPKeyPosition layout);
|
||||
|
||||
protected:
|
||||
double x1[N1], x2[N2], x2r[N2]/*, x3[N3]*/;
|
||||
double y11[N1], y12[N1], y13[N1], y21[N2], y21r[N2], y21re[N2], y22[N2], y23[N2], y24[N2];
|
||||
double x1[N1], x2[N2], x2r[N1]/*, x3[N3]*/;
|
||||
double y11[N1], y12[N1], y13[N1], y21[N1], y21r[N1], y21re[N1], y22[N1], y23[N1], y24[N1];
|
||||
double xbox[N3], ymed[N3], ymean[N3], ymin[N3], ymax[N3], yp25[N3], yp75[N3];
|
||||
double b1[N3], b2[N3], b3[N3];
|
||||
|
||||
|
@ -17,7 +17,7 @@ TestWidgetImages::TestWidgetImages(QWidget *parent) :
|
||||
QWidget(parent)
|
||||
{
|
||||
|
||||
QVBoxLayout* layouti=new QVBoxLayout(this);
|
||||
QVBoxLayout* layouti=new QVBoxLayout();
|
||||
QFormLayout* layWid=new QFormLayout;
|
||||
layouti->addLayout(layWid);
|
||||
setLayout(layouti);
|
||||
|
@ -38,7 +38,11 @@ TestWidgetLogGraphs::TestWidgetLogGraphs(QWidget *parent) :
|
||||
resize(1000, 800);
|
||||
|
||||
|
||||
plotLOG->getPlotter()->addGraph(cx2, cy23, "data, $f(x)=5^{x/5}$", JKQTPLines);
|
||||
JKQTPXYLineGraph* gLines;
|
||||
plotLOG->getPlotter()->addGraph(gLines=new JKQTPXYLineGraph(plotLOG));
|
||||
gLines->setXColumn(cx2);
|
||||
gLines->setYColumn(cy23);
|
||||
gLines->setTitle("data, $f(x)=5^{x/5}$");
|
||||
|
||||
|
||||
plotLOG->setPlotUpdateEnabled(true);
|
||||
|
@ -13,7 +13,7 @@ TestWidgetParamScatterPlots::TestWidgetParamScatterPlots(QWidget *parent) :
|
||||
QWidget(parent)
|
||||
{
|
||||
|
||||
QVBoxLayout* layoutPSP=new QVBoxLayout(this);
|
||||
QVBoxLayout* layoutPSP=new QVBoxLayout();
|
||||
|
||||
setLayout(layoutPSP);
|
||||
resize(1000, 800);
|
||||
|
@ -15,7 +15,7 @@ TestWidgetPeaksPlots::TestWidgetPeaksPlots(QWidget *parent) :
|
||||
{
|
||||
|
||||
|
||||
QVBoxLayout* layoutpeaks=new QVBoxLayout(this);
|
||||
QVBoxLayout* layoutpeaks=new QVBoxLayout();
|
||||
setLayout(layoutpeaks);
|
||||
resize(1000, 800);
|
||||
plotPeaks=new JKQTPlotter(true, this);
|
||||
|
@ -12,11 +12,10 @@
|
||||
TestWidgetRGBImages::TestWidgetRGBImages(QWidget *parent) :
|
||||
QWidget(parent)
|
||||
{
|
||||
|
||||
// plotter for images
|
||||
QWidget* winrgb=new QWidget(this);
|
||||
QVBoxLayout* layoutrgb=new QVBoxLayout(this);
|
||||
QFormLayout* frm=new QFormLayout(nullptr);
|
||||
QVBoxLayout* layoutrgb=new QVBoxLayout();
|
||||
QFormLayout* frm=new QFormLayout();
|
||||
winrgb->setLayout(layoutrgb);
|
||||
winrgb->resize(1000, 800);
|
||||
plotImgRGB=new JKQTPlotter(true, winrgb);
|
||||
|
@ -14,7 +14,7 @@
|
||||
#include <cmath>
|
||||
|
||||
template <class TGraph, JKQTPSingleColumnSymbolsGraph::DataDirection DataOrientation>
|
||||
void showPlot() {
|
||||
JKQTPlotter* showPlot() {
|
||||
|
||||
// 1. create a plotter window and get a pointer to the internal datastore (for convenience)
|
||||
JKQTPlotter* plot=new JKQTPlotter();
|
||||
@ -157,6 +157,8 @@ void showPlot() {
|
||||
// show plotter and make it a decent size
|
||||
plot->show();
|
||||
plot->resize(800,600);
|
||||
|
||||
return plot;
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
|
@ -30,12 +30,11 @@ Copyright (c) 2008-2019 Jan W. Krieger (<jan@jkrieger.de>)
|
||||
|
||||
int JKQTPAutoOutputTimer::global_indent=0;
|
||||
|
||||
JKQTPAutoOutputTimer::JKQTPAutoOutputTimer(const QString& message) :
|
||||
QElapsedTimer()
|
||||
JKQTPAutoOutputTimer::JKQTPAutoOutputTimer(const QString& _message) :
|
||||
QElapsedTimer(),message(_message),indent()
|
||||
{
|
||||
this->indent=QString(global_indent, QLatin1Char(' '));
|
||||
global_indent+=4;
|
||||
this->message=message;
|
||||
#if QT_VERSION >= 0x040800
|
||||
qDebug()<<this->indent<<"TIMER_START: "<<message;
|
||||
#else
|
||||
|
@ -38,9 +38,6 @@ JKQTPEnhancedPainter::JKQTPEnhancedPainter():
|
||||
initQEnhacedPainter();
|
||||
}
|
||||
|
||||
JKQTPEnhancedPainter::~JKQTPEnhancedPainter()
|
||||
= default;
|
||||
|
||||
//void JKQTPEnhancedPainter::drawLines(const QLineF *lines, int lineCount)
|
||||
//{
|
||||
|
||||
|
@ -35,7 +35,6 @@ class JKQTP_LIB_EXPORT JKQTPEnhancedPainter : public QPainter {
|
||||
public:
|
||||
JKQTPEnhancedPainter(QPaintDevice* device);
|
||||
JKQTPEnhancedPainter();
|
||||
virtual ~JKQTPEnhancedPainter() ;
|
||||
|
||||
|
||||
//void drawPath(const QPainterPath &path);
|
||||
@ -130,7 +129,7 @@ class JKQTP_LIB_EXPORT JKQTPEnhancedPainter : public QPainter {
|
||||
// }
|
||||
|
||||
protected:
|
||||
virtual void initQEnhacedPainter();
|
||||
void initQEnhacedPainter();
|
||||
private:
|
||||
|
||||
};
|
||||
|
@ -28,7 +28,7 @@
|
||||
#include "jkqtphighrestimer.h" // class's header file
|
||||
|
||||
|
||||
JKQTPHighResTimer::JKQTPHighResTimer() {
|
||||
JKQTPHighResTimer::JKQTPHighResTimer(): last(), freq(0) {
|
||||
start();
|
||||
}
|
||||
|
||||
|
@ -235,6 +235,20 @@ inline bool jkqtp_approximatelyEqual(double a, double b, double epsilon=2.0*JKQT
|
||||
return fabs(a - b) <= epsilon;
|
||||
}
|
||||
|
||||
/** \brief compare two floats \a a and \a b for uneuqality, where any difference smaller than \a epsilon is seen as equality
|
||||
* \ingroup jkqtptools_math_basic */
|
||||
inline bool jkqtp_approximatelyUnequal(float a, float b, float epsilon=2.0f*JKQTP_FLOAT_EPSILON)
|
||||
{
|
||||
return fabsf(a - b) > epsilon;
|
||||
}
|
||||
|
||||
/** \brief compare two doubles \a a and \a b for uneuqality, where any difference smaller than \a epsilon is seen as equality
|
||||
* \ingroup jkqtptools_math_basic */
|
||||
inline bool jkqtp_approximatelyUnequal(double a, double b, double epsilon=2.0*JKQTP_DOUBLE_EPSILON)
|
||||
{
|
||||
return fabs(a - b) > epsilon;
|
||||
}
|
||||
|
||||
/** \brief returns the given value \a v (i.e. identity function)
|
||||
* \ingroup jkqtptools_math_basic */
|
||||
template<typename T>
|
||||
|
@ -405,7 +405,8 @@ inline void jkqtpstatCumSum(InputIt first, InputIt last, OutputIt output) {
|
||||
if (JKQTPIsOKFloat(v)) {
|
||||
sum=sum+v;
|
||||
}
|
||||
*++output=sum;
|
||||
*output=sum;
|
||||
++output;
|
||||
}
|
||||
}
|
||||
|
||||
@ -430,7 +431,8 @@ inline size_t jkqtpstatFilterGoodFloat(InputIt first, InputIt last, OutputIt out
|
||||
for (auto it=first; it!=last; ++it) {
|
||||
const double v=jkqtp_todouble(*it);
|
||||
if (JKQTPIsOKFloat(v)) {
|
||||
*++output=v;
|
||||
*output=v;
|
||||
++output;
|
||||
NN++;
|
||||
}
|
||||
}
|
||||
@ -913,7 +915,8 @@ inline void jkqtpstat5NumberStatisticsAndOutliersOfSortedVector(const TVector& d
|
||||
if (maximum) *maximum=qmax;
|
||||
for (auto it=data.begin(); it!=data.end(); ++it) {
|
||||
if (*it<qmin || *it>qmax) {
|
||||
*++outliersout=*it;
|
||||
*outliersout=*it;
|
||||
++outliersout;
|
||||
}
|
||||
}
|
||||
if (median) {
|
||||
|
@ -108,10 +108,12 @@ inline void jkqtpstatHistogram1DAutoranged(InputIt first, InputIt last, OutputIt
|
||||
}
|
||||
double h=0;
|
||||
for (size_t i=0; i<histX.size(); i++) {
|
||||
*++histogramXOut=histX[i]+xoffset;
|
||||
*histogramXOut=histX[i]+xoffset;
|
||||
if (cummulative) h+=(histY[i]/NNorm);
|
||||
else h=histY[i]/NNorm;
|
||||
*++histogramYOut=h;
|
||||
*histogramYOut=h;
|
||||
++histogramXOut;
|
||||
++histogramYOut;
|
||||
}
|
||||
}
|
||||
|
||||
@ -171,11 +173,12 @@ inline void jkqtpstatHistogram1DAutoranged(InputIt first, InputIt last, OutputIt
|
||||
}
|
||||
double h=0;
|
||||
for (size_t i=0; i<histX.size(); i++) {
|
||||
*++histogramXOut=histX[i]+xoffset;
|
||||
*histogramXOut=histX[i]+xoffset;
|
||||
if (cummulative) h+=(histY[i]/NNorm);
|
||||
else h=histY[i]/NNorm;
|
||||
*++histogramYOut=h;
|
||||
}
|
||||
*histogramYOut=h;
|
||||
++histogramXOut;
|
||||
++histogramYOut; }
|
||||
}
|
||||
|
||||
|
||||
@ -243,11 +246,12 @@ inline void jkqtpstatHistogram1D(InputIt first, InputIt last, BinsInputIt binsFi
|
||||
if (binXMode==JKQTPStatHistogramBinXMode::XIsMid) xoffset=binw/2.0;
|
||||
}
|
||||
|
||||
*++histogramXOut=histX[i]+xoffset;
|
||||
*histogramXOut=histX[i]+xoffset;
|
||||
if (cummulative) h+=(histY[i]/NNorm);
|
||||
else h=histY[i]/NNorm;
|
||||
*++histogramYOut=h;
|
||||
}
|
||||
*histogramYOut=h;
|
||||
++histogramXOut;
|
||||
++histogramYOut; }
|
||||
}
|
||||
|
||||
|
||||
|
@ -253,10 +253,12 @@ inline void jkqtpstatKDE1DAutoranged(InputIt first, InputIt last, OutputIt KDEXO
|
||||
// output the KDE
|
||||
double h=0;
|
||||
for (size_t i=0; i<histX.size(); i++) {
|
||||
*++KDEXOut=histX[i];
|
||||
*KDEXOut=histX[i];
|
||||
if (cummulative) h+=histY[i];
|
||||
else h=histY[i];
|
||||
*++KDEYOut=h;
|
||||
*KDEYOut=h;
|
||||
++KDEXOut;
|
||||
++KDEYOut;
|
||||
}
|
||||
}
|
||||
|
||||
@ -307,10 +309,12 @@ inline void jkqtpstatKDE1DAutoranged(InputIt first, InputIt last, OutputIt KDEXO
|
||||
// output the KDE
|
||||
double h=0;
|
||||
for (size_t i=0; i<histX.size(); i++) {
|
||||
*++KDEXOut=histX[i];
|
||||
*KDEXOut=histX[i];
|
||||
if (cummulative) h+=histY[i];
|
||||
else h=histY[i];
|
||||
*++KDEYOut=h;
|
||||
*KDEYOut=h;
|
||||
++KDEXOut;
|
||||
++KDEYOut;
|
||||
}
|
||||
|
||||
}
|
||||
@ -360,10 +364,12 @@ inline void jkqtpstatKDE1D(InputIt first, InputIt last, BinsInputIt binsFirst, B
|
||||
// output the KDE
|
||||
double h=0;
|
||||
for (size_t i=0; i<histX.size(); i++) {
|
||||
*++KDEXOut=histX[i];
|
||||
*KDEXOut=histX[i];
|
||||
if (cummulative) h+=histY[i];
|
||||
else h=histY[i];
|
||||
*++KDEYOut=h;
|
||||
*KDEYOut=h;
|
||||
++KDEXOut;
|
||||
++KDEYOut;
|
||||
}
|
||||
|
||||
}
|
||||
@ -409,10 +415,12 @@ inline void jkqtpstatKDE1D(InputIt first, InputIt last, double binXLeft, double
|
||||
// output the KDE
|
||||
double h=0;
|
||||
for (size_t i=0; i<histX.size(); i++) {
|
||||
*++KDEXOut=histX[i];
|
||||
*KDEXOut=histX[i];
|
||||
if (cummulative) h+=histY[i];
|
||||
else h=histY[i];
|
||||
*++KDEYOut=h;
|
||||
*KDEYOut=h;
|
||||
++KDEXOut;
|
||||
++KDEYOut;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -145,7 +145,8 @@ inline void jkqtpstatPolyFit(InputItX firstX, InputItX lastX, InputItY firstY, I
|
||||
if (ok) {
|
||||
auto itR=firstRes;
|
||||
for (size_t p=0; p<P+1; p++) {
|
||||
*++itR=VTY[p];
|
||||
*itR=VTY[p];
|
||||
++itR;
|
||||
}
|
||||
} else {
|
||||
throw std::runtime_error("jkqtplinalgLinSolve() didn't return a result!");
|
||||
|
@ -272,6 +272,7 @@ QString jkqtp_QPenStyle2String(Qt::PenStyle style) {
|
||||
case Qt::DotLine: return "dot";
|
||||
case Qt::DashDotLine: return "dashdot";
|
||||
case Qt::DashDotDotLine: return "dashdotdot";
|
||||
case Qt::NoPen: return "none";
|
||||
default:
|
||||
case Qt::SolidLine: return "solid";
|
||||
}
|
||||
@ -284,6 +285,7 @@ Qt::PenStyle jkqtp_String2QPenStyle(const QString& style) {
|
||||
if (s=="dashdot" || s=="-.") return Qt::DashDotLine;
|
||||
if (s=="dashdotdot" || s=="-..") return Qt::DashDotDotLine;
|
||||
if (s=="solid" || s=="-") return Qt::SolidLine;
|
||||
if (s=="none" || s=="" || s=="n") return Qt::NoPen;
|
||||
return Qt::SolidLine;
|
||||
}
|
||||
|
||||
|
@ -297,7 +297,7 @@ void JKQTPContourPlot::calcContourLines(QList<QVector<QLineF> > &ContourLines)
|
||||
#ifdef JKQTBP_AUTOTIMER
|
||||
JKQTPAutoOutputTimer jkaat(QString("JKQTPContourPlot::calcContourLines()"));
|
||||
#else
|
||||
qDebug()<<"JKQTPContourPlot::calcContourLines()";
|
||||
//qDebug()<<"JKQTPContourPlot::calcContourLines()";
|
||||
#endif
|
||||
|
||||
double scale=1; ///< scale of the contour levels;
|
||||
|
@ -217,7 +217,7 @@ class JKQTP_LIB_EXPORT JKQTPContourPlot: public JKQTPMathImage, public JKQTPGrap
|
||||
* @param level contour plane
|
||||
* @return above (1), on the plane (0), below (-1);
|
||||
*/
|
||||
inline int compare2level(const QVector3D &vertex, double level) const ;
|
||||
inline int compare2level(const QVector3D &vertex, float level) const ;
|
||||
/** \brief calcContourLines calculates the contour lines using the CONREC algorithm */
|
||||
void calcContourLines(QList<QVector<QLineF > > &ContourLines);
|
||||
/** \brief For Caching: the contour lines as vector of single lines (one for each triangle). the list index refers to the contour level.
|
||||
@ -445,12 +445,14 @@ QPointF JKQTPContourPlot::interpolatePoint(const QVector3D &point1, const QVecto
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
int JKQTPContourPlot::compare2level(const QVector3D &vertex, double level) const {
|
||||
if (vertex.z() > level)
|
||||
int JKQTPContourPlot::compare2level(const QVector3D &vertex, float level) const {
|
||||
if (vertex.z() > level) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (vertex.z() < level)
|
||||
if (vertex.z() < level) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -41,6 +41,7 @@ JKQTPSingleColumnSymbolsGraph::JKQTPSingleColumnSymbolsGraph(JKQTBasePlotter *pa
|
||||
parentPlotStyle=-1;
|
||||
dataDirection=DataDirection::Y;
|
||||
position=0;
|
||||
width=1;
|
||||
|
||||
initSymbolStyle(parent, parentPlotStyle);
|
||||
}
|
||||
@ -56,8 +57,11 @@ JKQTPSingleColumnSymbolsGraph::JKQTPSingleColumnSymbolsGraph(JKQTPlotter *parent
|
||||
|
||||
bool JKQTPSingleColumnSymbolsGraph::getXMinMax(double &minx, double &maxx, double &smallestGreaterZero)
|
||||
{
|
||||
//std::cout<<"JKQTPSingleColumnSymbolsGraph::getXMinMax(minx="<<minx<<", maxx="<<maxx<<", smallestGreaterZero="<<smallestGreaterZero<<")\n";
|
||||
if (dataDirection==DataDirection::X) {
|
||||
return getDataMinMax(dataColumn, minx, maxx, smallestGreaterZero);
|
||||
bool res= getDataMinMax(dataColumn, minx, maxx, smallestGreaterZero);
|
||||
//std::cout<<"JKQTPSingleColumnSymbolsGraph::getXMinMax(minx="<<minx<<", maxx="<<maxx<<", smallestGreaterZero="<<smallestGreaterZero<<"): dataDirection==DataDirection::X -->"<<std::boolalpha<<res<<"\n";
|
||||
return res;
|
||||
} else {
|
||||
minx=position;
|
||||
maxx=position;
|
||||
@ -65,6 +69,7 @@ bool JKQTPSingleColumnSymbolsGraph::getXMinMax(double &minx, double &maxx, doubl
|
||||
minx=position-width/2;
|
||||
maxx=position+width/2;
|
||||
}
|
||||
///std::cout<<"JKQTPSingleColumnSymbolsGraph::getXMinMax(minx="<<minx<<", maxx="<<maxx<<", smallestGreaterZero="<<smallestGreaterZero<<"): dataDirection!=DataDirection::X -->"<<std::boolalpha<<true<<"\n";
|
||||
return true;
|
||||
//smallestGreaterZero=qMax(double(0.0), qMin(baseline, baseline+peakHeight));
|
||||
}
|
||||
@ -72,8 +77,11 @@ bool JKQTPSingleColumnSymbolsGraph::getXMinMax(double &minx, double &maxx, doubl
|
||||
|
||||
bool JKQTPSingleColumnSymbolsGraph::getYMinMax(double &miny, double &maxy, double &smallestGreaterZero)
|
||||
{
|
||||
//std::cout<<"JKQTPSingleColumnSymbolsGraph::getYMinMax(miny="<<miny<<", maxy="<<maxy<<", smallestGreaterZero="<<smallestGreaterZero<<")\n";
|
||||
if (dataDirection==DataDirection::Y) {
|
||||
return getDataMinMax(dataColumn, miny, maxy, smallestGreaterZero);
|
||||
bool res= getDataMinMax(dataColumn, miny, maxy, smallestGreaterZero);
|
||||
//std::cout<<"JKQTPSingleColumnSymbolsGraph::getYMinMax(miny="<<miny<<", maxy="<<maxy<<", smallestGreaterZero="<<smallestGreaterZero<<"): dataDirection!=DataDirection::Y -->"<<std::boolalpha<<res<<"\n";
|
||||
return res;
|
||||
} else {
|
||||
miny=position;
|
||||
maxy=position;
|
||||
@ -81,6 +89,7 @@ bool JKQTPSingleColumnSymbolsGraph::getYMinMax(double &miny, double &maxy, doubl
|
||||
miny=position-width/2;
|
||||
maxy=position+width/2;
|
||||
}
|
||||
//std::cout<<"JKQTPSingleColumnSymbolsGraph::getYMinMax(miny="<<miny<<", maxy="<<maxy<<", smallestGreaterZero="<<smallestGreaterZero<<"): dataDirection!=DataDirection::Y -->"<<std::boolalpha<<true<<" position="<<position<<", width="<<width<<"\n";
|
||||
return true;
|
||||
//smallestGreaterZero=qMax(double(0.0), qMin(baseline, baseline+peakHeight));
|
||||
}
|
||||
|
@ -1752,9 +1752,9 @@ inline JKQTPColumnContourPlot* jkqtpstatAddKDE2DContour(JKQTBasePlotter* plotter
|
||||
*/
|
||||
template <class InputItX, class InputItY>
|
||||
inline JKQTPXFunctionLineGraph* jkqtpstatAddLinearRegression(JKQTBasePlotter* plotter, InputItX firstX, InputItX lastX, InputItY firstY, InputItY lastY, double* coeffA=nullptr, double* coeffB=nullptr, bool fixA=false, bool fixB=false) {
|
||||
double cA;
|
||||
double cA=0;
|
||||
if (coeffA) cA=*coeffA;
|
||||
double cB;
|
||||
double cB=0;
|
||||
if (coeffB) cB=*coeffB;
|
||||
|
||||
JKQTPASSERT_M(!fixA || (fixA && coeffA!=nullptr), "if fixA=true, coeffA needs to be provided");
|
||||
@ -1828,9 +1828,9 @@ JKQTP_LIB_EXPORT JKQTPXFunctionLineGraph* jkqtpstatAddLinearRegression(JKQTPXYGr
|
||||
*/
|
||||
template <class InputItX, class InputItY>
|
||||
inline JKQTPXFunctionLineGraph* jkqtpstatAddRobustIRLSLinearRegression(JKQTBasePlotter* plotter, InputItX firstX, InputItX lastX, InputItY firstY, InputItY lastY, double* coeffA=nullptr, double* coeffB=nullptr, bool fixA=false, bool fixB=false, double p=1.1, int iterations=100) {
|
||||
double cA;
|
||||
double cA=0;
|
||||
if (coeffA) cA=*coeffA;
|
||||
double cB;
|
||||
double cB=0;
|
||||
if (coeffB) cB=*coeffB;
|
||||
|
||||
JKQTPASSERT_M(!fixA || (fixA && coeffA!=nullptr), "if fixA=true, coeffA needs to be provided");
|
||||
@ -1916,9 +1916,9 @@ JKQTP_LIB_EXPORT JKQTPXFunctionLineGraph *jkqtpstatAddRobustIRLSLinearRegression
|
||||
*/
|
||||
template <class InputItX, class InputItY, class InputItW>
|
||||
inline JKQTPXFunctionLineGraph* jkqtpstatAddLinearWeightedRegression(JKQTBasePlotter* plotter, InputItX firstX, InputItX lastX, InputItY firstY, InputItY lastY, InputItW firstW, InputItW lastW, double* coeffA=nullptr, double* coeffB=nullptr, bool fixA=false, bool fixB=false, std::function<double(double)> fWeightDataToWi=&jkqtp_identity<double>) {
|
||||
double cA;
|
||||
double cA=0;
|
||||
if (coeffA) cA=*coeffA;
|
||||
double cB;
|
||||
double cB=0;
|
||||
if (coeffB) cB=*coeffB;
|
||||
|
||||
JKQTPASSERT_M(!fixA || (fixA && coeffA!=nullptr), "if fixA=true, coeffA needs to be provided");
|
||||
@ -2002,9 +2002,9 @@ JKQTP_LIB_EXPORT JKQTPXFunctionLineGraph* jkqtpstatAddLinearWeightedRegression(J
|
||||
*/
|
||||
template <class InputItX, class InputItY>
|
||||
inline JKQTPXFunctionLineGraph* jkqtpstatAddRegression(JKQTBasePlotter* plotter, JKQTPStatRegressionModelType type, InputItX firstX, InputItX lastX, InputItY firstY, InputItY lastY, double* coeffA=nullptr, double* coeffB=nullptr, bool fixA=false, bool fixB=false) {
|
||||
double cA;
|
||||
double cA=0;
|
||||
if (coeffA) cA=*coeffA;
|
||||
double cB;
|
||||
double cB=0;
|
||||
if (coeffB) cB=*coeffB;
|
||||
|
||||
JKQTPASSERT_M(!fixA || (fixA && coeffA!=nullptr), "if fixA=true, coeffA needs to be provided");
|
||||
@ -2078,9 +2078,9 @@ JKQTP_LIB_EXPORT JKQTPXFunctionLineGraph* jkqtpstatAddRegression(JKQTPXYGraph *d
|
||||
*/
|
||||
template <class InputItX, class InputItY>
|
||||
inline JKQTPXFunctionLineGraph* jkqtpstatAddRobustIRLSRegression(JKQTBasePlotter* plotter, JKQTPStatRegressionModelType type, InputItX firstX, InputItX lastX, InputItY firstY, InputItY lastY, double* coeffA=nullptr, double* coeffB=nullptr, bool fixA=false, bool fixB=false, double p=1.1, int iterations=100) {
|
||||
double cA;
|
||||
double cA=0;
|
||||
if (coeffA) cA=*coeffA;
|
||||
double cB;
|
||||
double cB=0;
|
||||
if (coeffB) cB=*coeffB;
|
||||
|
||||
JKQTPASSERT_M(!fixA || (fixA && coeffA!=nullptr), "if fixA=true, coeffA needs to be provided");
|
||||
@ -2168,9 +2168,9 @@ JKQTP_LIB_EXPORT JKQTPXFunctionLineGraph *jkqtpstatAddRobustIRLSRegression(JKQTP
|
||||
*/
|
||||
template <class InputItX, class InputItY, class InputItW>
|
||||
inline JKQTPXFunctionLineGraph* jkqtpstatAddWeightedRegression(JKQTBasePlotter* plotter, JKQTPStatRegressionModelType type, InputItX firstX, InputItX lastX, InputItY firstY, InputItY lastY, InputItW firstW, InputItW lastW, double* coeffA=nullptr, double* coeffB=nullptr, bool fixA=false, bool fixB=false, std::function<double(double)> fWeightDataToWi=&jkqtp_identity<double>) {
|
||||
double cA;
|
||||
double cA=0;
|
||||
if (coeffA) cA=*coeffA;
|
||||
double cB;
|
||||
double cB=0;
|
||||
if (coeffB) cB=*coeffB;
|
||||
|
||||
JKQTPASSERT_M(!fixA || (fixA && coeffA!=nullptr), "if fixA=true, coeffA needs to be provided");
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -948,135 +948,6 @@ class JKQTP_LIB_EXPORT JKQTBasePlotter: public QObject {
|
||||
}
|
||||
}
|
||||
|
||||
/** \brief add a new graph, returns it's position in the graphs list.
|
||||
*
|
||||
* \param xColumn the column which contains the x-values of the datapoints
|
||||
* \param yColumn the column which contains the y-values of the datapoints
|
||||
* \param title a title for this specific graph which can be displayed in the key
|
||||
* \param graphStyle the way how to plot the graph
|
||||
*
|
||||
* Both point to columns in the datastore explained in the JKQTBasePlotter class. The plotWidth, color, pen style ...
|
||||
* will be extracted from the automatic plot style creation mechanism implemented in JKQTBasePlotter::getNextStyle().
|
||||
* If you want to change them either use another overloaded version of addGraph(), or use getGraph() and setGraph():
|
||||
* \code
|
||||
* size_t i=addGraph(0,1,"graph1");
|
||||
* JKQTPPlotElement gr=getGraph(i);
|
||||
* gr.color=QColor("red");
|
||||
* setGraph(i, gr);
|
||||
* \endcode
|
||||
*/
|
||||
size_t addGraph(size_t xColumn, size_t yColumn, const QString& title, JKQTPGraphPlotstyle graphStyle=JKQTPLines);
|
||||
|
||||
/** \brief add a new graph, returns it's position in the graphs list.
|
||||
*
|
||||
* \param xColumn the column which contains the x-values of the datapoints
|
||||
* \param yColumn the column which contains the y-values of the datapoints
|
||||
* \param title a title for this specific graph which can be displayed in the key
|
||||
* \param graphStyle the way how to plot the graph
|
||||
* \param symbol a symbol to use for the datapoints in some plot styles
|
||||
* \param color the color of the graph
|
||||
* \param width width (in pixel) of the graph
|
||||
* \param penstyle the drawing style (solid, dashed ...) of the graph lines.
|
||||
*
|
||||
* Both point to columns in the datastore explained in the JKQTBasePlotter class.
|
||||
* The symbolSize is set to 10 and no error information is expected.
|
||||
*/
|
||||
size_t addGraph(size_t xColumn, size_t yColumn, const QString& title, JKQTPGraphPlotstyle graphStyle, QColor color, JKQTPGraphSymbols symbol=JKQTPCross, Qt::PenStyle penstyle=Qt::SolidLine, double width=2);
|
||||
|
||||
/** \brief add a new graph with x-error information, returns it's position in the graphs list.
|
||||
*
|
||||
*
|
||||
* \param xColumn the column which contains the x-values of the datapoints
|
||||
* \param yColumn the column which contains the y-values of the datapoints
|
||||
* \param xErrorColumn the column which contains the x-value errors of the datapoints
|
||||
* \param title a title for this specific graph which can be displayed in the key
|
||||
* \param graphStyle the way how to plot the graph
|
||||
* \param errorStyle the drawing style (bars, lines ...) of the errors.
|
||||
*
|
||||
* Both point to columns in the datastore explained in the JKQTBasePlotter class.
|
||||
* The symbolSize is set to 10 and no error information is expected.
|
||||
*/
|
||||
size_t addGraphWithXError(size_t xColumn, size_t yColumn, size_t xErrorColumn, const QString& title, JKQTPGraphPlotstyle graphStyle=JKQTPPoints, JKQTPErrorPlotstyle errorStyle=JKQTPErrorBars);
|
||||
|
||||
/** \brief add a new graph with x-error information, returns it's position in the graphs list.
|
||||
*
|
||||
*
|
||||
* \param xColumn the column which contains the x-values of the datapoints
|
||||
* \param yColumn the column which contains the y-values of the datapoints
|
||||
* \param yErrorColumn the column which contains the y-value errors of the datapoints
|
||||
* \param title a title for this specific graph which can be displayed in the key
|
||||
* \param graphStyle the way how to plot the graph
|
||||
* \param errorStyle the drawing style (bars, lines ...) of the errors.
|
||||
*
|
||||
* Both point to columns in the datastore explained in the JKQTBasePlotter class.
|
||||
* The symbolSize is set to 10 and no error information is expected.
|
||||
*/
|
||||
size_t addGraphWithYError(size_t xColumn, size_t yColumn, size_t yErrorColumn, const QString& title, JKQTPGraphPlotstyle graphStyle=JKQTPPoints, JKQTPErrorPlotstyle errorStyle=JKQTPErrorBars);
|
||||
|
||||
/** \brief add a new graph with x-error information, returns it's position in the graphs list.
|
||||
*
|
||||
*
|
||||
* \param xColumn the column which contains the x-values of the datapoints
|
||||
* \param yColumn the column which contains the y-values of the datapoints
|
||||
* \param xErrorColumn the column which contains the x-value errors of the datapoints
|
||||
* \param yErrorColumn the column which contains the y-value errors of the datapoints
|
||||
* \param title a title for this specific graph which can be displayed in the key
|
||||
* \param graphStyle the way how to plot the graph
|
||||
*
|
||||
* Both point to columns in the datastore explained in the JKQTBasePlotter class.
|
||||
* The symbolSize is set to 10 and no error information is expected. The errorStyle is set to JKQTPErrorBars
|
||||
* for both directions.
|
||||
*/
|
||||
size_t addGraphWithXYError(size_t xColumn, size_t yColumn, size_t xErrorColumn, size_t yErrorColumn, const QString& title, JKQTPGraphPlotstyle graphStyle=JKQTPPoints);
|
||||
|
||||
/** \brief add a boxplot graph to the plot
|
||||
*
|
||||
* \param title title of the plot
|
||||
* \param posColumn column containing the positions
|
||||
* \param medianColumn column containing the median values
|
||||
* \param minColumn column containing the minimum values
|
||||
* \param maxColumn column containing the maximum values
|
||||
* \param percentile25Column column containing the 25% percentiles
|
||||
* \param percentile75Column column containing the 75% percentiles
|
||||
* \param meanColumn column containing the mean value (this column is optional. If you don't want a mean symbol, set this to -1
|
||||
*/
|
||||
size_t addHorizontalBoxplot(QString title, int posColumn, int medianColumn, int minColumn, int maxColumn, int percentile25Column, int percentile75Column, int meanColumn=-1);
|
||||
|
||||
/** \brief add a boxplot graph to the plot
|
||||
*
|
||||
* \param title title of the plot
|
||||
* \param posColumn column containing the positions
|
||||
* \param medianColumn column containing the median values
|
||||
* \param minColumn column containing the minimum values
|
||||
* \param maxColumn column containing the maximum values
|
||||
* \param percentile25Column column containing the 25% percentiles
|
||||
* \param percentile75Column column containing the 75% percentiles
|
||||
* \param meanColumn column containing the mean value (this column is optional. If you don't want a mean symbol, set this to -1
|
||||
*/
|
||||
size_t addVerticalBoxplot(QString title, int posColumn, int medianColumn, int minColumn, int maxColumn, int percentile25Column, int percentile75Column, int meanColumn=-1);
|
||||
|
||||
/** \brief add one bargraph for each of the given set of \f$ f(x) \f$ -values which all use one column of x-values
|
||||
*
|
||||
* \param xColumn column with the x-values, which are common to all bargraphs
|
||||
* \param yColumns columns for the y-values
|
||||
* \param titles titles of the plot
|
||||
*
|
||||
* Here is an example output:
|
||||
* \image html plot_bargraphhorplot.png
|
||||
*/
|
||||
void addHorizontalBargraph(size_t xColumn, QVector<size_t> yColumns, QStringList titles);
|
||||
|
||||
/** \brief add a bargraph for the given set of \f$ f(x) \f$ -values for one column of x-values
|
||||
*
|
||||
* \param xColumns columns with the x-values
|
||||
* \param yColumn column for the y-values, which are common to all bargraphs
|
||||
* \param titles titles of the plot
|
||||
*
|
||||
* Here is an example output:
|
||||
* \image html plot_bargraphhorplot.png
|
||||
*/
|
||||
void addVerticalBargraph(QVector<size_t> xColumns, size_t yColumn, QStringList titles);
|
||||
|
||||
/** \brief get the maximum and minimum x-value over all graphs in the plot
|
||||
* \param[out] minx smallest x value
|
||||
* \param[out] maxx largest x value
|
||||
@ -1738,7 +1609,7 @@ class JKQTP_LIB_EXPORT JKQTBasePlotter: public QObject {
|
||||
/*! \copydoc JKQTBasePlotterStyle::defaultTextColor */
|
||||
void setDefaultTextColor(QColor __value) ;
|
||||
/*! \copydoc JKQTBasePlotterStyle::defaultFontSize */
|
||||
void setDefaultTextSize(float __value) ;
|
||||
void setDefaultTextSize(double __value) ;
|
||||
/*! \copydoc JKQTBasePlotterStyle::defaultFontName */
|
||||
void setDefaultTextFontName(const QString& __value) ;
|
||||
/** \brief sets the current directory in which to open SaveAs ... dialogs */
|
||||
@ -2001,9 +1872,9 @@ class JKQTP_LIB_EXPORT JKQTBasePlotter: public QObject {
|
||||
/** \brief list that manages all the additional graphs for \ref JKQTBASEPLOTTER_SYNCMULTIPLOT_GRIDPRINT "grid printing" mode */
|
||||
QList<JKQTPGridPrintingItem> gridPrintingList;
|
||||
/** \brief this list contains all the rows of the current \ref JKQTBASEPLOTTER_SYNCMULTIPLOT_GRIDPRINT "grid printing" and stores its heights */
|
||||
QList<int> gridPrintingRows;
|
||||
QList<size_t> gridPrintingRows;
|
||||
/** \brief this list contains all the columns of the current \ref JKQTBASEPLOTTER_SYNCMULTIPLOT_GRIDPRINT "grid printing" and stores its widths */
|
||||
QList<int> gridPrintingColumns;
|
||||
QList<size_t> gridPrintingColumns;
|
||||
/** \brief size of all plots in \ref JKQTBASEPLOTTER_SYNCMULTIPLOT_GRIDPRINT "grid printing" mode, filled by gridPrintingCalc() */
|
||||
QSizeF gridPrintingSize;
|
||||
|
||||
|
@ -34,6 +34,7 @@ JKQTBasePlotterStyle::JKQTBasePlotterStyle():
|
||||
graphFillColorDerivationMode(JKQTPFFCMLighterColor),
|
||||
graphErrorColorDerivationMode(JKQTPFFCMDarkerColor),
|
||||
graphErrorFillColorDerivationMode(JKQTPFFCMEvenLighterColor),
|
||||
defaultGraphColors(), defaultGraphPenStyles(), defaultGraphSymbols(), defaultGraphFillStyles(),
|
||||
keyStyle(*this),
|
||||
xAxisStyle(*this),
|
||||
yAxisStyle(*this),
|
||||
|
@ -29,44 +29,40 @@
|
||||
//#undef SHOW_JKQTPLOTTER_DEBUG
|
||||
//#define SHOW_JKQTPLOTTER_DEBUG
|
||||
|
||||
JKQTPCoordinateAxis::JKQTPCoordinateAxis(JKQTBasePlotter* parent):
|
||||
QObject(parent)
|
||||
JKQTPCoordinateAxis::JKQTPCoordinateAxis(JKQTBasePlotter* _parent):
|
||||
QObject(_parent),
|
||||
paramsChanged(true),
|
||||
doUpdateScaling(true),
|
||||
tickLabels(),
|
||||
parent(_parent),
|
||||
axismin(-10),
|
||||
axismax(10),
|
||||
axisabsoultemin(-DBL_MAX/100.),
|
||||
axisabsoultemax(DBL_MAX/100.0),
|
||||
axisStyle(),
|
||||
axisMinWidth(-1),
|
||||
width(20),
|
||||
scale(0),
|
||||
offset(0),
|
||||
inverted(false),
|
||||
tickStart(1),
|
||||
autoAxisSpacing(true),
|
||||
logAxis(false),
|
||||
logAxisBase(10),
|
||||
userTickSpacing(1),
|
||||
userLogTickSpacing(10),
|
||||
tickSpacing(0),
|
||||
tickSpacingLog(10),
|
||||
axisLabel(),
|
||||
axisPrefix(),
|
||||
scaleSign(1)
|
||||
{
|
||||
this->parent=parent;
|
||||
|
||||
axisPrefix="";
|
||||
scaleSign=1;
|
||||
doUpdateScaling=true;
|
||||
|
||||
axismin=-10;
|
||||
axismax=10;
|
||||
axisabsoultemin=-DBL_MAX/100.0;
|
||||
axisabsoultemax=DBL_MAX/100.0;
|
||||
axisMinWidth=-1;
|
||||
|
||||
width=20;
|
||||
|
||||
scale=0;
|
||||
offset=0;
|
||||
inverted=false;
|
||||
|
||||
tickSpacing=0;
|
||||
tickSpacingLog=10;
|
||||
tickStart=0;
|
||||
|
||||
autoAxisSpacing=true;
|
||||
logAxis=false;
|
||||
logAxisBase=10;
|
||||
userTickSpacing=1;
|
||||
userLogTickSpacing=10;
|
||||
|
||||
axisLabel="";
|
||||
|
||||
|
||||
paramsChanged=true;
|
||||
}
|
||||
|
||||
JKQTPCoordinateAxis::~JKQTPCoordinateAxis() = default;
|
||||
JKQTPCoordinateAxis::~JKQTPCoordinateAxis() {
|
||||
|
||||
}
|
||||
|
||||
void JKQTPCoordinateAxis::setParent(JKQTBasePlotter* parent) {
|
||||
this->parent=parent;
|
||||
@ -1617,14 +1613,14 @@ void JKQTPVerticalAxis::drawAxes(JKQTPEnhancedPainter& painter) {
|
||||
|
||||
|
||||
|
||||
JKQTPVerticalIndependentAxis::JKQTPVerticalIndependentAxis(double axisOffset, double axisWidth, double otherAxisOffset, double otherAxisWidth, JKQTBasePlotter* parent):
|
||||
JKQTPVerticalAxis(parent)
|
||||
JKQTPVerticalIndependentAxis::JKQTPVerticalIndependentAxis(double _axisOffset, double _axisWidth, double _otherAxisOffset, double _otherAxisWidth, JKQTBasePlotter* parent):
|
||||
JKQTPVerticalAxis(parent),
|
||||
axisOffset(_axisOffset),
|
||||
axisWidth(_axisWidth),
|
||||
otherAxisWidth(_otherAxisOffset),
|
||||
otherAxisOffset(_otherAxisWidth),
|
||||
otherAxisInverted(false)
|
||||
{
|
||||
this->axisOffset=axisOffset;
|
||||
this->axisWidth=axisWidth;
|
||||
this->otherAxisOffset=otherAxisOffset;
|
||||
this->otherAxisWidth=otherAxisWidth;
|
||||
this->otherAxisInverted=false;
|
||||
if (parent) {
|
||||
axisStyle=parent->getCurrentPlotterStyle().rightColorbarAxisStyle;
|
||||
} else {
|
||||
@ -1716,7 +1712,7 @@ QSizeF JKQTPHorizontalAxis::getSize1(JKQTPEnhancedPainter& painter) {
|
||||
if (JKQTPCADrawModeHasTickLabels(axisStyle.drawMode1)) {
|
||||
ptwidth+=axisStyle.labelDistance;
|
||||
// find out size of axis label
|
||||
labwidth+=parent->getTextSizeSize(getParent()->getCurrentPlotterStyle().defaultFontName, axisStyle.labelFontSize*parent->getFontSizeMultiplier(), axisLabel, painter).width();
|
||||
labwidth+=parent->getTextSizeSize(getParent()->getCurrentPlotterStyle().defaultFontName, axisStyle.labelFontSize*parent->getFontSizeMultiplier(), axisLabel, painter).height();
|
||||
}
|
||||
|
||||
return QSizeF(getParentPlotWidth(), parent->pt2px(painter, ptwidth)+labwidth);
|
||||
@ -1735,7 +1731,7 @@ QSizeF JKQTPHorizontalAxis::getSize2(JKQTPEnhancedPainter& painter) {
|
||||
if (JKQTPCADrawModeHasTickLabels(axisStyle.drawMode2)) {
|
||||
ptwidth+=axisStyle.labelDistance;
|
||||
// find out size of axis label
|
||||
labwidth+=parent->getTextSizeSize(getParent()->getCurrentPlotterStyle().defaultFontName, axisStyle.labelFontSize*parent->getFontSizeMultiplier(), axisLabel, painter).width();
|
||||
labwidth+=parent->getTextSizeSize(getParent()->getCurrentPlotterStyle().defaultFontName, axisStyle.labelFontSize*parent->getFontSizeMultiplier(), axisLabel, painter).height();
|
||||
}
|
||||
|
||||
return QSizeF(getParentPlotWidth(), parent->pt2px(painter, ptwidth)+labwidth);
|
||||
@ -2198,14 +2194,14 @@ void JKQTPHorizontalAxis::drawAxes(JKQTPEnhancedPainter& painter) {
|
||||
|
||||
|
||||
|
||||
JKQTPHorizontalIndependentAxis::JKQTPHorizontalIndependentAxis(double axisOffset, double axisWidth, double otherAxisOffset, double otherAxisWidth, JKQTBasePlotter* parent):
|
||||
JKQTPHorizontalAxis(parent)
|
||||
JKQTPHorizontalIndependentAxis::JKQTPHorizontalIndependentAxis(double _axisOffset, double _axisWidth, double _otherAxisOffset, double _otherAxisWidth, JKQTBasePlotter* parent):
|
||||
JKQTPHorizontalAxis(parent),
|
||||
axisOffset(_axisOffset),
|
||||
axisWidth(_axisWidth),
|
||||
otherAxisWidth(_otherAxisOffset),
|
||||
otherAxisOffset(_otherAxisWidth),
|
||||
otherAxisInverted(false)
|
||||
{
|
||||
this->axisOffset=axisOffset;
|
||||
this->axisWidth=axisWidth;
|
||||
this->otherAxisOffset=otherAxisOffset;
|
||||
this->otherAxisWidth=otherAxisWidth;
|
||||
this->otherAxisInverted=false;
|
||||
if (parent) {
|
||||
axisStyle=parent->getCurrentPlotterStyle().topColorbarAxisStyle;
|
||||
} else {
|
||||
|
@ -1579,6 +1579,7 @@ class JKQTP_LIB_EXPORT JKQTPColumn {
|
||||
|
||||
};
|
||||
|
||||
#pragma pack(push,1)
|
||||
/** \brief iterator over the data in the column of a JKQTPDatastore
|
||||
* \ingroup jkqtpdatastorage
|
||||
*
|
||||
@ -2245,7 +2246,7 @@ class JKQTP_LIB_EXPORT JKQTPDatastoreItem {
|
||||
inline void erase(size_t row) {
|
||||
JKQTPASSERT(isVector());
|
||||
datavec.erase(datavec.begin()+row, datavec.end());
|
||||
rows=static_cast<int>(datavec.size());
|
||||
rows=static_cast<size_t>(datavec.size());
|
||||
data=datavec.data();
|
||||
}
|
||||
/** \brief if \c isValid() : erase all rows (and including) from \a row to \a rowEnd */
|
||||
@ -2256,7 +2257,7 @@ class JKQTP_LIB_EXPORT JKQTPDatastoreItem {
|
||||
JKQTPASSERT(isVector());
|
||||
if (rowEnd>=static_cast<size_t>(datavec.size())) datavec.erase(datavec.begin()+row, datavec.end());
|
||||
else datavec.erase(datavec.begin()+row, datavec.begin()+rowEnd);
|
||||
rows=static_cast<int>(datavec.size());
|
||||
rows=static_cast<size_t>(datavec.size());
|
||||
data=datavec.data();
|
||||
}
|
||||
}
|
||||
@ -2397,6 +2398,7 @@ class JKQTP_LIB_EXPORT JKQTPDatastoreItem {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
#pragma pack(pop)
|
||||
|
||||
|
||||
/** \brief QAbstractTableModel descendent that allows to view data in a JKQTPDatastore
|
||||
|
@ -43,25 +43,37 @@
|
||||
**************************************************************************************************************************/
|
||||
JKQTPlotter::JKQTPlotter(bool datastore_internal, QWidget* parent, JKQTPDatastore* datast):
|
||||
QWidget(parent, Qt::Widget),
|
||||
plotterStyle(JKQTPGetSystemDefaultStyle())
|
||||
currentMouseDragAction(),
|
||||
doDrawing(false),
|
||||
plotter(nullptr),
|
||||
mouseDragingRectangle(false),
|
||||
mouseDragRectXStart(0), mouseDragRectXStartPixel(0), mouseDragRectXEndPixel(0),
|
||||
mouseDragRectYEndPixel(0), mouseDragRectXEnd(0), mouseDragRectYStart(0),
|
||||
mouseDragRectYStartPixel(0), mouseDragRectYEnd(0),
|
||||
mouseDragMarkers(),
|
||||
image(), imageNoOverlays(), oldImage(),
|
||||
menuSpecialContextMenu(nullptr),toolbar(nullptr), masterPlotterX(nullptr), masterPlotterY(nullptr),
|
||||
mousePosX(0), mousePosY(0),
|
||||
magnification(1),
|
||||
minSize(),
|
||||
contextMenu(nullptr),
|
||||
contextMenuMode(JKQTPContextMenuModes::jkqtpcmmStandardContextMenu),
|
||||
mouseContextX(0), mouseContextY(0), mouseLastClickX(0), mouseLastClickY(0),
|
||||
contextSubMenus(),
|
||||
plotterStyle(JKQTPGetSystemDefaultStyle()),
|
||||
resizeTimer(), registeredOverrideMouseDragActionModes(),
|
||||
actgrpMouseLeft(nullptr), actMouseLeftAsDefault(nullptr), actMouseLeftAsRuler(nullptr), actMouseLeftAsToolTip(nullptr), actMouseLeftAsZoomRect(nullptr), actMouseLeftAsPanView(nullptr)
|
||||
{
|
||||
initJKQTPlotterResources();
|
||||
|
||||
menuSpecialContextMenu=nullptr;
|
||||
mouseContextX=0;
|
||||
mouseContextY=0;
|
||||
setParent(parent);
|
||||
connect(&resizeTimer, SIGNAL(timeout()), this, SLOT(delayedResizeEvent()));
|
||||
doDrawing=false;
|
||||
magnification=1;
|
||||
|
||||
plotter=new JKQTBasePlotter(datastore_internal, this, datast);
|
||||
plotter->setEmittingSignalsEnabled(false);
|
||||
fixBasePlotterSettings();
|
||||
|
||||
|
||||
mousePosX=0;
|
||||
mousePosY=0;
|
||||
|
||||
connect(plotter, SIGNAL(plotUpdated()), this, SLOT(redrawPlot()));
|
||||
connect(plotter, SIGNAL(overlaysUpdated()), this, SLOT(redrawOverlays()));
|
||||
connect(plotter, SIGNAL(beforePlotScalingRecalculate()), this, SLOT(intBeforePlotScalingRecalculate()));
|
||||
@ -70,10 +82,6 @@ JKQTPlotter::JKQTPlotter(bool datastore_internal, QWidget* parent, JKQTPDatastor
|
||||
image=QImage(width(), height(), QImage::Format_ARGB32);
|
||||
oldImage=image;
|
||||
imageNoOverlays=image;
|
||||
mouseDragingRectangle=false;
|
||||
|
||||
// set default user-interactions:
|
||||
contextMenuMode=JKQTPContextMenuModes::jkqtpcmmStandardContextMenu;
|
||||
|
||||
// enable mouse-tracking, so mouseMoved-Events can be caught
|
||||
setMouseTracking(true);
|
||||
@ -334,17 +342,23 @@ JKQTPUserActionMarkerType JKQTPlotter::getUserActionMarkerType() const
|
||||
|
||||
void JKQTPlotter::registerMouseWheelAction(Qt::KeyboardModifiers modifier, JKQTPMouseWheelActions action)
|
||||
{
|
||||
qDebug()<<"registerMouseWheelAction("<<modifier<<","<<action<<"): "<<plotterStyle.registeredMouseWheelActions;
|
||||
plotterStyle.registeredMouseWheelActions[modifier]=action;
|
||||
qDebug()<<"registerMouseWheelAction("<<modifier<<","<<action<<"): "<<plotterStyle.registeredMouseWheelActions;
|
||||
}
|
||||
|
||||
void JKQTPlotter::deregisterMouseWheelAction(Qt::KeyboardModifiers modifier)
|
||||
{
|
||||
qDebug()<<"deregisterMouseWheelAction("<<modifier<<"): "<<plotterStyle.registeredMouseWheelActions;
|
||||
plotterStyle.registeredMouseWheelActions.remove(modifier);
|
||||
qDebug()<<"deregisterMouseWheelAction("<<modifier<<"): "<<plotterStyle.registeredMouseWheelActions;
|
||||
}
|
||||
|
||||
void JKQTPlotter::clearAllMouseWheelActions()
|
||||
{
|
||||
qDebug()<<"clearAllMouseWheelActions(): "<<plotterStyle.registeredMouseWheelActions;
|
||||
plotterStyle.registeredMouseWheelActions.clear();
|
||||
qDebug()<<"clearAllMouseWheelActions(): "<<plotterStyle.registeredMouseWheelActions;
|
||||
}
|
||||
|
||||
|
||||
@ -472,7 +486,7 @@ void JKQTPlotter::paintUserAction() {
|
||||
painter.setRenderHint(JKQTPEnhancedPainter::Antialiasing, true);
|
||||
painter.setRenderHint(JKQTPEnhancedPainter::TextAntialiasing, true);
|
||||
painter.setPen(plotterStyle.userActionOverlayPen);
|
||||
if ((mouseDragRectXEnd!=mouseDragRectXStart) && (mouseDragRectYEnd!=mouseDragRectYStart)) {
|
||||
if (jkqtp_approximatelyUnequal(mouseDragRectXEnd,mouseDragRectXStart) && jkqtp_approximatelyUnequal(mouseDragRectYEnd,mouseDragRectYStart)) {
|
||||
double x1=plotter->x2p(mouseDragRectXStart)*magnification;
|
||||
double y1=plotter->y2p(mouseDragRectYStart)*magnification;
|
||||
double x2=plotter->x2p(mouseDragRectXEnd)*magnification;
|
||||
@ -708,10 +722,10 @@ void JKQTPlotter::mouseMoveEvent ( QMouseEvent * event ) {
|
||||
if (currentMouseDragAction.mode==jkqtpmdaZoomByRectangle) {
|
||||
emit plotNewZoomRectangle(mouseDragRectXStart, mouseDragRectXEnd, mouseDragRectYStart, mouseDragRectYEnd, event->modifiers());
|
||||
}
|
||||
if ((currentMouseDragAction.mode==jkqtpmdaScribbleForEvents) && ((mouseDragRectXStart!=mouseDragRectXEnd) || (mouseDragRectYStart!=mouseDragRectYEnd)) ) {
|
||||
if ((currentMouseDragAction.mode==jkqtpmdaScribbleForEvents) && (jkqtp_approximatelyUnequal(mouseDragRectXStart,mouseDragRectXEnd) || jkqtp_approximatelyUnequal(mouseDragRectYStart,mouseDragRectYEnd)) ) {
|
||||
emit userScribbleClick(mouseDragRectXEnd, mouseDragRectYEnd, event->modifiers(), false, false);
|
||||
}
|
||||
if ((currentMouseDragAction.mode==jkqtpmdaPanPlotOnMove) && ((mouseDragRectXStart!=mouseDragRectXEnd) || (mouseDragRectYStart!=mouseDragRectYEnd)) ) {
|
||||
if ((currentMouseDragAction.mode==jkqtpmdaPanPlotOnMove) && (jkqtp_approximatelyUnequal(mouseDragRectXStart,mouseDragRectXEnd) || jkqtp_approximatelyUnequal(mouseDragRectYStart,mouseDragRectYEnd)) ) {
|
||||
QRectF zoomRect= QRectF(QPointF(plotter->x2p(getXAxis()->getMin()),plotter->y2p(getYAxis()->getMax())), QPointF(plotter->x2p(getXAxis()->getMax()),plotter->y2p(getYAxis()->getMin())));
|
||||
if ( (mouseLastClickX/magnification<plotter->getInternalPlotBorderLeft()) || (mouseLastClickX/magnification>plotter->getPlotWidth()+plotter->getInternalPlotBorderLeft()) ) {
|
||||
zoomRect.translate(0, mouseDragRectYStartPixel-mouseDragRectYEndPixel);
|
||||
@ -797,7 +811,7 @@ void JKQTPlotter::mouseReleaseEvent ( QMouseEvent * event ){
|
||||
double x2=mouseDragRectXEnd;
|
||||
double y2=mouseDragRectYEnd;
|
||||
|
||||
if ((mouseDragRectXStart!=mouseDragRectXEnd) && (mouseDragRectYStart!=mouseDragRectYEnd)) {
|
||||
if (jkqtp_approximatelyUnequal(mouseDragRectXStart,mouseDragRectXEnd) && jkqtp_approximatelyUnequal(mouseDragRectYStart,mouseDragRectYEnd)) {
|
||||
if (currentMouseDragAction.mode==jkqtpmdaZoomByRectangle) {
|
||||
double xmin=mouseDragRectXStart;
|
||||
double xmax=mouseDragRectXEnd;
|
||||
@ -913,11 +927,15 @@ void JKQTPlotter::keyReleaseEvent(QKeyEvent *event) {
|
||||
}
|
||||
|
||||
void JKQTPlotter::wheelEvent ( QWheelEvent * event ) {
|
||||
//qDebug()<<"wheelEvent()";
|
||||
//qDebug()<<"wheelEvent("<<event->modifiers()<<"): plotterStyle.registeredMouseWheelActions="<<plotterStyle.registeredMouseWheelActions;
|
||||
auto itAction=findMatchingMouseWheelAction(event->modifiers());
|
||||
if (itAction!=plotterStyle.registeredMouseWheelActions.end()) {
|
||||
//qDebug()<<"wheelEvent("<<event->modifiers()<<"): plotterStyle.registeredMouseWheelActions="<<plotterStyle.registeredMouseWheelActions;
|
||||
//qDebug()<<"wheelEvent("<<event->modifiers()<<"): itAction="<<itAction.key()<<","<<itAction.value()<<" !=end:"<<(itAction!=plotterStyle.registeredMouseWheelActions.end())<<" ==end:"<<(itAction==plotterStyle.registeredMouseWheelActions.end());
|
||||
|
||||
if (itAction!=plotterStyle.registeredMouseWheelActions.end()) {
|
||||
if (itAction.value()==JKQTPMouseWheelActions::jkqtpmwaZoomByWheel) {
|
||||
//qDebug()<<"wheelEvent():ZoomByWheel";
|
||||
//if (act==JKQTPMouseWheelActions::jkqtpmwaZoomByWheel) {
|
||||
//qDebug()<<"wheelEvent("<<event->modifiers()<<"):ZoomByWheel";
|
||||
double factor=pow(2.0, 1.0*static_cast<double>(event->delta())/120.0)*2.0;
|
||||
double xmin=plotter->p2x(static_cast<double>(event->x())/magnification-static_cast<double>(plotter->getPlotWidth())/factor);
|
||||
double xmax=plotter->p2x(static_cast<double>(event->x())/magnification+static_cast<double>(plotter->getPlotWidth())/factor);
|
||||
@ -932,7 +950,8 @@ void JKQTPlotter::wheelEvent ( QWheelEvent * event ) {
|
||||
}
|
||||
plotter->setXY(xmin, xmax, ymin, ymax);
|
||||
} else if (itAction.value()==JKQTPMouseWheelActions::jkqtpmwaPanByWheel) {
|
||||
//qDebug()<<"wheelEvent():PanByWheel";
|
||||
//} else if (act==JKQTPMouseWheelActions::jkqtpmwaPanByWheel) {
|
||||
//qDebug()<<"wheelEvent("<<event->modifiers()<<"):PanByWheel";
|
||||
QRectF zoomRect= QRectF(QPointF(plotter->x2p(getXAxis()->getMin()),plotter->y2p(getYAxis()->getMax())), QPointF(plotter->x2p(getXAxis()->getMax()),plotter->y2p(getYAxis()->getMin())));
|
||||
QPointF d=QPointF(event->angleDelta().x()/120.0*zoomRect.width()/10.0,
|
||||
event->angleDelta().y()/120.0*zoomRect.height()/10.0);
|
||||
@ -1131,7 +1150,7 @@ void JKQTPlotter::redrawPlot() {
|
||||
if (!doDrawing) return;
|
||||
disconnect(plotter, SIGNAL(plotUpdated()), this, SLOT(redrawPlot()));
|
||||
disconnect(plotter, SIGNAL(overlaysUpdated()), this, SLOT(redrawOverlays()));
|
||||
plotter->setWidgetSize(width()/magnification, height()/magnification-getPlotYOffset());
|
||||
plotter->setWidgetSize(jkqtp_roundTo<int>(width()/magnification), jkqtp_roundTo<int>(height()/magnification-getPlotYOffset()));
|
||||
JKQTPEnhancedPainter painter(&image);
|
||||
if (painter.isActive()) {
|
||||
painter.scale(magnification, magnification);
|
||||
@ -1167,7 +1186,7 @@ void JKQTPlotter::paintEvent(QPaintEvent *event){
|
||||
p->drawRect(geometry());
|
||||
p->restore();
|
||||
if (plotterStyle.displayMousePosition ) {
|
||||
p->drawText(plotter->getInternalPlotBorderLeft(), getPlotYOffset()-1, plotterStyle.mousePositionTemplate.arg(mousePosX).arg(mousePosY));
|
||||
p->drawText(QPointF(plotter->getInternalPlotBorderLeft(), getPlotYOffset()-1), plotterStyle.mousePositionTemplate.arg(mousePosX).arg(mousePosY));
|
||||
}
|
||||
|
||||
int plotImageWidth=width();
|
||||
@ -1205,7 +1224,7 @@ void JKQTPlotter::resizeEvent(QResizeEvent *event) {
|
||||
}
|
||||
|
||||
//updateGeometry();
|
||||
//std::cout<<"resize DONE\n";
|
||||
//qDebug()<<"resize DONE width()="<<width()<<" height()="<<height()<<" plotImageWidth="<<plotImageWidth<<" plotImageHeight="<<plotImageHeight<<" sizeChanged="<<sizeChanged<<"\n";
|
||||
}
|
||||
|
||||
void JKQTPlotter::delayedResizeEvent()
|
||||
@ -1214,7 +1233,7 @@ void JKQTPlotter::delayedResizeEvent()
|
||||
int plotImageHeight=height();
|
||||
|
||||
plotImageHeight=plotImageHeight-getPlotYOffset();
|
||||
//std::cout<<"resize: "<<plotImageWidth<<" x "<<plotImageHeight<<std::endl;
|
||||
//qDebug()<<"resize: "<<plotImageWidth<<" x "<<plotImageHeight<<std::endl;
|
||||
bool sizeChanged=false;
|
||||
if (plotImageWidth != image.width() || plotImageHeight != image.height()) {
|
||||
|
||||
@ -1335,7 +1354,7 @@ bool JKQTPlotter::isPlotUpdateEnabled() const {
|
||||
|
||||
void JKQTPlotter::pzoomChangedLocally(double newxmin, double newxmax, double newymin, double newymax, JKQTBasePlotter* /*sender*/) {
|
||||
emit zoomChangedLocally(newxmin, newxmax, newymin, newymax, this);
|
||||
minSize=QSize(plotter->getInternalPlotBorderLeft()+plotter->getInternalPlotBorderRight()+10, plotter->getInternalPlotBorderTop()+plotter->getInternalPlotBorderBottom()+10);
|
||||
minSize=QSizeF(plotter->getInternalPlotBorderLeft()+plotter->getInternalPlotBorderRight()+10, plotter->getInternalPlotBorderTop()+plotter->getInternalPlotBorderBottom()+10).toSize();
|
||||
}
|
||||
|
||||
void JKQTPlotter::intBeforePlotScalingRecalculate() {
|
||||
@ -1650,25 +1669,46 @@ void JKQTPlotter::openStandardAndSpecialContextMenu(int x, int y)
|
||||
|
||||
JKQTPMouseDragActionsHashMapIterator JKQTPlotter::findMatchingMouseDragAction(Qt::MouseButton button, Qt::KeyboardModifiers modifiers, bool* found) const
|
||||
{
|
||||
auto it=registeredOverrideMouseDragActionModes.find(qMakePair<Qt::MouseButton, Qt::KeyboardModifiers>(button, modifiers));
|
||||
if (it!=registeredOverrideMouseDragActionModes.end()) {
|
||||
if (found) *found=true;
|
||||
return it;
|
||||
JKQTPMouseDragActionsHashMapIterator it=registeredOverrideMouseDragActionModes.begin();
|
||||
while (it!=registeredOverrideMouseDragActionModes.end() ) {
|
||||
if (it.key()==qMakePair<Qt::MouseButton, Qt::KeyboardModifiers>(button, modifiers)) {
|
||||
if (found) *found=true;
|
||||
return it;
|
||||
}
|
||||
++it;
|
||||
}
|
||||
auto itt=plotterStyle.registeredMouseDragActionModes.find(qMakePair<Qt::MouseButton, Qt::KeyboardModifiers>(button, modifiers));
|
||||
if (found) *found=(itt!=plotterStyle.registeredMouseDragActionModes.end());
|
||||
return itt;
|
||||
it=plotterStyle.registeredMouseDragActionModes.begin();
|
||||
while (it!=plotterStyle.registeredMouseDragActionModes.end() ) {
|
||||
if (it.key()==qMakePair<Qt::MouseButton, Qt::KeyboardModifiers>(button, modifiers)) {
|
||||
if (found) *found=true;
|
||||
return it;
|
||||
}
|
||||
++it;
|
||||
}
|
||||
if (found) *found=false;
|
||||
return plotterStyle.registeredMouseDragActionModes.end();
|
||||
}
|
||||
|
||||
JKQTPMouseDoubleClickActionsHashMapIterator JKQTPlotter::findMatchingMouseDoubleClickAction(Qt::MouseButton button, Qt::KeyboardModifiers modifiers) const
|
||||
{
|
||||
return plotterStyle.registeredMouseDoubleClickActions.find(qMakePair<Qt::MouseButton, Qt::KeyboardModifiers>(button, modifiers));
|
||||
for (JKQTPMouseDoubleClickActionsHashMapIterator it=plotterStyle.registeredMouseDoubleClickActions.begin(); it!=plotterStyle.registeredMouseDoubleClickActions.end(); ++it) {
|
||||
if (it.key()==qMakePair<Qt::MouseButton, Qt::KeyboardModifiers>(button, modifiers)) {
|
||||
return it;
|
||||
}
|
||||
}
|
||||
return plotterStyle.registeredMouseDoubleClickActions.end();
|
||||
}
|
||||
|
||||
JKQTPMouseWheelActionsHashMapIterator JKQTPlotter::findMatchingMouseWheelAction(Qt::KeyboardModifiers modifiers) const
|
||||
{
|
||||
//qDebug()<<"findMatchingMouseWheelAction("<<modifiers<<"): "<<plotterStyle.registeredMouseWheelActions;
|
||||
return plotterStyle.registeredMouseWheelActions.find(modifiers);
|
||||
for (JKQTPMouseWheelActionsHashMapIterator it=plotterStyle.registeredMouseWheelActions.begin(); it!=plotterStyle.registeredMouseWheelActions.end(); ++it) {
|
||||
if (it.key()==modifiers) {
|
||||
return it;
|
||||
}
|
||||
}
|
||||
return plotterStyle.registeredMouseWheelActions.end();
|
||||
|
||||
//return plotterStyle.registeredMouseWheelActions.find(modifiers);
|
||||
}
|
||||
|
||||
void JKQTPlotter::setPlotUpdateEnabled(bool enable)
|
||||
|
@ -1,5 +1,6 @@
|
||||
#include "jkqtplotterstyle.h"
|
||||
#include <QApplication>
|
||||
#include <QDebug>
|
||||
#include "jkqtcommon/jkqttools.h"
|
||||
#include "jkqtplotter/jkqtptools.h"
|
||||
|
||||
@ -21,13 +22,17 @@ JKQTPlotterStyle::JKQTPlotterStyle():
|
||||
displayMousePosition(true),
|
||||
toolbarEnabled(true),
|
||||
toolbarAlwaysOn(false),
|
||||
usePaletteColors(true)
|
||||
usePaletteColors(true),
|
||||
registeredMouseDragActionModes(),
|
||||
registeredMouseWheelActions(),
|
||||
registeredMouseDoubleClickActions()
|
||||
{
|
||||
// default user-actions:
|
||||
registeredMouseDragActionModes[qMakePair<Qt::MouseButton, Qt::KeyboardModifiers>(Qt::LeftButton, Qt::NoModifier)]=JKQTPMouseDragActions::jkqtpmdaZoomByRectangle;
|
||||
registeredMouseDragActionModes[qMakePair<Qt::MouseButton, Qt::KeyboardModifiers>(Qt::LeftButton, Qt::ControlModifier)]=JKQTPMouseDragActions::jkqtpmdaPanPlotOnMove;
|
||||
registeredMouseDoubleClickActions[qMakePair<Qt::MouseButton, Qt::KeyboardModifiers>(Qt::LeftButton, Qt::NoModifier)]=JKQTPMouseDoubleClickActions::jkqtpdcaClickMovesViewport;
|
||||
registeredMouseWheelActions[Qt::NoModifier]=JKQTPMouseWheelActions::jkqtpmwaZoomByWheel;
|
||||
//qDebug()<<"JKQTPlotterStyle(): registeredMouseWheelActions="<<registeredMouseWheelActions;
|
||||
}
|
||||
|
||||
void JKQTPlotterStyle::loadSettings(const QSettings &settings, const QString &group, const JKQTPlotterStyle &defaultStyle)
|
||||
|
@ -430,11 +430,11 @@ JKQTP_LIB_EXPORT JKQTPKeyLayout String2JKQTPKeyLayout(const QString& pos);
|
||||
* \ingroup jkqtpplottersupprt
|
||||
* \internal
|
||||
*/
|
||||
struct JKQTPGridPrintingItem {
|
||||
struct JKQTP_LIB_EXPORT JKQTPGridPrintingItem {
|
||||
/** \brief logic x-position of a graph, relative to the current JKQtPlotter */
|
||||
int x;
|
||||
size_t x;
|
||||
/** \brief logic y-position of a graph, relative to the current JKQtPlotter */
|
||||
int y;
|
||||
size_t y;
|
||||
/** \brief JKQTBasePlotter */
|
||||
JKQTBasePlotter* plotter;
|
||||
};
|
||||
@ -471,20 +471,6 @@ JKQTP_LIB_EXPORT QString JKQTPErrorPlotstyle2String(JKQTPErrorPlotstyle pos);
|
||||
*/
|
||||
JKQTP_LIB_EXPORT JKQTPErrorPlotstyle String2JKQTPErrorPlotstyle(const QString& pos);
|
||||
|
||||
/** \brief plot styles for a graph
|
||||
* \ingroup jkqtpplottersupprt
|
||||
*/
|
||||
enum JKQTPGraphPlotstyle {
|
||||
JKQTPLines, /*!< \brief plot y=f(x), connect the datapoints by straight lines */
|
||||
JKQTPFilledCurveX, /*!< \brief plot y=f(x), as filled curve (filled until the y=0/x-axis) */
|
||||
JKQTPFilledCurveY, /*!< \brief plot x=f(y), as filled curve (filled until the x=0/y-axis) */
|
||||
JKQTPPoints, /*!< \brief plot y=f(x), plot each datapoint with a symbol */
|
||||
JKQTPLinesPoints, /*!< \brief plot y=f(x), plot each datapoint with a symbol and connect them by straight lines */
|
||||
JKQTPImpulsesHorizontal, /*!< \brief plot y=f(x), plot each datapoint as a line from (x,0) to (x,f(x)) */
|
||||
JKQTPImpulsesVertical, /*!< \brief plot x=f(y), plot each datapoint as a line from (0,f(x)) to (x,f(x)) */
|
||||
JKQTPStepsX, /*!< \brief plot y=f(x), as a step curve */
|
||||
JKQTPStepsY /*!< \brief plot x=f(y), as a step curve */
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user