Subversion Repositories seema-scanner

Rev

Rev 29 | Rev 32 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 29 Rev 30
1
#include "SMScanner.h"
1
#include "SMScanner.h"
2
#include "ui_SMScanner.h"
2
#include "ui_SMScanner.h"
3
 
3
 
4
#include <QMetaObject>
4
#include <QMetaObject>
5
 
5
 
6
SMScanner::SMScanner(QWidget *parent) :QMainWindow(parent), ui(new Ui::SMScanner),
6
SMScanner::SMScanner(QWidget *parent) :QMainWindow(parent), ui(new Ui::SMScanner),
7
                                        calibrationReviewMode(false), captureReviewMode(false){
7
                                        calibrationReviewMode(false), captureReviewMode(false){
8
    ui->setupUi(this);
8
    ui->setupUi(this);
9
 
9
 
10
    // Register metatypes
10
    // Register metatypes
11
    qRegisterMetaType<cv::Mat>("cv::Mat");
11
    qRegisterMetaType<cv::Mat>("cv::Mat");
12
    qRegisterMetaType< std::vector<cv::Mat> >("std::vector<cv::Mat>");
12
    qRegisterMetaType< std::vector<cv::Mat> >("std::vector<cv::Mat>");
-
 
13
    qRegisterMetaType< std::vector<float> >("std::vector<float>");
13
    qRegisterMetaType<SMCalibrationSet>("SMCalibrationSet");
14
    qRegisterMetaType<SMCalibrationSet>("SMCalibrationSet");
14
    qRegisterMetaType<SMCalibrationParameters>("SMCalibrationParameters");
15
    qRegisterMetaType<SMCalibrationParameters>("SMCalibrationParameters");
15
    qRegisterMetaTypeStreamOperators<SMCalibrationParameters>("SMCalibrationParameters");
16
    qRegisterMetaTypeStreamOperators<SMCalibrationParameters>("SMCalibrationParameters");
16
    qRegisterMetaType< std::vector<SMCalibrationSet> >("std::vector<SMCalibrationSet>");
17
    qRegisterMetaType< std::vector<SMCalibrationSet> >("std::vector<SMCalibrationSet>");
17
    qRegisterMetaType<SMFrameSequence>("SMFrameSequence");
18
    qRegisterMetaType<SMFrameSequence>("SMFrameSequence");
18
 
19
 
19
    // Restore geometry
20
    // Restore geometry
20
    this->restoreGeometry(settings.value("geometry/mainwindow").toByteArray());
21
    this->restoreGeometry(settings.value("geometry/mainwindow").toByteArray());
21
    this->restoreState(settings.value("state/mainwindow").toByteArray());
22
    this->restoreState(settings.value("state/mainwindow").toByteArray());
22
 
23
 
23
    // Set up threads
24
    // Set up threads
24
    captureWorker = new SMCaptureWorker;
25
    captureWorker = new SMCaptureWorker;
25
    captureWorkerThread = new QThread(this);
26
    captureWorkerThread = new QThread(this);
26
    captureWorkerThread->setObjectName("captureWorkerThread");
27
    captureWorkerThread->setObjectName("captureWorkerThread");
27
    captureWorker->moveToThread(captureWorkerThread);
28
    captureWorker->moveToThread(captureWorkerThread);
28
    captureWorkerThread->start();
29
    captureWorkerThread->start();
29
 
30
 
30
    // Connections
31
    // Connections
31
    connect(captureWorker, SIGNAL(newFrame(unsigned int, cv::Mat)), this, SLOT(onReceiveFrame(unsigned int, cv::Mat)));
32
    connect(captureWorker, SIGNAL(newFrame(unsigned int, cv::Mat)), this, SLOT(onReceiveFrame(unsigned int, cv::Mat)));
32
    connect(captureWorker, SIGNAL(newCalibrationSet(SMCalibrationSet)), this, SLOT(onReceiveCalibrationSet(SMCalibrationSet)));
33
    connect(captureWorker, SIGNAL(newCalibrationSet(SMCalibrationSet)), this, SLOT(onReceiveCalibrationSet(SMCalibrationSet)));
33
    connect(captureWorker, SIGNAL(newFrameSequence(SMFrameSequence)), this, SLOT(onReceiveFrameSequence(SMFrameSequence)));
34
    connect(captureWorker, SIGNAL(newFrameSequence(SMFrameSequence)), this, SLOT(onReceiveFrameSequence(SMFrameSequence)));
-
 
35
    connect(captureWorker, SIGNAL(rotatedTo(float)), this, SLOT(onReceiveRotatedTo(float)));
34
 
36
 
35
    // Start capturing
37
    // Start capturing
36
    QMetaObject::invokeMethod(captureWorker, "setup");
38
    QMetaObject::invokeMethod(captureWorker, "setup");
37
    QMetaObject::invokeMethod(captureWorker, "doWork");
39
    QMetaObject::invokeMethod(captureWorker, "doWork");
38
 
40
 
39
}
41
}
40
 
