JKQtPlotter/lib/jkqtplotter/jkqtptools.h

684 lines
40 KiB
C++

/*
Copyright (c) 2008-2022 Jan W. Krieger (<jan@jkrieger.de>)
This software is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef JKQTPTOOLS_H_INCLUDED
#define JKQTPTOOLS_H_INCLUDED
#include "jkqtplotter/jkqtplotter_imexport.h"
#include <QString>
#include <QElapsedTimer>
#include <QLocale>
#include <cfloat>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <string>
#include <iostream>
#include <fstream>
#include <sstream>
#include <cstdarg>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <ctime>
#include <cmath>
#include <limits>
#include <cstdint>
#include <stdexcept>
#include <cctype>
#include <QColor>
#include <QFlags>
#include "jkqtcommon/jkqtpstringtools.h"
#include "jkqtcommon/jkqtpdebuggingtools.h"
#include "jkqtcommon/jkqtpmathtools.h"
#include "jkqtmath/jkqtpalgorithms.h"
#include "jkqtcommon/jkqtpcodestructuring.h"
#if __cplusplus >= 202002L
# include <version>
#endif
class JKQTPEnhancedPainter; // forward
class JKQTBasePlotter; // forward declaration
/** \brief used to specify teh type of graph when calling getPlotStyle()
* \ingroup jkqtpplottersupprt
*/
enum class JKQTPPlotStyleType {
Default, /*!< general graphs */
Barchart, /*!< barchart-type graphs */
Boxplot, /*!< boxplot-type graphs */
Filled, /*!< filled graphs */
Impulses, /*!< impulse-type graphs */
Geometric, /*!< geometric elements (e.g. rectangles, circles, lines, ...) */
Annotation, /*!< annotation elements */
};
/** \brief Styles in which to mark single positions during user actions in JKQTPlotter
* \ingroup jkqtpplottersupprt
*/
enum JKQTPUserActionMarkerType {
jkqtpuamtCircle=0, /*!< \brief a small circle around the position to mark */
jkqtpuamtCrossHair=1, /*!< \brief a cross-hair to the position to mark */
jkqtpuamtCircleAndCrossHair=2, /*!< \brief a cross-hair to the position to mark, with a circle-marker around the actual target (i.e. combines jkqtpuamtCircle and jkqtpuamtCrossHair) */
};
/** \brief convert a JKQTPUserActionMarkerType to a <a href="http://doc.qt.io/qt-5/qstring.html">QString</a>
* \ingroup jkqtpplottersupprt
*
* \see String2JKQTPUserActionMarkerType(), JKQTPUserActionMarkerType
*/
JKQTPLOTTER_LIB_EXPORT QString JKQTPUserActionMarkerType2String(JKQTPUserActionMarkerType act);
/** \brief convert a <a href="http://doc.qt.io/qt-5/qstring.html">QString</a> (created by JKQTPUserActionMarkerType2String() ) to JKQTPUserActionMarkerType
* \ingroup jkqtpplottersupprt
*
* \see JKQTPUserActionMarkerType2String(), JKQTPUserActionMarkerType
*/
JKQTPLOTTER_LIB_EXPORT JKQTPUserActionMarkerType String2JKQTPUserActionMarkerType(const QString &act);
/** \brief Availble action this JKQtPlotter can perform when mouse events occur.
* This allows you to e.g. draw rectangles or lines over the plot and receive a signal, when the drawing finishes
* \ingroup jkqtpplottersupprt
*/
enum JKQTPMouseDragActions {
jkqtpmdaPanPlotOnMove=0, /*!< \brief the user can drag the current plot window while keeping the left mouse-button pushed down (=panning), the new widow is applied/displayed whenever the mouse moves \image html drag_viewport.gif "Drag the Plot Viewport" */
jkqtpmdaPanPlotOnRelease, /*!< \brief the user can drag the current plot window while keeping the left mouse-button pushed down (=panning), the new widow is applied/displayed when the left mouse button is released */
jkqtpmdaZoomByRectangle, /*!< \brief draw a rectangle and when finish zoom to that rectangle */
jkqtpmdaDrawRectangleForEvent, /*!< \brief draw a rectangle and when finished execute the signal JKQTPlotter::userRectangleFinished() \image html draw_rectangle.gif "Draw Rectangle User-Action" */
jkqtpmdaDrawCircleForEvent, /*!< \brief draw a circle and when finished execute the signal JKQTPlotter::userCircleFinished() \image html draw_circle.gif "Draw Circle User-Action" */
jkqtpmdaDrawEllipseForEvent, /*!< \brief draw an ellipse and when finished execute the signal JKQTPlotter::userEllipseFinished() \image html draw_ellipse.gif "Draw Ellipse User-Action" */
jkqtpmdaDrawLineForEvent, /*!< \brief draw a line and when finished execute the signal JKQTPlotter::userLineFinished() \image html draw_line.gif "Draw Lines User-Action" */
jkqtpmdaScribbleForEvents, /*!< \brief let the user scribble on the plot (left mouse button is kept pressed) and call JKQTPlotter::userScribbleClick() for each new position */
jkqtpmdaToolTipForClosestDataPoint, /*!< \brief shows a tooltip with data of the closest data-point in the plot \image html tooltiptool.gif */
jkqtpmdaRuler, /*!< \brief shows a ruler over the plot, which measures delta X, delta Y and sqrt(dx^2+dy^2) \image html rulertool.gif */
};
/** \brief convert a JKQTPMouseDragActions to a <a href="http://doc.qt.io/qt-5/qstring.html">QString</a>
* \ingroup jkqtpplottersupprt
*
* \see String2JKQTPMouseDragActions(), JKQTPMouseDragActions
*/
JKQTPLOTTER_LIB_EXPORT QString JKQTPMouseDragActions2String(JKQTPMouseDragActions act);
/** \brief convert a <a href="http://doc.qt.io/qt-5/qstring.html">QString</a> (created by JKQTPMouseDragActions2String() ) to JKQTPMouseDragActions
* \ingroup jkqtpplottersupprt
*
* \see JKQTPMouseDragActions2String(), JKQTPMouseDragActions
*/
JKQTPLOTTER_LIB_EXPORT JKQTPMouseDragActions String2JKQTPMouseDragActions(const QString &button);
/** \brief actions that can be bound to a double-click of the mouse
* \ingroup jkqtpplottersupprt
*/
enum JKQTPMouseDoubleClickActions {
jkqtpdcaClickZoomsIn=0, /*!< \brief a double-click zooms into the plot at the current mouse location */
jkqtpdcaClickZoomsOut, /*!< \brief a double-click zooms out of the plot at the current mouse location */
jkqtpdcaClickOpensContextMenu, /*!< \brief a double-click opens the context menu */
jkqtpdcaClickOpensSpecialContextMenu, /*!< \brief a double-click opens the special context menu \see setSpecialContextMenu() */
jkqtpdcaClickMovesViewport, /*!< \brief a double-click centers the x/y-range around the clicked position */
};
/** \brief convert a JKQTPMouseDoubleClickActions to a <a href="http://doc.qt.io/qt-5/qstring.html">QString</a>
* \ingroup jkqtpplottersupprt
*
* \see String2JKQTPMouseDoubleClickActions(), JKQTPMouseDoubleClickActions
*/
JKQTPLOTTER_LIB_EXPORT QString JKQTPMouseDoubleClickActions2String(JKQTPMouseDoubleClickActions act);
/** \brief convert a <a href="http://doc.qt.io/qt-5/qstring.html">QString</a> (created by JKQTPMouseDoubleClickActions2String() ) to JKQTPMouseDoubleClickActions
* \ingroup jkqtpplottersupprt
*
* \see JKQTPMouseDoubleClickActions2String(), JKQTPMouseDoubleClickActions
*/
JKQTPLOTTER_LIB_EXPORT JKQTPMouseDoubleClickActions String2JKQTPMouseDoubleClickActions(const QString &act);
/** \brief actions that can be bound to a mouse wheel event
* \ingroup jkqtpplottersupprt
*/
enum JKQTPMouseWheelActions {
jkqtpmwaZoomByWheel=0, /*!< \brief use the mouse-wheel for zooming */
jkqtpmwaPanByWheel, /*!< \brief use the mouse-wheel for panning the plot */
};
/** \brief convert a JKQTPMouseWheelActions to a <a href="http://doc.qt.io/qt-5/qstring.html">QString</a>
* \ingroup jkqtpplottersupprt
*
* \see String2JKQTPMouseWheelActions(), JKQTPMouseWheelActions
*/
JKQTPLOTTER_LIB_EXPORT QString JKQTPMouseWheelActions2String(JKQTPMouseWheelActions act);
/** \brief convert a <a href="http://doc.qt.io/qt-5/qstring.html">QString</a> (created by JKQTPMouseWheelActions2String() ) to JKQTPMouseWheelActions
* \ingroup jkqtpplottersupprt
*
* \see JKQTPMouseWheelActions2String(), JKQTPMouseWheelActions
*/
JKQTPLOTTER_LIB_EXPORT JKQTPMouseWheelActions String2JKQTPMouseWheelActions(const QString &act);
/** \brief Availble action this JKQtPlotter can perform when mouse events occur.
* This allows you to e.g. draw rectangles or lines over the plot and receive a signal, when the drawing finishes
* \ingroup jkqtpplottersupprt
*/
enum JKQTPMouseMoveActions {
jkqtpmmaToolTipForClosestDataPoint /*!< \brief shows a tooltip with data of the closest data-point in the plot \image html tooltiptool.gif */
};
/** \brief convert a JKQTPMouseDragActions to a <a href="http://doc.qt.io/qt-5/qstring.html">QString</a>
* \ingroup jkqtpplottersupprt
*
* \see String2JKQTPMouseDragActions(), JKQTPMouseDragActions
*/
JKQTPLOTTER_LIB_EXPORT QString JKQTPMouseMoveActions2String(JKQTPMouseMoveActions act);
/** \brief convert a <a href="http://doc.qt.io/qt-5/qstring.html">QString</a> (created by JKQTPMouseDragActions2String() ) to JKQTPMouseDragActions
* \ingroup jkqtpplottersupprt
*
* \see JKQTPMouseDragActions2String(), JKQTPMouseDragActions
*/
JKQTPLOTTER_LIB_EXPORT JKQTPMouseMoveActions String2JKQTPMouseMoveActions(const QString &button);
/** \brief modes for the context menu
* \ingroup jkqtpplottersupprt
*/
enum JKQTPContextMenuModes {
jkqtpcmmStandardContextMenu=0, /*!< \brief only show the standard context menu \image html zoomin_mouse_contextmenu.gif "Zooming with the mouse" */
jkqtpcmmSpecialContextMenu, /*!< \brief only show the special context menu \see setSpecialContextMenu() */
jkqtpcmmStandardAndSpecialContextMenu, /*!< \brief show the standard context menu, with the special context menu incorporated \see setSpecialContextMenu() */
jkqtpcmmNoContextMenu, /*!< \brief don't show a context menu at all */
};
/** \brief convert a JKQTPContextMenuModes to a <a href="http://doc.qt.io/qt-5/qstring.html">QString</a>
* \ingroup jkqtpplottersupprt
*
* \see String2JKQTPContextMenuModes(), JKQTPContextMenuModes
*/
JKQTPLOTTER_LIB_EXPORT QString JKQTPContextMenuModes2String(JKQTPContextMenuModes act);
/** \brief convert a <a href="http://doc.qt.io/qt-5/qstring.html">QString</a> (created by JKQTPContextMenuModes2String() ) to JKQTPContextMenuModes
* \ingroup jkqtpplottersupprt
*
* \see JKQTPContextMenuModes2String(), JKQTPContextMenuModes
*/
JKQTPLOTTER_LIB_EXPORT JKQTPContextMenuModes String2JKQTPContextMenuModes(const QString &act);
/** \brief data structure for storage of assigned JKQTPMouseDragActions \see JKQTPMouseDragActionsHashMapIterator
* \ingroup jkqtpplottersupprt */
typedef QHash<QPair<Qt::MouseButton,Qt::KeyboardModifiers>, JKQTPMouseDragActions> JKQTPMouseDragActionsHashMap;
/** \brief iterator for JKQTPMouseDragActionsHashMap \see JKQTPMouseDragActionsHashMap
* \ingroup jkqtpplottersupprt */
typedef JKQTPMouseDragActionsHashMap::const_iterator JKQTPMouseDragActionsHashMapIterator;
/** \brief data structure for storage of assigned JKQTPMouseWheelActions \see JKQTPMouseWheelActionsHashMapIterator
* \ingroup jkqtpplottersupprt */
typedef QHash<Qt::KeyboardModifiers, JKQTPMouseWheelActions> JKQTPMouseWheelActionsHashMap;
/** \brief iterator for JKQTPMouseWheelActionsHashMap \see JKQTPMouseWheelActionsHashMap
* \ingroup jkqtpplottersupprt */
typedef JKQTPMouseWheelActionsHashMap::const_iterator JKQTPMouseWheelActionsHashMapIterator;
/** \brief data structure for storage of assigned JKQTPMouseDoubleClickActions \see JKQTPMouseDoubleClickActionsHashMapIterator
* \ingroup jkqtpplottersupprt */
typedef QHash<QPair<Qt::MouseButton,Qt::KeyboardModifiers>, JKQTPMouseDoubleClickActions> JKQTPMouseDoubleClickActionsHashMap;
/** \brief iterator for JKQTPMouseDoubleClickActionsHashMap \see JKQTPMouseDoubleClickActionsHashMap
* \ingroup jkqtpplottersupprt */
typedef JKQTPMouseDoubleClickActionsHashMap::const_iterator JKQTPMouseDoubleClickActionsHashMapIterator;
/** \brief data structure for storage of assigned JKQTPMouseMoveActions \see JKQTPMouseMoveActionsHashMapIterator
* \ingroup jkqtpplottersupprt */
typedef QHash<Qt::KeyboardModifiers, JKQTPMouseMoveActions> JKQTPMouseMoveActionsHashMap;
/** \brief iterator for JKQTPMouseMoveActionsHashMap \see JKQTPMouseMoveActionsHashMap
* \ingroup jkqtpplottersupprt */
typedef JKQTPMouseMoveActionsHashMap::const_iterator JKQTPMouseMoveActionsHashMapIterator;
/** \brief Specifies how a fill-color is derived from a given color
* \ingroup jkqtpplotter_styling_classes
*/
struct JKQTPLOTTER_LIB_EXPORT JKQTPColorDerivationMode {
public:
enum PredefinedModes {
JKQTPFFCMFullyTransparentColor, /*!< \brief fully transparent color */
JKQTPFFCMNoColor=JKQTPFFCMFullyTransparentColor, /*!< \brief fully transparent color */
JKQTPFFCMBlack, /*!< \brief fill with black */
JKQTPFFCMGrey75, /*!< \brief fill with 75% grey */
JKQTPFFCMGrey50, /*!< \brief fill with 50% grey */
JKQTPFFCMGrey25, /*!< \brief fill with 25% grey */
JKQTPFFCMWhite, /*!< \brief fill with white */
JKQTPFFCMBlackTransparent, /*!< \brief fill with black, slightly transparent */
JKQTPFFCMGrey75Transparent, /*!< \brief fill with 75% grey, slightly transparent */
JKQTPFFCMGrey50Transparent, /*!< \brief fill with 50% grey, slightly transparent */
JKQTPFFCMGrey25Transparent, /*!< \brief fill with 25% grey, slightly transparent */
JKQTPFFCMWhiteTransparent, /*!< \brief fill with white, slightly transparent */
JKQTPFFCMSameColor, /*!< \brief fill with the same color */
JKQTPFFCMSameNonTransparentColor, /*!< \brief fill with the same color, but remove any transparency (if any) */
JKQTPFFCMSameMoreTransparentColor, /*!< \brief fill with the a partly transparent color */
JKQTPFFCMSameEvenMoreTransparentColor, /*!< \brief fill with the a more transparent color than JKQTPFFCMMoreTransparentColor */
JKQTPFFCMSameLessTransparentColor, /*!< \brief fill with the a partly transparent color */
JKQTPFFCMSameEvenLessTransparentColor, /*!< \brief fill with the a more transparent color than JKQTPFFCMLessTransparentColor*/
JKQTPFFCMInvertedColor, /*!< \brief fill with the inverted color */
JKQTPFFCMInvertedTransparentColor, /*!< \brief fill with the inverted color, slightly transparent */
JKQTPFFCMInvertedNonTransparentColor, /*!< \brief fill with the inverted color, non-transparent (even if the basecolor had some transparency) */
JKQTPFFCMLighterColor, /*!< \brief fill with the a lighter color */
JKQTPFFCMEvenLighterColor, /*!< \brief fill with the an even lighter color than JKQTPFFCMLighterColor */
JKQTPFFCMDarkerColor, /*!< \brief fill with the a darker color */
JKQTPFFCMEvenDarkerColor, /*!< \brief fill with the an even darker color than JKQTPFFCMDarkerColor */
JKQTPFFCMLighterAndTransparentColor, /*!< \brief fill with the a lighter color, that is in addition a bit transparent */
JKQTPFFCMEvenLighterAndTransparentColor, /*!< \brief fill with the an even lighter color than JKQTPFFCMLighterColor, that is in addition a bit transparent */
JKQTPFFCMDarkerAndTransparentColor, /*!< \brief fill with the a darker color, that is in addition a bit transparent */
JKQTPFFCMEvenDarkerAndTransparentColor, /*!< \brief fill with the an even darker color than JKQTPFFCMDarkerColor, that is in addition a bit transparent */
JKQTPFFCMLighterAndNonTransparentColor, /*!< \brief fill with the a lighter color, that is non-transparent (even if the basecolor had some transparency) */
JKQTPFFCMEvenLighterAndNonTransparentColor, /*!< \brief fill with the an even lighter color than JKQTPFFCMLighterColor, that is non-transparent (even if the basecolor had some transparency) */
JKQTPFFCMDarkerAndNonTransparentColor, /*!< \brief fill with the a darker color, that is non-transparent (even if the basecolor had some transparency) */
JKQTPFFCMEvenDarkerAndNonTransparentColor, /*!< \brief fill with the an even darker color than JKQTPFFCMDarkerColor, that is non-transparent (even if the basecolor had some transparency) */
JKQTPFFCMmax=JKQTPFFCMEvenDarkerAndNonTransparentColor
};
/** \brief for compatibility: use one of several predefined settings to iitialize object */
JKQTPColorDerivationMode(PredefinedModes mode=JKQTPFFCMSameColor);
/** \brief initialize object from a string (calls fromString() ) */
JKQTPColorDerivationMode(const QString& mode);
enum ColorChangeMode {
SameColor,
ReplaceColorAndTransparency,
ReplaceColorNotTransparency,
DarkerColor,
LighterColor,
InvertColor
};
/** \brief specifies how the color should change */
ColorChangeMode colorModification;
/** \brief replacement color when colorModification==ColorChangeMode::ReplaceColor */
QColor targetColor;
/** \brief strength of colorModification-settings, such as ColorChangeMode::DarkerColor or ColorChangeMode::LighterColor */
float colorModificationStrength;
enum TransparencyChangeMode {
SameTransparency,
ReplaceTransparency,
MoreTransparent,
LessTransparent
};
/** \brief specifies how the transparency of the color chould change */
TransparencyChangeMode transparencyModification;
/** \brief target transparency (0:non-transparennt .. 1:fully-transparent, i.e. 1-alphaF!!!) for TransparencyChangeMode::ReplaceTransparency */
float targetTransparency;
/** \brief strength of transparencyModification-settings, such as TransparencyChangeMode::MoreTransparent or TransparencyChangeMode::LessTransparent */
float transparencyModficationStrength;
/** \brief convert object contents into a string */
QString toString() const;
/** \brief read values from a string */
static JKQTPColorDerivationMode fromString(const QString& mode);
/** \brief apply the modifications encoded in this object to a given color */
QColor apply(const QColor& basecolor) const;
/** \brief compares two objects for equality */
bool operator==(const JKQTPColorDerivationMode& other) const;
/** \brief determines whether the current object equals a default-initialized object with the given parameter, i.e. this is equivalent to calling \code operato==(JKQTPColorDerivationMode(other)) \endcode */
bool operator==(const PredefinedModes& other) const;
};
/** \brief use a JKQTPColorDerivationMode to derive a color from \a col as specified
* \ingroup jkqtpplotter_styling_classes
*
* \param mode the mode of how to modify the given color \a basecolor
* \param basecolor the color in which to base the derivation
*
* \see JKQTPColorDerivationMode
*/
JKQTPLOTTER_LIB_EXPORT QColor JKQTPGetDerivedColor(JKQTPColorDerivationMode mode, const QColor& basecolor);
/** \brief construct a QColor, based on the given \a color, but with alpha set to the specified value \a alphaF
* \ingroup jkqtpplotter_styling_classes
* \see QColorWithAlpha()
*/
inline QColor QColorWithAlphaF(const QColor& color, qreal alphaF) {
QColor c=color;
c.setAlphaF(alphaF);
return c;
}
/** \brief construct a QColor, based on the given \a color, but with alpha set to the specified value \a alpha
* \ingroup jkqtpplotter_styling_classes
* \see QColorWithAlphaF()
*/
inline QColor QColorWithAlpha(const QColor& color, int alpha) {
QColor c=color;
c.setAlpha(alpha);
return c;
}
/** \brief convert a JKQTPColorDerivationMode to a <a href="http://doc.qt.io/qt-5/qstring.html">QString</a>
* \ingroup jkqtpplotter_styling_classes
*
* \see String2JKQTPColorDerivationMode(), JKQTPColorDerivationMode
*/
JKQTPLOTTER_LIB_EXPORT QString JKQTPColorDerivationMode2String(JKQTPColorDerivationMode mode);
/** \brief convert a <a href="http://doc.qt.io/qt-5/qstring.html">QString</a> (created by JKQTPColorDerivationMode2String() ) to JKQTPColorDerivationMode
* \ingroup jkqtpplotter_styling_classes
*
* \see JKQTPColorDerivationMode2String(), JKQTPColorDerivationMode
*/
JKQTPLOTTER_LIB_EXPORT JKQTPColorDerivationMode String2JKQTPColorDerivationMode(const QString &mode);
/** \brief drawing flags for a coordinate axis
* \ingroup jkqtpplottersupprt
*
* \note This enum provides the elements for \ref JKQTPCADrawMode, which is actually used
* throughout the code.
*
* \see JKQTPCADrawMode, JKQTPCoordinateAxisStyle
*/
enum JKQTPCADrawModeElements {
JKQTPCADMLine=0x01, /*!< \brief draw axis as thick line \image html axisstyle/JKQTPCADMLine.png */
JKQTPCADMTicks=0x02, /*!< \brief draw axis ticks \image html axisstyle/JKQTPCADMTicks.png */
JKQTPCADMTickLabels=0x04, /*!< \brief draw axis tick labels \image html axisstyle/JKQTPCADMTickLabels.png */
JKQTPCADMAxisLabel=0x08, /*!< \brief draw axis axis Label \image html axisstyle/JKQTPCADMAxisLabel.png */
JKQTPCADMMaxArrow=0x0100, /*!< \brief an open arrow at the max-end of the axis \image html axisstyle/JKQTPCADMMaxArrow.png */
JKQTPCADMMaxFilledArrow=0x0200, /*!< \brief draw a filled arrow at the max-end of the axis \image html axisstyle/JKQTPCADMMaxFilledArrow.png */
JKQTPCADMMinArrow=0x1000, /*!< \brief an open arrow at the end of the axis at the min-end of the axis \image html axisstyle/JKQTPCADMMinArrow.png */
JKQTPCADMMinFilledArrow=0x2000, /*!< \brief draw a filled arrow at the min-end of the axis \image html axisstyle/JKQTPCADMMinFilledArrow.png */
JKQTPCADMLineTicksTickLabels=JKQTPCADMLine|JKQTPCADMTicks|JKQTPCADMTickLabels, /*!< \brief draw axis with ticks, line and tick labels \image html axisstyle/JKQTPCADMLineTicksTickLabels.png */
JKQTPCADMLineTicks=JKQTPCADMLine|JKQTPCADMTicks, /*!< \brief draw axis with ticks and line \image html axisstyle/JKQTPCADMLineTicks.png */
JKQTPCADMTicksTickLabelsAxisLabel=JKQTPCADMTicks|JKQTPCADMTickLabels|JKQTPCADMAxisLabel, /*!< \brief draw axis with ticks, tick labels and axisLabel \image html axisstyle/JKQTPCADMTicksTickLabelsAxisLabel.png */
JKQTPCADMTicksTickLabels=JKQTPCADMTicks|JKQTPCADMTickLabels, /*!< \brief draw axis with ticks and tick labels \image html axisstyle/JKQTPCADMTicksTickLabels.png */
JKQTPCADMTickLabelsAxisLabel=JKQTPCADMTickLabels|JKQTPCADMAxisLabel, /*!< \brief draw axis tick labels and axisLabel \image html axisstyle/JKQTPCADMTickLabelsAxisLabel.png */
JKQTPCADMnone=0x0000, /*!< \brief draw no axis \image html axisstyle/JKQTPCADMnone.png */
JKQTPCADMcomplete=JKQTPCADMLine|JKQTPCADMTicks|JKQTPCADMTickLabels|JKQTPCADMAxisLabel, /*!< \brief draw axis withline, ticks, ticklabels and axis label \image html axisstyle/JKQTPCADMcomplete.png */
JKQTPCADMcompleteMaxArrow=JKQTPCADMcomplete|JKQTPCADMMaxFilledArrow, /*!< \brief draw axis withline, ticks, ticklabels and axis label and an arrow pointing to the max-side of the axis \image html axisstyle/JKQTPCADMcompleteMaxArrow.png */
JKQTPCADMcompleteMinMaxArrow=JKQTPCADMcomplete|JKQTPCADMMaxFilledArrow|JKQTPCADMMinFilledArrow, /*!< \brief draw axis withline, ticks, ticklabels and axis label and arrows pointing to the min and max side of the axis \image html axisstyle/JKQTPCADMcompleteMinMaxArrow.png */
};
/** \brief drawing mode for a coordinate axis
* \ingroup jkqtplotter_basegraphserrors
*
* \qFlagsNote{JKQTPCADrawMode,JKQTPCADrawModeElements}
*
* \see JKQTPCADrawModeElements, JKQTPCoordinateAxisStyle
*/
Q_DECLARE_FLAGS(JKQTPCADrawMode, JKQTPCADrawModeElements)
Q_DECLARE_OPERATORS_FOR_FLAGS(JKQTPCADrawMode)
/** \brief converts a JKQTPCADrawMode variable into a human-readable string
* \ingroup jkqtpplottersupprt
*/
JKQTPLOTTER_LIB_EXPORT QString JKQTPCADrawMode2String(JKQTPCADrawMode pos);
/** \brief converts a string into a JKQTPCADrawMode
* \ingroup jkqtpplottersupprt
*/
JKQTPLOTTER_LIB_EXPORT JKQTPCADrawMode String2JKQTPCADrawMode(const QString& pos);
/** \brief display mode for the axis labels
* \ingroup jkqtpplottersupprt */
enum JKQTPCALabelType {
JKQTPCALTdefault=0, /*!< \brief simply print the numbers \image html axisstyle/JKQTPCALTdefault.png */
JKQTPCALTscientific, /*!< \brief print the numbers in scientific notation, e.g. \c "1.23e-4" \image html axisstyle/JKQTPCALTscientific.png */
JKQTPCALTexponentCharacter, /*!< \brief print the numbers and show a unit character, i.e. 5&mu; for \f$ 5\cdot 10^{-6} \f$ , \c 3k for \f$ 3\cdot 10^3 \f$ ... \image html axisstyle/JKQTPCALTexponentCharacter.png */
JKQTPCALTexponent, /*!< \brief show numbers in exponential for, e.g. \f$ 3\cdot 10^5 \f$ ... \image html axisstyle/JKQTPCALTexponent.png */
JKQTPCALTprintf, /*!< \brief generate axis label from an arbitrary "printf" formatting string (see e.g. https://en.wikipedia.org/wiki/Printf_format_string ). The first data parameter is the tick value as \c double an the second is tickUnitName as string. The following image shows an example for \c "y=%+.2f": \image html axisstyle/JKQTPCALTprintf.png */
JKQTPCALTdate, /*!< \brief show numbers as dates \image html axisstyle/JKQTPCALTdate.png */
JKQTPCALTtime, /*!< \brief show numbers as times \image html axisstyle/JKQTPCALTtime.png*/
JKQTPCALTdatetime, /*!< \brief show numbers as times \image html axisstyle/JKQTPCALTdatetime.png */
JKQTPCALTfrac, /*!< \brief show numbers as fraction, the number is first rounded to the given precision and then a fraction is calculated and displayed like \f$ \frac{1}{2} \f$ \image html axisstyle/JKQTPCALTfrac.png */
JKQTPCALTslashfrac, /*!< \brief show numbers as fraction, the number is first rounded to the given precision and then a fraction is calculated and displayed like \c 1/2 \image html axisstyle/JKQTPCALTslashfrac.png */
JKQTPCALTsfrac, /*!< \brief show numbers as fraction, the number is first rounded to the given precision and then a fraction is calculated and displayed using \c \\sfrac{1}{2} \image html axisstyle/JKQTPCALTsfrac.png */
JKQTPCALTintfrac, /*!< \brief show numbers as integral+fraction, the number is first rounded to the given precision and then a fraction is calculated and displayed like \f$ -3\frac{1}{2} \f$ \image html axisstyle/JKQTPCALTintfrac.png */
JKQTPCALTintslashfrac, /*!< \brief show numbers as integral+fraction, the number is first rounded to the given precision and then a fraction is calculated and displayed like \c 1/2 \image html axisstyle/JKQTPCALTintslashfrac.png */
JKQTPCALTintsfrac, /*!< \brief show numbers as integral+fraction, the number is first rounded to the given precision and then a fraction is calculated and displayed using \c \\sfrac{1}{2} \image html axisstyle/JKQTPCALTintsfrac.png */
#if defined(__cpp_lib_format) || DOXYGEN
JKQTPCALTformat, /*!< \brief generate axis label from an arbitrary "std::format" formatting string (see e.g. https://en.cppreference.com/w/cpp/utility/format/formatter#Standard_format_specification ). The first data parameter is the tick value as \c double an the second is tickUnitName as string. The following image shows an example for \c "\\texttt{{ y={:*^+8.1f}}}": \image html axisstyle/JKQTPCALTformat.png
\b NOte: This option is only available for C++20 and above, use the CMake option \c JKQtPlotter_ENABLED_CXX20=ON if your compiler supports this. */
#endif
JKQTPCALTcount,
JKQTPCALTmax=JKQTPCALTcount-1
};
/** \brief mode of the axis ticks
* \ingroup jkqtpplottersupprt */
enum JKQTPLabelTickMode {
JKQTPLTMLinOrPower=0, /*!< \brief linear, or log, depending on whether the axis is log \image html axisstyle/JKQTPLTMLinOrPower.png */
JKQTPLTMLin, /*!< \brief always linear (even for log-axes) \image html axisstyle/JKQTPLTMLin.png */
JKQTPLTMPower, /*!< \brief powers (of the log-base) \image html axisstyle/JKQTPLTMPower.png */
JKQTPLTMmax=JKQTPLTMPower
};
/** \brief converts a JKQTPLabelTickMode variable into a human-readable string
* \ingroup jkqtpplottersupprt
*/
JKQTPLOTTER_LIB_EXPORT QString JKQTPLabelTickMode2String(JKQTPLabelTickMode pos);
/** \brief converts a string into a JKQTPLabelTickMode
* \ingroup jkqtpplottersupprt
*/
JKQTPLOTTER_LIB_EXPORT JKQTPLabelTickMode String2JKQTPLabelTickMode(const QString& pos);
/** \brief converts a JKQTPCALabelType variable into a human-readable string
* \ingroup jkqtpplottersupprt
*/
JKQTPLOTTER_LIB_EXPORT QString JKQTPCALabelType2String(JKQTPCALabelType pos);
/** \brief converts a string into a JKQTPCALabelType
* \ingroup jkqtpplottersupprt
*/
JKQTPLOTTER_LIB_EXPORT JKQTPCALabelType String2JKQTPCALabelType(const QString& pos);
/** \brief position of the axis labels
* \ingroup jkqtpplottersupprt
*/
enum JKQTPLabelPosition {
JKQTPLabelMin=0, /*!< \brief the axis label is near the min value of the axis (left/bottom) */
JKQTPLabelMax, /*!< \brief the axis label is near the max value of the axis (right/top) */
JKQTPLabelCenter, /*!< \brief the label is at the center of the axis */
JKQTPLabelPositionMax=JKQTPLabelCenter
};
/** \brief converts a JKQTPLabelPosition variable into a human-readable string
* \ingroup jkqtpplottersupprt
*/
JKQTPLOTTER_LIB_EXPORT QString JKQTPLabelPosition2String(JKQTPLabelPosition pos);
/** \brief converts a string into a JKQTPLabelPosition
* \ingroup jkqtpplottersupprt
*/
JKQTPLOTTER_LIB_EXPORT JKQTPLabelPosition String2JKQTPLabelPosition(const QString& pos);
/** \brief position of the key
* \ingroup jkqtpplottersupprt
*/
enum JKQTPKeyPosition {
JKQTPKeyOutsideTopRight=0, /*!< \brief the key is positioned on the right side of the graph */
JKQTPKeyOutsideTopLeft, /*!< \brief the key is positioned on the left side of the graph */
JKQTPKeyOutsideLeftTop, /*!< \brief the key is positioned above the graph */
JKQTPKeyOutsideLeftBottom, /*!< \brief the key is positioned below the graph */
JKQTPKeyOutsideRightBottom, /*!< \brief the key is positioned on the right side of the graph */
JKQTPKeyOutsideRightTop, /*!< \brief the key is positioned on the left side of the graph */
JKQTPKeyOutsideBottomLeft, /*!< \brief the key is positioned above the graph */
JKQTPKeyOutsideBottomRight, /*!< \brief the key is positioned below the graph */
JKQTPKeyInsideTopRight, /*!< \brief the key is positioned inside on the right side of the graph, but inside the graph*/
JKQTPKeyInsideTopLeft, /*!< \brief the key is positioned inside on the left side of the graph */
JKQTPKeyInsideBottomLeft, /*!< \brief the key is positioned inside on the upper bound of the graph */
JKQTPKeyInsideBottomRight, /*!< \brief the key is positioned inside on the lower bound of the graph */
JKQTPKeyPositionMax=JKQTPKeyInsideBottomRight
};
/** \brief converts a JKQTPLabelPosition variable into a human-readable string
* \ingroup jkqtpplottersupprt
*/
JKQTPLOTTER_LIB_EXPORT QString JKQTPKeyPosition2String(JKQTPKeyPosition pos);
/** \brief converts a string into a JKQTPLabelPosition
* \ingroup jkqtpplottersupprt
*/
JKQTPLOTTER_LIB_EXPORT JKQTPKeyPosition String2JKQTPKeyPosition(const QString& pos);
/** \brief layout of the key
* \ingroup jkqtpplottersupprt
*/
enum JKQTPKeyLayout {
JKQTPKeyLayoutOneColumn=0, /*!< \brief the key consists of one column */
JKQTPKeyLayoutOneRow, /*!< \brief the key consists of one row */
JKQTPKeyLayoutMultiColumn, /*!< \brief the key consists of multiple columns */
JKQTPKeyLayoutMax=JKQTPKeyLayoutMultiColumn
};
/** \brief converts a JKQTPKeyLayout variable into a human-readable string
* \ingroup jkqtpplottersupprt
*/
JKQTPLOTTER_LIB_EXPORT QString JKQTPKeyLayout2String(JKQTPKeyLayout pos);
/** \brief converts a String into a JKQTPKeyLayout
* \ingroup jkqtpplottersupprt
*/
JKQTPLOTTER_LIB_EXPORT JKQTPKeyLayout String2JKQTPKeyLayout(const QString& pos);
/** \brief used to represent the position of other graphs in \ref jkqtplotter_base_saveprint
* \ingroup jkqtpplottersupprt
* \internal
*/
struct JKQTPLOTTER_LIB_EXPORT JKQTPGridPrintingItem {
/** \brief logic x-position of a graph, relative to the current JKQtPlotter */
size_t x;
/** \brief logic y-position of a graph, relative to the current JKQtPlotter */
size_t y;
/** \brief JKQTBasePlotter */
JKQTBasePlotter* plotter;
};
/** \brief specifies the plot styles for the error information, e.g. error bars, boxes, lines ...
* \ingroup jkqtplotter_basegraphserrors
*
* \note This enum provides the elements for \ref JKQTPErrorPlotstyle, which is actually used
* throughout the code.
*
* \see JKQTPErrorPlotstyle, JKQTPXGraphErrorData, JKQTPYGraphErrorData
*/
enum JKQTPErrorPlotstyleElements {
JKQTPNoError=0x00, /*!< \brief don't show error information \image html errorindicators/JKQTPNoError.png */
JKQTPErrorSimpleBars=0x01, /*!< \brief simplified error bars for each data point \image html errorindicators/JKQTPErrorSimpleBars.png */
JKQTPErrorLines=0x04, /*!< \brief a second and third graph line above and below the actual data which indicates the error value \image html errorindicators/JKQTPErrorLines.png */
JKQTPErrorPolygons=0x08, /*!< \brief line error lines, but with filled range in between \image html errorindicators/JKQTPErrorPolygons.png */
JKQTPErrorEllipses=0x10, /*!< \brief an ellipse spanned by the errors \image html errorindicators/JKQTPErrorEllipses.png */
JKQTPErrorBoxes=0x20, /*!< \brief a box spanned by the errors \image html errorindicators/JKQTPErrorBoxes.png */
JKQTPErrorDirectionBoth=0x000, /*!< \brief do not draw half error-bars, but in both directions (default) \image html errorindicators/JKQTPErrorBars.png */
JKQTPErrorDirectionOutwards=0x100, /*!< \brief used to specify the directon of half error bars: outwards pointing \image html errorindicators/JKQTPErrorHalfBarsOutwards.png */
JKQTPErrorDirectionInwards=0x200, /*!< \brief used to specify the directon of half error bars: inwards pointing \image html errorindicators/JKQTPErrorHalfBarsInwards.png */
JKQTPErrorDirectionAbove=04200, /*!< \brief used to specify the directon of half error bars: above pointing \image html errorindicators/JKQTPErrorHalfBarsAbove.png */
JKQTPErrorDirectionBelow=0x800, /*!< \brief used to specify the directon of half error bars: below pointing \image html errorindicators/JKQTPErrorHalfBarsBelow.png */
JKQTPErrorIndicatorNone=0x0000, /*!< \brief used to specify that error bars shall be un-decorated i.e. "simple error-bars" */
JKQTPErrorIndicatorBar=0x1000, /*!< \brief used to specify that error bars shall be decorated by bars \image html errorindicators/JKQTPErrorIndicatorBar.png */
JKQTPErrorIndicatorArrows=0x2000, /*!< \brief used to specify that error bars shall be decorated by arrows \image html errorindicators/JKQTPErrorIndicatorArrows.png */
JKQTPErrorIndicatorInwardArrows=0x4000, /*!< \brief used to specify that error bars shall be decorated by arrows \image html errorindicators/JKQTPErrorIndicatorInwardArrows.png */
JKQTPErrorArrows=JKQTPErrorSimpleBars|JKQTPErrorIndicatorArrows, /*!< \brief error bars decorated with arrows for each data point \image html errorindicators/JKQTPErrorArrows.png */
JKQTPErrorInwardArrows=JKQTPErrorSimpleBars|JKQTPErrorIndicatorInwardArrows, /*!< \brief error bars decorated with inwards-pointing arrows for each data point \image html errorindicators/JKQTPErrorInwardArrows.png */
JKQTPErrorBars=JKQTPErrorSimpleBars|JKQTPErrorIndicatorBar, /*!< \brief error bars for each data point \image html errorindicators/JKQTPErrorBars.png */
JKQTPErrorSimpleBarsPolygons=JKQTPErrorSimpleBars|JKQTPErrorPolygons, /*!< \brief simplified error barsand polygons for each data point \image html errorindicators/JKQTPErrorSimpleBarsPolygons.png */
JKQTPErrorSimpleBarsLines=JKQTPErrorSimpleBars|JKQTPErrorLines, /*!< \brief simplified error bars and line for each data point \image html errorindicators/JKQTPErrorSimpleBarsLines.png */
JKQTPErrorHalfBarsOutwards=JKQTPErrorBars|JKQTPErrorDirectionOutwards, /*!< \brief half error bars for each data point, pointing outwards \image html errorindicators/JKQTPErrorHalfBarsOutwards.png */
JKQTPErrorHalfBarsInwards=JKQTPErrorBars|JKQTPErrorDirectionInwards, /*!< \brief half error bars for each data point, pointing inwards \image html errorindicators/JKQTPErrorHalfBarsInwards.png */
JKQTPErrorHalfBarsAbove=JKQTPErrorBars|JKQTPErrorDirectionAbove, /*!< \brief half error bars for each data point, pointing up \image html errorindicators/JKQTPErrorHalfBarsAbove.png */
JKQTPErrorHalfBarsBelow=JKQTPErrorBars|JKQTPErrorDirectionBelow, /*!< \brief half error bars for each data point, pointing down \image html errorindicators/JKQTPErrorHalfBarsBelow.png */
JKQTPErrorBarsLines=JKQTPErrorBars|JKQTPErrorLines, /*!< \brief error bars and lines for each data point \image html errorindicators/JKQTPErrorBarsLines.png */
JKQTPErrorBarsPolygons=JKQTPErrorBars|JKQTPErrorPolygons, /*!< \brief error bars and polygons for each data point \image html errorindicators/JKQTPErrorBarsPolygons.png */
};
/** \brief specifies the plot styles for the error information, e.g. error bars, boxes, lines ...
* \ingroup jkqtplotter_basegraphserrors
*
* \qFlagsNote{JKQTPErrorPlotstyle,JKQTPErrorPlotstyleElements}
*
* \see JKQTPErrorPlotstyleElements, JKQTPXGraphErrorData, JKQTPYGraphErrorData
*/
Q_DECLARE_FLAGS(JKQTPErrorPlotstyle, JKQTPErrorPlotstyleElements)
Q_DECLARE_OPERATORS_FOR_FLAGS(JKQTPErrorPlotstyle)
/** \brief converts a JKQTPErrorPlotstyle variable into a human-readable string
* \ingroup jkqtplotter_basegraphserrors
*/
JKQTPLOTTER_LIB_EXPORT QString JKQTPErrorPlotstyle2String(JKQTPErrorPlotstyle pos);
/** \brief converts a String into a JKQTPErrorPlotstyle
* \ingroup jkqtplotter_basegraphserrors
*/
JKQTPLOTTER_LIB_EXPORT JKQTPErrorPlotstyle String2JKQTPErrorPlotstyle(const QString& pos);
/** \brief plot styles for the error information
* \ingroup jkqtplotter_linesymbolgraphs_line
*
* \see JKQTPSpecialLineTypeComboBox
*/
enum JKQTPSpecialLineType {
JKQTPStepLeft=0, /*!< \brief datapoint is on the left edge of the hor. step line \image html JKQTPStepLeft.png */
JKQTPStepCenter=1, /*!< \brief datapoint is centered on the hor. step line \image html JKQTPStepCenter.png */
JKQTPStepRight=2, /*!< \brief datapoint is on the right edge of the hor. step line \image html JKQTPStepRight.png */
JKQTPStepAverage=3, /*!< \brief horizontal line on the level of the average between two points + vertical lines to the points \image html JKQTPStepAverage.png */
JKQTPDirectLine=4, /*!< \brief no step, but connects the two datapoints with a straight line \image html JKQTPDirectLine.png */
};
/** \brief converts a JKQTPSpecialLineType variable into a human-readable string
* \ingroup jkqtplotter_linesymbolgraphs_line
*/
JKQTPLOTTER_LIB_EXPORT QString JKQTPSpecialLineType2String(JKQTPSpecialLineType pos);
/** \brief converts a String into a JKQTPSpecialLineType
* \ingroup jkqtplotter_linesymbolgraphs_line
*/
JKQTPLOTTER_LIB_EXPORT JKQTPSpecialLineType String2JKQTPSpecialLineType(const QString& pos);
#endif // JKQTPTOOLS_H_INCLUDED