17 #ifndef __itkTransformFileReader_cxx
18 #define __itkTransformFileReader_cxx
24 #include <itksys/ios/fstream>
25 #include <itksys/ios/sstream>
30 std::string
trim(std::string
const& source,
char const* delims =
" \t\r\n") {
31 std::string result(source);
32 std::string::size_type index = result.find_last_not_of(delims);
33 if(index != std::string::npos)
35 result.erase(++index);
38 index = result.find_first_not_of(delims);
39 if(index != std::string::npos)
41 result.erase(0, index);
70 in.open ( m_FileName.c_str(), std::ios::in | std::ios::binary );
74 itkExceptionMacro (
"The file could not be opened for read access "
75 << std::endl <<
"Filename: \"" << m_FileName <<
"\"" );
85 int size=
static_cast<int>(pbuf->pubseekoff (0,std::ios::end,std::ios::in));
86 pbuf->pubseekpos (0,std::ios::in);
89 char* buffer=
new char[size+1];
92 pbuf->sgetn (buffer,size);
94 itkDebugMacro (
"Read file transform Data" );
98 std::string data = InData.str();
102 vnl_vector<double> VectorBuffer;
103 std::string::size_type position = 0;
107 TmpParameterArray.clear();
108 TmpFixedParameterArray.clear();
109 bool haveFixedParameters =
false;
110 bool haveParameters =
false;
114 std::string line_end(
"\n");
115 if(data.find(
'\n') == std::string::npos)
117 if(data.find(
'\r') == std::string::npos)
119 itkExceptionMacro (
"No line ending character found, not a valid ITK Transform TXT file" );
123 while ( position < data.size() )
126 std::string::size_type end = data.find ( line_end, position );
127 std::string line =
trim ( data.substr ( position, end - position ) );
129 itkDebugMacro (
"Found line: \"" << line <<
"\"" );
131 if ( line.length() == 0 )
135 if ( line[0] ==
'#' || std::string::npos == line.find_first_not_of (
" \t" ) )
142 end = line.find (
":" );
143 if ( end == std::string::npos )
146 itkExceptionMacro (
"Tags must be delimited by :" );
148 std::string Name =
trim ( line.substr ( 0, end ) );
149 std::string Value =
trim ( line.substr ( end + 1, line.length() ) );
151 itkDebugMacro (
"Name: \"" << Name <<
"\"" );
152 itkDebugMacro (
"Value: \"" << Value <<
"\"" );
153 itksys_ios::istringstream parse ( Value );
154 VectorBuffer.clear();
155 if ( Name ==
"Transform" )
158 itkDebugMacro (
"About to call ObjectFactory" );
161 itkDebugMacro (
"After call ObjectFactory");
166 msg <<
"Could not create an instance of " << Value << std::endl
167 <<
"The usual cause of this error is not registering the "
168 <<
"transform with TransformFactory" << std::endl;
169 msg <<
"Currently registered Transforms: " << std::endl;
171 std::list<std::string>::iterator it;
172 for ( it = names.begin(); it != names.end(); it++ )
174 msg <<
"\t\"" << *it <<
"\"" << std::endl;
176 itkExceptionMacro ( << msg.str() );
180 m_TransformList.push_back ( transform );
182 else if ( Name ==
"Parameters" || Name ==
"FixedParameters" )
184 VectorBuffer.clear();
187 parse >> VectorBuffer;
188 itkDebugMacro (
"Parsed: " << VectorBuffer );
189 if ( Name ==
"Parameters" )
191 TmpParameterArray = VectorBuffer;
192 itkDebugMacro (
"Setting Parameters: " << TmpParameterArray );
193 if ( haveFixedParameters )
195 transform->SetFixedParameters ( TmpFixedParameterArray );
196 itkDebugMacro (
"Set Transform Fixed Parameters" );
197 transform->SetParametersByValue ( TmpParameterArray );
198 itkDebugMacro (
"Set Transform Parameters" );
199 TmpParameterArray.clear();
200 TmpFixedParameterArray.clear();
201 haveFixedParameters =
false;
202 haveParameters =
false;
206 haveParameters =
true;
209 else if ( Name ==
"FixedParameters" )
211 TmpFixedParameterArray = VectorBuffer;
212 itkDebugMacro (
"Setting Fixed Parameters: " << TmpFixedParameterArray );
215 itkExceptionMacro (
"Please set the transform before parameters or fixed parameters" );
217 if ( haveParameters )
219 transform->SetFixedParameters ( TmpFixedParameterArray );
220 itkDebugMacro (
"Set Transform Fixed Parameters" );
221 transform->SetParametersByValue ( TmpParameterArray );
222 itkDebugMacro (
"Set Transform Parameters" );
223 TmpParameterArray.clear();
224 TmpFixedParameterArray.clear();
225 haveFixedParameters =
false;
226 haveParameters =
false;
230 haveFixedParameters =
true;