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