Skip to content
Commits on Source (5)
......@@ -32,6 +32,10 @@
#include "gdcmTrace.h"
#include "gdcmVersion.h"
#include "gdcmSimpleSubjectWatcher.h"
#include "gdcmGlobal.h"
#include "gdcmDicts.h"
#include "gdcmDict.h"
#include "gdcmDictEntry.h"
#include <string>
#include <iostream>
......@@ -57,10 +61,13 @@ static void PrintHelp()
std::cout << "Parameter (required):" << std::endl;
std::cout << " -d --dir DICOM directory" << std::endl;
std::cout << " -t --tag %d,%d DICOM tag(s) to look for" << std::endl;
std::cout << " -k --keyword %s DICOM keyword(s) to look for" << std::endl;
std::cout << " -P --private-tag %d,%d,%s DICOM private tag(s) to look for" << std::endl;
std::cout << "Options:" << std::endl;
std::cout << " -p --print Print output." << std::endl;
std::cout << " -r --recursive Recusively descend directory." << std::endl;
std::cout << " -r --recursive Recursively descend directory." << std::endl;
std::cout << " --strict Use strict parser (faster but less tolerant with bogus DICOM files)." << std::endl;
std::cout << " --table Use Table output." << std::endl;
std::cout << "General Options:" << std::endl;
std::cout << " -V --verbose more verbose (warning+error)." << std::endl;
std::cout << " -W --warning print warning info." << std::endl;
......@@ -75,7 +82,7 @@ typedef std::vector<gdcm::PrivateTag> VectorPrivateTags;
template < typename TScanner >
static int DoIt(
gdcm::Directory const & d,
bool const & print ,
bool const & print , int table,
VectorTags const & tags,
VectorPrivateTags const & privatetags)
{
......@@ -96,7 +103,13 @@ static int DoIt(
std::cerr << "Scanner failed" << std::endl;
return 1;
}
if (print) s.Print( std::cout );
if (print)
{
if(table)
s.PrintTable( std::cout );
else
s.Print( std::cout );
}
return 0;
}
......@@ -114,8 +127,12 @@ int main(int argc, char *argv[])
VectorPrivateTags privatetags;
gdcm::Tag tag;
gdcm::PrivateTag privatetag;
static const gdcm::Global &g = gdcm::Global::GetInstance();
static const gdcm::Dicts &dicts = g.GetDicts();
static const gdcm::Dict &pubdict = dicts.GetPublicDict();
int strict = 0;
int table = 0;
int verbose = 0;
int warning = 0;
int debug = 0;
......@@ -127,25 +144,27 @@ int main(int argc, char *argv[])
//int this_option_optind = optind ? optind : 1;
int option_index = 0;
static struct option long_options[] = {
{"dir", 1, nullptr, 0},
{"tag", 1, nullptr, 0},
{"recursive", 1, nullptr, 0},
{"print", 1, nullptr, 0},
{"private-tag", 1, nullptr, 0},
{"strict", 0, &strict, 1},
{"dir", required_argument, nullptr, 'd'},
{"tag", required_argument, nullptr, 't'},
{"recursive", no_argument, nullptr, 'r'},
{"print", no_argument, nullptr, 'p'},
{"private-tag", required_argument, nullptr, 'P'},
{"keyword", required_argument, nullptr, 'k'},
{"strict", no_argument, &strict, 1},
{"table", no_argument, &table, 1},
// General options !
{"verbose", 0, &verbose, 1},
{"warning", 0, &warning, 1},
{"debug", 0, &debug, 1},
{"error", 0, &error, 1},
{"help", 0, &help, 1},
{"version", 0, &version, 1},
{"verbose", no_argument, nullptr, 'V'},
{"warning", no_argument, nullptr, 'W'},
{"debug", no_argument, nullptr, 'D'},
{"error", no_argument, nullptr, 'E'},
{"help", no_argument, nullptr, 'H'},
{"version", no_argument, nullptr, 'v'},
{nullptr, 0, nullptr, 0}
};
c = getopt_long (argc, argv, "d:t:rpP:VWDEhv",
c = getopt_long (argc, argv, "d:t:rpP:k:VWDEhv",
long_options, &option_index);
if (c == -1)
{
......@@ -155,18 +174,10 @@ int main(int argc, char *argv[])
switch (c)
{
case 0:
if (optarg)
{
//const char *s = long_options[option_index].name;
//printf ("option %s", s);
//if (optarg)
// {
// if( option_index == 0 ) /* input */
// {
// assert( strcmp(s, "input") == 0 );
// }
// printf (" with arg %s", optarg);
// }
//printf ("\n");
const char *s = long_options[option_index].name; (void)s;
assert(0);
}
break;
......@@ -180,6 +191,20 @@ int main(int argc, char *argv[])
//std::cerr << optarg << std::endl;
break;
case 'k':
{
const char * keyword = optarg;
/*const gdcm::DictEntry &dictentry =*/ pubdict.GetDictEntryByKeyword(keyword, tag);
if( tag != gdcm::Tag(0xffff,0xffff) )
tags.push_back( tag );
else
{
std::cerr << "Invalid keyword: " << keyword << std::endl;
return 1;
}
}
break;
case 'P':
privatetag.ReadFromCommaSeparatedString(optarg);
privatetags.push_back( privatetag );
......@@ -290,10 +315,16 @@ int main(int argc, char *argv[])
gdcm::Directory d;
unsigned int nfiles = d.Load( dirname.c_str(), recursive );
if( !nfiles )
{
std::cerr << "No files found in: " << dirname << std::endl;
return 1;
}
if( verbose ) d.Print( std::cout );
if( !table )
std::cout << "done retrieving file list " << nfiles << " files found." << std::endl;
if( strict )
return DoIt<gdcm::StrictScanner>(d,print,tags,privatetags);
return DoIt<gdcm::Scanner>(d,print,tags,privatetags);
return DoIt<gdcm::StrictScanner>(d,print,table,tags,privatetags);
return DoIt<gdcm::Scanner>(d,print,table,tags,privatetags);
}
......@@ -17,7 +17,7 @@ endif()
#----------------------------------------------------------------------------
project(GDCM
VERSION 3.0.2
VERSION 3.0.3
LANGUAGES CXX C
)
## NOTE: the "DESCRIPTION" feature of project() was introduced in cmake 3.10.0
......@@ -590,22 +590,6 @@ if(GDCM_STANDALONE)
else()
set(BUILD_APPLICATIONS OFF)
endif()
add_subdirectory(Utilities)
add_subdirectory(Source)
if(GDCM_STANDALONE)
add_subdirectory(Wrapping)
if(GDCM_WRAP_CSHARP)
add_subdirectory(Wrapping/Csharp)
endif()
endif()
if(GDCM_STANDALONE)
# After Wrapping please
if(BUILD_EXAMPLES)
add_subdirectory(Examples)
endif()
endif()
#-----------------------------------------------------------------------------
# Need pthread for the following class:
......@@ -618,7 +602,7 @@ if(GDCM_STANDALONE)
endif()
if(GDCM_STANDALONE)
if(BUILD_TESTING)
if(GDCM_BUILD_TESTING)
configure_file(${GDCM_SOURCE_DIR}/CMake/CTestCustom.ctest.in
${GDCM_BINARY_DIR}/CMake/CTestCustom.ctest @ONLY)
file(WRITE ${GDCM_BINARY_DIR}/CTestCustom.cmake
......@@ -635,6 +619,21 @@ if(GDCM_STANDALONE)
endif()
endif()
# After enable_testing()
add_subdirectory(Utilities)
add_subdirectory(Source)
if(GDCM_STANDALONE)
add_subdirectory(Wrapping)
endif()
if(GDCM_STANDALONE)
# After Wrapping please
if(BUILD_EXAMPLES)
add_subdirectory(Examples)
endif()
endif()
#-----------------------------------------------------------------------------
if(GDCM_STANDALONE)
option(GDCM_DOCUMENTATION "Build source documentation using doxygen." OFF)
......@@ -680,6 +679,11 @@ include(CMake/InstallRequiredVTKLibraries.cmake)
endif()
endif()
# Make sure to run doxygen after everything else (in particular vtkgdcm):
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Utilities/doxygen)
add_subdirectory(Utilities/doxygen)
endif()
#-----------------------------------------------------------------------------
# CPack stuff
if(GDCM_STANDALONE) # disabled for ITK distribution of gdcm
......
......@@ -35,6 +35,7 @@ set(EXAMPLES_SRCS
PrintLUT
EmptyMask
DumpSiemensBase64
DumpVisusChange
TemplateEmptyImage
MakeTemplate
DeriveSeries
......
/*=========================================================================
Program: GDCM (Grassroots DICOM). A DICOM library
Copyright (c) 2006-2011 Mathieu Malaterre
All rights reserved.
See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
#include "gdcmReader.h"
#include "gdcmDirectory.h"
#include "gdcmStringFilter.h"
#include <vector>
#include <algorithm>
/*
*/
static bool process( std::vector<gdcm::DataElement> & ms, const char * filename)
{
using namespace gdcm;
Tag pd(0x7fe0,0x0000);
std::set<gdcm::Tag> skiptags;
skiptags.insert( pd );
gdcm::Reader reader;
reader.SetFileName( filename );
if( !reader.ReadUpToTag( pd, skiptags ) )
{
std::cerr << "Failure to read: " << filename << std::endl;
return false;
}
gdcm::File &file = reader.GetFile();
gdcm::DataSet &ds1 = file.GetDataSet();
const gdcm::PrivateTag tseq1(0x5533,0x33,"Visus Change");
if( !ds1.FindDataElement( tseq1 ) ) return true;
const gdcm::DataElement& seq1 = ds1.GetDataElement( tseq1 );
SmartPointer<SequenceOfItems> sqi1 = seq1.GetValueAsSQ();
const size_t nitems = sqi1->GetNumberOfItems();
for( size_t item = 1; item < nitems; ++item )
{
Item &item1 = sqi1->GetItem(item);
DataSet &ds2 = item1.GetNestedDataSet();
for(DataSet::ConstIterator it = ds2.Begin(); it != ds2.End(); ++it )
{
DataElement const & de = *it;
// cannot simply use std::set here, see there is a discrepancy in between
// operator== and operator<.
// So only use operator== here:
std::vector<DataElement>::iterator vit = std::find(ms.begin(), ms.end(), de);
if( vit == ms.end() )
ms.push_back(de);
}
}
return true;
}
int main(int argc, char *argv[])
{
bool usefastpath = true;
if( argc < 2 ) return 1;
using namespace gdcm;
const char *filename = argv[1];
gdcm::Directory::FilenamesType filenames;
if( !gdcm::System::FileExists(filename) )
{
std::cerr << "Could not find file: " << filename << std::endl;
return 1;
}
gdcm::Directory dir;
if( gdcm::System::FileIsDirectory(filename) )
{
unsigned int nfiles = dir.Load(filename, false);
if( nfiles == 0 )
{
std::cerr << "Could not find files: " << filename << std::endl;
return 1;
}
filenames = dir.GetFilenames();
}
else
{
filenames.push_back( filename );
}
gdcm::StringFilter sf;
Tag pd(0x7fe0,0x0000);
std::set<gdcm::Tag> skiptags;
skiptags.insert( pd );
gdcm::Reader reader;
reader.SetFileName( filenames[0].c_str() );
if( !reader.ReadUpToTag( pd, skiptags ) )
{
std::cerr << "Could not read file: " << filename << std::endl;
return 1;
}
gdcm::File &file = reader.GetFile();
sf.SetFile(file);
if( usefastpath ) {
// Heuristic, assume if private tag cannot be found in first file, skip the directory
gdcm::DataSet &ds1 = file.GetDataSet();
const gdcm::PrivateTag tseq1(0x5533,0x33,"Visus Change");
if( !ds1.FindDataElement( tseq1 ) ){
std::cerr << "Could not find private tag in first file skipping whole directory: " << filename << std::endl;
return 0;
}
}
std::vector<DataElement> ms;
for(gdcm::Directory::FilenamesType::const_iterator cit = filenames.begin(); cit != filenames.end(); ++cit )
{
if( !process(ms, cit->c_str()) ) {
return 1;
}
}
if( !ms.empty() ) {
std::sort(ms.begin(), ms.end());
std::cout << filename << ",\"";
for(std::vector<DataElement>::const_iterator it = ms.begin(); it != ms.end(); ++it )
{
DataElement const & de = *it;
std::string const & s = sf.ToString( de );
std::cout << de.GetTag() << " " << s << std::endl;
}
std::cout << "\"" << std::endl;
}
return 0;
}
......@@ -40,7 +40,7 @@ unsigned int Directory::Load(FilenameType const &name, bool recursive)
Toplevel = name;
return Explore( Toplevel, recursive );
}
return false;
return 0;
}
unsigned int Directory::Explore(FilenameType const &name, bool recursive)
......
......@@ -38,6 +38,18 @@ typedef struct
} DICT_ENTRY;
 
