Isis 3.0 Programmer Reference
Back | 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  QString 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  QString 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  QString 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  // QString 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 
Status SetType(MeasureType type)
Set how the coordinate was obtained.
double GetResidualMagnitude() const
Return Residual magnitude.
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 GetNumericalValue() const
Get the value associated with this log data.
This error is for when a programmer made an API call that was illegal.
Definition: IException.h:154
const ControlMeasure * GetRefMeasure() const
Get the reference control measure.
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:38
A type of error that could only have occurred due to a mistake on the user&#39;s part (e...
Definition: IException.h:134
bool IsEditLocked() const
Return value for p_editLock or implicit lock on reference measure.
GoodnessOfFit is pointreg information for reference measures.
QString GetCubeSerialNumber() const
Return the serial number of the cube containing the coordinate.
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 GetDiameter() const
Return the diameter of the crater in pixels (0 implies no crater)
static MeasureType StringToMeasureType(QString str)
static QString MeasureTypeToString(MeasureType type)
Return the String Control Measure type.

U.S. Department of the Interior | U.S. Geological Survey
ISIS | Privacy & Disclaimers | Astrogeology Research Program
To contact us, please post comments and questions on the ISIS Support Center
File Modified: 07/12/2023 23:13:37