1356 lines
69 KiB
C
1356 lines
69 KiB
C
|
/*
|
||
|
*
|
||
|
* Copyright (C) 2000-2016, OFFIS e.V.
|
||
|
* All rights reserved. See COPYRIGHT file for details.
|
||
|
*
|
||
|
* This software and supporting documentation were developed by
|
||
|
*
|
||
|
* OFFIS e.V.
|
||
|
* R&D Division Health
|
||
|
* Escherweg 2
|
||
|
* D-26121 Oldenburg, Germany
|
||
|
*
|
||
|
*
|
||
|
* Module: dcmsr
|
||
|
*
|
||
|
* Author: Joerg Riesmeier
|
||
|
*
|
||
|
* Purpose:
|
||
|
* classes: DSRDocument
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
|
||
|
#ifndef DSRDOC_H
|
||
|
#define DSRDOC_H
|
||
|
|
||
|
#include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */
|
||
|
|
||
|
#include "dcmtk/dcmsr/dsrdoctr.h"
|
||
|
#include "dcmtk/dcmsr/dsrrtpl.h"
|
||
|
#include "dcmtk/dcmsr/dsrsoprf.h"
|
||
|
#include "dcmtk/dcmsr/dsrrefin.h"
|
||
|
#include "dcmtk/dcmsr/dsrcsidl.h"
|
||
|
|
||
|
#include "dcmtk/dcmdata/dcvrcs.h"
|
||
|
#include "dcmtk/dcmdata/dcvrda.h"
|
||
|
#include "dcmtk/dcmdata/dcvris.h"
|
||
|
#include "dcmtk/dcmdata/dcvrlo.h"
|
||
|
#include "dcmtk/dcmdata/dcvrpn.h"
|
||
|
#include "dcmtk/dcmdata/dcvrsh.h"
|
||
|
#include "dcmtk/dcmdata/dcvrtm.h"
|
||
|
#include "dcmtk/dcmdata/dcvrui.h"
|
||
|
|
||
|
#include "dcmtk/ofstd/ofstream.h"
|
||
|
|
||
|
|
||
|
/*---------------------*
|
||
|
* class declaration *
|
||
|
*---------------------*/
|
||
|
|
||
|
/** Interface class for 'dcmsr' (DICOM Structured Reporting Documents).
|
||
|
* This class supports reading, writing, creation, printing and rendering of DICOM
|
||
|
* Structured Reporting (SR) documents.
|
||
|
* The list of supported SOP classes is available in file "dsrtypes.h". Also see
|
||
|
* DSRTypes::E_DocumentType.
|
||
|
*/
|
||
|
class DCMTK_DCMSR_EXPORT DSRDocument
|
||
|
: protected DSRTypes
|
||
|
{
|
||
|
|
||
|
public:
|
||
|
|
||
|
// --- constructors and destructor ---
|
||
|
|
||
|
/** (default) constructor.
|
||
|
* The parameter 'documentType' is optional and has a default value.
|
||
|
** @param documentType type of the SR document (see DSRTypes::E_DocumentType)
|
||
|
*/
|
||
|
DSRDocument(const E_DocumentType documentType = DT_BasicTextSR);
|
||
|
|
||
|
/** destructor
|
||
|
*/
|
||
|
virtual ~DSRDocument();
|
||
|
|
||
|
|
||
|
// --- misc routines ---
|
||
|
|
||
|
/** clear all internal member variables
|
||
|
*/
|
||
|
virtual void clear();
|
||
|
|
||
|
/** check whether the current internal state is valid.
|
||
|
* The SR document is valid if the corresponding document tree is valid and
|
||
|
* the SOP instance UID as well as the SOP class UID are not "empty".
|
||
|
** @return OFTrue if valid, OFFalse otherwise
|
||
|
*/
|
||
|
virtual OFBool isValid();
|
||
|
|
||
|
/** check whether the document is finalized.
|
||
|
* A new document is originally not finalized but can be finalized using the method
|
||
|
* finalizeDocument(). This flag is e.g. used to indicate whether the entire document
|
||
|
* is digitally signed and, therefore, each newly added verifying observer would corrupt
|
||
|
* all previous signatures.
|
||
|
** @return OFTrue if finalized, OFFalse otherwise
|
||
|
*/
|
||
|
virtual OFBool isFinalized() const;
|
||
|
|
||
|
|
||
|
// --- input and output ---
|
||
|
|
||
|
/** print current SR document to specified output stream.
|
||
|
* The output format is identical to that of the dsrdump command line tool.
|
||
|
** @param stream output stream (e.g.\ COUT from "ofconsol.h")
|
||
|
* @param flags optional flag used to customize the output (see DSRTypes::PF_xxx)
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition print(STD_NAMESPACE ostream &stream,
|
||
|
const size_t flags = 0);
|
||
|
|
||
|
/** read SR document from DICOM dataset.
|
||
|
* Please note that the current document is also deleted if the reading process fails.
|
||
|
* If logging is enabled, the reason for any error might be obtained from the log output.
|
||
|
* Also warning and debug messages are reported if the respective logger is enabled.
|
||
|
** @param dataset reference to DICOM dataset from which the document should be read
|
||
|
* @param flags optional flag used to customize the reading process (see DSRTypes::RF_xxx).
|
||
|
* E.g. RF_readDigitalSignatures indicates whether to read the digital
|
||
|
* signatures from the dataset or not. If set, the MACParametersSequence
|
||
|
* and the DigitalSignaturesSequence are read for the general document
|
||
|
* header (equivalent to top-level content item) and each content item
|
||
|
* of the document tree.
|
||
|
* If not removed manually (with DSRDocumentTree::removeSignatures())
|
||
|
* the signatures are written back to the dataset when the write() method
|
||
|
* is called.
|
||
|
* Please note that the two signature sequences for any other sequence
|
||
|
* (e.g. VerifyingObserver or PredecessorDocuments) are never read.
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition read(DcmItem &dataset,
|
||
|
const size_t flags = 0);
|
||
|
|
||
|
/** read patient data from DICOM dataset.
|
||
|
* The list of data elements that are read can be found under "Patient Module" in the
|
||
|
* member variable section of this class. Other data is not changed, so be careful
|
||
|
* when using this method.
|
||
|
* @param dataset reference to DICOM dataset from which the data should be read
|
||
|
* @param flags optional flag used to customize the reading process (see DSRTypes::RF_xxx)
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition readPatientData(DcmItem &dataset,
|
||
|
const size_t flags = 0);
|
||
|
|
||
|
/** read study data from DICOM dataset. Also reads patient data.
|
||
|
* The list of data elements that are read can be found under "Patient Module" and
|
||
|
* "General Study Module" in the member variable section of this class. Other data
|
||
|
* is not changed, so be careful when using this method.
|
||
|
* @param dataset reference to DICOM dataset from which the data should be read
|
||
|
* @param flags optional flag used to customize the reading process (see DSRTypes::RF_xxx)
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition readStudyData(DcmItem &dataset,
|
||
|
const size_t flags = 0);
|
||
|
|
||
|
/** write current SR document to DICOM dataset.
|
||
|
* Please note that the ContentTemplateSequence for the root content item is not written
|
||
|
* automatically for particular SOP Classes (e.g. Key Object Selection Document).
|
||
|
* Instead, the template identification has to be set manually for the root CONTAINER
|
||
|
* (see DSRDocumentTreeNode::setTemplateIdentification()). This is because the template
|
||
|
* constraints cannot be checked yet.
|
||
|
* If logging is enabled, warning and debug messages are reported to the log output.
|
||
|
** @param dataset reference to DICOM dataset to which the current document should be
|
||
|
* written. The 'dataset' is not cleared before writing to it!
|
||
|
* @param markedItems optional stack where pointers to all 'marked' content items
|
||
|
* (DICOM datasets/items) are added to during the write process.
|
||
|
* Can be used to digitally sign parts of the document tree.
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition write(DcmItem &dataset,
|
||
|
DcmStack *markedItems = NULL);
|
||
|
|
||
|
/** read SR document from XML file.
|
||
|
* The format (Schema) of the XML document is expected to conform to the output format
|
||
|
* of the writeXML() method. In addition, the document can be validated against an XML
|
||
|
* Schema by setting the flag XF_validateSchema.
|
||
|
* Digital signatures in the XML document are not yet supported.
|
||
|
* Please note that the current document is also deleted if the parsing process fails.
|
||
|
** @param filename name of the file from which the XML document is read ("-" for stdin)
|
||
|
* @param flags optional flag used to customize the reading process (see DSRTypes::XF_xxx)
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition readXML(const OFString &filename,
|
||
|
const size_t flags = 0);
|
||
|
|
||
|
/** write current SR document in XML format.
|
||
|
* The output format is identical to that of the dsr2xml command line tool. Digital
|
||
|
* signatures in the XML document are not yet supported.
|
||
|
** @param stream output stream to which the XML document is written
|
||
|
* @param flags optional flag used to customize the output (see DSRTypes::XF_xxx)
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition writeXML(STD_NAMESPACE ostream &stream,
|
||
|
const size_t flags = 0);
|
||
|
|
||
|
/** render current SR document in HTML/XHTML format.
|
||
|
* The output format is identical to that of the dsr2html command line tool.
|
||
|
** @param stream output stream to which the HTML/XHTML document is written
|
||
|
* @param flags optional flag used to customize the output (see DSRTypes::HF_xxx)
|
||
|
* @param styleSheet optional filename/URL of a Cascading Style Sheet (CSS)
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition renderHTML(STD_NAMESPACE ostream &stream,
|
||
|
const size_t flags = 0,
|
||
|
const char *styleSheet = NULL);
|
||
|
|
||
|
|
||
|
// --- get/set misc attributes ---
|
||
|
|
||
|
/** get the current SR document type
|
||
|
** @return document type (might be DT_invalid if read from dataset)
|
||
|
*/
|
||
|
virtual E_DocumentType getDocumentType() const;
|
||
|
|
||
|
/** get document tree
|
||
|
** @return reference to the document tree
|
||
|
*/
|
||
|
inline DSRDocumentTree &getTree()
|
||
|
{
|
||
|
return DocumentTree;
|
||
|
}
|
||
|
|
||
|
/** set document tree.
|
||
|
* Replace the currently stored document tree with the given one. Please note that the
|
||
|
* given 'tree' is checked before setting it, i.e. only a valid document tree is accepted.
|
||
|
* However, a new SOP instance is never created. If needed, this has to be done with
|
||
|
* createNewSOPInstance() in addition to or with createNewDocument() before this method
|
||
|
* is called.
|
||
|
** @param tree document tree to be set (content will be copied)
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition setTree(const DSRDocumentTree &tree);
|
||
|
|
||
|
/** set document tree from root template.
|
||
|
* Replace the currently stored document tree with the one from the given root template.
|
||
|
* By default, this method expands the tree, i.e. instances of DSRIncludedTemplateTreeNode
|
||
|
* that were added to the tree with DSRDocumentSubTree::includeTemplate() are replaced by
|
||
|
* their content, i.e. by the internally managed subtree.
|
||
|
* Please note that the additional comments on the above setTree() method also apply.
|
||
|
** @param rootTemplate template specifying the document tree to be set (content will be
|
||
|
* copied). This parameter cannot be "const" because of
|
||
|
* DSRRootTemplate::getTree(), which is called internally and which
|
||
|
* modifies the tree.
|
||
|
* @param expandTree optional flag that allows for disabling the expanding of the
|
||
|
* document tree before setting it. Please note that various
|
||
|
* output methods like write() or renderHTML() do not yet work on
|
||
|
* such trees.
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition setTreeFromRootTemplate(DSRRootTemplate &rootTemplate,
|
||
|
const OFBool expandTree = OFTrue);
|
||
|
|
||
|
/** get specific character set type.
|
||
|
* If the type is unknown, the original DICOM defined term can be retrieved
|
||
|
* with the method getSpecificCharacterSet().
|
||
|
** @return character set (might be CS_invalid/unknown if not supported)
|
||
|
*/
|
||
|
virtual E_CharacterSet getSpecificCharacterSetType() const;
|
||
|
|
||
|
/** set specific character set type.
|
||
|
* The DICOM defined term (see member variable SpecificCharacterSet) is set accordingly.
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition setSpecificCharacterSetType(const E_CharacterSet characterSet);
|
||
|
|
||
|
/** get document preliminary flag.
|
||
|
* @note Not applicable to Key Object Selection Documents.
|
||
|
** @return preliminary flag (might be PF_invalid if not specified)
|
||
|
*/
|
||
|
virtual E_PreliminaryFlag getPreliminaryFlag() const;
|
||
|
|
||
|
/** set document preliminary flag.
|
||
|
* According to the DICOM standard, the concept of "completeness" is independent of the
|
||
|
* concept of "preliminary" or "final". Therefore, this flag can be specified separately.
|
||
|
* @note Not applicable to Key Object Selection Documents.
|
||
|
** @param flag preliminary flag to be set (use PF_invalid to omit this optional value)
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition setPreliminaryFlag(const E_PreliminaryFlag flag);
|
||
|
|
||
|
/** get document completion flag.
|
||
|
* According to the DICOM standard, this flag describes the estimated degree of completeness
|
||
|
* of an SR Document. See DICOM standard for details.
|
||
|
* @note Not applicable to Key Object Selection Documents.
|
||
|
** @return completion flag (might be CF_invalid if read from dataset)
|
||
|
*/
|
||
|
virtual E_CompletionFlag getCompletionFlag() const;
|
||
|
|
||
|
/** get document verification flag.
|
||
|
* @note Not applicable to Key Object Selection Documents.
|
||
|
** @return verification flag (might be VF_invalid if read from dataset)
|
||
|
*/
|
||
|
virtual E_VerificationFlag getVerificationFlag() const;
|
||
|
|
||
|
/** get number of verifying observers.
|
||
|
* A document can be verified more than once. The verification flag should be VERIFIED
|
||
|
* if any verifying observer is specified. The details on the observer can be retrieved
|
||
|
* using the getVerifyingObserver() methods.
|
||
|
* @note Not applicable to Key Object Selection Documents.
|
||
|
** @return number of verifying observers (if any), 0 otherwise
|
||
|
*/
|
||
|
virtual size_t getNumberOfVerifyingObservers();
|
||
|
|
||
|
/** get information about a verifying observer.
|
||
|
* All reference variables are cleared before the information is retrieved, i.e. if an error
|
||
|
* occurs (return value != EC_Normal) non-empty variables do contain valid (empty) data.
|
||
|
* @note Not applicable to Key Object Selection Documents.
|
||
|
** @param idx index of the verifying observer to be retrieved (starting with 1).
|
||
|
* Use getNumberOfVerifyingObservers() to get the maximum value.
|
||
|
* @param dateTime reference to variable where the date and time when this document
|
||
|
* has been verified should be stored (required)
|
||
|
* @param observerName reference to variable where the name of the person who has verified
|
||
|
* this document should be stored (required)
|
||
|
* @param organization reference to variable where the name of the organization to which
|
||
|
* the observer belongs should be stored (required)
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getVerifyingObserver(const size_t idx,
|
||
|
OFString &dateTime,
|
||
|
OFString &observerName,
|
||
|
OFString &organization);
|
||
|
|
||
|
/** get information about a verifying observer.
|
||
|
* All reference variables are cleared before the information is retrieved, i.e. if an error
|
||
|
* occurs (return value != EC_Normal) non-empty variables do contain valid (empty) data.
|
||
|
* @note Not applicable to Key Object Selection Documents.
|
||
|
** @param idx index of the verifying observer to be retrieved (starting with 1).
|
||
|
* Use getNumberOfVerifyingObservers() to get the maximum value.
|
||
|
* @param dateTime reference to variable where the date and time when this document
|
||
|
* has been verified should be stored (required)
|
||
|
* @param observerName reference to variable where the name of the person who has verified
|
||
|
* this document should be stored (required)
|
||
|
* @param observerCode reference to variable where the observer code should be stored.
|
||
|
* code identifying the verifying observer (optional, see previous method)
|
||
|
* @param organization reference to variable where the name of the organization to which
|
||
|
* the observer belongs should be stored (required)
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getVerifyingObserver(const size_t idx,
|
||
|
OFString &dateTime,
|
||
|
OFString &observerName,
|
||
|
DSRCodedEntryValue &observerCode,
|
||
|
OFString &organization);
|
||
|
|
||
|
/** get list of predecessor documents.
|
||
|
* A document can have more than one (direct) predecessor document. This is e.g. the case
|
||
|
* when two or more documents have been merged to create it. The corresponding method
|
||
|
* createRevisedVersion() automatically adds a reference to the current document.
|
||
|
* The DICOM standard states: "[The Predecessor Documents Sequence] Shall refer to SR SOP
|
||
|
* Instances (e.g. prior or provisional reports) whose content has been wholly or partially
|
||
|
* included in this document with or without modification." and "[...] the use of the
|
||
|
* Predecessor Document Sequence allows tracing back to the input SR Document, which in this
|
||
|
* case is the previous version."
|
||
|
* @note Not applicable to Key Object Selection Documents.
|
||
|
** @return reference to list object
|
||
|
*/
|
||
|
virtual DSRSOPInstanceReferenceList &getPredecessorDocuments();
|
||
|
|
||
|
/** get list of identical documents.
|
||
|
* Please note that currently the user is responsible for filling and modifying the content of
|
||
|
* this list. However, the list is automatically cleared when a new instance is created (incl.
|
||
|
* a revised version of the current document). Possibly, there will be a createDuplicate()
|
||
|
* method or the like in the future which creates an identical copy of the current document in
|
||
|
* a new study/series.
|
||
|
* The DICOM standard states: "If identical copies of an SR Document are to be included in
|
||
|
* multiple Studies then the entire SR Document shall be duplicated with appropriate changes
|
||
|
* for inclusion into the different Studies (i.e. Study Instance UID, Series Instance UID, SOP
|
||
|
* Instance UID, Identical Documents Sequence etc.). The Identical Documents Sequence Attribute
|
||
|
* in each SOP Instance shall contain references to all other duplicate SOP Instances."
|
||
|
** @return reference to list object
|
||
|
*/
|
||
|
virtual DSRSOPInstanceReferenceList &getIdenticalDocuments();
|
||
|
|
||
|
/** get list of referenced SOP instances (Current Requested Procedure Evidence).
|
||
|
* The DICOM standard states: "The intent of the Current Requested Procedure Evidence Sequence
|
||
|
* is to reference all evidence created in order to satisfy the current Requested Procedure(s)
|
||
|
* for this SR Document. This shall include, but is not limited to, all current evidence
|
||
|
* referenced in the content tree." and "For a completed SR Document satisfying (i.e., being
|
||
|
* the final report for) the current Requested Procedure(s), this sequence shall list the full
|
||
|
* set of Composite SOP Instances created for the current Requested Procedure(s). For other
|
||
|
* SOP Instances that include the SR Document General Module, this sequence shall contain at
|
||
|
* minimum the set of Composite SOP Instances from the current Requested Procedure(s) that are
|
||
|
* referenced in the content tree." and "In the context of the Key Object Selection, the
|
||
|
* current evidence is considered to be only the set of instances referenced within the Key
|
||
|
* Object Selection."
|
||
|
** @return reference to list object
|
||
|
*/
|
||
|
virtual DSRSOPInstanceReferenceList &getCurrentRequestedProcedureEvidence();
|
||
|
|
||
|
/** get list of referenced SOP instances (Pertinent Other Evidence).
|
||
|
* The DICOM standard states: "The Pertinent Other Evidence Sequence attribute is used to
|
||
|
* reference all other evidence considered pertinent for this SR Document that is not listed
|
||
|
* in the Current Requested Procedure Evidence Sequence. This requires that the same SOP
|
||
|
* Instance shall not be referenced in both of these Sequences."
|
||
|
* @note Not applicable to Key Object Selection Documents.
|
||
|
** @return reference to list object
|
||
|
*/
|
||
|
virtual DSRSOPInstanceReferenceList &getPertinentOtherEvidence();
|
||
|
|
||
|
/** get list of referenced SOP instances significantly related to the current SOP instance.
|
||
|
* The DICOM standard states: "Such referenced Instances may include equivalent documents or
|
||
|
* renderings of this document. [...] Required if the identity of a CDA Document equivalent
|
||
|
* to the current SOP Instance is known at the time of creation of this SOP instance. May be
|
||
|
* present otherwise." Note: An equivalent rendering of the document might be provided as an
|
||
|
* "Encapsulated PDF" DICOM object.
|
||
|
* @note Not applicable to Key Object Selection Documents.
|
||
|
** @return reference to list object
|
||
|
*/
|
||
|
virtual DSRReferencedInstanceList &getReferencedInstances();
|
||
|
|
||
|
/** get list of coding schemes used (Coding Scheme Identification).
|
||
|
* The Coding Scheme Identification Sequence maps Coding Scheme Designators to an external coding
|
||
|
* system registration, or to a private or local coding scheme. See DICOM standard for details.
|
||
|
** @return reference to list object
|
||
|
*/
|
||
|
virtual DSRCodingSchemeIdentificationList &getCodingSchemeIdentification();
|
||
|
|
||
|
|
||
|
// --- get DICOM string attributes ---
|
||
|
|
||
|
/** get specific character set
|
||
|
** @param value reference to variable in which the value should be stored
|
||
|
* @param pos index of the value to get (0..vm-1), -1 for all components
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getSpecificCharacterSet(OFString &value,
|
||
|
const signed long pos = 0) const;
|
||
|
|
||
|
/** get completion flag description.
|
||
|
* @note Not applicable to Key Object Selection Documents.
|
||
|
** @param value reference to variable in which the value should be stored
|
||
|
* @param pos index of the value to get (0..vm-1), -1 for all components
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getCompletionFlagDescription(OFString &value,
|
||
|
const signed long pos = 0) const;
|
||
|
|
||
|
/** get modality
|
||
|
** @param value reference to variable in which the value should be stored
|
||
|
* @param pos index of the value to get (0..vm-1), -1 for all components
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getModality(OFString &value,
|
||
|
const signed long pos = 0) const;
|
||
|
|
||
|
/** get SOP class UID
|
||
|
** @param value reference to variable in which the value should be stored
|
||
|
* @param pos index of the value to get (0..vm-1), -1 for all components
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getSOPClassUID(OFString &value,
|
||
|
const signed long pos = 0) const;
|
||
|
|
||
|
/** get study instance UID
|
||
|
** @param value reference to variable in which the value should be stored
|
||
|
* @param pos index of the value to get (0..vm-1), -1 for all components
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getStudyInstanceUID(OFString &value,
|
||
|
const signed long pos = 0) const;
|
||
|
|
||
|
/** get series instance UID
|
||
|
** @param value reference to variable in which the value should be stored
|
||
|
* @param pos index of the value to get (0..vm-1), -1 for all components
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getSeriesInstanceUID(OFString &value,
|
||
|
const signed long pos = 0) const;
|
||
|
|
||
|
/** get SOP instance UID
|
||
|
** @param value reference to variable in which the value should be stored
|
||
|
* @param pos index of the value to get (0..vm-1), -1 for all components
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getSOPInstanceUID(OFString &value,
|
||
|
const signed long pos = 0) const;
|
||
|
|
||
|
/** get instance creator UID
|
||
|
** @param value reference to variable in which the value should be stored
|
||
|
* @param pos index of the value to get (0..vm-1), -1 for all components
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getInstanceCreatorUID(OFString &value,
|
||
|
const signed long pos = 0) const;
|
||
|
|
||
|
/** get patient's name
|
||
|
** @param value reference to variable in which the value should be stored
|
||
|
* @param pos index of the value to get (0..vm-1), -1 for all components
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getPatientName(OFString &value,
|
||
|
const signed long pos = 0) const;
|
||
|
|
||
|
/** get patient's birth date
|
||
|
** @param value reference to variable in which the value should be stored
|
||
|
* @param pos index of the value to get (0..vm-1), -1 for all components
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getPatientBirthDate(OFString &value,
|
||
|
const signed long pos = 0) const;
|
||
|
|
||
|
/** get patient's sex
|
||
|
** @param value reference to variable in which the value should be stored
|
||
|
* @param pos index of the value to get (0..vm-1), -1 for all components
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getPatientSex(OFString &value,
|
||
|
const signed long pos = 0) const;
|
||
|
|
||
|
/** get referring physician's name
|
||
|
** @param value reference to variable in which the value should be stored
|
||
|
* @param pos index of the value to get (0..vm-1), -1 for all components
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getReferringPhysicianName(OFString &value,
|
||
|
const signed long pos = 0) const;
|
||
|
|
||
|
/** get study description
|
||
|
** @param value reference to variable in which the value should be stored
|
||
|
* @param pos index of the value to get (0..vm-1), -1 for all components
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getStudyDescription(OFString &value,
|
||
|
const signed long pos = 0) const;
|
||
|
|
||
|
/** get series description
|
||
|
** @param value reference to variable in which the value should be stored
|
||
|
* @param pos index of the value to get (0..vm-1), -1 for all components
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getSeriesDescription(OFString &value,
|
||
|
const signed long pos = 0) const;
|
||
|
|
||
|
/** get protocol name
|
||
|
** @param value reference to variable in which the value should be stored
|
||
|
* @param pos index of the value to get (0..vm-1), -1 for all components
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getProtocolName(OFString &value,
|
||
|
const signed long pos = 0) const;
|
||
|
|
||
|
/** get manufacturer
|
||
|
** @param value reference to variable in which the value should be stored
|
||
|
* @param pos index of the value to get (0..vm-1), -1 for all components
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getManufacturer(OFString &value,
|
||
|
const signed long pos = 0) const;
|
||
|
|
||
|
/** get manufacturer's model name
|
||
|
** @param value reference to variable in which the value should be stored
|
||
|
* @param pos index of the value to get (0..vm-1), -1 for all components
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getManufacturerModelName(OFString &value,
|
||
|
const signed long pos = 0) const;
|
||
|
|
||
|
/** get device serial number
|
||
|
** @param value reference to variable in which the value should be stored
|
||
|
* @param pos index of the value to get (0..vm-1), -1 for all components
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getDeviceSerialNumber(OFString &value,
|
||
|
const signed long pos = 0) const;
|
||
|
|
||
|
/** get software version(s). Please note that only the first component is returned.
|
||
|
** @param value reference to variable in which the value should be stored
|
||
|
* @param pos index of the value to get (0..vm-1), -1 for all components
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getSoftwareVersions(OFString &value,
|
||
|
const signed long pos = 0) const;
|
||
|
|
||
|
/** get study date
|
||
|
** @param value reference to variable in which the value should be stored
|
||
|
* @param pos index of the value to get (0..vm-1), -1 for all components
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getStudyDate(OFString &value,
|
||
|
const signed long pos = 0) const;
|
||
|
|
||
|
/** get study time
|
||
|
** @param value reference to variable in which the value should be stored
|
||
|
* @param pos index of the value to get (0..vm-1), -1 for all components
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getStudyTime(OFString &value,
|
||
|
const signed long pos = 0) const;
|
||
|
|
||
|
/** get series date
|
||
|
** @param value reference to variable in which the value should be stored
|
||
|
* @param pos index of the value to get (0..vm-1), -1 for all components
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getSeriesDate(OFString &value,
|
||
|
const signed long pos = 0) const;
|
||
|
|
||
|
/** get series time
|
||
|
** @param value reference to variable in which the value should be stored
|
||
|
* @param pos index of the value to get (0..vm-1), -1 for all components
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getSeriesTime(OFString &value,
|
||
|
const signed long pos = 0) const;
|
||
|
|
||
|
/** get instance creation date
|
||
|
** @param value reference to variable in which the value should be stored
|
||
|
* @param pos index of the value to get (0..vm-1), -1 for all components
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getInstanceCreationDate(OFString &value,
|
||
|
const signed long pos = 0) const;
|
||
|
|
||
|
/** get instance creation time
|
||
|
** @param value reference to variable in which the value should be stored
|
||
|
* @param pos index of the value to get (0..vm-1), -1 for all components
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getInstanceCreationTime(OFString &value,
|
||
|
const signed long pos = 0) const;
|
||
|
|
||
|
/** get content date
|
||
|
** @param value reference to variable in which the value should be stored
|
||
|
* @param pos index of the value to get (0..vm-1), -1 for all components
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getContentDate(OFString &value,
|
||
|
const signed long pos = 0) const;
|
||
|
|
||
|
/** get content time
|
||
|
** @param value reference to variable in which the value should be stored
|
||
|
* @param pos index of the value to get (0..vm-1), -1 for all components
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getContentTime(OFString &value,
|
||
|
const signed long pos = 0) const;
|
||
|
|
||
|
/** get study ID
|
||
|
** @param value reference to variable in which the value should be stored
|
||
|
* @param pos index of the value to get (0..vm-1), -1 for all components
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getStudyID(OFString &value,
|
||
|
const signed long pos = 0) const;
|
||
|
|
||
|
/** get patient ID
|
||
|
** @param value reference to variable in which the value should be stored
|
||
|
* @param pos index of the value to get (0..vm-1), -1 for all components
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getPatientID(OFString &value,
|
||
|
const signed long pos = 0) const;
|
||
|
|
||
|
/** get series number
|
||
|
** @param value reference to variable in which the value should be stored
|
||
|
* @param pos index of the value to get (0..vm-1), -1 for all components
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getSeriesNumber(OFString &value,
|
||
|
const signed long pos = 0) const;
|
||
|
|
||
|
/** get instance number
|
||
|
** @param value reference to variable in which the value should be stored
|
||
|
* @param pos index of the value to get (0..vm-1), -1 for all components
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getInstanceNumber(OFString &value,
|
||
|
const signed long pos = 0) const;
|
||
|
|
||
|
/** get accession number
|
||
|
** @param value reference to variable in which the value should be stored
|
||
|
* @param pos index of the value to get (0..vm-1), -1 for all components
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition getAccessionNumber(OFString &value,
|
||
|
const signed long pos = 0) const;
|
||
|
|
||
|
|
||
|
// --- set DICOM string attributes ---
|
||
|
|
||
|
/** set specific character set. The internal enumerated value is set accordingly.
|
||
|
* Please note that this method does not return an error if the given 'value' is not
|
||
|
* defined by the DICOM standard or not supported by this class, e.g. when no mapping
|
||
|
* to the character set names needed for HTML/XHTML or XML output is defined.
|
||
|
* If needed, check the return value of the method getSpecificCharacterSetType() for
|
||
|
* DSRTypes::CS_invalid or DSRTypes::CS_unknown after calling this method.
|
||
|
** @param value value to be set (single or multiple values) or "" for no value
|
||
|
* @param check check 'value' for conformance with VR (CS) and VM (1-n) if enabled
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition setSpecificCharacterSet(const OFString &value,
|
||
|
const OFBool check = OFTrue);
|
||
|
|
||
|
/** set completion flag description.
|
||
|
* @note Not applicable to Key Object Selection Documents.
|
||
|
** @param value explanation of the value that is set for completion flag. If an empty
|
||
|
* string is passed, the description is removed from the dataset (type 3).
|
||
|
* @param check check 'value' for conformance with VR (LO) and VM (1) if enabled
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition setCompletionFlagDescription(const OFString &value,
|
||
|
const OFBool check = OFTrue);
|
||
|
|
||
|
/** set patient's name
|
||
|
** @param value value to be set (single value only) or "" for no value
|
||
|
* @param check check 'value' for conformance with VR (PN) and VM (1) if enabled
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition setPatientName(const OFString &value,
|
||
|
const OFBool check = OFTrue);
|
||
|
|
||
|
/** set patient's birth date
|
||
|
** @param value value to be set (single value only) or "" for no value
|
||
|
* @param check check 'value' for conformance with VR (DA) and VM (1) if enabled
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition setPatientBirthDate(const OFString &value,
|
||
|
const OFBool check = OFTrue);
|
||
|
|
||
|
/** set patient's sex
|
||
|
** @param value value to be set (single value only) or "" for no value
|
||
|
* @param check check 'value' for conformance with VR (CS) and VM (1) if enabled
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition setPatientSex(const OFString &value,
|
||
|
const OFBool check = OFTrue);
|
||
|
|
||
|
/** set referring physician's name
|
||
|
** @param value value to be set (single value only) or "" for no value
|
||
|
* @param check check 'value' for conformance with VR (PN) and VM (1) if enabled
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition setReferringPhysicianName(const OFString &value,
|
||
|
const OFBool check = OFTrue);
|
||
|
|
||
|
/** set study description
|
||
|
** @param value value to be set (single value only) or "" for no value
|
||
|
* @param check check 'value' for conformance with VR (LO) and VM (1) if enabled
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition setStudyDescription(const OFString &value,
|
||
|
const OFBool check = OFTrue);
|
||
|
|
||
|
/** set series description
|
||
|
** @param value value to be set (single value only) or "" for no value
|
||
|
* @param check check 'value' for conformance with VR (LO) and VM (1) if enabled
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition setSeriesDescription(const OFString &value,
|
||
|
const OFBool check = OFTrue);
|
||
|
|
||
|
/** set protocol name
|
||
|
** @param value value to be set (single value only) or "" for no value
|
||
|
* @param check check 'value' for conformance with VR (LO) and VM (1) if enabled
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition setProtocolName(const OFString &value,
|
||
|
const OFBool check = OFTrue);
|
||
|
|
||
|
/** set manufacturer
|
||
|
** @param value value to be set (single value only) or "" for no value
|
||
|
* @param check check 'value' for conformance with VR (LO) and VM (1) if enabled
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition setManufacturer(const OFString &value,
|
||
|
const OFBool check = OFTrue);
|
||
|
|
||
|
/** set manufacturer's model name
|
||
|
** @param value value to be set (single value only) or "" for no value
|
||
|
* @param check check 'value' for conformance with VR (LO) and VM (1) if enabled
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition setManufacturerModelName(const OFString &value,
|
||
|
const OFBool check = OFTrue);
|
||
|
|
||
|
/** set device serial number
|
||
|
** @param value value to be set (single value only) or "" for no value
|
||
|
* @param check check 'value' for conformance with VR (LO) and VM (1) if enabled
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition setDeviceSerialNumber(const OFString &value,
|
||
|
const OFBool check = OFTrue);
|
||
|
|
||
|
/** set software version(s)
|
||
|
** @param value value to be set (possibly multi-valued) or "" for no value
|
||
|
* @param check check 'value' for conformance with VR (LO) and VM (1-n) if enabled
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition setSoftwareVersions(const OFString &value,
|
||
|
const OFBool check = OFTrue);
|
||
|
|
||
|
/** set content date
|
||
|
** @param value value to be set (single value only). If an empty string is passed,
|
||
|
* the current date is set when displaying or writing the document since
|
||
|
* the corresponding DICOM attribute is mandatory.
|
||
|
* @param check check 'value' for conformance with VR (DA) and VM (1) if enabled
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition setContentDate(const OFString &value,
|
||
|
const OFBool check = OFTrue);
|
||
|
|
||
|
/** set content time
|
||
|
** @param value value to be set (single value only). If an empty string is passed,
|
||
|
* the current time is set when displaying or writing the document since
|
||
|
* the corresponding DICOM attribute is mandatory.
|
||
|
* @param check check 'value' for conformance with VR (TM) and VM (1) if enabled
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition setContentTime(const OFString &value,
|
||
|
const OFBool check = OFTrue);
|
||
|
|
||
|
/** set study date
|
||
|
** @param value value to be set (single value only) or "" for no value
|
||
|
* @param check check 'value' for conformance with VR (DA) and VM (1) if enabled
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition setStudyDate(const OFString &value,
|
||
|
const OFBool check = OFTrue);
|
||
|
|
||
|
/** set study time
|
||
|
** @param value value to be set (single value only) or "" for no value
|
||
|
* @param check check 'value' for conformance with VR (TM) and VM (1) if enabled
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition setStudyTime(const OFString &value,
|
||
|
const OFBool check = OFTrue);
|
||
|
|
||
|
/** set series date
|
||
|
** @param value value to be set (single value only) or "" for no value
|
||
|
* @param check check 'value' for conformance with VR (DA) and VM (1) if enabled
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition setSeriesDate(const OFString &value,
|
||
|
const OFBool check = OFTrue);
|
||
|
|
||
|
/** set series time
|
||
|
** @param value value to be set (single value only) or "" for no value
|
||
|
* @param check check 'value' for conformance with VR (TM) and VM (1) if enabled
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition setSeriesTime(const OFString &value,
|
||
|
const OFBool check = OFTrue);
|
||
|
|
||
|
/** set study ID
|
||
|
** @param value value to be set (single value only) or "" for no value
|
||
|
* @param check check 'value' for conformance with VR (SH) and VM (1) if enabled
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition setStudyID(const OFString &value,
|
||
|
const OFBool check = OFTrue);
|
||
|
|
||
|
/** set patient ID
|
||
|
** @param value value to be set (single value only) or "" for no value
|
||
|
* @param check check 'value' for conformance with VR (LO) and VM (1) if enabled
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition setPatientID(const OFString &value,
|
||
|
const OFBool check = OFTrue);
|
||
|
|
||
|
/** set series number
|
||
|
** @param value value to be set (single value only). If an empty string is passed,
|
||
|
* the value "1" is set when displaying or writing the document since
|
||
|
* the corresponding DICOM attribute is mandatory.
|
||
|
* @param check check 'value' for conformance with VR (IS) and VM (1) if enabled
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition setSeriesNumber(const OFString &value,
|
||
|
const OFBool check = OFTrue);
|
||
|
|
||
|
/** set instance number
|
||
|
** @param value value to be set (single value only). If an empty string is passed,
|
||
|
* the value "1" is set when displaying or writing the document since
|
||
|
* the corresponding DICOM attribute is mandatory.
|
||
|
* @param check check 'value' for conformance with VR (IS) and VM (1) if enabled
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition setInstanceNumber(const OFString &value,
|
||
|
const OFBool check = OFTrue);
|
||
|
|
||
|
/** set accession number
|
||
|
** @param value value to be set (single value only) or "" for no value
|
||
|
* @param check check 'value' for conformance with VR (SH) and VM (1) if enabled
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition setAccessionNumber(const OFString &value,
|
||
|
const OFBool check = OFTrue);
|
||
|
|
||
|
|
||
|
// --- document management functions ---
|
||
|
|
||
|
/** create new study.
|
||
|
* After generating a new study instance UID the method createNewSeries() is called,
|
||
|
* i.e. also a new series instance UID and SOP instance UID are generated. This is
|
||
|
* a requirement of the DICOM standard. All other study-related attributes are
|
||
|
* cleared.
|
||
|
*/
|
||
|
virtual void createNewStudy();
|
||
|
|
||
|
/** create a new series.
|
||
|
* After generating a new series instance UID the method createNewSOPInstance() is
|
||
|
* called, i.e. also a new SOP instance UID is generated. This is a requirement of
|
||
|
* the DICOM standard. All other series-related attributes are cleared.
|
||
|
*/
|
||
|
virtual void createNewSeries();
|
||
|
|
||
|
/** create a new series within a given study.
|
||
|
* After generating a new series instance UID within the given study the method
|
||
|
* createNewSOPInstance() is called, i.e. also a SOP instance UID is generated.
|
||
|
* This is a requirement of the DICOM standard.
|
||
|
* NB: There is no mechanism that makes sure that the study-related attributes are
|
||
|
* consistent for all series of a study. This either has to be done manually
|
||
|
* or readStudyData() should be used in combination with createNewSeries().
|
||
|
** @param studyUID study instance UID to be set (should be a valid UID)
|
||
|
* @param check check 'studyUID' for conformance with VR and VM if enabled
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition createNewSeriesInStudy(const OFString &studyUID,
|
||
|
const OFBool check = OFTrue);
|
||
|
|
||
|
/** create a new SOP instance.
|
||
|
* Generate a new SOP instance UID, set the instance creation date/time and reset the
|
||
|
* finalized flag (OFFalse).
|
||
|
* This method is used internally for createNewDocument(), createRevisedVersion()
|
||
|
* and during object initialization.
|
||
|
* It could also be used explicitly from the calling application if a new UID should
|
||
|
* be created (this is the case if the study instance UID or series instance UID has
|
||
|
* changed as well as any other attribute within the SR Document General Module or
|
||
|
* SR Document Content Module, see DICOM standard for details).
|
||
|
* This method also updates other DICOM header attributes (by calling updateAttributes()).
|
||
|
* However, instance-level attributes other than the SOP instance UID are usually not
|
||
|
* changed (if already set), e.g. the current instance number or content date/time.
|
||
|
*/
|
||
|
virtual void createNewSOPInstance();
|
||
|
|
||
|
/** create a new document.
|
||
|
* A new SOP instance is only created if the current document type was valid/supported.
|
||
|
* Please note that the current document is deleted (cleared).
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition createNewDocument();
|
||
|
|
||
|
/** create a new document of the specified type.
|
||
|
* A new SOP instance is only created if the current document type was valid/supported.
|
||
|
* Please note that the current document is deleted by this method.
|
||
|
** @param documentType type of the new SR document (see DSRTypes::E_DocumentType)
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition createNewDocument(const E_DocumentType documentType);
|
||
|
|
||
|
/** change the type of the current document.
|
||
|
* Please note that only the type of the SR document is changed (if possible) but no new
|
||
|
* SOP instance is created. If needed, this has to be done with createNewSOPInstance()
|
||
|
* in addition to this method or by calling createNewDocument() instead of this method.
|
||
|
* Before changing the document type, it is checked whether the currently stored document
|
||
|
* tree complies with the relationship content constraints of the new SR IOD.
|
||
|
** @param documentType new type of the SR document (see DSRTypes::E_DocumentType)
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition changeDocumentType(const E_DocumentType documentType);
|
||
|
|
||
|
/** create a revised version of the current document.
|
||
|
* A revised version can only be created if the current document is already completed
|
||
|
* (see completion flag). If so, a reference to the current document is added to the
|
||
|
* predecessor documents sequence. If all revised versions of a SR document are
|
||
|
* stored (written to datasets/files) it is possible to trace back the full chain of
|
||
|
* previous versions.
|
||
|
* A new SOP instance is created and the content date/time are set automatically.
|
||
|
* Furthermore, the verifying observer and identical documents sequence are deleted,
|
||
|
* the verification flag is set to UNVERIFIED, the completion flag is set to PARTIAL
|
||
|
* (i.e. not complete), the completion flag description is deleted, all digital
|
||
|
* signatures contained in the document tree are deleted and the finalized flag is
|
||
|
* reset (OFFalse). The preliminary flag is not modified by this method. Also the
|
||
|
* various lists of referenced instances remain unchanged, i.e. they have to be
|
||
|
* adapted manually if needed.
|
||
|
* @note Not applicable to Key Object Selection Documents.
|
||
|
* @param clearList clear list of predecessor documents before adding the current
|
||
|
* document if OFTrue. Append current document to existing list
|
||
|
* otherwise.
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition createRevisedVersion(const OFBool clearList = OFTrue);
|
||
|
|
||
|
/** complete the current document.
|
||
|
* Sets the completion flag to COMPLETE if not already done (fails otherwise). This flag
|
||
|
* describes the estimated degree of completeness of an SR Document (see DICOM standard
|
||
|
* for details). The completion flag description is set to an empty string (i.e. absent
|
||
|
* in DICOM dataset).
|
||
|
* @note Not applicable to Key Object Selection Documents.
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition completeDocument();
|
||
|
|
||
|
/** complete the current document and set a completion description.
|
||
|
* Sets the completion flag to COMPLETE if not already done (fails otherwise). This flag
|
||
|
* describes the estimated degree of completeness of an SR Document (see DICOM standard
|
||
|
* for details). The completion flag description can be modified independently from the
|
||
|
* flag by means of the method setCompletionFlagDescription() - see above.
|
||
|
* @note Not applicable to Key Object Selection Documents.
|
||
|
** @param description explanation of the value set for completion flag.
|
||
|
* (optional, see previous method, VR=LO)
|
||
|
* @param check check 'description' for conformance with VR and VM if enabled
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition completeDocument(const OFString &description,
|
||
|
const OFBool check = OFTrue);
|
||
|
|
||
|
/** verify the current document by a specific observer.
|
||
|
* A document can be verified more than once. The observer information is added to a
|
||
|
* sequence stored in the dataset. The verification flag is automatically set to
|
||
|
* VERIFIED (if not already done) and the finalized flag is reset (set to OFFalse).
|
||
|
* Please note that only completed documents (see completion flag) can be verified and that
|
||
|
* a new SOP instance UID has to be generated (manually) according to the DICOM standard when
|
||
|
* creating a dataset/file from this document.
|
||
|
* @note Not applicable to Key Object Selection Documents.
|
||
|
** @param observerName name of the person who has verified this document (required, VR=PN)
|
||
|
* @param organization name of the organization to which the observer belongs (required, VR=LO)
|
||
|
* @param dateTime verification date time (optional). If empty/absent the current date and
|
||
|
* time are used.
|
||
|
* @param check check 'observerName', 'organization' and 'dateTime' for conformance with
|
||
|
* VR and VM if enabled
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition verifyDocument(const OFString &observerName,
|
||
|
const OFString &organization,
|
||
|
const OFString &dateTime = "",
|
||
|
const OFBool check = OFTrue);
|
||
|
|
||
|
/** verify the current document by a specific observer.
|
||
|
* A document can be verified more than once. The observer information is added to a
|
||
|
* sequence stored in the dataset. The verification flag is automatically set to
|
||
|
* VERIFIED (if not already done) and the finalized flag is reset (set to OFFalse).
|
||
|
* Please note that only completed documents (see completion flag) can be verified and that
|
||
|
* a new SOP instance UID has to be generated (manually) according to the DICOM standard when
|
||
|
* creating a dataset/file from this document.
|
||
|
* @note Not applicable to Key Object Selection Documents.
|
||
|
** @param observerName name of the person who has verified this document (required, VR=PN)
|
||
|
* @param observerCode code identifying the verifying observer (optional, see previous method)
|
||
|
* @param organization name of the organization to which the observer belongs (required, VR=LO)
|
||
|
* @param dateTime verification date time (optional). If empty/absent the current date and
|
||
|
* time are used.
|
||
|
* @param check check 'observerName', 'observerCode', 'organization' and 'dateTime' for
|
||
|
* conformance with VR and VM if enabled
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition verifyDocument(const OFString &observerName,
|
||
|
const DSRCodedEntryValue &observerCode,
|
||
|
const OFString &organization,
|
||
|
const OFString &dateTime = "",
|
||
|
const OFBool check = OFTrue);
|
||
|
|
||
|
/** remove verification information.
|
||
|
* The list of verifying observers is cleared, the verification flag is set to UNVERIFIED and
|
||
|
* the finalized flag is reset (set to OFFalse).
|
||
|
* Normally, there should be no need to call this method. On the other hand, it is useful to
|
||
|
* guarantee a consistent state when processing documents which have not been created with this
|
||
|
* module/toolkit.
|
||
|
*/
|
||
|
virtual void removeVerification();
|
||
|
|
||
|
/** finalize the current state of the document.
|
||
|
* A new document is originally not finalized but can be finalized using this method.
|
||
|
* This internal flag is e.g. used to indicate whether the entire document is digitally signed
|
||
|
* and, therefore, each newly added verifying observer would corrupt all previous signatures.
|
||
|
* NB: A document needs to be completed first in order to be finalized. Some of the above
|
||
|
* document management functions do reset the flag (i.e. set the FinalizedFlag to OFFalse),
|
||
|
* other methods (e.g. setXXX) do not change the flag though the state of the document is
|
||
|
* not finalized any more after they have been called.
|
||
|
* @note Not applicable to Key Object Selection Documents since there's no completion flag in
|
||
|
* this type of SR document. Please note that this method has nothing to do with the
|
||
|
* preliminary flag.
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
virtual OFCondition finalizeDocument();
|
||
|
|
||
|
|
||
|
protected:
|
||
|
|
||
|
/** read XML document header
|
||
|
** @param doc document containing the XML file content
|
||
|
* @param cursor cursor pointing to the starting node
|
||
|
* @param flags flag used to customize the reading process (see DSRTypes::XF_xxx)
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
OFCondition readXMLDocumentHeader(DSRXMLDocument &doc,
|
||
|
DSRXMLCursor cursor,
|
||
|
const size_t flags);
|
||
|
|
||
|
/** read XML "patient" data
|
||
|
** @param doc document containing the XML file content
|
||
|
* @param cursor cursor pointing to the starting node
|
||
|
* @param flags flag used to customize the reading process (see DSRTypes::XF_xxx)
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
OFCondition readXMLPatientData(const DSRXMLDocument &doc,
|
||
|
DSRXMLCursor cursor,
|
||
|
const size_t flags);
|
||
|
|
||
|
/** read XML "study" data
|
||
|
** @param doc document containing the XML file content
|
||
|
* @param cursor cursor pointing to the starting node
|
||
|
* @param flags flag used to customize the reading process (see DSRTypes::XF_xxx)
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
OFCondition readXMLStudyData(const DSRXMLDocument &doc,
|
||
|
DSRXMLCursor cursor,
|
||
|
const size_t flags);
|
||
|
|
||
|
/** read XML "series" data
|
||
|
** @param doc document containing the XML file content
|
||
|
* @param cursor cursor pointing to the starting node
|
||
|
* @param flags flag used to customize the reading process (see DSRTypes::XF_xxx)
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
OFCondition readXMLSeriesData(const DSRXMLDocument &doc,
|
||
|
DSRXMLCursor cursor,
|
||
|
const size_t flags);
|
||
|
|
||
|
/** read XML "instance" data
|
||
|
** @param doc document containing the XML file content
|
||
|
* @param cursor cursor pointing to the starting node
|
||
|
* @param flags flag used to customize the reading process (see DSRTypes::XF_xxx)
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
OFCondition readXMLInstanceData(const DSRXMLDocument &doc,
|
||
|
DSRXMLCursor cursor,
|
||
|
const size_t flags);
|
||
|
|
||
|
/** read XML "document" data
|
||
|
** @param doc document containing the XML file content
|
||
|
* @param cursor cursor pointing to the starting node
|
||
|
* @param flags flag used to customize the reading process (see DSRTypes::XF_xxx)
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
OFCondition readXMLDocumentData(const DSRXMLDocument &doc,
|
||
|
DSRXMLCursor cursor,
|
||
|
const size_t flags);
|
||
|
|
||
|
/** read XML verifying observer data
|
||
|
** @param doc document containing the XML file content
|
||
|
* @param cursor cursor pointing to the starting node
|
||
|
* @param flags flag used to customize the reading process (see DSRTypes::XF_xxx)
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
OFCondition readXMLVerifyingObserverData(const DSRXMLDocument &doc,
|
||
|
DSRXMLCursor cursor,
|
||
|
const size_t flags);
|
||
|
|
||
|
/** render patient name, sex, birthdate and ID in HTML/XHTML format
|
||
|
** @param stream output stream to which the HTML/XHTML document is written
|
||
|
* @param flags flag used to customize the output (see DSRTypes::HF_xxx)
|
||
|
*/
|
||
|
void renderHTMLPatientData(STD_NAMESPACE ostream &stream,
|
||
|
const size_t flags);
|
||
|
|
||
|
/** render list of referenced SOP instances in HTML/XHTML format
|
||
|
** @param stream output stream to which the HTML/XHTML document is written
|
||
|
* @param refList list of referenced SOP instances to be rendered
|
||
|
* @param flags flag used to customize the output (see DSRTypes::HF_xxx)
|
||
|
*/
|
||
|
void renderHTMLReferenceList(STD_NAMESPACE ostream &stream,
|
||
|
DSRSOPInstanceReferenceList &refList,
|
||
|
const size_t flags);
|
||
|
|
||
|
/** render list of referenced SOP instances in HTML/XHTML format
|
||
|
** @param stream output stream to which the HTML/XHTML document is written
|
||
|
* @param refList list of referenced SOP instances to be rendered
|
||
|
* @param flags flag used to customize the output (see DSRTypes::HF_xxx)
|
||
|
*/
|
||
|
void renderHTMLReferenceList(STD_NAMESPACE ostream &stream,
|
||
|
DSRReferencedInstanceList &refList,
|
||
|
const size_t flags);
|
||
|
|
||
|
/** check the given dataset before reading.
|
||
|
* This methods checks whether the dataset contains at least the DICOM attributes SOP class UID
|
||
|
* and modality. Any incorrectness regarding these two attributes is reported to the logger.
|
||
|
* Currently unsupported SOP classes are also reported as an error.
|
||
|
** @param dataset DICOM dataset to be checked
|
||
|
* @param documentType SR document type retrieved from the SOP class UID
|
||
|
** @return status, EC_Normal if successful, an error code otherwise
|
||
|
*/
|
||
|
OFCondition checkDatasetForReading(DcmItem &dataset,
|
||
|
E_DocumentType &documentType);
|
||
|
|
||
|
/** get current value of specific character set
|
||
|
** @return pointer to character string (never NULL)
|
||
|
*/
|
||
|
const char *getSpecificCharacterSet() const;
|
||
|
|
||
|
/** update various DICOM attributes.
|
||
|
* (e.g. set the modality and SOP class UID, generate a new Study, Series and SOP instance UID
|
||
|
* if required, set date/time values, etc.)
|
||
|
** @param updateAll flag indicating whether all DICOM attributes should be updated or only
|
||
|
* the IOD-specific ones. (e.g. set DICOM defined terms from enum values)
|
||
|
*/
|
||
|
void updateAttributes(const OFBool updateAll = OFTrue);
|
||
|
|
||
|
|
||
|
private:
|
||
|
|
||
|
/// SR document tree
|
||
|
DSRDocumentTree DocumentTree;
|
||
|
|
||
|
/// flag indicating whether this document is finalized or not
|
||
|
OFBool FinalizedFlag;
|
||
|
/// enumerated value: preliminary, final
|
||
|
E_PreliminaryFlag PreliminaryFlagEnum;
|
||
|
/// enumerated value: partial, complete
|
||
|
E_CompletionFlag CompletionFlagEnum;
|
||
|
/// enumerated value: unverified, verified
|
||
|
E_VerificationFlag VerificationFlagEnum;
|
||
|
/// defined term: see class DSRTypes
|
||
|
E_CharacterSet SpecificCharacterSetEnum;
|
||
|
|
||
|
// DICOM attributes are listed ordered by Module.
|
||
|
// The comments for each attribute describe "Name: (VR, VM, Type)".
|
||
|
// Please note that for particular SR documents (e.g. Key Object Selection)
|
||
|
// other rules might apply. See DICOM standard for further reference.
|
||
|
|
||
|
// --- SOP Common Module (M) ---
|
||
|
// (see SR Document General Module)
|
||
|
|
||
|
/// SOP Class UID: (UI, 1, 1)
|
||
|
DcmUniqueIdentifier SOPClassUID;
|
||
|
/// SOP Instance UID: (UI, 1, 1)
|
||
|
DcmUniqueIdentifier SOPInstanceUID;
|
||
|
/// Specific Character Set: (CS, 1-n, 1C)
|
||
|
DcmCodeString SpecificCharacterSet;
|
||
|
/// Instance Creation Date: (DA, 1, 3)
|
||
|
DcmDate InstanceCreationDate;
|
||
|
/// Instance Creation Time: (TM, 1, 3)
|
||
|
DcmTime InstanceCreationTime;
|
||
|
/// Instance Creator UID: (UI, 1, 3)
|
||
|
DcmUniqueIdentifier InstanceCreatorUID;
|
||
|
/// Coding Scheme Identification Sequence: (SQ, 1-n, 3)
|
||
|
DSRCodingSchemeIdentificationList CodingSchemeIdentification;
|
||
|
|
||
|
// --- General Study Module (M) ---
|
||
|
|
||
|
/// Study Instance UID: (UI, 1, 1)
|
||
|
DcmUniqueIdentifier StudyInstanceUID;
|
||
|
/// Study Date: (DA, 1, 2)
|
||
|
DcmDate StudyDate;
|
||
|
/// Study Time: (TM, 1, 2)
|
||
|
DcmTime StudyTime;
|
||
|
/// Referring Physician's Name: (PN, 1, 2)
|
||
|
DcmPersonName ReferringPhysicianName;
|
||
|
/// Study ID: (SH, 1, 2)
|
||
|
DcmShortString StudyID;
|
||
|
/// Accession Number: (SH, 1, 2)
|
||
|
DcmShortString AccessionNumber;
|
||
|
/// Study Description: (LO, 1, 3)
|
||
|
DcmLongString StudyDescription;
|
||
|
|
||
|
// --- Patient Module (M) ---
|
||
|
|
||
|
/// Patient's Name: (PN, 1, 2)
|
||
|
DcmPersonName PatientName;
|
||
|
/// Patient ID: (LO, 1, 2)
|
||
|
DcmLongString PatientID;
|
||
|
/// Patient's Birth Date: (DA, 1, 2)
|
||
|
DcmDate PatientBirthDate;
|
||
|
/// Patient's Sex: (CS, 1, 2)
|
||
|
DcmCodeString PatientSex;
|
||
|
|
||
|
// --- General Equipment Module (M) ---
|
||
|
|
||
|
/// Manufacturer: (LO, 1, 2)
|
||
|
DcmLongString Manufacturer;
|
||
|
/// Manufacturer's Model Name: (LO, 1, 3)
|
||
|
DcmLongString ManufacturerModelName;
|
||
|
/// Device Serial Number: (LO, 1, 3)
|
||
|
DcmLongString DeviceSerialNumber;
|
||
|
/// Software Version(s): (LO, 1-n, 3)
|
||
|
DcmLongString SoftwareVersions;
|
||
|
|
||
|
// --- Enhanced General Equipment Module (M - for some IODs) ---
|
||
|
|
||
|
// Manufacturer: (LO, 1, 1)
|
||
|
// - see 'General Equipment Module'
|
||
|
// Manufacturer's Model Name: (LO, 1, 1)
|
||
|
// - see 'General Equipment Module'
|
||
|
// Device Serial Number: (LO, 1, 1)
|
||
|
// - see 'General Equipment Module'
|
||
|
// Software Version(s): (LO, 1-n, 1)
|
||
|
// - see 'General Equipment Module'
|
||
|
|
||
|
// --- Synchronization Module (C/U - for some IODs) ---
|
||
|
|
||
|
// tbd: conditional/optional module not yet supported
|
||
|
|
||
|
// --- SR Document Series / Key Object Document Series Module (M) ---
|
||
|
|
||
|
/// Modality: (CS, 1, 1)
|
||
|
DcmCodeString Modality;
|
||
|
/// Series Instance Number: (UI, 1, 1)
|
||
|
DcmUniqueIdentifier SeriesInstanceUID;
|
||
|
/// Series Number: (IS, 1, 1)
|
||
|
DcmIntegerString SeriesNumber;
|
||
|
/// Series Date: (DA, 1, 3)
|
||
|
DcmDate SeriesDate;
|
||
|
/// Series Time: (TM, 1, 3)
|
||
|
DcmTime SeriesTime;
|
||
|
/// Protocol Name: (LO, 1, 3)
|
||
|
DcmLongString ProtocolName;
|
||
|
/// Series Description: (LO, 1, 3)
|
||
|
DcmLongString SeriesDescription;
|
||
|
/// Series Description Code Sequence: (SQ, 1, 3)
|
||
|
// - tbd: optional attribute not yet supported
|
||
|
/// Referenced Performed Procedure Step Sequence: (SQ, 1, 2)
|
||
|
DcmSequenceOfItems ReferencedPerformedProcedureStep;
|
||
|
|
||
|
// --- SR Document General Module (M) ---
|
||
|
|
||
|
/// Instance Number: (IS, 1, 1)
|
||
|
DcmIntegerString InstanceNumber;
|
||
|
/// Preliminary Flag: (CS, 1, 3)
|
||
|
DcmCodeString PreliminaryFlag;
|
||
|
/// Completion Flag: (CS, 1, 1)
|
||
|
DcmCodeString CompletionFlag;
|
||
|
/// Completion Flag Description: (LO, 1, 3)
|
||
|
DcmLongString CompletionFlagDescription;
|
||
|
/// Verification Flag: (CS, 1, 1)
|
||
|
DcmCodeString VerificationFlag;
|
||
|
/// Content Date: (DA, 1, 1)
|
||
|
DcmDate ContentDate;
|
||
|
/// Content Time: (TM, 1, 1)
|
||
|
DcmTime ContentTime;
|
||
|
/// Verifying Observer Sequence: (SQ, 1-n, 1C)
|
||
|
DcmSequenceOfItems VerifyingObserver;
|
||
|
/// Author Observer Sequence: (SQ, 1-n, 3)
|
||
|
// - tbd: optional attribute not yet supported
|
||
|
/// Participant Sequence: (SQ, 1-n, 3)
|
||
|
// - tbd: optional attribute not yet supported
|
||
|
/// Custodial Organization Sequence: (SQ, 1, 3)
|
||
|
// - tbd: optional attribute not yet supported
|
||
|
/// Predecessor Documents Sequence: (SQ, 1-n, 1C)
|
||
|
DSRSOPInstanceReferenceList PredecessorDocuments;
|
||
|
/// Identical Documents Sequence: (SQ, 1-n, 1C)
|
||
|
DSRSOPInstanceReferenceList IdenticalDocuments;
|
||
|
// Referenced Request Sequence: (SQ, 1-n, 1C)
|
||
|
// - tbd: conditional attribute not yet supported
|
||
|
/// Performed Procedure Code Sequence: (SQ, 1-n, 2)
|
||
|
DcmSequenceOfItems PerformedProcedureCode;
|
||
|
/// Current Requested Procedure Evidence Sequence: (SQ, 1-n, 1C)
|
||
|
DSRSOPInstanceReferenceList CurrentRequestedProcedureEvidence;
|
||
|
/// Pertinent Other Evidence Sequence: (SQ, 1-n, 1C)
|
||
|
DSRSOPInstanceReferenceList PertinentOtherEvidence;
|
||
|
/// Referenced Instance Sequence: (SQ, 1-n, 1C)
|
||
|
DSRReferencedInstanceList ReferencedInstances;
|
||
|
|
||
|
// --- declaration of copy constructor and assignment operator ---
|
||
|
|
||
|
DSRDocument(const DSRDocument &);
|
||
|
DSRDocument &operator=(const DSRDocument &);
|
||
|
};
|
||
|
|
||
|
|
||
|
#endif
|