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 const double Z_VALUE = 200.0;
41 DigitizeStatePointMatch::~DigitizeStatePointMatch ()
53 LOG4CPP_INFO_S ((*mainCat)) <<
"DigitizeStatePointMatch::begin";
60 m_outline =
new QGraphicsEllipseItem ();
62 m_outline->setPen (QPen (Qt::black));
63 m_outline->setVisible (
true);
64 m_outline->setZValue (Z_VALUE);
67 void DigitizeStatePointMatch::createPermanentPoint (
CmdMediator *cmdMediator,
68 const QPointF &posScreen)
76 context ().mainWindow().selectedGraphCurve(),
87 void DigitizeStatePointMatch::createTemporaryPoint (
CmdMediator *cmdMediator,
88 const QPoint &posScreen)
90 LOG4CPP_DEBUG_S ((*mainCat)) <<
"DigitizeStatePointMatch::createTemporaryPoint";
105 NULL_GEOMETRY_WINDOW);
111 m_posCandidatePoint = posScreen;
116 LOG4CPP_DEBUG_S ((*mainCat)) <<
"DigitizeStatePointMatch::cursor";
118 return QCursor (Qt::ArrowCursor);
123 LOG4CPP_INFO_S ((*mainCat)) <<
"DigitizeStatePointMatch::end";
129 ENGAUGE_CHECK_PTR (m_outline);
134 QList<PointMatchPixel> DigitizeStatePointMatch::extractSamplePointPixels (
const QImage &img,
136 const QPointF &posScreen)
const 138 LOG4CPP_INFO_S ((*mainCat)) <<
"DigitizeStatePointMatch::extractSamplePointPixels";
143 QList<PointMatchPixel> samplePointPixels;
148 for (
int xOffset = -radiusMax; xOffset <= radiusMax; xOffset++) {
149 for (
int yOffset = -radiusMax; yOffset <= radiusMax; yOffset++) {
151 int x = posScreen.x() + xOffset;
152 int y = posScreen.y() + yOffset;
153 int radius = qSqrt (xOffset * xOffset + yOffset * yOffset);
155 if (radius <= radiusMax) {
165 samplePointPixels.push_back (point);
170 return samplePointPixels;
174 const QString &pointIdentifier)
176 LOG4CPP_INFO_S ((*mainCat)) <<
"DigitizeStatePointMatch::handleContextMenuEventAxis " 177 <<
" point=" << pointIdentifier.toLatin1 ().data ();
181 const QStringList &pointIdentifiers)
183 LOG4CPP_INFO_S ((*mainCat)) <<
"DigitizeStatePointMatch ::handleContextMenuEventGraph " 184 <<
"points=" << pointIdentifiers.join(
",").toLatin1 ().data ();
189 LOG4CPP_INFO_S ((*mainCat)) <<
"DigitizeStatePointMatch::handleCurveChange";
196 LOG4CPP_INFO_S ((*mainCat)) <<
"DigitizeStatePointMatch::handleKeyPress" 197 <<
" key=" << QKeySequence (key).toString ().toLatin1 ().data ();
200 if (key == Qt::Key_Right) {
202 promoteCandidatePointToPermanentPoint (cmdMediator);
204 popCandidatePoint(cmdMediator);
216 m_outline->setRect (posScreen.x() - modelPointMatch.
maxPointSize() / 2.0,
223 bool pixelShouldBeOn = pixelIsOnInImage (img,
228 QColor penColorIs = m_outline->pen().color();
229 bool pixelIsOn = (penColorIs.red () != penColorIs.green());
230 if (pixelShouldBeOn != pixelIsOn) {
231 QColor penColorShouldBe (pixelShouldBeOn ? Qt::green : Qt::black);
232 m_outline->setPen (QPen (penColorShouldBe));
239 LOG4CPP_INFO_S ((*mainCat)) <<
"DigitizeStatePointMatch::handleMousePress";
245 LOG4CPP_INFO_S ((*mainCat)) <<
"DigitizeStatePointMatch::handleMouseRelease";
247 createPermanentPoint (cmdMediator,
250 findPointsAndShowFirstCandidate (cmdMediator,
254 void DigitizeStatePointMatch::findPointsAndShowFirstCandidate (
CmdMediator *cmdMediator,
255 const QPointF &posScreen)
257 LOG4CPP_INFO_S ((*mainCat)) <<
"DigitizeStatePointMatch::findPointsAndShowFirstCandidate";
262 QList<PointMatchPixel> samplePointPixels = extractSamplePointPixels (img,
271 QApplication::setOverrideCursor(Qt::WaitCursor);
274 m_candidatePoints = pointMatchAlgorithm.
findPoints (samplePointPixels,
279 QApplication::restoreOverrideCursor();
282 popCandidatePoint (cmdMediator);
285 bool DigitizeStatePointMatch::pixelIsOnInImage (
const QImage &img,
288 int radiusLimit)
const 293 bool pixelShouldBeOn =
false;
294 for (
int xOffset = -radiusLimit; xOffset <= radiusLimit; xOffset++) {
295 for (
int yOffset = -radiusLimit; yOffset <= radiusLimit; yOffset++) {
297 int radius = qSqrt (xOffset * xOffset + yOffset * yOffset);
299 if (radius <= radiusLimit) {
301 int xNearby = x + xOffset;
302 int yNearby = y + yOffset;
304 if ((0 <= xNearby) &&
306 (xNearby < img.width()) &&
307 (yNearby < img.height())) {
313 pixelShouldBeOn =
true;
321 return pixelShouldBeOn;
324 void DigitizeStatePointMatch::popCandidatePoint (
CmdMediator *cmdMediator)
326 LOG4CPP_DEBUG_S ((*mainCat)) <<
"DigitizeStatePointMatch::popCandidatePoint";
328 if (m_candidatePoints.count() > 0) {
331 QPoint posScreen = m_candidatePoints.first();
332 m_candidatePoints.pop_front ();
334 createTemporaryPoint(cmdMediator,
340 QMessageBox::information (0,
341 QObject::tr (
"Point Match"),
342 QObject::tr (
"There are no more matching points"));
347 void DigitizeStatePointMatch::promoteCandidatePointToPermanentPoint(
CmdMediator *cmdMediator)
349 createPermanentPoint (cmdMediator,
350 m_posCandidatePoint);
355 return "DigitizeStatePointMatch";
360 LOG4CPP_INFO_S ((*mainCat)) <<
"DigitizeStatePointMatch::updateAfterPointAddition";
366 LOG4CPP_INFO_S ((*mainCat)) <<
"DigitizeStatePointMatch::updateModelDigitizeCurve";
371 LOG4CPP_INFO_S ((*mainCat)) <<
"DigitizeStatePointMatch::updateModelSegments";
double maxPointSize() const
Get method for max point size.
virtual void handleContextMenuEventGraph(CmdMediator *cmdMediator, const QStringList &pointIdentifiers)
Handle a right click, on a graph point, that was intercepted earlier.
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...
Model for DlgSettingsPointMatch and CmdSettingsPointMatch.
virtual void updateModelSegments(const DocumentModelSegments &modelSegments)
Update the segments given the new settings.
DocumentModelPointMatch modelPointMatch() const
Get method for DocumentModelPointMatch.
const Points points() const
Return a shallow copy of the Points.
Transformation transformation() const
Return read-only copy of transformation.
void setDragMode(QGraphicsView::DragMode dragMode)
Set QGraphicsView drag mode (in m_view). Called from DigitizeStateAbstractBase subclasses.
Model for DlgSettingsCurveProperties and CmdSettingsCurveProperties.
Single on or off pixel out of the pixels that define the point match mode's candidate point...
void updateViewsOfSettings(const QString &activeCurve)
Update curve-specific view of settings. Private version gets active curve name from DigitizeStateCont...
QString selectedGraphCurve() const
Curve name that is currently selected in m_cmbCurve.
int cursorSize() const
Get method for effective cursor size.
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.
DigitizeStateContext & context()
Reference to the DigitizeStateContext that contains all the DigitizeStateAbstractBase subclasses...
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.
void showTemporaryMessage(const QString &temporaryMessage)
Show temporary message in status bar.
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.
void setCursor(CmdMediator *cmdMediator)
Update the cursor according to the current state.
CurveStyles modelCurveStyles() const
Get method for CurveStyles.
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.
virtual QCursor cursor(CmdMediator *cmdMediator) const
Returns the state-specific cursor shape.
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...
virtual QString state() const
State name for debugging.
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.
QImage imageFiltered() const
Background image that has been filtered for the current curve. This asserts if a curve-specific image...
Graphics item for drawing a circular or polygonal Point.
Algorithm returning a list of points that match the specified point.
ColorPalette paletteColorCandidate() const
Get method for candidate color.
void removeTemporaryPointIfExists()
Remove temporary point if it exists.
bool pixelFilteredIsOn(const QImage &image, int x, int y) const
Return true if specified filtered pixel is on.
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.
const Curve * curveForCurveName(const QString &curveName) const
See CurvesGraphs::curveForCurveNames, although this also works for AXIS_CURVE_NAME.
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.
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.
DocumentModelGeneral modelGeneral() const
Get method for DocumentModelGeneral.
virtual QString activeCurve() const
Name of the active Curve. This can include AXIS_CURVE_NAME.