Fraxinus  17.12
An IGT application
cxDataReaderWriter.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) 2008-2014, SINTEF Department of Medical Technology
5 All rights reserved.
6 
7 Redistribution and use in source and binary forms, with or without
8 modification, are permitted provided that the following conditions are met:
9 
10 1. Redistributions of source code must retain the above copyright notice,
11  this list of conditions and the following disclaimer.
12 
13 2. Redistributions in binary form must reproduce the above copyright notice,
14  this list of conditions and the following disclaimer in the documentation
15  and/or other materials provided with the distribution.
16 
17 3. Neither the name of the copyright holder nor the names of its contributors
18  may be used to endorse or promote products derived from this software
19  without specific prior written permission.
20 
21 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
25 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 =========================================================================*/
32 
33 
34 #include "cxDataReaderWriter.h"
35 
36 #include <sstream>
37 #include <vtkImageData.h>
38 #include <vtkMetaImageReader.h>
39 #include <vtkSmartPointer.h>
40 #include <vtkMetaImageWriter.h>
41 
42 #include <vtkPolyData.h>
43 #include <vtkPolyDataReader.h>
44 #include <vtkXMLPolyDataReader.h>
45 #include <vtkPolyDataWriter.h>
46 #include <vtkSTLReader.h>
47 #include <vtkImageChangeInformation.h>
48 #include "vtkMINCImageReader.h"
49 #include "vtkTransform.h"
50 #include "vtkCommand.h"
51 #include <vtkPNGReader.h>
52 #include <vtkNIFTIImageReader.h>
53 #include <vtkNIFTIImageHeader.h>
54 
55 #include <QtCore>
56 #include <QDomDocument>
57 #include <QFileInfo>
58 #include <QFile>
59 #include <QTextStream>
60 #include <QDir>
61 
62 #include "cxTransform3D.h"
64 #include "cxLogger.h"
65 #include "cxTypeConversions.h"
66 #include "cxUtilHelpers.h"
67 #include "cxVideoSource.h"
68 #include "cxCustomMetaImage.h"
69 #include "cxConfig.h"
70 
71 #include "cxImageLUT2D.h"
72 #include "cxImageTF3D.h"
73 #include "cxErrorObserver.h"
74 
75 
76 typedef vtkSmartPointer<class vtkPNGReader> vtkPNGReaderPtr;
77 
78 namespace cx
79 {
80 
81 //-----
83 {
84  vtkMetaImageReaderPtr reader = vtkMetaImageReaderPtr::New();
85  reader->SetFileName(cstring_cast(filename));
86  reader->ReleaseDataFlagOn();
87 
88  if (!ErrorObserver::checkedRead(reader, filename))
89  return vtkImageDataPtr();
90 
91  vtkImageChangeInformationPtr zeroer = vtkImageChangeInformationPtr::New();
92  zeroer->SetInputConnection(reader->GetOutputPort());
93  zeroer->SetOutputOrigin(0, 0, 0);
94  zeroer->Update();
95  return zeroer->GetOutput();
96 }
97 
98 bool MetaImageReader::readInto(DataPtr data, QString filename)
99 {
100  return this->readInto(boost::dynamic_pointer_cast<Image>(data), filename);
101 }
102 
103 bool MetaImageReader::readInto(ImagePtr image, QString filename)
104 {
105  if (!image)
106  return false;
107 
108  CustomMetaImagePtr customReader = CustomMetaImage::create(filename);
109  Transform3D rMd = customReader->readTransform();
110 
111  vtkImageDataPtr raw = this->loadVtkImageData(filename);
112  if(!raw)
113  return false;
114 
115  image->setVtkImageData(raw);
116  image->get_rMd_History()->setRegistration(rMd);
117  image->setModality(customReader->readModality());
118  image->setImageType(customReader->readImageType());
119 
120  bool ok1 = true;
121  bool ok2 = true;
122  double level = customReader->readKey("WindowLevel").toDouble(&ok1);
123  double window = customReader->readKey("WindowWidth").toDouble(&ok2);
124 
125  if (ok1 && ok2)
126  {
127  image->setInitialWindowLevel(window, level);
128  image->resetTransferFunctions();
129  }
130 
131  return true;
132 }
133 
134 //-----
135 DataPtr MetaImageReader::load(const QString& uid, const QString& filename)
136 {
137  ImagePtr image(new Image(uid, vtkImageDataPtr()));
138  this->readInto(image, filename);
139  return image;
140 }
141 
142 void MetaImageReader::saveImage(ImagePtr image, const QString& filename)
143 {
144  vtkMetaImageWriterPtr writer = vtkMetaImageWriterPtr::New();
145  writer->SetInputData(image->getBaseVtkImageData());
146  writer->SetFileDimensionality(3);
147  writer->SetFileName(cstring_cast(filename));
148  QDir().mkpath(QFileInfo(filename).path());
149 
150 // std::cout << "SAVING MHD COMPRESSED " << filename << std::endl;
151 // writer->SetCompression(true);
152  writer->SetCompression(false);
153 // writer->Update(); // caused writing of (null).0 files - not necessary
154  writer->Write();
155 
156  writer = 0;
157 
158  CustomMetaImagePtr customReader = CustomMetaImage::create(filename);
159  customReader->setTransform(image->get_rMd());
160  customReader->setModality(image->getModality());
161  customReader->setImageType(image->getImageType());
162  customReader->setKey("WindowLevel", qstring_cast(image->getInitialWindowLevel()));
163  customReader->setKey("WindowWidth", qstring_cast(image->getInitialWindowWidth()));
164  customReader->setKey("Creator", QString("CustusX_%1").arg(CustusX_VERSION_STRING));
165 }
166 
170 
172  DataReader()
173 {
174  sform_matrix = vtkMatrix4x4Ptr::New();
175 }
176 
177 bool NIfTIReader::readInto(ImagePtr image, QString path)
178 {
179  if (!image)
180  return false;
181 
182  vtkImageDataPtr raw = this->loadVtkImageData(path);
183  if(!raw)
184  return false;
185 
186  Transform3D rMd(sform_matrix);
187  image->setVtkImageData(raw);
188  image->get_rMd_History()->setRegistration(rMd);
189 
190  return true;
191 }
192 
193 bool NIfTIReader::readInto(DataPtr data, QString filename)
194 {
195  return this->readInto(boost::dynamic_pointer_cast<Image>(data), filename);
196 }
197 
198 DataPtr NIfTIReader::load(const QString &uid, const QString &filename)
199 {
200  ImagePtr image(new Image(uid, vtkImageDataPtr()));
201  this->readInto(image, filename);
202  return image;
203 }
204 
206 {
207  vtkNIFTIImageReaderPtr reader = vtkNIFTIImageReaderPtr::New();
208  reader->SetFileName(cstring_cast(filename));
209  reader->ReleaseDataFlagOn();
210  reader->Update();
211 
223  sform_matrix = reader->GetSFormMatrix();
224 
225  if (!ErrorObserver::checkedRead(reader, filename))
226  return vtkImageDataPtr();
227 
228  return reader->GetOutput();
229 }
230 
231 
235 
236 bool PNGImageReader::readInto(DataPtr data, QString filename)
237 {
238  return this->readInto(boost::dynamic_pointer_cast<Image>(data), filename);
239 }
240 
241 bool PNGImageReader::readInto(ImagePtr image, QString filename)
242 {
243  if (!image)
244  return false;
245  vtkImageDataPtr raw = this->loadVtkImageData(filename);
246  if(!raw)
247  return false;
248  image->setVtkImageData(raw);
249  return true;
250 }
251 
252 DataPtr PNGImageReader::load(const QString& uid, const QString& filename)
253 {
254  ImagePtr image(new Image(uid, vtkImageDataPtr()));
255  this->readInto(image, filename);
256  return image;
257 }
258 
260 {
261  vtkPNGReaderPtr pngReader = vtkPNGReaderPtr::New();
262  pngReader->SetFileName(filename.toStdString().c_str());
263  pngReader->Update();
264  return pngReader->GetOutput();
265 }
266 
270 
271 bool PolyDataMeshReader::readInto(DataPtr data, QString filename)
272 {
273  return this->readInto(boost::dynamic_pointer_cast<Mesh>(data), filename);
274 }
275 
276 bool PolyDataMeshReader::readInto(MeshPtr mesh, QString filename)
277 {
278  if (!mesh)
279  return false;
280  vtkPolyDataPtr raw = this->loadVtkPolyData(filename);
281  if(!raw)
282  return false;
283  mesh->setVtkPolyData(raw);
284  return true;
285 }
286 //-----
288 {
289  vtkPolyDataReaderPtr reader = vtkPolyDataReaderPtr::New();
290  reader->SetFileName(cstring_cast(fileName));
291 
292  if (!ErrorObserver::checkedRead(reader, fileName))
293  return vtkPolyDataPtr();
294 
295  vtkPolyDataPtr polyData = reader->GetOutput();
296  return polyData;
297 }
298 
299 DataPtr PolyDataMeshReader::load(const QString& uid, const QString& filename)
300 {
301  MeshPtr mesh(new Mesh(uid));
302  this->readInto(mesh, filename);
303  return mesh;
304 }
305 
309 
310 
311 bool XMLPolyDataMeshReader::readInto(DataPtr data, QString filename)
312 {
313  return this->readInto(boost::dynamic_pointer_cast<Mesh>(data), filename);
314 }
315 
316 bool XMLPolyDataMeshReader::readInto(MeshPtr mesh, QString filename)
317 {
318  if (!mesh)
319  return false;
320  vtkPolyDataPtr raw = this->loadVtkPolyData(filename);
321  if(!raw)
322  return false;
323  mesh->setVtkPolyData(raw);
324  return true;
325 }
326 //-----
328 {
329  vtkXMLPolyDataReaderPtr reader = vtkXMLPolyDataReaderPtr::New();
330  reader->SetFileName(cstring_cast(fileName));
331 
332  if (!ErrorObserver::checkedRead(reader, fileName))
333  return vtkPolyDataPtr();
334 
335  vtkPolyDataPtr polyData = reader->GetOutput();
336  return polyData;
337 }
338 
339 DataPtr XMLPolyDataMeshReader::load(const QString& uid, const QString& filename)
340 {
341  MeshPtr mesh(new Mesh(uid));
342  this->readInto(mesh, filename);
343  return mesh;
344 }
345 
349 
350 
351 bool StlMeshReader::readInto(DataPtr data, QString filename)
352 {
353  return this->readInto(boost::dynamic_pointer_cast<Mesh>(data), filename);
354 }
355 
356 bool StlMeshReader::readInto(MeshPtr mesh, QString filename)
357 {
358  if (!mesh)
359  return false;
360  vtkPolyDataPtr raw = this->loadVtkPolyData(filename);
361  if(!raw)
362  return false;
363  mesh->setVtkPolyData(raw);
364  return true;
365 }
366 
367 
369 {
370  vtkSTLReaderPtr reader = vtkSTLReaderPtr::New();
371  reader->SetFileName(cstring_cast(fileName));
372 
373  if (!ErrorObserver::checkedRead(reader, fileName))
374  return vtkPolyDataPtr();
375 
376  vtkPolyDataPtr polyData = reader->GetOutput();
377  return polyData;
378 }
379 
380 DataPtr StlMeshReader::load(const QString& uid, const QString& filename)
381 {
382  MeshPtr mesh(new Mesh(uid));
383  this->readInto(mesh, filename);
384  return mesh;
385 }
386 
390 
391 
393 {
394  mDataReaders.insert(DataReaderPtr(new MetaImageReader()));
395  mDataReaders.insert(DataReaderPtr(new NIfTIReader()));
396  mDataReaders.insert(DataReaderPtr(new PolyDataMeshReader()));
397  mDataReaders.insert(DataReaderPtr(new XMLPolyDataMeshReader()));
398  mDataReaders.insert(DataReaderPtr(new StlMeshReader()));
399  mDataReaders.insert(DataReaderPtr(new PNGImageReader()));
400 }
401 
402 DataReaderPtr DataReaderWriter::findReader(const QString& path, const QString& type)
403 {
404  for (DataReadersType::iterator iter = mDataReaders.begin(); iter != mDataReaders.end(); ++iter)
405  {
406  if ((*iter)->canLoad(type, path))
407  return *iter;
408  }
409  return DataReaderPtr();
410 }
411 
413 {
414  DataReaderPtr reader = this->findReader(filename);
415  if (reader)
416  return reader->loadVtkImageData(filename);
417  return vtkImageDataPtr();
418 }
419 
421 {
422  DataReaderPtr reader = this->findReader(filename);
423  if (reader)
424  return reader->loadVtkPolyData(filename);
425  return vtkPolyDataPtr();
426 }
427 
428 QString DataReaderWriter::findDataTypeFromFile(QString filename)
429 {
430  DataReaderPtr reader = this->findReader(filename);
431  if (reader)
432  return reader->canLoadDataType();
433  return "";
434 }
435 
436 void DataReaderWriter::readInto(DataPtr data, QString path)
437 {
438  DataReaderPtr reader = this->findReader(path, data->getType());
439  if (reader)
440  reader->readInto(data, path);
441 
442  if(data)
443  {
444  QFileInfo fileInfo(qstring_cast(path));
445  data->setName(changeExtension(fileInfo.fileName(), ""));
446  data->setFilename(path); // need path even when not set explicitly: nice for testing
447  }
448 
449 }
450 
451 
455 
456 
457 } // namespace cx
458 
459 
QString qstring_cast(const T &val)
A mesh data set.
Definition: cxMesh.h:66
virtual vtkPolyDataPtr loadVtkPolyData(QString filename)
QString findDataTypeFromFile(QString filename)
virtual DataPtr load(const QString &uid, const QString &filename)
virtual bool readInto(DataPtr data, QString path)
virtual bool readInto(DataPtr data, QString path)
Transform3D Transform3D
Transform3D is a representation of an affine 3D transform.
virtual vtkPolyDataPtr loadVtkPolyData(QString filename)
boost::shared_ptr< class Image > ImagePtr
Definition: cxDicomWidget.h:48
vtkSmartPointer< vtkImageChangeInformation > vtkImageChangeInformationPtr
Definition: cxImage.cpp:67
vtkSmartPointer< class vtkXMLPolyDataReader > vtkXMLPolyDataReaderPtr
cstring_cast_Placeholder cstring_cast(const T &val)
virtual vtkImageDataPtr loadVtkImageData(QString filename)
virtual bool readInto(DataPtr data, QString filename)
virtual DataPtr load(const QString &uid, const QString &filename)
boost::shared_ptr< DataReader > DataReaderPtr
vtkPolyDataPtr loadVtkPolyData(QString filename)
boost::shared_ptr< class Data > DataPtr
virtual DataPtr load(const QString &uid, const QString &filename)
vtkSmartPointer< class vtkMetaImageReader > vtkMetaImageReaderPtr
boost::shared_ptr< class CustomMetaImage > CustomMetaImagePtr
virtual DataPtr load(const QString &uid, const QString &filename)
virtual bool readInto(DataPtr data, QString path)
vtkSmartPointer< class vtkSTLReader > vtkSTLReaderPtr
A volumetric data set.
Definition: cxImage.h:66
virtual vtkPolyDataPtr loadVtkPolyData(QString filename)
vtkSmartPointer< class vtkPNGReader > vtkPNGReaderPtr
vtkSmartPointer< class vtkMetaImageWriter > vtkMetaImageWriterPtr
vtkSmartPointer< class vtkNIFTIImageReader > vtkNIFTIImageReaderPtr
void saveImage(ImagePtr image, const QString &filename)
virtual bool readInto(DataPtr data, QString path)
vtkSmartPointer< vtkPolyData > vtkPolyDataPtr
virtual DataPtr load(const QString &uid, const QString &filename)
virtual vtkImageDataPtr loadVtkImageData(QString filename)
QString changeExtension(QString name, QString ext)
void readInto(DataPtr data, QString path)
virtual vtkImageDataPtr loadVtkImageData(QString filename)
static bool checkedRead(vtkSmartPointer< vtkAlgorithm > reader, QString filename)
Reader for portable network graphics .png files.
Reader for .vtp files.
vtkSmartPointer< class vtkPolyDataReader > vtkPolyDataReaderPtr
Reader for .vtk files.
virtual bool readInto(DataPtr data, QString path)
boost::shared_ptr< class Mesh > MeshPtr
vtkSmartPointer< class vtkImageData > vtkImageDataPtr
Reader for metaheader .mhd files.
Reader for STL files.
vtkImageDataPtr loadVtkImageData(QString filename)
virtual vtkPolyDataPtr loadVtkPolyData(QString filename)
Interface for Data file readers.
static CustomMetaImagePtr create(QString filename)
Namespace for all CustusX production code.
virtual DataPtr load(const QString &uid, const QString &filename)