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