15# define M_PI 3.14159265358979323846
22#include "ui_coregsettingsview.h"
45#include <Eigen/Geometry>
66, m_pUi(new Ui::CoregSettingsViewWidget)
68 m_sSettingsPath = sSettingsPath;
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,
87 connect(m_pUi->m_qComboBox_BemItems, &QComboBox::currentTextChanged,
89 connect(m_pUi->m_qComboBox_BemItems, &QComboBox::currentTextChanged,
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);
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);
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();
148 if(m_sSettingsPath.isEmpty()) {
153 QSettings settings(
"MNECPP");
161 if(m_sSettingsPath.isEmpty()) {
166 QSettings settings(
"MNECPP");
196void CoregSettingsView::setToolTipInfo()
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.");
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.");
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.");
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.");
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.");
239void CoregSettingsView::onLoadFidFile()
241 QString sFileName = QFileDialog::getOpenFileName(
this,
242 tr(
"Select fiducials"),
244 tr(
"Fif Files (*.fif)"));
246 if (sFileName.isEmpty()) {
255void CoregSettingsView::onPickingStatus()
257 bool bState = m_pUi->m_qCheckBox_PickFiducials->isChecked();
259 m_pUi->m_qWidget_ResultFiducials->setEnabled(
true);
262 m_pUi->m_qWidget_ResultFiducials->setEnabled(
false);
274 if(m_pUi->m_qRadioButton_LPA->isChecked()) {
275 m_vecLPA = vecPosition;
278 m_pUi->m_qRadioButton_NAS->setChecked(
true);
281 }
else if (m_pUi->m_qRadioButton_NAS->isChecked()) {
282 m_vecNAS = vecPosition;
285 m_pUi->m_qRadioButton_RPA->setChecked(
true);
289 m_vecRPA = vecPosition;
292 m_pUi->m_qRadioButton_LPA->setChecked(
true);
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" );
306void CoregSettingsView::onFiducialChanged()
309 if(m_pUi->m_qRadioButton_LPA->isChecked()) {
312 }
else if (m_pUi->m_qRadioButton_NAS->isChecked()) {
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" );
329void CoregSettingsView::onStoreFidFile()
331 QString sFileName = QFileDialog::getSaveFileName(Q_NULLPTR,
332 tr(
"Save Fiducials"),
"",
333 tr(
"Fif file (*fiducials.fif)"));
335 if (sFileName.isEmpty()) {
344void CoregSettingsView::onLoadDigFile()
346 QString sFileName = QFileDialog::getOpenFileName(
this,
347 tr(
"Select digitizer file"),
349 tr(
"Fif Files (*.fif)"));
351 if (sFileName.isEmpty()) {
360void CoregSettingsView::onLoadTrans()
362 QString sFileName = QFileDialog::getOpenFileName(
this,
363 tr(
"Select Transformation"),
365 tr(
"Fif Files (*-trans.fif)"));
367 if (sFileName.isEmpty()) {
376void CoregSettingsView::onStoreTrans()
378 QString sFileName = QFileDialog::getSaveFileName(Q_NULLPTR,
379 tr(
"Save Transformation"),
"",
380 tr(
"Fif file (*-trans.fif)"));
382 if (sFileName.isEmpty()) {
394 if(m_pUi->m_qRadioButton_LPA->isChecked()) {
396 }
else if(m_pUi->m_qRadioButton_NAS->isChecked()) {
398 }
else if(m_pUi->m_qRadioButton_RPA->isChecked()) {
408 return m_pUi->m_qSpinBox_MaxIter->value();
415 return m_pUi->m_qDoubleSpinBox_Converge->value()/1000;
422 return m_pUi->m_qCheckBox_AutoScale->isChecked();
429 return m_pUi->m_qDoubleSpinBox_WeightLpa->text().toFloat();
436 return m_pUi->m_qDoubleSpinBox_WeightRpa->text().toFloat();
443 return m_pUi->m_qDoubleSpinBox_WeightNas->text().toFloat();
450 return m_pUi->m_qDoubleSpinBox_WeightEEG->text().toFloat();
457 return m_pUi->m_qDoubleSpinBox_WeightHPI->text().toFloat();
464 return m_pUi->m_qDoubleSpinBox_WeightHSP->text().toFloat();
471 return static_cast<float>(m_pUi->m_qSpinBox_MaxDist->value())/1000.0;
482 if(m_pUi->m_qCheckBox_EEG) {
485 if(m_pUi->m_qCheckBox_HPI) {
488 if(m_pUi->m_qCheckBox_HSP) {
499 QSignalBlocker blockerComboBox(m_pUi->m_qComboBox_BemItems);
500 m_pUi->m_qComboBox_BemItems->clear();
507 m_pUi->m_qComboBox_BemItems->addItem(sBemName);
514 return m_pUi->m_qComboBox_BemItems->currentText();
521 m_pUi->m_qLabel_NOmitted->setText(QString::number(iN));
528 m_pUi->m_qLabel_RMSE->setText(QString::number(fRMSE*1000) +
" mm");
534 const Vector3f& vecRot,
535 const Vector3f& vecScale)
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);
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);
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);
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));
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;
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;
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();
593void CoregSettingsView::onScalingModeChanges()
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);
605 m_pUi->m_qDoubleSpinBox_ScalingX->setEnabled(
false);
606 m_pUi->m_qDoubleSpinBox_ScalingY->setEnabled(
false);
607 m_pUi->m_qDoubleSpinBox_ScalingZ->setEnabled(
false);
614void CoregSettingsView::onFitFiducials()
616 m_pUi->m_qCheckBox_PickFiducials->setChecked(
false);
622void CoregSettingsView::onFitICP()
624 m_pUi->m_qCheckBox_PickFiducials->setChecked(
false);
Co-registration parameter panel driving the MRI ↔ head fiducial alignment dialog.
#define FIFFV_POINT_EXTRA
#define FIFFV_POINT_CARDINAL
#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 updateGuiMode(GuiMode mode)
void pickFiducials(bool bActivatePicking)
QString getCurrentSelectedBem()
void loadTrans(const QString &sFilePath)
void setTransParams(const Eigen::Vector3f &vecTrans, const Eigen::Vector3f &vecRot, const Eigen::Vector3f &vecScale)
QList< int > getDigitizerCheckState()
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)