- Add the methods
gdcm::Dict:AddDict(std::string fullPathPrivateDictionaryFileName)
and
gdcm::Dict::RemoveDict(std::string fullPathPrivateDictionaryFileName)
to allow user to choose the 'Private Dictionary' he wants to work with.
One can dream about a better API;
This one allow right now anybody to see very easyly if the use
of a given private dicom dictionary is of any help or not.
-
PrintFile has now a new command line argument manager option :
dict=fullPathNamePrivateDictionaryFile
to allow user to see with no extra coding what differences
makes the use or not of a private Dicom Dictionary.
e.g. : use it as follow
PrintFile filein=myGEdicomFile.dcm
dict=/user/userName/gdcm/Dicts/GEMS-Advance.dic
-
(Not a great one ...)
Stupid method names :
DicomDir::WriteDicomDir()
and DicomDir::AnonymizeDicomDir()
replaced by :
DicomDir::Write()
and DicomDir::Anonymize()
-
void Document::AddForceLoadElement(uint16_t group, uint16_t elem);
allows user to tell gdcm::Document Loader he wants
to force the loading of a given set of DocEntries,
even if their length exceeds the current
MAX_SIZE_LOAD_ELEMENT_VALUE.
-
Many users expect from vtkGdcmReader it 'orders' the images
(that's the job of gdcm::SerieHelper ...)
When user knows the files with same Serie UID
have same sizes, same 'pixel' type, same color convention, ...
the right way to proceed is as follow :
gdcm::SerieHelper *sh= new gdcm::SerieHelper();
// if user wants *not* to load some parts of the file headers
sh->SetLoadMode(loadMode);
// if user wants *not* to load some files
sh->AddRestriction(group, element, value, operator);
sh->AddRestriction( ...
sh->SetDirectory(directoryWithImages);
// if user *knows* how to order his files
sh->SetUserLessThanFunction(userSuppliedComparisonFunction);
// or/and
// if user wants to sort reverse order
sh->SetSortOrderToReverse();
// here, we suppose only the first 'Single SerieUID' Fileset is of interest
// Just iterate using sh->NextSingleSerieUIDFileSet()
// if you want to get all of them
gdcm::FileList *l = sh->GetFirstSingleSerieUIDFileSet();
// if user is doesn't trust too much the files with same Serie UID
if ( !sh->IsCoherent(l) )
return; // not same sizes, or not same 'pixel type' -> stop
sh->OrderFileList(l); // sort the list
vtkGdcmReader *reader = vtkGdcmReader::New();
// if user wants to modify pixel order (Mirror, TopDown, ...)
// he has to supply the function that does the job
// (a *very* simple example is given in vtkgdcmSerieViewer.cxx)
reader->SetUserFunction (userSuppliedFunction);
// to pass a 'Single SerieUID' Fileset as produced by gdcm::SerieHelper
reader->SetCoherentFileList(l);
reader->Update();
You can see a full example in vtk/vtkgdcmSerieViewer.cxx
e.g.
vtkgdcmSerieViewer dirname=Dentist mirror
vtkgdcmSerieViewer dirname=Dentist reverse
vtkgdcmSerieViewer dirname=Dentist reverse topdown
- vtkGdcmReader::SetUserFunction (userSuppliedFunction)
with :
void userSuppliedFunction(uint8_t *imageData, File *f);
allows user to reorganize the pixels of each image just after reading
it (to mirror, or topdown the image, for instance)
Note : uint8_t * doesn't mean it works only on 8 Bits images.
It's for prototyping. Feel free to cast it.
-
SerieHelper::SetUserLessThanFunction(userSuppliedComparisonFunction)
with :
bool userSuppliedComparisonFunction(File *, File *);
allows user -when he knows more about his files than gdcm does-
to give his own comparison function.
- SerieHelper::SetSortOrderToReverse allows user to ask
to sort the Files reverse order.
- SerieHelper::AddRestriction has now a new constructor
AddRestriction(group, element, value, operator);
allows user to exclude some files from the sorting, according to
any comparison operator
(GDCM_EQUAL, GDCM_DIFFERENT,
GDCM_GREATER, GDCM_GREATEROREQUAL,
GDCM_LESS, GDCM_LESSOREQUAL), not only on the
equality.
- AnonymizeNoLoad used with dirin=inputDirectoryName
anonymizes all the files within the given Directory.
User may also choose extra elements he wants to rub out:
rubout=listOfElementsToRubOut
with listOfElementsToRubOut : group1-elem1,group2-elem2,
... (in hexa, no space within the list )
- gdcm::SerieHelper() has a new method
void AddGdcmFile(File *header), that allows aware user to
create a 'FileList' (actually a
std::vector< File* > ).
The FileList created this way will be the
'first one' in the gdcm::FileHelper() (retrieve it with
FileList *GetFirstCoherentFileList() ).
It may be sorted using OrderFileList.
No 'coherence check' will be performed on this FileList
before sorting.
It may be passed to a vtkGdcmReader
(to avoid parsing twice the files)
- vtkGdcmReader can now get the result of
gdcm::SerieHelper (to avoid parsing twice the files)
Proceed as follow :
gdcmSerieHelper *sh = new gdcmSerieHelper();
sh->SetDirectory(myImageDirectory, true);
gdcmFileList *l = s->GetFirstCoherentFileList();
s->OrderFileList(l);
vtkGdcmReader *gr = new vtkGdcmReader();
gr->SetCoherentFileList(l);
gr->Update();
This works with a directory that contains only one 'Serie'
(same Serie UID for all the images).
If it contains more than one Serie, you'll have to loop
on the Series, using GetNextCoherentFileList();
It will be up to the user to delete the gdcm::File.
See vtkgdcmSerieViewer for an example.
- Both vtkgdcmViewer and vtkgdcmViewer2
are available to allow easy displaying of single/multiframe
GreyLevel/RGB/PaletteColor images
- DICOMDIR anonymiser (Load and Noload mode)
- Because the gdcm::DicomDir::Load() method may be used
either for loading an already made DICOMDIR file or for
parsing all the dicom files with a given root directory we
syntaxically separated the operations:
For loading an already made DICOMDIR file, use :
gdcm::DicomDir *d = new gdcm::DicomDir();
d->SetFileName(fileName);
d->Load( );
For parsing all the dicom files within a given root directory, use :
gdcm::DicomDir *d = new gdcm::DicomDir();
d->SetDirectoryName(dirName);
d->Load( )
Don't use any longer old deprecated style:
gdcm::DicomDir *d = new gdcm::DicomDir();
d->SetParseDir(true); // or d->SetParseDir(false);
d->Load( fileName );
- User is now allowed to tell gdcm::Document constructor
he doesn't want to deal with SeqEntry
(every time it's possible, i.e for 'true length' Sequences)
and/or he doesn't want to deal with Shadow groups
(every time it's possible i.e. when element 0x0000
exists for this Group)
or he doesn't want to deal with SeqEntry that belong to a
Shadow group (every time it's possible
-'true length' Sequence-)
use :
gdcm::File *f = new gdcm::File();
f->SetLoadMode(NO_SEQ); | depending on what
f->SetLoadMode(NO_SHADOW); | you want *not*
f->SetLoadMode(NO_SEQ | NO_SHADOW);| to load from the
f->SetLoadMode(NO_SHADOWSEQ); | target file
f->SetFileName(fileName);
f->Load( );
Don't use any longer old deprecated style:
gdcm::File *f = new gdcm::File(fileName);
- User is now allowed to tell gdcm::DicomDir constructor
he doesn't want to deal with SeqEntry
(every time it's possible, i.e for 'true length' Sequences)
and/or he doesn't want to deal with Shadow groups
(every time it's possible i.e. when element 0x0000
exists for this Group)
or he doesn't want to deal with SeqEntry that belong to a
Shadow group (every time it's possible
-'true length' Sequence-)
when he parses all the Dicom files within a given directory.
use :
gdcm::DicomDir *f = new gdcm::DicomDir();
f->SetLoadMode(NO_SEQ); | depending on what
f->SetLoadMode(NO_SHADOW); | you want *not*
f->SetLoadMode(NO_SEQ | NO_SHADOW);| to load from the files
f->SetLoadMode(NO_SHADOWSEQ); | within the root directory
f->SetDirectoryName(rootDirectoryName);
f->Load( );
Don't use any longer old deprecated style:
gdcm::DicomDir *dcmdir = new gdcm::DicomDir(dirName, true);