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