X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src2%2FcreaImageIOTreeDescriptor.cpp;h=d2cfd2fe593027d37120c3c9b417d1a02da3202a;hb=da80530068246081505e9649523d10e8da8e6acd;hp=602ffabac3ce2b536fc3fafc6b8bf165e5f3a308;hpb=c6b0d7086b5adbeaa6ea97929068fb80e003091f;p=creaImageIO.git diff --git a/src2/creaImageIOTreeDescriptor.cpp b/src2/creaImageIOTreeDescriptor.cpp index 602ffab..d2cfd2f 100644 --- a/src2/creaImageIOTreeDescriptor.cpp +++ b/src2/creaImageIOTreeDescriptor.cpp @@ -1,4 +1,11 @@ #include +#include +#include +#include +#include + + +#include namespace creaImageIO @@ -12,6 +19,9 @@ namespace creaImageIO const unsigned int AttributeDescriptor::PRIVATE = 1; /// The attribute enters in unique identifier constitution const unsigned int AttributeDescriptor::IDENTIFIER = 2; + /// The attribute can be edited + const unsigned int AttributeDescriptor::EDITABLE = 3; + /// the attribute describes the node const unsigned int AttributeDescriptor::LABEL = 4; //================================================================== @@ -50,24 +60,24 @@ namespace creaImageIO // Patient level Add(LevelDescriptor("Patient")); - Add(AttributeDescriptor("NumberOfChildren","#Series",0),1); // Number of Series + Add(AttributeDescriptor("NumberOfChildren","#Series",0),1); // Number of Series Add(AttributeDescriptor(0x0010,0x0010, // Patient name AttributeDescriptor::LABEL),1); Add(AttributeDescriptor(0x0010,0x0040),1); // Patient sex Add(AttributeDescriptor(0x0010,0x0030),1); // Patient birthday Add(AttributeDescriptor(0x0010,0x0020, // Patient ID AttributeDescriptor::IDENTIFIER),1); - + // Study-series level Add(LevelDescriptor("Series")); - Add(AttributeDescriptor("NumberOfChildren","#Images",0),2); // Number of images + Add(AttributeDescriptor("NumberOfChildren","#Images",0),2); // Number of images Add(AttributeDescriptor(0x0008,0x0060, // Modality AttributeDescriptor::LABEL),2); Add(AttributeDescriptor(0x0008,0x1030),2); // Study Description Add(AttributeDescriptor(0x0008,0x103E),2); // Description Add(AttributeDescriptor(0x0008,0x0080),2); // Institution Name Add(AttributeDescriptor(0x0008,0x0081),2); // Institution Adress - Add(AttributeDescriptor(0x0008,0x1010),2); // Station Name + Add(AttributeDescriptor(0x0008,0x1010),2); // Station Name Add(AttributeDescriptor(0x0008,0x1048),2); // Physician of Record Add(AttributeDescriptor(0x0008,0x1050),2); // Performing Physician's Name Add(AttributeDescriptor(0x0018,0x1030),2); // Protocol Name @@ -83,9 +93,9 @@ namespace creaImageIO Add(AttributeDescriptor(0x0020,0x000D // Study Instance UID ),2);//AttributeDescriptor::IDENTIFIER),2); Add(AttributeDescriptor(0x0020,0x000E, // Series Instance UID - AttributeDescriptor::IDENTIFIER),2); + AttributeDescriptor::IDENTIFIER),2); // | - // AttributeDescriptor::LABEL),2); + // AttributeDescriptor::LABEL),2); // Image level @@ -117,21 +127,100 @@ namespace creaImageIO Add(AttributeDescriptor(0x0020,0x4000),3); // Image Comments Add(AttributeDescriptor(0x0004,0x1500, // File Name - AttributeDescriptor::LABEL),3); + AttributeDescriptor::LABEL),3); Add(AttributeDescriptor(0x0028,0x1052),3); // Rescale Intercept Add(AttributeDescriptor(0x0028,0x1053),3); // Rescale Slope Add(AttributeDescriptor(0x0050,0x0004),3); // Calibration Image Add(AttributeDescriptor(0x0020,0x0052 // Frame Reference UID - ),3); + ),3); Add(AttributeDescriptor(0x0008,0x0016),3); // SOP Class UID Add(AttributeDescriptor("FullFileName", // Full file name - "Full file name", - AttributeDescriptor::IDENTIFIER),3); - - + "Full file name", + AttributeDescriptor::IDENTIFIER),3); + } + + ////////////////////////////////////////////////////////////// + // create a descriptor (name, attributes...) from a file) // + // @param : file path // + // return : - // + ////////////////////////////////////////////////////////////// + void Descriptor::createDescriptorfromFile(const std::string &i_name) + { + Clear(); + + // read file and put in buffer + std::ifstream i_file(i_name.c_str()); + std::stringstream buffer; + buffer << i_file.rdbuf(); + std::string line; + bool bname; + int ilevel = -1; + + + while(std::getline(buffer, line)) + { + if(line =="") + { //increment levels. + ilevel++; + bname = true; + } + else if(bname) + { + // For each level, a name to describe it + Add(LevelDescriptor(line)); + bname = false; + } + else + { + // split line to find all tags + std::vector descriptors; + std::string separator = " "; + std::string::size_type last_pos = line.find_first_not_of(separator); + //find first separator + std::string::size_type pos = line.find_first_of(separator, last_pos); + while(std::string::npos != pos || std::string::npos != last_pos) + { + descriptors.push_back(line.substr(last_pos, pos - last_pos)); + last_pos = line.find_first_not_of(separator, pos); + pos = line.find_first_of(separator, last_pos); + } + + // By default, the last tag is at zero and not recorded but if take in count + unsigned int flag = 0; + if(descriptors.size() == 4) + { + std::stringstream val; + val << std::dec << descriptors[3]; + val>> flag; + } + + // if Dicom tag, use "group" and "element" descriptor + if(descriptors[0] == "D") + { std::stringstream val, val2; + unsigned short group; + unsigned short element; + val << std::dec << descriptors[1] ; + val >> std::hex >> group; + val2 << std::dec << descriptors[2]; + val2 >> std::hex >> element; + Add(AttributeDescriptor( group,element,flag), ilevel); + } + + else if(descriptors[0].find("#") != -1) + { + // commented line continue to next line + } + else + { boost::algorithm::replace_all(descriptors[2],"_"," "); + Add(AttributeDescriptor( descriptors[1].c_str(),descriptors[2].c_str(),flag), ilevel); + } + } + } + } + //================================================================== //================================================================== @@ -157,6 +246,7 @@ namespace creaImageIO { mLevelDescriptorList.clear(); } + //================================================================== //================================================================== @@ -178,6 +268,5 @@ namespace creaImageIO } } } - } }