Commit 858fcd92 authored by Gert Wollny's avatar Gert Wollny
Browse files

New upstream version 1.00~20180803063840

parent 3786bfcf
Loading
Loading
Loading
Loading
+34 −0
Original line number Diff line number Diff line
180707:	libsrc/standard/elmdict/gems.tpl: Correct missing opening parenthesis in GE private data element (3101,0010)

180627:	libsrc/src/dctool/attrmxrd.cc:	Report pixel data compressed fragment items have odd length during read (000514)

180626:	libsrc/standard/elmdict/dicom3.tpl: Add Beam Dose Point Source to External Contour Distance data element (CP 1762)

180626:	libsrc/standard/module,strval/base.tpl,elmdict/dicom3.tpl: Add flag to distinguish studies imported from outside (CP 1760)

180626:	libsrc/standard/module/vl.tpl: RWVM functional group Real World Value Map only permitted for monochrome Whole Slide Images (CP 1759)

180626:	libsrc/standard/iod/mr.tpl: Move Specimen Module to Image level in Tractography Results (CP 1753)

180626:	libsrc/standard/strval/base.tpl: Update General Series modality values with OPTBSV and OPTENF (CP 1750)

180626:	libsrc/standard/condn.tpl: Do not require Patient Orientation for Whole Slide Images (CP 1757)

180622: appsrc/dcfile/dciodvfy.cc,libsrc/src/locale/mesgtext.tpl: Report reference segment numbers that have no segment sequence item (000520)

180622: appsrc/dcfile/dciodvfy.cc,libsrc/src/locale/mesgtext.tpl: Check that SegmentNumber values start at 1 and increase by 1 (000439)

180603: libsrc/standard/elmdict/other.tpl: Add observed 3DHISTECH private data elements in REGIONLOCALIZER image type

180603:	libsrc/standard/module/vl.tpl: Defined terms rather than enumerated values for WSI ImageType values 3 and 4 (000519)

180415:	libsrc/standard/module/base.tpl: Add Consulting Physician (CP 1322)

180414:	libsrc/standard/condn.tpl,module/base.tpl: Report if InConcatenationTotalNumber is less than or equal to one (000517), and use presence of any concatenation attribute as need for UID (000518)

180413:	libsrc/standard/condn.tpl: Change condition in General Series for Laterality to not flag its absence when unpaired body part is implicit because it is a waveform SOP Class or Modality, i.e., cardiac, respiratory, voice audio (000308)

180413:	libsrc/standard/strval/base.tpl: Update coding scheme list to include all in current standard including caDSR, DC, MDC, MSH, NBD, NBG, NEU, NICIP, PUBCHEM_CID (DICOM 2018b, includes CPs 1079, 1167, 1259, 1408, 1622)

180403:	libsrc/standard/condn.tpl,sopcl.tpl,elmdict/dicom3.tpl,iodcomp,module,strval/base.tpl: Add DICOM Encapsulation of STL Models for 3D Manufacturing (Sup 205)

180401:	libsrc/standard/module/base.tpl: Add Scheduled Procedure Step Expiration DateTime data element (CP 1224)

180328:	libsrc/standard/module/base.tpl,vl.tpl: WSI is missing Frame Type (CP 1740)
+1 −1
Original line number Diff line number Diff line
1.00.snapshot.20180401144051
1.00.snapshot.20180803063840
+103 −1
Original line number Diff line number Diff line
@@ -670,7 +670,7 @@ checkPixelDataIsTheCorrectLength(AttributeList &list,TextOutputStream &log)
				success=false;
			}
		}
		// else do not check if encapsulated
		// if encapsulated, a check that fragments are even length is performed during reading in attrmxrd.cc (000514)
	}
	
	return success;
@@ -1785,6 +1785,104 @@ checkCountPerFrameFunctionalGroupsMatchesNumberOfFrames(AttributeList &list,Text
	return success;
}

