Engauge Digitizer  2
 All Classes Functions Variables Typedefs Enumerations Friends Pages
GraphicsLinesForCurves.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 "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"
14 #include "GraphicsPointAbstractBase.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 
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 
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 
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 }
void updateGraphicsLinesToMatchGraphicsPoints(const CurveStyles &curveStyles, SplineDrawer &splineDrawer, QPainterPath &pathMultiValued, LineStyle &lineMultiValued)
Calls to moveLinesWithDraggedPoint have finished so update the lines correspondingly.
void removePoint(const QString &identifier)
Remove the specified point. The act of deleting it will automatically remove it from the GraphicsScen...
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
void lineMembershipReset()
Mark points as unwanted. Afterwards, lineMembershipPurge gets called.
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...
void print() const
Debugging method for printing directly from symbolic debugger.
GraphicsLinesForCurves()
Single constructor.
Model for DlgSettingsCurveProperties and CmdSettingsCurveProperties.
Definition: CurveStyles.h:22
void addPoint(const QString &curveName, const QString &pointIdentifier, double ordinal, GraphicsPoint &point)
Add new point.
void lineMembershipReset()
Mark points as unwanted. Afterwards, lineMembershipPurge gets called.
void removeTemporaryPointIfExists()
Remove temporary point if it exists.
Class that represents one digitized point. The screen-to-graph coordinate transformation is always ex...
Definition: Point.h:25
Window that displays the geometry information, as a table, for the current curve. ...
static QString temporaryPointIdentifier()
Point identifier for temporary point that is used by DigitzeStateAxis.
Definition: Point.cpp:519
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 ...
QString identifier() const
Unique identifier for a specific Point.
Definition: Point.cpp:268
void updatePointOrdinalsAfterDrag(const CurveStyles &curveStyles, const Transformation &transformation)
See GraphicsScene::updateOrdinalsAfterDrag.
void updatePointOrdinalsAfterDrag(const LineStyle &lineStyle, const Transformation &transformation)
See GraphicsScene::updateOrdinalsAfterDrag. Pretty much the same steps as Curve::updatePointOrdinals...
const LineStyle lineStyle(const QString &curveName) const
Get method for copying one line style in one step.
Definition: CurveStyles.cpp:97
This class stores the GraphicsLine objects for one Curve.
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...
Affine transformation between screen and graph coordinates, based on digitized axis points...
void printStream(QString indentation, QTextStream &str) const
Debugging method that supports print method of this class and printStream method of some other class(...
void printStream(QString indentation, QTextStream &str) const
Debugging method that supports print method of this class and printStream method of some other class(...
Details for a specific Line.
Definition: LineStyle.h:19
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...
Graphics item for drawing a circular or polygonal Point.
Definition: GraphicsPoint.h:43
CurveStyle curveStyle(const QString &curveName) const
CurveStyle in specified curve.
Definition: CurveStyles.cpp:79
void updateCurveStyles(const CurveStyles &modelCurveStyles)
Update the curve style for every curve.
QPointF pos() const
Proxy method for QGraphicsItem::pos.
Add point and line handling to generic QGraphicsScene.
Definition: GraphicsScene.h:36
This class takes the output from Spline and uses that to draw the curve in the graphics window...
Definition: SplineDrawer.h:34
void resetOnLoad()
Reset, when loading a document after the first, to same state that first document was at when loaded...
void addRemoveCurves(GraphicsScene &scene, const QStringList &curveNames)
Add new curves and remove expired curves to match the specified list.
void updateHighlightOpacity(double highlightOpacity)
Update the highlight opacity value. This may or may not affect the current display immediately depend...