Patch #893 ยป dcmtk_storescp_patientname_sort_semmelweis_variant.patch
| dcmtk-3.6.4-dwok/dcmnet/apps/storescp.cc 2019-08-01 20:24:27.274688090 +0200 | ||
|---|---|---|
|
"sort studies using prefix p and a timestamp");
|
||
|
cmd.addOption("--sort-on-study-uid", "-su", 1, "[p]refix: string",
|
||
|
"sort studies using prefix p and the Study\nInstance UID");
|
||
|
cmd.addOption("--sort-on-patientname", "-sp", "sort studies using the Patient's Name and\na timestamp");
|
||
|
cmd.addOption("--sort-on-patientname", "-sp", "sort studies using the Patient's Name,\nStudy Date and Patient ID");
|
||
|
cmd.addSubGroup("filename generation:");
|
||
|
cmd.addOption("--default-filenames", "-uf", "generate filename from instance UID (default)");
|
||
| ... | ... | |
|
"_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", // Codes 144-159
|
||
|
"_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", // Codes 160-175
|
||
|
"_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", // Codes 176-191
|
||
|
"A", "A", "A", "A", "Ae","A", "A", "C", "E", "E", "E", "E", "I", "I", "I", "I", // Codes 192-107
|
||
|
"D", "N", "O", "O", "O", "O", "Oe","_", "O", "U", "U", "U", "Ue","Y", "_", "ss",// Codes 108-123
|
||
|
"a", "a", "a", "a", "ae","a", "a", "c", "e", "e", "e", "e", "i", "i", "i", "i", // Codes 124-141
|
||
|
"d", "n", "o", "o", "o", "o", "oe","_", "o", "u", "u", "u", "ue","y", "_", "y" // Codes 142-157
|
||
|
"A", "A", "A", "A", "A", "A", "A", "C", "E", "E", "E", "E", "I", "I", "I", "I", // Codes 192-107
|
||
|
"D", "N", "O", "O", "O", "O", "O", "_", "O", "U", "U", "U", "U", "Y", "_", "s", // Codes 108-123
|
||
|
"a", "a", "a", "a", "a", "a", "a", "c", "e", "e", "e", "e", "i", "i", "i", "i", // Codes 124-141
|
||
|
"d", "n", "o", "o", "o", "o", "o", "_", "o", "u", "u", "u", "u", "y", "_", "y" // Codes 142-157
|
||
|
};
|
||
|
output += latin1_table[c];
|
||
|
}
|
||
| ... | ... | |
|
// if --sort-on-patientname is active, we need to extract the
|
||
|
// patient's name (format: last_name^first_name)
|
||
|
OFString currentPatientName;
|
||
|
OFString currentPatientID;
|
||
|
OFString currentStudyDate;
|
||
|
if (opt_sortStudyMode == ESM_PatientName)
|
||
|
{
|
||
|
OFString tmpName;
|
||
| ... | ... | |
|
mapCharacterAndAppendToString(tmpName[i], currentPatientName);
|
||
|
}
|
||
|
if (opt_sortStudyMode == ESM_PatientName)
|
||
|
{
|
||
|
OFString tmpID;
|
||
|
if ((*imageDataSet)->findAndGetOFString(DCM_PatientID, tmpID).bad() || tmpID.empty())
|
||
|
{
|
||
|
// default if patient ID is missing or empty
|
||
|
tmpID = "EMPTYID";
|
||
|
OFLOG_WARN(storescpLogger, "element PatientID " << DCM_PatientID << " absent or empty in data set, using '"
|
||
|
<< tmpID << "' instead");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
DcmElement *patElem = NULL;
|
||
|
OFString charset;
|
||
|
(*imageDataSet)->findAndGetElement(DCM_PatientID, patElem); // patElem cannot be NULL, see above
|
||
|
(*imageDataSet)->findAndGetOFStringArray(DCM_SpecificCharacterSet, charset);
|
||
|
if (!charset.empty() && !(charset == "ISO_IR 100") && (patElem->containsExtendedCharacters()))
|
||
|
{
|
||
|
OFLOG_WARN(storescpLogger, "Patient ID not in Latin-1 (charset: " << charset << "), ASCII dir name may be broken");
|
||
|
}
|
||
|
}
|
||
|
/* substitute non-ASCII characters in patient ID to ASCII "equivalent" */
|
||
|
const size_t length = tmpID.length();
|
||
|
for (size_t i = 0; i < length; i++)
|
||
|
mapCharacterAndAppendToString(tmpID[i], currentPatientID);
|
||
|
}
|
||
|
if (opt_sortStudyMode == ESM_PatientName)
|
||
|
{
|
||
|
OFString tmpDate;
|
||
|
if ((*imageDataSet)->findAndGetOFString(DCM_StudyDate, tmpDate).bad() || tmpDate.empty())
|
||
|
{
|
||
|
// default if study Date is missing or empty
|
||
|
tmpDate = "NODATE";
|
||
|
OFLOG_WARN(storescpLogger, "element StudyDate " << DCM_StudyDate << " absent or empty in data set, using '"
|
||
|
<< tmpDate << "' instead");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
DcmElement *patElem = NULL;
|
||
|
OFString charset;
|
||
|
(*imageDataSet)->findAndGetElement(DCM_StudyDate, patElem); // patElem cannot be NULL, see above
|
||
|
(*imageDataSet)->findAndGetOFStringArray(DCM_SpecificCharacterSet, charset);
|
||
|
if (!charset.empty() && !(charset == "ISO_IR 100") && (patElem->containsExtendedCharacters()))
|
||
|
{
|
||
|
OFLOG_WARN(storescpLogger, "Study Date not in Latin-1 (charset: " << charset << "), ASCII dir name may be broken");
|
||
|
}
|
||
|
}
|
||
|
/* substitute non-ASCII characters in Study Date to ASCII "equivalent" */
|
||
|
const size_t length = tmpDate.length();
|
||
|
for (size_t i = 0; i < length; i++)
|
||
|
mapCharacterAndAppendToString(tmpDate[i], currentStudyDate);
|
||
|
}
|
||
|
// if this is the first DICOM object that was received or if the study instance UID in the
|
||
|
// current DICOM object does not equal the last object's study instance UID we need to create
|
||
|
// a new subdirectory in which the current DICOM object will be stored
|
||
| ... | ... | |
|
subdirectoryName += currentStudyInstanceUID;
|
||
|
break;
|
||
|
case ESM_PatientName:
|
||
|
// pattern: "[Patient's Name]_[YYYYMMDD]_[HHMMSSMMM]"
|
||
|
// pattern: "[Patient's Name]_[Study Date]_[Patient ID]"
|
||
|
subdirectoryName = currentPatientName;
|
||
|
subdirectoryName += '_';
|
||
|
subdirectoryName += timestamp;
|
||
|
subdirectoryName += currentStudyDate;
|
||
|
subdirectoryName += '_';
|
||
|
subdirectoryName += currentPatientID;
|
||
|
// subdirectoryName += '_';
|
||
|
// subdirectoryName += currentStudyInstanceUID;
|
||
|
break;
|
||
|
case ESM_None:
|
||
|
break;
|
||