1 /*=========================================================================
2 Program: vv http://www.creatis.insa-lyon.fr/rio/vv
5 - University of LYON http://www.universite-lyon.fr/
6 - Léon Bérard cancer center http://www.centreleonberard.fr
7 - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr
9 This software is distributed WITHOUT ANY WARRANTY; without even
10 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11 PURPOSE. See the copyright notices for more information.
13 It is distributed under dual licence
15 - BSD See included LICENSE.txt file
16 - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ===========================================================================**/
21 #include "vtkVOXImageWriter.h"
23 #include "vtkCommand.h"
24 #include "vtkErrorCode.h"
25 #include "vtkImageData.h"
26 #include "vtkInformation.h"
27 #include "vtkInformationVector.h"
28 #include "vtkObjectFactory.h"
29 #include "vtkStreamingDemandDrivenPipeline.h"
30 #include "vtkDataSetAttributes.h"
31 #include <vtkVersion.h>
32 #include <vtkAlgorithm.h>
36 //----------------------------------------------------------------------------
37 vtkStandardNewMacro(vtkVOXImageWriter);
39 //----------------------------------------------------------------------------
40 vtkVOXImageWriter::vtkVOXImageWriter()
43 this->FileLowerLeft = 1;
46 //----------------------------------------------------------------------------
47 vtkVOXImageWriter::~vtkVOXImageWriter()
53 //----------------------------------------------------------------------------
54 void vtkVOXImageWriter::Write( )
56 this->SetErrorCode(vtkErrorCode::NoError);
57 #if VTK_MAJOR_VERSION <= 5
58 this->GetInput()->UpdateInformation();
60 this->UpdateInformation();
63 if (this->GetInput() == NULL ) {
64 vtkErrorMacro(<<"Write:Please specify an input!");
68 if ( this->FileName == 0) {
69 vtkErrorMacro("Output file name not specified");
74 #if VTK_MAJOR_VERSION <= 5
75 int * ext = this->GetInput()->GetWholeExtent();
77 int * ext = this->GetInformation()->Get(vtkDataObject::DATA_EXTENT());
79 if ( ext[4] == ext[5] ) {
81 if ( ext[2] == ext[3] ) {
86 double * origin = this->GetInput()->GetOrigin();
87 double * spacingDouble = this->GetInput()->GetSpacing();
90 spacing[0] = spacingDouble[0];
91 spacing[1] = spacingDouble[1];
92 spacing[2] = spacingDouble[2];
95 dimSize[0] = ext[1]-ext[0]+1;
96 dimSize[1] = ext[3]-ext[2]+1;
97 dimSize[2] = ext[5]-ext[4]+1;
99 std::string elementType;
101 int scalarType = this->GetInput()->GetScalarType();
102 switch ( scalarType ) {
104 elementType = "schar";
106 case VTK_UNSIGNED_CHAR:
107 elementType = "uchar";
110 elementType = "sshort";
112 case VTK_UNSIGNED_SHORT:
113 elementType = "ushort";
118 case VTK_UNSIGNED_INT:
119 elementType = "uint";
122 elementType = "slong";
124 case VTK_UNSIGNED_LONG:
125 elementType = "ulong";
128 elementType = "float";
131 elementType = "double";
134 vtkErrorMacro("Unknown scalar type." );
138 origin[0] += ext[0] * spacing[0];
139 origin[1] += ext[2] * spacing[1];
140 origin[2] += ext[4] * spacing[2];
142 #if VTK_MAJOR_VERSION <= 5
143 this->GetInput()->SetUpdateExtent(ext[0], ext[1],
146 this->GetInput()->UpdateData();
148 this->SetUpdateExtent(ext);
151 this->SetFileDimensionality(nDims);
153 this->InvokeEvent(vtkCommand::StartEvent);
154 this->UpdateProgress(0.0);
156 std::cout << "Writing to file " << this->GetFileName() << " ..." << std::endl;
158 fstream out(this->GetFileName(),ios::out|ios::binary);
159 out << "VOX v2\n# Size\n" << dimSize[0] << " " << dimSize[1] << " "
160 << dimSize[2] << std::endl << "# Spacing" << std::endl
161 << spacing[0] << " " << spacing[1] << " " << spacing[2] << std::endl
162 << "# Image dim" << std::endl << nDims << std::endl
163 << "# Image type" << std::endl << elementType << std::endl;
164 out.write((char*)this->GetInput()->GetScalarPointer(),
165 dimSize[0]*dimSize[1]*dimSize[2]*this->GetInput()->GetScalarSize());
168 this->UpdateProgress(1.0);
169 this->InvokeEvent(vtkCommand::EndEvent);
172 //----------------------------------------------------------------------------
173 void vtkVOXImageWriter::PrintSelf(ostream& os, vtkIndent indent)
175 this->Superclass::PrintSelf(os,indent);
176 os << indent << "FileName: " << (this->FileName==0?this->FileName:"(none)") << endl;