1 #include "ControlPointGraphicsItem.h"
8 #include <QGraphicsScene>
9 #include <QGraphicsSceneContextMenuEvent>
11 #include <QMessageBox>
17 #include "MosaicGraphicsView.h"
18 #include "MosaicSceneWidget.h"
29 ControlPointGraphicsItem::ControlPointGraphicsItem(QPointF center,
33 m_centerPoint =
new QPointF(center);
34 m_mosaicScene = boundingRectSrc;
45 m_origPoint =
new QPointF(apriori);
48 setPen(QPen(Qt::red));
49 else if(cp->IsEditLocked())
50 setPen(QPen(Qt::magenta));
52 setPen(QPen(Qt::green));
54 setPen(QPen(Qt::darkGreen));
56 setPen(QPen(Qt::blue));
58 setBrush(Qt::NoBrush);
60 setToolTip(makeToolTip(snList));
63 setFiltersChildEvents(
true);
68 ControlPointGraphicsItem::~ControlPointGraphicsItem() {
83 void ControlPointGraphicsItem::paint(QPainter *painter,
84 const QStyleOptionGraphicsItem *style,
QWidget * widget) {
85 QRectF fullRect = calcRect();
86 QRectF crosshairRect = calcCrosshairRect();
88 if(crosshairRect.isNull())
91 if(rect() != fullRect) {
95 painter->setPen(pen());
96 painter->setBrush(brush());
98 QPointF center = crosshairRect.center();
100 QPointF centerLeft(crosshairRect.left(), center.y());
101 QPointF centerRight(crosshairRect.right(), center.y());
102 QPointF centerTop(center.x(), crosshairRect.top());
103 QPointF centerBottom(center.x(), crosshairRect.bottom());
105 painter->drawLine(centerLeft, centerRight);
106 painter->drawLine(centerTop, centerBottom);
108 if(!m_origPoint->isNull() && *m_origPoint != *m_centerPoint
112 painter->setPen(Qt::black);
113 painter->setBrush(Qt::black);
116 QColor zeroColor(Qt::black);
117 QColor fullColor(Qt::green);
119 bool isColored =
false;
123 int measureCount = m_controlPoint->
getMeasures(
true).count();
124 isColored = (measureCount >= fullColorMeasureCount);
127 fullColor = QColor(Qt::red);
129 double fullColorErrorMag = 0.0;
135 Statistics residualStats;
136 foreach (ControlMeasure *cm, m_controlPoint->
getMeasures(
true)) {
137 residualStats.AddData(cm->GetResidualMagnitude());
140 if (residualStats.Average() !=
Null) {
141 double errorMag = residualStats.Maximum();
142 if (errorMag >= fullColorErrorMag) {
148 QColor finalColor = isColored? fullColor : zeroColor;
150 painter->setPen(finalColor);
151 painter->setBrush(finalColor);
154 painter->drawLine(*m_origPoint, *m_centerPoint);
156 QPolygonF arrowHead = calcArrowHead();
157 painter->drawPolygon(arrowHead);
163 void ControlPointGraphicsItem::contextMenuEvent(
164 QGraphicsSceneContextMenuEvent * event) {
167 QAction *title = menu.addAction(
168 m_controlPoint->
GetId());
169 title->setEnabled(
false);
172 QAction *infoAction = menu.addAction(
"Show Point Info");
174 QAction *selected = menu.exec(event->screenPos());
176 if(selected == infoAction) {
177 QMessageBox::information(m_mosaicScene,
"Control Point Information",
188 QRectF ControlPointGraphicsItem::calcRect()
const {
189 QRectF pointRect(calcCrosshairRect());
191 if(!m_origPoint->isNull() && pointRect.isValid()) {
193 if(pointRect.left() > m_origPoint->x()) {
194 pointRect.setLeft(m_origPoint->x());
196 else if(pointRect.right() < m_origPoint->x()) {
197 pointRect.setRight(m_origPoint->x());
200 if(pointRect.top() > m_origPoint->y()) {
201 pointRect.setTop(m_origPoint->y());
203 else if(pointRect.bottom() < m_origPoint->y()) {
204 pointRect.setBottom(m_origPoint->y());
208 QPolygonF arrowHead = calcArrowHead();
210 if(arrowHead.size() > 2) {
211 pointRect = pointRect.united(arrowHead.boundingRect());
218 QRectF ControlPointGraphicsItem::calcCrosshairRect()
const {
221 if(m_centerPoint && !m_centerPoint->isNull() && m_mosaicScene) {
222 static const int size = 12;
223 QPoint findSpotScreen =
224 m_mosaicScene->getView()->mapFromScene(*m_centerPoint);
225 QPoint findSpotTopLeftScreen =
226 findSpotScreen - QPoint(size / 2, size / 2);
228 QRect pointRectScreen(findSpotTopLeftScreen, QSize(size, size));
231 m_mosaicScene->getView()->mapToScene(pointRectScreen).boundingRect();
238 QPolygonF ControlPointGraphicsItem::calcArrowHead()
const {
241 if(m_showArrow && !m_origPoint->isNull() &&
242 *m_origPoint != *m_centerPoint) {
243 QRectF crosshairRect = calcCrosshairRect();
244 double headSize = crosshairRect.width() * 4.0 / 5.0;
246 double crosshairSize = headSize;
249 QPointF lineVector = *m_centerPoint - *m_origPoint;
250 double lineVectorMag = sqrt(lineVector.x() * lineVector.x() +
251 lineVector.y() * lineVector.y());
252 double thetaPointOnLine = crosshairSize / (2 * (tanf(
PI / 6) / 2) *
254 QPointF pointOnLine = *m_centerPoint - thetaPointOnLine * lineVector;
256 QPointF normalVector = QPointF(-lineVector.y(), lineVector.x());
257 double thetaNormal = crosshairSize / (2 * lineVectorMag);
259 QPointF leftPoint = pointOnLine + thetaNormal * normalVector;
260 QPointF rightPoint = pointOnLine - thetaNormal * normalVector;
262 arrowHead << leftPoint << crosshairRect.center() << rightPoint;
269 QString ControlPointGraphicsItem::makeToolTip(SerialNumberList *snList) {
270 QString toolTip =
"<div>Point ID: " +
271 m_controlPoint->
GetId();
272 toolTip +=
"<br />Point Type: " +
274 toolTip +=
"<br />Number of Measures: ";
275 toolTip +=
toString(m_controlPoint->GetNumMeasures());
276 toolTip +=
"<br />Ignored: ";
277 toolTip += m_controlPoint->IsIgnored() ?
"Yes" :
"No";
278 toolTip +=
"<br />Edit Locked: ";
279 toolTip += m_controlPoint->IsEditLocked() ?
"Yes" :
"No";
289 for(
int snIndex = 0; snIndex < serialNums.size(); snIndex ++) {
290 QString serialNum = serialNums[snIndex];
295 if(snList->HasSerialNumber(serialNum)) {
297 FileName(snList->FileName(serialNum)).name();
298 toolTip +=
" (" + serialNum +
")";
301 toolTip += serialNum;
305 if (residMag !=
Null) {
306 toolTip +=
" [residual: <font color='red'>" +
toString(residMag) +
"</font>]";