]> Creatis software - clitk.git/blob - vv/vtkVOXImageWriter.cxx
added the new headers
[clitk.git] / vv / vtkVOXImageWriter.cxx
1 /*=========================================================================
2   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
3
4   Authors belong to: 
5   - University of LYON              http://www.universite-lyon.fr/
6   - Léon Bérard cancer center       http://oncora1.lyon.fnclcc.fr
7   - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
8
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.
12
13   It is distributed under dual licence
14
15   - BSD        See included LICENSE.txt file
16   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ======================================================================-====*/
18 #include <string>
19 #include <fstream>
20
21 #include "vtkVOXImageWriter.h"
22
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
32 #include <vtkstd/string>
33
34 #include <sys/stat.h>
35
36 //----------------------------------------------------------------------------
37 vtkCxxRevisionMacro(vtkVOXImageWriter, "DummyRevision");
38 vtkStandardNewMacro(vtkVOXImageWriter);
39
40 //----------------------------------------------------------------------------
41 vtkVOXImageWriter::vtkVOXImageWriter()
42 {
43     this->FileName = 0;
44     this->FileLowerLeft = 1;
45 }
46
47 //----------------------------------------------------------------------------
48 vtkVOXImageWriter::~vtkVOXImageWriter()
49 {
50     this->SetFileName(0);
51 }
52
53
54 //----------------------------------------------------------------------------
55 void vtkVOXImageWriter::Write( )
56 {
57     this->SetErrorCode(vtkErrorCode::NoError);
58
59     this->GetInput()->UpdateInformation();
60
61     // Error checking
62     if (this->GetInput() == NULL )
63     {
64         vtkErrorMacro(<<"Write:Please specify an input!");
65         return;
66     }
67
68     if ( this->FileName == 0)
69     {
70         vtkErrorMacro("Output file name not specified");
71         return;
72     }
73
74     int nDims = 3;
75     int * ext = this->GetInput()->GetWholeExtent();
76     if ( ext[4] == ext[5] )
77     {
78         nDims = 2;
79         if ( ext[2] == ext[3] )
80         {
81             nDims = 1;
82         }
83     }
84
85     double * origin = this->GetInput()->GetOrigin();
86     double * spacingDouble = this->GetInput()->GetSpacing();
87
88     float spacing[3];
89     spacing[0] = spacingDouble[0];
90     spacing[1] = spacingDouble[1];
91     spacing[2] = spacingDouble[2];
92
93     int dimSize[3];
94     dimSize[0] = ext[1]-ext[0]+1;
95     dimSize[1] = ext[3]-ext[2]+1;
96     dimSize[2] = ext[5]-ext[4]+1;
97
98     std::string elementType;
99
100     int scalarType = this->GetInput()->GetScalarType();
101     switch ( scalarType )
102     {
103     case VTK_CHAR:
104         elementType = "schar";
105         break;
106     case VTK_UNSIGNED_CHAR:
107         elementType = "uchar";
108         break;
109     case VTK_SHORT:
110         elementType = "sshort";
111         break;
112     case VTK_UNSIGNED_SHORT:
113         elementType = "ushort";
114         break;
115     case VTK_INT:
116         elementType = "int";
117         break;
118     case VTK_UNSIGNED_INT:
119         elementType = "uint";
120         break;
121     case VTK_LONG:
122         elementType = "slong";
123         break;
124     case VTK_UNSIGNED_LONG:
125         elementType = "ulong";
126         break;
127     case VTK_FLOAT:
128         elementType = "float";
129         break;
130     case VTK_DOUBLE:
131         elementType = "double";
132         break;
133     default:
134         vtkErrorMacro("Unknown scalar type." );
135         return ;
136     }
137
138     origin[0] += ext[0] * spacing[0];
139     origin[1] += ext[2] * spacing[1];
140     origin[2] += ext[4] * spacing[2];
141
142     this->GetInput()->SetUpdateExtent(ext[0], ext[1],
143                                       ext[2], ext[3],
144                                       ext[4], ext[5]);
145     this->GetInput()->UpdateData();
146
147
148     this->SetFileDimensionality(nDims);
149
150     this->InvokeEvent(vtkCommand::StartEvent);
151     this->UpdateProgress(0.0);
152     //write here
153     std::cout << "Writing to file " << this->GetFileName() << " ..." << std::endl;
154     std::cout.flush();
155     fstream out(this->GetFileName(),ios::out|ios::binary);
156     out << "VOX v2\n# Size\n" << dimSize[0] << " " << dimSize[1] << " "
157     << dimSize[2] << std::endl << "# Spacing" << std::endl
158     << spacing[0] << " " << spacing[1] << " " << spacing[2] << std::endl
159     << "# Image dim" << std::endl << nDims << std::endl
160     << "# Image type" << std::endl << elementType << std::endl;
161     out.write((char*)this->GetInput()->GetScalarPointer(),
162               dimSize[0]*dimSize[1]*dimSize[2]*this->GetInput()->GetScalarSize());
163     out.close();
164
165     this->UpdateProgress(1.0);
166     this->InvokeEvent(vtkCommand::EndEvent);
167 }
168
169 //----------------------------------------------------------------------------
170 void vtkVOXImageWriter::PrintSelf(ostream& os, vtkIndent indent)
171 {
172     this->Superclass::PrintSelf(os,indent);
173     os << indent << "FileName: " << (this->FileName==0?this->FileName:"(none)") << endl;
174 }