]> Creatis software - bbtk.git/commitdiff
#2853 BBTK Feature New Normal - std:FilesFromDirectory box add option to create...
authorEduardo DAVILA <eduardo.davila@creatis.insa-lyon.fr>
Wed, 24 Feb 2016 20:32:49 +0000 (21:32 +0100)
committerEduardo DAVILA <eduardo.davila@creatis.insa-lyon.fr>
Wed, 24 Feb 2016 20:32:49 +0000 (21:32 +0100)
packages/itk/src/bbitkResampleImageFilter.h
packages/std/src/bbstdFilesFromDirectory.cxx
packages/std/src/bbstdFilesFromDirectory.h

index 65222c55d1be8dd1c49118c752a9cf68f753b982..f66167a40d7984aab82c42e9ac532d49f9cdedc8 100644 (file)
@@ -153,8 +153,10 @@ namespace bbitk
       // We create an interpolator of the found type 
       typename InterpolatorType::Pointer interpolator = InterpolatorType::New();
       filter->SetInterpolator( interpolator );
+printf("EED ResampleImageFilter NearestNeighbor \n");
     }
     else if  ( bbGetInputInterpolation() == "BSpline") { 
+printf("EED ResampleImageFilter BSpline \n");
       typedef itk::BSplineInterpolateImageFunction < ImageType, double > InterpolatorType; 
       // We create an interpolator of the found type 
       typename InterpolatorType::Pointer interpolator = InterpolatorType::New();
@@ -168,6 +170,7 @@ namespace bbitk
     } //end else if
     // Interpolation 
     else { // if ( bbGetInputInterpolation() == "Linear" ) {
+printf("EED ResampleImageFilter Linear \n");
       typedef itk::LinearInterpolateImageFunction < ImageType, double > InterpolatorType;     
       // We create an interpolator of the found type 
       typename InterpolatorType::Pointer interpolator =  InterpolatorType::New();
index fc271c23591dd14977a420714323bd855561b9d4..1aefdb16e4005719a68219f62bb9b1cf6b79fb1e 100644 (file)
@@ -47,19 +47,20 @@ BBTK_BLACK_BOX_IMPLEMENTATION(FilesFromDirectory,bbtk::AtomicBlackBox);
 
 void FilesFromDirectory::Process()
 {
-   DirName = bbGetInputIn();
-   bool rec = bbGetInputRecursive();
-   /*int nbFiles = */ Explore(DirName, rec);
-   bbSetOutputOut(Filenames);   
-   
-//  for (int i=0; i<Filenames.size(); i++)
-//     std::cout << "Filenames [" << i << "] = [" << Filenames[i] << "]" << std::endl;  
+       Filenames.clear();
+       DirName         = bbGetInputIn();
+       bool rec        = bbGetInputRecursive();
+       /*int nbFiles = */ Explore(DirName, rec);
+       CleanFilenames( bbGetInputIn() );
+       bbSetOutputOut(Filenames);   
+       bbSetOutputOutSimple(SimpleFilenames);   
 }
 
 void FilesFromDirectory::bbUserSetDefaultValues()
 {
     bbSetInputIn(".");
     bbSetInputRecursive(false);  
+    bbSetInputType(0);  
 }
 
 void FilesFromDirectory::bbUserInitializeProcessing() 
@@ -98,6 +99,218 @@ std::string FilesFromDirectory::NormalizePath(std::string const &pathname)
  * @param  dirpath   directory to explore
  * @param  recursive whether we want recursion or not
  */
+
+
+
+int FilesFromDirectory::Explore(std::string const &dirpath, bool recursive)
+{
+       int numberOfFiles               = 0;
+       std::string dirName     = NormalizePath(dirpath);
+       int tmpNumberOfFiles;
+       std::string fileName;
+#ifdef _MSC_VER
+       WIN32_FIND_DATA fileData;
+       //assert( dirName[dirName.size()-1] == '' );
+       HANDLE hFile = FindFirstFile((dirName+"*").c_str(), &fileData);
+
+
+       for(BOOL b = (hFile != INVALID_HANDLE_VALUE); b;
+       b = FindNextFile(hFile, &fileData))
+       {
+      fileName = fileData.cFileName;
+      if ( fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
+      {
+         // Need to check for . and .. to avoid infinite loop
+         if ( fileName != "." && fileName != ".." && recursive )
+         {
+                       if (bbGetInputType()==1)
+                       {
+                               Filenames.push_back(fileName);   
+                               numberOfFiles++;
+                       } // Type ALL_directories
+
+                       tmpNumberOfFiles        =       Explore(dirName+fileName, recursive);
+                       if ((bbGetInputType()==2)&&tmpNumberOfFiles==0)
+                       {
+                       Filenames.push_back(fileName);   
+                       numberOfFiles++;
+                       } // Type Lsast_directories
+                       
+                       numberOfFiles           =       numberOfFiles + tmpNumberOfFiles;
+         } // if
+      } else  {
+//      std::string temp = "\"" +dirName+fileName + "\"";
+        std::string temp = dirName+fileName;
+
+/*
+        std::string::size_type spacePosition = temp.find_first_of(' ');
+               if (spacePosition != std::string::npos) 
+               {
+                       std::cout << "=========================================== File name : [" <<temp << 
+              "] contains space(s); Discarted !" << std::endl;
+               temp.insert(spacePosition, "\\");
+                       continue;  /// \TODO : fix the trouble (vtk?)
+               } // if !npos
+*/
+
+
+               if (bbGetInputType()==0)
+               {
+                       Filenames.push_back(temp);       
+                       numberOfFiles++;
+               } // Type files
+
+      } // if !directory
+       } // for
+       DWORD dwError = GetLastError();
+       if (hFile != INVALID_HANDLE_VALUE) 
+       {
+               FindClose(hFile);
+       }// hFile
+       if (dwError != ERROR_NO_MORE_FILES) 
+       {
+      LPVOID lpMsgBuf;
+      FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|
+                    FORMAT_MESSAGE_FROM_SYSTEM|
+                    FORMAT_MESSAGE_IGNORE_INSERTS,
+                    NULL,GetLastError(),
+                    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
+                    (LPTSTR) &lpMsgBuf,0,NULL);
+
+      //gdcmErrorMacro("FindNextFile error. Error is " << (char *)lpMsgBuf
+      //             <<" for the directory : "<<dirName);
+      return -1;
+       } // dwError
+
+#else
+  // Real POSIX implementation: scandir is a BSD extension only, and doesn't 
+  // work on debian for example
+
+       DIR* dir = opendir(dirName.c_str());
+       if (!dir)
+       {
+               return 0;
+       }
+
+   // According to POSIX, the dirent structure contains a field char d_name[]
+   // of unspecified size, with at most NAME_MAX characters preceeding the
+   // terminating null character. Use of other fields will harm the  porta-
+   // bility of your programs.
+
+       struct stat     buf;
+       dirent                  *d;
+       for (d = readdir(dir); d; d = readdir(dir))
+       {
+       fileName = dirName + d->d_name;
+       std::string temp = fileName;
+       if( stat(fileName.c_str(), &buf) != 0 )
+       {
+                //gdcmErrorMacro( strerror(errno) );
+       } // stat
+       if ( S_ISREG(buf.st_mode) )    //is it a regular file?
+       {
+               if ( d->d_name[0]!='.')
+               {
+
+/*
+                       std::string::size_type  spacePosition = temp.find_first_of(' ');
+               if (spacePosition != std::string::npos)
+                       {
+                                       std::cout << "=========================================== File name : [" <<temp << 
+                               "] contains space(s); Discarted !" << std::endl;
+                       temp.insert(spacePosition, "\\");
+                                       continue;   /// \TODO : fix the trouble (vtk?)
+               } // if spacePosition
+*/
+
+                               if (bbGetInputType()==0)
+                               {
+                       Filenames.push_back(temp);       
+                               numberOfFiles++;
+                               } // Type files
+               } // d_name
+       } else if ( S_ISDIR(buf.st_mode) ) {  //directory?
+               if ( d->d_name[0] != '.' && recursive ) //we also skip hidden files
+               {
+                               if (bbGetInputType()==1)
+                               {
+                       Filenames.push_back(fileName);   
+                               numberOfFiles++;
+                               } // Type All_directories
+
+                               tmpNumberOfFiles        = Explore( fileName, recursive);
+                               if ((bbGetInputType()==2)&&tmpNumberOfFiles==0)
+                               {
+                                       Filenames.push_back(fileName);   
+                               numberOfFiles++;
+                               } // Type Lsast_directories
+                       numberOfFiles           = numberOfFiles+tmpNumberOfFiles;
+               } // d_name
+               } else {
+               //gdcmErrorMacro( "Unexpected error" );
+               return -1;
+       } // Regular FILE
+   }
+   if( closedir(dir) != 0 )
+   {
+      //gdcmErrorMacro( strerror(errno) );
+   }// closedir
+#endif
+
+
+       return numberOfFiles;
+}
+
+
+//------------------------------------------------------------------------------
+void FilesFromDirectory::CleanFilenames( std::string basePath )
+{
+       std::string tmpString;
+       int i,ii,sizeFilenames = Filenames.size();
+
+// Cleanning paths with spaces 
+       for (i=0; i<sizeFilenames; i++)
+       {
+               tmpString=Filenames[i];
+               std::string::size_type  spacePosition = tmpString.find_first_of(' ');
+               if (spacePosition != std::string::npos)
+               {
+                       std::cout << "=========================================== File name : [" <<tmpString << 
+               "] contains space(s); Discarted !" << std::endl;
+                       tmpString.insert(spacePosition, "\\");
+                       Filenames[i]=tmpString;
+//                     continue;   /// \TODO : fix the trouble (vtk?)
+               } // if spacePosition
+       }
+
+// Alphabetical order  
+       for (i=0; i<sizeFilenames; i++)
+       {
+       for (ii=i; ii<sizeFilenames; ii++)
+               {
+                       if (Filenames[i]>Filenames[ii]) 
+               {
+                       tmpString=Filenames[i];
+                       Filenames[i]=Filenames[ii];
+                       Filenames[ii]=tmpString;
+               } // if 
+       } // for ii
+       } // for i
+
+// Creating SimpleFilenames
+       unsigned int lenghtBasePath = basePath.length();
+       for (i=0; i<sizeFilenames; i++)
+       {
+               SimpleFilenames.push_back( Filenames[i].substr( lenghtBasePath ) );
+       } // for i
+
+}
+
+
+
+
+/*
+
 int FilesFromDirectory::Explore(std::string const &dirpath, bool recursive)
 {
    Filenames.clear();
@@ -185,7 +398,7 @@ int FilesFromDirectory::Explore(std::string const &dirpath, bool recursive)
          if ( d->d_name[0]!='.')
          {
         
-             std::string::size_type /* long int */ spacePosition = temp.find_first_of(' ');
+             std::string::size_type  spacePosition = temp.find_first_of(' ');
              if (spacePosition != std::string::npos)
             {
    std::cout << "=========================================== File name : [" <<temp << 
@@ -233,7 +446,7 @@ int FilesFromDirectory::Explore(std::string const &dirpath, bool recursive)
 
   return numberOfFiles;
 }
-
+*/
 
 }
 // EO namespace bbstd