static bool
checkSegmentNumbersMonotonicallyIncreasingFromOneByOne(AttributeList &list,TextOutputStream &log) {
//cerr << "checkSegmentNumbersMonotonicallyIncreasingFromOneByOne():" << endl;
	bool success=true;
	
	Attribute *aSegmentSequence = list[TagFromName(SegmentSequence)];
	if (aSegmentSequence && aSegmentSequence->isSequence()) {
		AttributeList **aSegmentSequenceLists;
		int nSegmentSequenceItems;
		if ((nSegmentSequenceItems=aSegmentSequence->getLists(&aSegmentSequenceLists)) > 0) {
			int s;
			for (s=0; s<nSegmentSequenceItems; ++s) {
				AttributeList *segmentList = aSegmentSequenceLists[s];
				Attribute *aSegmentNumber = (*segmentList)[TagFromName(SegmentNumber)];
				Uint16 vSegmentNumber = 0;
				if (aSegmentNumber) {
					(void)aSegmentNumber->getValue(0,vSegmentNumber);
					if (vSegmentNumber != s + 1) {
						log << EMsgDC(SegmentNumberNotMonotonicallyIncreasingFromOneByOne)
							<< " - have SegmentSequence item number " << (s+1) << " (from one) with SegmentNumber of " << vSegmentNumber << endl;
						success = false;
						break;	// only report first one
					}
				}
			}
		}
	}
	
	return success;
}

static bool
checkReferencedSegmentNumbersHaveTarget(AttributeList &list,TextOutputStream &log) {
//cerr << "checkReferencedSegmentNumbersHaveTarget():" << endl;
	bool success=true;
	
	Attribute *aSegmentSequence = list[TagFromName(SegmentSequence)];
	if (aSegmentSequence && aSegmentSequence->isSequence()) {
		AttributeList **aSegmentSequenceLists;
		int nSegmentSequenceItems;
		if ((nSegmentSequenceItems=aSegmentSequence->getLists(&aSegmentSequenceLists)) > 0) {
			Uint16 segmentNumberTargets[nSegmentSequenceItems];		// set of target SegmentNumbers, even if not numbered sequentially (don't care; checked elsewhere)
			int s;
			for (s=0; s<nSegmentSequenceItems; ++s) {
				AttributeList *segmentList = aSegmentSequenceLists[s];
				Attribute *aSegmentNumber = (*segmentList)[TagFromName(SegmentNumber)];
				segmentNumberTargets[s] = 0;
				if (aSegmentNumber) {
					(void)aSegmentNumber->getValue(0,segmentNumberTargets[s]);
				}
			}
			
			// if we were able to build a set of target SegmentNumbers, now check every reference
	
			Attribute *aPerFrameFunctionalGroupsSequence = list[TagFromName(PerFrameFunctionalGroupsSequence)];
			if (aPerFrameFunctionalGroupsSequence && aPerFrameFunctionalGroupsSequence->isSequence() && !aPerFrameFunctionalGroupsSequence->isEmpty()) {
				AttributeList **aPerFrameFunctionalGroupsSequenceLists;
				int nPerFrameFunctionalGroupsSequenceItems;
				if ((nPerFrameFunctionalGroupsSequenceItems=aPerFrameFunctionalGroupsSequence->getLists(&aPerFrameFunctionalGroupsSequenceLists)) > 0) {
					int f;
					for (f=0; f<nPerFrameFunctionalGroupsSequenceItems; ++f) {
						AttributeList *perFrameList = aPerFrameFunctionalGroupsSequenceLists[f];
						Attribute *aSegmentIdentificationSequence = (*perFrameList)[TagFromName(SegmentIdentificationSequence)];
						if (aSegmentIdentificationSequence && aSegmentIdentificationSequence->isSequence() && !aSegmentIdentificationSequence->isEmpty()) {
							AttributeList **aSegmentIdentificationSequenceLists;
							int nSegmentIdentificationSequenceItems;
							if ((nSegmentIdentificationSequenceItems=aSegmentIdentificationSequence->getLists(&aSegmentIdentificationSequenceLists)) > 0) {
								AttributeList *segmentIdentificationSequenceList = aSegmentIdentificationSequenceLists[0];	// should only be one so only check one
								Attribute *aReferencedSegmentNumber = (*segmentIdentificationSequenceList)[TagFromName(ReferencedSegmentNumber)];
								Uint16 vReferencedSegmentNumber = 0;
								if (aReferencedSegmentNumber) {
									(void)aReferencedSegmentNumber->getValue(0,vReferencedSegmentNumber);
//cerr << "checkReferencedSegmentNumbersHaveTarget(): checking frame " << (f+1) << endl;
									bool found = false;
									for (int i=0; i<nSegmentSequenceItems; ++i) {
										if (vReferencedSegmentNumber == segmentNumberTargets[i]) {
//cerr << "checkReferencedSegmentNumbersHaveTarget(): for frame " << (f+1) << " have SegmentNumber for ReferencedSegmentNumber " << vReferencedSegmentNumber << endl;
											found = true;
											break;
										}
									}
									if (!found) {
										log << EMsgDC(ReferencedSegmentNumberNotPresentInSegmentSequence)
											<< " - have ReferencedSegmentNumber " << vReferencedSegmentNumber << " in SegmentIdentificationSequence for frame " << (f+1) << endl;
										success = false;
									}
								}
							}
						}
					}
				}
			}
		}
	}

	return success;
}

