8 #include "DocumentModelCoords.h" 9 #include "EngaugeAssert.h" 10 #include "EnumsToQt.h" 11 #include "GridLineFactory.h" 15 #include <QGraphicsItem> 16 #include <QGraphicsScene> 19 #include <QTextStream> 20 #include "QtToString.h" 21 #include "Transformation.h" 23 const int NUM_AXES_POINTS_2 = 2;
24 const int NUM_AXES_POINTS_3 = 3;
25 const int NUM_AXES_POINTS_4 = 4;
27 extern const QString DUMMY_CURVE_NAME;
32 const int CHECKER_POINTS_WIDTH = 5;
46 const QList<Point> &points,
51 LOG4CPP_INFO_S ((*mainCat)) <<
"Checker::adjustPolarAngleRanges transformation=" << transformation;
53 const double UNIT_LENGTH = 1.0;
56 if (modelCoords.
coordsType() == COORDS_TYPE_POLAR) {
61 path = QString (
"yMin=%1 ").arg (yMin);
65 double angle0 = points.at(0).posGraph().x();
66 double angle1 = points.at(1).posGraph().x();
67 double angle2 = points.at(2).posGraph().x();
69 QPointF (angle0, UNIT_LENGTH));
71 QPointF (angle1, UNIT_LENGTH));
73 QPointF (angle2, UNIT_LENGTH));
77 double sumAngle0 = angleBetweenVectors(pos0, pos1) + angleBetweenVectors(pos0, pos2);
78 double sumAngle1 = angleBetweenVectors(pos1, pos0) + angleBetweenVectors(pos1, pos2);
79 double sumAngle2 = angleBetweenVectors(pos2, pos0) + angleBetweenVectors(pos2, pos1);
80 if ((sumAngle0 <= sumAngle1) && (sumAngle0 <= sumAngle2)) {
83 if ((angleFromVectorToVector (pos0, pos1) < 0) ||
84 (angleFromVectorToVector (pos0, pos2) > 0)) {
85 path += QString (
"from 1=%1 through 0 to 2=%2").arg (angle1).arg (angle2);
89 path += QString (
"from 2=%1 through 0 to 1=%2").arg (angle2).arg (angle1);
93 }
else if ((sumAngle1 <= sumAngle0) && (sumAngle1 <= sumAngle2)) {
96 if ((angleFromVectorToVector (pos1, pos0) < 0) ||
97 (angleFromVectorToVector (pos1, pos2) > 0)) {
98 path += QString (
"from 0=%1 through 1 to 2=%2").arg (angle0).arg (angle2);
102 path += QString (
"from 2=%1 through 1 to 0=%2").arg (angle2).arg (angle0);
109 if ((angleFromVectorToVector (pos2, pos0) < 0) ||
110 (angleFromVectorToVector (pos2, pos1) > 0)) {
111 path += QString (
"from 0=%1 through 2 to 1=%2").arg (angle0).arg (angle1);
115 path += QString (
"from 1=%1 through 2 to 0=%2").arg (angle1).arg (angle0);
122 while (xMax < xMin) {
126 path += QString (
" xMax+=%1").arg (thetaPeriod);
132 LOG4CPP_INFO_S ((*mainCat)) <<
"Checker::adjustPolarAngleRanges path=(" << path.toLatin1().data() <<
")";
139 DocumentAxesPointsRequired documentAxesPointsRequired)
141 LOG4CPP_INFO_S ((*mainCat)) <<
"Checker::prepareForDisplay";
143 ENGAUGE_ASSERT ((polygon.count () == NUM_AXES_POINTS_2) ||
144 (polygon.count () == NUM_AXES_POINTS_3) ||
145 (polygon.count () == NUM_AXES_POINTS_4));
150 QPolygonF::const_iterator itr;
151 for (itr = polygon.begin (); itr != polygon.end (); itr++) {
153 const QPointF &pF = *itr;
155 Point p (DUMMY_CURVE_NAME,
159 points.push_back (p);
170 documentAxesPointsRequired);
178 DocumentAxesPointsRequired documentAxesPointsRequired)
180 LOG4CPP_INFO_S ((*mainCat)) <<
"Checker::prepareForDisplay " 181 <<
" transformation=" << transformation;
183 ENGAUGE_ASSERT ((points.count () == NUM_AXES_POINTS_2) ||
184 (points.count () == NUM_AXES_POINTS_3) ||
185 (points.count () == NUM_AXES_POINTS_4));
188 m_gridLines.
clear ();
190 bool fourPoints = (documentAxesPointsRequired == DOCUMENT_AXES_POINTS_REQUIRED_4);
193 double xFrom = 0, xTo = 0, yFrom = 0, yTo = 0;
197 for (i = 0; i < points.count(); i++) {
198 if (!fourPoints || (points.at(i).isXOnly() && fourPoints)) {
202 xFrom = points.at(i).posGraph().x();
203 xTo = points.at(i).posGraph().x();
206 xFrom = qMin (xFrom, points.at(i).posGraph().x());
207 xTo = qMax (xTo , points.at(i).posGraph().x());
211 if (!fourPoints || (!points.at(i).isXOnly() && fourPoints)) {
215 yFrom = points.at(i).posGraph().y();
216 yTo = points.at(i).posGraph().y();
219 yFrom = qMin (yFrom, points.at(i).posGraph().y());
220 yTo = qMax (yTo , points.at(i).posGraph().y());
227 adjustPolarAngleRanges (modelCoords,
239 m_gridLines.
add (factory.
createGridLine (xFrom, yFrom, xFrom, yTo , transformation));
240 m_gridLines.
add (factory.
createGridLine (xFrom, yTo , xTo , yTo , transformation));
241 m_gridLines.
add (factory.
createGridLine (xTo , yTo , xTo , yFrom, transformation));
242 m_gridLines.
add (factory.
createGridLine (xTo , yFrom, xFrom, yFrom, transformation));
254 QColor color = ColorPaletteToQColor (modelAxesChecker.
lineColor());
255 QPen pen (QBrush (color), CHECKER_POINTS_WIDTH);
Factory class for generating the points, composed of QGraphicsItem objects, along a GridLine.
void clear()
Deallocate and remove all grid lines.
void setPen(const QPen &pen)
Set the pen style of each grid line.
virtual void updateModelAxesChecker(const DocumentModelAxesChecker &modelAxesChecker)
Apply the new DocumentModelAxesChecker, to the points already associated with this object.
double thetaPeriod() const
Return the period of the theta value for polar coordinates, consistent with CoordThetaUnits.
Class that represents one digitized point. The screen-to-graph coordinate transformation is always ex...
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.
ColorPalette lineColor() const
Get method for line color.
Model for DlgSettingsCoords and CmdSettingsCoords.
void setVisible(bool visible)
Make all grid lines visible or hidden.
Model for DlgSettingsAxesChecker and CmdSettingsAxesChecker.
CoordsType coordsType() const
Get method for coordinates type.
void add(GridLine *gridLine)
Add specified grid line. Ownership of all allocated QGraphicsItems is passed to new GridLine.
Checker(QGraphicsScene &scene)
Single constructor for DlgSettingsAxesChecker, which does not have an explicit transformation....
void setVisible(bool visible)
Show/hide this axes checker.
double originRadius() const
Get method for origin radius in polar mode.
GridLine * createGridLine(double xFrom, double yFrom, double xTo, double yTo, const Transformation &transformation)
Create grid line, either along constant X/theta or constant Y/radius side.