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;
45 const QList<Point> &points,
50 LOG4CPP_INFO_S ((*mainCat)) <<
"Checker::adjustPolarAngleRanges transformation=" << transformation;
52 const double UNIT_LENGTH = 1.0;
55 if (modelCoords.
coordsType() == COORDS_TYPE_POLAR) {
60 path = QString (
"yMin=%1 ").arg (yMin);
64 double angle0 = points.at(0).posGraph().x();
65 double angle1 = points.at(1).posGraph().x();
66 double angle2 = points.at(2).posGraph().x();
68 QPointF (angle0, UNIT_LENGTH));
70 QPointF (angle1, UNIT_LENGTH));
72 QPointF (angle2, UNIT_LENGTH));
76 double sumAngle0 = angleBetweenVectors(pos0, pos1) + angleBetweenVectors(pos0, pos2);
77 double sumAngle1 = angleBetweenVectors(pos1, pos0) + angleBetweenVectors(pos1, pos2);
78 double sumAngle2 = angleBetweenVectors(pos2, pos0) + angleBetweenVectors(pos2, pos1);
79 if ((sumAngle0 <= sumAngle1) && (sumAngle0 <= sumAngle2)) {
82 if ((angleFromVectorToVector (pos0, pos1) < 0) ||
83 (angleFromVectorToVector (pos0, pos2) > 0)) {
84 path += QString (
"from 1=%1 through 0 to 2=%2").arg (angle1).arg (angle2);
88 path += QString (
"from 2=%1 through 0 to 1=%2").arg (angle2).arg (angle1);
92 }
else if ((sumAngle1 <= sumAngle0) && (sumAngle1 <= sumAngle2)) {
95 if ((angleFromVectorToVector (pos1, pos0) < 0) ||
96 (angleFromVectorToVector (pos1, pos2) > 0)) {
97 path += QString (
"from 0=%1 through 1 to 2=%2").arg (angle0).arg (angle2);
101 path += QString (
"from 2=%1 through 1 to 0=%2").arg (angle2).arg (angle0);
108 if ((angleFromVectorToVector (pos2, pos0) < 0) ||
109 (angleFromVectorToVector (pos2, pos1) > 0)) {
110 path += QString (
"from 0=%1 through 2 to 1=%2").arg (angle0).arg (angle1);
114 path += QString (
"from 1=%1 through 2 to 0=%2").arg (angle1).arg (angle0);
121 while (xMax < xMin) {
125 path += QString (
" xMax+=%1").arg (thetaPeriod);
131 LOG4CPP_INFO_S ((*mainCat)) <<
"Checker::adjustPolarAngleRanges path=(" << path.toLatin1().data() <<
")";
138 DocumentAxesPointsRequired documentAxesPointsRequired)
140 LOG4CPP_INFO_S ((*mainCat)) <<
"Checker::prepareForDisplay";
142 ENGAUGE_ASSERT ((polygon.count () == NUM_AXES_POINTS_2) ||
143 (polygon.count () == NUM_AXES_POINTS_3) ||
144 (polygon.count () == NUM_AXES_POINTS_4));
149 QPolygonF::const_iterator itr;
150 for (itr = polygon.begin (); itr != polygon.end (); itr++) {
152 const QPointF &pF = *itr;
154 Point p (DUMMY_CURVE_NAME,
158 points.push_back (p);
169 documentAxesPointsRequired);
177 DocumentAxesPointsRequired documentAxesPointsRequired)
179 LOG4CPP_INFO_S ((*mainCat)) <<
"Checker::prepareForDisplay "
180 <<
" transformation=" << transformation;
182 ENGAUGE_ASSERT ((points.count () == NUM_AXES_POINTS_2) ||
183 (points.count () == NUM_AXES_POINTS_3) ||
184 (points.count () == NUM_AXES_POINTS_4));
187 m_gridLines.
clear ();
189 bool fourPoints = (documentAxesPointsRequired == DOCUMENT_AXES_POINTS_REQUIRED_4);
192 double xFrom = 0, xTo = 0, yFrom = 0, yTo = 0;
196 for (i = 0; i < points.count(); i++) {
197 if (!fourPoints || (points.at(i).isXOnly() && fourPoints)) {
201 xFrom = points.at(i).posGraph().x();
202 xTo = points.at(i).posGraph().x();
205 xFrom = qMin (xFrom, points.at(i).posGraph().x());
206 xTo = qMax (xTo , points.at(i).posGraph().x());
210 if (!fourPoints || (!points.at(i).isXOnly() && fourPoints)) {
214 yFrom = points.at(i).posGraph().y();
215 yTo = points.at(i).posGraph().y();
218 yFrom = qMin (yFrom, points.at(i).posGraph().y());
219 yTo = qMax (yTo , points.at(i).posGraph().y());
226 adjustPolarAngleRanges (modelCoords,
238 m_gridLines.
add (factory.
createGridLine (xFrom, yFrom, xFrom, yTo , transformation));
239 m_gridLines.
add (factory.
createGridLine (xFrom, yTo , xTo , yTo , transformation));
240 m_gridLines.
add (factory.
createGridLine (xTo , yTo , xTo , yFrom, transformation));
241 m_gridLines.
add (factory.
createGridLine (xTo , yFrom, xFrom, yFrom, transformation));
253 QColor color = ColorPaletteToQColor (modelAxesChecker.
lineColor());
254 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 originRadius() const
Get method for origin radius in polar mode.
ColorPalette lineColor() const
Get method for line color.
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...
double thetaPeriod() const
Return the period of the theta value for polar coordinates, consistent with CoordThetaUnits.
CoordsType coordsType() const
Get method for coordinates type.
Model for DlgSettingsCoords and CmdSettingsCoords.
void setVisible(bool visible)
Make all grid lines visible or hidden.
Model for DlgSettingsAxesChecker and CmdSettingsAxesChecker.
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. The identity transformation is assumed.
void setVisible(bool visible)
Show/hide this axes checker.
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.