Engauge Digitizer  2
 All Classes Functions Variables Typedefs Enumerations Friends Pages
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  CmdMediator &cmdMediator,
36  const Transformation &transformation,
37  const QString &selectedGraphCurve)
38 {
39  LOG4CPP_INFO_S ((*mainCat)) << "TransformationStateDefined::begin";
40 
41  if (!cmdMediator.document().modelGridDisplay().stable()) {
42 
43  // Initialize or update the grid display settings since they are not stable yet
44  initializeModelGridDisplay (cmdMediator,
45  transformation);
46 
47  }
48 
49  if (!cmdMediator.document().modelGridRemoval().stable()) {
50 
51  // Initialize or update the grid removal settings since they are not stable yet
52  initializeModelGridRemoval (isGnuplot,
53  cmdMediator,
54  transformation,
55  selectedGraphCurve);
56 
57  }
58 
59  updateAxesChecker (cmdMediator,
60  transformation);
61 }
62 
64  const Transformation & /* transformation */)
65 {
66  LOG4CPP_INFO_S ((*mainCat)) << "TransformationStateDefined::end";
67 
68  m_axesChecker->setVisible (false);
69 }
70 
71 void TransformationStateDefined::initializeModelGridDisplay (CmdMediator &cmdMediator,
72  const Transformation &transformation)
73 {
74  cmdMediator.document().initializeGridDisplay (transformation);
75 }
76 
77 void TransformationStateDefined::initializeModelGridRemoval (bool isGnuplot,
78  CmdMediator &cmdMediator,
79  const Transformation &transformation,
80  const QString &selectedGraphCurve)
81 {
82  LOG4CPP_INFO_S ((*mainCat)) << "TransformationStateDefined::initializeModelGridRemoval";
83 
84  // Generate filtered image
85  FilterImage filterImage;
86  QPixmap pixmapFiltered = filterImage.filter (isGnuplot,
87  cmdMediator.document().pixmap().toImage(),
88  transformation,
89  selectedGraphCurve,
90  cmdMediator.document().modelColorFilter(),
91  cmdMediator.document().modelGridRemoval());
92 
93  // Initialize grid removal settings so user does not have to
94  int countX, countY;
95  double startX, startY, stepX, stepY;
96  GridClassifier gridClassifier;
97  gridClassifier.classify (context().isGnuplot(),
98  pixmapFiltered,
99  transformation,
100  countX,
101  startX,
102  stepX,
103  countY,
104  startY,
105  stepY);
106  DocumentModelGridRemoval modelGridRemoval (startX,
107  startY,
108  stepX,
109  stepY,
110  countX,
111  countY);
112  cmdMediator.document().setModelGridRemoval (modelGridRemoval);
113 }
114 
115 void TransformationStateDefined::slotTimeout()
116 {
117  LOG4CPP_INFO_S ((*mainCat)) << "TransformationStateDefined::slotTimeout";
118 
119  m_axesChecker->setVisible (false);
120 }
121 
122 void TransformationStateDefined::startTimer (const DocumentModelAxesChecker &modelAxesChecker)
123 {
124  LOG4CPP_INFO_S ((*mainCat)) << "TransformationStateDefined::startTimer";
125 
126  m_axesChecker->setVisible (modelAxesChecker.checkerMode () != CHECKER_MODE_NEVER);
127 
128  if (modelAxesChecker.checkerMode () == CHECKER_MODE_N_SECONDS) {
129 
130  // Start timer
131  int milliseconds = modelAxesChecker.checkerSeconds() * SECONDS_TO_MILLISECONDS;
132  m_timer->start (milliseconds);
133  }
134 }
135 
137  const Transformation &transformation)
138 {
140  Functor2wRet<const QString &, const Point&, CallbackSearchReturn> ftorWithCallback = functor_ret (ftor,
142  cmdMediator.iterateThroughCurvePointsAxes (ftorWithCallback);
143 
144  m_axesChecker->prepareForDisplay (ftor.points(),
145  cmdMediator.document().modelCurveStyles().pointRadius(AXIS_CURVE_NAME),
146  cmdMediator.document().modelAxesChecker(),
147  cmdMediator.document().modelCoords(),
148  transformation,
149  cmdMediator.document().documentAxesPointsRequired());
150  m_axesChecker->setVisible (true);
151  startTimer (cmdMediator.document().modelAxesChecker());
152 }
Base class for all transformation states. This serves as an interface to TransformationStateContext.
DocumentAxesPointsRequired documentAxesPointsRequired() const
Get method for DocumentAxesPointsRequired.
Definition: Document.cpp:361
DocumentModelColorFilter modelColorFilter() const
Get method for DocumentModelColorFilter.
Definition: Document.cpp:686
void setModelGridRemoval(const DocumentModelGridRemoval &modelGridRemoval)
Set method for DocumentModelGridRemoval.
Definition: Document.cpp:1026
int checkerSeconds() const
Get method for checker lifetime in seconds.
Context class for transformation state machine.
CallbackSearchReturn callback(const QString &curveName, const Point &point)
Callback method.
int pointRadius(const QString &curveName) const
Get method for curve point radius.
DocumentModelCoords modelCoords() const
Get method for DocumentModelCoords.
Definition: Document.cpp:693
QPixmap filter(bool isGnuplot, 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
QPixmap pixmap() const
Return the image that is being digitized.
Definition: Document.cpp:815
bool stable() const
Get method for stable flag.
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
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:135
Affine transformation between screen and graph coordinates, based on digitized axis points...
CurveStyles modelCurveStyles() const
Get method for CurveStyles.
Definition: Document.cpp:700
DocumentModelAxesChecker modelAxesChecker() const
Get method for DocumentModelAxesChecker.
Definition: Document.cpp:679
virtual void begin(bool isGnuplot, 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...
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...
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.
bool stable() const
Get method for stable flag.
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:247
void iterateThroughCurvePointsAxes(const Functor2wRet< const QString &, const Point &, CallbackSearchReturn > &ftorWithCallback)
See Curve::iterateThroughCurvePoints, for the single axes curve.
Definition: CmdMediator.cpp:87
void initializeGridDisplay(const Transformation &transformation)
Initialize grid display. This is called immediately after the transformation has been defined for the...
Definition: Document.cpp:409
DocumentModelGridDisplay modelGridDisplay() const
Get method for DocumentModelGridDisplay.
Definition: Document.cpp:728
Points points() const
Return the collected points as a polygon, in screen coordinates.
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. ...
DocumentModelGridRemoval modelGridRemoval() const
Get method for DocumentModelGridRemoval.
Definition: Document.cpp:735