int ReplaceEntry(gdcmDictEntry* NewEntry);
int RemoveEntry (TagKey k);
int RemoveEntry (guint16 group, guint16 element);
-
// renvoie une ligne de Dictionnaire Dicom à partir de (numGroup, numElement)
gdcmDictEntry * GetTag(guint32 group, guint32 element);
+
void Print(ostream&);
TagHT & GetEntries(void) { return entries; }
};
string GetName(void) { return entry->GetName(); };
string GetVR(void) { return entry->GetVR(); };
-
void SetVR(string v) { entry->SetVR(v); };
// Question :
FILE * fp;
// The tag Image Location (0028,0200) - containing the address of
// the pixels - is not allways present. Then we store this information
-
+ // il etait facultatif en ACR-NEMA, il n'existe plus en DICOM 3
// FIXME
// Question :
}
void ElValSet::Add(ElValue * newElValue) {
- tagHt[newElValue->GetKey()] = newElValue;
+ tagHt [newElValue->GetKey()] = newElValue;
NameHt[newElValue->GetName()] = newElValue;
}
guint16 gr, el;
guint32 lgr;
+
const char * val;
+ string vr;
+ guint32 val_int32;
+ guint16 val_int16;
+ void *ptr;
+
// A FAIRE :
// parcourir la table pour recalculer la longueur des 'elements 0x0000'
for (TagElValueHT::iterator tag = tagHt.begin();
tag != tagHt.end();
++tag){
-
+
+ / ...
}
*/
// resteront à tester les echecs en écriture
+
for (TagElValueHT::iterator tag = tagHt.begin();
tag != tagHt.end();
++tag){
// peut-on se passer des affectations?
// - passer l'adresse du resultat d'une fonction (???)
// - acceder au champ sans passer par un accesseur ?
+
gr = tag->second->GetGroup();
el = tag->second->GetElement();
lgr = tag->second->GetLength();
val = tag->second->GetValue().c_str();
-
+ vr = tag->second->GetVR();
+
fwrite ( &gr,(size_t)2 ,(size_t)1 ,_fp); //group
fwrite ( &el,(size_t)2 ,(size_t)1 ,_fp); //element
- //fwrite ( tag->second->GetVR(),(size_t)2 ,(size_t)1 ,_fp); //VR
+ //fwrite ( vr,(size_t)2 ,(size_t)1 ,_fp); //VR
// voir pb lgr + VR
+ // On fait de l'implicit VR (penser a forcer le SYNTAX TRANSFERT UID)
fwrite ( &lgr,(size_t)4 ,(size_t)1 ,_fp); //lgr
-
- // ATTENTION
- // voir pb des int16 et int32 : les identifier, les convertir, modifier la longueur
- // ou alors stocker la valeur 16 ou 32 bits, + un indicateur : char, int16, int32
+ if (vr == "US" || vr == "SS") {
+ val_int16 = atoi(val);
+ ptr = &val_int16;
+ fwrite ( ptr,(size_t)2 ,(size_t)1 ,_fp);
+ continue;
+ }
+ if (vr == "UL" || vr == "SL") {
+ val_int32 = atoi(val);
+ ptr = &val_int32;
+ fwrite ( ptr,(size_t)4 ,(size_t)1 ,_fp);
+ continue;
+ }
+
+ // Les pixels ne sont pas chargés dans l'element !
+ if ((gr == 0x7fe0) && (el == 0x0010) ) break;
+
fwrite ( val,(size_t)lgr ,(size_t)1 ,_fp); //valeur Elem
}
+
return(1);
}
#include "gdcm.h"
-#define DEBUG 1
-
static void _Swap(void* im, int swap, int lgr, int nb);
/////////////////////////////////////////////////////////////////
*deb = (*deb >> (nbu-highBit-1)) & mask;
deb ++;
}
- }
-
- printf ("on est sorti\n");
-
+ }
// On l'affecte à un champ du dcmFile
Pixels = _Pixels;
filePreamble=(char*)calloc(128,1);
fwrite(filePreamble,128,1,fp1);
fwrite("DICM",4,1,fp1);
- if(DEBUG) printf("Ecriture File Preamble\n");
// un accesseur de + est obligatoire ???
+ // pourtant le ElValSet contenu dans le gdcmHeader
+ // ne devrait pas être visible par l'utilisateur final (?)
GetPubElVals().Write(fp1);
+
+ fwrite(Pixels, lgrTotale, 1, fp1);
fclose (fp1);
return(1);
#include <sstream>
#include "gdcmUtil.h"
-#define HEADER_LENGTH_TO_READ 256 // on ne lit plus que le debut
-
-#define DEBUG 1
+#define HEADER_LENGTH_TO_READ 256 // on ne lit plus que le debut
+#define _MaxSizeLoadElementValue_ 1024 // longueur au dela de laquelle on ne charge plus les valeurs
namespace Error {
struct FileReadError {
}
gdcmHeader::gdcmHeader (const char* InFilename) {
- SetMaxSizeLoadElementValue(1024);
+ SetMaxSizeLoadElementValue(_MaxSizeLoadElementValue_);
filename = InFilename;
Initialise();
fp=fopen(InFilename,"rw");
void gdcmHeader::GetPixels(size_t lgrTotale, void* _Pixels) {
size_t pixelsOffset;
pixelsOffset = GetPixelOffset();
- printf("pixelsOffset %d\n",pixelsOffset);
fseek(fp, pixelsOffset, SEEK_SET);
fread(_Pixels, 1, lgrTotale, fp);
}
// Il y en a encore DIX-SEPT, comme ça.
// Il faudrait trouver qq chose + rusé ...
//
-
-
+// --> probablement TOUS les supprimer (Eric dixit)
+//
void gdcmHeader::FixFoundLength(ElValue * ElVal, guint32 FoundLength) {
// Heuristic: a final fix.
if ( FoundLength == 0xffffffff)
// The group length doesn't represent data to be loaded in memory, since
// each element of the group shall be loaded individualy.
if( elem == 0 )
- SkipLoad = true;
+ //SkipLoad = true; // modif sauvage JPR
if ( SkipLoad ) {
// FIXME the following skip is not necessary
*/
void gdcmHeader::LoadElements(void) {
- if (DEBUG) printf("LoadElements : Entree\n");
-
rewind(fp);
- if (DEBUG) printf("LoadElements : rewind\n");
TagElValueHT ht = PubElVals.GetTagHt();
- if (DEBUG) printf("LoadElements : GetTagHt\n");
-
for (TagElValueHT::iterator tag = ht.begin(); tag != ht.end(); ++tag) {
LoadElementValue(tag->second);
}