00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "mitkPointSetWriter.h"
00020 #include <iostream>
00021 #include <fstream>
00022 #include <locale>
00023
00024
00025
00026
00027
00028
00029 const char* mitk::PointSetWriter::XML_POINT_SET_FILE = "point_set_file" ;
00030
00031 const char* mitk::PointSetWriter::XML_FILE_VERSION = "file_version" ;
00032
00033 const char* mitk::PointSetWriter::XML_POINT_SET = "point_set" ;
00034
00035 const char* mitk::PointSetWriter::XML_TIME_SERIES = "time_series";
00036
00037 const char* mitk::PointSetWriter::XML_TIME_SERIES_ID = "time_series_id";
00038
00039 const char* mitk::PointSetWriter::XML_POINT = "point" ;
00040
00041 const char* mitk::PointSetWriter::XML_ID = "id" ;
00042
00043 const char* mitk::PointSetWriter::XML_SPEC = "specification" ;
00044
00045 const char* mitk::PointSetWriter::XML_X = "x" ;
00046
00047 const char* mitk::PointSetWriter::XML_Y = "y" ;
00048
00049 const char* mitk::PointSetWriter::XML_Z = "z" ;
00050
00051 const char* mitk::PointSetWriter::VERSION_STRING = "0.1" ;
00052
00053
00054
00055
00056 mitk::PointSetWriter::PointSetWriter()
00057 : m_FileName(""), m_FilePrefix(""), m_FilePattern("")
00058 {
00059 this->SetNumberOfRequiredInputs( 1 );
00060 this->SetNumberOfOutputs( 1 );
00061 this->SetNthOutput( 0, mitk::PointSet::New().GetPointer() );
00062 m_Indent = 2;
00063 m_IndentDepth = 0;
00064 m_Success = false;
00065 }
00066
00067
00068
00069
00070 mitk::PointSetWriter::~PointSetWriter()
00071 {}
00072
00073
00074
00075
00076 void mitk::PointSetWriter::GenerateData()
00077 {
00078 m_Success = false;
00079 m_IndentDepth = 0;
00080
00081
00082
00083
00084 if ( m_FileName == "" )
00085 {
00086 itkWarningMacro( << "Sorry, filename has not been set!" );
00087 return ;
00088 }
00089 std::ofstream out( m_FileName.c_str() );
00090 if ( !out.good() )
00091 {
00092 itkExceptionMacro(<< "File " << m_FileName << " could not be opened!");
00093 itkWarningMacro( << "Sorry, file " << m_FileName << " could not be opened!" );
00094 out.close();
00095 return ;
00096 }
00097
00098 std::locale previousLocale(out.getloc());
00099 std::locale I("C");
00100 out.imbue(I);
00101
00102
00103
00104
00105 WriteXMLHeader( out );
00106 WriteStartElement( XML_POINT_SET_FILE, out );
00107 WriteStartElement( XML_FILE_VERSION, out );
00108 WriteCharacterData( VERSION_STRING, out );
00109 WriteEndElement( XML_FILE_VERSION, out, false );
00110
00111
00112
00113
00114
00115 for ( unsigned int i = 0 ; i < this->GetNumberOfInputs(); ++i )
00116 {
00117 InputType::Pointer pointSet = this->GetInput( i );
00118 assert( pointSet.IsNotNull() );
00119 WriteXML( pointSet.GetPointer(), out );
00120 }
00121
00122 WriteEndElement( XML_POINT_SET_FILE, out );
00123 out.imbue(previousLocale);
00124 if ( !out.good() )
00125 {
00126 out.close();
00127 throw std::ios_base::failure("Some error during point set writing.");
00128 }
00129
00130 out.close();
00131 m_Success = true;
00132 m_MimeType = "application/MITK.PointSet";
00133 }
00134
00135
00136
00137
00138 void mitk::PointSetWriter::WriteXML( mitk::PointSet* pointSet, std::ofstream& out )
00139 {
00140 WriteStartElement( XML_POINT_SET, out );
00141 mitk::PointSet::PointsContainer* pointsContainer = pointSet->GetPointSet()->GetPoints();
00142 mitk::PointSet::PointsContainer::Iterator it;
00143
00144 unsigned int timecount = pointSet->GetTimeSteps();
00145
00146 for(unsigned int i=0; i< timecount; i++)
00147 {
00148 WriteStartElement( XML_TIME_SERIES, out );
00149
00150 WriteStartElement( XML_TIME_SERIES_ID, out );
00151 WriteCharacterData( ConvertToString( i ).c_str() , out );
00152 WriteEndElement( XML_TIME_SERIES_ID, out, false );
00153
00154 for ( it = pointsContainer->Begin(); it != pointsContainer->End(); ++it )
00155 {
00156 WriteStartElement( XML_POINT, out );
00157
00158 WriteStartElement( XML_ID, out );
00159 WriteCharacterData( ConvertToString( it->Index() ).c_str() , out );
00160 WriteEndElement( XML_ID, out, false );
00161
00162 mitk::PointSet::PointType point = it->Value();
00163
00164 WriteStartElement( XML_SPEC, out );
00165 WriteCharacterData( ConvertToString( pointSet->GetSpecificationTypeInfo(it->Index(), i) ).c_str() , out );
00166 WriteEndElement( XML_SPEC, out, false );
00167
00168 WriteStartElement( XML_X, out );
00169 WriteCharacterData( ConvertToString( point[ 0 ] ).c_str(), out );
00170 WriteEndElement( XML_X, out, false );
00171
00172 WriteStartElement( XML_Y, out );
00173 WriteCharacterData( ConvertToString( point[ 1 ] ).c_str(), out );
00174 WriteEndElement( XML_Y, out, false );
00175
00176 WriteStartElement( XML_Z, out );
00177 WriteCharacterData( ConvertToString( point[ 2 ] ).c_str(), out );
00178 WriteEndElement( XML_Z, out, false );
00179
00180 WriteEndElement( XML_POINT, out );
00181 }
00182 WriteEndElement( XML_TIME_SERIES, out );
00183 }
00184
00185 WriteEndElement( XML_POINT_SET, out );
00186 }
00187
00188
00189
00190
00191
00192 void mitk::PointSetWriter::ResizeInputs( const unsigned int& num )
00193 {
00194 unsigned int prevNum = this->GetNumberOfInputs();
00195 this->SetNumberOfInputs( num );
00196 for ( unsigned int i = prevNum; i < num; ++i )
00197 {
00198 this->SetNthInput( i, mitk::PointSet::New().GetPointer() );
00199 }
00200 }
00201
00202
00203
00204
00205 void mitk::PointSetWriter::SetInput( InputType* pointSet )
00206 {
00207 this->ProcessObject::SetNthInput( 0, pointSet );
00208 }
00209
00210
00211
00212
00213 void mitk::PointSetWriter::SetInput( const unsigned int& id, InputType* pointSet )
00214 {
00215 if ( id >= this->GetNumberOfInputs() )
00216 this->ResizeInputs( id + 1 );
00217 this->ProcessObject::SetNthInput( id, pointSet );
00218 }
00219
00220
00221
00222 mitk::PointSet* mitk::PointSetWriter::GetInput()
00223 {
00224 if ( this->GetNumberOfInputs() < 1 )
00225 {
00226 return 0;
00227 }
00228 else
00229 {
00230 return dynamic_cast<InputType*> ( this->GetInput( 0 ) );
00231 }
00232 }
00233
00234
00235
00236
00237 mitk::PointSet* mitk::PointSetWriter::GetInput( const unsigned int& num )
00238 {
00239 return dynamic_cast<InputType*> ( this->ProcessObject::GetInput( num ) );
00240 }
00241
00242
00243
00244
00245
00246 template < typename T>
00247 std::string mitk::PointSetWriter::ConvertToString( T value )
00248 {
00249 std::ostringstream o;
00250 std::locale I("C");
00251 o.imbue(I);
00252
00253 if ( o << value )
00254 {
00255 return o.str();
00256 }
00257 else
00258 return "conversion error";
00259 }
00260
00261
00262
00263 void mitk::PointSetWriter::WriteXMLHeader( std::ofstream &file )
00264 {
00265 file << "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>";
00266 }
00267
00268
00269
00270
00271 void mitk::PointSetWriter::WriteStartElement( const char *const tag, std::ofstream &file )
00272 {
00273 file << std::endl;
00274 WriteIndent( file );
00275 file << '<' << tag << '>';
00276 m_IndentDepth++;
00277 }
00278
00279
00280
00281
00282 void mitk::PointSetWriter::WriteEndElement( const char *const tag, std::ofstream &file, const bool& indent )
00283 {
00284 m_IndentDepth--;
00285 if ( indent )
00286 {
00287 file << std::endl;
00288 WriteIndent( file );
00289 }
00290 file << '<' << '/' << tag << '>';
00291 }
00292
00293
00294
00295
00296 void mitk::PointSetWriter::WriteCharacterData( const char *const data, std::ofstream &file )
00297 {
00298 file << data;
00299 }
00300
00301
00302
00303
00304 void mitk::PointSetWriter::WriteStartElement( std::string &tag, std::ofstream &file )
00305 {
00306 WriteStartElement( tag.c_str(), file );
00307 }
00308
00309
00310
00311
00312 void mitk::PointSetWriter::WriteEndElement( std::string &tag, std::ofstream &file, const bool& indent )
00313 {
00314 WriteEndElement( tag.c_str(), file, indent );
00315 }
00316
00317
00318
00319
00320 void mitk::PointSetWriter::WriteCharacterData( std::string &data, std::ofstream &file )
00321 {
00322 WriteCharacterData( data.c_str(), file );
00323 }
00324
00325
00326
00327
00328 void mitk::PointSetWriter::WriteIndent( std::ofstream& file )
00329 {
00330 std::string spaces( m_IndentDepth * m_Indent, ' ' );
00331 file << spaces.c_str();
00332 }
00333
00334
00335
00336 bool mitk::PointSetWriter::GetSuccess() const
00337 {
00338 return m_Success;
00339 }
00340
00341
00342
00343 bool mitk::PointSetWriter::CanWriteDataType( DataNode* input )
00344 {
00345 if ( input )
00346 {
00347 mitk::BaseData* data = input->GetData();
00348 if ( data )
00349 {
00350 mitk::PointSet::Pointer pointSet = dynamic_cast<mitk::PointSet*>( data );
00351 if( pointSet.IsNotNull() )
00352 {
00353 //this writer has no "SetDefaultExtension()" - function
00354 m_Extension = ".mps";
00355 return true;
00356 }
00357 }
00358 }
00359 return false;
00360 }
00361
00362 void mitk::PointSetWriter::SetInput( DataNode* input )
00363 {
00364 if( input && CanWriteDataType( input ) )
00365 this->ProcessObject::SetNthInput( 0, dynamic_cast<mitk::PointSet*>( input->GetData() ) );
00366 }
00367
00368 std::string mitk::PointSetWriter::GetWritenMIMEType()
00369 {
00370 return m_MimeType;
00371 }
00372
00373 std::vector<std::string> mitk::PointSetWriter::GetPossibleFileExtensions()
00374 {
00375 std::vector<std::string> possibleFileExtensions;
00376 possibleFileExtensions.push_back(".mps");
00377 return possibleFileExtensions;
00378 }
00379
00380 std::string mitk::PointSetWriter::GetFileExtension()
00381 {
00382 return m_Extension;
00383 }