Isis 3 Programmer Reference
ChipViewportsWidget.cpp
1
7/* SPDX-License-Identifier: CC0-1.0 */
8
9#include "ChipViewportsWidget.h"
10
11#include <sstream>
12#include <vector>
13#include <iomanip>
14
15#include <QtWidgets>
16#include <QMessageBox>
17#include <QMouseEvent>
18
19#include "Application.h"
20#include "Camera.h"
21#include "ChipViewport.h"
22#include "ControlMeasureEditWidget.h"
23#include "ControlMeasure.h"
24#include "ControlMeasureLogData.h"
25#include "ControlNet.h"
26#include "ControlPoint.h"
27#include "Cube.h"
28#include "FileName.h"
29#include "IException.h"
30#include "Latitude.h"
31#include "Longitude.h"
32#include "MainWindow.h"
33#include "MdiCubeViewport.h"
34#include "Pvl.h"
35#include "PvlEditDialog.h"
36#include "SerialNumber.h"
37#include "SerialNumberList.h"
38#include "SpecialPixel.h"
39#include "ToolPad.h"
40#include "ViewportMainWindow.h"
41#include "Workspace.h"
42
43using namespace std;
44
45namespace Isis {
46 const int VIEWSIZE = 301;
47
55
56 m_netChanged = false;
57
58 m_parent = parent;
59
60 // TODO 05/10/2016 TLS What is the right way to handle serial number lists in IPCE?
61 m_serialNumberList = NULL;
62
63// m_cubeMeasureEditMap = QMap<Cube *, ControlMeasureEditWidget *>();
64
65 createChipViewports(parent);
66
67 installEventFilter(this);
68
69// connect(this, SIGNAL(newControlNetwork(ControlNet *)),
70// m_measureEditor, SIGNAL(newControlNetwork(ControlNet *)));
71 }
72
73
74 ChipViewportsWidget::~ChipViewportsWidget () {
75 // TODO: Don't write settings in destructor, must do this earlier in close event
76// writeSettings();
77
78 }
79
80
81
89
90 setWindowTitle("ChipViewports");
91 setObjectName("ChipViewportsWidget");
92 connect(this, SIGNAL(destroyed(QObject *)), this, SLOT(clearPoint()));
93
94// createActions();
95
96 m_chipViewportsLayout = new QGridLayout;
97
98 QWidget *centralWidget = new QWidget;
99 centralWidget->setLayout(m_chipViewportsLayout);
100
101 QScrollArea *scrollArea = new QScrollArea();
102 scrollArea->setObjectName("ChipViewportsWidgetScroll");
103 scrollArea->setWidgetResizable(true);
104 scrollArea->setWidget(centralWidget);
105 centralWidget->adjustSize();
106
107 QVBoxLayout *mainLayout = new QVBoxLayout;
108
109 m_ptIdValue = new QLabel();
110
111 QCheckBox *showPoints = new QCheckBox("Show control points");
112 showPoints->setToolTip("Draw control point crosshairs");
113 showPoints->setWhatsThis("This will toggle whether crosshairs are drawn"
114 " for the control points located within the measure''s"
115 " view. For areas of dense measurements, turning this"
116 " off will allow easier viewing of features.");
117 connect(showPoints, SIGNAL(toggled(bool)), this, SLOT(showPoints(bool)));
118 showPoints->setChecked(true);
119
120 QCheckBox *geomChips = new QCheckBox("Geom Chips to Reference");
121 geomChips->setToolTip("Geom Chips to Reference Control Measure");
122 geomChips->setWhatsThis("This will toggle whether chips are geomed to"
123 " the reference control measure.");
124 connect(geomChips, SIGNAL(toggled(bool)), this, SLOT(geomChips(bool)));
125 geomChips->setChecked(false);
126
127 QHBoxLayout *pointsGeomLayout = new QHBoxLayout;
128 pointsGeomLayout->addWidget(showPoints);
129 pointsGeomLayout->addWidget(geomChips);
130 pointsGeomLayout->addStretch();
131
132 mainLayout->addWidget(m_ptIdValue);
133 mainLayout->addLayout(pointsGeomLayout);
134 mainLayout->addWidget(scrollArea);
135 setLayout(mainLayout);
136
137// readSettings();
138 }
139
140
141
142 void ChipViewportsWidget::createActions() {
143
144 }
145
146
147
148 void ChipViewportsWidget::setSerialNumberList(SerialNumberList *snList) {
149
150// qDebug()<<"ChipViewportsWidget::setSerialNumberList snList = "<<snList;
151 // TODO If network & snList already exists do some error checking
152 m_serialNumberList = snList;
153 }
154
155
156
165 void ChipViewportsWidget::setControlNet(ControlNet *cnet, QString cnetFilename) {
166// qDebug()<<"ChipViewportsWidget::setControlNet cnet = "<<cnet<<" filename = "<<cnetFilename;
167 // TODO more error checking
168 m_controlNet = cnet;
169 m_cnetFileName = cnetFilename;
170// setWindowTitle("Control Point Editor- Control Network File: " + cnetFilename);
171
172 //qDebug()<<"ChipViewportsWidget::setControlNet cnetFilename = "<<cnetFilename<<" cnet = "<<cnet;
173 emit newControlNetwork(cnet);
174 }
175
176
177
178 void ChipViewportsWidget::setPoint(ControlPoint *controlPoint) {
179
180 // TODO TLS 5/2/2016 Error checks - Make sure there is control net, serial list
181 // and valid edit point (make sure editpoint exists in control net).
182
183 //qDebug()<<"ChipViewportsWidget::setEditPoint incoming ptId = "<<controlPoint->GetId();
184 // Create the measure editor widget for the reference measure first if it exists.
185 // TODO, is there always a reference measure returned, or could there be an exception thrown?
186
187 // Create a control measure editor for each measure first since we need to get its templateFileName
188 // later
189 // TODO 5-23-2016 TLS Delete measure widgets before clearing QList
190// qDebug()<<"ChipViewportsWidget::setEditPoint #measureEditors = "<<m_measureEditors.size();
191 if (m_chipViewports.size() > 0) clearPoint();
192 m_controlPoint = controlPoint;
193
194 // Write pointId
195 QString CPId = m_controlPoint->GetId();
196 QString ptId("Point ID: ");
197 ptId += (QString) CPId;
198 m_ptIdValue->setText(ptId);
199
200// m_cubeMeasureEditMap.clear();
201// qDebug()<<"ChipViewportsWidget::setEditPoint pt = "<<controlPoint->GetId();
202// qDebug()<<" Control Net = "<<m_controlNet;
203 // Find reference measure first, the measure editor needs the reference measure to load the
204 // chip viewport properly (needs to geom to Reference measure).
205 if (m_controlPoint->IsReferenceExplicit()) {
206
207
208 Cube *measureCube = new Cube(m_serialNumberList->fileName(
209 m_controlPoint->GetRefMeasure()->GetCubeSerialNumber()));
210 Chip *chip = new Chip(VIEWSIZE, VIEWSIZE);
211 ControlMeasure *measure = m_controlPoint->GetRefMeasure();
212 chip->TackCube(measure->GetSample(), measure->GetLine());
213 chip->Load(*measureCube);
214 ChipViewport *measureChipViewport = new ChipViewport(VIEWSIZE, VIEWSIZE, this);
215 measureChipViewport->setChip(chip, measureCube);
216 measureChipViewport->setControlNet(m_controlNet);
217 measureChipViewport->setPoints(true);
218 m_chipViewports.append(measureChipViewport);
219 }
220
221// qDebug()<<"ChipViewportsWidget::setPoint Before measure loop #measureEditors = "<<m_measureEditors.size();
222// bool referenceMeasure = false;
223 for (int i = 0; i < m_controlPoint->GetNumMeasures(); i++) {
224 ControlMeasure *measure = (*m_controlPoint)[i];
225 if (!m_controlPoint->IsReferenceExplicit() && i == 0) {
226 // Use first as reference measure
227// referenceMeasure = true;
228// qDebug()<<"ChipViewportsWidget::setPoint NO Skip Reference Measure i= "<<i;
229 }
230 else if (m_controlPoint->IsReferenceExplicit() &&
231 (QString) measure->GetCubeSerialNumber() == m_controlPoint->GetReferenceSN()) {
232 // We've already added explicit reference measure, so skip
233// qDebug()<<"ChipViewportsWidget::setPoint Skip Reference Measure i= "<<i;
234 continue;
235 }
236// qDebug()<<" after Test for Skip Reference Measure i= "<<i;
237 Cube *measureCube = new Cube(m_serialNumberList->fileName(measure->GetCubeSerialNumber()));
238 Chip *chip = new Chip(VIEWSIZE, VIEWSIZE);
239// measure = m_controlPoint->GetRefMeasure();
240 chip->TackCube(measure->GetSample(), measure->GetLine());
241 chip->Load(*measureCube);
242 ChipViewport *measureChipViewport = new ChipViewport(VIEWSIZE, VIEWSIZE, this);
243 measureChipViewport->setChip(chip, measureCube);
244 measureChipViewport->setControlNet(m_controlNet);
245 measureChipViewport->setPoints(true);
246 m_chipViewports.append(measureChipViewport);
247 }
248
249// qDebug()<<"ChipViewportsWidget::setPoint before adding editors to layout #editors = "<<m_measureEditors.size();
250// TODO 5/19/2016 TLS Clear old measure widgets before re-filling
251 // Add all measure editors to layout
252 int gridDimension = sqrt(qreal(m_chipViewports.size())) -1;
253 int x = 0;
254 int y = 0;
255 foreach(ChipViewport *measurechipViewport, m_chipViewports) {
256 if (x > gridDimension) {
257 x = 0;
258 y++;
259 }
260 m_chipViewportsLayout->addWidget(measurechipViewport, y, x);
261 x++;
262 }
263 }
264
265
266
272#if 0
273 void ChipViewportsWidget::readSettings() {
274 FileName config("$HOME/.Isis/qview/ChipViewportsWidget.config");
275 QSettings settings(config.expanded(),
276 QSettings::NativeFormat);
277 QPoint pos = settings.value("pos", QPoint(300, 100)).toPoint();
278 QSize size = settings.value("size", QSize(900, 500)).toSize();
279 this->resize(size);
280 this->move(pos);
281 }
282
283
290 void ChipViewportsWidget::writeSettings() const {
291 /*We do not want to write the settings unless the window is
292 visible at the time of closing the application*/
293 if (!this->isVisible()) return;
294 FileName config("$HOME/.Isis/qview/ChipViewportsWidget.config");
295 QSettings settings(config.expanded(),
296 QSettings::NativeFormat);
297 settings.setValue("pos", this->pos());
298 settings.setValue("size", this->size());
299 }
300#endif
301
302
303
304 void ChipViewportsWidget::showPoints(bool showPoints) {
305
306 foreach (ChipViewport *chipViewport, m_chipViewports) {
307 chipViewport->setPoints(showPoints);
308 }
309 }
310
311
312
313 void ChipViewportsWidget::geomChips(bool geomChips) {
314
315 if (!geomChips) {
316 for (int i=1; i<m_chipViewports.size(); i++) {
317 m_chipViewports.at(i)->nogeomChip();
318 }
319 }
320
321 if (geomChips) {
322 for (int i=1; i<m_chipViewports.size(); i++) {
323 m_chipViewports.at(i)->geomChip(m_chipViewports.at(0)->chip(),
324 m_chipViewports.at(0)->chipCube());
325 }
326 }
327 }
328
329
330
331 void ChipViewportsWidget::clearPoint() {
332// qDebug()<<"ChipViewportsWidget::clearPoint #measureEditors = "<<m_measureEditors.size();
333 if (m_chipViewports.size() > 0) {
334 foreach (ChipViewport *measureChipViewport, m_chipViewports) {
335// qDebug()<<" measureEditor = "<<measureEditor;
336 delete measureChipViewport;
337 }
338 m_chipViewports.clear();
339 }
340// m_controlPoint = NULL;
341 }
342
343
344 bool ChipViewportsWidget::eventFilter(QObject *object, QEvent *event) {
345
346 bool blockEvent = false;
347
348 switch (event->type()) {
349 case QEvent::MouseButtonPress: {
350 mousePressEvent(object, (QMouseEvent *)event);
351 blockEvent = true;
352 break;
353 }
354
355 default:
356 break;
357 }
358 return blockEvent;
359 }
360
361
362 void ChipViewportsWidget::mousePressEvent(QObject *object, QMouseEvent *event) {
363
364 if (event->button() == Qt::RightButton) {
365 qDebug()<<"ChipViewportsWidget::mousePressEvent right mouse";
366 // Find child widget (ChipViewport) under the mouse
367 ChipViewport *chipViewport = qobject_cast<ChipViewport *>(focusWidget());
368
369 QMenu contextMenu;
370
371 QAction *setReferenceMeasureAction = new QAction(tr("Set as Reference Measure"), this);
372 contextMenu.addAction(setReferenceMeasureAction);
373
374 QAction *chosenAction =
375 contextMenu.exec(qobject_cast<QWidget *>(object)->mapToGlobal(event->pos()));
376
377 if (chosenAction == setReferenceMeasureAction) {
378 qDebug()<<"ChipViewportsWidget::mousePressEvent setRefMeasureAction chipViewport = "<<chipViewport;
379 //setNewReferenceMeasure(chipViewport);
380 }
381 }
382 }
383}
A small chip of data used for pattern matching.
Definition Chip.h:86
void TackCube(const double cubeSample, const double cubeLine)
This sets which cube position will be located at the chip tack position.
Definition Chip.cpp:182
void Load(Cube &cube, const double rotation=0.0, const double scale=1.0, const int band=1)
Load cube data into the Chip.
Definition Chip.cpp:203
Viewport for Isis Chips.
void createChipViewports(QWidget *parent)
create the widget for display all ControlMeasures for ControlPoint as ChipViewports
ChipViewportsWidget(QWidget *parent)
Consructs the ChipViewportsWidget widget.
void setControlNet(ControlNet *cnet, QString cnetFilename)
New control network being edited.
void showPoints(bool showPoints)
This method is called from the constructor so that when the Main window is created,...
a control measurement
a control network
Definition ControlNet.h:258
A single control point.
IO Handler for Isis Cubes.
Definition Cube.h:168
QString fileName(const QString &sn)
Return a filename given a serial number.
This is free and unencumbered software released into the public domain.
Definition Apollo.h:16
const int VIEWSIZE
Constant representing the length and width of the chip viewports.
Namespace for the standard library.