USGS

Isis 3.0 Object Programmers' Reference

Home

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