42
 
41
void SMScanner::onReceiveFrame(unsigned int camId, cv::Mat frame){
43
void SMScanner::onReceiveFrame(unsigned int camId, cv::Mat frame){
42
 
44
 
43
    if(camId == 0){
45
    if(camId == 0){
44
        if(!calibrationReviewMode)
46
        if(!calibrationReviewMode)
45
            ui->calibrationCamera0Widget->showImageCV(frame);
47
            ui->calibrationCamera0Widget->showImageCV(frame);
46
        if(!captureReviewMode)
48
        if(!captureReviewMode)
47
            ui->captureCamera0Widget->showImageCV(frame);
49
            ui->captureCamera0Widget->showImageCV(frame);
48
    } else if(camId == 1){
50
    } else if(camId == 1){
49
        if(!calibrationReviewMode)
51
        if(!calibrationReviewMode)
50
            ui->calibrationCamera1Widget->showImageCV(frame);
52
            ui->calibrationCamera1Widget->showImageCV(frame);
51
        if(!captureReviewMode)
53
        if(!captureReviewMode)
52
            ui->captureCamera1Widget->showImageCV(frame);
54
            ui->captureCamera1Widget->showImageCV(frame);
53
    }
55
    }
54
}
56
}
55
 
57
 
56
void SMScanner::on_actionPreferences_triggered(){
58
void SMScanner::on_actionPreferences_triggered(){
57
 
59
 
58
    preferenceDialog.show();
60
    preferenceDialog.show();
59
}
61
}
60
 
62
 
61
void SMScanner::closeEvent(QCloseEvent *event){
63
void SMScanner::closeEvent(QCloseEvent *event){
62
 
64
 
63
    // Stop capturing thread
65
    // Stop capturing thread
64
    connect(captureWorker, SIGNAL(finished()), captureWorker, SLOT(deleteLater()));
66
    connect(captureWorker, SIGNAL(finished()), captureWorker, SLOT(deleteLater()));
65
    connect(captureWorker, SIGNAL(finished()), captureWorkerThread, SLOT(quit()));
67
    connect(captureWorker, SIGNAL(finished()), captureWorkerThread, SLOT(quit()));
66
    QMetaObject::invokeMethod(captureWorker, "stopWork");
68
    QMetaObject::invokeMethod(captureWorker, "stopWork");
67
    captureWorkerThread->quit();
69
    captureWorkerThread->quit();
68
    captureWorkerThread->wait();
70
    captureWorkerThread->wait();
69
 
71
 
70
    // Save window geometry
72
    // Save window geometry
71
    settings.setValue("geometry/mainwindow", this->saveGeometry());
73
    settings.setValue("geometry/mainwindow", this->saveGeometry());
72
    settings.setValue("state/mainwindow", this->saveState());
74
    settings.setValue("state/mainwindow", this->saveState());
73
 
75
 
74
    event->accept();
76
    event->accept();
75
 
77
 
76
}
78
}
77
 
79
 
78
SMScanner::~SMScanner(){
80
SMScanner::~SMScanner(){
79
    delete ui;
81
    delete ui;
80
}
82
}
81
 
83
 
