1 #include "vvLandmarks.h"
9 #include "vtkPolyData.h"
10 #include "vtkPoints.h"
11 #include "vtkFloatArray.h"
12 #include "vtkPointData.h"
13 #include "clitkCommon.h"
15 vvLandmarks::vvLandmarks(int size)
20 for (int i = 0; i < size; i++)
22 vtkPoints *points = vtkPoints::New();
23 mPoints.push_back(points);
25 mPolyData = vtkPolyData::New();
26 mIds = vtkFloatArray::New();
29 vvLandmarks::~vvLandmarks()
31 for (unsigned int i = 0; i < mPoints.size(); i++) {
34 /*for(unsigned int i = 0; i < mText.size(); i++) {
43 void vvLandmarks::AddLandmark(float x,float y,float z,float t,double value)
46 point.coordinates[0] = x;
47 point.coordinates[1] = y;
48 point.coordinates[2] = z;
49 point.coordinates[3] = t;
50 point.pixel_value=value;
51 mLandmarks.push_back(point);
52 mPoints[int(t)]->InsertNextPoint(x,y,z);
54 /*std::stringstream numberVal;
55 numberVal << (mLandmarks.size()-1);
56 vvLandmarksGlyph *number = vvLandmarksGlyph::New();
57 number->SetText(numberVal.str().c_str());
59 mText.push_back(number);*/
60 mIds->InsertNextTuple1(0.55);
61 //mIds->InsertTuple1(mLandmarks.size(),mLandmarks.size());
65 void vvLandmarks::RemoveLastLandmark()
67 mPoints[mLandmarks.back().coordinates[3]]->SetNumberOfPoints(
68 mPoints[mLandmarks.back().coordinates[3]]->GetNumberOfPoints()-1);
69 mPolyData->Modified();
71 mLandmarks.pop_back();
72 mIds->RemoveLastTuple();
75 void vvLandmarks::ChangeComments(int index, std::string comments)
77 mLandmarks[index].comments = comments;
80 double vvLandmarks::GetPixelValue(int index)
82 return mLandmarks[index].pixel_value;
85 float* vvLandmarks::GetCoordinates(int index)
87 return mLandmarks[index].coordinates;
90 std::string vvLandmarks::GetComments(int index)
92 return mLandmarks[index].comments;
95 void vvLandmarks::LoadFile(std::string filename)
97 std::ifstream fp(filename.c_str(), std::ios::in|std::ios::binary);
100 std::cerr <<"Unable to open file " << filename << std::endl;
103 mFilename = filename;
106 for (unsigned int i = 0; i < mPoints.size();i++)
107 mPoints[i]->SetNumberOfPoints(0);
108 bool first_line=true;
109 while (fp.getline(line,255))
111 std::string stringline = line;
115 ///New landmark format: first line is "LANDMARKSXX", where XX is the version number
116 if (stringline.size() >= 10 && stringline.compare(0,9,"LANDMARKS")==0)
118 std::istringstream ss(stringline.c_str()+9);
119 ss >> mFormatVersion;
120 continue; //skip first line
126 if (stringline.size() > 1)
129 int previousSpace = 0;
131 if (mFormatVersion>0)
133 space = stringline.find(" ", previousSpace+1);
134 if (space < -1 || space > (int)stringline.size())
136 ErrorMsg(mLandmarks.size(),"index");
139 //int index = atoi(stringline.substr(previousSpace,space - previousSpace).c_str());
140 previousSpace = space;
142 space = stringline.find(" ", previousSpace+1);
143 if (space < -1 || space > (int)stringline.size())
145 ErrorMsg(mLandmarks.size(),"x position");
148 point.coordinates[0] = atof(replace_dots(stringline.substr(previousSpace,space - previousSpace)).c_str());
149 previousSpace = space;
150 space = stringline.find(" ", previousSpace+1);
151 if (space < -1 || space > (int)stringline.size())
153 ErrorMsg(mLandmarks.size(),"y position");
156 point.coordinates[1] = atof(replace_dots(stringline.substr(previousSpace,space - previousSpace)).c_str());
157 previousSpace = space;
158 space = stringline.find(" ", previousSpace+1);
159 if (space < -1 || space > (int)stringline.size())
161 ErrorMsg(mLandmarks.size(),"z position");
164 point.coordinates[2] = atof(replace_dots(stringline.substr(previousSpace,space - previousSpace)).c_str());
165 previousSpace = space;
166 if (mFormatVersion>0)
168 space = stringline.find(" ", previousSpace+1);
169 if (space < -1 || space > (int)stringline.size())
171 ErrorMsg(mLandmarks.size(),"t position");
174 point.coordinates[3] = atof(replace_dots(stringline.substr(previousSpace,space - previousSpace)).c_str());
175 previousSpace = space;
176 space = stringline.find(" ", previousSpace+1);
177 if (space < -1 || space > (int)stringline.size())
179 ErrorMsg(mLandmarks.size(),"pixel value");
182 point.pixel_value = atof(replace_dots(stringline.substr(previousSpace,space - previousSpace)).c_str());
186 point.pixel_value=0.; //Not in file
187 point.coordinates[3]=0.;
189 previousSpace = space;
190 //this is the maximum size of comments
191 space = (stringline.find("\n", previousSpace+1) < 254 ? stringline.find("\n", previousSpace+1) : 254);
192 point.comments = stringline.substr(previousSpace,space - (previousSpace)).c_str();
193 mLandmarks.push_back(point);
194 mIds->InsertNextTuple1(0.55);
195 mPoints[int(point.coordinates[3])]->InsertNextPoint(
196 point.coordinates[0],point.coordinates[1],point.coordinates[2]);
202 bool vvLandmarks::ErrorMsg(int num,const char * text)
204 std::cerr << "error when loading point " << num << " at " << text << std::endl;
208 void vvLandmarks::SaveFile(std::string filename)
210 std::string fileContent = "LANDMARKS1\n"; //File format version identification
211 for (unsigned int i = 0; i < mLandmarks.size(); i++) {
212 std::stringstream out;
213 out.imbue(std::locale("C")); //This is to specify that the dot is to be used as the decimal separator
215 << mLandmarks[i].coordinates[0] << " "
216 << mLandmarks[i].coordinates[1] << " "
217 << mLandmarks[i].coordinates[2] << " "
218 << mLandmarks[i].coordinates[3] << " "
219 << mLandmarks[i].pixel_value << " ";
220 fileContent += out.str();
221 if (mLandmarks[i].comments.size() == 0)
224 fileContent += mLandmarks[i].comments;
227 std::ofstream fp(filename.c_str(), std::ios::trunc);
230 std::cerr << "Unable to open file" << std::endl;
233 fp << fileContent.c_str()<< std::endl;
237 void vvLandmarks::SetTime(int time)
239 if (time >= 0 && time <= ((int)mPoints.size() -1))
241 mPolyData->SetPoints(mPoints[time]);
242 mPolyData->GetPointData()->SetScalars(mIds);
243 mPolyData->Modified();
248 std::string vvLandmarks::replace_dots(std::string input)
250 ///Replaces the dots used in the file with the decimal separator in use on the platform
251 lconv * conv=localeconv();
252 unsigned int position = input.find( "." );
253 while ( position < input.size() )
255 input.replace(position, 1, conv->decimal_point);
256 position = input.find( ".", position + 1 );