[Insight-users] how to modify InsightApplications
    John Drescher 
    drescherjm at gmail.com
       
    Wed Jan 27 09:05:04 EST 2010
    
    
  
On Wed, Jan 27, 2010 at 8:29 AM, URI <zallen at wheelinghospital.com> wrote:
>
> Can somebody give me just a quick answer?  I'm not looking for specific
> information on this particular program, I'm just asking what the proper
> method is in general for modifying open-source code like this.  Do I modify
> the raw source code files and then run CMake, or do I first run CMake on the
> original source code files and then modify the resulting Visual Studio
> solution?
I take the ITK example code to my folder and create a new project for
that that is independent from ITK. I put it in my own cvs/svn server
so that I can have it anywhere I program. I have a small collection of
such examples for itk, cmake, and vtk.
Here is one from ITK:
CMakeLists.txt
PROJECT(DicomSeriesMetaDictionary)
IF(WIN32)
    CMAKE_MINIMUM_REQUIRED(VERSION 2.5 FATAL_ERROR)
    SET(CMAKE_CXX_FLAGS "/WL /GR /EHsc" )
    ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
ENDIF(WIN32)
IF(COMMAND cmake_policy)
  cmake_policy(SET CMP0003 NEW)
endif(COMMAND cmake_policy)
SET (LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin CACHE INTERNAL
"Single output directory for building all libraries.")
SET (EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin CACHE INTERNAL
"Single output directory for building all executables.")
FIND_PACKAGE( ITK REQUIRED )
INCLUDE( ${ITK_USE_FILE} )
SET( DICOM_SERIES_META_SRCS
	./src/main.cxx
)
LINK_LIBRARIES ( DicomSeriesMetaDictionary ITKCommon ITKBasicFilters ITKIO )
ADD_EXECUTABLE( DicomSeriesMetaDictionary ${DICOM_SERIES_META_SRCS} )
now src/main.cxx
#define USE_GDCM
#include "itkImage.h"
#include "itkImageSeriesReader.h"
#include "itkImageSeriesWriter.h"
#ifdef USE_GDCM
#include "itkGDCMImageIO.h"
#include "itkGDCMSeriesFileNames.h"
#else
#include "itkDICOMImageIO2.h"
#include "itkDICOMSeriesFileNames.h"
#endif //def USE_GDCM
#include <iostream>
int main(int argc, char *argv[])
{
	if (argc > 2) {
		typedef signed short    PixelType;
		const unsigned int      Dimension = 3;
		typedef itk::Image< PixelType, Dimension >      ImageType;
		typedef itk::ImageSeriesReader< ImageType >     ReaderType;
		typedef itk::ImageFileReader< ImageType >       ReaderMHDType;
#ifdef USE_GDCM
		typedef itk::GDCMImageIO                        ImageIOType;
		typedef itk::GDCMSeriesFileNames                NamesGeneratorType;
#else
		typedef itk::DICOMImageIO2                        ImageIOType;
		typedef  itk::DICOMSeriesFileNames				SeriesFileNamesType;
		typedef  SeriesFileNamesType					NamesGeneratorType;
#endif //def USE_GDCM
		
		ImageIOType::Pointer gdcmIO = ImageIOType::New();
		NamesGeneratorType::Pointer namesGenerator = NamesGeneratorType::New();
#ifdef USE_GDCM
		namesGenerator->SetInputDirectory( argv[1] );
		const ReaderType::FileNamesContainer & filenames =
			namesGenerator->GetInputFileNames();
		namesGenerator->SetInputDirectory( argv[1] );
#else
		namesGenerator->SetDirectory( argv[1] );
		const ReaderType::FileNamesContainer & filenames =
			namesGenerator->GetFileNames();
#endif //def USE_GDCM
		ReaderType::Pointer reader = ReaderType::New();
		reader->SetImageIO( gdcmIO );
		reader->SetFileNames( filenames );
		reader->Update();
		reader->GenerateOutputInformation();
		// BEGIN IMPORTANT CODE*
		unsigned int nbSlices = filenames.size();
		ReaderType::DictionaryRawPointer dictionary;
		ReaderType::DictionaryArrayType outputArray;
		for (unsigned int i = 0; i < nbSlices; i++)
		{
			dictionary = (*(reader->GetMetaDataDictionaryArray()))[i];
			std::string entryId("0008|103e");
			std::string value("MARTIN IS THE BEST"); // it was just a test ;-)*
				itk::EncapsulateMetaData<std::string>( *dictionary, entryId, value
				);
			outputArray.push_back(dictionary);
		}
		// END*
		typedef signed short    OutputPixelType;
		const unsigned int      OutputDimension = 2;
		typedef itk::Image< OutputPixelType, OutputDimension >    Image2DType;
		typedef itk::ImageSeriesWriter< ImageType, Image2DType >
			SeriesWriterType;
		SeriesWriterType::Pointer seriesWriter = SeriesWriterType::New();
		seriesWriter->SetInput( reader->GetOutput() );
		seriesWriter->SetImageIO( gdcmIO );
#ifdef USE_GDCM
		namesGenerator->SetOutputDirectory( argv[2] );
		seriesWriter->SetFileNames( namesGenerator->GetOutputFileNames() );
#else
		namesGenerator->SetDirectory( argv[2] );
		seriesWriter->SetFileNames( namesGenerator->GetFileNames() );
#endif //def USE_CDCM
		// BEGIN IMPORTANT CODE*
			seriesWriter->SetMetaDataDictionaryArray( &outputArray );
			// instead of :
			// seriesWriter->SetMetaDataDictionaryArray(
			// reader->GetMetaDataDictionaryArray());
		// END*
			seriesWriter->Update();
	}
	else
	{
		std::cout << "Usage: "<< argv[0] << " <input folder> <output folder>
" << std::endl;
	}
	
}
John
    
    
More information about the Insight-users
mailing list