Engauge Digitizer  2
GraphicsLinesForCurves.cpp
Go to the documentation of this file.
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 "Curve.h"
8 #include "CurveStyles.h"
9 #include "DataKey.h"
10 #include "EngaugeAssert.h"
11 #include "GraphicsLinesForCurve.h"
12 #include "GraphicsLinesForCurves.h"
13 #include "GraphicsPoint.h"
15 #include "GraphicsScene.h"
16 #include <iostream>
17 #include "LineStyle.h"
18 #include "Logger.h"
19 #include "Point.h"
20 #include <QGraphicsItem>
21 #include <QPainterPath>
22 #include <QTextStream>
23 #include "QtToString.h"
24 #include "Transformation.h"
25 
27 {
28 }
29 
30 void GraphicsLinesForCurves::addPoint (const QString &curveName,
31  const QString &pointIdentifier,
32  double ordinal,
33  GraphicsPoint &point)
34 {
35  LOG4CPP_INFO_S ((*mainCat)) << "GraphicsLinesForCurves::addPoint"
36  << " curve=" << curveName.toLatin1().data()
37  << " identifier=" << pointIdentifier.toLatin1().data()
38  << " ordinal=" << ordinal
39  << " pos=" << QPointFToString (point.pos()).toLatin1().data();
40 
41  m_graphicsLinesForCurve [curveName]->addPoint (pointIdentifier,
42  ordinal,
43  point);
44 }
45 
47  const QStringList &curveNames)
48 {
49  LOG4CPP_INFO_S ((*mainCat)) << "GraphicsLinesForCurves::addRemoveCurves"
50  << " curveCount=" << m_graphicsLinesForCurve.count();
51 
52  // Add new curves
53  QStringList::const_iterator itrC;
54  for (itrC = curveNames.begin (); itrC != curveNames.end (); itrC++) {
55 
56  QString curveName = *itrC;
57 
58  if (!m_graphicsLinesForCurve.contains (curveName)) {
59 
60  GraphicsLinesForCurve *item = new GraphicsLinesForCurve(curveName);
61  scene.addItem (item);
62 
63  m_graphicsLinesForCurve [curveName] = item;
64  }
65  }
66 
67  // Remove expired curves
68  GraphicsLinesContainer::const_iterator itrG, itrGNext;
69  for (itrG = m_graphicsLinesForCurve.begin (); itrG != m_graphicsLinesForCurve.end (); itrG = itrGNext) {
70 
71  const QString curveName = itrG.key ();
72  GraphicsLinesForCurve *graphicsLines = itrG.value();
73 
74  itrGNext = itrG;
75  itrGNext++;
76 
77  if (!curveNames.contains (curveName)) {
78 
79  delete graphicsLines;
80  m_graphicsLinesForCurve.remove (curveName);
81  }
82  }
83 }
84 
86  SplineDrawer &splineDrawer,
87  QPainterPath &pathMultiValued,
88  LineStyle &lineMultiValued)
89 {
90  LOG4CPP_INFO_S ((*mainCat)) << "GraphicsLinesForCurves::lineMembershipPurge";
91 
92  GraphicsLinesContainer::const_iterator itr;
93  for (itr = m_graphicsLinesForCurve.begin (); itr != m_graphicsLinesForCurve.end (); itr++) {
94 
95  const QString curveName = itr.key ();
96  GraphicsLinesForCurve *graphicsLines = itr.value();
97 
98  graphicsLines->lineMembershipPurge (curveStyles.lineStyle (curveName),
99  splineDrawer,
100  pathMultiValued,
101  lineMultiValued);
102  }
103 }
104 
106 {
107  LOG4CPP_INFO_S ((*mainCat)) << "GraphicsLinesForCurves::lineMembershipReset";
108 
109  GraphicsLinesContainer::const_iterator itr;
110  for (itr = m_graphicsLinesForCurve.begin (); itr != m_graphicsLinesForCurve.end (); itr++) {
111 
112  GraphicsLinesForCurve *graphicsLines = itr.value();
113 
114  graphicsLines->lineMembershipReset ();
115  }
116 }
117 
118 void GraphicsLinesForCurves::print () const
119 {
120  QString text;
121  QTextStream str (&text);
122 
123  printStream ("", str);
124  std::cerr << text.toLatin1().data();
125 }
126 
127 void GraphicsLinesForCurves::printStream (QString indentation,
128  QTextStream &str) const
129 {
130  str << indentation << "GraphicsLinesForCurves\n";
131 
132  indentation += INDENTATION_DELTA;
133 
134  GraphicsLinesContainer::const_iterator itr;
135  for (itr = m_graphicsLinesForCurve.begin (); itr != m_graphicsLinesForCurve.end (); itr++) {
136 
137  const GraphicsLinesForCurve *graphicsLines = itr.value();
138 
139  graphicsLines->printStream (indentation,
140  str);
141  }
142 }
143 
144 void GraphicsLinesForCurves::removePoint(const QString &identifier)
145 {
146  LOG4CPP_INFO_S ((*mainCat)) << "GraphicsLinesForCurves::removePoint"
147  << " point=" << identifier.toLatin1().data ()
148  << " curveCount=" << m_graphicsLinesForCurve.count();
149 
150  QString curveName = Point::curveNameFromPointIdentifier(identifier);
151 
152  ENGAUGE_ASSERT (m_graphicsLinesForCurve.contains (curveName));
153  double ordinal = m_graphicsLinesForCurve [curveName]->identifierToOrdinal (identifier);
154  m_graphicsLinesForCurve [curveName]->removePoint(ordinal);
155 }
156 
158 {
159  LOG4CPP_INFO_S ((*mainCat)) << "GraphicsLinesForCurves::removeTemporaryPointIfExists";
160 
162 
163  ENGAUGE_ASSERT (m_graphicsLinesForCurve.contains (curveName));
164  m_graphicsLinesForCurve [curveName]->removeTemporaryPointIfExists ();
165 }
166 
168 {
169  LOG4CPP_INFO_S ((*mainCat)) << "GraphicsLinesForCurves::resetOnLoad";
170 
171  GraphicsLinesContainer::iterator itr;
172  for (itr = m_graphicsLinesForCurve.begin(); itr != m_graphicsLinesForCurve.end(); itr++) {
173  GraphicsLinesForCurve *curve = itr.value();
174  delete curve;
175  }
176 
177  m_graphicsLinesForCurve.clear();
178 }
179 
181  const CurveStyles &curveStyles,
182  const QString &curveName,
183  const Point &point,
184  GeometryWindow *geometryWindow)
185 {
186  LOG4CPP_DEBUG_S ((*mainCat)) << "GraphicsLinesForCurves::updateAfterCommand"
187  << " point=" << point.identifier().toLatin1().data()
188  << " curveCount=" << m_graphicsLinesForCurve.count();
189 
190  ENGAUGE_ASSERT (m_graphicsLinesForCurve.contains (curveName));
191  m_graphicsLinesForCurve [curveName]->updateAfterCommand (scene,
192  curveStyles.pointStyle(curveName),
193  point,
194  geometryWindow);
195 }
196 
197 void GraphicsLinesForCurves::updateCurveStyles (const CurveStyles &modelCurveStyles)
198 {
199  LOG4CPP_INFO_S ((*mainCat)) << "GraphicsLinesForCurves::updateCurveStyles";
200 
201  GraphicsLinesContainer::const_iterator itr;
202  for (itr = m_graphicsLinesForCurve.begin (); itr != m_graphicsLinesForCurve.end (); itr++) {
203 
204  QString curveName = itr.key();
205 
206  m_graphicsLinesForCurve [curveName]->updateCurveStyle (modelCurveStyles.curveStyle (curveName));
207  }
208 }
209 
211  SplineDrawer &splineDrawer,
212  QPainterPath &pathMultiValued,
213  LineStyle &lineMultiValued)
214 {
215  LOG4CPP_INFO_S ((*mainCat)) << "GraphicsLinesForCurves::updateGraphicsLinesToMatchGraphicsPoints";
216 
217  GraphicsLinesContainer::const_iterator itr;
218  for (itr = m_graphicsLinesForCurve.begin (); itr != m_graphicsLinesForCurve.end (); itr++) {
219 
220  QString curveName = itr.key();
221 
222  // This is where we add lines for non-axes curves
223  if (curveName != AXIS_CURVE_NAME) {
224 
225  m_graphicsLinesForCurve [curveName]->updateGraphicsLinesToMatchGraphicsPoints(curveStyles.lineStyle (curveName),
226  splineDrawer,
227  pathMultiValued,
228  lineMultiValued);
229  }
230  }
231 }
232 
233 void GraphicsLinesForCurves::updateHighlightOpacity (double highlightOpacity)
234 {
235  LOG4CPP_INFO_S ((*mainCat)) << "GraphicsLinesForCurves::updateHighlightOpacity"
236  << " highlightOpacity=" << highlightOpacity;
237 
238  GraphicsLinesContainer::const_iterator itr;
239  for (itr = m_graphicsLinesForCurve.begin (); itr != m_graphicsLinesForCurve.end (); itr++) {
240 
241  QString curveName = itr.key();
242 
243  m_graphicsLinesForCurve [curveName]->updateHighlightOpacity (highlightOpacity);
244  }
245 }
246 
248  const Transformation &transformation)
249 {
250  LOG4CPP_INFO_S ((*mainCat)) << "GraphicsLinesForCurves::updatePointOrdinalsAfterDrag";
251 
252  GraphicsLinesContainer::const_iterator itr;
253  for (itr = m_graphicsLinesForCurve.begin (); itr != m_graphicsLinesForCurve.end (); itr++) {
254 
255  QString curveName = itr.key();
256  GraphicsLinesForCurve *graphicsLines = itr.value();
257 
258  graphicsLines->updatePointOrdinalsAfterDrag (curveStyles.lineStyle (curveName),
259  transformation);
260  }
261 }
Point.h
CurveStyles::curveStyle
CurveStyle curveStyle(const QString &curveName) const
CurveStyle in specified curve.
Definition: CurveStyles.cpp:78
AXIS_CURVE_NAME
const QString AXIS_CURVE_NAME
GraphicsLinesForCurves::lineMembershipPurge
void lineMembershipPurge(const CurveStyles &curveStyles, SplineDrawer &splineDrawer, QPainterPath &pathMultiValued, LineStyle &lineMultiValued)
Mark the end of addPoint calls. Remove stale lines, insert missing lines, and draw the graphics lines...
Definition: GraphicsLinesForCurves.cpp:84
CurveStyles::pointStyle
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...
Definition: CurveStyles.cpp:177
GraphicsLinesForCurves::GraphicsLinesForCurves
GraphicsLinesForCurves()
Single constructor.
Definition: GraphicsLinesForCurves.cpp:25
GraphicsLinesForCurves::printStream
void printStream(QString indentation, QTextStream &str) const
Debugging method that supports print method of this class and printStream method of some other class(...
Definition: GraphicsLinesForCurves.cpp:126
Transformation
Affine transformation between screen and graph coordinates, based on digitized axis points.
Definition: Transformation.h:30
EngaugeAssert.h
CurveStyles.h
GraphicsLinesForCurve::updatePointOrdinalsAfterDrag
void updatePointOrdinalsAfterDrag(const LineStyle &lineStyle, const Transformation &transformation)
See GraphicsScene::updateOrdinalsAfterDrag. Pretty much the same steps as Curve::updatePointOrdinals.
Definition: GraphicsLinesForCurve.cpp:468
Point::temporaryPointIdentifier
static QString temporaryPointIdentifier()
Point identifier for temporary point that is used by DigitzeStateAxis.
Definition: Point.cpp:519
GraphicsLinesForCurves::removeTemporaryPointIfExists
void removeTemporaryPointIfExists()
Remove temporary point if it exists.
Definition: GraphicsLinesForCurves.cpp:156
GraphicsLinesForCurves::addPoint
void addPoint(const QString &curveName, const QString &pointIdentifier, double ordinal, GraphicsPoint &point)
Add new point.
Definition: GraphicsLinesForCurves.cpp:29
GraphicsLinesForCurves::removePoint
void removePoint(const QString &identifier)
Remove the specified point. The act of deleting it will automatically remove it from the GraphicsScen...
Definition: GraphicsLinesForCurves.cpp:143
GraphicsLinesForCurves::print
void print() const
Debugging method for printing directly from symbolic debugger.
Definition: GraphicsLinesForCurves.cpp:117
Transformation.h
GraphicsLinesForCurves.h
GraphicsLinesForCurve.h
Logger.h
LineStyle
Details for a specific Line.
Definition: LineStyle.h:18
GraphicsLinesForCurve
This class stores the GraphicsLine objects for one Curve.
Definition: GraphicsLinesForCurve.h:26
GraphicsPointAbstractBase.h
LOG4CPP_INFO_S
#define LOG4CPP_INFO_S(logger)
Definition: convenience.h:18
GraphicsScene
Add point and line handling to generic QGraphicsScene.
Definition: GraphicsScene.h:35
GraphicsLinesForCurves::updateCurveStyles
void updateCurveStyles(const CurveStyles &modelCurveStyles)
Update the curve style for every curve.
Definition: GraphicsLinesForCurves.cpp:196
GraphicsPoint.h
DataKey.h
CurveStyles::lineStyle
const LineStyle lineStyle(const QString &curveName) const
Get method for copying one line style in one step.
Definition: CurveStyles.cpp:96
GraphicsLinesForCurve::printStream
void printStream(QString indentation, QTextStream &str) const
Debugging method that supports print method of this class and printStream method of some other class(...
Definition: GraphicsLinesForCurve.cpp:286
Point::identifier
QString identifier() const
Unique identifier for a specific Point.
Definition: Point.cpp:268
GraphicsPoint::pos
QPointF pos() const
Proxy method for QGraphicsItem::pos.
Definition: GraphicsPoint.cpp:215
GraphicsLinesForCurves::updateGraphicsLinesToMatchGraphicsPoints
void updateGraphicsLinesToMatchGraphicsPoints(const CurveStyles &curveStyles, SplineDrawer &splineDrawer, QPainterPath &pathMultiValued, LineStyle &lineMultiValued)
Calls to moveLinesWithDraggedPoint have finished so update the lines correspondingly.
Definition: GraphicsLinesForCurves.cpp:209
mainCat
log4cpp::Category * mainCat
Definition: Logger.cpp:14
GraphicsScene.h
SplineDrawer
This class takes the output from Spline and uses that to draw the curve in the graphics window,...
Definition: SplineDrawer.h:34
GraphicsLinesForCurves::updateAfterCommand
void updateAfterCommand(GraphicsScene &scene, const CurveStyles &curveStyles, const QString &curveName, const Point &point, GeometryWindow *geometryWindow)
Update the GraphicsScene with the specified Point from the Document. If it does not exist yet in the ...
Definition: GraphicsLinesForCurves.cpp:179
GraphicsLinesForCurves::resetOnLoad
void resetOnLoad()
Reset, when loading a document after the first, to same state that first document was at when loaded.
Definition: GraphicsLinesForCurves.cpp:166
GraphicsLinesForCurves::updatePointOrdinalsAfterDrag
void updatePointOrdinalsAfterDrag(const CurveStyles &curveStyles, const Transformation &transformation)
See GraphicsScene::updateOrdinalsAfterDrag.
Definition: GraphicsLinesForCurves.cpp:246
LineStyle.h
INDENTATION_DELTA
const QString INDENTATION_DELTA
GraphicsPoint
Graphics item for drawing a circular or polygonal Point.
Definition: GraphicsPoint.h:42
Curve.h
Point
Class that represents one digitized point. The screen-to-graph coordinate transformation is always ex...
Definition: Point.h:24
LOG4CPP_DEBUG_S
#define LOG4CPP_DEBUG_S(logger)
Definition: convenience.h:20
GraphicsLinesForCurve::lineMembershipReset
void lineMembershipReset()
Mark points as unwanted. Afterwards, lineMembershipPurge gets called.
Definition: GraphicsLinesForCurve.cpp:252
QtToString.h
GeometryWindow
Window that displays the geometry information, as a table, for the current curve.
Definition: GeometryWindow.h:27
GraphicsLinesForCurve::lineMembershipPurge
void lineMembershipPurge(const LineStyle &lineStyle, SplineDrawer &splineDrawer, QPainterPath &pathMultiValued, LineStyle &lineMultiValued)
Mark the end of addPoint calls. Remove stale lines, insert missing lines, and draw the graphics lines...
Definition: GraphicsLinesForCurve.cpp:206
CurveStyles
Model for DlgSettingsCurveProperties and CmdSettingsCurveProperties.
Definition: CurveStyles.h:21
QPointFToString
QString QPointFToString(const QPointF &pos)
Definition: QtToString.cpp:17
GraphicsLinesForCurves::lineMembershipReset
void lineMembershipReset()
Mark points as unwanted. Afterwards, lineMembershipPurge gets called.
Definition: GraphicsLinesForCurves.cpp:104
ENGAUGE_ASSERT
#define ENGAUGE_ASSERT(cond)
Drop in replacement for Q_ASSERT if defined(QT_NO_DEBUG) && !defined(QT_FORCE_ASSERTS) define ENGAUGE...
Definition: EngaugeAssert.h:19
GraphicsLinesForCurves::updateHighlightOpacity
void updateHighlightOpacity(double highlightOpacity)
Update the highlight opacity value. This may or may not affect the current display immediately depend...
Definition: GraphicsLinesForCurves.cpp:232
GraphicsLinesForCurves::addRemoveCurves
void addRemoveCurves(GraphicsScene &scene, const QStringList &curveNames)
Add new curves and remove expired curves to match the specified list.
Definition: GraphicsLinesForCurves.cpp:45
Point::curveNameFromPointIdentifier
static QString curveNameFromPointIdentifier(const QString &pointIdentifier)
Parse the curve name from the specified point identifier. This does the opposite of uniqueIdentifierG...
Definition: Point.cpp:227