Engauge Digitizer 2
Loading...
Searching...
No Matches
TransformationStateDefined.cpp
1/******************************************************************************************************
2 * (C) 2014 markummitchell@github.com. This file is part of Engauge Digitizer, which is released *
3 * under GNU General Public License version 2 (GPLv2) or (at your option) any later version. See file *
4 * LICENSE or go to gnu.org/licenses for details. Distribution requires prior written permission. *
5 ******************************************************************************************************/
6
7#include "CallbackAxesCheckerFromAxesPoints.h"
8#include "Checker.h"
9#include "CmdMediator.h"
10#include "Document.h"
11#include "EnumsToQt.h"
12#include "FilterImage.h"
13#include "GridClassifier.h"
14#include "Logger.h"
15#include <QGraphicsScene>
16#include <QImage>
17#include <QTimer>
18#include "Transformation.h"
19#include "TransformationStateContext.h"
20#include "TransformationStateDefined.h"
21
22const int SECONDS_TO_MILLISECONDS = 1000.0;
23
25 QGraphicsScene &scene) :
27 m_axesChecker (new Checker (scene)),
28 m_timer (new QTimer)
29{
30 m_timer->setSingleShot (true);
31 connect (m_timer, SIGNAL (timeout()), this, SLOT (slotTimeout()));
32}
33
35 const Transformation &transformation,
36 const QString &selectedGraphCurve)
37{
38 LOG4CPP_INFO_S ((*mainCat)) << "TransformationStateDefined::begin";
39
40 if (!cmdMediator.document().modelGridRemoval().stable()) {
41
42 // Initialie or update the grid removal settings since they are not stable yet
43 initializeModelGridRemoval (cmdMediator,
44 transformation,
45 selectedGraphCurve);
46
47 }
48
49 updateAxesChecker (cmdMediator,
50 transformation);
51}
52
54 const Transformation & /* transformation */)
55{
56 LOG4CPP_INFO_S ((*mainCat)) << "TransformationStateDefined::end";
57
58 m_axesChecker->setVisible (false);
59}
60
61void TransformationStateDefined::initializeModelGridRemoval (CmdMediator &cmdMediator,
62 const Transformation &transformation,
63 const QString &selectedGraphCurve)
64{
65 LOG4CPP_INFO_S ((*mainCat)) << "TransformationStateDefined::initializeModelGridRemoval";
66
67 // Generate filtered image
68 FilterImage filterImage;
69 QPixmap pixmapFiltered = filterImage.filter (cmdMediator.document().pixmap().toImage(),
70 transformation,
71 selectedGraphCurve,
72 cmdMediator.document().modelColorFilter(),
73 cmdMediator.document().modelGridRemoval());
74
75 // Initialize grid removal settings so user does not have to
76 int countX, countY;
77 double startX, startY, stepX, stepY;
78 GridClassifier gridClassifier;
79 gridClassifier.classify (context().isGnuplot(),
80 pixmapFiltered,
81 transformation,
82 countX,
83 startX,
84 stepX,
85 countY,
86 startY,
87 stepY);
88 DocumentModelGridRemoval modelGridRemoval (startX,
89 startY,
90 stepX,
91 stepY,
92 countX,
93 countY);
94 cmdMediator.document().setModelGridRemoval (modelGridRemoval);
95}
96
97void TransformationStateDefined::slotTimeout()
98{
99 LOG4CPP_INFO_S ((*mainCat)) << "TransformationStateDefined::slotTimeout";
100
101 m_axesChecker->setVisible (false);
102}
103
104void TransformationStateDefined::startTimer (const DocumentModelAxesChecker &modelAxesChecker)
105{
106 LOG4CPP_INFO_S ((*mainCat)) << "TransformationStateDefined::startTimer";
107
108 m_axesChecker->setVisible (modelAxesChecker.checkerMode () != CHECKER_MODE_NEVER);
109
110 if (modelAxesChecker.checkerMode () == CHECKER_MODE_N_SECONDS) {
111
112 // Start timer
113 int milliseconds = modelAxesChecker.checkerSeconds() * SECONDS_TO_MILLISECONDS;
114 m_timer->start (milliseconds);
115 }
116}
117
119 const Transformation &transformation)
120{
122 Functor2wRet<const QString &, const Point&, CallbackSearchReturn> ftorWithCallback = functor_ret (ftor,
124 cmdMediator.iterateThroughCurvePointsAxes (ftorWithCallback);
125
126 m_axesChecker->prepareForDisplay (ftor.points(),
127 cmdMediator.document().modelCurveStyles().pointRadius(AXIS_CURVE_NAME),
128 cmdMediator.document().modelAxesChecker(),
129 cmdMediator.document().modelCoords(),
130 transformation,
131 cmdMediator.document().documentAxesPointsRequired());
132 m_axesChecker->setVisible (true);
133 startTimer (cmdMediator.document().modelAxesChecker());
134}
Callback for positioning the axes indicator according to the axes points.
CallbackSearchReturn callback(const QString &curveName, const Point &point)
Callback method.
Points points() const
Return the collected points as a polygon, in screen coordinates.
Box shape that is drawn through the three axis points, to temporarily (usually) or permanently (rarel...
Definition Checker.h:36
void prepareForDisplay(const QPolygonF &polygon, int pointRadius, const DocumentModelAxesChecker &modelAxesChecker, const DocumentModelCoords &modelCoords, DocumentAxesPointsRequired documentAxesPointsRequired)
Create the polygon from current information, including pixel coordinates, just prior to display.
Definition Checker.cpp:437
void setVisible(bool visible)
Show/hide this axes checker.
Definition Checker.cpp:565
Command queue stack.
Definition CmdMediator.h:24
void iterateThroughCurvePointsAxes(const Functor2wRet< const QString &, const Point &, CallbackSearchReturn > &ftorWithCallback)
See Curve::iterateThroughCurvePoints, for the single axes curve.
Document & document()
Provide the Document to commands, primarily for undo/redo processing.
int pointRadius(const QString &curveName) const
Get method for curve point radius.
Model for DlgSettingsAxesChecker and CmdSettingsAxesChecker.
int checkerSeconds() const
Get method for checker lifetime in seconds.
CheckerMode checkerMode() const
Get method for checker lifetime mode.
Model for DlgSettingsGridRemoval and CmdSettingsGridRemoval. The settings are unstable until the user...
bool stable() const
Get method for stable flag.
void setModelGridRemoval(const DocumentModelGridRemoval &modelGridRemoval)
Set method for DocumentModelGridRemoval.
Definition Document.cpp:877
QPixmap pixmap() const
Return the image that is being digitized.
Definition Document.cpp:681
DocumentModelAxesChecker modelAxesChecker() const
Get method for DocumentModelAxesChecker.
Definition Document.cpp:597
DocumentModelCoords modelCoords() const
Get method for DocumentModelCoords.
Definition Document.cpp:611
DocumentModelColorFilter modelColorFilter() const
Get method for DocumentModelColorFilter.
Definition Document.cpp:604
CurveStyles modelCurveStyles() const
Get method for CurveStyles.
Definition Document.cpp:618
DocumentAxesPointsRequired documentAxesPointsRequired() const
Get method for DocumentAxesPointsRequired.
Definition Document.cpp:326
DocumentModelGridRemoval modelGridRemoval() const
Get method for DocumentModelGridRemoval.
Definition Document.cpp:646
Filters an image using a combination of color filtering and grid removal.
Definition FilterImage.h:19
QPixmap filter(const QImage &imageUnfiltered, const Transformation &transformation, const QString &curveSelected, const DocumentModelColorFilter &modelColorFilter, const DocumentModelGridRemoval &modelGridRemoval) const
Filter original unfiltered image into filtered pixmap.
Classify the grid pattern in an original image.
void classify(bool isGnuplot, const QPixmap &originalPixmap, const Transformation &transformation, int &countX, double &startX, double &stepX, int &countY, double &startY, double &stepY)
Classify the specified image, and return the most probably x and y grid settings.
Base class for all transformation states. This serves as an interface to TransformationStateContext.
TransformationStateContext & context()
Reference to the TransformationStateContext that contains all the TransformationStateAbstractBase sub...
Context class for transformation state machine.
virtual void updateAxesChecker(CmdMediator &cmdMediator, const Transformation &transformation)
Apply the new DocumentModelAxesChecker.
TransformationStateDefined(TransformationStateContext &context, QGraphicsScene &scene)
Single constructor.
virtual void end(CmdMediator &cmdMediator, const Transformation &transformation)
Method that is called at the exact moment a state is exited. Typically called just before begin for t...
virtual void begin(CmdMediator &cmdMediator, const Transformation &transformation, const QString &selectedGraphCurve)
Method that is called at the exact moment a state is entered. Typically called just after end for the...
Affine transformation between screen and graph coordinates, based on digitized axis points.