Isis 3 Programmer Reference
AbstractPointItem.cpp
1
7/* SPDX-License-Identifier: CC0-1.0 */
8
9#include "AbstractPointItem.h"
10
11#include <QDateTime>
12#include <QMessageBox>
13#include <QString>
14#include <QVariant>
15
16#include "CnetDisplayProperties.h"
17#include "ControlMeasure.h"
18#include "ControlNet.h"
19#include "ControlPoint.h"
20#include "IException.h"
21#include "Latitude.h"
22#include "Longitude.h"
23#include "TableColumn.h"
24#include "TableColumnList.h"
25
26
27namespace Isis {
28 QString AbstractPointItem::getColumnName(Column col) {
29 switch (col) {
30 case Id:
31 return "Point ID";
32 case PointType:
33 return "Point Type";
34 case ChooserName:
35 return "Chooser Name";
36 case DateTime:
37 return "Date Time";
38 case EditLock:
39 return "Edit Lock";
40 case Ignored:
41 return "Ignored";
42 case Reference:
43 return "Reference";
44 case AdjustedSPLat:
45 return "Adjusted SP Lat";
46 case AdjustedSPLon:
47 return "Adjusted SP Lon";
48 case AdjustedSPRadius:
49 return "Adjusted SP Radius";
50 case AdjustedSPLatSigma:
51 return "Adjusted SP Lat Sigma";
52 case AdjustedSPLonSigma:
53 return "Adjusted SP Lon Sigma";
54 case AdjustedSPRadiusSigma:
55 return "Adjusted SP Radius Sigma";
56 case APrioriSPLat:
57 return "A Priori SP Lat";
58 case APrioriSPLon:
59 return "A Priori SP Lon";
60 case APrioriSPRadius:
61 return "A Priori SP Radius";
62 case APrioriSPLatSigma:
63 return "A Priori SP Lat Sigma";
64 case APrioriSPLonSigma:
65 return "A Priori SP Lon Sigma";
66 case APrioriSPRadiusSigma:
67 return "A Priori SP Radius Sigma";
68 case APrioriSPSource:
69 return "A Priori SP Source";
70 case APrioriSPSourceFile:
71 return "A Priori SP Source File";
72 case APrioriRadiusSource:
73 return "A Priori Radius Source";
74 case APrioriRadiusSourceFile:
75 return "A Priori Radius Source File";
76 case JigsawRejected:
77 return "Jigsaw Rejected";
78 }
79
80 return QString();
81 }
82
83
84 AbstractPointItem::Column AbstractPointItem::getColumn(QString columnTitle) {
85 for (int i = 0; i < COLS; i++) {
86 if (columnTitle == getColumnName((Column)i))
87 return (Column)i;
88 }
89
90 QString msg = "Column title [" + columnTitle + "] does not match any of "
91 "the defined column types";
92 throw IException(IException::Programmer, msg, _FILEINFO_);
93 }
94
95
96 TableColumnList *AbstractPointItem::createColumns() {
97 TableColumnList *columnList = new TableColumnList;
98
99 columnList->append(new TableColumn(getColumnName(Id), false, false));
100 columnList->append(
101 new TableColumn(getColumnName(PointType), false, false));
102 columnList->append(
103 new TableColumn(getColumnName(ChooserName), false, false));
104 columnList->append(
105 new TableColumn(getColumnName(DateTime), true, false));
106 columnList->append(
107 new TableColumn(getColumnName(EditLock), false, false));
108 columnList->append(
109 new TableColumn(getColumnName(Ignored), false, true));
110 columnList->append(
111 new TableColumn(getColumnName(Reference), false, false));
112 columnList->append(
113 new TableColumn(getColumnName(AdjustedSPLat), true, false));
114 columnList->append(
115 new TableColumn(getColumnName(AdjustedSPLon), true, false));
116 columnList->append(
117 new TableColumn(getColumnName(AdjustedSPRadius), true, false));
118 columnList->append(
119 new TableColumn(getColumnName(AdjustedSPLatSigma), true, false));
120 columnList->append(
121 new TableColumn(getColumnName(AdjustedSPLonSigma), true, false));
122 columnList->append(
123 new TableColumn(getColumnName(AdjustedSPRadiusSigma), true, false));
124 columnList->append(
125 new TableColumn(getColumnName(APrioriSPLat), false, false));
126 columnList->append(
127 new TableColumn(getColumnName(APrioriSPLon), false, false));
128 columnList->append(
129 new TableColumn(getColumnName(APrioriSPRadius), false, false));
130 columnList->append(
131 new TableColumn(getColumnName(APrioriSPLatSigma), false, false));
132 columnList->append(
133 new TableColumn(getColumnName(APrioriSPLonSigma), false, false));
134 columnList->append(
135 new TableColumn(getColumnName(APrioriSPRadiusSigma), false, false));
136 columnList->append(
137 new TableColumn(getColumnName(APrioriSPSource), false, false));
138 columnList->append(
139 new TableColumn(getColumnName(APrioriSPSourceFile), false, false));
140 columnList->append(
141 new TableColumn(getColumnName(APrioriRadiusSource), false, false));
142 columnList->append(new TableColumn(
143 getColumnName(APrioriRadiusSourceFile), false, false));
144 columnList->append(
145 new TableColumn(getColumnName(JigsawRejected), true, false));
146
147 return columnList;
148 }
149
150
151 AbstractPointItem::AbstractPointItem(ControlPoint *cp,
152 int avgCharWidth, AbstractTreeItem *parent)
153 : AbstractTreeItem(parent) {
154
155 m_point = cp;
156 calcDataWidth(avgCharWidth);
157
158 connect(m_point, SIGNAL(destroyed(QObject *)), this, SLOT(sourceDeleted()));
159 }
160
161
162 AbstractPointItem::~AbstractPointItem() {
163 m_point = NULL;
164 }
165
166
167 QVariant AbstractPointItem::getData() const {
168 return getData(getColumnName(Id));
169 }
170
171
172 QVariant AbstractPointItem::getData(QString columnTitle) const {
173 if (m_point) {
174 Column column = getColumn(columnTitle);
175
176 switch ((Column) column) {
177 case Id:
178 return QVariant((QString)m_point->GetId());
179 case PointType:
180 return QVariant((QString)m_point->GetPointTypeString());
181 case ChooserName:
182 return QVariant((QString)m_point->GetChooserName());
183 case DateTime:
184 // return QVariant(QDateTime::fromString(
185 // m_point->GetDateTime(), "yyyy-MM-ddTHH:mm:ss"));
186 return QVariant((QString)m_point->GetDateTime());
187 case EditLock:
188 if (m_point->IsEditLocked())
189 return QVariant("Yes");
190 else
191 return QVariant("No");
192 break;
193 case Ignored:
194 if (m_point->IsIgnored())
195 return QVariant("Yes");
196 else
197 return QVariant("No");
198 case Reference:
199 if (m_point->GetNumMeasures())
200 return QVariant(
201 CnetDisplayProperties::getInstance()->getImageName(
202 (QString) m_point->GetRefMeasure()->GetCubeSerialNumber()));
203 else
204 return QVariant();
205 case AdjustedSPLat:
206 return QVariant(
207 m_point->GetAdjustedSurfacePoint().GetLatitude().degrees());
208 case AdjustedSPLon:
209 return QVariant(
210 m_point->GetAdjustedSurfacePoint().GetLongitude().degrees());
211 case AdjustedSPRadius:
212 return QVariant(
213 m_point->GetAdjustedSurfacePoint().GetLocalRadius().meters());
214 case AdjustedSPLatSigma:
215 return QVariant(
216 m_point->GetAdjustedSurfacePoint().
217 GetLatSigmaDistance().meters());
218 case AdjustedSPLonSigma:
219 return QVariant(
220 m_point->GetAdjustedSurfacePoint().
221 GetLonSigmaDistance().meters());
222 case AdjustedSPRadiusSigma:
223 return QVariant(
224 m_point->GetAdjustedSurfacePoint().
225 GetLocalRadiusSigma().meters());
226 case APrioriSPLat:
227 return QVariant(
228 m_point->GetAprioriSurfacePoint().GetLatitude().degrees());
229 case APrioriSPLon:
230 return QVariant(
231 m_point->GetAprioriSurfacePoint().GetLongitude().degrees());
232 case APrioriSPRadius:
233 return QVariant(
234 m_point->GetAprioriSurfacePoint().GetLocalRadius().meters());
235 case APrioriSPLatSigma:
236 return QVariant(
237 m_point->GetAprioriSurfacePoint().
238 GetLatSigmaDistance().meters());
239 case APrioriSPLonSigma:
240 return QVariant(
241 m_point->GetAprioriSurfacePoint().
242 GetLonSigmaDistance().meters());
243 case APrioriSPRadiusSigma:
244 return QVariant(
245 m_point->GetAprioriSurfacePoint().
246 GetLocalRadiusSigma().meters());
247 case APrioriSPSource:
248 return QVariant((QString)m_point->GetSurfacePointSourceString());
249 case APrioriSPSourceFile:
250 return QVariant((QString)m_point->GetAprioriSurfacePointSourceFile());
251 case APrioriRadiusSource:
252 return QVariant((QString)m_point->GetRadiusSourceString());
253 case APrioriRadiusSourceFile:
254 return QVariant((QString)m_point->GetAprioriRadiusSourceFile());
255 case JigsawRejected:
256 if (m_point->IsRejected())
257 return QVariant("Yes");
258 else
259 return QVariant("No");
260 }
261 }
262
263 return QVariant();
264 }
265
266
267 void AbstractPointItem::setData(QString const &columnTitle,
268 QString const &newData) {
269 if (m_point) {
270 Column column = getColumn(columnTitle);
271
272 switch ((Column) column) {
273 case Id:
274 m_point->SetId(newData);
275 break;
276 case PointType:
277 m_point->SetType(m_point->StringToPointType(newData));
278 break;
279 case ChooserName:
280 m_point->SetChooserName(newData);
281 break;
282 case DateTime:
283 m_point->SetDateTime(newData);
284 break;
285 case EditLock:
286 if (newData == "Yes")
287 m_point->SetEditLock(true);
288 else
289 m_point->SetEditLock(false);
290 break;
291 case Ignored:
292 m_point->SetIgnored(newData == "Yes");
293 break;
294 case Reference:
295 m_point->SetRefMeasure(newData);
296 break;
297 case AdjustedSPLat:
298 m_point->SetAdjustedSurfacePoint(SurfacePoint(
299 Latitude(catchNull(newData), Angle::Degrees),
300 m_point->GetAdjustedSurfacePoint().GetLongitude(),
301 m_point->GetAdjustedSurfacePoint().GetLocalRadius()));
302 break;
303 case AdjustedSPLon:
304 m_point->SetAdjustedSurfacePoint(SurfacePoint(
305 m_point->GetAdjustedSurfacePoint().GetLatitude(),
306 Longitude(catchNull(newData), Angle::Degrees),
307 m_point->GetAdjustedSurfacePoint().GetLocalRadius()));
308 break;
309 case AdjustedSPRadius:
310 m_point->SetAdjustedSurfacePoint(SurfacePoint(
311 m_point->GetAdjustedSurfacePoint().GetLatitude(),
312 m_point->GetAdjustedSurfacePoint().GetLongitude(),
313 Distance(catchNull(newData), Distance::Meters)));
314 break;
315 case AdjustedSPLatSigma: {
316 QString msg = "Cannot set adjusted surface point latitude sigma";
317 throw IException(IException::Programmer, msg, _FILEINFO_);
318 break;
319 }
320 case AdjustedSPLonSigma: {
321 QString msg = "Cannot set adjusted surface point longitude sigma";
322 throw IException(IException::Programmer, msg, _FILEINFO_);
323 break;
324 }
325 case AdjustedSPRadiusSigma: {
326 QString msg = "Cannot set adjusted surface point radius sigma";
327 throw IException(IException::Programmer, msg, _FILEINFO_);
328 break;
329 }
330 case APrioriSPLat: {
331 Latitude newLat(catchNull(newData), Angle::Degrees);
332 SurfacePoint newSurfacePoint(prepareSurfacePoint(newLat,
333 m_point->GetAprioriSurfacePoint()));
334
335 newSurfacePoint.SetSphericalCoordinates(newLat,
336 newSurfacePoint.GetLongitude(),
337 newSurfacePoint.GetLocalRadius());
338 m_point->SetAprioriSurfacePoint(newSurfacePoint);
339 break;
340 }
341 case APrioriSPLon: {
342 Longitude newLon(catchNull(newData), Angle::Degrees);
343 SurfacePoint newSurfacePoint(prepareSurfacePoint(newLon,
344 m_point->GetAprioriSurfacePoint()));
345
346 newSurfacePoint.SetSphericalCoordinates(
347 newSurfacePoint.GetLatitude(),
348 newLon,
349 newSurfacePoint.GetLocalRadius());
350 m_point->SetAprioriSurfacePoint(newSurfacePoint);
351 break;
352 }
353 case APrioriSPRadius: {
354 Distance newRadius(catchNull(newData), Distance::Meters);
355 SurfacePoint newSurfacePoint(prepareSurfacePoint(newRadius,
356 m_point->GetAprioriSurfacePoint()));
357
358 newSurfacePoint.SetSphericalCoordinates(
359 newSurfacePoint.GetLatitude(),
360 newSurfacePoint.GetLongitude(),
361 newRadius);
362 m_point->SetAprioriSurfacePoint(newSurfacePoint);
363 break;
364 }
365 case APrioriSPLatSigma: {
366 Distance newSigma(catchNull(newData), Distance::Meters);
367 SurfacePoint newSurfacePoint(prepareSigmas(newSigma,
368 m_point->GetAprioriSurfacePoint()));
369
370 newSurfacePoint.SetSphericalSigmasDistance(
371 newSigma, newSurfacePoint.GetLonSigmaDistance(),
372 newSurfacePoint.GetLocalRadiusSigma());
373
374 m_point->SetAprioriSurfacePoint(newSurfacePoint);
375 break;
376 }
377 case APrioriSPLonSigma: {
378 Distance newSigma(catchNull(newData), Distance::Meters);
379 SurfacePoint newSurfacePoint(prepareSigmas(newSigma,
380 m_point->GetAprioriSurfacePoint()));
381
382 newSurfacePoint.SetSphericalSigmasDistance(
383 newSurfacePoint.GetLatSigmaDistance(), newSigma,
384 newSurfacePoint.GetLocalRadiusSigma());
385
386 m_point->SetAprioriSurfacePoint(newSurfacePoint);
387 break;
388 }
389 case APrioriSPRadiusSigma: {
390 Distance newSigma(catchNull(newData), Distance::Meters);
391 SurfacePoint newSurfacePoint(prepareSigmas(newSigma,
392 m_point->GetAprioriSurfacePoint()));
393
394 newSurfacePoint.SetSphericalSigmasDistance(
395 newSurfacePoint.GetLatSigmaDistance(),
396 newSurfacePoint.GetLonSigmaDistance(),
397 newSigma);
398
399 m_point->SetAprioriSurfacePoint(newSurfacePoint);
400 break;
401 }
402 case APrioriSPSource:
403 m_point->SetAprioriSurfacePointSource(
404 m_point->StringToSurfacePointSource(newData));
405 break;
406 case APrioriSPSourceFile:
407 m_point->SetAprioriSurfacePointSourceFile(newData);
408 break;
409 case APrioriRadiusSource:
410 m_point->SetAprioriRadiusSource(
411 m_point->StringToRadiusSource(newData));
412 break;
413 case APrioriRadiusSourceFile:
414 m_point->SetAprioriRadiusSourceFile(newData);
415 break;
416 case JigsawRejected:
417 // jigsaw rejected is not editable!
418 break;
419 }
420 }
421 }
422
423
424 // Returns true if the data at the given column is locked (i.e.
425 // edit-locked). If the m_point is edit-locked, all columns except the edit
426 // lock column should be uneditable.
427 bool AbstractPointItem::isDataEditable(QString columnTitle) const {
428 bool locked = true;
429 if (m_point->IsEditLocked()) {
430 if (getColumn(columnTitle) == EditLock)
431 locked = false;
432 }
433 else {
434 locked = false;
435 }
436
437 return !locked;
438 }
439
440
441 void AbstractPointItem::deleteSource() {
442 if (m_point) {
443 if (m_point->IsEditLocked()) {
444 QString msg = "Point [" + getFormattedData() + "] is edit locked and "
445 "cannot be deleted";
446 throw IException(IException::User, msg, _FILEINFO_);
447 }
448 else if (m_point->GetNumLockedMeasures() > 0) {
449 QString msg = "Point [" + getFormattedData() + "] has at least one "
450 "edit locked measure and cannot be deleted";
451 throw IException(IException::User, msg, _FILEINFO_);
452 }
453
454 ControlPoint *tempPoint = m_point;
455 m_point = NULL;
456 tempPoint->Parent()->DeletePoint(tempPoint);
457 }
458 }
459
460
461 AbstractTreeItem::InternalPointerType AbstractPointItem::getPointerType() const {
462 return AbstractTreeItem::Point;
463 }
464
465
466 void *AbstractPointItem::getPointer() const {
467 return m_point;
468 }
469
470
471 bool AbstractPointItem::hasPoint(ControlPoint *p) const {
472 return m_point == p;
473 }
474
475 void AbstractPointItem::sourceDeleted() {
476 m_point = NULL;
477 }
478
479
480 SurfacePoint AbstractPointItem::prepareSigmas(Distance newSigma,
481 SurfacePoint surfacePoint) {
482 const Distance free(10000, Distance::Meters);
483 Distance latSigDist = surfacePoint.GetLatSigmaDistance();
484 Distance lonSigDist = surfacePoint.GetLonSigmaDistance();
485 Distance radiusSigDist = surfacePoint.GetLocalRadiusSigma();
486
487 if (newSigma.isValid()) {
488 if (!latSigDist.isValid())
489 latSigDist = free;
490 if (!lonSigDist.isValid())
491 lonSigDist = free;
492 if (!radiusSigDist.isValid())
493 radiusSigDist = free;
494 }
495 else {
496 latSigDist = Distance();
497 lonSigDist = Distance();
498 radiusSigDist = Distance();
499 }
500
501 surfacePoint.SetSphericalSigmasDistance(
502 latSigDist, lonSigDist, radiusSigDist);
503 return surfacePoint;
504 }
505
506
507 SurfacePoint AbstractPointItem::prepareSurfacePoint(Latitude newLat,
508 SurfacePoint surfacePoint) {
509 if (newLat.isValid()) {
510 surfacePoint = prepareSurfacePoint(surfacePoint);
511 }
512 else {
513 surfacePoint.SetSphericalCoordinates(Latitude(), Longitude(),
514 Distance());
515 }
516
517 return surfacePoint;
518 }
519
520
521 SurfacePoint AbstractPointItem::prepareSurfacePoint(Longitude newLon,
522 SurfacePoint surfacePoint) {
523 if (newLon.isValid()) {
524 surfacePoint = prepareSurfacePoint(surfacePoint);
525 }
526 else {
527 surfacePoint.SetSphericalCoordinates(Latitude(), Longitude(),
528 Distance());
529 }
530
531 return surfacePoint;
532 }
533
534
535 SurfacePoint AbstractPointItem::prepareSurfacePoint(
536 Distance newRadius, SurfacePoint surfacePoint) {
537 if (newRadius.isValid()) {
538 surfacePoint = prepareSurfacePoint(surfacePoint);
539 }
540 else {
541 surfacePoint.SetSphericalCoordinates(Latitude(), Longitude(),
542 Distance());
543 }
544
545 return surfacePoint;
546 }
547
548
549 SurfacePoint AbstractPointItem::prepareSurfacePoint(
550 SurfacePoint surfacePoint) {
551 Latitude lat = surfacePoint.GetLatitude();
552 Longitude lon = surfacePoint.GetLongitude();
553 Distance radius = surfacePoint.GetLocalRadius();
554
555 if (!lat.isValid())
556 lat = Latitude(0, Angle::Degrees);
557 if (!lon.isValid())
558 lon = Longitude(0, Angle::Degrees);
559 if (!radius.isValid())
560 radius = Distance(10000, Distance::Meters);
561
562 surfacePoint.SetSphericalCoordinates(lat, lon, radius);
563 return surfacePoint;
564 }
565}
@ 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