Isis 3 Programmer Reference
AbstractMeasureItem.cpp
1 #include "IsisDebug.h"
2 
3 #include "AbstractMeasureItem.h"
4 
5 #include <QMessageBox>
6 #include <QString>
7 #include <QVariant>
8 
9 #include "CnetDisplayProperties.h"
10 #include "ControlMeasure.h"
11 #include "ControlMeasureLogData.h"
12 #include "ControlPoint.h"
13 #include "IException.h"
14 
15 
16 #include "TableColumn.h"
17 #include "TableColumnList.h"
18 
19 
20 namespace Isis {
21  QString AbstractMeasureItem::getColumnName(Column col) {
22  switch (col) {
23  case PointId:
24  return "Point ID";
25  case ImageId:
26  return "Image ID";
27  case Sample:
28  return "Sample";
29  case Line:
30  return "Line";
31  case EditLock:
32  return "Edit Locked";
33  case Ignored:
34  return "Ignored";
35  case Reference:
36  return "Reference";
37  case Type:
38  return "Measure Type";
39  case Obsolete_Eccentricity:
40  return "Obsolete_Eccentricity";
41  case GoodnessOfFit:
42  return "Goodness of Fit";
43  case MinPixelZScore:
44  return "Minimum Pixel Z-Score";
45  case MaxPixelZScore:
46  return "Maximum Pixel Z-Score";
47  case SampleShift:
48  return "Sample Shift";
49  case LineShift:
50  return "Line Shift";
51  case SampleSigma:
52  return "Sample Sigma";
53  case LineSigma:
54  return "Line Sigma";
55  case APrioriSample:
56  return "A Priori Sample";
57  case APrioriLine:
58  return "A Priori Line";
59  case Diameter:
60  return "Diameter";
61  case JigsawRejected:
62  return "Rejected by Jigsaw";
63  case ResidualSample:
64  return "Residual Sample";
65  case ResidualLine:
66  return "Residual Line";
67  case ResidualMagnitude:
68  return "Residual Magnitude";
69  }
70 
71  ASSERT(0);
72  return QString();
73  }
74 
75 
76  AbstractMeasureItem::Column AbstractMeasureItem::getColumn(
77  QString columnTitle) {
78  for (int i = 0; i < COLS; i++) {
79  if (columnTitle == getColumnName((Column) i))
80  return (Column) i;
81  }
82 
83  QString msg = "Column title [" + columnTitle + "] does not match any of "
84  "the defined column types";
85  throw IException(IException::Programmer, msg, _FILEINFO_);
86  }
87 
88 
89  TableColumnList *AbstractMeasureItem::createColumns() {
90  TableColumnList *columnList = new TableColumnList;
91 
92  columnList->append(new TableColumn(getColumnName(PointId), true, false));
93  columnList->append(new TableColumn(getColumnName(ImageId), true,
94  true));
95  columnList->append(new TableColumn(getColumnName(Sample), true, false));
96  columnList->append(new TableColumn(getColumnName(Line), true, false));
97  columnList->append(new TableColumn(getColumnName(EditLock), false,
98  false));
99  columnList->append(new TableColumn(getColumnName(Ignored), false, true));
100  columnList->append(new TableColumn(getColumnName(Reference), true, true));
101  columnList->append(new TableColumn(getColumnName(Type), false, false));
102  columnList->append(new TableColumn(getColumnName(Obsolete_Eccentricity), true,
103  false));
104  columnList->append(new TableColumn(getColumnName(GoodnessOfFit), true,
105  false));
106  columnList->append(new TableColumn(getColumnName(MinPixelZScore), true,
107  false));
108  columnList->append(new TableColumn(getColumnName(MaxPixelZScore), true,
109  false));
110  columnList->append(new TableColumn(getColumnName(SampleShift), true,
111  false));
112  columnList->append(new TableColumn(getColumnName(LineShift), true,
113  false));
114  columnList->append(new TableColumn(getColumnName(SampleSigma), false,
115  false));
116  columnList->append(new TableColumn(getColumnName(LineSigma), false,
117  false));
118  columnList->append(new TableColumn(getColumnName(APrioriSample), true,
119  false));
120  columnList->append(new TableColumn(getColumnName(APrioriLine), true,
121  false));
122  columnList->append(new TableColumn(getColumnName(Diameter), false,
123  false));
124  columnList->append(new TableColumn(getColumnName(JigsawRejected), true,
125  false));
126  columnList->append(new TableColumn(getColumnName(ResidualSample), true,
127  false));
128  columnList->append(new TableColumn(getColumnName(ResidualLine), true,
129  false));
130  columnList->append(new TableColumn(getColumnName(ResidualMagnitude),
131  true, false));
132 
133  return columnList;
134  }
135 
136  AbstractMeasureItem::AbstractMeasureItem(ControlMeasure *cm,
137  int avgCharWidth, AbstractTreeItem *parent)
138  : AbstractTreeItem(parent) {
139  ASSERT(cm);
140  m_measure = cm;
141  calcDataWidth(avgCharWidth);
142 
143  connect(m_measure, SIGNAL(destroyed(QObject *)), this, SLOT(sourceDeleted()));
144  }
145 
146 
147  AbstractMeasureItem::~AbstractMeasureItem() {
148  m_measure = NULL;
149  }
150 
151 
152  QVariant AbstractMeasureItem::getData() const {
153  return getData(getColumnName(ImageId));
154  }
155 
156 
157  QVariant AbstractMeasureItem::getData(QString columnTitle) const {
158  if (m_measure) {
159  Column column = getColumn(columnTitle);
160 
161  switch ((Column) column) {
162  case PointId:
163  return QVariant((QString) m_measure->Parent()->GetId());
164  case ImageId:
165  return QVariant(CnetDisplayProperties::getInstance()->getImageName(
166  (QString) m_measure->GetCubeSerialNumber()));
167  case Sample:
168  return QVariant(m_measure->GetSample());
169  case Line:
170  return QVariant(m_measure->GetLine());
171  case EditLock:
172  if (m_measure->IsEditLocked())
173  return QVariant("Yes");
174  else
175  return QVariant("No");
176  case Ignored:
177  if (m_measure->IsIgnored())
178  return QVariant("Yes");
179  else
180  return QVariant("No");
181  case Reference:
182  if (m_measure->Parent()->GetRefMeasure() == m_measure)
183  return QVariant("Yes");
184  else
185  return QVariant("No");
186  case Type:
187  return QVariant(
188  (QString)m_measure->MeasureTypeToString(m_measure->GetType()));
189  case Obsolete_Eccentricity:
190  return QVariant(
191  m_measure->GetLogData(
193  case GoodnessOfFit:
194  return QVariant(
195  m_measure->GetLogData(
197  case MinPixelZScore:
198  return QVariant(
199  m_measure->GetLogData(ControlMeasureLogData::MinimumPixelZScore).
200  GetNumericalValue());
201  case MaxPixelZScore:
202  return QVariant(
203  m_measure->GetLogData(ControlMeasureLogData::MaximumPixelZScore).
204  GetNumericalValue());
205  case SampleShift:
206  return QVariant(m_measure->GetSampleShift());
207  case LineShift:
208  return QVariant(m_measure->GetLineShift());
209  case SampleSigma:
210  return QVariant(m_measure->GetSampleSigma());
211  case LineSigma:
212  return QVariant(m_measure->GetLineSigma());
213  case APrioriSample:
214  return QVariant(m_measure->GetAprioriSample());
215  case APrioriLine:
216  return QVariant(m_measure->GetAprioriLine());
217  case Diameter:
218  return QVariant(m_measure->GetDiameter());
219  case JigsawRejected:
220  if (m_measure->IsRejected())
221  return QVariant("Yes");
222  else
223  return QVariant("No");
224  case ResidualSample:
225  return QVariant(m_measure->GetSampleResidual());
226  case ResidualLine:
227  return QVariant(m_measure->GetLineResidual());
228  case ResidualMagnitude:
229  return QVariant(
230  m_measure->GetResidualMagnitude());
231  }
232  }
233 
234  return QVariant();
235  }
236 
237 
238  void AbstractMeasureItem::setData(QString const &columnTitle,
239  QString const &newData) {
240  if (m_measure) {
241  Column column = getColumn(columnTitle);
242 
243  switch ((Column) column) {
244  case PointId:
245  // PointId is not editable in the measure table
246  break;
247  case ImageId:
248  m_measure->SetCubeSerialNumber(
249  CnetDisplayProperties::getInstance()->getSerialNumber(newData));
250  break;
251  case Sample:
252  m_measure->SetCoordinate(catchNull(newData),
253  m_measure->GetLine());
254  break;
255  case Line:
256  m_measure->SetCoordinate(m_measure->GetSample(),
257  catchNull(newData));
258  break;
259  case EditLock:
260  if (newData == "Yes")
261  m_measure->SetEditLock(true);
262  else
263  m_measure->SetEditLock(false);
264  break;
265  case Ignored:
266  if (newData == "Yes")
267  m_measure->SetIgnored(true);
268  else if (newData == "No")
269  m_measure->SetIgnored(false);
270  break;
271  case Reference:
272  // A measure's reference status should never be editable. It should
273  // only be changed through the point.
274  break;
275  case Type:
276  m_measure->SetType(m_measure->StringToMeasureType(
277  CnetDisplayProperties::getInstance()->getSerialNumber(
278  newData)));
279  break;
280  case Obsolete_Eccentricity:
281  setLogData(m_measure, ControlMeasureLogData::Obsolete_Eccentricity, newData);
282  break;
283  case GoodnessOfFit:
284  setLogData(m_measure, ControlMeasureLogData::GoodnessOfFit, newData);
285  break;
286  case MinPixelZScore:
287  setLogData(m_measure, ControlMeasureLogData::MinimumPixelZScore,
288  newData);
289  break;
290  case MaxPixelZScore:
291  setLogData(m_measure, ControlMeasureLogData::MaximumPixelZScore,
292  newData);
293  break;
294  case SampleShift:
295  // This is not editable anymore.
296  break;
297  case LineShift:
298  // This is not editable anymore.
299  break;
300  case SampleSigma:
301  m_measure->SetSampleSigma(catchNull(newData));
302  break;
303  case LineSigma:
304  m_measure->SetLineSigma(catchNull(newData));
305  break;
306  case APrioriSample:
307  m_measure->SetAprioriSample(catchNull(newData));
308  break;
309  case APrioriLine:
310  m_measure->SetAprioriLine(catchNull(newData));
311  break;
312  case Diameter:
313  m_measure->SetDiameter(catchNull(newData));
314  break;
315  case JigsawRejected:
316  // jigsaw rejected is not editable!
317  break;
318  case ResidualSample:
319  m_measure->SetResidual(
320  catchNull(newData), m_measure->GetLineResidual());
321  break;
322  case ResidualLine:
323  m_measure->SetResidual(
324  m_measure->GetSampleResidual(), catchNull(newData));
325  break;
326  case ResidualMagnitude:
327  // residual magnitude is not editable!
328  break;
329  }
330  }
331  }
332 
333 
334  // Returns true if the data at the given column is locked (i.e. is
335  // edit-locked). If the m_measure is edit-locked, all columns except the edit
336  // lock column should be uneditable. If the m_measure's parent point is
337  // edit-locked, none of the columns should be editable as it should only be
338  // unlocked from the parent point.
339  bool AbstractMeasureItem::isDataEditable(QString columnTitle) const {
340  bool parentLocked = !m_measure->Parent() ||
341  m_measure->Parent()->IsEditLocked();
342  bool locked = m_measure->IsEditLocked() || parentLocked;
343 
344  if (getColumn(columnTitle) == EditLock && !parentLocked) {
345  locked = false;
346  }
347 
348  return !locked;
349  }
350 
351 
352  void AbstractMeasureItem::deleteSource() {
353  if (m_measure) {
354  if (m_measure->Parent()->IsEditLocked()) {
355  QString msg = "Measures in point [" +
356  getFormattedData(getColumnName(PointId)) +
357  "] cannot be deleted because point is edit locked";
358  throw IException(IException::User, msg, _FILEINFO_);
359  }
360 
361  else if (m_measure->IsEditLocked()) {
362  QString msg = "Measure [" + getFormattedData() + "] in point [" +
363  getFormattedData(getColumnName(PointId)) +
364  "] cannot be deleted because m_measure is edit locked";
365  throw IException(IException::User, msg, _FILEINFO_);
366  }
367  // else if (m_measure->Parent()->GetRefMeasure() == m_measure) {
368  // QString msg = "Measure [" + getData() + "] in point [" +
369  // getData(getColumnName(PointId)) + "] cannot be deleted because "
370  // "it is the reference";
371  // throw iException::Message(iException::User, msg, _FILEINFO_);
372  // }
373 
374  ControlMeasure *tempMeasure = m_measure;
375  m_measure = NULL;
376  tempMeasure->Parent()->Delete(tempMeasure);
377  }
378  }
379 
380 
381  AbstractTreeItem::InternalPointerType AbstractMeasureItem::getPointerType()
382  const {
383  return AbstractTreeItem::Measure;
384  }
385 
386 
387  void *AbstractMeasureItem::getPointer() const {
388  return m_measure;
389  }
390 
391 
392  bool AbstractMeasureItem::hasMeasure(ControlMeasure *m) const {
393  return m_measure == m;
394  }
395 
396 
397  void AbstractMeasureItem::sourceDeleted() {
398  m_measure = NULL;
399  }
400 
401 
402  void AbstractMeasureItem::setLogData(ControlMeasure *m_measure,
403  int m_measureLogDataEnum, const QString &value) {
404  ASSERT(m_measure);
405 
406  QString newDataStr = value.toLower();
408  (ControlMeasureLogData::NumericLogDataType) m_measureLogDataEnum;
409 
410  if (newDataStr == "null") {
411  m_measure->DeleteLogData(type);
412  }
413  else {
414  m_measure->SetLogData(ControlMeasureLogData(type,
415  value.toDouble()));
416  }
417  }
418 }
419 
Status SetType(MeasureType type)
Set how the coordinate was obtained.
Deprecated keyword kept for backwards compatability with older Control Networks.
NumericLogDataType
Please do not change existing values in this list except the size - it will break backwards compadibi...
double GetResidualMagnitude() const
Return Residual magnitude.
This error is for when a programmer made an API call that was illegal.
Definition: IException.h:162
Control measures store z-scores in pairs.
Status SetDiameter(double diameter)
Set the crater diameter at the coordinate.
Status SetResidual(double sampResidual, double lineResidual)
Set the BundleAdjust Residual of the coordinate.
QString GetId() const
Return the Id of the control point.
#define _FILEINFO_
Macro for the filename and line number.
Definition: IException.h:40
A type of error that could only have occurred due to a mistake on the user&#39;s part (e...
Definition: IException.h:142
const ControlMeasure * GetRefMeasure() const
Get the reference control measure.
GoodnessOfFit is pointreg information for reference measures.
Namespace for ISIS/Bullet specific routines.
Definition: Apollo.h:31
bool IsEditLocked() const
Return value for p_editLock or implicit lock on reference measure.
Status SetCubeSerialNumber(QString newSerialNumber)
Set cube serial number.
Status SetCoordinate(double sample, double line)
Set the coordinate of the measurement.
int Delete(ControlMeasure *measure)
Remove a measurement from the control point, deleting reference measure is allowed.
double GetNumericalValue() const
Get the value associated with this log data.
double GetDiameter() const
Return the diameter of the crater in pixels (0 implies no crater)
QString GetCubeSerialNumber() const
Return the serial number of the cube containing the coordinate.
static MeasureType StringToMeasureType(QString str)
static QString MeasureTypeToString(MeasureType type)
Return the String Control Measure type.