v2.0.0
Loading...
Searching...
No Matches
coregsettingsview.cpp
Go to the documentation of this file.
1//=============================================================================================================
14
15# define M_PI 3.14159265358979323846 /* pi */
16
17//=============================================================================================================
18// INCLUDES
19//=============================================================================================================
20
21#include "coregsettingsview.h"
22#include "ui_coregsettingsview.h"
23
24#include <fiff/fiff_stream.h>
26
27#include <iostream>
28
29//=============================================================================================================
30// QT INCLUDES
31//=============================================================================================================
32
33#include <QSettings>
34#include <QDebug>
35#include <QFileInfo>
36#include <QFileDialog>
37#include <QMessageBox>
38#include <QVector3D>
39
40//=============================================================================================================
41// EIGEN INCLUDES
42//=============================================================================================================
43
44#include <Eigen/Core>
45#include <Eigen/Geometry>
46
47//=============================================================================================================
48// USED NAMESPACES
49//=============================================================================================================
50
51using namespace DISPLIB;
52using namespace Eigen;
53
54//=============================================================================================================
55// DEFINE GLOBAL METHODS
56//=============================================================================================================
57
58//=============================================================================================================
59// DEFINE MEMBER METHODS
60//=============================================================================================================
61
62CoregSettingsView::CoregSettingsView(const QString& sSettingsPath,
63 QWidget *parent,
64 Qt::WindowFlags f)
65: AbstractView(parent, f)
66, m_pUi(new Ui::CoregSettingsViewWidget)
67{
68 m_sSettingsPath = sSettingsPath;
69 m_pUi->setupUi(this);
70
72
73 // Connect File loading and saving
74 connect(m_pUi->m_qPushButton_LoadFid, &QPushButton::released,
75 this, &CoregSettingsView::onLoadFidFile);
76 connect(m_pUi->m_qPushButton_StoreFid, &QPushButton::released,
77 this, &CoregSettingsView::onStoreFidFile);
78 connect(m_pUi->m_qPushButton_LoadDig, &QPushButton::released,
79 this, &CoregSettingsView::onLoadDigFile);
80 connect(m_pUi->m_qPushButton_LoadTrans, &QPushButton::released,
81 this, &CoregSettingsView::onLoadTrans);
82 connect(m_pUi->m_qPushButton_StoreTrans, &QPushButton::released,
83 this, &CoregSettingsView::onStoreTrans);
84 connect(m_pUi->m_qComboBox_BemItems, &QComboBox::currentTextChanged,
85 this, &CoregSettingsView::changeSelectedBem, Qt::UniqueConnection);
86
87 connect(m_pUi->m_qComboBox_BemItems, &QComboBox::currentTextChanged,
88 this, &CoregSettingsView::changeSelectedBem, Qt::UniqueConnection);
89 connect(m_pUi->m_qComboBox_BemItems, &QComboBox::currentTextChanged,
90 this, &CoregSettingsView::changeSelectedBem, Qt::UniqueConnection);
91
92 // Connect Fiducial Pickings
93 connect(m_pUi->m_qCheckBox_PickFiducials, &QCheckBox::checkStateChanged,
94 this, &CoregSettingsView::onPickingStatus);
95 connect(m_pUi->m_qRadioButton_LPA, &QCheckBox::toggled,
96 this, &CoregSettingsView::onFiducialChanged);
97 connect(m_pUi->m_qRadioButton_NAS, &QCheckBox::toggled,
98 this, &CoregSettingsView::onFiducialChanged);
99 connect(m_pUi->m_qRadioButton_RPA, &QCheckBox::toggled,
100 this, &CoregSettingsView::onFiducialChanged);
101 onPickingStatus();
102
103 // connect icp settings
104 connect(m_pUi->m_qPushButton_FitFiducials, &QPushButton::released,
105 this, &CoregSettingsView::onFitFiducials);
106 connect(m_pUi->m_qPushButton_FitICP, &QPushButton::released,
107 this, &CoregSettingsView::onFitICP);
108
109 // connect adjustment settings
110 connect(m_pUi->m_qDoubleSpinBox_ScalingX, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
112 connect(m_pUi->m_qDoubleSpinBox_ScalingY, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
114 connect(m_pUi->m_qDoubleSpinBox_ScalingZ, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
116 connect(m_pUi->m_qDoubleSpinBox_RotX, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
118 connect(m_pUi->m_qDoubleSpinBox_RotY, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
120 connect(m_pUi->m_qDoubleSpinBox_RotZ, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
122 connect(m_pUi->m_qDoubleSpinBox_TransX, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
124 connect(m_pUi->m_qDoubleSpinBox_TransY, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
126 connect(m_pUi->m_qDoubleSpinBox_TransZ, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
128 connect(m_pUi->m_qComboBox_ScalingMode, &QComboBox::currentTextChanged,
129 this, &CoregSettingsView::onScalingModeChanges, Qt::UniqueConnection);
130 onScalingModeChanges();
131
132 // set button infos
133 setToolTipInfo();
134}
135
136//=============================================================================================================
137
139{
140 saveSettings();
141 delete m_pUi;
142}
143
144//=============================================================================================================
145
147{
148 if(m_sSettingsPath.isEmpty()) {
149 return;
150 }
151
152 // Save Settings
153 QSettings settings("MNECPP");
154
155}
156
157//=============================================================================================================
158
160{
161 if(m_sSettingsPath.isEmpty()) {
162 return;
163 }
164
165 // Load Settings
166 QSettings settings("MNECPP");
167
168}
169
170//=============================================================================================================
171
173{
174 switch(mode) {
176 break;
177 default: // default is research mode
178 break;
179 }
180}
181
182//=============================================================================================================
183
185{
186 switch(mode) {
188 break;
189 default: // default is realtime mode
190 break;
191 }
192}
193
194//=============================================================================================================
195
196void CoregSettingsView::setToolTipInfo()
197{
198 m_pUi->m_qComboBox_BemItems->setToolTip("Select the Bem to use for coregistration. Load the Bem via: File->Open");
199 m_pUi->m_qPushButton_LoadFid->setToolTip("Optional. Load the fiducials from file.");
200 m_pUi->m_qPushButton_StoreFid->setToolTip("Store the fiducials to file.");
201 m_pUi->m_qPushButton_LoadDig->setToolTip("Load the digitizers from file.");
202 m_pUi->m_qPushButton_LoadTrans->setToolTip("Optional. Load the coordinate transformation from file.");
203 m_pUi->m_qPushButton_StoreTrans->setToolTip("Store the coordinate transformation to file.");
204
205 m_pUi->m_qDoubleSpinBox_WeightRpa->setToolTip("The weight for the RPA.");
206 m_pUi->m_qDoubleSpinBox_WeightLpa->setToolTip("The weight for the LPA.");
207 m_pUi->m_qDoubleSpinBox_WeightNas->setToolTip("The weight for the Nasion.");
208 m_pUi->m_qDoubleSpinBox_WeightEEG->setToolTip("The weight for the EEG points.");
209 m_pUi->m_qDoubleSpinBox_WeightHPI->setToolTip("The weight for the HPI points.");
210 m_pUi->m_qDoubleSpinBox_WeightHSP->setToolTip("The weight for the HSP points. HSP = Head Shape Points");
211 m_pUi->m_qCheckBox_HSP->setToolTip("Wheater to use the HSP points for the Coregistration. HSP = Head Shape Points");
212 m_pUi->m_qCheckBox_EEG->setToolTip("Wheater to use the EEG points for the Coregistration.");
213 m_pUi->m_qCheckBox_HPI->setToolTip("Wheater to use the HPI points for the Coregistration.");
214 m_pUi->m_qSpinBox_MaxDist->setToolTip("The maximum allowed distace between head surface and digitizer cloud. This is used to discard outliers.");
215
216 m_pUi->m_qCheckBox_AutoScale->setToolTip("Wheater to use automatic scaling for the fiducial alignment.");
217 m_pUi->m_qDoubleSpinBox_Converge->setToolTip("The convergence limit for the ICP algorithm.");
218 m_pUi->m_qSpinBox_MaxIter->setToolTip("The maximum number of iterations for the ICP algorithm.");
219 m_pUi->m_qPushButton_FitFiducials->setToolTip("Fiducial alignment. Apply this step before using the ICP algorithm to get a better first guess.");
220 m_pUi->m_qPushButton_FitICP->setToolTip("Co-Registration with the ICP algorithm.");
221 m_pUi->m_qLabel_RMSE->setToolTip("The Root-Mean-Square-Error of the distance between closest point and digigizer in mm");
222 m_pUi->m_qComboBox_ScalingMode->setToolTip("The scaling Mode. None - No scaling is applied; Uniform - same scaling for x,y,z-axis; 3-Axis - scaling on each axis.");
223 m_pUi->m_qDoubleSpinBox_ScalingX->setToolTip("Scaling to apply in x-direction.");
224 m_pUi->m_qDoubleSpinBox_ScalingY->setToolTip("Scaling to apply in y-direction.");
225 m_pUi->m_qDoubleSpinBox_ScalingZ->setToolTip("Scaling to apply in z-direction.");
226
227 m_pUi->m_qDoubleSpinBox_RotX->setToolTip("Rotation arround x-axis.");
228 m_pUi->m_qDoubleSpinBox_RotY->setToolTip("Rotation arround y-axis.");
229 m_pUi->m_qDoubleSpinBox_RotZ->setToolTip("Rotation arround z-axis.");
230
231 m_pUi->m_qDoubleSpinBox_TransX->setToolTip("Translation to apply in x-direction.");
232 m_pUi->m_qDoubleSpinBox_TransY->setToolTip("Translation to apply in y-direction.");
233 m_pUi->m_qDoubleSpinBox_TransZ->setToolTip("Translation to apply in z-direction.");
234
235}
236
237//=============================================================================================================
238
239void CoregSettingsView::onLoadFidFile()
240{
241 QString sFileName = QFileDialog::getOpenFileName(this,
242 tr("Select fiducials"),
243 QString(),
244 tr("Fif Files (*.fif)"));
245
246 if (sFileName.isEmpty()) {
247 return;
248 } else {
249 emit fidFileChanged(sFileName);
250 }
251}
252
253//=============================================================================================================
254
255void CoregSettingsView::onPickingStatus()
256{
257 bool bState = m_pUi->m_qCheckBox_PickFiducials->isChecked();
258 if(bState) {
259 m_pUi->m_qWidget_ResultFiducials->setEnabled(true);
260 emit pickFiducials(true);
261 } else {
262 m_pUi->m_qWidget_ResultFiducials->setEnabled(false);
263 emit pickFiducials(false);
264 }
265 return;
266}
267
268//=============================================================================================================
269
270void CoregSettingsView::setFiducials(const QVector3D vecPosition)
271{
272 QVector3D vecTemp;
273 // store incoming vector
274 if(m_pUi->m_qRadioButton_LPA->isChecked()) {
275 m_vecLPA = vecPosition;
276
277 // step to next fiducial
278 m_pUi->m_qRadioButton_NAS->setChecked(true);
279 vecTemp = m_vecNAS;
280 onFiducialChanged();
281 } else if (m_pUi->m_qRadioButton_NAS->isChecked()) {
282 m_vecNAS = vecPosition;
283
284 // step to next fiducial
285 m_pUi->m_qRadioButton_RPA->setChecked(true);
286 vecTemp = m_vecRPA;
287 onFiducialChanged();
288 } else {
289 m_vecRPA = vecPosition;
290
291 // step to next fiducial
292 m_pUi->m_qRadioButton_LPA->setChecked(true);
293 vecTemp = m_vecLPA;
294 onFiducialChanged();
295 }
296
297 // floor(vecAxialPosition[0]*100)/100 makes sure to only take 2 decimal positions
298 m_pUi->m_qLineEdit_FidX->setText(QString::number(floor(vecTemp[0]*100)/100 * 1000) + " mm" );
299 m_pUi->m_qLineEdit_FidY->setText(QString::number(floor(vecTemp[1]*100)/100 * 1000) + " mm" );
300 m_pUi->m_qLineEdit_FidZ->setText(QString::number(floor(vecTemp[2]*100)/100 * 1000) + " mm" );
301 return;
302}
303
304//=============================================================================================================
305
306void CoregSettingsView::onFiducialChanged()
307{
308 QVector3D vecTemp;
309 if(m_pUi->m_qRadioButton_LPA->isChecked()) {
310 vecTemp = m_vecLPA;
312 } else if (m_pUi->m_qRadioButton_NAS->isChecked()) {
313 vecTemp = m_vecNAS;
315 } else {
316 vecTemp = m_vecRPA;
318 }
319
320 // floor(vecAxialPosition[0]*100)/100 makes sure to only take 2 decimal positions
321 m_pUi->m_qLineEdit_FidX->setText(QString::number(floor(vecTemp[0]*100)/100 * 1000) + " mm" );
322 m_pUi->m_qLineEdit_FidY->setText(QString::number(floor(vecTemp[1]*100)/100 * 1000) + " mm" );
323 m_pUi->m_qLineEdit_FidZ->setText(QString::number(floor(vecTemp[2]*100)/100 * 1000) + " mm" );
324 return;
325}
326
327//=============================================================================================================
328
329void CoregSettingsView::onStoreFidFile()
330{
331 QString sFileName = QFileDialog::getSaveFileName(Q_NULLPTR,
332 tr("Save Fiducials"), "",
333 tr("Fif file (*fiducials.fif)"));
334
335 if (sFileName.isEmpty()) {
336 return;
337 } else {
338 emit fidStoreFileChanged(sFileName);
339 }
340}
341
342//=============================================================================================================
343
344void CoregSettingsView::onLoadDigFile()
345{
346 QString sFileName = QFileDialog::getOpenFileName(this,
347 tr("Select digitizer file"),
348 QString(),
349 tr("Fif Files (*.fif)"));
350
351 if (sFileName.isEmpty()) {
352 return;
353 } else {
354 emit digFileChanged(sFileName);
355 }
356}
357
358//=============================================================================================================
359
360void CoregSettingsView::onLoadTrans()
361{
362 QString sFileName = QFileDialog::getOpenFileName(this,
363 tr("Select Transformation"),
364 QString(),
365 tr("Fif Files (*-trans.fif)"));
366
367 if (sFileName.isEmpty()) {
368 return;
369 } else {
370 emit loadTrans(sFileName);
371 }
372}
373
374//=============================================================================================================
375
376void CoregSettingsView::onStoreTrans()
377{
378 QString sFileName = QFileDialog::getSaveFileName(Q_NULLPTR,
379 tr("Save Transformation"), "",
380 tr("Fif file (*-trans.fif)"));
381
382 if (sFileName.isEmpty()) {
383 return;
384 } else{
385 emit storeTrans(sFileName);
386 }
387}
388
389//=============================================================================================================
390
392{
393 // choose to use other points as well
394 if(m_pUi->m_qRadioButton_LPA->isChecked()) {
395 return FIFFV_POINT_LPA;
396 } else if(m_pUi->m_qRadioButton_NAS->isChecked()) {
397 return FIFFV_POINT_NASION;
398 } else if(m_pUi->m_qRadioButton_RPA->isChecked()) {
399 return FIFFV_POINT_RPA;
400 };
401 return -1;
402}
403
404//=============================================================================================================
405
407{
408 return m_pUi->m_qSpinBox_MaxIter->value();
409}
410
411//=============================================================================================================
412
414{
415 return m_pUi->m_qDoubleSpinBox_Converge->value()/1000;
416}
417
418//=============================================================================================================
419
421{
422 return m_pUi->m_qCheckBox_AutoScale->isChecked();
423}
424
425//=============================================================================================================
426
428{
429 return m_pUi->m_qDoubleSpinBox_WeightLpa->text().toFloat();
430}
431
432//=============================================================================================================
433
435{
436 return m_pUi->m_qDoubleSpinBox_WeightRpa->text().toFloat();
437}
438
439//=============================================================================================================
440
442{
443 return m_pUi->m_qDoubleSpinBox_WeightNas->text().toFloat();
444}
445
446//=============================================================================================================
447
449{
450 return m_pUi->m_qDoubleSpinBox_WeightEEG->text().toFloat();
451}
452
453//=============================================================================================================
454
456{
457 return m_pUi->m_qDoubleSpinBox_WeightHPI->text().toFloat();
458}
459
460//=============================================================================================================
461
463{
464 return m_pUi->m_qDoubleSpinBox_WeightHSP->text().toFloat();
465}
466
467//=============================================================================================================
468
470{
471 return static_cast<float>(m_pUi->m_qSpinBox_MaxDist->value())/1000.0;
472}
473
474//=============================================================================================================
475
477{
478 // always use cardinal points
479 QList<int> lPicks({FIFFV_POINT_CARDINAL});
480
481 // choose to use other points as well
482 if(m_pUi->m_qCheckBox_EEG) {
483 lPicks << FIFFV_POINT_EEG;
484 }
485 if(m_pUi->m_qCheckBox_HPI) {
486 lPicks << FIFFV_POINT_HPI;
487 }
488 if(m_pUi->m_qCheckBox_HSP) {
489 lPicks << FIFFV_POINT_EXTRA;
490 }
491 return lPicks;
492}
493
494//=============================================================================================================
495
497{
498 // block to avoid action loop
499 QSignalBlocker blockerComboBox(m_pUi->m_qComboBox_BemItems);
500 m_pUi->m_qComboBox_BemItems->clear();
501}
502
503//=============================================================================================================
504
505void CoregSettingsView::addSelectionBem(const QString& sBemName)
506{
507 m_pUi->m_qComboBox_BemItems->addItem(sBemName);
508}
509
510//=============================================================================================================
511
513{
514 return m_pUi->m_qComboBox_BemItems->currentText();
515}
516
517//=============================================================================================================
518
520{
521 m_pUi->m_qLabel_NOmitted->setText(QString::number(iN));
522}
523
524//=============================================================================================================
525
526void CoregSettingsView::setRMSE(const float fRMSE)
527{
528 m_pUi->m_qLabel_RMSE->setText(QString::number(fRMSE*1000) + " mm");
529}
530
531//=============================================================================================================
532
533void CoregSettingsView::setTransParams(const Vector3f& vecTrans,
534 const Vector3f& vecRot,
535 const Vector3f& vecScale)
536{
537 // block signals to avoid action loop
538 QSignalBlocker blockerTransX(m_pUi->m_qDoubleSpinBox_TransX);
539 QSignalBlocker blockerTransY(m_pUi->m_qDoubleSpinBox_TransY);
540 QSignalBlocker blockerTransZ(m_pUi->m_qDoubleSpinBox_TransZ);
541 QSignalBlocker blockerRotX(m_pUi->m_qDoubleSpinBox_RotX);
542 QSignalBlocker blockerRotY(m_pUi->m_qDoubleSpinBox_RotY);
543 QSignalBlocker blockerRotZ(m_pUi->m_qDoubleSpinBox_RotZ);
544 QSignalBlocker blockerScaleX(m_pUi->m_qDoubleSpinBox_ScalingX);
545 QSignalBlocker blockerScaleY(m_pUi->m_qDoubleSpinBox_ScalingY);
546 QSignalBlocker blockerScaleZ(m_pUi->m_qDoubleSpinBox_ScalingZ);
547
548 m_pUi->m_qDoubleSpinBox_TransX->setValue(vecTrans(0)*1000);
549 m_pUi->m_qDoubleSpinBox_TransY->setValue(vecTrans(1)*1000);
550 m_pUi->m_qDoubleSpinBox_TransZ->setValue(vecTrans(2)*1000);
551
552 // Inverted order due to euler rotation
553 m_pUi->m_qDoubleSpinBox_RotX->setValue(vecRot(2)*180/M_PI);
554 m_pUi->m_qDoubleSpinBox_RotY->setValue(vecRot(1)*180/M_PI);
555 m_pUi->m_qDoubleSpinBox_RotZ->setValue(vecRot(0)*180/M_PI);
556
557 m_pUi->m_qDoubleSpinBox_ScalingX->setValue(vecScale(2));
558 m_pUi->m_qDoubleSpinBox_ScalingY->setValue(vecScale(1));
559 m_pUi->m_qDoubleSpinBox_ScalingZ->setValue(vecScale(0));
560}
561
562//=============================================================================================================
563
565 Vector3f& vecTrans,
566 Vector3f& vecScale)
567{
568 vecTrans(0) = m_pUi->m_qDoubleSpinBox_TransX->value()/1000.0;
569 vecTrans(1) = m_pUi->m_qDoubleSpinBox_TransY->value()/1000.0;
570 vecTrans(2) = m_pUi->m_qDoubleSpinBox_TransZ->value()/1000.0;
571
572 // Inverted order due to euler rotation
573 vecRot(2) = m_pUi->m_qDoubleSpinBox_RotX->value() * M_PI/180.0;
574 vecRot(1) = m_pUi->m_qDoubleSpinBox_RotY->value() * M_PI/180.0;
575 vecRot(0) = m_pUi->m_qDoubleSpinBox_RotZ->value() * M_PI/180.0;
576
577 // apply different scaling modes
578 if (m_pUi->m_qComboBox_ScalingMode->currentText() == "Uniform") {
579 vecScale.fill(m_pUi->m_qDoubleSpinBox_ScalingX->value());
580 } else if (m_pUi->m_qComboBox_ScalingMode->currentText() == "3-Axis") {
581 vecScale(0) = m_pUi->m_qDoubleSpinBox_ScalingX->value();
582 vecScale(1) = m_pUi->m_qDoubleSpinBox_ScalingY->value();
583 vecScale(2) = m_pUi->m_qDoubleSpinBox_ScalingZ->value();
584 } else {
585 vecScale.fill(1);
586 }
587
588 return;
589}
590
591//=============================================================================================================
592
593void CoregSettingsView::onScalingModeChanges()
594{
595 // apply different scaling modes
596 if (m_pUi->m_qComboBox_ScalingMode->currentText() == "Uniform") {
597 m_pUi->m_qDoubleSpinBox_ScalingX->setEnabled(true);
598 m_pUi->m_qDoubleSpinBox_ScalingY->setEnabled(false);
599 m_pUi->m_qDoubleSpinBox_ScalingZ->setEnabled(false);
600 } else if (m_pUi->m_qComboBox_ScalingMode->currentText() == "3-Axis") {
601 m_pUi->m_qDoubleSpinBox_ScalingX->setEnabled(true);
602 m_pUi->m_qDoubleSpinBox_ScalingY->setEnabled(true);
603 m_pUi->m_qDoubleSpinBox_ScalingZ->setEnabled(true);
604 } else {
605 m_pUi->m_qDoubleSpinBox_ScalingX->setEnabled(false);
606 m_pUi->m_qDoubleSpinBox_ScalingY->setEnabled(false);
607 m_pUi->m_qDoubleSpinBox_ScalingZ->setEnabled(false);
608 }
609 return;
610}
611
612//=============================================================================================================
613
614void CoregSettingsView::onFitFiducials()
615{
616 m_pUi->m_qCheckBox_PickFiducials->setChecked(false);
617 emit fitFiducials();
618}
619
620//=============================================================================================================
621
622void CoregSettingsView::onFitICP()
623{
624 m_pUi->m_qCheckBox_PickFiducials->setChecked(false);
625 emit fitICP();
626}
627
628//=============================================================================================================
629
631{
632
633}
#define M_PI
Co-registration parameter panel driving the MRI ↔ head fiducial alignment dialog.
#define FIFFV_POINT_EXTRA
#define FIFFV_POINT_CARDINAL
#define FIFFV_POINT_RPA
#define FIFFV_POINT_EEG
#define FIFFV_POINT_LPA
#define FIFFV_POINT_HPI
#define FIFFV_POINT_NASION
4x4 affine FIFF coordinate transform (FIFF_COORD_TRANS) annotated with source/destination coordinate-...
FIFF binary tag-stream layer: wraps a QIODevice to read and write FIFF tags, directories,...
2-D display widgets and visualisation helpers (charts, topography, colour maps).
AbstractView(QWidget *parent=0, Qt::WindowFlags f=Qt::Widget)
void fidFileChanged(const QString &sFilePath)
void setRMSE(const float fRMSE)
void addSelectionBem(const QString &sBemName)
void updateProcessingMode(ProcessingMode mode)
void changeSelectedBem(const QString &sText)
void setOmittedPoints(const int iN)
void pickFiducials(bool bActivatePicking)
void loadTrans(const QString &sFilePath)
void setTransParams(const Eigen::Vector3f &vecTrans, const Eigen::Vector3f &vecRot, const Eigen::Vector3f &vecScale)
void fidStoreFileChanged(const QString &sFilePath)
void setFiducials(const QVector3D vecAxialPosition)
void digFileChanged(const QString &sFilePath)
void getTransParams(Eigen::Vector3f &vecRot, Eigen::Vector3f &vecTrans, Eigen::Vector3f &vecScale)
void storeTrans(const QString &sFilePath)
void fiducialChanged(const int iFiducial)
CoregSettingsView(const QString &sSettingsPath="", QWidget *parent=0, Qt::WindowFlags f=Qt::Widget)