static bool
checkCoordinateContentItemsHaveAppropriateChildren(AttributeList &list,TextOutputStream &log) {
//cerr << "checkCoordinateContentItemsHaveAppropriateChildren():" << endl;
@@ -2203,6 +2301,10 @@ main(int argc, char *argv[])
	
	if (!checkCountPerFrameFunctionalGroupsMatchesNumberOfFrames(list,log)) success = false;
	
	if (!checkSegmentNumbersMonotonicallyIncreasingFromOneByOne(list,log)) success = false;
	
	if (!checkReferencedSegmentNumbersHaveTarget(list,log)) success = false;

	if (!list.validatePrivate(log)) success = false;
	
	checkValuesNeededToBuildDicomDirectoryArePresentAndNotEmpty(list,log);	// always only warnings ... do not affect success
+6 −0
Original line number Diff line number Diff line
@@ -271,6 +271,7 @@ ReadableAttributeList::skipEncapsulatedData(void)
{
//cerr << "ReadableAttributeList::skipEncapsulatedData: start" << endl;
	bool showoffset=verbose;
	bool oddlengthfragmentencountered=false;
	// See libsrc/include/pixeldat/unencap.h for details of GE bug
	while (1) {
//cerr << "ReadableAttributeList::skipEncapsulatedData: looping" << endl;
@@ -294,6 +295,11 @@ ReadableAttributeList::skipEncapsulatedData(void)
		}
		byteoffset+=4;
		
		if (!oddlengthfragmentencountered && vl%2 != 0) {
			errorstream << WMsgDC(EncapsulatedPixelDataFragmentNotEvenLength) << endl;	// (000514)
			oddlengthfragmentencountered=true;	// only report this once
		}

		if (verbose) {
			writebase(tag,"",vl); (*log) << endl;
		}
+1 −2
Original line number Diff line number Diff line
static const char *CopyrightIdentifier(void) { return "@(#)platform.cc Copyright (c) 1993-2018, David A. Clunie DBA PixelMed Publishing. All rights reserved."; }
// Automatically generated - EDITS WILL BE LOST

// Generated by support/setplatform

#include "platform.h"

const char* dicom3tools_platform_string = "Darwin graytoo.local 14.5.0 Darwin Kernel Version 14.5.0: Sun Jun  4 21:40:08 PDT 2017; root:xnu-2782.70.3~1/RELEASE_X86_64 x86_64";
const char* dicom3tools_platform_string = "Darwin graythin.local 17.5.0 Darwin Kernel Version 17.5.0: Fri Apr 13 19:32:32 PDT 2018; root:xnu-4570.51.2~1/RELEASE_X86_64 x86_64";
Loading