index 2d49d33d208813a7f563c2eed9546b545555ea0a..7d67556986c869538d1c584ec27d0978c9269345 100644 (file)
@@ -41,16 +41,20 @@ namespace bbstd
     BBTK_BLACK_BOX_INTERFACE(FilesFromDirectory,bbtk::AtomicBlackBox);
     BBTK_DECLARE_INPUT(In,std::string);
     BBTK_DECLARE_INPUT(Recursive,bool);  
+    BBTK_DECLARE_INPUT(Type,int);  
     BBTK_DECLARE_OUTPUT(Out,std::vector<std::string>);
+    BBTK_DECLARE_OUTPUT(OutSimple,std::vector<std::string>);
     BBTK_PROCESS(Process);
     void Process();
     
   private :
     std::string NormalizePath(std::string const &pathname);
-    int Explore(std::string const &dirpath, bool recursive);
-    
+    int        Explore(std::string const &dirpath, bool recursive);
+    void       CleanFilenames( std::string basePath );
+
     /// List of file names
     std::vector<std::string> Filenames;
+    std::vector<std::string> SimpleFilenames;
     /// name of the root directory to explore
     std::string DirName;
   };
@@ -58,14 +62,18 @@ namespace bbstd
   //=================================================================
   // BlackBox description
   BBTK_BEGIN_DESCRIBE_BLACK_BOX(FilesFromDirectory,bbtk::AtomicBlackBox);
