Engauge Digitizer  2
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 
22 const 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().modelGridDisplay().stable()) {
41 
42  // Initialize or update the grid display settings since they are not stable yet
43  initializeModelGridDisplay (cmdMediator,
44  transformation);
45 
46  }
47 
48  if (!cmdMediator.document().modelGridRemoval().stable()) {
49 
50  // Initialize or update the grid removal settings since they are not stable yet
51  initializeModelGridRemoval (cmdMediator,
52  transformation,
53  selectedGraphCurve);
54 
55  }
56 
57  updateAxesChecker (cmdMediator,
58  transformation);
59 }
60 
62  const Transformation & /* transformation */)
63 {
64  LOG4CPP_INFO_S ((*mainCat)) << "TransformationStateDefined::end";
65 
66  m_axesChecker->setVisible (false);
67 }
68 
69 void TransformationStateDefined::initializeModelGridDisplay (CmdMediator &cmdMediator,
70  const Transformation &transformation)
71 {
72  cmdMediator.document().initializeGridDisplay (transformation);
73 }
74 
75 void TransformationStateDefined::initializeModelGridRemoval (CmdMediator &cmdMediator,
76  const Transformation &transformation,
77  const QString &selectedGraphCurve)
78 {
79  LOG4CPP_INFO_S ((*mainCat)) << "TransformationStateDefined::initializeModelGridRemoval";
80 
81  // Generate filtered image
82  FilterImage filterImage;
83  QPixmap pixmapFiltered = filterImage.filter (cmdMediator.document().pixmap().toImage(),
84  transformation,
85  selectedGraphCurve,
86  cmdMediator.document().modelColorFilter(),
87  cmdMediator.document().modelGridRemoval());
88 
89  // Initialize grid removal settings so user does not have to
90  int countX, countY;
91  double startX, startY, stepX, stepY;
92  GridClassifier gridClassifier;
93  gridClassifier.classify (context().isGnuplot(),
94  pixmapFiltered,
95  transformation,
96  countX,
97  startX,
98  stepX,
99  countY,
100  startY,
101  stepY);
102  DocumentModelGridRemoval modelGridRemoval (startX,
103  startY,
104  stepX,
105  stepY,
106  countX,
107  countY);
108  cmdMediator.document().setModelGridRemoval (modelGridRemoval);
109 }
110 
111 void TransformationStateDefined::slotTimeout()
112 {
113  LOG4CPP_INFO_S ((*mainCat)) << "TransformationStateDefined::slotTimeout";
114 
115  m_axesChecker->setVisible (false);
116 }
117 
118 void TransformationStateDefined::startTimer (const DocumentModelAxesChecker &modelAxesChecker)
119 {
120  LOG4CPP_INFO_S ((*mainCat)) << "TransformationStateDefined::startTimer";
121 
122  m_axesChecker->setVisible (modelAxesChecker.checkerMode () != CHECKER_MODE_NEVER);
123 
124  if (modelAxesChecker.checkerMode () == CHECKER_MODE_N_SECONDS) {
125 
126  // Start timer
127  int milliseconds = modelAxesChecker.checkerSeconds() * SECONDS_TO_MILLISECONDS;
128  m_timer->start (milliseconds);
129  }
130 }
131 
133  const Transformation &transformation)
134 {
136  Functor2wRet<const QString &, const Point&, CallbackSearchReturn> ftorWithCallback = functor_ret (ftor,
138  cmdMediator.iterateThroughCurvePointsAxes (ftorWithCallback);
139 
140  m_axesChecker->prepareForDisplay (ftor.points(),
141  cmdMediator.document().modelCurveStyles().pointRadius(AXIS_CURVE_NAME),
142  cmdMediator.document().modelAxesChecker(),
143  cmdMediator.document().modelCoords(),
144  transformation,
145  cmdMediator.document().documentAxesPointsRequired());
146  m_axesChecker->setVisible (true);
147  startTimer (cmdMediator.document().modelAxesChecker());
148 }
Base class for all transformation states. This serves as an interface to TransformationStateContext.
bool stable() const
Get method for stable flag.
void setModelGridRemoval(const DocumentModelGridRemoval &modelGridRemoval)
Set method for DocumentModelGridRemoval.
Definition: Document.cpp:1022
Context class for transformation state machine.
DocumentModelGridRemoval modelGridRemoval() const
Get method for DocumentModelGridRemoval.
Definition: Document.cpp:731
int checkerSeconds() const
Get method for checker lifetime in seconds.
CallbackSearchReturn callback(const QString &curveName, const Point &point)
Callback method.
DocumentAxesPointsRequired documentAxesPointsRequired() const
Get method for DocumentAxesPointsRequired.
Definition: Document.cpp:360
DocumentModelColorFilter modelColorFilter() const
Get method for DocumentModelColorFilter.
Definition: Document.cpp:682
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.
Definition: FilterImage.cpp:21
Document & document()
Provide the Document to commands, primarily for undo/redo processing.
Definition: CmdMediator.cpp:72
Box shape that is drawn through the three axis points, to temporarily (usually) or permanently (rarel...
Definition: Checker.h:33
bool stable() const
Get method for stable flag.
virtual void updateAxesChecker(CmdMediator &cmdMediator, const Transformation &transformation)
Apply the new DocumentModelAxesChecker.
TransformationStateContext & context()
Reference to the TransformationStateContext that contains all the TransformationStateAbstractBase sub...
CheckerMode checkerMode() const
Get method for checker lifetime mode.
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:130
Affine transformation between screen and graph coordinates, based on digitized axis points...
Points points() const
Return the collected points as a polygon, in screen coordinates.
TransformationStateDefined(TransformationStateContext &context, QGraphicsScene &scene)
Single constructor.
DocumentModelGridDisplay modelGridDisplay() const
Get method for DocumentModelGridDisplay.
Definition: Document.cpp:724
int pointRadius(const QString &curveName) const
Get method for curve point radius.
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...
Callback for positioning the axes indicator according to the axes points.
Filters an image using a combination of color filtering and grid removal.
Definition: FilterImage.h:18
Model for DlgSettingsAxesChecker and CmdSettingsAxesChecker.
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...
Classify the grid pattern in an original image.
Command queue stack.
Definition: CmdMediator.h:23
void setVisible(bool visible)
Show/hide this axes checker.
Definition: Checker.cpp:242
QPixmap pixmap() const
Return the image that is being digitized.
Definition: Document.cpp:811
void iterateThroughCurvePointsAxes(const Functor2wRet< const QString &, const Point &, CallbackSearchReturn > &ftorWithCallback)
See Curve::iterateThroughCurvePoints, for the single axes curve.
Definition: CmdMediator.cpp:87
CurveStyles modelCurveStyles() const
Get method for CurveStyles.
Definition: Document.cpp:696
void initializeGridDisplay(const Transformation &transformation)
Initialize grid display. This is called immediately after the transformation has been defined for the...
Definition: Document.cpp:408
Model for DlgSettingsGridRemoval and CmdSettingsGridRemoval. The settings are unstable until the user...
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. ...
DocumentModelCoords modelCoords() const
Get method for DocumentModelCoords.
Definition: Document.cpp:689
DocumentModelAxesChecker modelAxesChecker() const
Get method for DocumentModelAxesChecker.
Definition: Document.cpp:675