82
void SMScanner::on_singleCalibrationButton_clicked(){
84
void SMScanner::on_singleCalibrationButton_clicked(){
83
 
85
 
84
    // If in review mode, go back to aquisition mode
86
    // If in review mode, go back to aquisition mode
85
    if(calibrationReviewMode){
87
    if(calibrationReviewMode){
86
        ui->calibrationListWidget->clearSelection();
88
        ui->calibrationListWidget->clearSelection();
87
        ui->singleCalibrationButton->setText("Single Aquisition");
89
        ui->singleCalibrationButton->setText("Single Aquisition");
88
        ui->batchCalibrationButton->setText("Batch Aquisition");
90
        ui->batchCalibrationButton->setText("Batch Aquisition");
89
        calibrationReviewMode = false;
91
        calibrationReviewMode = false;
90
        return;
92
        return;
91
    }
93
    }
92
 
94
 
93
    QMetaObject::invokeMethod(captureWorker, "acquireCalibrationSet", Q_ARG(float, -1.0));
95
    QMetaObject::invokeMethod(captureWorker, "acquireCalibrationSet", Q_ARG(float, -1.0));
94
 
96
 
95
}
97
}
96
 
98
 
-
 
99
 
-
 
100
void SMScanner::on_batchCalibrationButton_clicked(){
-
 
101
 
-
 
102
    // If in review mode, go back to aquisition mode
-
 
103
    if(calibrationReviewMode){
-
 
104
        ui->calibrationListWidget->clearSelection();
-
 
105
        ui->singleCalibrationButton->setText("Single Aquisition");
-
 
106
        ui->batchCalibrationButton->setText("Batch Aquisition");
-
 
107
        calibrationReviewMode = false;
-
 
108
        return;
-
 
109
    }
-
 
110
 
-
 
111
    // Construct vector of angles
-
 
112
    int angleStart = ui->calibrationBatchStartSpinBox->value();
-
 
113
    int angleEnd = ui->calibrationBatchEndSpinBox->value();
-
 
114
    int angleStep = ui->calibrationBatchStepSpinBox->value();
-
 
115
 
-
 
116
    if(angleStart > angleEnd)
-
 
117
        angleEnd += 360;
-
 
118
 
-
 
119
    std::vector<float> angles;
-
 
120
    for(int i=angleStart; i<=angleEnd; i+=angleStep)
-
 
121
        angles.push_back(i % 360);
-
 
122
 
-
 
123
    QMetaObject::invokeMethod(captureWorker, "acquireCalibrationSets", Q_ARG(std::vector<float>, angles));
-
 
124
 
-
 
125
    std::cout << "Aquiring sets at ";
-
 
126
    for(int i=0; i<angles.size(); i++)
-
 
127
        std::cout << angles[i] << " ";
-
 
128
    std::cout << " degrees" <<std::endl;
-
 
129
}
-
 
130
 
-
 
131
 
97
void SMScanner::on_calibrationRotationDial_sliderReleased(){
132
void SMScanner::on_calibrationRotationDial_sliderReleased(){
98
 
133
 
99
    float angle = ui->calibrationRotationDial->value();
134
    float angle = ui->calibrationRotationDial->value();
100
    std::cout << "Rotation stage target: " << angle << std::endl;
135
    std::cout << "Rotation stage target: " << angle << std::endl;
101
    QMetaObject::invokeMethod(captureWorker, "rotateTo", Q_ARG(float, angle));
136
    QMetaObject::invokeMethod(captureWorker, "rotateTo", Q_ARG(float, angle));
102
 
137
 
103
    ui->captureRotationDial->setValue(ui->calibrationRotationDial->value());
138
    ui->captureRotationDial->setValue(ui->calibrationRotationDial->value());
104
}
139
}
105
 
140
 