-  BBTK_NAME("FilesFromDirectory");
-  BBTK_AUTHOR("jpr@creatis.univ-lyon1.fr");
-  BBTK_DESCRIPTION("returns the fullPathNames of the files in a Directory");
-  BBTK_CATEGORY("");
-  BBTK_INPUT(FilesFromDirectory,In,"Directory Name",std::string,"");
-  BBTK_INPUT(FilesFromDirectory,Recursive,"Recursive directory exploration",bool,"");
+   BBTK_NAME("FilesFromDirectory");
+   BBTK_AUTHOR("jpr@creatis.univ-lyon1.fr");
+   BBTK_DESCRIPTION("returns the fullPathNames of the files in a Directory");
+   BBTK_CATEGORY("");
+
+   BBTK_INPUT(FilesFromDirectory,In,"Directory Name",std::string,"");
+   BBTK_INPUT(FilesFromDirectory,Recursive,"Recursive directory exploration",bool,"");
+   BBTK_INPUT(FilesFromDirectory,Type,"0=files 1=All_directories 2=last_directories  (0 default)",int,"");
   
-  BBTK_OUTPUT(FilesFromDirectory,Out,"FullPathNames of the files",std::vector<std::string>,"");
+   BBTK_OUTPUT(FilesFromDirectory,Out,"FullPathNames of the files",std::vector<std::string>,"");
+   BBTK_OUTPUT(FilesFromDirectory,OutSimple,"Simple Full PathNames of the files",std::vector<std::string>,"");
+
   BBTK_END_DESCRIBE_BLACK_BOX(FilesFromDirectory);
 
 }