X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=Doc%2FWebsite%2FNews.html;h=49c6bfd6220f424385a9576d035241cd8a91682f;hb=31619439d2bd17207886a86e5a3879548517ae37;hp=126ff1350c80b6cbe89c9953ed219dfde064bd27;hpb=8cef68299f5b7eb6a9f1618b524275785904f523;p=gdcm.git diff --git a/Doc/Website/News.html b/Doc/Website/News.html index 126ff135..49c6bfd6 100644 --- a/Doc/Website/News.html +++ b/Doc/Website/News.html @@ -7,111 +7,466 @@ - + +

Gdcm News

- + +

- - Current Version - + + Missing features

+We know the following are missing; don't loose time looking for them ...
+We know they could be helpfull. We shall add them some day.
+Any contribution is welcome. +
  • Reader +
  • Writer + +
  • Reader / Writer + +
  • DICOMDIR + +
  • SerieHelper + +
  • Other + + + +
    +

    + + Current Version + +

    -
  • Known bugs + +
  • 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);
     
    -
    -
    -For people who get this new release :
    -
    -We consider now that :
    -- any dicom related file is a gdcm::Document.
    -- a gdcm::Document can be :
    -      - a gdcm::File,     if it contains pixel data,
    -      - a gdcm::DicomDir, if it contains only informations 
    -                          on the files in a given directory
    -
    -- in a gdcm::Document, there are gdcm::DocEntry, that can be :
    -     - gdcm::ContentEntry (any entry that has an actual value,
    -                           *not* an embedded set of other gdcm::DocEntry)
    -                           a gdcm::ContentEntry can be :
    -          - gdcm::ValEntry (whose value is std::string representable 
    -                            e.g. character values, or integers),
    -          - gdcm::BinEntry (whose value is not std::string representable 
    -                            e.g. color palettes, overlays, icons , ...)
    -     - gdcm::Sequence (no proper 'value', but a set of gdcm::SQItems, 
    -                       composed of a set of gdc::DocEntry, recursively)
    +   //      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( );  
    +           
    -- in a gdcm::DicomDir, we only deal, hierarchically, with : - - gdcmPatient - - gdcmStudy - - gdcmSerie - - gdcmImage - -You can see gdcm UML Class Diagram + 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);
    +
    + + +
  • Bug fixes + + +
  • A.P.I. breaking modifications (since previous version : 1.0) + + +
  • Known bugs + + + + + +
    +

    + + Version 1.0 (Feb 14 2005) +

    +
    @@ -121,28 +476,40 @@ You can see gdcm UML Class Diagram +
  • Improvement of the jpeg sub-library: jpeg + compressed Dicom files (lossless and lossy) + might be read (check-it out) @@ -152,6 +519,11 @@ You can see gdcm UML Class Diagram Version 0.4 (February 6 2004)