106
void SMScanner::onReceiveCalibrationSet(SMCalibrationSet calibrationSet){
141
void SMScanner::onReceiveCalibrationSet(SMCalibrationSet calibrationSet){
107
    calibrationData.push_back(calibrationSet);
142
    calibrationData.push_back(calibrationSet);
108
 
143
 
109
    // Add identifier to list
144
    // Add identifier to list
110
    QListWidgetItem* item = new QListWidgetItem(QString("Calibration Set %1 -- %2 deg").arg(ui->calibrationListWidget->count()).arg(calibrationSet.rotationAngle), ui->calibrationListWidget);
145
    QListWidgetItem* item = new QListWidgetItem(QString("Calibration Set %1 -- %2 deg").arg(ui->calibrationListWidget->count()).arg(calibrationSet.rotationAngle), ui->calibrationListWidget);
111
    item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
146
    item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
112
    item->setCheckState(Qt::Checked);
147
    item->setCheckState(Qt::Checked);
113
    ui->calibrationListWidget->addItem(item);
148
    ui->calibrationListWidget->addItem(item);
114
 
149
 
115
    // Set enabled checkmark
150
    // Set enabled checkmark
116
    if(calibrationData.size() >= 2)
151
    if(calibrationData.size() >= 2)
117
        ui->calibrateButton->setEnabled(true);
152
        ui->calibrateButton->setEnabled(true);
118
}
153
}
119
 
154
 
120
void SMScanner::on_calibrateButton_clicked(){
155
void SMScanner::on_calibrateButton_clicked(){
121
 
156
 
122
    // disable ui elements
157
    // disable ui elements
123
    ui->calibrateButton->setEnabled(false);
158
    ui->calibrateButton->setEnabled(false);
124
    ui->calibrationFrame->setEnabled(false);
159
    ui->calibrationFrame->setEnabled(false);
125
 
160
 
126
    // set checked flags
161
    // set checked flags
127
    for(int i=0; i<calibrationData.size(); i++){
162
    for(int i=0; i<calibrationData.size(); i++){
128
        calibrationData[i].checked = (ui->calibrationListWidget->item(i)->checkState() == Qt::Checked);
163
        calibrationData[i].checked = (ui->calibrationListWidget->item(i)->checkState() == Qt::Checked);
129
    }
164
    }
130
 
165
 
131
//    SMCalibrationWorker calibrationWorker;
166
//    SMCalibrationWorker calibrationWorker;
132
//    calibrationWorker.performCalibration(calibrationData);
167
//    calibrationWorker.performCalibration(calibrationData);
133
 
168
 
134
    // Set up calibration thread
169
    // Set up calibration thread
135
    calibrationWorker = new SMCalibrationWorker;
170
    calibrationWorker = new SMCalibrationWorker;
136
    calibrationWorkerThread = new QThread(this);
171
    calibrationWorkerThread = new QThread(this);
137
    calibrationWorkerThread->setObjectName("calibrationWorkerThread");
172
    calibrationWorkerThread->setObjectName("calibrationWorkerThread");
138
    calibrationWorker->moveToThread(captureWorkerThread);
173
    calibrationWorker->moveToThread(captureWorkerThread);
139
    calibrationWorkerThread->start();
174
    calibrationWorkerThread->start();
140
 
175
 
141
    // Connections
176
    // Connections
142
    connect(calibrationWorker, SIGNAL(newSetProcessed(int)), this, SLOT(onCalibrationSetProcessed(int)));
177
    connect(calibrationWorker, SIGNAL(newSetProcessed(int)), this, SLOT(onCalibrationSetProcessed(int)));
143
    connect(calibrationWorker, SIGNAL(newFrameResult(int,int,bool,cv::Mat)), this, SLOT(onCalibrationFrameResult(int,int,bool,cv::Mat)));
178
    connect(calibrationWorker, SIGNAL(newFrameResult(int,int,bool,cv::Mat)), this, SLOT(onCalibrationFrameResult(int,int,bool,cv::Mat)));
144
    connect(calibrationWorker, SIGNAL(done()), this, SLOT(onCalibrationDone()));
179
    connect(calibrationWorker, SIGNAL(done()), this, SLOT(onCalibrationDone()));
145
    connect(calibrationWorker, SIGNAL(done()), calibrationWorkerThread, SLOT(quit()));
180
    connect(calibrationWorker, SIGNAL(done()), calibrationWorkerThread, SLOT(quit()));
146
    connect(calibrationWorker, SIGNAL(done()), calibrationWorker, SLOT(deleteLater()));
181
    connect(calibrationWorker, SIGNAL(done()), calibrationWorker, SLOT(deleteLater()));
147
 
182
 
148
    // Start capturing
183
    // Start capturing
149
    QMetaObject::invokeMethod(calibrationWorker, "performCalibration", Q_ARG(std::vector<SMCalibrationSet>, calibrationData));
184
    QMetaObject::invokeMethod(calibrationWorker, "performCalibration", Q_ARG(std::vector<SMCalibrationSet>, calibrationData));
150
 
185
 
151
}
186
}
152
 
