]> Creatis software - gdcm.git/commitdiff
Extend 'Restriction' syntax :
authorjpr <jpr>
Thu, 21 Jul 2005 05:00:15 +0000 (05:00 +0000)
committerjpr <jpr>
Thu, 21 Jul 2005 05:00:15 +0000 (05:00 +0000)
void SerieHelper::AddRestriction(uint16_t group, uint16_t elem,
                                 std::string const &value, int op)
op belongs to :

/// \brief comparaison operators
enum CompOperators {
   GDCM_EQUAL = 0,
   GDCM_DIFFERENT,
   GDCM_GREATER,
   GDCM_GREATEROREQUAL,
   GDCM_LESS,
   GDCM_LESSOREQUAL
};

src/gdcmSerieHelper.cxx
src/gdcmSerieHelper.h

index 030e1d8b8af6a93dc69acc562ed4031d5f76285b..bed98f31e83b515739624ca66ed67fb0da06f779 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmSerieHelper.cxx,v $
   Language:  C++
-  Date:      $Date: 2005/07/19 09:04:58 $
-  Version:   $Revision: 1.13 $
+  Date:      $Date: 2005/07/21 05:00:15 $
+  Version:   $Revision: 1.14 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -19,6 +19,7 @@
 #include "gdcmSerieHelper.h"
 #include "gdcmDirList.h"
 #include "gdcmFile.h"
+#include "gdcmDictEntry.h" // for TranslateToKey
 #include "gdcmDebug.h"
 #include "gdcmUtil.h"
 
@@ -91,18 +92,21 @@ void SerieHelper::AddFileName(std::string const &filename)
    header->SetLoadMode(LoadMode);
    header->SetFileName( filename ); 
    header->Load();
-   //File *header = new File( filename ); // Deprecated old style 
+
    if ( header->IsReadable() )
    {
       int allrules = 1;
-      // First step the user has defined a set of rules for the DICOM 
+      // First step the user has defined a set of rules for the DICOM file
       // he is looking for.
       // make sure the file correspond to his set of rules:
+
+/*
       for(SerieRestrictions::iterator it = Restrictions.begin();
           it != Restrictions.end();
           ++it)
       {
          const Rule &r = *it;
+         // doesn't compile (no matching function...).
          const std::string s;// = header->GetEntryValue( r.first );
          if ( !Util::DicomStringEqual(s, r.second.c_str()) )
          {
@@ -111,6 +115,23 @@ void SerieHelper::AddFileName(std::string const &filename)
            break;
          }
       }
+*/
+      // Just keep 'new style' for Rules
+      std::string s;
+      for(SerieExRestrictions::iterator it2 = ExRestrictions.begin();
+          it2 != ExRestrictions.end();
+          ++it2)
+      {
+         const ExRule &r = *it2;
+         s = header->GetEntryValue( r.group, r.elem );
+         if ( !Util::CompareDicomString(s, r.value.c_str(), r.op) )
+         {
+           // Argh ! This rule is unmatch let's just quit
+           allrules = 0;
+           break;
+         }
+      }
+
       if ( allrules ) // all rules are respected:
       {
          // Allright ! we have a found a DICOM that match the user expectation. 
@@ -197,12 +218,34 @@ void SerieHelper::AddGdcmFile(File *header)
       }
          // Even if a rule was unmatch we don't deallocate the gdcm::File:
 }
+
+
+/**
+ * \brief add a rules for restricting a DICOM file to be in the serie we are
+ * trying to find. For example you can select only the DICOM file from a
+ * directory which would have a particular EchoTime==4.0.
+ * This method is a user level, value is not required to be formatted as a DICOM
+ * string
+ */
+void SerieHelper::AddRestriction(uint16_t group, uint16_t elem, 
+                                 std::string const &value, int op)
+{
+   ExRule r;
+   r.group = group;
+   r.elem  = elem;
+   r.value = value;
+   r.op    = op;
+   ExRestrictions.push_back( r ); 
+}
+
+#ifndef GDCM_LEGACY_REMOVE
 /**
  * \brief add a rules for restricting a DICOM file to be in the serie we are
  * trying to find. For example you can select only the DICOM file from a
  * directory which would have a particular EchoTime==4.0.
  * This method is a user level, value is not required to be formatted as a DICOM
  * string
+ * @deprecated use : 
  */
 void SerieHelper::AddRestriction(TagKey const &key, std::string const &value)
 {
@@ -211,6 +254,7 @@ void SerieHelper::AddRestriction(TagKey const &key, std::string const &value)
    r.second = value;
    Restrictions.push_back( r ); 
 }
+#endif
 
 /**
  * \brief Sets the root Directory
index b6827f66486fb9ac8fe8779cd925d5a95daf495b..ef9036b8f63d9464a32b2d8a1b0cde4aeb13449f 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmSerieHelper.h,v $
   Language:  C++
-  Date:      $Date: 2005/07/19 09:04:58 $
-  Version:   $Revision: 1.13 $
+  Date:      $Date: 2005/07/21 05:00:30 $
+  Version:   $Revision: 1.14 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -20,7 +20,8 @@
 #define GDCMSERIEHELPER_H
 
 #include "gdcmCommon.h" 
-
+#include "gdcmDebug.h"  // for LEGACY
 #include <vector>
 #include <iostream>
 #include <map>
@@ -67,7 +68,9 @@ public:
 
    /// All the following allow user to restrict DICOM file to be part
    /// of a particular serie
-   void AddRestriction(TagKey const &key, std::string const &value);
+   GDCM_LEGACY( void AddRestriction(TagKey const &key, std::string const &value) );
+   void AddRestriction(uint16_t group, uint16_t elem, 
+                       std::string const &value, int op);
   
 /**
  * \brief Sets the LoadMode as a boolean string. 
@@ -95,6 +98,16 @@ private:
    typedef std::pair<TagKey, std::string> Rule;
    typedef std::vector<Rule> SerieRestrictions;
    SerieRestrictions Restrictions;
+   
+   // New style for (extented) Rules (Moreover old one doesn't compile)
+   typedef struct {
+      uint16_t group;
+      uint16_t elem;
+      std::string value;
+      int op;
+   } ExRule;
+   typedef std::vector<ExRule> SerieExRestrictions;
+   SerieExRestrictions ExRestrictions;
 
    /// \brief Bit string integer (each one considered as a boolean)
    ///        Bit 0 : Skip Sequences,    if possible