USGS

Isis 3.0 Object Programmers' Reference

Home

QnetSetAprioriDialog.cpp
1 #include <QtGui>
2 
3 #include "QnetSetAprioriDialog.h"
4 
5 #include "Camera.h"
6 #include "ControlMeasure.h"
7 #include "ControlNet.h"
8 #include "ControlPoint.h"
9 #include "Distance.h"
10 #include "Latitude.h"
11 #include "Longitude.h"
12 #include "QnetTool.h"
13 #include "SerialNumberList.h"
14 #include "SpecialPixel.h"
15 
16 using namespace std;
17 
18 namespace Isis {
19  QnetSetAprioriDialog::QnetSetAprioriDialog(QnetTool *qnetTool, QWidget *parent) : QDialog(parent) {
20  m_qnetTool = qnetTool;
21 
22  setupUi(this);
23  // editLockPointsGroupBox->hide();
24  connect(editLockPointsListBox, SIGNAL(itemChanged(QListWidgetItem *)),
25  this, SLOT(unlockPoint(QListWidgetItem *)));
26  connect(setAprioriButton, SIGNAL(clicked()), this, SLOT(setApriori()));
27  //connect(closeButton, SIGNAL(clicked()), this, SLOT(closeAprioriDialog()));
28  // connect(closeButton, SIGNAL(clicked()), this, SIGNAL(aprioriDialogClosed()));
29  //layout()->setSizeConstraint(QLayout::SetFixedSize);
30 
31  }
32 
33 
34 
45 
46  editLockPointsListBox->clear();
47  clearLineEdits();
48 
49  m_points = selectedPoints;
50  if (m_points.size() == 1) {
51  fillLineEdits();
52  }
53  else {
54  userEnteredRadioButton->setEnabled(false);
55  }
56 
57  // Fill editLock List Box
58  for (int i=0; i<m_points.size(); i++) {
59  QString id = m_points.at(i)->text();
60  ControlPoint *pt = m_qnetTool->controlNet()->GetPoint(id);
61  if (pt->IsEditLocked()) {
62  QListWidgetItem *item = new QListWidgetItem(*(m_points[i]));
63  item->setCheckState(Qt::Checked);
64  editLockPointsListBox->addItem(item);
65  }
66  }
67  }
68 
69 
70  void QnetSetAprioriDialog::unlockPoint(QListWidgetItem *pointId) {
71 
72  ControlPoint *pt = m_qnetTool->controlNet()->GetPoint(pointId->text());
73  if (pt->IsEditLocked() && pointId->checkState() == Qt::Unchecked) {
74  pt->SetEditLock(false);
75  editLockPointsListBox->removeItemWidget(pointId);
76  pointId->setHidden(true);
77  editLockPointsListBox->repaint();
78  this->repaint();
79  emit netChanged();
80  }
81  }
82 
83 
84 
85  void QnetSetAprioriDialog::clearLineEdits() {
86  aprioriLatEdit->setText("");
87  aprioriLonEdit->setText("");
88  aprioriRadiusEdit->setText("");
89  latSigmaEdit->setText("");
90  lonSigmaEdit->setText("");
91  radiusSigmaEdit->setText("");
92  }
93 
94 
95  void QnetSetAprioriDialog::fillLineEdits() {
96 
97  QString id = m_points.at(0)->text();
98  ControlPoint *pt = m_qnetTool->controlNet()->GetPoint(id);
99  SurfacePoint sPt = pt->GetAprioriSurfacePoint();
100  vector<Distance> targetRadii = m_qnetTool->controlNet()->GetTargetRadii();
101  sPt.SetRadii(Distance(targetRadii[0]),
102  Distance(targetRadii[1]),
103  Distance(targetRadii[2]));
104  if (sPt.GetLatitude().degrees() != Null) {
105  aprioriLatEdit->setText(
106  QString::number(sPt.GetLatitude().degrees()));
107  }
108  if (sPt.GetLatSigmaDistance().meters() != Null) {
109  latSigmaEdit->setText(
110  QString::number(sPt.GetLatSigmaDistance().meters()));
111  }
112  if (sPt.GetLongitude().degrees() != Null) {
113  aprioriLonEdit->setText(
114  QString::number(sPt.GetLongitude().degrees()));
115  }
116  if (sPt.GetLonSigmaDistance().meters() != Null) {
117  lonSigmaEdit->setText(
118  QString::number(sPt.GetLonSigmaDistance().meters()));
119  }
120  if (sPt.GetLocalRadius().meters() != Null) {
121  aprioriRadiusEdit->setText(
122  QString::number(sPt.GetLocalRadius().meters()));
123  }
124  if (sPt.GetLocalRadiusSigma().meters() != Null) {
125  radiusSigmaEdit->setText(
126  QString::number(sPt.GetLocalRadiusSigma().meters()));
127  }
128  }
129 
130 
131 
152 
153  double latSigma = Null;
154  double lat = Null;
155  double lonSigma = Null;
156  double lon = Null;
157  double radiusSigma = Null;
158  double radius = Null;
159 
160  if (latitudeConstraintsGroupBox->isChecked()) {
161 
162  if (userEnteredRadioButton->isChecked() && aprioriLatEdit->text() != "") {
163  lat = aprioriLatEdit->text().toDouble();
164  }
165  if (latSigmaEdit->text() != "") {
166  latSigma = latSigmaEdit->text().toDouble();
167  }
168  }
169  if (longitudeConstraintsGroupBox->isChecked()) {
170 
171  if (userEnteredRadioButton->isChecked() && aprioriLonEdit->text() != "") {
172  lon = aprioriLonEdit->text().toDouble();
173  }
174  if (lonSigmaEdit->text() != "") {
175  lonSigma = lonSigmaEdit->text().toDouble();
176  }
177  }
178 
179  if (radiusConstraintsGroupBox->isChecked()) {
180 
181  if (userEnteredRadioButton->isChecked() && aprioriRadiusEdit->text() != "") {
182  radius = aprioriRadiusEdit->text().toDouble();
183  }
184  if (radiusSigmaEdit->text() != "") {
185  radiusSigma = radiusSigmaEdit->text().toDouble();
186  }
187  }
188 
189  // If the SetAprioriPoint group box selected, set aprioriSurfacePoint for
190  // those points not editLocked.
191  for (int i = 0; i < m_points.size(); i++) {
192  QString id = m_points.at(i)->text();
193  ControlPoint *pt = m_qnetTool->controlNet()->GetPoint(id);
194  if (pt->IsEditLocked()) continue;
195 
196  if (!pt->HasAprioriCoordinates()) {
197  QString msg = "Point [" + id + "] does not have an Apriori coordinate. "
198  "Make sure to save the ground source measurement then the Point before "
199  "setting the sigmas. The sigmas for this point will not be set.";
200  QMessageBox::warning((QWidget *)parent(), "Warning", msg);
201  continue;
202  }
203 
204  if (pointSourceGroupBox->isChecked()) {
205  if (referenceMeasureRadioButton->isChecked()) {
206  ControlMeasure *m = pt->GetRefMeasure();
207  // Find camera from network camera list
208  int camIndex = m_qnetTool->serialNumberList()->SerialNumberIndex(
209  m->GetCubeSerialNumber());
210  Camera *cam = m_qnetTool->controlNet()->Camera(camIndex);
211  cam->SetImage(m->GetSample(),m->GetLine());
213  pt->SetAprioriSurfacePointSource(ControlPoint::SurfacePointSource::Reference);
214  }
215  else if (averageMeasuresRadioButton->isChecked()) {
216  pt->ComputeApriori();
217  // Do not need to set AprioriSurfacePointSource or AprioriRadiusSource,
218  // ComputeApriori does this for us.
219  }
220  else if (userEnteredRadioButton->isChecked()) {
222  Latitude(lat, Angle::Degrees),
224  Distance(radius,Distance::Meters)));
225  pt->SetAprioriSurfacePointSource(ControlPoint::SurfacePointSource::User);
226  pt->SetAprioriRadiusSource(ControlPoint::RadiusSource::User);
227  }
228  }
229 
230  try {
231  // Read Surface point from the control point and set the sigmas,
232  // first set the target radii
233  SurfacePoint spt = pt->GetAprioriSurfacePoint();
234  vector<Distance> targetRadii = m_qnetTool->controlNet()->GetTargetRadii();
235  spt.SetRadii(Distance(targetRadii[0]),
236  Distance(targetRadii[1]),
237  Distance(targetRadii[2]));
239  Distance(lonSigma,Distance::Meters),
240  Distance(radiusSigma,Distance::Meters));
241  // Write the surface point back out to the controlPoint
242  pt->SetAprioriSurfacePoint(spt);
243  // TODO: Is the following line necessary, should error be thrown
244  // for free or fixed pts?
245  //pt->SetType(ControlPoint::Constrained);
246  emit pointChanged(id);
247  emit netChanged();
248  }
249  catch (IException &e) {
250  QString message = "Error setting sigmas. \n";
251  message += e.toString();
252  QMessageBox::critical((QWidget *)parent(),"Error",message);
253  QApplication::restoreOverrideCursor();
254  // Sigmas failed, but surface pt coordinate was set
255  emit pointChanged(id);
256  emit netChanged();
257  return;
258  }
259  }
260 
261  }
262 }