DYT/Tool/3rdParty_x64/include/dcmtk/dcmiod/modmultiframedimension.h
2024-11-22 23:19:31 +08:00

386 lines
17 KiB
C++

/*
*
* Copyright (C) 2015-2016, Open Connections GmbH
* All rights reserved. See COPYRIGHT file for details.
*
* This software and supporting documentation are maintained by
*
* OFFIS e.V.
* R&D Division Health
* Escherweg 2
* D-26121 Oldenburg, Germany
*
*
* Module: dcmiod
*
* Author: Michael Onken
*
* Purpose: Class for managing the Multi-Frame Dimension Module
*
*/
#ifndef MODMULTIFRAMEDIMENSION_H
#define MODMULTIFRAMEDIMENSION_H
#include "dcmtk/config/osconfig.h"
#include "dcmtk/dcmiod/iodrules.h"
#include "dcmtk/dcmiod/modbase.h"
/** Class representing the Multi-Frame Dimension Module:
*
* Dimension Organization Sequence: (SQ, VM 1-n, Type 1)
* > Dimension Organization UID: (UI, 1, 1)
* Dimension Organization Type: (CS, 1, 1)
* Dimension Index Sequence: (SQ, 1-n, 1)
* > Dimension Index Pointer (AT, 1, 1)
* > Dimension Index Private Creator (LO, 1, 1C)
* > Functional Group Pointer (AT, 1, 1C)
* > Functional Group Private Creator (LO, 1, 1C)
* > Dimension Organization UID (UI, 1, 1C)
* > Dimension Description Label (LO, 1, 3)
*
* The Dimension Organization UIDs within the Dimension Organization Sequence
* cannot be set explicitly. Instead the sequence is populated from the data
* found within the Dimension Index Sequence.
*/
class DCMTK_DCMIOD_EXPORT IODMultiframeDimensionModule : public IODModule
{
public:
/** Helper class representing an item within the Dimension Index Sequence,
* i.e.\ a single dimension description
*/
class DimensionOrganizationItem : public IODComponent
{
public:
/** Constructor
* @param data The item to be used for data storage. If NULL, the
* class creates an empty data container.
* @param rules The rule set for this class. If NULL, the class creates
* one from scratch and adds its values.
* @param parent The parent of the IOD component (NULL if none or unknown)
*/
DimensionOrganizationItem(OFshared_ptr<DcmItem> data,
OFshared_ptr<IODRules> rules,
IODComponent* parent);
/** Constructor
* @param parent The parent of the IOD component (NULL if none or unknown)
*/
DimensionOrganizationItem(IODComponent* parent = NULL);
/** Destructor
*/
virtual ~DimensionOrganizationItem();
/** Get name of module ("DimensionIndexPointerSequence")
* @return Name of the module ("DimensionIndexPointerSequence")
*/
virtual OFString getName() const;
/** Resets rules of this module to their original values
*/
virtual void resetRules();
/** Get Dimension Organization 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 EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getDimensionOrganizationUID(OFString &value,
const signed long pos = 0) const;
/** Set Dimension Organization UID
* @param value Value to be set (single value only) or "" for no value
* @param checkValue Check 'value' for conformance with VR (PN) and VM (1) if enabled
* @return status EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setDimensionOrganizationUID(const OFString& value,
const OFBool checkValue = OFTrue);
};
/** Class representing a Dimension Index Pointer Sequence Item
* managed by the Multi-frame Dimension Module
*/
class DimensionIndexItem : public IODComponent
{
public:
/** Constructor
* @param data The item to be used for data storage. If NULL, the
* class creates an empty data container.
* @param rules The rule set for this class. If NULL, the class creates
* one from scratch and adds its values.
* @param parent The parent of the IOD component (NULL if none or unknown)
*/
DimensionIndexItem(OFshared_ptr<DcmItem> data,
OFshared_ptr<IODRules> rules,
IODComponent* parent);
/** Constructor
* @param parent The parent of the IOD component (NULL if none or unknown)
*/
DimensionIndexItem(IODComponent* parent = NULL);
/** Destructor
*/
virtual ~DimensionIndexItem();
/** Get name of module ("DimensionIndexSequence")
* @return Name of the module ("[parent.]DimensionIndexSequence")
*/
virtual OFString getName() const;
/** Resets rules to their original values
*/
virtual void resetRules();
/** Get Dimension Index Pointer
* @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 EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getDimensionIndexPointer(DcmTagKey &value,
const signed long pos = 0) const;
/** Get Dimension Index Private Creator
* @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 EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getDimensionIndexPrivateCreator(OFString& value,
const signed long pos = 0) const;
/** Get Functional Group Pointer
* @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 EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getFunctionalGroupPointer(DcmTagKey &value,
const signed long pos = 0) const;
/** Get Functional Group Private Creator
* @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 EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getFunctionalGroupPrivateCreator(OFString &value,
const signed long pos = 0) const;
/** Get Dimension Organization 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 EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getDimensionOrganizationUID(OFString &value,
const signed long pos = 0) const;
/** Get Dimension Description Label
* @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 EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getDimensionDescriptionLabel(OFString &value,
const signed long pos = 0) const;
/** Set Dimension Index Pointer
* @param value Value to be set (single value only) or "" for no value
* @param checkValue Check 'value'. Not evaluated (here for consistency
* with other setter functions).
* @return status EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setDimensionIndexPointer(const DcmTagKey&value,
const OFBool checkValue = OFTrue);
/** Set Dimension Index Private Creator
* @param value Value to be set (single value only) or "" for no value
* @param checkValue Check 'value' for conformance with VR (PN) and VM (1) if enabled
* @return status EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setDimensionIndexPrivateCreator(const OFString& value,
const OFBool checkValue = OFTrue);
/** Set Dimension Index Functional Group Pointer
* @param value Value to be set (single value only) or "" for no value
* @param checkValue Check 'value'. Not evaluated (here for consistency
* with other setter functions).
* @return status EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setFunctionalGroupPointer(const DcmTagKey& value,
const OFBool checkValue = OFTrue);
/** Set Dimension Index Functional Group Private Creator
* @param value Value to be set (single value only) or "" for no value
* @param checkValue Check 'value. Not evaluated (here for consistency
* with other setter functions).
*
* @return status EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setFunctionalGroupPrivateCreator(const OFString& value,
const OFBool checkValue = OFTrue);
/** Set Dimension Organization UID
* @param value Value to be set (single value only) or "" for no value
* @param checkValue Check 'value' for conformance with VR and VM if enabled
* @return status EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setDimensionOrganizationUID(const OFString& value,
const OFBool checkValue = OFTrue);
/** Set Dimension Description Label
* @param value Value to be set (single value only) or "" for no value
* @param checkValue Check 'value' for conformance with VR and VM if enabled
* @return status EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setDimensionDescriptionLabel(const OFString& value,
const OFBool checkValue = OFTrue);
};
/** Constructor
* @param item The item to be used for data storage. If NULL, the
* class creates an empty data container.
* @param rules The rule set for this class. If NULL, the class creates
* one from scratch and adds its values.
*/
IODMultiframeDimensionModule(OFshared_ptr<DcmItem> item,
OFshared_ptr<IODRules> rules);
/** Constructor
*/
IODMultiframeDimensionModule();
/** Destructor
*/
virtual ~IODMultiframeDimensionModule();
/** Convenience method to add Dimension Index.
* @param dimensionIndexPointer The Dimension Index Pointer attribute
* @param dimensionOrganizationUID The Dimension Organization UID of the dimension organization
* the pointer refers to
* @param functionalGroupPointer The functional group where the pointer attribute can be found
* @param dimensionDescriptionLabel The description label of this dimension (optional)
* @param dimensionIndexPrivateCreator The private creator of the Dimension Index Pointer
* attribute. Required if dimensionIndexPointer points to a private attribute tag.
* @param functionalGroupPrivateCreator The private creator of the functional group. Required
* if functionalGroupPointer points to a private attribute tag.
* @return EC_Normal if index could be added, error otherwise (basic parameter checking)
*
*/
virtual OFCondition addDimensionIndex(const DcmTagKey& dimensionIndexPointer,
const OFString& dimensionOrganizationUID,
const DcmTagKey& functionalGroupPointer,
const OFString& dimensionDescriptionLabel = "",
const OFString& dimensionIndexPrivateCreator = "",
const OFString& functionalGroupPrivateCreator = "");
/** Clear (removes) all attributes handled by the modules of this component.
* Rules are not reset.
*/
virtual void clearData();
/** Read data into this module from given item
* @param source The item to read from
* @param clearOldData If OFTrue, old data in this module is cleared first (default: OFTrue)
* @return EC_Normal if reading was successful, error otherwise
*/
virtual OFCondition read(DcmItem& source,
const OFBool clearOldData = OFTrue);
/** Write this module to given item
* @param destination The item to write to
* @return EC_Normal if writing was successful, error otherwise
*/
virtual OFCondition write(DcmItem& destination);
/** Resets rules to their original values.
*/
virtual void resetRules();
/** Get name of module ("MultiframeDimensionModule")
* @return Name of the module ("MultiframeDimensionModule")
*/
virtual OFString getName() const;
/** Get Dimension Organization Type
* @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 EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getDimensionOrganizationType(OFString &value,
const signed long pos = 0) const;
/** Set Dimension Organization Type (Defined Terms as of DICOM 2014a "3D" and "3D_TEMPORAL")
* @param value Value to be set (single value only) or "" for no value
* @param checkValue Check 'value' for conformance with VR and VM if enabled
* @return status EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setDimensionOrganizationType(const OFString &value,
const OFBool checkValue = OFTrue);
/** Get content of the Dimension Index Sequence
* @return Reference to the Dimension Index Pointer Sequence
*/
virtual OFVector<DimensionIndexItem*>& getDimensionIndexSequence();
/** Get content of the Dimension Organization Sequence
* @return Reference to the Dimension Organization Sequence
*/
virtual OFVector<DimensionOrganizationItem*>& getDimensionOrganizationSequence();
/** Check dimensions for consistency with functional groups. Note that one can provide
* an item that provides the dataset containing the functional groups to check against.
* This item must contain on main level the Shared and Per-frame Functional Group
* Sequence. If no item is given (NULL pointer) it is tried to find these sequences
* within "this" object which works in the case that this class was initialized with
* an existing item (or the fg data was inserted in another way afterwards).
* @param fgItem The item containing functional group information
* @return EC_Normal, if consistency is fine, error otherwise
*/
virtual OFCondition checkDimensions(DcmItem* fgItem = NULL);
/** Get specific index pointer element from per-frame functional group
* sequence. Prints out error messages if index does not exist or
* index location information provided by parameters is incomplete or invalid
* @param perFrameFG An instance of the Per-Frame Functional Group Sequence that
* should be searched
* @param fgPointer The tag key of the functional group the value resides in
* @param indexPointer The tag of the dimension value inside the functional group
* @param fgPrivateCreator The private creator of the fgPointer tag key. Only required
* if fgPointer is a private tag key (odd element number)
* @param privateCreator The private creator of the indexPointer tag key. Only required
* if indexPointer is a private tag key (odd element number)
* @return The element pointed to. If element could not be located, NULL is returned.
*/
virtual DcmElement* getIndexElement(DcmSequenceOfItems* perFrameFG,
const DcmTagKey& fgPointer,
const DcmTagKey& indexPointer,
const OFString& fgPrivateCreator,
const OFString& privateCreator);
protected:
/** Go over Dimension Index Pointers and extract Dimension Organization UIDs for
* Dimension Organization Sequence.
*/
void createDimensionOrganizationData();
private:
/// This module's name (MultiframeDimensionModule)
static const OFString m_ModuleName;
/// Vector with all items of the Dimension Index Pointer Sequence
OFVector<DimensionIndexItem*> m_DimensionIndexSequence;
/// Vector with all items of the Dimension Organization Sequence
OFVector<DimensionOrganizationItem*> m_DimensionOrganizationSequence;
};
#endif // MODMULTIFRAMEDIMENSION_H