From: David Sarrut Date: Wed, 12 Dec 2012 07:13:32 +0000 (+0100) Subject: Merge branch 'master' of git.creatis.insa-lyon.fr:clitk X-Git-Tag: v1.4.0~273 X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=commitdiff_plain;h=938771d6a7ece6b97623fef4fb15beff256497da;hp=d4e9056274c04872a251d312704dcb02531792bf;p=clitk.git Merge branch 'master' of git.creatis.insa-lyon.fr:clitk --- diff --git a/vv/vv.cxx b/vv/vv.cxx index 47057e4..7e7e18e 100644 --- a/vv/vv.cxx +++ b/vv/vv.cxx @@ -45,7 +45,7 @@ #include #include -typedef enum {O_BASE,O_OVERLAY,O_FUSION,O_VF,O_CONTOUR} OpenModeType; +typedef enum {O_BASE,O_OVERLAY,O_FUSION,O_VF,O_CONTOUR,O_LANDMARKS} OpenModeType; typedef enum {P_NORMAL,P_SEQUENCE,P_WINDOW,P_LEVEL} ParseModeType; void load_image_first_error() @@ -181,7 +181,8 @@ int main( int argc, char** argv ) << "--overlay file \t Overlay the image in file with complementary colors." << std::endl << "--fusion file \t Overlay the image in file with alpha blending and colormap." << std::endl //<< "--roi file \t Overlay binary mask images. Option may be repeated on a single base image." << std::endl - << "--contour file \t Overlay DICOM RT-STRUCT contours." << std::endl; + << "--contour file \t Overlay DICOM RT-STRUCT contours." << std::endl + << "--landmarks file \t Overlay the landmarks in file (.txt or .pts)." << std::endl; exit(0); } else if (current=="--vf") { if (!n_image_loaded) load_image_first_error(); @@ -195,6 +196,9 @@ int main( int argc, char** argv ) } else if (current=="--fusion") { if (!n_image_loaded) load_image_first_error(); open_mode = O_FUSION; + } else if (current=="--landmarks") { + if (!n_image_loaded) load_image_first_error(); + open_mode = O_LANDMARKS; } else if (current == "--sequence") { if(open_mode==O_BASE) n_image_loaded++; //count only one for the whole sequence parse_mode=P_SEQUENCE; @@ -273,6 +277,8 @@ int main( int argc, char** argv ) window.AddDCStructContour(n_image_loaded-1,current.c_str()); else if (open_mode==O_FUSION) window.AddFusionImage(n_image_loaded-1,current.c_str()); + else if (open_mode==O_LANDMARKS) + window.AddLandmarks(n_image_loaded-1,current.c_str()); open_mode = O_BASE; } } diff --git a/vv/vvLandmarks.cxx b/vv/vvLandmarks.cxx index 0bab2f4..94fb975 100644 --- a/vv/vvLandmarks.cxx +++ b/vv/vvLandmarks.cxx @@ -28,6 +28,7 @@ #include "vtkFloatArray.h" #include "vtkPointData.h" #include "clitkCommon.h" +#include //-------------------------------------------------------------------- vvLandmarks::vvLandmarks(int size) @@ -177,12 +178,24 @@ std::string vvLandmarks::GetComments(int index) //-------------------------------------------------------------------- -void vvLandmarks::LoadFile(std::string filename) +bool vvLandmarks::LoadFile(std::string filename) +{ + std::string extension = itksys::SystemTools::GetFilenameExtension(filename); + if (extension == ".txt") + return LoadTxtFile(filename); + else if (extension == ".pts") + return LoadPtsFile(filename); + + return false; +} + +//-------------------------------------------------------------------- +bool vvLandmarks::LoadTxtFile(std::string filename) { std::ifstream fp(filename.c_str(), std::ios::in|std::ios::binary); if (!fp.is_open()) { std::cerr <<"Unable to open file " << filename << std::endl; - return; + return false; } mFilename = filename; mLandmarks.clear(); @@ -278,9 +291,102 @@ void vvLandmarks::LoadFile(std::string filename) } } SetTime(0); + + return true; } //-------------------------------------------------------------------- +//-------------------------------------------------------------------- +bool vvLandmarks::LoadPtsFile(std::string filename) +{ + std::ifstream fp(filename.c_str(), std::ios::in|std::ios::binary); + if (!fp.is_open()) { + std::cerr <<"Unable to open file " << filename << std::endl; + return false; + } + mFilename = filename; + mLandmarks.clear(); + vtkIdType idPoint; + char line[255]; + for (unsigned int i = 0; i < mPoints.size(); i++) + mPoints[i]->SetNumberOfPoints(0); + bool first_line=true; + while (fp.getline(line,255)) { + // DD(line); + std::string stringline = line; + if (stringline.size() > 1) { + vvLandmark point; + int previousSpace = 0; + int space=0; + + if (stringline[0] == '#') // comments + continue; + + space = stringline.find("\t", previousSpace+1); + if (space < -1 || space > (int)stringline.size()) { + ErrorMsg(mLandmarks.size(),"x position"); + continue; + } + point.coordinates[0] = atof(replace_dots(stringline.substr(previousSpace,space - previousSpace)).c_str()); + // DD(point.coordinates[0]); + previousSpace = space; + space = stringline.find("\t", previousSpace+1); + if (space < -1 || space > (int)stringline.size()) { + ErrorMsg(mLandmarks.size(),"y position"); + continue; + } + point.coordinates[1] = atof(replace_dots(stringline.substr(previousSpace,space - previousSpace)).c_str()); + // DD(point.coordinates[1]); + previousSpace = space; + space = stringline.find("\t", previousSpace+1); + if (space < -1 || space > (int)stringline.size()) { + ErrorMsg(mLandmarks.size(),"z position"); + continue; + } + point.coordinates[2] = atof(replace_dots(stringline.substr(previousSpace,space - previousSpace)).c_str()); + previousSpace = space; + if (mFormatVersion>0) { + space = stringline.find("\t", previousSpace+1); + if (space < -1 || space > (int)stringline.size()) { + ErrorMsg(mLandmarks.size(),"t position"); + continue; + } + point.coordinates[3] = atof(replace_dots(stringline.substr(previousSpace,space - previousSpace)).c_str()); + previousSpace = space; + space = stringline.find("\t", previousSpace+1); + if (space < -1 || space > (int)stringline.size()) { + ErrorMsg(mLandmarks.size(),"pixel value"); + continue; + } + point.pixel_value = atof(replace_dots(stringline.substr(previousSpace,space - previousSpace)).c_str()); + // DD(point.pixel_value); + } else { + point.pixel_value=0.; //Not in file + point.coordinates[3]=0.; + } + previousSpace = space; + //this is the maximum size of comments + space = (stringline.find("\n", previousSpace+1) < 254 ? stringline.find("\n", previousSpace+1) : 254); + if (previousSpace != -1) { + point.comments = stringline.substr(previousSpace,space - (previousSpace)).c_str(); + } + // DD(point.comments); + mLandmarks.push_back(point); + mIds->InsertNextTuple1(0.55); + idPoint = mPoints[int(point.coordinates[3])]->InsertNextPoint( + point.coordinates[0],point.coordinates[1],point.coordinates[2]); + std::string str_vtkIdType; // string which will contain the result + std::ostringstream convert; // stream used for the conversion + convert << idPoint; // insert the textual representation of 'idPoint' in the characters in the stream + str_vtkIdType = convert.str(); // set 'str_vtkIdType' to the contents of the stream + mLabels->InsertNextValue(str_vtkIdType.c_str()); + } + } + SetTime(0); + + return true; +} +//-------------------------------------------------------------------- //-------------------------------------------------------------------- bool vvLandmarks::ErrorMsg(int num,const char * text) diff --git a/vv/vvLandmarks.h b/vv/vvLandmarks.h index 8f94717..0abaf61 100644 --- a/vv/vvLandmarks.h +++ b/vv/vvLandmarks.h @@ -39,7 +39,7 @@ public : vvLandmarks(int size); ~vvLandmarks(); - void LoadFile(std::string filename); + bool LoadFile(std::string filename); void SaveFile(std::string filename); void AddLandmark(float x,float y,float z,float t,double value); @@ -71,6 +71,10 @@ private: vtkStringArray* mLabels; std::string mFilename; int mFormatVersion; + + bool LoadTxtFile(std::string filename); + bool LoadPtsFile(std::string filename); + }; #endif diff --git a/vv/vvLandmarksPanel.cxx b/vv/vvLandmarksPanel.cxx index 7fb8027..46c7c0e 100644 --- a/vv/vvLandmarksPanel.cxx +++ b/vv/vvLandmarksPanel.cxx @@ -46,9 +46,14 @@ vvLandmarksPanel::vvLandmarksPanel(QWidget * parent):QWidget(parent) void vvLandmarksPanel::Load() { QString file = QFileDialog::getOpenFileName(this,tr("Load Landmarks"), - mCurrentPath.c_str(),tr("Landmarks ( *.txt)")); + mCurrentPath.c_str(),tr("Landmarks ( *.txt *.pts)")); if (!file.isEmpty()) - mCurrentLandmarks->LoadFile(file.toStdString()); + LoadFromFile(file.toStdString()); +} + +void vvLandmarksPanel::LoadFromFile(std::string file) +{ + mCurrentLandmarks->LoadFile(file); SetCurrentLandmarks(mCurrentLandmarks,2); emit UpdateRenderWindows(); } diff --git a/vv/vvLandmarksPanel.h b/vv/vvLandmarksPanel.h index 9966d88..d352a9a 100644 --- a/vv/vvLandmarksPanel.h +++ b/vv/vvLandmarksPanel.h @@ -41,6 +41,7 @@ public: public slots: void Load(); + void LoadFromFile(std::string file); void Save(); void RemoveSelectedPoints(); void AddPoint(); diff --git a/vv/vvMainWindow.cxx b/vv/vvMainWindow.cxx index 22041df..3add36d 100644 --- a/vv/vvMainWindow.cxx +++ b/vv/vvMainWindow.cxx @@ -2116,7 +2116,18 @@ void vvMainWindow::AddFusionImage(int index, QString file) QMessageBox::information(this,tr("Problem reading Fusion !"),"File doesn't exist!"); } //------------------------------------------------------------------------------ - +//------------------------------------------------------------------------------ +void vvMainWindow::AddLandmarks(int index, QString file) +{ + if (QFile::exists(file)) + { + landmarksPanel->LoadFromFile(file.toStdString()); + landmarksPanel->SetCurrentPath(mInputPathName.toStdString()); + landmarksPanel->SetCurrentImage(mSlicerManagers[index]->GetFileName().c_str()); + } + else + QMessageBox::information(this,tr("Problem reading Landmarks !"),"File doesn't exist!"); +} //------------------------------------------------------------------------------ void vvMainWindow::OpenField() diff --git a/vv/vvMainWindow.h b/vv/vvMainWindow.h index e308314..efcd6a2 100644 --- a/vv/vvMainWindow.h +++ b/vv/vvMainWindow.h @@ -57,7 +57,8 @@ class vvMainWindow: public vvMainWindowBase, void AddOverlayImage(int index, std::vector fileNames, vvImageReader::LoadedImageType type); void AddFusionImage(int index, QString filename); void AddROI(int index, QString filename); - ///Adds a mesh to a SlicerManager, with optional warping by vector field + void AddLandmarks(int index, QString file); +///Adds a mesh to a SlicerManager, with optional warping by vector field void AddContour(int image_index, vvMesh::Pointer contour, bool propagation); ///This is used to show an image when opened or computed void ShowLastImage();