43 #include "ui_tmsiimpedancewidget.h"
53 #include <QFileDialog>
70 TMSIImpedanceWidget::TMSIImpedanceWidget(
TMSI* pTMSI, QWidget *parent)
74 , m_dMaxImpedance(200000)
79 m_cbColorMap = QSharedPointer<ColorMap>(
new ColorMap());
83 ui->m_graphicsView_impedanceView->setScene(m_qGScene);
84 ui->m_graphicsView_impedanceView->show();
86 ui->m_pushButton_stop->setEnabled(
false);
89 connect(ui->m_pushButton_stop, &QPushButton::released,
this, &TMSIImpedanceWidget::stopImpedanceMeasurement);
90 connect(ui->m_pushButton_start, &QPushButton::released,
this, &TMSIImpedanceWidget::startImpedanceMeasurement);
91 connect(ui->m_pushButton_takeScreenshot, &QPushButton::released,
this, &TMSIImpedanceWidget::takeScreenshot);
92 connect(ui->m_pushButton_loadLayout, &QPushButton::released,
this, &TMSIImpedanceWidget::loadLayout);
93 connect(ui->m_pushButton_saveValues, &QPushButton::released,
this, &TMSIImpedanceWidget::saveToFile);
94 connect(ui->m_pushButton_Help, &QPushButton::released,
this, &TMSIImpedanceWidget::helpDialog);
101 TMSIImpedanceWidget::~TMSIImpedanceWidget()
111 QList<QGraphicsItem *> itemList = m_qGScene->items();
115 double impedanceValue = 0.0;
116 int numberItems = itemList.size();
118 if(itemList.size()>matValue.rows())
120 qDebug()<<
"TMSIImpedanceWidget - ERROR - There were more items in the scene than samples received from the device - Check the current layout! Only available channels will be displayed!"<<endl;
121 numberItems = matValue.rows();
125 for(
int i = 0; i<numberItems; i++)
131 impedanceValue = matValue[matIndex];
140 double scale = ui->m_doubleSpinBox_manualImpedanceValueScale->value();
143 double valueScaledNormalized = (scale*impedanceValue)/(scale*impedanceValue+1);
145 item->
setColor(m_cbColorMap->valueToJet(valueScaledNormalized));
149 m_qGScene->update(m_qGScene->itemsBoundingRect());
161 QVector< QVector<double> > elcLocation3D;
162 QVector< QVector<double> > elcLocation2D;
164 QStringList elcChannelNames;
165 QString sElcFilePath = QString(
"./mne_x_plugins/resources/tmsi/loc_files/standard_waveguard128.elc");
167 if(!asaObject->
readAsaElcFile(sElcFilePath, elcChannelNames, elcLocation3D, elcLocation2D, unit))
169 qDebug() <<
"Error: Reading elc file.";
174 for(
int i = 0; i<elcLocation2D.size(); i++)
175 m_qmElectrodeNameIndex.insert(elcChannelNames.at(i), i);
178 for(
int i = 0; i<elcLocation2D.size(); i++)
180 QVector2D position(elcLocation2D[i][1]*-4.5,elcLocation2D[i][0]*-4.5);
181 addElectrodeItem(elcChannelNames.at(i), position);
184 ui->m_graphicsView_impedanceView->fitInView(m_qGScene->itemsBoundingRect(), Qt::KeepAspectRatio);
189 void TMSIImpedanceWidget::addElectrodeItem(QString electrodeName, QVector2D position)
191 TMSIElectrodeItem *item =
new TMSIElectrodeItem(electrodeName, QPointF(position.x(), position.y()), QColor(m_cbColorMap->valueToJet(1)), m_qmElectrodeNameIndex[electrodeName]);
192 item->setPos(QPointF(position.x(), position.y()));
193 m_qGScene->addItem(item);
198 void TMSIImpedanceWidget::startImpedanceMeasurement()
200 m_pTMSI->m_bCheckImpedances =
true;
204 ui->m_pushButton_stop->setEnabled(
true);
205 ui->m_pushButton_start->setEnabled(
false);
208 m_pTMSI->m_bCheckImpedances =
false;
213 void TMSIImpedanceWidget::stopImpedanceMeasurement()
215 m_pTMSI->m_bCheckImpedances =
false;
219 ui->m_pushButton_stop->setEnabled(
false);
220 ui->m_pushButton_start->setEnabled(
true);
223 m_pTMSI->m_bCheckImpedances =
true;
228 void TMSIImpedanceWidget::takeScreenshot()
232 QString fileName = QFileDialog::getSaveFileName(
this,
234 QString(
"%1/%2_%3_%4_Impedances").arg(QStandardPaths::writableLocation(QStandardPaths::DesktopLocation)).arg(date.currentDate().year()).arg(date.currentDate().month()).arg(date.currentDate().day()),
235 tr(
"Vector graphic(*.svg);;Images (*.png)"));
237 if(!fileName.isEmpty())
240 if(fileName.contains(
".svg"))
242 QSvgGenerator svgGen;
244 svgGen.setFileName(fileName);
245 QRectF rect = m_qGScene->itemsBoundingRect();
246 svgGen.setSize(QSize(rect.width(), rect.height()));
249 QPainter painter(&svgGen);
250 m_qGScene->render(&painter);
253 if(fileName.contains(
".png"))
255 m_qGScene->setSceneRect(m_qGScene->itemsBoundingRect());
256 QImage image(m_qGScene->sceneRect().size().toSize(), QImage::Format_ARGB32);
257 image.fill(Qt::transparent);
259 QPainter painter(&image);
260 m_qGScene->render(&painter);
261 image.save(fileName);
268 void TMSIImpedanceWidget::loadLayout()
270 QString sElcFilePath = QFileDialog::getOpenFileName(
this,
272 "./mne_x_plugins/resources/tmsi/loc_files/",
273 tr(
"ELC layout file (*.elc)"));
277 QVector< QVector<double> > elcLocation3D;
278 QVector< QVector<double> > elcLocation2D;
280 QStringList elcChannelNames;
282 if(!asaObject->
readAsaElcFile(sElcFilePath, elcChannelNames, elcLocation3D, elcLocation2D, unit))
283 qDebug() <<
"Error: Reading elc file.";
288 m_qmElectrodeNameIndex.clear();
290 for(
int i = 0; i<elcLocation2D.size(); i++)
291 m_qmElectrodeNameIndex.insert(elcChannelNames.at(i), i);
294 for(
int i = 0; i<elcLocation2D.size(); i++)
296 QVector2D position(elcLocation2D[i][1]*-4.5,elcLocation2D[i][0]*-4.5);
298 addElectrodeItem(elcChannelNames.at(i), position);
301 ui->m_graphicsView_impedanceView->fitInView(m_qGScene->itemsBoundingRect(), Qt::KeepAspectRatio);
306 void TMSIImpedanceWidget::closeEvent(QCloseEvent *event)
311 if(m_pTMSI->m_bIsRunning)
312 stopImpedanceMeasurement();
323 void TMSIImpedanceWidget::saveToFile()
327 QString fileName = QFileDialog::getSaveFileName(
this,
328 "Save impedance values",
329 QString(
"%1/%2_%3_%4_Impedances").arg(QStandardPaths::writableLocation(QStandardPaths::DesktopLocation)).arg(date.currentDate().year()).arg(date.currentDate().month()).arg(date.currentDate().day()),
330 tr(
"Text file (*.txt)"));
332 ofstream outputFileStream;
333 outputFileStream.open(fileName.toStdString(), ios::trunc);
335 QList<QGraphicsItem *> itemList = m_qGScene->items();
338 QList<TMSIElectrodeItem *> itemListNew;
339 for(
int i = 0; i<itemList.size(); i++)
343 sort(itemListNew.begin(), itemListNew.end(), compareChannelIndex);
346 for(
int i = 0; i<itemListNew.size(); i++)
352 outputFileStream.close();
357 void TMSIImpedanceWidget::helpDialog()
360 msgBox.setText(
"- Use mouse wheel to zoom.\n- Hold and move right mouse button to scale the electrode positions in the scene.\n- Double click to fit the scene into the view.");
Color map RGB transformations.
The TMSIImpedanceScene class provides a reimplemented QGraphicsScene.
The TMSIElectrodeItem class provides a new data structure for impedance values.
static bool readAsaElcFile(QString path, QStringList &channelNames, QVector< QVector< double > > &location3D, QVector< QVector< double > > &location2D, QString &unit)
double getImpedanceValue()
QString getElectrodeName()
Processes AsA .elc files which contain the electrode positions of a EEG hat.
The TMSI class provides a EEG connector. In order for this plugin to work properly the driver dll "RT...
void setImpedanceValue(double impedanceValue)
void setColor(QColor electrodeColor)