187
 
-
 
188
 
-
 
189
 
153
void SMScanner::onCalibrationSetProcessed(int idx){
190
void SMScanner::onCalibrationSetProcessed(int idx){
154
 
191
 
155
    ui->calibrationListWidget->setCurrentRow(idx);
192
    ui->calibrationListWidget->setCurrentRow(idx);
156
}
193
}
157
 
194
 
158
void SMScanner::onCalibrationDone(){
195
void SMScanner::onCalibrationDone(){
159
 
196
 
160
    std::cout << "Calibration done!" << std::endl;
197
    std::cout << "Calibration done!" << std::endl;
161
    ui->calibrateButton->setEnabled(true);
198
    ui->calibrateButton->setEnabled(true);
162
    ui->calibrationFrame->setEnabled(true);
199
    ui->calibrationFrame->setEnabled(true);
163
 
200
 
164
}
201
}
165
 
202
 
166
void SMScanner::on_calibrationListWidget_itemSelectionChanged(){
203
void SMScanner::on_calibrationListWidget_itemSelectionChanged(){
167
 
204
 
168
    // if selection is just cleared
205
    // if selection is just cleared
169
    if(ui->calibrationListWidget->selectedItems().empty())
206
    if(ui->calibrationListWidget->selectedItems().empty())
170
        return;
207
        return;
171
 
208
 
172
    int currentRow = ui->calibrationListWidget->currentRow();
209
    int currentRow = ui->calibrationListWidget->currentRow();
173
 
210
 
174
    calibrationReviewMode = true;
211
    calibrationReviewMode = true;
175
    ui->singleCalibrationButton->setText("Live View");
212
    ui->singleCalibrationButton->setText("Live View");
176
    ui->batchCalibrationButton->setText("Live View");
213
    ui->batchCalibrationButton->setText("Live View");
177
 
214
 
178
    if(!calibrationData[currentRow].frame0Result.empty())
215
    if(!calibrationData[currentRow].frame0Result.empty())
179
        ui->calibrationCamera0Widget->showImageCV(calibrationData[currentRow].frame0Result);
216
        ui->calibrationCamera0Widget->showImageCV(calibrationData[currentRow].frame0Result);
180
    else
217
    else
181
        ui->calibrationCamera0Widget->showImageCV(calibrationData[currentRow].frame0);
218
        ui->calibrationCamera0Widget->showImageCV(calibrationData[currentRow].frame0);
182
 
219
 
183
    if(!calibrationData[currentRow].frame1Result.empty())
220
    if(!calibrationData[currentRow].frame1Result.empty())
184
        ui->calibrationCamera1Widget->showImageCV(calibrationData[currentRow].frame1Result);
221
        ui->calibrationCamera1Widget->showImageCV(calibrationData[currentRow].frame1Result);
185
    else
222
    else
186
        ui->calibrationCamera1Widget->showImageCV(calibrationData[currentRow].frame1);
223
        ui->calibrationCamera1Widget->showImageCV(calibrationData[currentRow].frame1);
187
 
224
 
188
//     std::cout << "on_calibrationListWidget_itemSelectionChanged" << std::endl;
225
//     std::cout << "on_calibrationListWidget_itemSelectionChanged" << std::endl;
189
}
226
}
190
 
227
 
191
void SMScanner::onCalibrationFrameResult(int idx, int camID, bool success, cv::Mat result){
228
void SMScanner::onCalibrationFrameResult(int idx, int camID, bool success, cv::Mat result){
192
 
229
 
193
//    std::cout << "onCalibrationFrameResult " << idx << camID << std::endl;
230
//    std::cout << "onCalibrationFrameResult " << idx << camID << std::endl;
194
 
231
 
195
    if(!success)
232
    if(!success)
196
        ui->calibrationListWidget->item(idx)->setCheckState(Qt::Unchecked);
233
        ui->calibrationListWidget->item(idx)->setCheckState(Qt::Unchecked);
197
    else {
234
    else {
198
        if(camID == 0)
235
        if(camID == 0)
199
            calibrationData[idx].frame0Result = result;
236
            calibrationData[idx].frame0Result = result;
200
        else if(camID == 1)
237
        else if(camID == 1)
201
            calibrationData[idx].frame1Result = result;
238
            calibrationData[idx].frame1Result = result;
202
    }
239
    }
203
 
240
 
204
}
241
}
205
 