static const DICT_ENTRY DICOMV3DataDict [] = {
{0x7fe1,0x0001,"Bioclinica",VR::UT,VM::VM1,"??",false},
{0x7fe1,0x0002,"Bioclinica",VR::LO,VM::VM1,"??",false},
{0x7fe1,0x0003,"Bioclinica",VR::LO,VM::VM1,"??",false},
{0x5533,0x0033,"Visus Change",VR::SQ,VM::VM1,"Visus Data Save Sequence",false},
{0x5533,0x0035,"Visus Change",VR::DA,VM::VM1,"Visus Data Save Date",false},
{0x5533,0x0037,"Visus Change",VR::LO,VM::VM1,"Visus Data Save Originator",false},
{0x5533,0x0039,"Visus Change",VR::FD,VM::VM1,"Visus Data Save ID",false},
{0x5533,0x003b,"Visus Change",VR::TM,VM::VM1,"?Visus Data Save Time?",false},
{0x0071,0x0021,"SIEMENS MED PT",VR::UI,VM::VM1,"Registration Matrix UID",false},
{0x0071,0x0022,"SIEMENS MED PT",VR::DT,VM::VM1,"Decay Correction DateTime",false},
{0x0071,0x0023,"SIEMENS MED PT",VR::FD,VM::VM16,"Registration Matrix",false},
{0x0071,0x0024,"SIEMENS MED PT",VR::CS,VM::VM1,"Table Motion",false},
{0x0021,0x0001,"SIEMENS MR SDR 01",VR::LO,VM::VM1,"??",false},
{0x0021,0x0001,"SIEMENS MR SDS 01",VR::IS,VM::VM1,"??",false},
{0x0021,0x0002,"SIEMENS MR SDR 01",VR::LO,VM::VM1,"??",false},
......@@ -310,6 +322,7 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0x0019,0x0050,"PMTF INFORMATION DATA^10",VR::SL,VM::VM2,"?",false },
{0x0019,0x0051,"PMTF INFORMATION DATA^10",VR::SL,VM::VM2,"?",false },
{0x0019,0x0052,"PMTF INFORMATION DATA^10",VR::LO,VM::VM1,"?",false },
{0x0019,0x0052,"PMTF INFORMATION DATA^12",VR::FL,VM::VM2,"?",false },
{0x0019,0x0054,"PMTF INFORMATION DATA^10",VR::US,VM::VM1,"?",false },
{0x0019,0x0055,"PMTF INFORMATION DATA^10",VR::US,VM::VM1,"?",false },
{0x0019,0x0055,"PMTF INFORMATION DATA^11",VR::LO,VM::VM1,"?",false },
......@@ -326,10 +339,13 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0x0019,0x005d,"PMTF INFORMATION DATA^11",VR::SL,VM::VM1,"?",false },
{0x0019,0x005e,"PMTF INFORMATION DATA^10",VR::SL,VM::VM1,"?",false },
{0x0019,0x005f,"PMTF INFORMATION DATA^10",VR::FL,VM::VM1,"?",false },
{0x0019,0x005f,"PMTF INFORMATION DATA^11",VR::FL,VM::VM1,"?",false },
{0x0019,0x0060,"PMTF INFORMATION DATA^10",VR::US,VM::VM1,"?",false },
{0x0019,0x0060,"PMTF INFORMATION DATA^11",VR::SL,VM::VM1,"?",false },
{0x0019,0x0061,"PMTF INFORMATION DATA^10",VR::US,VM::VM1,"?",false },
{0x0019,0x0061,"PMTF INFORMATION DATA^11",VR::FL,VM::VM1,"?",false },
{0x0019,0x0062,"PMTF INFORMATION DATA^10",VR::US,VM::VM1,"?",false },
{0x0019,0x0062,"PMTF INFORMATION DATA^11",VR::FL,VM::VM1,"?",false },
{0x0019,0x0063,"PMTF INFORMATION DATA^10",VR::FL,VM::VM1,"?",false },
{0x0019,0x0063,"PMTF INFORMATION DATA^11",VR::SL,VM::VM1,"?",false },
{0x0019,0x0064,"PMTF INFORMATION DATA^10",VR::FL,VM::VM1,"?",false },
......@@ -348,7 +364,10 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0x0019,0x006f,"PMTF INFORMATION DATA^10",VR::SL,VM::VM1,"?",false },
{0x0019,0x006f,"PMTF INFORMATION DATA^11",VR::FL,VM::VM1,"?",false },
{0x0019,0x0070,"PMTF INFORMATION DATA^10",VR::LO,VM::VM1,"?",false },
{0x0019,0x0070,"PMTF INFORMATION DATA^11",VR::FL,VM::VM1,"?",false },
{0x0019,0x0071,"PMTF INFORMATION DATA^10",VR::LO,VM::VM1,"?Sequence Options?",false },
{0x0019,0x0071,"PMTF INFORMATION DATA^11",VR::SL,VM::VM1,"?",false },
{0x0019,0x0072,"PMTF INFORMATION DATA^11",VR::FL,VM::VM1,"?",false },
{0x0019,0x0073,"PMTF INFORMATION DATA^10",VR::LO,VM::VM1,"?Sequence Options?",false },
{0x0019,0x0075,"PMTF INFORMATION DATA^10",VR::LO,VM::VM1,"?",false },
{0x0019,0x0076,"PMTF INFORMATION DATA^10",VR::LO,VM::VM1,"?",false },
......@@ -382,8 +401,10 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0x0019,0x008a,"PMTF INFORMATION DATA^10",VR::SL,VM::VM1_n,"?",false },
{0x0019,0x008a,"PMTF INFORMATION DATA^11",VR::US,VM::VM1,"?",false },
{0x0019,0x008a,"PMTF INFORMATION DATA^12",VR::US,VM::VM1,"Series Number Global",false },
{0x0019,0x008b,"PMTF INFORMATION DATA^11",VR::SL,VM::VM1,"?",false },
{0x0019,0x008b,"PMTF INFORMATION DATA^12",VR::US,VM::VM1,"?",false },
{0x0019,0x008c,"PMTF INFORMATION DATA^10",VR::UL,VM::VM1,"?",false },
{0x0019,0x008c,"PMTF INFORMATION DATA^11",VR::SL,VM::VM1,"?",false },
{0x0019,0x008d,"PMTF INFORMATION DATA^10",VR::TM,VM::VM1,"?",false },
{0x0019,0x008e,"PMTF INFORMATION DATA^10",VR::SL,VM::VM1,"?",false },
{0x0019,0x008f,"PMTF INFORMATION DATA^11",VR::SL,VM::VM1,"?",false },
......@@ -405,7 +426,7 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0x0019,0x009a,"PMTF INFORMATION DATA^12",VR::DS,VM::VM1,"Series Number Local",false },
{0x0019,0x009b,"PMTF INFORMATION DATA^10",VR::FL,VM::VM3,"?",false },
{0x0019,0x009b,"PMTF INFORMATION DATA^11",VR::US,VM::VM1,"?",false },
{0x0019,0x009b,"PMTF INFORMATION DATA^12",VR::DS,VM::VM1,"?",false },
{0x0019,0x009b,"PMTF INFORMATION DATA^12",VR::DS,VM::VM1,"?",false }, // Sometimes IS
{0x0019,0x009c,"PMTF INFORMATION DATA^10",VR::SL,VM::VM1,"?",false },
{0x0019,0x009c,"PMTF INFORMATION DATA^11",VR::FL,VM::VM1,"?",false },
{0x0019,0x009c,"PMTF INFORMATION DATA^12",VR::DS,VM::VM1,"?num?",false },
......@@ -443,6 +464,7 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0x0019,0x00ab,"PMTF INFORMATION DATA^12",VR::FL,VM::VM3,"?",false },
{0x0019,0x00ac,"PMTF INFORMATION DATA^10",VR::US,VM::VM1,"?",false },
{0x0019,0x00ac,"PMTF INFORMATION DATA^12",VR::FL,VM::VM3,"?",false },
{0x0019,0x00ad,"PMTF INFORMATION DATA^10",VR::FL,VM::VM1,"?",false },
{0x0019,0x00ad,"PMTF INFORMATION DATA^11",VR::SL,VM::VM1,"?",false },
{0x0019,0x00ad,"PMTF INFORMATION DATA^12",VR::FL,VM::VM3,"?",false },
{0x0019,0x00ae,"PMTF INFORMATION DATA^10",VR::FL,VM::VM1,"?",false },
......@@ -451,6 +473,7 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0x0019,0x00af,"PMTF INFORMATION DATA^10",VR::SL,VM::VM1,"?",false },
{0x0019,0x00af,"PMTF INFORMATION DATA^12",VR::FL,VM::VM3,"?",false },
{0x0019,0x00b0,"PMTF INFORMATION DATA^10",VR::SL,VM::VM1,"?",false },
{0x0019,0x00b0,"PMTF INFORMATION DATA^11",VR::FL,VM::VM1,"?",false },
{0x0019,0x00b1,"PMTF INFORMATION DATA^10",VR::SL,VM::VM1,"?",false },
{0x0019,0x00b1,"PMTF INFORMATION DATA^11",VR::SL,VM::VM1,"?",false },
{0x0019,0x00b2,"PMTF INFORMATION DATA^11",VR::US,VM::VM1,"?",false },
......@@ -468,9 +491,14 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0x0019,0x00b9,"PMTF INFORMATION DATA^11",VR::US,VM::VM1,"?",false },
{0x0019,0x00ba,"PMTF INFORMATION DATA^10",VR::FL,VM::VM1,"?",false },
{0x0019,0x00bb,"PMTF INFORMATION DATA^10",VR::FL,VM::VM1,"?",false },
{0x0019,0x00bb,"PMTF INFORMATION DATA^11",VR::FL,VM::VM1,"?",false },
{0x0019,0x00bc,"PMTF INFORMATION DATA^10",VR::FL,VM::VM2,"?",false },
{0x0019,0x00bc,"PMTF INFORMATION DATA^11",VR::SL,VM::VM1,"?",false },
{0x0019,0x00bd,"PMTF INFORMATION DATA^10",VR::SL,VM::VM1,"?",false },
{0x0019,0x00bd,"PMTF INFORMATION DATA^11",VR::SL,VM::VM1,"?",false },
{0x0019,0x00be,"PMTF INFORMATION DATA^10",VR::SL,VM::VM1,"Acquisition Duration",false },
{0x0019,0x00be,"PMTF INFORMATION DATA^11",VR::FL,VM::VM1_n,"?",false },
{0x0019,0x00bf,"PMTF INFORMATION DATA^11",VR::SL,VM::VM1,"?",false },
{0x0019,0x00c0,"PMTF INFORMATION DATA^11",VR::SL,VM::VM1,"?",false },
{0x0019,0x00c1,"PMTF INFORMATION DATA^10",VR::SL,VM::VM1,"?",false },
{0x0019,0x00c1,"PMTF INFORMATION DATA^11",VR::US,VM::VM1,"?",false },
......@@ -488,10 +516,12 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0x0019,0x00ca,"PMTF INFORMATION DATA^10",VR::LO,VM::VM1,"Sequence Name",false },
{0x0019,0x00cb,"PMTF INFORMATION DATA^10",VR::UL,VM::VM1,"?",false },
{0x0019,0x00cc,"PMTF INFORMATION DATA^10",VR::UL,VM::VM1,"?",false },
{0x0019,0x00cc,"PMTF INFORMATION DATA^12",VR::SS,VM::VM1,"?",false },
{0x0019,0x00cc,"PMTF INFORMATION DATA^12",VR::SS,VM::VM1_n,"?",false },
{0x0019,0x00cd,"PMTF INFORMATION DATA^10",VR::SL,VM::VM1,"?",false },
{0x0019,0x00cd,"PMTF INFORMATION DATA^11",VR::SL,VM::VM3,"?",false },
{0x0019,0x00cd,"PMTF INFORMATION DATA^12",VR::LO,VM::VM1,"?",false },
{0x0019,0x00ce,"PMTF INFORMATION DATA^10",VR::SL,VM::VM1,"?",false },
{0x0019,0x00ce,"PMTF INFORMATION DATA^12",VR::UL,VM::VM1,"?",false },
{0x0019,0x00cf,"PMTF INFORMATION DATA^10",VR::SL,VM::VM1,"?acquired series (vs postproc)?",false },
{0x0019,0x00cf,"PMTF INFORMATION DATA^12",VR::FL,VM::VM1,"?",false },
{0x0019,0x00d0,"PMTF INFORMATION DATA^10",VR::US,VM::VM1,"?",false },
......@@ -540,8 +570,10 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0x0019,0x00ef,"PMTF INFORMATION DATA^12",VR::DS,VM::VM1,"?",false },
{0x0019,0x00f0,"PMTF INFORMATION DATA^10",VR::SL,VM::VM1,"?",false },
{0x0019,0x00f0,"PMTF INFORMATION DATA^11",VR::SL,VM::VM1_n,"?",false },
{0x0019,0x00f0,"PMTF INFORMATION DATA^12",VR::LO,VM::VM1,"?",false },
{0x0019,0x00f1,"PMTF INFORMATION DATA^10",VR::FL,VM::VM1,"?",false },
{0x0019,0x00f1,"PMTF INFORMATION DATA^11",VR::SL,VM::VM3,"Diffusion b-value x Toshiba Orientation",false },
{0x0019,0x00f1,"PMTF INFORMATION DATA^12",VR::LO,VM::VM1,"?",false },
{0x0019,0x00f2,"PMTF INFORMATION DATA^10",VR::FL,VM::VM1,"?",false },
{0x0019,0x00f2,"PMTF INFORMATION DATA^11",VR::FL,VM::VM3,"?",false },
{0x0019,0x00f3,"PMTF INFORMATION DATA^10",VR::SL,VM::VM1,"?",false },
......@@ -563,10 +595,13 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0x0019,0x00fb,"PMTF INFORMATION DATA^11",VR::FL,VM::VM1,"?",false },
{0x0019,0x00fc,"PMTF INFORMATION DATA^10",VR::FL,VM::VM1,"?",false },
{0x0019,0x00fc,"PMTF INFORMATION DATA^11",VR::FL,VM::VM1,"?",false },
{0x0019,0x00fc,"PMTF INFORMATION DATA^12",VR::FL,VM::VM1,"?",false },
{0x0019,0x00fd,"PMTF INFORMATION DATA^10",VR::FL,VM::VM1,"?",false },
{0x0019,0x00fd,"PMTF INFORMATION DATA^11",VR::SL,VM::VM1,"?",false },
{0x0019,0x00fd,"PMTF INFORMATION DATA^12",VR::SL,VM::VM1,"?",false },
{0x0019,0x00fe,"PMTF INFORMATION DATA^10",VR::SL,VM::VM1,"?",false },
{0x0019,0x00fe,"PMTF INFORMATION DATA^11",VR::SL,VM::VM1,"?",false },
{0x0019,0x00fe,"PMTF INFORMATION DATA^12",VR::SL,VM::VM1,"?",false },
{0x0019,0x00ff,"PMTF INFORMATION DATA^10",VR::SL,VM::VM3,"?",false },
{0x0019,0x00ff,"PMTF INFORMATION DATA^11",VR::SL,VM::VM1,"?",false },
{0x0021,0x0002,"PMTF INFORMATION DATA^10",VR::SL,VM::VM1,"?num?",false },
......@@ -600,6 +635,7 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0x0029,0x0054,"PMTF INFORMATION DATA^10",VR::LO,VM::VM1,"?study filepath?",false },
{0x0029,0x0067,"PMTF INFORMATION DATA^10",VR::FD,VM::VM4,"Series Diffusion Info (b-value,x,y,z)",false },
{0x0029,0x0068,"PMTF INFORMATION DATA^10",VR::SS,VM::VM1,"?num 1?",false },
{0x0029,0x006e,"PMTF INFORMATION DATA^10",VR::OB,VM::VM1,"?",false },
//{0x0029,0x0089,"PMTF INFORMATION DATA",VR::LO,VM::VM1,"?",false }, /* defined below */
{0xe201,0x0002,"PMTF INFORMATION DATA^10",VR::US,VM::VM1,"?",false },
{0xe301,0x0000,"PMTF INFORMATION DATA^10",VR::SH,VM::VM1,"Series Description",false },
......@@ -609,6 +645,7 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0xe401,0x0003,"PMTF INFORMATION DATA^10",VR::US,VM::VM1,"?num?",false },
{0xe401,0x0004,"PMTF INFORMATION DATA^10",VR::US,VM::VM1,"?num?",false },
{0xe401,0x0005,"PMTF INFORMATION DATA^10",VR::OB,VM::VM1,"?blob?",false },
{0xe401,0x0007,"PMTF INFORMATION DATA^10",VR::FL,VM::VM1,"?",false },
{0xe401,0x0008,"PMTF INFORMATION DATA^10",VR::FL,VM::VM1,"?ADC factor?",false },
{0xe401,0x0012,"PMTF INFORMATION DATA^10",VR::FL,VM::VM1,"?num?",false },
{0xe401,0x0013,"PMTF INFORMATION DATA^10",VR::OB,VM::VM1,"Icon DIB (Microsoft Windows 3.X Packed Device-Independent Bitmap)",false },
......
......@@ -30,7 +30,7 @@ namespace gdcm_ns
++l;
}
#else
assert( !l.IsUndefined() && !l.IsOdd() );
gdcmAssertAlwaysMacro( !l.IsUndefined() && !l.IsOdd() );
#endif
// I cannot use reserve for now. I need to implement:
// STL - vector<> and istream
......
......@@ -236,10 +236,10 @@ public:
char sep;
//std::cout << "GetLength: " << af->GetLength() << std::endl;
for(unsigned long i=1; i<length;++i) {
assert( _is );
//assert( _is );
// Get the separator in between the values
_is >> std::ws >> sep; //_is.get(sep);
assert( sep == '\\' ); // FIXME: Bad use of assert
//assert( sep == '\\' ); // FIXME: Bad use of assert
_is >> std::ws >> data[i];
}
}
......
......@@ -743,7 +743,7 @@ catch(...)
}
bool IsVRUI(Tag const &tag)
static bool IsVRUI(Tag const &tag)
{
static const Global &g = Global::GetInstance();
static const Dicts &dicts = g.GetDicts();
......
......@@ -202,6 +202,51 @@ void Scanner::Print( std::ostream & os ) const
}
}
static bool IsVRUI(Tag const &tag)
{
static const Global &g = Global::GetInstance();
static const Dicts &dicts = g.GetDicts();
const DictEntry &dictentry = dicts.GetDictEntry(tag);
if( dictentry.GetVR() == VR::UI ) return true;
//if( tag == Tag(0x0020,0x000d) // Study Instance UID : UI
// || tag == Tag(0x0020,0x0052) //
// || tag == Tag(0x0020,0x000e) ) // Series Instance UID : UI
// {
// return true;
// }
return false;
}
void Scanner::PrintTable( std::ostream & os ) const
{
Directory::FilenamesType::const_iterator file = Filenames.begin();
for(; file != Filenames.end(); ++file)
{
const char *filename = file->c_str();
assert( filename && *filename );
bool b = IsKey(filename);
const char *comment = !b ? "could not be read" : "could be read";
os << '"' << filename << '"' << "\t";
//const FilenameToValue &mapping = Mappings[*tag];
TagsType::const_iterator tag = Tags.begin();
const TagToValue &mapping = GetMapping(filename);
for( ; tag != Tags.end(); ++tag )
{
const Tag &t = *tag;
bool isui = IsVRUI(t);
const char *value = "";
if( mapping.find(t) != mapping.end() ) {
const char * v = mapping.find(t)->second;
//const char* value = this->GetValue(filename, *tag);
if(v) value = v;
}
os << '"' << (isui ? String<>::Trim( value ) : value) << '"';
os << "\t";
}
os << "\n";
}
}
Scanner::TagToValue const & Scanner::GetMapping(const char *filename) const
{
// assert( Mappings.find(filename) != Mappings.end() );
......
......@@ -89,6 +89,8 @@ public:
/// Print result
void Print( std::ostream & os ) const override;
void PrintTable( std::ostream & os ) const;
/// Check if filename is a key in the Mapping table.
/// returns true only of file can be found, which means
/// the file was indeed a DICOM file that could be processed
......
......@@ -211,6 +211,51 @@ void StrictScanner::Print( std::ostream & os ) const
}
}
static bool IsVRUI(Tag const &tag)
{
static const Global &g = Global::GetInstance();
static const Dicts &dicts = g.GetDicts();
const DictEntry &dictentry = dicts.GetDictEntry(tag);
if( dictentry.GetVR() == VR::UI ) return true;
//if( tag == Tag(0x0020,0x000d) // Study Instance UID : UI
// || tag == Tag(0x0020,0x0052) //
// || tag == Tag(0x0020,0x000e) ) // Series Instance UID : UI
// {
// return true;
// }
return false;
}
void StrictScanner::PrintTable( std::ostream & os ) const
{
Directory::FilenamesType::const_iterator file = Filenames.begin();
for(; file != Filenames.end(); ++file)
{
const char *filename = file->c_str();
assert( filename && *filename );
bool b = IsKey(filename);
const char *comment = !b ? "could not be read" : "could be read";
os << '"' << filename << '"' << "\t";
//const FilenameToValue &mapping = Mappings[*tag];
TagsType::const_iterator tag = Tags.begin();
const TagToValue &mapping = GetMapping(filename);
for( ; tag != Tags.end(); ++tag )
{
const Tag &t = *tag;
bool isui = IsVRUI(t);
const char *value = "";
if( mapping.find(t) != mapping.end() ) {
const char * v = mapping.find(t)->second;
//const char* value = this->GetValue(filename, *tag);
if(v) value = v;
}
os << '"' << (isui ? String<>::Trim( value ) : value) << '"';
os << "\t";
}
os << "\n";
}
}
StrictScanner::TagToValue const & StrictScanner::GetMapping(const char *filename) const
{
// assert( Mappings.find(filename) != Mappings.end() );
......
......@@ -89,6 +89,8 @@ public:
/// Print result
void Print( std::ostream & os ) const override;
void PrintTable( std::ostream & os ) const;
/// Check if filename is a key in the Mapping table.
/// returns true only of file can be found, which means
/// the file was indeed a DICOM file that could be processed
......
......@@ -2,6 +2,21 @@
find_package(DCMTK)
find_package(DICOM3TOOLS)
# Special CMake Module required when doing Python Testing
if(GDCM_WRAP_PYTHON)
include(${GDCM_SOURCE_DIR}/CMake/UsePythonTest.cmake)
endif()
# Special CMake Module required when doing Java Testing
if(GDCM_WRAP_JAVA)
include(${GDCM_SOURCE_DIR}/CMake/UseJavaTest.cmake)
endif()
# Special CMake Module required when doing C# Testing
if(GDCM_WRAP_CSHARP)
include(${GDCM_SOURCE_DIR}/CMake/UseCSharpTest.cmake)
endif()
add_subdirectory(
Source
)
......
# Define the tests for gdcm-python
# gdcm-python
set(GDCM_PYTHON_TEST_SRCS
TestTesting
)
......
......@@ -80,10 +80,6 @@ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/getopt)
endif()
endif()
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/doxygen)
add_subdirectory(doxygen)
endif()
# you could be running mingw32 on linux in which case you do NOT want the gdcmuuid lib
APPEND_COPYRIGHT(${CMAKE_CURRENT_SOURCE_DIR}/gdcmuuid/COPYING)
if(NOT WIN32 AND NOT MINGW)
......
......@@ -754,7 +754,7 @@ void PrintHelp()
std::cout << "Options:" << std::endl;
std::cout << " --force-rescale force rescale." << std::endl;
std::cout << " --force-spacing force spacing." << std::endl;
std::cout << " -r --recursive Recusively descend directory." << std::endl;
std::cout << " -r --recursive Recursively descend directory." << std::endl;
std::cout << "General Options:" << std::endl;
std::cout << " -V --verbose more verbose (warning+error)." << std::endl;
std::cout << " -W --warning print warning info." << std::endl;
......
......@@ -613,7 +613,7 @@ if(GDCM_WRAP_CSHARP)
OUTPUT ${GDCM_LIBRARY_DIR}/vtkgdcm-sharp.dll
COMMAND ${CMAKE_CSHARP_COMPILER} ARGS "/t:library" "/out:${GDCM_LIBRARY_DIR}/vtkgdcm-sharp.dll" "*.cs"
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
DEPENDS "${swig_generated_file_fullname}"
DEPENDS ${SWIG_MODULE_vtkgdcmsharpglue_REAL_NAME}
${CMAKE_CURRENT_BINARY_DIR}/AssemblyInfo.cs
COMMENT "csc *.cs"
)
......
......@@ -31,12 +31,17 @@
#endif
%{
//#define VTK_MAJOR_VERSION 6
//#define VTK_MINOR_VERSION 2
//#define VTK_BUILD_VERSION 0
//#define VTK_VERSION "6.2.0"
//#define VTK_MAJOR_VERSION 7
//#define VTK_MINOR_VERSION 1
//#define VTK_BUILD_VERSION 1
//#define VTK_VERSION "7.1.1"
%}
#define VTK_OVERRIDE override
#define VTK_FINAL final
#define VTK_DELETE_FUNCTION = delete
#define VTK_NEWINSTANCE
#define VTK_LEGACY(X)
%{
// Let's reproduce the stack of include, when one would include vtkSetGet:
......
......@@ -124,12 +124,12 @@ if(GDCM_DOCUMENTATION)
COMMAND ${SED_EXECUTABLE}
ARGS -i.tmp -e "'s/${sed_gdcm_source_dir}/gdcm/g'" ${CMAKE_CURRENT_BINARY_DIR}/latex/*.tex
# Command #3
COMMAND ${CMAKE_MAKE_PROGRAM}
COMMAND make
ARGS -C ${CMAKE_CURRENT_BINARY_DIR}/latex
DEPENDS #${CMAKE_CURRENT_BINARY_DIR}/latex/refman.tex
${CMAKE_CURRENT_BINARY_DIR}/latex/Makefile
#${GDCM_DOC_TARBALL}
COMMENT "GDCM: Creating (patched) pdf of documentation"
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/latex
)
if(PDFOPT_EXECUTABLE)
add_custom_command(
......