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
159{
160 if (m_sSettingsPath.isEmpty()) {
161 return;
162 }
163
164 // Load Settings
165 QSettings settings("MNECPP");
166}
167
168//=============================================================================================================
169
171{
172 switch (mode) {
174 break;
175 default: // default is research mode
176 break;
177 }
178}
179
180//=============================================================================================================
181
183{
184 switch (mode) {
186 break;
187 default: // default is realtime mode
188 break;
189 }
190}
191
192//=============================================================================================================
193
194void CoregSettingsView::setToolTipInfo()
195{
196 m_pUi->m_qComboBox_BemItems->setToolTip("Select the Bem to use for coregistration. Load the Bem via: File->Open");
197 m_pUi->m_qPushButton_LoadFid->setToolTip("Optional. Load the fiducials from file.");
198 m_pUi->m_qPushButton_StoreFid->setToolTip("Store the fiducials to file.");
199 m_pUi->m_qPushButton_LoadDig->setToolTip("Load the digitizers from file.");
200 m_pUi->m_qPushButton_LoadTrans->setToolTip("Optional. Load the coordinate transformation from file.");
201 m_pUi->m_qPushButton_StoreTrans->setToolTip("Store the coordinate transformation to file.");
202
203 m_pUi->m_qDoubleSpinBox_WeightRpa->setToolTip("The weight for the RPA.");
204 m_pUi->m_qDoubleSpinBox_WeightLpa->setToolTip("The weight for the LPA.");
205 m_pUi->m_qDoubleSpinBox_WeightNas->setToolTip("The weight for the Nasion.");
206 m_pUi->m_qDoubleSpinBox_WeightEEG->setToolTip("The weight for the EEG points.");
207 m_pUi->m_qDoubleSpinBox_WeightHPI->setToolTip("The weight for the HPI points.");
208 m_pUi->m_qDoubleSpinBox_WeightHSP->setToolTip("The weight for the HSP points. HSP = Head Shape Points");
209 m_pUi->m_qCheckBox_HSP->setToolTip("Wheater to use the HSP points for the Coregistration. HSP = Head Shape Points");
210 m_pUi->m_qCheckBox_EEG->setToolTip("Wheater to use the EEG points for the Coregistration.");
211 m_pUi->m_qCheckBox_HPI->setToolTip("Wheater to use the HPI points for the Coregistration.");
212 m_pUi->m_qSpinBox_MaxDist->setToolTip("The maximum allowed distace between head surface and digitizer cloud. This is used to discard outliers.");
213
214 m_pUi->m_qCheckBox_AutoScale->setToolTip("Wheater to use automatic scaling for the fiducial alignment.");
215 m_pUi->m_qDoubleSpinBox_Converge->setToolTip("The convergence limit for the ICP algorithm.");
216 m_pUi->m_qSpinBox_MaxIter->setToolTip("The maximum number of iterations for the ICP algorithm.");
217 m_pUi->m_qPushButton_FitFiducials->setToolTip("Fiducial alignment. Apply this step before using the ICP algorithm to get a better first guess.");
218 m_pUi->m_qPushButton_FitICP->setToolTip("Co-Registration with the ICP algorithm.");
219 m_pUi->m_qLabel_RMSE->setToolTip("The Root-Mean-Square-Error of the distance between closest point and digigizer in mm");
220 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.");
221 m_pUi->m_qDoubleSpinBox_ScalingX->setToolTip("Scaling to apply in x-direction.");
222 m_pUi->m_qDoubleSpinBox_ScalingY->setToolTip("Scaling to apply in y-direction.");
223 m_pUi->m_qDoubleSpinBox_ScalingZ->setToolTip("Scaling to apply in z-direction.");
224
225 m_pUi->m_qDoubleSpinBox_RotX->setToolTip("Rotation arround x-axis.");
226 m_pUi->m_qDoubleSpinBox_RotY->setToolTip("Rotation arround y-axis.");
227 m_pUi->m_qDoubleSpinBox_RotZ->setToolTip("Rotation arround z-axis.");
228
229 m_pUi->m_qDoubleSpinBox_TransX->setToolTip("Translation to apply in x-direction.");
230 m_pUi->m_qDoubleSpinBox_TransY->setToolTip("Translation to apply in y-direction.");
231 m_pUi->m_qDoubleSpinBox_TransZ->setToolTip("Translation to apply in z-direction.");
232}
233
234//=============================================================================================================
235
236void CoregSettingsView::onLoadFidFile()
237{
238 QString sFileName = QFileDialog::getOpenFileName(this,
239 tr("Select fiducials"),
240 QString(),
241 tr("Fif Files (*.fif)"));
242
243 if (sFileName.isEmpty()) {
244 return;
245 } else {
246 emit fidFileChanged(sFileName);
247 }
248}
249
250//=============================================================================================================
251
252void CoregSettingsView::onPickingStatus()
253{
254 bool bState = m_pUi->m_qCheckBox_PickFiducials->isChecked();
255 if (bState) {
256 m_pUi->m_qWidget_ResultFiducials->setEnabled(true);
257 emit pickFiducials(true);
258 } else {
259 m_pUi->m_qWidget_ResultFiducials->setEnabled(false);
260 emit pickFiducials(false);
261 }
262 return;
263}
264
265//=============================================================================================================
266
267void CoregSettingsView::setFiducials(const QVector3D vecPosition)
268{
269 QVector3D vecTemp;
270 // store incoming vector
271 if (m_pUi->m_qRadioButton_LPA->isChecked()) {
272 m_vecLPA = vecPosition;
273
274 // step to next fiducial
275 m_pUi->m_qRadioButton_NAS->setChecked(true);
276 vecTemp = m_vecNAS;
277 onFiducialChanged();
278 } else if (m_pUi->m_qRadioButton_NAS->isChecked()) {
279 m_vecNAS = vecPosition;
280
281 // step to next fiducial
282 m_pUi->m_qRadioButton_RPA->setChecked(true);
283 vecTemp = m_vecRPA;
284 onFiducialChanged();
285 } else {
286 m_vecRPA = vecPosition;
287
288 // step to next fiducial
289 m_pUi->m_qRadioButton_LPA->setChecked(true);
290 vecTemp = m_vecLPA;
291 onFiducialChanged();
292 }
293
294 // floor(vecAxialPosition[0]*100)/100 makes sure to only take 2 decimal positions
295 m_pUi->m_qLineEdit_FidX->setText(QString::number(floor(vecTemp[0] * 100) / 100 * 1000) + " mm");
296 m_pUi->m_qLineEdit_FidY->setText(QString::number(floor(vecTemp[1] * 100) / 100 * 1000) + " mm");
297 m_pUi->m_qLineEdit_FidZ->setText(QString::number(floor(vecTemp[2] * 100) / 100 * 1000) + " mm");
298 return;
299}
300
301//=============================================================================================================
302
303void CoregSettingsView::onFiducialChanged()
304{
305 QVector3D vecTemp;
306 if (m_pUi->m_qRadioButton_LPA->isChecked()) {
307 vecTemp = m_vecLPA;
309 } else if (m_pUi->m_qRadioButton_NAS->isChecked()) {
310 vecTemp = m_vecNAS;
312 } else {
313 vecTemp = m_vecRPA;
315 }
316
317 // floor(vecAxialPosition[0]*100)/100 makes sure to only take 2 decimal positions
318 m_pUi->m_qLineEdit_FidX->setText(QString::number(floor(vecTemp[0] * 100) / 100 * 1000) + " mm");
319 m_pUi->m_qLineEdit_FidY->setText(QString::number(floor(vecTemp[1] * 100) / 100 * 1000) + " mm");
320 m_pUi->m_qLineEdit_FidZ->setText(QString::number(floor(vecTemp[2] * 100) / 100 * 1000) + " mm");
321 return;
322}
323
324//=============================================================================================================
325
326void CoregSettingsView::onStoreFidFile()
327{
328 QString sFileName = QFileDialog::getSaveFileName(Q_NULLPTR,
329 tr("Save Fiducials"), "",
330 tr("Fif file (*fiducials.fif)"));
331
332 if (sFileName.isEmpty()) {
333 return;
334 } else {
335 emit fidStoreFileChanged(sFileName);
336 }
337}
338
339//=============================================================================================================
340
341void CoregSettingsView::onLoadDigFile()
342{
343 QString sFileName = QFileDialog::getOpenFileName(this,
344 tr("Select digitizer file"),
345 QString(),
346 tr("Fif Files (*.fif)"));
347
348 if (sFileName.isEmpty()) {
349 return;
350 } else {
351 emit digFileChanged(sFileName);
352 }
353}
354
355//=============================================================================================================
356
357void CoregSettingsView::onLoadTrans()
358{
359 QString sFileName = QFileDialog::getOpenFileName(this,
360 tr("Select Transformation"),
361 QString(),
362 tr("Fif Files (*-trans.fif)"));
363
364 if (sFileName.isEmpty()) {
365 return;
366 } else {
367 emit loadTrans(sFileName);
368 }
369}
370
371//=============================================================================================================
372
373void CoregSettingsView::onStoreTrans()
374{
375 QString sFileName = QFileDialog::getSaveFileName(Q_NULLPTR,
376 tr("Save Transformation"), "",
377 tr("Fif file (*-trans.fif)"));
378
379 if (sFileName.isEmpty()) {
380 return;
381 } else {
382 emit storeTrans(sFileName);
383 }
384}
385
386//=============================================================================================================
387
389{
390 // choose to use other points as well
391 if (m_pUi->m_qRadioButton_LPA->isChecked()) {
392 return FIFFV_POINT_LPA;
393 } else if (m_pUi->m_qRadioButton_NAS->isChecked()) {
394 return FIFFV_POINT_NASION;
395 } else if (m_pUi->m_qRadioButton_RPA->isChecked()) {
396 return FIFFV_POINT_RPA;
397 };
398 return -1;
399}
400
401//=============================================================================================================
402
404{
405 return m_pUi->m_qSpinBox_MaxIter->value();
406}
407
408//=============================================================================================================
409
411{
412 return m_pUi->m_qDoubleSpinBox_Converge->value() / 1000;
413}
414
415//=============================================================================================================
416
418{
419 return m_pUi->m_qCheckBox_AutoScale->isChecked();
420}
421
422//=============================================================================================================
423
425{
426 return static_cast<float>(m_pUi->m_qDoubleSpinBox_WeightLpa->value());
427}
428
429//=============================================================================================================
430
432{
433 return static_cast<float>(m_pUi->m_qDoubleSpinBox_WeightRpa->value());
434}
435
436//=============================================================================================================
437
439{
440 return static_cast<float>(m_pUi->m_qDoubleSpinBox_WeightNas->value());
441}
442
443//=============================================================================================================
444
446{
447 return static_cast<float>(m_pUi->m_qDoubleSpinBox_WeightEEG->value());
448}
449
450//=============================================================================================================
451
453{
454 return static_cast<float>(m_pUi->m_qDoubleSpinBox_WeightHPI->value());
455}
456
457//=============================================================================================================
458
460{
461 return static_cast<float>(m_pUi->m_qDoubleSpinBox_WeightHSP->value());
462}
463
464//=============================================================================================================
465
467{
468 return static_cast<float>(m_pUi->m_qSpinBox_MaxDist->value()) / 1000.0;
469}
470
471//=============================================================================================================
472
474{
475 // always use cardinal points
476 QList<int> lPicks({FIFFV_POINT_CARDINAL});
477
478 // choose to use other points as well
479 if (m_pUi->m_qCheckBox_EEG->isChecked()) {
480 lPicks << FIFFV_POINT_EEG;
481 }
482 if (m_pUi->m_qCheckBox_HPI->isChecked()) {
483 lPicks << FIFFV_POINT_HPI;
484 }
485 if (m_pUi->m_qCheckBox_HSP->isChecked()) {
486 lPicks << FIFFV_POINT_EXTRA;
487 }
488 return lPicks;
489}
490
491//=============================================================================================================
492
494{
495 // block to avoid action loop
496 QSignalBlocker blockerComboBox(m_pUi->m_qComboBox_BemItems);
497 m_pUi->m_qComboBox_BemItems->clear();
498}
499
500//=============================================================================================================
501
502void CoregSettingsView::addSelectionBem(const QString& sBemName)
503{
504 m_pUi->m_qComboBox_BemItems->addItem(sBemName);
505}
506
507//=============================================================================================================
508
510{
511 return m_pUi->m_qComboBox_BemItems->currentText();
512}
513
514//=============================================================================================================
515
517{
518 m_pUi->m_qLabel_NOmitted->setText(QString::number(iN));
519}
520
521//=============================================================================================================
522
523void CoregSettingsView::setRMSE(const float fRMSE)
524{
525 m_pUi->m_qLabel_RMSE->setText(QString::number(fRMSE * 1000) + " mm");
526}
527
528//=============================================================================================================
529
530void CoregSettingsView::setTransParams(const Vector3f& vecTrans,
531 const Vector3f& vecRot,
532 const Vector3f& vecScale)
533{
534 // block signals to avoid action loop
535 QSignalBlocker blockerTransX(m_pUi->m_qDoubleSpinBox_TransX);
536 QSignalBlocker blockerTransY(m_pUi->m_qDoubleSpinBox_TransY);
537 QSignalBlocker blockerTransZ(m_pUi->m_qDoubleSpinBox_TransZ);
538 QSignalBlocker blockerRotX(m_pUi->m_qDoubleSpinBox_RotX);
539 QSignalBlocker blockerRotY(m_pUi->m_qDoubleSpinBox_RotY);
540 QSignalBlocker blockerRotZ(m_pUi->m_qDoubleSpinBox_RotZ);
541 QSignalBlocker blockerScaleX(m_pUi->m_qDoubleSpinBox_ScalingX);
542 QSignalBlocker blockerScaleY(m_pUi->m_qDoubleSpinBox_ScalingY);
543 QSignalBlocker blockerScaleZ(m_pUi->m_qDoubleSpinBox_ScalingZ);
544
545 m_pUi->m_qDoubleSpinBox_TransX->setValue(vecTrans(0) * 1000);
546 m_pUi->m_qDoubleSpinBox_TransY->setValue(vecTrans(1) * 1000);
547 m_pUi->m_qDoubleSpinBox_TransZ->setValue(vecTrans(2) * 1000);
548
549 // Inverted order due to euler rotation
550 m_pUi->m_qDoubleSpinBox_RotX->setValue(vecRot(2) * 180 / M_PI);
551 m_pUi->m_qDoubleSpinBox_RotY->setValue(vecRot(1) * 180 / M_PI);
552 m_pUi->m_qDoubleSpinBox_RotZ->setValue(vecRot(0) * 180 / M_PI);
553
554 m_pUi->m_qDoubleSpinBox_ScalingX->setValue(vecScale(0));
555 m_pUi->m_qDoubleSpinBox_ScalingY->setValue(vecScale(1));
556 m_pUi->m_qDoubleSpinBox_ScalingZ->setValue(vecScale(2));
557}
558
559//=============================================================================================================
560
562 Vector3f& vecTrans,
563 Vector3f& vecScale)
564{
565 vecTrans(0) = m_pUi->m_qDoubleSpinBox_TransX->value() / 1000.0;
566 vecTrans(1) = m_pUi->m_qDoubleSpinBox_TransY->value() / 1000.0;
567 vecTrans(2) = m_pUi->m_qDoubleSpinBox_TransZ->value() / 1000.0;
568
569 // Inverted order due to euler rotation
570 vecRot(2) = m_pUi->m_qDoubleSpinBox_RotX->value() * M_PI / 180.0;
571 vecRot(1) = m_pUi->m_qDoubleSpinBox_RotY->value() * M_PI / 180.0;
572 vecRot(0) = m_pUi->m_qDoubleSpinBox_RotZ->value() * M_PI / 180.0;
573
574 // apply different scaling modes
575 if (m_pUi->m_qComboBox_ScalingMode->currentText() == "Uniform") {
576 vecScale.fill(m_pUi->m_qDoubleSpinBox_ScalingX->value());
577 } else if (m_pUi->m_qComboBox_ScalingMode->currentText() == "3-Axis") {
578 vecScale(0) = m_pUi->m_qDoubleSpinBox_ScalingX->value();
579 vecScale(1) = m_pUi->m_qDoubleSpinBox_ScalingY->value();
580 vecScale(2) = m_pUi->m_qDoubleSpinBox_ScalingZ->value();
581 } else {
582 vecScale.fill(1);
583 }
584
585 return;
586}
587
588//=============================================================================================================
589
590void CoregSettingsView::onScalingModeChanges()
591{
592 // apply different scaling modes
593 if (m_pUi->m_qComboBox_ScalingMode->currentText() == "Uniform") {
594 m_pUi->m_qDoubleSpinBox_ScalingX->setEnabled(true);
595 m_pUi->m_qDoubleSpinBox_ScalingY->setEnabled(false);
596 m_pUi->m_qDoubleSpinBox_ScalingZ->setEnabled(false);
597 } else if (m_pUi->m_qComboBox_ScalingMode->currentText() == "3-Axis") {
598 m_pUi->m_qDoubleSpinBox_ScalingX->setEnabled(true);
599 m_pUi->m_qDoubleSpinBox_ScalingY->setEnabled(true);
600 m_pUi->m_qDoubleSpinBox_ScalingZ->setEnabled(true);
601 } else {
602 m_pUi->m_qDoubleSpinBox_ScalingX->setEnabled(false);
603 m_pUi->m_qDoubleSpinBox_ScalingY->setEnabled(false);
604 m_pUi->m_qDoubleSpinBox_ScalingZ->setEnabled(false);
605 }
606 return;
607}
608
609//=============================================================================================================
610
611void CoregSettingsView::onFitFiducials()
612{
613 m_pUi->m_qCheckBox_PickFiducials->setChecked(false);
614 emit fitFiducials();
615}
616
617//=============================================================================================================
618
619void CoregSettingsView::onFitICP()
620{
621 m_pUi->m_qCheckBox_PickFiducials->setChecked(false);
622 emit fitICP();
623}
624
625//=============================================================================================================
626
#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
FIFF binary tag-stream layer: wraps a QIODevice to read and write FIFF tags, directories,...
4x4 affine FIFF coordinate transform (FIFF_COORD_TRANS) annotated with source/destination coordinate-...
Co-registration parameter panel driving the MRI ↔ head fiducial alignment dialog.
#define M_PI
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)