242
 
206
void SMScanner::on_singleCaptureButton_clicked(){
243
void SMScanner::on_singleCaptureButton_clicked(){
207
 
244
 
208
    // If in review mode, go back to aquisition mode
245
    // If in review mode, go back to aquisition mode
209
    if(captureReviewMode){
246
    if(captureReviewMode){
210
        ui->captureTreeWidget->clearSelection();
247
        ui->captureTreeWidget->clearSelection();
211
        ui->singleCaptureButton->setText("Single Aquisition");
248
        ui->singleCaptureButton->setText("Single Aquisition");
212
        ui->batchCaptureButton->setText("Batch Aquisition");
249
        ui->batchCaptureButton->setText("Batch Aquisition");
213
        captureReviewMode = false;
250
        captureReviewMode = false;
214
        return;
251
        return;
215
    }
252
    }
216
 
253
 
217
    QMetaObject::invokeMethod(captureWorker, "acquireFrameSequence", Q_ARG(float, -1.0));
254
    QMetaObject::invokeMethod(captureWorker, "acquireFrameSequence", Q_ARG(float, -1.0));
218
 
255
 
219
}
256
}
220
 
257
 
221
 
258
 
-
 
259
void SMScanner::on_batchCaptureButton_clicked(){
-
 
260
 
-
 
261
    // If in review mode, go back to aquisition mode
-
 
262
    if(captureReviewMode){
-
 
263
        ui->captureTreeWidget->clearSelection();
-
 
264
        ui->singleCaptureButton->setText("Single Aquisition");
-
 
265
        ui->batchCaptureButton->setText("Batch Aquisition");
-
 
266
        captureReviewMode = false;
-
 
267
        return;
-
 
268
    }
-
 
269
 
-
 
270
    // Construct vector of angles
-
 
271
    int angleStart = ui->captureBatchStartSpinBox->value();
-
 
272
    int angleEnd = ui->captureBatchEndSpinBox->value();
-
 
273
    int angleStep = ui->captureBatchStepSpinBox->value();
-
 
274
 
-
 
275
    if(angleStart > angleEnd)
-
 
276
        angleEnd += 360;
-
 
277
 
-
 
278
    std::vector<float> angles;
-
 
279
    for(int i=angleStart; i<=angleEnd; i+=angleStep)
-
 
280
        angles.push_back(i % 360);
-
 
281
 
-
 
282
    std::cout << "Aquiring sequences at ";
-
 
283
    for(int i=0; i<angles.size(); i++)
-
 
284
        std::cout << angles[i] << " ";
-
 
285
    std::cout << " degrees" <<std::endl;
-
 
286
 
-
 
287
    QMetaObject::invokeMethod(captureWorker, "acquireFrameSequences", Q_ARG(std::vector<float>, angles));
-
 
288
}
-
 
289
 
222
void SMScanner::on_captureRotationDial_sliderReleased(){
290
void SMScanner::on_captureRotationDial_sliderReleased(){
223
 
291
 
224
    float angle = ui->captureRotationDial->value();
292
    float angle = ui->captureRotationDial->value();
225
    std::cout << "Rotation stage target: " << angle << std::endl;
293
    std::cout << "Rotation stage target: " << angle << std::endl;
226
    QMetaObject::invokeMethod(captureWorker, "rotateTo", Q_ARG(float, angle));
294
    QMetaObject::invokeMethod(captureWorker, "rotateTo", Q_ARG(float, angle));
227
 
295
 
228
    ui->calibrationRotationDial->setValue(ui->captureRotationDial->value());
296
    ui->calibrationRotationDial->setValue(ui->captureRotationDial->value());
229
}
297
}
230
 
298
 
