File failed to load: https://isis.astrogeology.usgs.gov/6.0.0/Object/assets/jax/output/NativeMML/config.js
Isis 3 Programmer Reference
ControlPointV0003.cpp
1 
7 /* SPDX-License-Identifier: CC0-1.0 */
8 
9 #include "ControlPointV0003.h"
10 
11 #include <QString>
12 
13 #include "ControlMeasureLogData.h"
14 #include "ControlPointFileEntryV0002.pb.h"
15 #include "ControlPointV0002.h"
16 #include "IException.h"
17 #include "PvlObject.h"
18 #include "PvlContainer.h"
19 
20 using namespace std;
21 
22 namespace Isis {
23 
29  ControlPointV0003::ControlPointV0003(QSharedPointer<ControlPointFileEntryV0002> pointData)
30  : m_pointData(pointData) {
31 
32  }
33 
34 
41  : m_pointData(new ControlPointFileEntryV0002) {
42 
43  // Copy over strings, doubles, and bools
44  copy(pointObject, "PointId",
45  m_pointData, &ControlPointFileEntryV0002::set_id);
46  copy(pointObject, "ChooserName",
47  m_pointData, &ControlPointFileEntryV0002::set_choosername);
48  copy(pointObject, "DateTime",
49  m_pointData, &ControlPointFileEntryV0002::set_datetime);
50  copy(pointObject, "AprioriXYZSourceFile",
51  m_pointData, &ControlPointFileEntryV0002::set_apriorisurfpointsourcefile);
52  copy(pointObject, "AprioriRadiusSourceFile",
53  m_pointData, &ControlPointFileEntryV0002::set_aprioriradiussourcefile);
54  copy(pointObject, "JigsawRejected",
55  m_pointData, &ControlPointFileEntryV0002::set_jigsawrejected);
56  copy(pointObject, "EditLock",
57  m_pointData, &ControlPointFileEntryV0002::set_editlock);
58  copy(pointObject, "Ignore",
59  m_pointData, &ControlPointFileEntryV0002::set_ignore);
60  copy(pointObject, "AprioriX",
61  m_pointData, &ControlPointFileEntryV0002::set_apriorix);
62  copy(pointObject, "AprioriY",
63  m_pointData, &ControlPointFileEntryV0002::set_aprioriy);
64  copy(pointObject, "AprioriZ",
65  m_pointData, &ControlPointFileEntryV0002::set_aprioriz);
66  copy(pointObject, "AdjustedX",
67  m_pointData, &ControlPointFileEntryV0002::set_adjustedx);
68  copy(pointObject, "AdjustedY",
69  m_pointData, &ControlPointFileEntryV0002::set_adjustedy);
70  copy(pointObject, "AdjustedZ",
71  m_pointData, &ControlPointFileEntryV0002::set_adjustedz);
72  copy(pointObject, "LatitudeConstrained",
73  m_pointData, &ControlPointFileEntryV0002::set_latitudeconstrained);
74  copy(pointObject, "LongitudeConstrained",
75  m_pointData, &ControlPointFileEntryV0002::set_longitudeconstrained);
76  copy(pointObject, "RadiusConstrained",
77  m_pointData, &ControlPointFileEntryV0002::set_radiusconstrained);
78 
79  // Copy enumerated values
80 
81  // The control point type names were changed between version 3 and version 4.
82  // In version 3, the types are ground, tie, and constrained
83  // In version 4, these were changed to fixed, free, and constrained respectively.
84  // The protobuf file version was not changed, fixed and free were simply added to the
85  // enumeration and the old names were flagged as obsolete.
86  if (pointObject["PointType"][0] == "Fixed"
87  || pointObject["PointType"][0] == "Ground") {
88  m_pointData->set_type(ControlPointFileEntryV0002::Fixed);
89  }
90  else if (pointObject["PointType"][0] == "Constrained") {
91  m_pointData->set_type(ControlPointFileEntryV0002::Constrained);
92  }
93  else if (pointObject["PointType"][0] == "Free"
94  || pointObject["PointType"][0] == "Tie") {
95  m_pointData->set_type(ControlPointFileEntryV0002::Free);
96  }
97  else {
98  QString msg = "Invalid ControlPoint type [" + pointObject["PointType"][0] + "].";
99  throw IException(IException::User, msg, _FILEINFO_);
100  }
101 
102  if (pointObject.hasKeyword("AprioriXYZSource")) {
103  QString source = pointObject["AprioriXYZSource"][0];
104 
105  if (source == "None") {
106  m_pointData->set_apriorisurfpointsource(ControlPointFileEntryV0002::None);
107  }
108  else if (source == "User") {
109  m_pointData->set_apriorisurfpointsource(ControlPointFileEntryV0002::User);
110  }
111  else if (source == "AverageOfMeasures") {
112  m_pointData->set_apriorisurfpointsource(ControlPointFileEntryV0002::AverageOfMeasures);
113  }
114  else if (source == "Reference") {
115  m_pointData->set_apriorisurfpointsource(ControlPointFileEntryV0002::Reference);
116  }
117  else if (source == "Basemap") {
118  m_pointData->set_apriorisurfpointsource(ControlPointFileEntryV0002::Basemap);
119  }
120  else if (source == "BundleSolution") {
121  m_pointData->set_apriorisurfpointsource(ControlPointFileEntryV0002::BundleSolution);
122  }
123  else {
124  QString msg = "Invalid AprioriXYZSource [" + source + "]";
125  throw IException(IException::User, msg, _FILEINFO_);
126  }
127  }
128 
129  if (pointObject.hasKeyword("AprioriRadiusSource")) {
130  QString source = pointObject["AprioriRadiusSource"][0];
131 
132  if (source == "None") {
133  m_pointData->set_aprioriradiussource(ControlPointFileEntryV0002::None);
134  }
135  else if (source == "User") {
136  m_pointData->set_aprioriradiussource(ControlPointFileEntryV0002::User);
137  }
138  else if (source == "AverageOfMeasures") {
139  m_pointData->set_aprioriradiussource(ControlPointFileEntryV0002::AverageOfMeasures);
140  }
141  else if (source == "Ellipsoid") {
142  m_pointData->set_aprioriradiussource(ControlPointFileEntryV0002::Ellipsoid);
143  }
144  else if (source == "DEM") {
145  m_pointData->set_aprioriradiussource(ControlPointFileEntryV0002::DEM);
146  }
147  else if (source == "BundleSolution") {
148  m_pointData->set_aprioriradiussource(ControlPointFileEntryV0002::BundleSolution);
149  }
150  else {
151  QString msg = "Invalid AprioriRadiusSource, [" + source + "]";
152  throw IException(IException::User, msg, _FILEINFO_);
153  }
154  }
155 
156  // Copy array values
157  if (pointObject.hasKeyword("AprioriCovarianceMatrix")) {
158  PvlKeyword &matrix = pointObject["AprioriCovarianceMatrix"];
159 
160  m_pointData->add_aprioricovar(toDouble(matrix[0]));
161  m_pointData->add_aprioricovar(toDouble(matrix[1]));
162  m_pointData->add_aprioricovar(toDouble(matrix[2]));
163  m_pointData->add_aprioricovar(toDouble(matrix[3]));
164  m_pointData->add_aprioricovar(toDouble(matrix[4]));
165  m_pointData->add_aprioricovar(toDouble(matrix[5]));
166  }
167 
168  if (pointObject.hasKeyword("AdjustedCovarianceMatrix")) {
169  PvlKeyword &matrix = pointObject["AdjustedCovarianceMatrix"];
170 
171  m_pointData->add_adjustedcovar(toDouble(matrix[0]));
172  m_pointData->add_adjustedcovar(toDouble(matrix[1]));
173  m_pointData->add_adjustedcovar(toDouble(matrix[2]));
174  m_pointData->add_adjustedcovar(toDouble(matrix[3]));
175  m_pointData->add_adjustedcovar(toDouble(matrix[4]));
176  m_pointData->add_adjustedcovar(toDouble(matrix[5]));
177  }
178 
179  // Process Measures
180  for (int groupIndex = 0; groupIndex < pointObject.groups(); groupIndex ++) {
181  PvlGroup &group = pointObject.group(groupIndex);
182  ControlPointFileEntryV0002_Measure measure;
183 
184  // Copy strings, booleans, and doubles
185  copy(group, "SerialNumber",
186  measure, &ControlPointFileEntryV0002_Measure::set_serialnumber);
187  copy(group, "ChooserName",
188  measure, &ControlPointFileEntryV0002_Measure::set_choosername);
189  copy(group, "Sample",
190  measure, &ControlPointFileEntryV0002_Measure::set_sample);
191  copy(group, "Line",
192  measure, &ControlPointFileEntryV0002_Measure::set_line);
193  copy(group, "SampleResidual",
194  measure, &ControlPointFileEntryV0002_Measure::set_sampleresidual);
195  copy(group, "LineResidual",
196  measure, &ControlPointFileEntryV0002_Measure::set_lineresidual);
197  copy(group, "DateTime",
198  measure, &ControlPointFileEntryV0002_Measure::set_datetime);
199  copy(group, "Diameter",
200  measure, &ControlPointFileEntryV0002_Measure::set_diameter);
201  copy(group, "EditLock",
202  measure, &ControlPointFileEntryV0002_Measure::set_editlock);
203  copy(group, "Ignore",
204  measure, &ControlPointFileEntryV0002_Measure::set_ignore);
205  copy(group, "JigsawRejected",
206  measure, &ControlPointFileEntryV0002_Measure::set_jigsawrejected);
207  copy(group, "AprioriSample",
208  measure, &ControlPointFileEntryV0002_Measure::set_apriorisample);
209  copy(group, "AprioriLine",
210  measure, &ControlPointFileEntryV0002_Measure::set_aprioriline);
211  copy(group, "SampleSigma",
212  measure, &ControlPointFileEntryV0002_Measure::set_samplesigma);
213  copy(group, "LineSigma",
214  measure, &ControlPointFileEntryV0002_Measure::set_linesigma);
215 
216  if (group.hasKeyword("Reference")) {
217  if (group["Reference"][0].toLower() == "true") {
218  m_pointData->set_referenceindex(groupIndex);
219  }
220  group.deleteKeyword("Reference");
221  }
222 
223  QString type = group["MeasureType"][0].toLower();
224  if (type == "candidate") {
225  measure.set_type(ControlPointFileEntryV0002_Measure::Candidate);
226  }
227  else if (type == "manual") {
228  measure.set_type(ControlPointFileEntryV0002_Measure::Manual);
229  }
230  else if (type == "registeredpixel") {
231  measure.set_type(ControlPointFileEntryV0002_Measure::RegisteredPixel);
232  }
233  else if (type == "registeredsubpixel") {
234  measure.set_type(ControlPointFileEntryV0002_Measure::RegisteredSubPixel);
235  }
236  else {
238  "Unknown measure type [" + type + "]",
239  _FILEINFO_);
240  }
241  group.deleteKeyword("MeasureType");
242 
243  for (int key = 0; key < group.keywords(); key++) {
244  ControlMeasureLogData interpreter(group[key]);
245  if (!interpreter.IsValid()) {
246  QString msg = "Unhandled or duplicate keywords in control measure ["
247  + group[key].name() + "]";
248  throw IException(IException::Programmer, msg, _FILEINFO_);
249  }
250  else {
251  ControlPointFileEntryV0002_Measure_MeasureLogData protoBufDataEntry;
252 
253  protoBufDataEntry.set_doubledatatype(interpreter.GetDataType());
254  protoBufDataEntry.set_doubledatavalue(interpreter.GetNumericalValue());
255 
256  *measure.add_log() = protoBufDataEntry;
257  }
258  }
259 
260  *m_pointData->add_measures() = measure;
261  }
262 
263  if (!m_pointData->IsInitialized()) {
264  QString msg = "There is missing required information in the control "
265  "points or measures";
266  throw IException(IException::Io, msg, _FILEINFO_);
267  }
268  }
269 
270 
277  : m_pointData(new ControlPointFileEntryV0002) {
279  if (!oldPointData) {
280  QString msg = "Version 2 control point is missing point data.";
281  throw IException(IException::User, msg, _FILEINFO_);
282  }
284  if (!oldLogData) {
285  QString msg = "Version 2 control point is missing measure log data.";
286  throw IException(IException::User, msg, _FILEINFO_);
287  }
288 
289  // Copy over POD values
290  if ( oldPointData->has_id() ) {
291  m_pointData->set_id( oldPointData->id() );
292  }
293  if ( oldPointData->has_choosername() ) {
294  m_pointData->set_choosername( oldPointData->choosername() );
295  }
296  if ( oldPointData->has_datetime() ) {
297  m_pointData->set_datetime( oldPointData->datetime() );
298  }
299  if ( oldPointData->has_apriorisurfpointsourcefile() ) {
300  m_pointData->set_apriorisurfpointsourcefile( oldPointData->apriorisurfpointsourcefile() );
301  }
302  if ( oldPointData->has_aprioriradiussourcefile() ) {
303  m_pointData->set_aprioriradiussourcefile( oldPointData->aprioriradiussourcefile() );
304  }
305  if ( oldPointData->has_jigsawrejected() ) {
306  m_pointData->set_jigsawrejected( oldPointData->jigsawrejected() );
307  }
308  if ( oldPointData->has_editlock() ) {
309  m_pointData->set_editlock( oldPointData->editlock() );
310  }
311  if ( oldPointData->has_ignore() ) {
312  m_pointData->set_ignore( oldPointData->ignore() );
313  }
314  if ( oldPointData->has_apriorix() ) {
315  m_pointData->set_apriorix( oldPointData->apriorix() );
316  }
317  if ( oldPointData->has_aprioriy() ) {
318  m_pointData->set_aprioriy( oldPointData->aprioriy() );
319  }
320  if ( oldPointData->has_aprioriz() ) {
321  m_pointData->set_aprioriz( oldPointData->aprioriz() );
322  }
323  if ( oldPointData->has_adjustedx() ) {
324  m_pointData->set_adjustedx( oldPointData->adjustedx() );
325  }
326  if ( oldPointData->has_adjustedy() ) {
327  m_pointData->set_adjustedy( oldPointData->adjustedy() );
328  }
329  if ( oldPointData->has_adjustedz() ) {
330  m_pointData->set_adjustedz( oldPointData->adjustedz() );
331  }
332  if ( oldPointData->has_latitudeconstrained() ) {
333  m_pointData->set_latitudeconstrained( oldPointData->latitudeconstrained() );
334  }
335  if ( oldPointData->has_longitudeconstrained() ) {
336  m_pointData->set_longitudeconstrained( oldPointData->longitudeconstrained() );
337  }
338  if ( oldPointData->has_radiusconstrained() ) {
339  m_pointData->set_radiusconstrained( oldPointData->radiusconstrained() );
340  }
341  if ( oldPointData->has_referenceindex() ) {
342  m_pointData->set_referenceindex( oldPointData->referenceindex() );
343  }
344 
345  // Copy over enumerated values
346 
347  // The only point types in V0002 are ground and tie.
348  // So, convert ground and tie to their V0003 values, fixed and free respectively.
349  // Later check if the point is constrained.
350  if ( oldPointData->has_type() ) {
351  ControlNetFileProtoV0001_PBControlPoint_PointType pointType = oldPointData->type();
352  if (pointType == ControlNetFileProtoV0001_PBControlPoint::Ground) {
353  m_pointData->set_type(ControlPointFileEntryV0002::Fixed);
354  }
355  else if (pointType == ControlNetFileProtoV0001_PBControlPoint::Tie) {
356  m_pointData->set_type(ControlPointFileEntryV0002::Free);
357  }
358  else {
359  QString msg = "Invalid ControlPoint type.";
360  throw IException(IException::User, msg, _FILEINFO_);
361  }
362  }
363 
364  if ( oldPointData->has_apriorisurfpointsource() ) {
365  ControlNetFileProtoV0001_PBControlPoint_AprioriSource surfacePointSource;
366  surfacePointSource = oldPointData->apriorisurfpointsource();
367  if (surfacePointSource == ControlNetFileProtoV0001_PBControlPoint::None) {
368  m_pointData->set_apriorisurfpointsource(ControlPointFileEntryV0002::None);
369  }
370  else if (surfacePointSource == ControlNetFileProtoV0001_PBControlPoint::User) {
371  m_pointData->set_apriorisurfpointsource(ControlPointFileEntryV0002::User);
372  }
373  else if (surfacePointSource == ControlNetFileProtoV0001_PBControlPoint::AverageOfMeasures) {
374  m_pointData->set_apriorisurfpointsource(ControlPointFileEntryV0002::AverageOfMeasures);
375  }
376  else if (surfacePointSource == ControlNetFileProtoV0001_PBControlPoint::Reference) {
377  m_pointData->set_apriorisurfpointsource(ControlPointFileEntryV0002::Reference);
378  }
379  else if (surfacePointSource == ControlNetFileProtoV0001_PBControlPoint::Basemap) {
380  m_pointData->set_apriorisurfpointsource(ControlPointFileEntryV0002::Basemap);
381  }
382  else if (surfacePointSource == ControlNetFileProtoV0001_PBControlPoint::BundleSolution) {
383  m_pointData->set_apriorisurfpointsource(ControlPointFileEntryV0002::BundleSolution);
384  }
385  else {
386  QString msg = "Invalid ControlPoint apriori surface point source.";
387  throw IException(IException::User, msg, _FILEINFO_);
388  }
389  }
390 
391  if ( oldPointData->has_aprioriradiussource() ) {
392  ControlNetFileProtoV0001_PBControlPoint_AprioriSource radiusSource;
393  radiusSource = oldPointData->aprioriradiussource();
394  if (radiusSource == ControlNetFileProtoV0001_PBControlPoint::None) {
395  m_pointData->set_aprioriradiussource(ControlPointFileEntryV0002::None);
396  }
397  else if (radiusSource == ControlNetFileProtoV0001_PBControlPoint::User) {
398  m_pointData->set_aprioriradiussource(ControlPointFileEntryV0002::User);
399  }
400  else if (radiusSource == ControlNetFileProtoV0001_PBControlPoint::AverageOfMeasures) {
401  m_pointData->set_aprioriradiussource(ControlPointFileEntryV0002::AverageOfMeasures);
402  }
403  else if (radiusSource == ControlNetFileProtoV0001_PBControlPoint::Ellipsoid) {
404  m_pointData->set_aprioriradiussource(ControlPointFileEntryV0002::Ellipsoid);
405  }
406  else if (radiusSource == ControlNetFileProtoV0001_PBControlPoint::DEM) {
407  m_pointData->set_aprioriradiussource(ControlPointFileEntryV0002::DEM);
408  }
409  else if (radiusSource == ControlNetFileProtoV0001_PBControlPoint::BundleSolution) {
410  m_pointData->set_aprioriradiussource(ControlPointFileEntryV0002::BundleSolution);
411  }
412  else {
413  QString msg = "Invalid AprioriRadiusSource.";
414  throw IException(IException::User, msg, _FILEINFO_);
415  }
416  }
417 
418  // Copy the array values
419 
420  // If there is a covariance matrix, then the point is constrained
421  if (oldPointData->aprioricovar_size() > 0) {
422  m_pointData->set_type(ControlPointFileEntryV0002::Constrained);
423  m_pointData->add_aprioricovar( oldPointData->aprioricovar(0) );
424  m_pointData->add_aprioricovar( oldPointData->aprioricovar(1) );
425  m_pointData->add_aprioricovar( oldPointData->aprioricovar(2) );
426  m_pointData->add_aprioricovar( oldPointData->aprioricovar(3) );
427  m_pointData->add_aprioricovar( oldPointData->aprioricovar(4) );
428  m_pointData->add_aprioricovar( oldPointData->aprioricovar(5) );
429  }
430 
431  if (oldPointData->adjustedcovar_size() > 0) {
432  m_pointData->add_adjustedcovar( oldPointData->adjustedcovar(0) );
433  m_pointData->add_adjustedcovar( oldPointData->adjustedcovar(1) );
434  m_pointData->add_adjustedcovar( oldPointData->adjustedcovar(2) );
435  m_pointData->add_adjustedcovar( oldPointData->adjustedcovar(3) );
436  m_pointData->add_adjustedcovar( oldPointData->adjustedcovar(4) );
437  m_pointData->add_adjustedcovar( oldPointData->adjustedcovar(5) );
438  }
439 
440  // Copy the measures
441  for (int i = 0; i < oldPointData->measures_size(); i++) {
442  ControlPointFileEntryV0002_Measure *newMeasure = m_pointData->add_measures();
443  ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure oldMeasure;
444  oldMeasure = oldPointData->measures(i);
445 
446  // Copy over POD values
447  if ( oldMeasure.has_serialnumber() ) {
448  newMeasure->set_serialnumber( oldMeasure.serialnumber() );
449  }
450  if ( oldMeasure.has_choosername() ) {
451  newMeasure->set_choosername( oldMeasure.choosername() );
452  }
453  if ( oldMeasure.has_datetime() ) {
454  newMeasure->set_datetime( oldMeasure.datetime() );
455  }
456  if ( oldMeasure.has_diameter() ) {
457  newMeasure->set_diameter( oldMeasure.diameter() );
458  }
459  if ( oldMeasure.has_editlock() ) {
460  newMeasure->set_editlock( oldMeasure.editlock() );
461  }
462  if ( oldMeasure.has_ignore() ) {
463  newMeasure->set_ignore( oldMeasure.ignore() );
464  }
465  if ( oldMeasure.has_jigsawrejected() ) {
466  newMeasure->set_jigsawrejected( oldMeasure.jigsawrejected() );
467  }
468  if ( oldMeasure.has_apriorisample() ) {
469  newMeasure->set_apriorisample( oldMeasure.apriorisample() );
470  }
471  if ( oldMeasure.has_aprioriline() ) {
472  newMeasure->set_aprioriline( oldMeasure.aprioriline() );
473  }
474  if ( oldMeasure.has_samplesigma() ) {
475  newMeasure->set_samplesigma( oldMeasure.samplesigma() );
476  }
477  if ( oldMeasure.has_linesigma() ) {
478  newMeasure->set_linesigma( oldMeasure.linesigma() );
479  }
480  // In the version 1 protobuf format, the sample, line, sample residual, and line residual
481  // values are stored in a nested message so we have to copy them differently.
482  if ( oldMeasure.has_measurement() ) {
483  ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure_PBMeasure oldMeasurement;
484  oldMeasurement = oldMeasure.measurement();
485  if ( oldMeasurement.has_sample() ) {
486  newMeasure->set_sample( oldMeasurement.sample() );
487  }
488  if ( oldMeasurement.has_line() ) {
489  newMeasure->set_line( oldMeasurement.line() );
490  }
491  if ( oldMeasurement.has_sampleresidual() ) {
492  newMeasure->set_sampleresidual( oldMeasurement.sampleresidual() );
493  }
494  if ( oldMeasurement.has_lineresidual() ) {
495  newMeasure->set_lineresidual( oldMeasurement.lineresidual() );
496  }
497  }
498 
499  // Copy over the enumerated values
500  if ( oldMeasure.has_type() ) {
501  ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure_MeasureType oldType;
502  oldType = oldMeasure.type();
503  if (oldType == ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure_MeasureType_Candidate) {
504  newMeasure->set_type(ControlPointFileEntryV0002_Measure_MeasureType_Candidate);
505  }
506  else if (oldType == ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure_MeasureType_Manual) {
507  newMeasure->set_type(ControlPointFileEntryV0002_Measure_MeasureType_Manual);
508  }
509  else if (oldType == ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure_MeasureType_RegisteredPixel) {
510  newMeasure->set_type(ControlPointFileEntryV0002_Measure_MeasureType_RegisteredPixel);
511  }
512  else if (oldType == ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure_MeasureType_RegisteredSubPixel) {
513  newMeasure->set_type(ControlPointFileEntryV0002_Measure_MeasureType_RegisteredSubPixel);
514  }
515  else {
516  QString msg = "Invalid measure type";
517  throw IException(IException::User, msg, _FILEINFO_);
518  }
519 
520  // Copy over any log data
521  ControlNetLogDataProtoV0001_Point_Measure measureLogData = oldLogData->measures(i);
522  for (int j = 0; j < measureLogData.loggedmeasuredata_size(); j++) {
523 
524  ControlNetLogDataProtoV0001_Point_Measure_DataEntry oldData =
525  measureLogData.loggedmeasuredata(j);
526 
527  ControlPointFileEntryV0002_Measure_MeasureLogData newData;
528 
529  newData.set_doubledatatype( oldData.datatype() );
530  newData.set_doubledatavalue( oldData.datavalue() );
531 
532  *newMeasure->add_log() = newData;
533  }
534 
535  // Check that all the required fields in the measure are filled
536  if ( !newMeasure->IsInitialized() ) {
537  QString msg = "Measure file entry at index [" + toString(i)
538  + "] is missing required fields.";
539  throw IException(IException::User, msg, _FILEINFO_);
540  }
541  }
542  }
543 
544  // Check that all of the required fields in the point are filled
545  if ( !m_pointData->IsInitialized() ) {
546  QString msg = "Control point file entry is missing required fields.";
547  throw IException(IException::User, msg, _FILEINFO_);
548  }
549  }
550 
551 
561  const ControlPointFileEntryV0002 &ControlPointV0003::pointData() {
562  if (!m_pointData) {
563  m_pointData.reset(new ControlPointFileEntryV0002);
564  }
565 
566  return *m_pointData;
567  }
568 
569 
585  QString keyName,
587  void (ControlPointFileEntryV0002::*setter)(bool)) {
588 
589  if (!container.hasKeyword(keyName)) {
590  return;
591  }
592 
593  QString value = container[keyName][0];
594  container.deleteKeyword(keyName);
595  value = value.toLower();
596 
597  if (value == "true" || value == "yes") {
598  (point.data()->*setter)(true);
599  }
600  }
601 
602 
618  QString keyName,
620  void (ControlPointFileEntryV0002::*setter)(double)) {
621 
622  if (!container.hasKeyword(keyName)) {
623  return;
624  }
625 
626  double value = toDouble(container[keyName][0]);
627  container.deleteKeyword(keyName);
628  (point.data()->*setter)(value);
629  }
630 
631 
647  QString keyName,
649  void (ControlPointFileEntryV0002::*setter)(const std::string&)) {
650 
651  if (!container.hasKeyword(keyName)) {
652  return;
653  }
654 
655  QString value = container[keyName][0];
656  container.deleteKeyword(keyName);
657  (point.data()->*setter)(value.toLatin1().data());
658  }
659 
660 
676  QString keyName,
677  ControlPointFileEntryV0002_Measure &measure,
678  void (ControlPointFileEntryV0002_Measure::*setter)(bool)) {
679 
680  if (!container.hasKeyword(keyName)) {
681  return;
682  }
683 
684  QString value = container[keyName][0];
685  container.deleteKeyword(keyName);
686  value = value.toLower();
687 
688  if (value == "true" || value == "yes") {
689  (measure.*setter)(true);
690  }
691  }
692 
693 
709  QString keyName,
710  ControlPointFileEntryV0002_Measure &measure,
711  void (ControlPointFileEntryV0002_Measure::*setter)(double)) {
712 
713  if (!container.hasKeyword(keyName)) {
714  return;
715  }
716 
717  double value = toDouble(container[keyName][0]);
718  container.deleteKeyword(keyName);
719  (measure.*setter)(value);
720  }
721 
722 
738  QString keyName,
739  ControlPointFileEntryV0002_Measure &measure,
740  void (ControlPointFileEntryV0002_Measure::*setter)
741  (const std::string &)) {
742 
743  if (!container.hasKeyword(keyName)) {
744  return;
745  }
746 
747  QString value = container[keyName][0];
748  container.deleteKeyword(keyName);
749  (measure.*setter)(value.toLatin1().data());
750  }
751 }
Isis::PvlObject::group
PvlGroup & group(const int index)
Return the group at the specified index.
Definition: PvlObject.cpp:452
Isis::IException::Io
@ Io
A type of error that occurred when performing an actual I/O operation.
Definition: IException.h:155
Isis::PvlObject
Contains Pvl Groups and Pvl Objects.
Definition: PvlObject.h:61
Isis::ControlPointV0003::pointData
const ControlPointFileEntryV0002 & pointData()
Access the protobuf control point data.
Definition: ControlPointV0003.cpp:561
Isis::ControlPointV0003::copy
void copy(PvlContainer &container, QString keyName, QSharedPointer< ControlPointFileEntryV0002 > point, void(ControlPointFileEntryV0002::*setter)(bool))
This convenience method takes a boolean value from a PvlKeyword and copies it into a version 2 protob...
Definition: ControlPointV0003.cpp:584
Isis::PvlKeyword
A single keyword-value pair.
Definition: PvlKeyword.h:82
Isis::ControlMeasureLogData::GetNumericalValue
double GetNumericalValue() const
Get the value associated with this log data.
Definition: ControlMeasureLogData.cpp:123
Isis::ControlPointV0002
A container for the information stored in a version 2 ControlPoint.
Definition: ControlPointV0002.h:154
Isis::PvlObject::groups
int groups() const
Returns the number of groups contained.
Definition: PvlObject.h:75
Isis::ControlMeasureLogData::GetDataType
NumericLogDataType GetDataType() const
Get the data type associated with this log data.
Definition: ControlMeasureLogData.cpp:135
Isis::PvlContainer::hasKeyword
bool hasKeyword(const QString &name) const
Check to see if a keyword exists.
Definition: PvlContainer.cpp:159
QSharedPointer< ControlPointFileEntryV0002 >
Isis::ControlPointV0003::m_pointData
QSharedPointer< ControlPointFileEntryV0002 > m_pointData
protobuf container that holds information used to create a control point.
Definition: ControlPointV0003.h:214
Isis::toString
QString toString(bool boolToConvert)
Global function to convert a boolean to a string.
Definition: IString.cpp:211
Isis::ControlPointV0003::ControlPointV0003
ControlPointV0003()
Default constructor.
Isis::ControlMeasureLogData::IsValid
bool IsValid() const
This tests if the log data is complete and valid.
Definition: ControlMeasureLogData.cpp:154
Isis::ControlPointV0002::pointData
QSharedPointer< ControlNetFileProtoV0001_PBControlPoint > pointData()
Access the protobuf control point data.
Definition: ControlPointV0002.cpp:353
Isis::PvlGroup
Contains multiple PvlContainers.
Definition: PvlGroup.h:41
Isis::ControlPointV0002::logData
QSharedPointer< ControlNetLogDataProtoV0001_Point > logData()
Access the protobuf log data for the control measures in the point.
Definition: ControlPointV0002.cpp:364
Isis::PvlObject::hasKeyword
bool hasKeyword(const QString &kname, FindOptions opts) const
See if a keyword is in the current PvlObject, or deeper inside other PvlObjects and Pvlgroups within ...
Definition: PvlObject.cpp:236
Isis::PvlContainer::name
QString name() const
Returns the container name.
Definition: PvlContainer.h:63
Isis::IException
Isis exception class.
Definition: IException.h:91
Isis::PvlContainer::deleteKeyword
void deleteKeyword(const QString &name)
Remove a specified keyword.
Definition: PvlContainer.cpp:97
Isis::toDouble
double toDouble(const QString &string)
Global function to convert from a string to a double.
Definition: IString.cpp:149
Isis::IException::Programmer
@ Programmer
This error is for when a programmer made an API call that was illegal.
Definition: IException.h:146
std
Namespace for the standard library.
Isis::PvlContainer::keywords
int keywords() const
Returns the number of keywords contained in the PvlContainer.
Definition: PvlContainer.h:86
Isis::PvlContainer
Contains more than one keyword-value pair.
Definition: PvlContainer.h:49
Isis::ControlMeasureLogData
Statistical and similar ControlMeasure associated information.
Definition: ControlMeasureLogData.h:37
Isis
This is free and unencumbered software released into the public domain.
Definition: Apollo.h:16
Isis::IException::User
@ User
A type of error that could only have occurred due to a mistake on the user's part (e....
Definition: IException.h:126

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 USGS Astrogeology Discussion Board
To report a bug, or suggest a feature go to: ISIS Github
File Modified: 07/13/2023 15:16:20