#include "itkExtractBundleWithROICommand.h" #include #include #include #include #include #include #include #include #include #include #include #include "GetPot.h" int atoi_check( const char * str ) { char *endptr; long val= strtol(str, &endptr, 0); /* Check for various possible errors */ if ( (errno == ERANGE && (val == LONG_MAX || val == LONG_MIN)) || val>=INT_MAX || val<=INT_MIN ) { std::cout< parseUIntVector( const std::string & str) { std::vector vect; std::string::size_type crosspos = str.find('x',0); if (crosspos == std::string::npos) { // only one uint vect.push_back( static_cast( atoi_check(str.c_str()) )); return vect; } // first uint vect.push_back( static_cast( atoi_check( (str.substr(0,crosspos)).c_str() ) )); while(true) { std::string::size_type crossposfrom = crosspos; crosspos = str.find('x',crossposfrom+1); if (crosspos == std::string::npos) { vect.push_back( static_cast( atoi_check( (str.substr(crossposfrom+1,str.length()-crossposfrom-1)).c_str() ) )); return vect; } vect.push_back( static_cast( atoi_check( (str.substr(crossposfrom+1,crosspos-crossposfrom-1)).c_str() ) )); } } namespace itk { ExtractBundleWithROICommand::ExtractBundleWithROICommand() { m_ShortDescription = "Extract a bundle given a set of fibers and a ROI"; m_LongDescription = "Usage:\n"; m_LongDescription += "-i -m -b -o \n\n"; m_LongDescription += m_ShortDescription; } ExtractBundleWithROICommand::~ExtractBundleWithROICommand() {} int ExtractBundleWithROICommand::Execute (int narg, const char* arg[]) { GetPot cl(narg, const_cast(arg)); // argument parser if( cl.size() == 1 || cl.search(2, "--help", "-h") ) { std::cout << this->GetLongDescription() << std::endl; return -1; } const char* fileIn = cl.follow("",2,"-i","-I"); const char *roiName = cl.follow("", "-m"); const char* fileOut = cl.follow("",2,"-o","-O"); std::vector booleans; if (cl.search("-b")) { booleans = parseUIntVector(cl.follow("", "-b")); } std::cout << "Reading " << fileIn << "..." << std::flush; vtkPolyDataReader *reader = vtkPolyDataReader::New(); reader->SetFileName( fileIn ); reader->Update(); std::cout << "Done\n"; typedef itk::Image MaskImageType; MaskImageType::Pointer mask = 0; { std::cout << "Reading " << roiName << "..." << std::flush; typedef itk::ImageFileReader MaskReaderType; MaskReaderType::Pointer maskReader = MaskReaderType::New(); maskReader->SetFileName(roiName); try { maskReader->Update(); } catch(itk::ExceptionObject &e) { std::cerr << e; return EXIT_FAILURE; } std::cout << "Done\n"; mask = maskReader->GetOutput(); mask->DisconnectPipeline(); } typedef itk::ImageToVTKImageFilter ConverterType; ConverterType::Pointer converter = ConverterType::New(); converter->SetInput (mask); converter->Update(); MaskImageType::DirectionType directions = mask->GetDirection(); vtkMatrix4x4 *matrix = vtkMatrix4x4::New(); matrix->Identity(); for (int i=0; i<3; i++) for (int j=0; j<3; j++) matrix->SetElement (i, j, directions (i,j)); vtkLimitFibersToROI* limiter = vtkLimitFibersToROI::New(); limiter->SetInput (reader->GetOutput()); limiter->SetMaskImage (converter->GetOutput()); limiter->SetDirectionMatrix (matrix); for (unsigned int i=0; iSetBooleanOperation (i+1, booleans[i]); } std::cout << "Limiting..." << std::flush; limiter->Update(); std::cout << "Done\n"; std::cout << "Cleaning..." << std::flush; vtkCleanPolyData *cleaner = vtkCleanPolyData::New(); cleaner->SetInputConnection (limiter->GetOutputPort()); cleaner->SetAbsoluteTolerance (0.0); cleaner->ConvertLinesToPointsOff (); cleaner->Update(); std::cout << "Done\n"; std::cout << "Writing " << fileOut << "..." << std::flush; vtkPolyDataWriter *writer = vtkPolyDataWriter::New(); writer->SetInputConnection (cleaner->GetOutputPort()); writer->SetFileName(fileOut); writer->Update(); std::cout << "Done\n"; reader->Delete(); matrix->Delete(); limiter->Delete(); writer->Delete(); return 0; } }