231
void SMScanner::onReceiveFrameSequence(SMFrameSequence frameSequence){
299
void SMScanner::onReceiveFrameSequence(SMFrameSequence frameSequence){
232
 
300
 
233
    captureData.push_back(frameSequence);
301
    captureData.push_back(frameSequence);
234
 
302
 
235
    int idx = captureData.size()-1;
303
    int idx = captureData.size()-1;
236
 
304
 
237
    // Add identifier to list
305
    // Add identifier to list
238
    QTreeWidgetItem* item = new QTreeWidgetItem(ui->captureTreeWidget);
306
    QTreeWidgetItem* item = new QTreeWidgetItem(ui->captureTreeWidget);
239
    item->setText(0, QString("Frame Sequence %1 -- %2 deg").arg(idx).arg(frameSequence.rotationAngle));
307
    item->setText(0, QString("Frame Sequence %1 -- %2 deg").arg(idx).arg(frameSequence.rotationAngle));
240
    item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
308
    item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
241
    item->setData(0, Qt::UserRole, QPoint(idx, -1));
309
    item->setData(0, Qt::UserRole, QPoint(idx, -1));
242
    item->setCheckState(0, Qt::Checked);
310
    item->setCheckState(0, Qt::Checked);
243
    //ui->captureTreeWidget->addItem(item);
311
    //ui->captureTreeWidget->addItem(item);
244
 
312
 
245
    for(int i=0; i<frameSequence.frames0.size(); i++){
313
    for(int i=0; i<frameSequence.frames0.size(); i++){
246
        QTreeWidgetItem* subItem = new QTreeWidgetItem(item);
314
        QTreeWidgetItem* subItem = new QTreeWidgetItem(item);
247
        subItem->setText(0, QString("frames %1").arg(i));
315
        subItem->setText(0, QString("frames %1").arg(i));
248
        subItem->setData(0, Qt::UserRole, QPoint(idx, i));
316
        subItem->setData(0, Qt::UserRole, QPoint(idx, i));
249
    }
317
    }
250
}
318
}
251
 
319
 
252
void SMScanner::on_captureTreeWidget_itemSelectionChanged(){
320
void SMScanner::on_captureTreeWidget_itemSelectionChanged(){
253
 
321
 
254
    // if selection is just cleared
322
    // if selection is just cleared
255
    if(ui->captureTreeWidget->selectedItems().empty())
323
    if(ui->captureTreeWidget->selectedItems().empty())
256
        return;
324
        return;
257
 
325
 
258
    QTreeWidgetItem *item = ui->captureTreeWidget->currentItem();
326
    QTreeWidgetItem *item = ui->captureTreeWidget->currentItem();
259
 
327
 
260
    captureReviewMode = true;
328
    captureReviewMode = true;
261
 
329
 
262
    ui->singleCaptureButton->setText("Live View");
330
    ui->singleCaptureButton->setText("Live View");
263
    ui->batchCaptureButton->setText("Live View");
331
    ui->batchCaptureButton->setText("Live View");
264
 
332
 
265
    QPoint idx = item->data(0, Qt::UserRole).toPoint();
333
    QPoint idx = item->data(0, Qt::UserRole).toPoint();
266
 
334
 
267
    if(idx.y() != -1){
335
    if(idx.y() != -1){
268
        ui->captureCamera0Widget->showImageCV(captureData[idx.x()].frames0[idx.y()]);
336
        ui->captureCamera0Widget->showImageCV(captureData[idx.x()].frames0[idx.y()]);
269
        ui->captureCamera1Widget->showImageCV(captureData[idx.x()].frames1[idx.y()]);
337
        ui->captureCamera1Widget->showImageCV(captureData[idx.x()].frames1[idx.y()]);
270
    }
338
    }
271
 
339
 
272
//     std::cout << "on_captureTreeWidget_itemSelectionChanged" << std::endl;
340
//     std::cout << "on_captureTreeWidget_itemSelectionChanged" << std::endl;
273
}
341
}
-
 
342
 
-
 
343
 
-
 
344
void SMScanner::onReceiveRotatedTo(float angle){
-
 
345
 
-
 
346
    // update ui with new position
-
 
347
    ui->calibrationRotationDial->setValue(angle);
-
 
348
    ui->captureRotationDial->setValue(angle);
-
 
349
 
-
 
350
}
274
 
351