CustusX  2023.01.05-dev+develop.0da12
An IGT application
cxImportDataTypeWidget.cpp
Go to the documentation of this file.
1 /*=========================================================================
2 This file is part of CustusX, an Image Guided Therapy Application.
3 
4 Copyright (c) SINTEF Department of Medical Technology.
5 All rights reserved.
6 
7 CustusX is released under a BSD 3-Clause license.
8 
9 See Lisence.txt (https://github.com/SINTEFMedtek/CustusX/blob/master/License.txt) for details.
10 =========================================================================*/
11 
12 #include "cxImportDataTypeWidget.h"
13 #include <QVBoxLayout>
14 #include <QHBoxLayout>
15 #include <QLabel>
16 #include <QTableWidget>
17 #include <QHeaderView>
18 #include <QApplication>
19 #include <QDesktopWidget>
20 #include <QCheckBox>
21 #include <QGroupBox>
22 #include <QFileInfo>
23 #include <QStackedWidget>
24 #include <vtkImageData.h>
25 #include "cxOptionsWidget.h"
27 #include "cxFileManagerService.h"
28 #include "cxLogger.h"
29 #include "cxImage.h"
30 #include "cxPointMetric.h"
32 #include "cxVolumeHelpers.h"
33 #include "cxImageTF3D.h"
34 #include "cxImageLUT2D.h"
35 #include "cxViewService.h"
36 #include "cxImportWidget.h"
37 #include "cxCustomMetaImage.h"
38 
39 namespace cx
40 {
41 
42 //From https://stackoverflow.com/questions/8766633/how-to-determine-the-correct-size-of-a-qtablewidget
44 {
45  int w = t->verticalHeader()->width() + 4;
46  for (int i = 0; i < t->columnCount(); i++)
47  w += t->columnWidth(i);
48  int h = t->horizontalHeader()->height() + 4;
49  for (int i = 0; i < t->rowCount(); i++)
50  h += t->rowHeight(i);
51  return QSize(w, h);
52 }
53 
54 ImportDataTypeWidget::ImportDataTypeWidget(ImportWidget *parent, VisServicesPtr services, std::vector<DataPtr> data, std::vector<DataPtr> &parentCandidates, QString filename) :
55  BaseWidget(parent, "ImportDataTypeWidget", "Import"),
56  mImportWidget(parent),
57  mServices(services),
58  mData(data),
59  mFilename(filename),
60  mParentCandidates(parentCandidates),
61  mSelectedIndexInTable(0),
62  mImageTypeCombo(NULL),
63  mModalityCombo(NULL)
64 
65 {
66  mAnatomicalCoordinateSystems = new QComboBox();
67  mAnatomicalCoordinateSystems->addItem("LPS"); //CX
68  mAnatomicalCoordinateSystems->addItem("RAS"); //NIfTI
69 
70  if(isInputFileInNiftiFormat())
71  mAnatomicalCoordinateSystems->setCurrentText("RAS");
72 
73  mShouldImportParentTransform = new QComboBox();
74  mShouldImportParentTransform->addItem("No");
75  mShouldImportParentTransform->addItem("Yes");
76 
77  mParentCandidatesCB = new QComboBox();
78 
79  mShouldConvertDataToUnsigned = new QCheckBox();
80  mShouldConvertDataToUnsigned->setCheckState(Qt::Unchecked);
81 
82  mStackedWidgetImageParameters = new QStackedWidget;
83  mTableWidget = new QTableWidget();
84  mTableWidget->setRowCount(0);
85  mTableWidget->setColumnCount(7);
86  mTableHeader<<""<<"Series num"<<"#"<<"Name"<<"Type"<<"Slice spacing"<<"Space";
87  mTableWidget->setHorizontalHeaderLabels(mTableHeader);
88  mTableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
89  mTableWidget->verticalHeader()->setVisible(false);
90  mTableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
91  mTableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
92  mTableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
93  mTableWidget->setShowGrid(false);
94  mTableWidget->setStyleSheet("QTableView {selection-background-color: #ACCEF7;}");
95  mTableWidget->setGeometry(QApplication::desktop()->screenGeometry());
96  connect(mTableWidget, &QTableWidget::currentCellChanged, this, &ImportDataTypeWidget::tableItemSelected);
97 
98  QString type, name;
99  for(unsigned i=0; i<mData.size(); ++i)
100  {
101  if(!mData[i])
102  {
103  CX_LOG_WARNING() << "ImportDataTypeWidget::ImportDataTypeWidget: No data";
104  continue;
105  }
106  type = mData[i]->getType();
107  name = mData[i]->getName();
108  QString space = mData[i]->getSpace();
109  //create point metric groups
110  if(type == PointMetric::getTypeName())
111  {
112  space = boost::dynamic_pointer_cast<PointMetric>(mData[i])->getSpace().toString();
113  (mPointMetricGroups[space]).push_back(mData[i]);
114  }
115  //add image or mesh directly to the table
116  else
117  {
118 
119  QIcon trashcan(":/icons/open_icon_library/edit-delete-2.png");
120  QPushButton *removeButton = new QPushButton(trashcan,"");
121  connect(removeButton, &QPushButton::clicked, this, &ImportDataTypeWidget::removeRowFromTableAndDataFromImportList);
122 
123  int newRowIndex = mTableWidget->rowCount();
124  mTableWidget->setRowCount(newRowIndex+1);
125  mTableWidget->setCellWidget(newRowIndex, 0, removeButton);
126  mTableWidget->setItem(newRowIndex, mNumSlicesColoumn, new QTableWidgetItem("1"));
127  mTableWidget->setItem(newRowIndex, mFilenameColoumn, new QTableWidgetItem(name));
128  mTableWidget->setItem(newRowIndex, mTypeColoumn, new QTableWidgetItem(type));
129  }
130  this->createDataSpecificGui(i);
131  }
132  this->addPointMetricGroupsToTable();
133  mTableWidget->setMaximumSize(getQTableWidgetSize(mTableWidget));
134  mTableWidget->setMinimumHeight(getQTableWidgetSize(mTableWidget).height());
135 
136  //gui
137  QVBoxLayout *topLayout = new QVBoxLayout(this);
138  this->setLayout(topLayout);
139 
140  QFileInfo fileInfo(filename);
141  QString title = fileInfo.fileName();
142 
143  QGroupBox *groupBox = new QGroupBox(title);
144 
145  QGridLayout *gridLayout = new QGridLayout();
146  gridLayout->addWidget(new QLabel("For all data in the file: "), 0, 0, 1, 2);
147  gridLayout->addWidget(new QLabel("Specify anatomical coordinate system"), 1, 0);
148  gridLayout->addWidget(mAnatomicalCoordinateSystems, 1, 1);
149  gridLayout->addWidget(new QLabel("Import parents transform?"), 2, 0);
150  gridLayout->addWidget(mShouldImportParentTransform, 2, 1);
151  gridLayout->addWidget(new QLabel("Set parent"), 3, 0);
152  gridLayout->addWidget(mParentCandidatesCB, 3, 1);
153  gridLayout->addWidget(new QLabel("Convert data to unsigned?"), 4, 0);
154  gridLayout->addWidget(mShouldConvertDataToUnsigned, 4,1);
155  gridLayout->addWidget(mTableWidget, 5, 0, 1, 2);
156  gridLayout->addWidget(mStackedWidgetImageParameters);
157  gridLayout->setSpacing(1);//Make Widget more compact
158 
159  groupBox->setLayout(gridLayout);
160  topLayout->addWidget(groupBox, 1);
161  topLayout->addStretch();
162 
165 }
166 
168 {
170  disconnect(mImportWidget, &ImportWidget::parentCandidatesUpdated, this, &ImportDataTypeWidget::update);
171 }
172 
173 int ImportDataTypeWidget::findRowIndexContainingButton(QPushButton *button, QTableWidget* tableWidget)
174 {
175  int retval = -1;
176  for(int i=0; i<tableWidget->rowCount(); ++i)
177  {
178  int buttonColoumn = 0;
179  QWidget *cellWidget = tableWidget->cellWidget(i,buttonColoumn);
180  if(button == cellWidget)
181  retval = i;
182  }
183  return retval;
184 }
185 
186 void ImportDataTypeWidget::createDataSpecificGui(int index)
187 {
188  QWidget* paramWidget = new QWidget(this);
189 
190  ImagePtr image = boost::dynamic_pointer_cast<Image>(mData[index]);
191  if(image)
192  {
193  mTableWidget->setItem(mTableWidget->rowCount()-1, mSeriesNumColumn, new QTableWidgetItem(image->getDicomSeriesNumber()));
194  this->updateTableWithNumberOfSlices(image);
195  this->updateTableWithSliceSpacing(image);
196 
197  mModalityAdapter = StringPropertyDataModality::New(mServices->patient());
198  mModalityCombo = new LabeledComboBoxWidget(this, mModalityAdapter);
199  mModalityAdapter->setData(image);
200 
201  mImageTypeAdapter = StringPropertyImageType::New(mServices->patient());
202  mImageTypeCombo = new LabeledComboBoxWidget(this, mImageTypeAdapter);
203  mImageTypeAdapter->setData(image);
204 
205  if(isInputFileInNiftiFormat()) // NIfTI files are usually MR. Set this as the default
206  {
207  mModalityAdapter->setValue(enum2string(imMR));
208  updateImageType();
209  }
210  QHBoxLayout* layout = new QHBoxLayout();
211  layout->addWidget(mModalityCombo);
212  layout->addWidget(mImageTypeCombo);
213  paramWidget->setLayout(layout);
214  }
215 
216  mStackedWidgetImageParameters->insertWidget(index, paramWidget);
217 }
218 
219 void ImportDataTypeWidget::updateTableWithNumberOfSlices(ImagePtr image)
220 {
221  int dims[3];
222  image->getBaseVtkImageData()->GetDimensions(dims);
223  QString numSlices = QString::number(dims[2]);
224  QTableWidgetItem *tableItem = mTableWidget->item(mTableWidget->rowCount()-1, mNumSlicesColoumn);
225  tableItem->setText(numSlices);
226 }
227 
228 
229 void ImportDataTypeWidget::updateTableWithSliceSpacing(ImagePtr image)
230 {
231  double spacing = image->getSpacing()[2];
232  QString spacingText;
233  spacingText.setNum(spacing, 'g', 2);
234  mTableWidget->setItem(mTableWidget->rowCount()-1, mSliceSpacingColoumn, new QTableWidgetItem(spacingText+" mm"));
235 }
236 
237 void ImportDataTypeWidget::tableItemSelected(int currentRow, int currentColumn, int previousRow, int previousColumn)
238 {
239  mStackedWidgetImageParameters->setCurrentIndex(currentRow);
240 }
241 
242 void ImportDataTypeWidget::removeRowFromTableAndDataFromImportList()
243 {
244  QPushButton *button = qobject_cast<QPushButton*>(QObject::sender());
245  int rowindex = this->findRowIndexContainingButton(button, mTableWidget);
246  QString fullfilename = mTableWidget->item(rowindex, mFilenameColoumn)->text();
247  if(rowindex != -1)
248  mTableWidget->removeRow(rowindex);
249 
250  for (std::vector<DataPtr>::iterator it = mData.begin(); it != mData.end();)
251  {
252  if((*it)->getName() == fullfilename)
253  mData.erase(it);
254  else
255  ++ it;
256  }
257 
258  QWidget *widgetToRemove = mStackedWidgetImageParameters->widget(rowindex);
259  mStackedWidgetImageParameters->removeWidget(widgetToRemove);
260 }
261 
262 void ImportDataTypeWidget::updateImageType()
263 {
264  // Test code: Trying to use convertToImageSubType on file name to find correct subtype.
265  IMAGE_SUBTYPE imageSubType = convertToImageSubType(mFilename);
266  mImageTypeAdapter->setValue(enum2string(imageSubType));
267 }
268 
269 std::map<QString, QString> ImportDataTypeWidget::getParentCandidateList()
270 {
271  std::map<QString, QString> parentCandidates;
272  for(unsigned i=0; i<mParentCandidates.size(); ++i)
273  {
274  parentCandidates[mParentCandidates[i]->getName()] = mParentCandidates[i]->getUid();
275  }
276 
277  return parentCandidates;
278 }
279 
280 void ImportDataTypeWidget::updateSpaceComboBox(QComboBox *box, QString pointMetricGroupId)
281 {
282  box->clear();
283  std::map<QString, QString> parentCandidates = this->getParentCandidateList();
284  std::map<QString, QString>::iterator it;
285  for(it= parentCandidates.begin(); it != parentCandidates.end(); ++it)
286  {
287  QVariant id(it->second);
288  box->addItem(it->first, id);
289  }
290  std::vector<DataPtr> pointMetricGroup = mPointMetricGroups[pointMetricGroupId];
291  QString currentSpace = pointMetricGroup[0]->getSpace();
292  box->setCurrentText(currentSpace);
293 }
294 
295 void ImportDataTypeWidget::updateParentCandidatesComboBox()
296 {
297  //remember selection
298  QString selectedParentId = (mParentCandidatesCB->itemData(mParentCandidatesCB->currentIndex()).toString());
299 
300  mParentCandidatesCB->clear();
301  std::map<QString, QString> parentCandidates = this->getParentCandidateList();
302  std::map<QString, QString>::iterator it;
303  QVariant emptyId("");
304  mParentCandidatesCB->addItem("", emptyId);
305  int selectedIndex = 0;
306  for(it= parentCandidates.begin(); it != parentCandidates.end(); ++it)
307  {
308  QString idString = it->second;
309  QVariant id(idString);
310  mParentCandidatesCB->addItem(it->first, id);
311  if(selectedParentId.compare(idString, Qt::CaseInsensitive) == 0)
312  selectedIndex = mParentCandidatesCB->count()-1;
313  }
314 
315  if(selectedIndex != 0)
316  mParentCandidatesCB->setCurrentIndex(selectedIndex);
317  else
318  {
319  //TODO parent guess:
320  QString parentGuess = this->getInitialGuessForParentFrame();
321  //CX_LOG_DEBUG() << "ParentGuess: " << parentGuess;
322  mParentCandidatesCB->setCurrentText(parentGuess);
323  }
324 
325 
326 }
327 
328 void ImportDataTypeWidget::importAllData()
329 {
330  for(unsigned i=0; i<mData.size(); ++i)
331  {
332  if(mData[i])
333  {
334  QString parentId = (mParentCandidatesCB->itemData(mParentCandidatesCB->currentIndex()).toString());
335  mData[i]->get_rMd_History()->setParentSpace(parentId);
336 
337  mServices->patient()->insertData(mData[i]);
338  mServices->view()->autoShowData(mData[i]);
339  }
340  }
341 }
342 
343 void ImportDataTypeWidget::applyParentTransformImport()
344 {
345  CX_LOG_DEBUG() << "applyParentTransformImport()";
346 
347  QString parentId = (mParentCandidatesCB->itemData(mParentCandidatesCB->currentIndex()).toString());
348  DataPtr parent = mServices->patient()->getData(parentId);
349 
350  if(!parent)
351  {
352  CX_LOG_ERROR() << "Could not find parent data with uid: " << parentId;
353  return;
354  }
355 
356  std::vector<DataPtr>::iterator it = mData.begin();
357  for(;it!=mData.end(); ++it)
358  {
359  DataPtr data = (*it);
360  data->get_rMd_History()->setRegistration(parent->get_rMd());
361  report("Assigned rMd from data [" + parent->getName() + "] to data [" + data->getName() + "]");
362  }
363 
364  /*
365  if (!mTransformFromParentFrameCheckBox->isChecked())
366  return;
367  if(!mData)
368  return;
369  DataPtr parent = mPatientModelService->getData(mData->getParentSpace());
370  if (!parent)
371  return;
372  mData->get_rMd_History()->setRegistration(parent->get_rMd());
373  report("Assigned rMd from data [" + parent->getName() + "] to data [" + mData->getName() + "]");
374  */
375 }
376 
377 void ImportDataTypeWidget::applyConversionLPS()
378 {
379  CX_LOG_DEBUG() << "applyConversionLPS()";
380 
381  std::vector<DataPtr>::iterator it = mData.begin();
382  for(;it!=mData.end(); ++it)
383  {
384  DataPtr data = (*it);
385  Transform3D sMd = data->get_rMd();
387  Transform3D rMd = sMr.inv() * sMd;
388  data->get_rMd_History()->setRegistration(rMd);
389  report("Nifti import: Converted data " + data->getName() + " from LPS to RAS coordinates.");
390  }
391 
392  /*
393  if (!mNiftiFormatCheckBox->isChecked())
394  return;
395  if(!mData)
396  return;
397  Transform3D sMd = mData->get_rMd();
398  Transform3D sMr = createTransformFromReferenceToExternal(pcsRAS);
399  // rMd = createTransformRotateZ(M_PI) * rMd;
400  Transform3D rMd = sMr.inv() * sMd;
401  mData->get_rMd_History()->setRegistration(rMd);
402  report("Nifti import: Converted data " + mData->getName() + " from LPS to RAS coordinates.");
403  */
404 
405 }
406 
407 void ImportDataTypeWidget::applyConversionToUnsigned()
408 {
409  CX_LOG_DEBUG() << "applyConversionToUnsigned()";
410 
411  std::vector<DataPtr>::iterator it = mData.begin();
412  for(;it!=mData.end(); ++it)
413  {
414  DataPtr data = (*it);
415 
416  ImagePtr image = boost::dynamic_pointer_cast<Image>(data);
417  if (!image)
418  return;
419 
420  ImagePtr converted = convertImageToUnsigned(mServices->patient(), image);
421 
422  image->setVtkImageData(converted->getBaseVtkImageData());
423 
424  ImageTF3DPtr TF3D = converted->getTransferFunctions3D()->createCopy();
425  ImageLUT2DPtr LUT2D = converted->getLookupTable2D()->createCopy();
426  image->setLookupTable2D(LUT2D);
427  image->setTransferFunctions3D(TF3D);
428  //mServices->patient()->insertData(image);
429 
430  DataPtr convertedData = boost::dynamic_pointer_cast<Data>(image);
431  (*it) = convertedData;
432  }
433 
434  /*
435  if (!mConvertToUnsignedCheckBox->isChecked())
436  return;
437 
438  ImagePtr image = boost::dynamic_pointer_cast<Image>(mData);
439  if (!image)
440  return;
441 
442  ImagePtr converted = convertImageToUnsigned(mPatientModelService, image);
443 
444  image->setVtkImageData(converted->getBaseVtkImageData());
445 
446  ImageTF3DPtr TF3D = converted->getTransferFunctions3D()->createCopy();
447  ImageLUT2DPtr LUT2D = converted->getLookupTable2D()->createCopy();
448  image->setLookupTable2D(LUT2D);
449  image->setTransferFunctions3D(TF3D);
450  mPatientModelService->insertData(image);
451  */
452 }
453 
455 {
456  this->updateParentCandidatesComboBox();
457 
458  std::map<QString, QComboBox *>::iterator it;
459  for(it=mSpaceCBs.begin(); it != mSpaceCBs.end(); ++it)
460  {
461  QString id = it->first;
462  QComboBox *box = it->second;
463  this->updateSpaceComboBox(box,id);
464  }
465 }
466 
468 {
469  if(mShouldConvertDataToUnsigned->isChecked())
470  this->applyConversionToUnsigned();
471 
472  this->importAllData();
473 
474  if(mShouldImportParentTransform->currentText() == "Yes")
475  this->applyParentTransformImport();
476  if(mAnatomicalCoordinateSystems->currentText() != "LPS")
477  this->applyConversionLPS();
478 }
479 
480 void ImportDataTypeWidget::showEvent(QShowEvent *event)
481 {
482  BaseWidget::showEvent(event);
483  this->update();
484 }
485 
486 void ImportDataTypeWidget::pointMetricGroupSpaceChanged(int index)
487 {
488  QComboBox *box = qobject_cast<QComboBox*>(QObject::sender());
489  QString newSpace = box->currentData().toString();
490 
491  QString pointMetricsGroupId;
492  std::map<QString, QComboBox *>::iterator it;
493  for(it = mSpaceCBs.begin(); it != mSpaceCBs.end(); ++it)
494  {
495  if(it->second == box)
496  pointMetricsGroupId = it->first;
497  }
498  std::vector<DataPtr> pointMetricGroup = mPointMetricGroups[pointMetricsGroupId];
499  for(unsigned i=0; i<pointMetricGroup.size(); ++i)
500  {
501  CoordinateSystem cs(csDATA, newSpace);
502  boost::dynamic_pointer_cast<PointMetric>(pointMetricGroup[i])->setSpace(cs);
503  }
504 }
505 
506 QString ImportDataTypeWidget::getInitialGuessForParentFrame()
507 {
508  int candidateScore = 0;
509  QString bestCandidate;
510 
511  for(unsigned i=0; i < mData.size(); ++i)
512  {
513  DataPtr data = mData[i];
514  std::map<QString, QString> parentCandidates = this->getParentCandidateList();
515 
516  std::map<QString, QString>::iterator iter;
517  for(iter= parentCandidates.begin(); iter != parentCandidates.end(); ++iter)
518  {
519  int similarity = similatiryMeasure(data->getUid(), iter->second);
520  if(similarity > candidateScore && !isSegmentation(iter->second))
521  {
522  candidateScore = similarity;
523  bestCandidate = iter->first;
524  }
525  }
526  }
527 
528  return bestCandidate;
529 }
530 
531 int ImportDataTypeWidget::similatiryMeasure(QString current, QString candidate)
532 {
533  QStringList currentList = splitStringIntoSeparateParts(current);
534  QStringList candidateList = splitStringIntoSeparateParts(candidate);
535  return countEqualListElements(currentList, candidateList);
536 }
537 
538 QStringList ImportDataTypeWidget::splitStringIntoSeparateParts(QString current)
539 {
540  current = removeParenthesis(current);
541 
542  QStringList list = current.split(".", QString::SkipEmptyParts);
543  QStringList list2;
544  for (int i = 0; i < list.size(); ++i)
545  {
546  list2 << list[i].split("_", QString::SkipEmptyParts);
547  }
548  QStringList currentParts;
549  for (int i = 0; i < list2.size(); ++i)
550  {
551  currentParts << list2[i].split("-", QString::SkipEmptyParts);
552  }
553  return currentParts;
554 }
555 
556 QString ImportDataTypeWidget::removeParenthesis(QString current)
557 {
558  int startParenthesis;
559  do
560  {
561  startParenthesis = current.indexOf("{");
562  int endParenthesis = current.indexOf("}");
563  current.replace(startParenthesis, endParenthesis-startParenthesis+1, "");
564  } while (startParenthesis != -1);
565  return current;
566 }
567 
568 int ImportDataTypeWidget::countEqualListElements(QStringList first, QStringList second)
569 {
570  int retval = 0;
571  int numComparedElements = 0;
572  for (int i = 0; i < first.size(); ++i)
573  {
574  if(excludeElement(first[i]))
575  continue;
576  ++numComparedElements;
577  for (int j = 0; j < second.size(); ++j)
578  {
579  if(first[i].compare(second[j]) == 0)
580  {
581  ++retval;
582  break;//Don't count repeating elements
583  }
584  }
585  }
586 
587  if (retval == numComparedElements)
588  return 0;//Don't match equal list
589  return retval;
590 }
591 
592 bool ImportDataTypeWidget::excludeElement(QString element)
593 {
594  if (isSegmentation(element))
595  return true;
596  return false;
597 }
598 
599 void ImportDataTypeWidget::addPointMetricGroupsToTable()
600 {
601  QString type, name;
602  int groupnr = 0;
603  std::map<QString, std::vector<DataPtr> >::iterator it = mPointMetricGroups.begin();
604  for(; it != mPointMetricGroups.end(); ++it)
605  {
606  groupnr +=1;
607 
608  QString space = it->first;
609  std::vector<DataPtr> datas = it->second;
610  DataPtr data = datas[0];
611  if(datas.empty() || !data)
612  {
613  continue;
614  }
615 
616  QComboBox *spaceCB = new QComboBox();
617  mSpaceCBs[space] = spaceCB;
618  connect(spaceCB, SIGNAL(currentIndexChanged(int)), this, SLOT(pointMetricGroupSpaceChanged(int)));
619  this->updateSpaceComboBox(spaceCB, space);
620 
621  type = data->getType();
622  name = "Point metric group "+QString::number(groupnr);
623 
624  int newRowIndex = mTableWidget->rowCount();
625  mTableWidget->setRowCount(newRowIndex+1);
626  mTableWidget->setItem(newRowIndex, mNumSlicesColoumn, new QTableWidgetItem(QString::number(datas.size())));
627  mTableWidget->setItem(newRowIndex, mFilenameColoumn, new QTableWidgetItem(name));
628  mTableWidget->setItem(newRowIndex, mTypeColoumn, new QTableWidgetItem(type));
629  mTableWidget->setCellWidget(newRowIndex, mSpaceColoumn, spaceCB);
630  }
631 }
632 
633 bool ImportDataTypeWidget::isInputFileInNiftiFormat()
634 {
635  if(mFilename.endsWith(".nii", Qt::CaseInsensitive))
636  return true;
637  return false;
638 }
639 
640 bool ImportDataTypeWidget::isSegmentation(QString filename)
641 {
642  if(filename.contains("label", Qt::CaseInsensitive))
643  return true;
644  if(filename.contains("seg", Qt::CaseInsensitive))
645  return true;
646  return false;
647 }
648 
650 {
651  QTableWidget* simpleTableWidget = new QTableWidget();
652  simpleTableWidget->setRowCount(0);
653  simpleTableWidget->setColumnCount(4);
654  QStringList tableHeader;
655  tableHeader<<"Series num"<<"Name"<<"Num slices"<<"Slice spacing";
656  simpleTableWidget->setHorizontalHeaderLabels(tableHeader);
657  simpleTableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
658  simpleTableWidget->verticalHeader()->setVisible(false);
659  simpleTableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
660  simpleTableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
661  simpleTableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
662  simpleTableWidget->setShowGrid(true);
663  simpleTableWidget->setStyleSheet("QTableView {selection-background-color: #ACCEF7;}");
664  simpleTableWidget->setGeometry(QApplication::desktop()->screenGeometry());
665 
666 
667  simpleTableWidget->setRowCount(mTableWidget->rowCount());
668  for(int i = 0; i < mTableWidget->rowCount(); ++i)
669  {
670  simpleTableWidget->setItem(i, 0, new QTableWidgetItem(mTableWidget->item(i, mSeriesNumColumn)->text()));
671  simpleTableWidget->setItem(i, 1, new QTableWidgetItem(mTableWidget->item(i, mFilenameColoumn)->text()));
672  simpleTableWidget->setItem(i, 2, new QTableWidgetItem(mTableWidget->item(i, mNumSlicesColoumn)->text()));
673  simpleTableWidget->setItem(i, 3, new QTableWidgetItem(mTableWidget->item(i, mSliceSpacingColoumn)->text()));
674  }
675  simpleTableWidget->setMinimumSize(getQTableWidgetSize(simpleTableWidget));
676 
677  return simpleTableWidget;
678 }
679 
680 }//cx
pcsRAS
Right-Anterior-Superior, used by Slicer3D, ITK-Snap, nifti, MINC.
static QSize getQTableWidgetSize(QTableWidget *t)
boost::shared_ptr< class VisServices > VisServicesPtr
Definition: cxMainWindow.h:40
imMR
Transform3D Transform3D
Transform3D is a representation of an affine 3D transform.
cxResource_EXPORT Transform3D createTransformFromReferenceToExternal(PATIENT_COORDINATE_SYSTEM external)
static StringPropertyDataModalityPtr New(PatientModelServicePtr patientModelService)
boost::shared_ptr< class Image > ImagePtr
Definition: cxDicomWidget.h:27
Composite widget for string selection.
csDATA
a datas space (d)
Definition: cxDefinitions.h:90
virtual void showEvent(QShowEvent *event)
ImagePtr convertImageToUnsigned(PatientModelServicePtr dataManager, ImagePtr image, vtkImageDataPtr suggestedConvertedVolume, bool verbose)
boost::shared_ptr< class Data > DataPtr
static StringPropertyImageTypePtr New(PatientModelServicePtr patientModelService)
static int findRowIndexContainingButton(QPushButton *button, QTableWidget *tableWidget)
boost::shared_ptr< class ImageLUT2D > ImageLUT2DPtr
ImportDataTypeWidget(ImportWidget *parent, VisServicesPtr services, std::vector< DataPtr > data, std::vector< DataPtr > &parentCandidates, QString filename)
#define CX_LOG_ERROR
Definition: cxLogger.h:99
A volumetric data set.
Definition: cxImage.h:45
IMAGE_SUBTYPE convertToImageSubType(QString imageTypeSubString)
Identification of a Coordinate system.
Data class that represents a single point.
Definition: cxPointMetric.h:42
void parentCandidatesUpdated()
Interface for QWidget which handles widgets uniformly for the system.
Definition: cxBaseWidget.h:88
#define CX_LOG_DEBUG
Definition: cxLogger.h:95
Superclass for all data objects.
Definition: cxData.h:89
void report(QString msg)
Definition: cxLogger.cpp:69
#define CX_LOG_WARNING
Definition: cxLogger.h:98
static QString getTypeName()
Definition: cxPointMetric.h:58
QString enum2string(const ENUM &val)
boost::shared_ptr< class ImageTF3D > ImageTF3DPtr
Namespace for all CustusX production code.