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");
160 if (m_sSettingsPath.isEmpty()) {
165 QSettings settings(
"MNECPP");
194void CoregSettingsView::setToolTipInfo()
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.");
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.");
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.");
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.");
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.");
236void CoregSettingsView::onLoadFidFile()
238 QString sFileName = QFileDialog::getOpenFileName(
this,
239 tr(
"Select fiducials"),
241 tr(
"Fif Files (*.fif)"));
243 if (sFileName.isEmpty()) {
252void CoregSettingsView::onPickingStatus()
254 bool bState = m_pUi->m_qCheckBox_PickFiducials->isChecked();
256 m_pUi->m_qWidget_ResultFiducials->setEnabled(
true);
259 m_pUi->m_qWidget_ResultFiducials->setEnabled(
false);
271 if (m_pUi->m_qRadioButton_LPA->isChecked()) {
272 m_vecLPA = vecPosition;
275 m_pUi->m_qRadioButton_NAS->setChecked(
true);
278 }
else if (m_pUi->m_qRadioButton_NAS->isChecked()) {
279 m_vecNAS = vecPosition;
282 m_pUi->m_qRadioButton_RPA->setChecked(
true);
286 m_vecRPA = vecPosition;
289 m_pUi->m_qRadioButton_LPA->setChecked(
true);
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");
303void CoregSettingsView::onFiducialChanged()
306 if (m_pUi->m_qRadioButton_LPA->isChecked()) {
309 }
else if (m_pUi->m_qRadioButton_NAS->isChecked()) {
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");
326void CoregSettingsView::onStoreFidFile()
328 QString sFileName = QFileDialog::getSaveFileName(Q_NULLPTR,
329 tr(
"Save Fiducials"),
"",
330 tr(
"Fif file (*fiducials.fif)"));
332 if (sFileName.isEmpty()) {
341void CoregSettingsView::onLoadDigFile()
343 QString sFileName = QFileDialog::getOpenFileName(
this,
344 tr(
"Select digitizer file"),
346 tr(
"Fif Files (*.fif)"));
348 if (sFileName.isEmpty()) {
357void CoregSettingsView::onLoadTrans()
359 QString sFileName = QFileDialog::getOpenFileName(
this,
360 tr(
"Select Transformation"),
362 tr(
"Fif Files (*-trans.fif)"));
364 if (sFileName.isEmpty()) {
373void CoregSettingsView::onStoreTrans()
375 QString sFileName = QFileDialog::getSaveFileName(Q_NULLPTR,
376 tr(
"Save Transformation"),
"",
377 tr(
"Fif file (*-trans.fif)"));
379 if (sFileName.isEmpty()) {
391 if (m_pUi->m_qRadioButton_LPA->isChecked()) {
393 }
else if (m_pUi->m_qRadioButton_NAS->isChecked()) {
395 }
else if (m_pUi->m_qRadioButton_RPA->isChecked()) {
405 return m_pUi->m_qSpinBox_MaxIter->value();
412 return m_pUi->m_qDoubleSpinBox_Converge->value() / 1000;
419 return m_pUi->m_qCheckBox_AutoScale->isChecked();
426 return static_cast<float>(m_pUi->m_qDoubleSpinBox_WeightLpa->value());
433 return static_cast<float>(m_pUi->m_qDoubleSpinBox_WeightRpa->value());
440 return static_cast<float>(m_pUi->m_qDoubleSpinBox_WeightNas->value());
447 return static_cast<float>(m_pUi->m_qDoubleSpinBox_WeightEEG->value());
454 return static_cast<float>(m_pUi->m_qDoubleSpinBox_WeightHPI->value());
461 return static_cast<float>(m_pUi->m_qDoubleSpinBox_WeightHSP->value());
468 return static_cast<float>(m_pUi->m_qSpinBox_MaxDist->value()) / 1000.0;
479 if (m_pUi->m_qCheckBox_EEG->isChecked()) {
482 if (m_pUi->m_qCheckBox_HPI->isChecked()) {
485 if (m_pUi->m_qCheckBox_HSP->isChecked()) {
496 QSignalBlocker blockerComboBox(m_pUi->m_qComboBox_BemItems);
497 m_pUi->m_qComboBox_BemItems->clear();
504 m_pUi->m_qComboBox_BemItems->addItem(sBemName);
511 return m_pUi->m_qComboBox_BemItems->currentText();
518 m_pUi->m_qLabel_NOmitted->setText(QString::number(iN));
525 m_pUi->m_qLabel_RMSE->setText(QString::number(fRMSE * 1000) +
" mm");
531 const Vector3f& vecRot,
532 const Vector3f& vecScale)
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);
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);
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);
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));
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;
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;
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();
590void CoregSettingsView::onScalingModeChanges()
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);
602 m_pUi->m_qDoubleSpinBox_ScalingX->setEnabled(
false);
603 m_pUi->m_qDoubleSpinBox_ScalingY->setEnabled(
false);
604 m_pUi->m_qDoubleSpinBox_ScalingZ->setEnabled(
false);
611void CoregSettingsView::onFitFiducials()
613 m_pUi->m_qCheckBox_PickFiducials->setChecked(
false);
619void CoregSettingsView::onFitICP()
621 m_pUi->m_qCheckBox_PickFiducials->setChecked(
false);
#define FIFFV_POINT_EXTRA
#define FIFFV_POINT_CARDINAL
#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.
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)