JKQtPlotter/lib/jkqtplotter/jkqtptools.h

635 lines
31 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 "jkqtcommon/jkqtpstringtools.h"
#include "jkqtcommon/jkqtpdebuggingtools.h"
#include "jkqtcommon/jkqtpmathtools.h"
#include "jkqtcommon_statistics_and_math/jkqtpalgorithms.h"
#include "jkqtcommon/jkqtpcodestructuring.h"
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
*/
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
};
/** \brif 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
*
* \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
* \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
* \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
*
* \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
*
* \see JKQTPColorDerivationMode2String(), JKQTPColorDerivationMode
*/
JKQTPLOTTER_LIB_EXPORT JKQTPColorDerivationMode String2JKQTPColorDerivationMode(const QString &mode);
/** \brief display mode for an axis
* \ingroup jkqtpplottersupprt */
enum JKQTPCADrawMode {
JKQTPCADMcomplete=0, /*!< \brief draw axis with ticks, ticklabels and axis label */
JKQTPCADMLineTicksTickLabels, /*!< \brief draw axis with ticks, line and tick labels */
JKQTPCADMLineTicks, /*!< \brief draw axis with ticks and line */
JKQTPCADMLine, /*!< \brief draw axis as thick line */
JKQTPCADMTicksTickLabelsAxisLabel, /*!< \brief draw axis with ticks, tick labels and axisLabel */
JKQTPCADMTicksTickLabels, /*!< \brief draw axis with ticks and tick labels */
JKQTPCADMTickLabelsAxisLabel, /*!< \brief draw axis tick labels and axisLabel */
JKQTPCADMTickLabels, /*!< \brief draw axis tick labels */
JKQTPCADMTicks, /*!< \brief draw axis with ticks */
JKQTPCADMnone, /*!< \brief draw no axis */
JKQTPCADMmax=JKQTPCADMnone
};
/** \brief determines whether JKQTPCADrawMode has the line
* \ingroup jkqtpplottersupprt
*/
JKQTPLOTTER_LIB_EXPORT bool JKQTPCADrawModeHasLine(JKQTPCADrawMode pos);
/** \brief determines whether JKQTPCADrawMode has ticks
* \ingroup jkqtpplottersupprt
*/
JKQTPLOTTER_LIB_EXPORT bool JKQTPCADrawModeHasTicks(JKQTPCADrawMode pos);
/** \brief determines whether JKQTPCADrawMode has tick labels
* \ingroup jkqtpplottersupprt
*/
JKQTPLOTTER_LIB_EXPORT bool JKQTPCADrawModeHasTickLabels(JKQTPCADrawMode pos);
/** \brief determines whether JKQTPCADrawMode has the axis label
* \ingroup jkqtpplottersupprt
*/
JKQTPLOTTER_LIB_EXPORT bool JKQTPCADrawModeHasAxisLabel(JKQTPCADrawMode pos);
/** \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, /*!< \brief simply print the numbers \image html JKQTPCALTdefault.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$ ... */
JKQTPCALTexponent, /*!< \brief show numbers in exponential for, e.g. \f$ 3\cdot 10^5 \f$ ... \image html JKQTPCALTexponent.png */
JKQTPCALTdate, /*!< \brief show numbers as dates \image html JKQTPCALTdate.png */
JKQTPCALTtime, /*!< \brief show numbers as times \image html JKQTPCALTtime.png*/
JKQTPCALTdatetime, /*!< \brief show numbers as times */
JKQTPCALTmax=JKQTPCALTdatetime
};
/** \brief mode of the axis ticks
* \ingroup jkqtpplottersupprt */
enum JKQTPLabelTickMode {
JKQTPLTMLinOrPower=0, /*!< \brief linear, or log, depending on whether the axis is log */
JKQTPLTMLin, /*!< \brief always linear (even for log-axes) */
JKQTPLTMPower, /*!< \brief powers (of the log-base) */
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 plot styles for the error information
* \ingroup jkqtplotter_basegraphserrors
*/
enum JKQTPErrorPlotstyle {
JKQTPErrorEllipses=10, /*!< \brief an ellipse spanned by the errors \image html JKQTPErrorEllipses.png */
JKQTPErrorBoxes=9, /*!< \brief a box spanned by the errors \image html JKQTPErrorBoxes.png */
JKQTPErrorSimpleBarsPolygons=8, /*!< \brief simplified error barsand polygons for each data point \image html JKQTPErrorSimpleBarsPolygons.png */
JKQTPErrorSimpleBarsLines=7, /*!< \brief simplified error bars and line for each data point \image html JKQTPErrorSimpleBarsLines.png */
JKQTPErrorSimpleBars=6, /*!< \brief simplified error bars for each data point \image html JKQTPErrorSimpleBars.png */
JKQTPErrorLines=5, /*!< \brief a second and third graph line above and below the actual data which indicates the error value \image html JKQTPErrorLines.png */
JKQTPErrorBars=4, /*!< \brief error bars for each data point \image html JKQTPErrorBars.png */
JKQTPErrorPolygons=3, /*!< \brief line error lines, but with filled range in between \image html JKQTPErrorPolygons.png */
JKQTPErrorBarsLines=2, /*!< \brief error bars and lines for each data point \image html JKQTPErrorBarsLines.png */
JKQTPErrorBarsPolygons=1, /*!< \brief error bars and polygons for each data point \image html JKQTPErrorBarsPolygons.png */
JKQTPNoError=0 /*!< \brief don't show error information \image html JKQTPNoError.png */
};
/** \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_simple
*
* \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_simple
*/
JKQTPLOTTER_LIB_EXPORT QString JKQTPSpecialLineType2String(JKQTPSpecialLineType pos);
/** \brief converts a String into a JKQTPSpecialLineType
* \ingroup jkqtplotter_linesymbolgraphs_simple
*/
JKQTPLOTTER_LIB_EXPORT JKQTPSpecialLineType String2JKQTPSpecialLineType(const QString& pos);
#endif // JKQTPTOOLS_H_INCLUDED