7 #include "CmdAddPointGraph.h" 8 #include "CmdMediator.h" 9 #include "ColorFilter.h" 10 #include "CurveStyles.h" 11 #include "DigitizeStateContext.h" 12 #include "DigitizeStatePointMatch.h" 13 #include "EngaugeAssert.h" 14 #include "EnumsToQt.h" 15 #include "GraphicsPoint.h" 16 #include "GraphicsScene.h" 17 #include "GraphicsView.h" 19 #include "MainWindow.h" 20 #include "OrdinalGenerator.h" 21 #include "PointMatchAlgorithm.h" 22 #include "PointStyle.h" 23 #include <QApplication> 25 #include <QGraphicsEllipseItem> 26 #include <QGraphicsScene> 29 #include <QMessageBox> 32 #include "Transformation.h" 34 const double Z_VALUE = 200.0;
43 DigitizeStatePointMatch::~DigitizeStatePointMatch ()
55 LOG4CPP_INFO_S ((*mainCat)) <<
"DigitizeStatePointMatch::begin";
62 m_outline =
new QGraphicsEllipseItem ();
64 m_outline->setPen (QPen (Qt::black));
65 m_outline->setVisible (
true);
66 m_outline->setZValue (Z_VALUE);
70 const QSize &viewSize)
const 76 void DigitizeStatePointMatch::createPermanentPoint (
CmdMediator *cmdMediator,
77 const QPointF &posScreen)
85 context ().mainWindow().selectedGraphCurve(),
96 void DigitizeStatePointMatch::createTemporaryPoint (
CmdMediator *cmdMediator,
97 const QPoint &posScreen)
99 LOG4CPP_DEBUG_S ((*mainCat)) <<
"DigitizeStatePointMatch::createTemporaryPoint";
114 NULL_GEOMETRY_WINDOW);
120 m_posCandidatePoint = posScreen;
125 LOG4CPP_DEBUG_S ((*mainCat)) <<
"DigitizeStatePointMatch::cursor";
127 return QCursor (Qt::ArrowCursor);
132 LOG4CPP_INFO_S ((*mainCat)) <<
"DigitizeStatePointMatch::end";
138 ENGAUGE_CHECK_PTR (m_outline);
143 QList<PointMatchPixel> DigitizeStatePointMatch::extractSamplePointPixels (
const QImage &img,
145 const QPointF &posScreen)
const 147 LOG4CPP_INFO_S ((*mainCat)) <<
"DigitizeStatePointMatch::extractSamplePointPixels";
152 QList<PointMatchPixel> samplePointPixels;
157 for (
int xOffset = -radiusMax; xOffset <= radiusMax; xOffset++) {
158 for (
int yOffset = -radiusMax; yOffset <= radiusMax; yOffset++) {
160 int x = posScreen.x() + xOffset;
161 int y = posScreen.y() + yOffset;
162 int radius = qSqrt (xOffset * xOffset + yOffset * yOffset);
164 if (radius <= radiusMax) {
174 samplePointPixels.push_back (point);
179 return samplePointPixels;
183 const QString &pointIdentifier)
185 LOG4CPP_INFO_S ((*mainCat)) <<
"DigitizeStatePointMatch::handleContextMenuEventAxis " 186 <<
" point=" << pointIdentifier.toLatin1 ().data ();
190 const QStringList &pointIdentifiers)
192 LOG4CPP_INFO_S ((*mainCat)) <<
"DigitizeStatePointMatch ::handleContextMenuEventGraph " 193 <<
"points=" << pointIdentifiers.join(
",").toLatin1 ().data ();
198 LOG4CPP_INFO_S ((*mainCat)) <<
"DigitizeStatePointMatch::handleCurveChange";
205 LOG4CPP_INFO_S ((*mainCat)) <<
"DigitizeStatePointMatch::handleKeyPress" 206 <<
" key=" << QKeySequence (key).toString ().toLatin1 ().data ();
209 if (key == Qt::Key_Right) {
211 promoteCandidatePointToPermanentPoint (cmdMediator);
213 popCandidatePoint(cmdMediator);
225 m_outline->setRect (posScreen.x() - modelPointMatch.
maxPointSize() / 2.0,
232 bool pixelShouldBeOn = pixelIsOnInImage (img,
237 QColor penColorIs = m_outline->pen().color();
238 bool pixelIsOn = (penColorIs.red () != penColorIs.green());
239 if (pixelShouldBeOn != pixelIsOn) {
240 QColor penColorShouldBe (pixelShouldBeOn ? Qt::green : Qt::black);
241 m_outline->setPen (QPen (penColorShouldBe));
248 LOG4CPP_INFO_S ((*mainCat)) <<
"DigitizeStatePointMatch::handleMousePress";
254 LOG4CPP_INFO_S ((*mainCat)) <<
"DigitizeStatePointMatch::handleMouseRelease";
256 createPermanentPoint (cmdMediator,
259 findPointsAndShowFirstCandidate (cmdMediator,
263 void DigitizeStatePointMatch::findPointsAndShowFirstCandidate (
CmdMediator *cmdMediator,
264 const QPointF &posScreen)
266 LOG4CPP_INFO_S ((*mainCat)) <<
"DigitizeStatePointMatch::findPointsAndShowFirstCandidate";
271 QList<PointMatchPixel> samplePointPixels = extractSamplePointPixels (img,
280 QApplication::setOverrideCursor(Qt::WaitCursor);
283 m_candidatePoints = pointMatchAlgorithm.
findPoints (samplePointPixels,
288 QApplication::restoreOverrideCursor();
291 popCandidatePoint (cmdMediator);
294 bool DigitizeStatePointMatch::pixelIsOnInImage (
const QImage &img,
297 int radiusLimit)
const 302 bool pixelShouldBeOn =
false;
303 for (
int xOffset = -radiusLimit; xOffset <= radiusLimit; xOffset++) {
304 for (
int yOffset = -radiusLimit; yOffset <= radiusLimit; yOffset++) {
306 int radius = qSqrt (xOffset * xOffset + yOffset * yOffset);
308 if (radius <= radiusLimit) {
310 int xNearby = x + xOffset;
311 int yNearby = y + yOffset;
313 if ((0 <= xNearby) &&
315 (xNearby < img.width()) &&
316 (yNearby < img.height())) {
322 pixelShouldBeOn =
true;
330 return pixelShouldBeOn;
333 void DigitizeStatePointMatch::popCandidatePoint (
CmdMediator *cmdMediator)
335 LOG4CPP_DEBUG_S ((*mainCat)) <<
"DigitizeStatePointMatch::popCandidatePoint";
337 if (m_candidatePoints.count() > 0) {
340 QPoint posScreen = m_candidatePoints.first();
341 m_candidatePoints.pop_front ();
343 createTemporaryPoint(cmdMediator,
349 QMessageBox::information (0,
350 QObject::tr (
"Point Match"),
351 QObject::tr (
"There are no more matching points"));
356 void DigitizeStatePointMatch::promoteCandidatePointToPermanentPoint(
CmdMediator *cmdMediator)
358 createPermanentPoint (cmdMediator,
359 m_posCandidatePoint);
364 return "DigitizeStatePointMatch";
369 LOG4CPP_INFO_S ((*mainCat)) <<
"DigitizeStatePointMatch::updateAfterPointAddition";
375 LOG4CPP_INFO_S ((*mainCat)) <<
"DigitizeStatePointMatch::updateModelDigitizeCurve";
380 LOG4CPP_INFO_S ((*mainCat)) <<
"DigitizeStatePointMatch::updateModelSegments";
QImage imageFiltered() const
Background image that has been filtered for the current curve. This asserts if a curve-specific image...
virtual void handleContextMenuEventGraph(CmdMediator *cmdMediator, const QStringList &pointIdentifiers)
Handle a right click, on a graph point, that was intercepted earlier.
Model for DlgSettingsPointMatch and CmdSettingsPointMatch.
virtual void updateModelSegments(const DocumentModelSegments &modelSegments)
Update the segments given the new settings.
void setDragMode(QGraphicsView::DragMode dragMode)
Set QGraphicsView drag mode (in m_view). Called from DigitizeStateAbstractBase subclasses.
Model for DlgSettingsCurveProperties and CmdSettingsCurveProperties.
bool canPasteProtected(const Transformation &transformation, const QSize &viewSize) const
Protected version of canPaste method. Some, but not all, leaf classes use this method.
Single on or off pixel out of the pixels that define the point match mode's candidate point...
bool pixelFilteredIsOn(const QImage &image, int x, int y) const
Return true if specified filtered pixel is on.
const Curve * curveForCurveName(const QString &curveName) const
See CurvesGraphs::curveForCurveNames, although this also works for AXIS_CURVE_NAME.
void updateViewsOfSettings(const QString &activeCurve)
Update curve-specific view of settings. Private version gets active curve name from DigitizeStateCont...
DocumentModelGeneral modelGeneral() const
Get method for DocumentModelGeneral.
const PointStyle pointStyle(const QString &curveName) const
Get method for copying one point style. Cannot return just a reference or else there is a warning abo...
virtual void updateAfterPointAddition()
Update graphics attributes after possible new points. This is useful for highlight opacity...
Window that displays the geometry information, as a table, for the current curve. ...
Class for filtering image to remove unimportant information.
DocumentModelPointMatch modelPointMatch() const
Get method for DocumentModelPointMatch.
virtual QCursor cursor(CmdMediator *cmdMediator) const
Returns the state-specific cursor shape.
DigitizeStateContext & context()
Reference to the DigitizeStateContext that contains all the DigitizeStateAbstractBase subclasses...
const Points points() const
Return a shallow copy of the Points.
MainWindow & mainWindow()
Reference to the MainWindow, without const.
static QString temporaryPointIdentifier()
Point identifier for temporary point that is used by DigitzeStateAxis.
virtual void handleMousePress(CmdMediator *cmdMediator, QPointF posScreen)
Handle a mouse press that was intercepted earlier.
Transformation transformation() const
Return read-only copy of transformation.
void showTemporaryMessage(const QString &temporaryMessage)
Show temporary message in status bar.
ColorPalette paletteColorCandidate() const
Get method for candidate color.
virtual void handleMouseMove(CmdMediator *cmdMediator, QPointF posScreen)
Handle a mouse move. This is part of an experiment to see if augmenting the cursor in Point Match mod...
GraphicsPoint * createPoint(const QString &identifier, const PointStyle &pointStyle, const QPointF &posScreen, GeometryWindow *geometryWindow)
Create one QGraphicsItem-based object that represents one Point. It is NOT added to m_graphicsLinesFo...
Model for DlgSettingsDigitizeCurve and CmdSettingsDigitizeCurve.
virtual void handleKeyPress(CmdMediator *cmdMediator, Qt::Key key, bool atLeastOneSelectedItem)
Handle a key press that was intercepted earlier.
Details for a specific Point.
GraphicsScene & scene()
Scene container for the QImage and QGraphicsItems.
virtual QString state() const
State name for debugging.
void setCursor(CmdMediator *cmdMediator)
Update the cursor according to the current state.
int cursorSize() const
Get method for effective cursor size.
Container for all DigitizeStateAbstractBase subclasses. This functions as the context class in a stan...
void appendNewCmd(CmdMediator *cmdMediator, QUndoCommand *cmd)
Append just-created QUndoCommand to command stack. This is called from DigitizeStateAbstractBase subc...
virtual void handleMouseRelease(CmdMediator *cmdMediator, QPointF posScreen)
Handle a mouse release that was intercepted earlier.
DigitizeStatePointMatch(DigitizeStateContext &context)
Single constructor.
Command for adding one graph point.
virtual void handleContextMenuEventAxis(CmdMediator *cmdMediator, const QString &pointIdentifier)
Handle a right click, on an axis point, that was intercepted earlier.
virtual void handleCurveChange(CmdMediator *cmdMediator)
Handle the selection of a new curve. At a minimum, DigitizeStateSegment will generate a new set of Se...
void setPaletteColor(ColorPalette paletteColor)
Set method for point color.
Storage of one imported image and the data attached to that image.
Container for one set of digitized Points.
Graphics item for drawing a circular or polygonal Point.
Algorithm returning a list of points that match the specified point.
void removeTemporaryPointIfExists()
Remove temporary point if it exists.
virtual void begin(CmdMediator *cmdMediator, DigitizeState previousState)
Method that is called at the exact moment a state is entered.
virtual void end()
Method that is called at the exact moment a state is exited. Typically called just before begin for t...
Utility class for generating ordinal numbers.
void addTemporaryPoint(const QString &identifier, GraphicsPoint *point)
Add one temporary point to m_graphicsLinesForCurves. Non-temporary points are handled by the updateLi...
Model for DlgSettingsSegments and CmdSettingsSegments.
Base class for all digitizing states. This serves as an interface to DigitizeStateContext.
virtual void updateModelDigitizeCurve(CmdMediator *cmdMediator, const DocumentModelDigitizeCurve &modelDigitizeCurve)
Update the digitize curve settings.
CurveStyles modelCurveStyles() const
Get method for CurveStyles.
QString selectedGraphCurve() const
Curve name that is currently selected in m_cmbCurve.
QList< QPoint > findPoints(const QList< PointMatchPixel > &samplePointPixels, const QImage &imageProcessed, const DocumentModelPointMatch &modelPointMatch, const Points &pointsExisting)
Find points that match the specified sample point pixels. They are sorted by best-to-worst match...
double generateCurvePointOrdinal(const Document &document, const Transformation &transformation, const QPointF &posScreen, const QString &curveName)
Select ordinal so new point curve passes smoothly through existing points.
virtual QString activeCurve() const
Name of the active Curve. This can include AXIS_CURVE_NAME.
virtual bool canPaste(const Transformation &transformation, const QSize &viewSize) const
Return true if there is good data in the clipboard for pasting, and that is compatible with the curre...
double maxPointSize() const
Get method for max point size.