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

1118 lines
45 KiB
C++

/*
*
* Copyright (C) 1999-2012, 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: dcmpstat
*
* Author: Marco Eichelberg
*
* Purpose:
* classes: DVPSStoredPrint
*
*/
#ifndef DVPSSP_H
#define DVPSSP_H
#include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */
#include "dcmtk/ofstd/ofstream.h"
#include "dcmtk/ofstd/ofstring.h"
#include "dcmtk/dcmpstat/dvpstyp.h" /* for enum types */
#include "dcmtk/dcmpstat/dvpspll.h" /* for class DVPSPresentationLUT_PList */
#include "dcmtk/dcmpstat/dvpsibl.h" /* for class DVPSImageBoxContent_PList */
#include "dcmtk/dcmpstat/dvpsabl.h" /* for class DVPSAnnotationContent_PList */
#include "dcmtk/dcmpstat/dvpstat.h" /* for class DVPresentationState */
#include "dcmtk/dcmpstat/dvpspr.h" /* for class DVPrintMessageHandler */
class DicomImage;
class DVPSPresentationLUT;
class DVConfiguration;
/** the representation of a Stored Print object
*/
class DCMTK_DCMPSTAT_EXPORT DVPSStoredPrint
{
public:
/** constructor
* @param illumin default Illumination setting
* @param reflection default Reflected Ambient Light setting
* @param aetitle application entity title of the print originator (SCU)
*/
DVPSStoredPrint(Uint16 illumin, Uint16 reflection, const char *aetitle = NULL);
/// copy constructor
DVPSStoredPrint(const DVPSStoredPrint& copy);
/** clone method.
* @return a pointer to a new DVPSStoredPrint object containing
* a copy of this object.
*/
DVPSStoredPrint *clone() { return new DVPSStoredPrint(*this); }
/// destructor
virtual ~DVPSStoredPrint();
/** reset the object to initial state.
* After this call, the object is in the same state as after
* creation with the default constructor.
*/
void clear();
/** reads a Stored Print object from a DICOM dataset.
* The DICOM elements of the stored print object are copied
* from the dataset to this object.
* The completeness of the object (presence of all required elements,
* value multiplicity) is checked.
* If this method returns an error code, the object is in undefined state afterwards.
* @param dset the dataset from which the data is to be read
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition read(DcmItem &dset);
/** writes the Stored Print object to a DICOM dataset.
* Copies of the DICOM elements managed by this object are inserted into
* the DICOM dataset.
* @param dset the dataset to which the data is written
* @param writeRequestedImageSize if false, the Requested Image Size attributes are not written,
* e. g. because they are not supported by the target printer.
* @param limitImages if true, only the number of image references
* that are needed for the current image display format (film layout) are written.
* If false, all image references are written.
* @param updateDecimateCrop if true, the decimate/crop attribute on image box level
* is replaced by the global stored print level setting in all image boxes
* prior to writing the dataset.
* @param ignoreEmptyImages if true, all image boxes without image box position are ignored
* when writing.
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition write(
DcmItem &dset,
OFBool writeRequestedImageSize,
OFBool limitImages,
OFBool updateDecimateCrop,
OFBool ignoreEmptyImages);
/** sets the name of the current printer.
* This name is identical to the unique entry used in the configuration file.
* @return name of the current printer
*/
OFCondition setOriginator(const char *aetitle);
/** sets the application entity title of the print SCU.
* @return application entity title of the print SCU
*/
OFCondition setDestination(const char *aetitle);
/** sets the application entity title of the print SCP.
* @return application entity title of the print SCP
*/
OFCondition setPrinterName(const char *name);
/** sets the image display format to 'STANDARD\columns,rows'.
* The caller must make sure that the column and row values are
* valid for the selected printer.
* @param columns number of columns
* @param rows number of rows
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition setImageDisplayFormat(unsigned long columns, unsigned long rows);
/** sets the (optional) film size ID.
* @param value new attribute value, may be NULL.
* The caller is responsible for making sure
* that the value is valid for the selected printer.
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition setFilmSizeID(const char *value);
/** sets the (optional) magnification type.
* @param value new attribute value, may be NULL.
* The caller is responsible for making sure
* that the value is valid for the selected printer.
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition setMagnificationType(const char *value);
/** sets the (optional) smoothing type.
* @param value new attribute value, may be NULL.
* The caller is responsible for making sure
* that the value is valid for the selected printer.
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition setSmoothingType(const char *value);
/** sets the (optional) configuration information.
* @param value new attribute value, may be NULL.
* The caller is responsible for making sure
* that the value is valid for the selected printer.
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition setConfigurationInformation(const char *value);
/** sets the (optional) requested resolution ID.
* @param value new attribute value, may be NULL.
* The caller is responsible for making sure
* that the value is valid for the selected printer.
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition setResolutionID(const char *value);
/** sets the (optional) film orientation.
* @param value new enumerated value. The caller is responsible for
* making sure that the selected printer supports film orientation
* if a non-default value is set.
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition setFilmOrientation(DVPSFilmOrientation value);
/** sets the (optional) trim (printing of borders).
* @param value new enumerated value. The caller is responsible for
* making sure that the selected printer supports trim
* if a non-default value is set.
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition setTrim(DVPSTrimMode value);
/** sets the (optional) requested decimate/crop behaviour
* for all image boxes managed by this stored print object.
* @param value new enumerated value. The caller is responsible for
* making sure that the selected printer supports decimate/crop
* if a non-default value is set.
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition setRequestedDecimateCropBehaviour(DVPSDecimateCropBehaviour value);
/** sets the (optional) border density.
* @param value new attribute value, may be NULL.
* The caller is responsible for making sure
* that the value is valid for the selected printer.
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition setBorderDensity(const char *value);
/** sets the (optional) empty image density.
* @param value new attribute value, may be NULL.
* The caller is responsible for making sure
* that the value is valid for the selected printer.
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition setEmtpyImageDensity(const char *value);
/** sets the (optional) max density.
* @param value new attribute value, may be NULL.
* The caller is responsible for making sure
* that the value is valid for the selected printer.
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition setMaxDensity(const char *value);
/** sets the (optional) min density.
* @param value new attribute value, may be NULL.
* The caller is responsible for making sure
* that the value is valid for the selected printer.
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition setMinDensity(const char *value);
/** deletes all optional attribute values that might not be
* supported by all printers. Film size ID, magnification and smoothing type,
* configuration information, requested resolution ID,
* trim and requested decimate/crop behaviour, border and empty image density
* are reset to default. For all registered images, magnification, smoothing type
* and configuration information are also set back to default.
* @param name name of the new printer (optional)
* @param aetitle of the new printer (optional)
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition newPrinter(const char *name = NULL, const char *destinationAE = NULL); // short cut, delete all optional settings
/** gets the the application entity title of the print SCU.
* @return application entity title of the print SCP
*/
const char *getOriginator();
/** gets the the application entity title of the print SCP.
* @return application entity title of the print SCP
*/
const char *getDestination();
/** gets the name of the current printer.
* @return name of the current printer
*/
const char *getPrinterName();
/** gets the number of columns of the current image display format.
* @return number of columns.
*/
unsigned long getImageDisplayFormatColumns();
/** gets the number of rows of the current image display format.
* @return number of rows.
*/
unsigned long getImageDisplayFormatRows();
/** gets the current film orientation.
* @return film orientation.
*/
DVPSFilmOrientation getFilmOrientation();
/** gets the current trim mode.
* @return trim mode.
*/
DVPSTrimMode getTrim();
/** gets the current requested decimate/crop behaviour setting
* that is used for all image boxes managed by this object.
* @return requested decimate/crop behaviour
*/
DVPSDecimateCropBehaviour getRequestedDecimateCropBehaviour()
{
return decimateCropBehaviour;
}
/** gets the Study Instance UID.
* @return Study Instance UID, may be NULL.
*/
const char *getStudyInstanceUID();
/** gets the Series Instance UID.
* @return Series Instance UID, may be NULL.
*/
const char *getSeriesInstanceUID();
/** gets the SOP Instance UID.
* @return SOP Instance UID, may be NULL.
*/
const char *getSOPInstanceUID();
/** gets the (optional) film size ID.
* @return film size ID, may be NULL.
*/
const char *getFilmSizeID();
/** gets the (optional) magnification type.
* @return magnification type, may be NULL.
*/
const char *getMagnificationType();
/** gets the (optional) smoothing type.
* @return smoothing type, may be NULL.
*/
const char *getSmoothingType();
/** gets the (optional) configuration information.
* @return configuration information, may be NULL.
*/
const char *getConfigurationInformation();
/** gets the (optional) requestes resolution ID
* @return requested resolution ID, may be NULL.
*/
const char *getResolutionID();
/** gets the (optional) border density.
* @return border density, may be NULL.
*/
const char *getBorderDensity();
/** gets the (optional) empty image density.
* @return empty image density, may be NULL.
*/
const char *getEmtpyImageDensity();
/** gets the (optional) max density.
* The string returned becomes invalid after the next
* call to getMaxDensity or getMinDensity.
* @return max density, may be NULL.
*/
const char *getMaxDensity();
/** gets the (optional) min density.
* The string returned becomes invalid after the next
* call to getMaxDensity or getMinDensity.
* @return min density, may be NULL.
*/
const char *getMinDensity();
/** gets the (optional) max density.
* @return max density (default: 300).
*/
Uint16 getMaxDensityValue();
/** gets the (optional) min density.
* @return min density (default: 20).
*/
Uint16 getMinDensityValue();
/** gets the number of images currently registered in this object.
* @return number of images.
*/
size_t getNumberOfImages()
{
return imageBoxContentList.size();
}
/** gets the number of annotations currently registered in this object.
* @return number of annotations.
*/
size_t getNumberOfAnnotations()
{
return annotationContentList.size();
}
/** deletes one of the registered images.
* @param idx index, must be < getNumberOfImages()
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition deleteImage(size_t idx);
/** deletes multiple of the registered
* images, starting with the first one.
* @param number number of images to delete, must be <= getNumberOfImages()
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition deleteMultipleImages(size_t number);
/** deletes as many images as fit on the current page according
* to the image display format settings. Used to remove images
* from the queue after a print job with one film box has been
* spooled.
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition deleteSpooledImages();
/** checks if one of the registered images has additional settings that are not
* default values on the image box level.
* @param idx index, must be < getNumberOfImages()
* @return EC_Normal if successful, an error code otherwise.
*/
OFBool imageHasAdditionalSettings(size_t idx)
{
return imageBoxContentList.imageHasAdditionalSettings(idx);
}
/** sets the polarity for the given registered image box.
* @param idx index, must be < getNumberOfImages()
* @param value new attribute value (NORMAL or REVERSE), may be NULL.
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition setImagePolarity(size_t idx, const char *value)
{
return imageBoxContentList.setImagePolarity(idx, value);
}
/** sets the requested size for the given registered image box.
* @param idx index, must be < getNumberOfImages()
* @param value new attribute value (in mm), may be NULL.
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition setImageRequestedSize(size_t idx, const char *value)
{
return imageBoxContentList.setImageRequestedSize(idx, value);
}
/** sets the (optional) magnification type for the given registered image box.
* @param idx index, must be < getNumberOfImages()
* @param value new attribute value, may be NULL.
* The caller is responsible for making sure
* that the value is valid for the selected printer.
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition setImageMagnificationType(size_t idx, const char *value)
{
return imageBoxContentList.setImageMagnificationType(idx, value);
}
/** sets the (optional) smoothing type for the given registered image box.
* @param idx index, must be < getNumberOfImages()
* @param value new attribute value, may be NULL.
* The caller is responsible for making sure
* that the value is valid for the selected printer.
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition setImageSmoothingType(size_t idx, const char *value)
{
return imageBoxContentList.setImageSmoothingType(idx, value);
}
/** sets the (optional) configuration information for the given registered image box.
* @param idx index, must be < getNumberOfImages()
* @param value new attribute value, may be NULL.
* The caller is responsible for making sure
* that the value is valid for the selected printer.
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition setImageConfigurationInformation(size_t idx, const char *value)
{
return imageBoxContentList.setImageConfigurationInformation(idx, value);
}
/** gets the polarity for the given registered image box.
* @param idx index, must be < getNumberOfImages()
* @return polarity (NORMAL or REVERSE), may be NULL.
*/
const char *getImagePolarity(size_t idx)
{
return imageBoxContentList.getImagePolarity(idx);
}
/** gets the requested size for the given registered image box.
* @param idx index, must be < getNumberOfImages()
* @return requested size (in mm), may be NULL.
*/
const char *getImageRequestedSize(size_t idx)
{
return imageBoxContentList.getImageRequestedSize(idx);
}
/** gets the (optional) magnification type for the given registered image box.
* @param idx index, must be < getNumberOfImages()
* @return magnification type, may be NULL.
*/
const char *getImageMagnificationType(size_t idx)
{
return imageBoxContentList.getImageMagnificationType(idx);
}
/** gets the (optional) smoothing type for the given registered image box.
* @param idx index, must be < getNumberOfImages()
* @return smoothing type, may be NULL.
*/
const char *getImageSmoothingType(size_t idx)
{
return imageBoxContentList.getImageSmoothingType(idx);
}
/** gets the (optional) configuration information for the given registered image box.
* @param idx index, must be < getNumberOfImages()
* @return configuration information, may be NULL.
*/
const char *getImageConfigurationInformation(size_t idx)
{
return imageBoxContentList.getImageConfigurationInformation(idx);
}
/** gets the presentation LUT for the given registered image box.
* If not available the presentation LUT of the film box is used.
* @param idx index, must be < getNumberOfImages()
* @return pointer to presentation LUT, may be NULL.
*/
DVPSPresentationLUT *getImagePresentationLUT(size_t idx);
/** gets the "global" presentation LUT which overrides the settings for the image boxes.
* If not available the presentation LUT of the image box is used.
* @return pointer to presentation LUT, may be NULL.
*/
DVPSPresentationLUT *getPresentationLUT();
/** resets the Presentation LUT to the default setting. i.e. the presentation LUT
* which is specified separately for each image box is used.
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition setDefaultPresentationLUT();
/** sets the current Presentation LUT shape (overrides the image box settings).
* Only DVPSP_identity and DVPSP_lin_od are allowed.
* @param shape the new presentation LUT shape.
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition setPresentationLUTShape(DVPSPresentationLUTType shape);
/** stores a presentation lookup table in the stored print object.
* This method stores a presentation lookup table in the
* stored print object and activates it. This LUT overrides the
* settings made for the individual image boxes. If unsuccessful,
* LUT is not set.
* @param dset dataset from which the Presentation LUT SQ or Shape is read.
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition setPresentationLookupTable(DcmItem &dset);
/** converts an optical density (OD) value to an 8/12/16-bit P-value which is linear to luminance.
* The output is not calibrated according to the GSDF. This can be done by convertPValueToDDL() in
* class DVPSPresentationState. The attributes illumination, reflected ambient light and min/max
* density (default 20/300) from this stored print object are used for the calculation.
* @param density in hundreds of OD (e.g. 150 corressponds to 1.5 OD)
* @param bits number of bits used for the output value (8, 12, 16)
* @return P-Value, 0..0xFF, 0..0xFFF, 0..0xFFFF, < 0 if an error occurred.
*/
Sint32 convertODtoPValue(Uint16 density, unsigned int bits = 8);
/** writes the general study and series module attributes for a grayscale hardcopy image
* that is related to this stored print object to a DICOM dataset.
* Copies of the DICOM elements managed by this object are inserted into
* the DICOM dataset.
* @param dset the dataset to which the data is written
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition writeHardcopyImageAttributes(DcmItem &dset);
/** creates a new image box object and sets the content of this image box object.
* @param retrieveaetitle retrieve AETITLE of the referenced image
* @param refstudyuid Study instance UID of the referenced image
* @param refseriesuid Series instance UID of the referenced image
* @param refsopclassuid SOP Class UID of the referenced image
* @param refsopinstanceuid SOP instance UID of the referenced image
* @param requestedimagesize requested images size for this image, may be NULL (absent)
* @param patientid patient ID for the referenced image, may be NULL (absent)
* @param presentationlut presentation LUT to be used, may be NULL (absent)
* @param inversePLUT true if presentation LUT is for Monochrome1 and must be inversed.
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition addImageBox(
const char *retrieveaetitle,
const char *refstudyuid,
const char *refseriesuid,
const char *refsopclassuid,
const char *refsopinstanceuid,
const char *requestedimagesize,
const char *patientid,
DVPSPresentationLUT *presentationlut,
OFBool inversePLUT);
/** creates a new image box object and sets the content of this image box object.
* This is a specialized version of the method with the same name and more parameters.
* SOP Class is assumed to be Grayscale Hardcopy, Study and Series are derived from
* the Stored Print internal defaults.
* @param retrieveaetitle retrieve AETITLE of the referenced image
* @param refsopinstanceuid SOP instance UID of the referenced image
* @param requestedimagesize requested images size for this image, default: absent
* @param patientid patient ID for the referenced image, default: absent
* @param presentationlut presentation LUT to be used, may be NULL (absent)
* @param inversePLUT true if presentation LUT is for Monochrome1 and must be inversed.
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition addImageBox(
const char *retrieveaetitle,
const char *refsopinstanceuid,
const char *requestedimagesize=NULL,
const char *patientid=NULL,
DVPSPresentationLUT *presentationlut=NULL,
OFBool inversePLUT=OFFalse);
/** deletes all existing annotations and creates a new one,
* with given text and position. Sets annotation display format
* to the given value.
*
* @param displayformat annotation display format
* @param text annotation text
* @param position annotation position
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition setSingleAnnotation(
const char *displayformat,
const char *text,
Uint16 position);
/** deletes all annotations, clears annotation display format.
*/
void deleteAnnotations();
/** sets a new SOP Instance UID for the Stored Print object.
* @param uid new SOP Instance UID
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition setInstanceUID(const char *uid);
/** clears the SOP instance UID for the Stored Print object.
* a new UID is assigned automatically when writing the object.
*/
void clearInstanceUID() { sOPInstanceUID.clear(); }
/** returns the image UIDs that are required to look up the referenced image in the database
* @param idx index, must be < getNumberOfImages()
* @param studyUID Study UID of the image
* @param seriesUID series UID of the image
* @param instanceUID instance UID of the image
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition getImageReference(size_t idx, const char *&studyUID, const char *&seriesUID, const char *&instanceUID)
{
return imageBoxContentList.getImageReference(idx, studyUID, seriesUID, instanceUID);
}
/** returns a description of the currently activated Presentation LUT (if
* any) in terms of the Presentation LUT matching rule (see description
* of enum type for details).
* @return Presentation LUT alignment
*/
DVPSPrintPresentationLUTAlignment getReferencedPresentationLUTAlignment() { return referencedPresentationLUTAlignment; }
/** Requests the properties of the printer (Printer SOP Instance N-GET).
* The properties are not returned, but if the message handler is switched to "dump mode",
* the DIMSE communication will be printed.
* @param printHandler print communication handler, association must be open.
* @return EC_Normal upon success, an error code otherwise.
*/
OFCondition printSCUgetPrinterInstance(DVPSPrintMessageHandler& printHandler);
/** checks whether a presentation LUT or LUT shape is active in this stored print object.
* In this case, if the printer supports the Presentation LUT SOP class,
* a Presentation LUT SOP Instance is created in the printer.
* @param printHandler print communication handler, association must be open.
* @param printerRequiresMatchingLUT true if printer requires presentation LUTs matching the image depth
* @param printerLUTRenderingPreferred true if SCP side presentation LUTs should be preferred
* even if printer supports 12-bit image transmission.
* @param printerSupports12Bit true if printer supports 12 bit transmission
* @return EC_Normal upon success, an error code otherwise.
*/
OFCondition printSCUpreparePresentationLUT(
DVPSPrintMessageHandler& printHandler,
OFBool printerRequiresMatchingLUT,
OFBool printerLUTRenderingPreferred,
OFBool printerSupports12Bit);
/** Creates a DICOM Basic Film Session SOP Instance in the printer.
* @param printHandler print communication handler, association must be open.
* @param dset DICOM dataset containing all Basic Film Session attributes managed outside this class
* @param plutInSession true if printer expects referenced presentation LUT sequence, illumination
* and reflected ambient light in basic film session, false if it expects them in basic film box.
* @return EC_Normal upon success, an error code otherwise.
*/
OFCondition printSCUcreateBasicFilmSession(
DVPSPrintMessageHandler& printHandler,
DcmDataset& dset,
OFBool plutInSession);
/** Creates a DICOM Basic Film Box SOP Instance in the printer.
* This method only allows one basic film box to exist at any time -
* collation is not supported.
* @param printHandler print communication handler, association must be open.
* @param plutInSession true if printer expects referenced presentation LUT sequence, illumination
* and reflected ambient light in basic film session, false if it expects them in basic film box.
* @return EC_Normal upon success, an error code otherwise.
*/
OFCondition printSCUcreateBasicFilmBox(DVPSPrintMessageHandler& printHandler, OFBool plutInSession);
/** Transmits a DICOM image to the printer (Basic Grayscale Image Box N-SET).
* @param printHandler print communication handler, association must be open.
* @param idx index of the image reference from which the Image Box settings are taken,
* must be < getNumberOfImages().
* @param image DICOM image to be printed
* @param useMonochrome1 if true, the image is transmitted in MONOCHROME1 photometric interpretation.
* Default is false, image is transmitted in MONOCHROME2 in this case.
* @return EC_Normal upon success, an error code otherwise.
*/
OFCondition printSCUsetBasicImageBox(
DVPSPrintMessageHandler& printHandler,
size_t idx,
DicomImage& image,
OFBool useMonochrome1=OFFalse);
/** Transmits a DICOM annotation to the printer (Basic Annotation Box N-SET).
* @param printHandler print communication handler, association must be open.
* @param idx index of the annotation from which the settings are taken,
* must be < getNumberOfAnnotations().
* @return EC_Normal upon success, an error code otherwise.
*/
OFCondition printSCUsetBasicAnnotationBox(
DVPSPrintMessageHandler& printHandler,
size_t idx);
/** Prints the current DICOM Basic Film Box SOP Instance.
* @param printHandler print communication handler, association must be open.
* @return EC_Normal upon success, an error code otherwise.
*/
OFCondition printSCUprintBasicFilmBox(DVPSPrintMessageHandler& printHandler);
/** Prints the current DICOM Basic Film Session.
* @param printHandler print communication handler, association must be open.
* @return EC_Normal upon success, an error code otherwise.
*/
OFCondition printSCUprintBasicFilmSession(DVPSPrintMessageHandler& printHandler);
/** Deletes all objects currently present in the print association.
* @param printHandler print communication handler, association must be open.
* @return EC_Normal upon success, an error code otherwise.
*/
OFCondition printSCUdelete(DVPSPrintMessageHandler& printHandler);
/** sets the illumination to be used
* with the print Presentation LUT SOP Class.
* @param value new attribute value, in cd/m2.
* The caller is responsible for making sure
* that the value is valid for the selected printer.
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition setPrintIllumination(Uint16 value);
/** gets the current illumination setting
* used with the print Presentation LUT SOP Class.
* @return illumination in cd/m2
*/
Uint16 getPrintIllumination();
/** sets the reflected ambient light to be used
* with the print Presentation LUT SOP Class.
* @param value new attribute value, in cd/m2.
* The caller is responsible for making sure
* that the value is valid for the selected printer.
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition setPrintReflectedAmbientLight(Uint16 value);
/** gets the current reflected ambient light setting
* used with the print Presentation LUT SOP Class.
* @return reflected ambient light in cd/m2
*/
Uint16 getPrintReflectedAmbientLight();
/** performs a Print SCP Basic Film Box N-CREATE operation on a newly
* created instance of this class. The results of the operation are
* stored in the objects passed as rsp, rspDataset and
* globalPresentationLUTList.
* @param cfg config file facility
* @param cfgname symbolic printer name in config file
* @param rqDataset N-CREATE request dataset, may be NULL
* @param rsp N-CREATE response message
* @param rspDataset N-CREATE response dataset passed back in this parameter
* @param presentationLUTnegotiated
* OFTrue if support for the Presentation LUT SOP class
* has been negotiated at association negotiation and is supported on
* Basic Film Box level
* @param globalPresentationLUTList
* list of presentation LUTs managed by the Print SCP.
* If a SCP default Presentation LUT needs to be created as the result
* of the N-CREATE operation, it is stored in this list.
* @param filmSessionUID
* SOP instance UID of the Basic Film Session object
* @param study study UID to be used when storing Stored Print or image objects
* @param psSeries series UID to be used when storing Stored Print objects
* @param imgSeries series UID to be used when storing image objects (Hardcopy Grayscale)
* @return OFTrue if N-CREATE was successful, OFFalse otherwise.
*/
OFBool printSCPCreate(
DVConfiguration& cfg,
const char *cfgname,
DcmDataset *rqDataset,
T_DIMSE_Message& rsp,
DcmDataset *& rspDataset,
OFBool presentationLUTnegotiated,
DVPSPresentationLUT_PList& globalPresentationLUTList,
const char *filmSessionUID,
DcmUniqueIdentifier& study,
DcmUniqueIdentifier& psSeries,
DcmUniqueIdentifier& imgSeries);
/** performs a Print SCP Basic Film Box N-SET operation on an instance of
* this class. The results of the N-SET operation are stored in the
* objects passed as rsp and rspDataset.
* @param cfg config file facility
* @param cfgname symbolic printer name in config file
* @param rqDataset N-SET request dataset
* @param rsp N-SET response message
* @param rspDataset N-SET response dataset passed back in this parameter
* @param presentationLUTnegotiated
* OFTrue if support for the Presentation LUT SOP class
* has been negotiated at association negotiation and is supported on
* Basic Film Box level
* @param globalPresentationLUTList
* list of presentation LUTs managed by the Print SCP
* @return OFTrue if N-SET was successful, OFFalse otherwise.
*/
OFBool printSCPSet(
DVConfiguration& cfg,
const char *cfgname,
DcmDataset *rqDataset,
T_DIMSE_Message& rsp,
DcmDataset *& rspDataset,
OFBool presentationLUTnegotiated,
DVPSPresentationLUT_PList& globalPresentationLUTList);
/** checks whether the given UID string matches the film box UID.
* @param c uid to be compared
* @return OFTrue if equal, OFFalse otherwise
*/
OFBool isFilmBoxInstance(const char *c) { if (c && (filmBoxInstanceUID == c)) return OFTrue; else return OFFalse; }
/** checks whether the Presentation LUT with the given UID
* is referenced by this Stored Print object on the film box level.
* Presentation LUT references on Image Box level are ignored.
* @param c uid to be compared
* @return OFTrue if equal, OFFalse otherwise
*/
OFBool usesPresentationLUT(const char *c);
/** looks up the image box with the given SOP instance UID in the image box list
* and returns a pointer to a new object containing a copy of this
* image box. If the object is not found, NULL is returned.
* @param uid SOP instance UID of the image box to be looked up
* @return pointer to copied image box object, may be NULL.
*/
DVPSImageBoxContent *duplicateImageBox(const char *uid) { return imageBoxContentList.duplicateImageBox(uid); }
/** checks whether any of the image boxes managed by the image box list
* has the same position as the given one, but a different
* SOP instance UID. This is used during a Print SCP basic grayscale
* image box N-SET operation to check whether an image position clash exists.
* @param uid SOP instance UID of the image box to be looked up
* @param position image position to be looked up
*/
OFBool haveImagePositionClash(const char *uid, Uint16 position) { return imageBoxContentList.haveImagePositionClash(uid, position); }
/** adds the given image box object to the image box list.
* Any other object existing in the list with the same SOP instance UID is removed.
* Used during a Print SCP basic grayscale image box N-SET operation.
* @param newImageBox new image box object to be added to the list.
*/
void replaceImageBox(DVPSImageBoxContent *newImageBox) { imageBoxContentList.replace(newImageBox); }
/** updates the list of Presentation LUTs managed by the Stored Print object
* from a global list. If a Presentation LUT is active on Film Box level, the corresponding
* LUT is copied from the global presentation LUT list.
* Presentation LUT references on Image Box level are ignored.
* Used during a Print SCP N-ACTION operation.
* @param globalPresentationLUTList list of presentation LUTs managed by the Print SCP
*/
void updatePresentationLUTList(DVPSPresentationLUT_PList& globalPresentationLUTList);
/** checks whether the given Presentation LUT type could be used together
* with all image boxes in this film box on a Print SCP that requires a matching
* alignment between a Presentation LUT and the image pixel data.
* @param align LUT alignment type
* @return OFTrue if matching, OFFalse otherwise
*/
OFBool matchesPresentationLUT(DVPSPrintPresentationLUTAlignment align) const
{
return imageBoxContentList.matchesPresentationLUT(align);
}
/** replaces the settings for illumination, reflected ambient light and
* referenced Presentation LUT in this film box.
* Used by a Print SCP if Presentation LUT is implemented on Film Session
* level.
* @param newIllumination new value for illumination
* @param newReflectedAmbientLight new value for reflectedAmbientLight
* @param newReferencedPLUT new value for referenced presentation LUT instance UID
* @param newAlignment new alignment type of active presentation LUT
*/
void overridePresentationLUTSettings(
DcmUnsignedShort& newIllumination,
DcmUnsignedShort& newReflectedAmbientLight,
DcmUniqueIdentifier& newReferencedPLUT,
DVPSPrintPresentationLUTAlignment newAlignment);
/** checks whether any of the image boxes has an image box position
* assigned. If no image box position is assigned, the stored print object
* cannot be written and a Print SCP should return a warning
* status upon receipt of an N-ACTION request.
* @return OFTrue if empty page (no image box position assigned), OFFalse otherwise.
*/
OFBool emptyPageWarning() { return imageBoxContentList.emptyPageWarning(); }
private:
/// private undefined assignment operator
DVPSStoredPrint& operator=(const DVPSStoredPrint&);
/* checks if given SOP class UID is an image storage SOP class
* @return OFTrue if image SOP class, OFFalse otherwise.
*/
OFBool isImageStorageSOPClass(OFString& sopclassuid);
/** create default values for all missing type 1 elements.
* Called before a stored print object is written.
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition createDefaultValues();
/** writes a Referenced Presentation LUT SQ to the given
* dataset. Helper function used in the more general write() method.
* @param dset the dataset to which the data is written
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition addReferencedPLUTSQ(DcmItem &dset);
/** writes a Referenced Presentation LUT SQ, Illumination and
* reflected ambient light to the given dataset.
* Helper function used when creating Basic Film Session or
* Basic Film Box.
* @param dset the dataset to which the data is written
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition addPresentationLUTReference(DcmItem& dset);
/** invalidates the cached number of columns and rows
*/
void invalidateCache();
/** updates the cached number of columns and rows
*/
void updateCache();
/* Module: Patient (M)
*/
/// Module=Patient, VR=PN, VM=1, Type 1
DcmPersonName patientName;
/// Module=Patient, VR=LO, VM=1, Type 2
DcmLongString patientID;
/// Module=Patient, VR=DA, VM=1, Type 2
DcmDate patientBirthDate;
/// Module=Patient, VR=CS, VM=1, Type 2
DcmCodeString patientSex;
/* Module: General Study (M)
*/
/// Module=General_Study, VR=UI, VM=1, Type 1
DcmUniqueIdentifier studyInstanceUID;
/// Module=General_Study, VR=DA, VM=1, Type 2
DcmDate studyDate;
/// Module=General_Study, VR=TM, VM=1, Type 2
DcmTime studyTime;
/// Module=General_Study, VR=PN, VM=1, Type 2
DcmPersonName referringPhysicianName;
/// Module=General_Study, VR=SH, VM=1, Type 2
DcmShortString studyID;
/// Module=General_Study, VR=SH, VM=1, Type 2
DcmShortString accessionNumber;
/* Module: General Series (M)
*/
/// Module=General_Series, VR=UI, VM=1, Type 1
DcmUniqueIdentifier seriesInstanceUID;
/// Module=General_Series, VR=IS, VM=1, Type 2
DcmIntegerString seriesNumber;
/* Module: General Equipment (M)
*/
/// Module=General_Equipment, VR=LO, VM=1, Type 2
DcmLongString manufacturer;
/* Module: Printer Characteristics (M)
*/
// the PrintManagementCapabilitiesSequence is only created/checked on the fly
// PrinterCharacteristicsSequence
/// Module=Printer_Characteristics_Module, VR=AE, VM=1, Type 2
DcmApplicationEntity originator;
/// Module=Printer_Characteristics_Module, VR=AE, VM=1, Type 2
DcmApplicationEntity destination;
/// Module=Printer_Characteristics_Module, VR=LO, VM=1, Type 3
DcmLongString printerName;
/* Module: Film Box (M)
*/
/// Module=Film_Box_Module, VR=IS, VM=1, Type 2
DcmIntegerString instanceNumber;
/* the following attributes belong to the Film Box Content SQ (Type 1) */
/// Module=Film_Box_Module, VR=ST, VM=1, Type 1
DcmShortText imageDisplayFormat;
/// Module=Film_Box_Module, VR=CS, VM=1, Type 3
DcmCodeString annotationDisplayFormatID;
/// Module=Film_Box_Module, VR=CS, VM=1, Type 2
DcmCodeString filmOrientation;
/// Module=Film_Box_Module, VR=CS, VM=1, Type 2
DcmCodeString filmSizeID;
/// Module=Film_Box_Module, VR=CS, VM=1, Type 2
DcmCodeString magnificationType;
/// Module=Film_Box_Module, VR=CS, VM=1, Type 3
DcmCodeString smoothingType;
/// Module=Film_Box_Module, VR=CS, VM=1, Type 3
DcmCodeString borderDensity;
/// Module=Film_Box_Module, VR=CS, VM=1, Type 3
DcmCodeString emptyImageDensity;
/// Module=Film_Box_Module, VR=US, VM=1, Type 3
DcmUnsignedShort minDensity;
/// Module=Film_Box_Module, VR=US, VM=1, Type 2
DcmUnsignedShort maxDensity;
/// Module=Film_Box_Module, VR=CS, VM=1, Type 3
DcmCodeString trim;
/// Module=Film_Box_Module, VR=ST, VM=1, Type 2
DcmShortText configurationInformation;
/// Module=Film_Box_Module, VR=US, VM=1, Type 2c required if presentation SOP class present
DcmUnsignedShort illumination;
/// Module=Film_Box_Module, VR=US, VM=1, Type 2c required if presentation SOP class present
DcmUnsignedShort reflectedAmbientLight;
/// Module=Film_Box_Module (Supplement 38), VR=CS, VM=1, Type 3
DcmCodeString requestedResolutionID;
/// the ReferencedPresentationLUTSequence is only created/read on the fly
DcmUniqueIdentifier referencedPresentationLUTInstanceUID;
/** The Print SCP can be configured to enforce a rule requiring that the
* number of entries in a Presentation LUT matches the bit depth of the
* image pixel data. This member variable describes the type of the
* current presentation LUT (if any).
*/
DVPSPrintPresentationLUTAlignment referencedPresentationLUTAlignment;
/* Module: Image Box List (M)
*/
/// Module=Image_Box_List_Module, VR=SQ, VM=1, Type 1
DVPSImageBoxContent_PList imageBoxContentList;
/* Module: Annotation List (U)
*/
/// Module=Annotation_List_Module, VR=SQ, VM=1, Type 3
DVPSAnnotationContent_PList annotationContentList;
/* Module: Presentation LUT List (U)
*/
DVPSPresentationLUT_PList presentationLUTList;
/* Module: SOP Common (M)
* we don't store the SOP Class UID because it is well known.
*/
/// Module=SOP_Common, VR=UI, VM=1, Type 1
DcmUniqueIdentifier sOPInstanceUID;
/// Module=SOP_Common, VR=CS, VM=1-n, Type 1C
DcmCodeString specificCharacterSet;
/// Module=SOP_Common, VR=DA, VM=1, Type 3
DcmDate instanceCreationDate;
/// Module=SOP_Common, VR=TM, VM=1, Type 3
DcmTime instanceCreationTime;
/// used when creating hardcopy image objects
DcmUniqueIdentifier imageSeriesInstanceUID;
/// flag indicating whether the currentXX values are up to date
OFBool currentValuesValid;
/// current number of columns
unsigned long currentNumCols;
/// current number of rows
unsigned long currentNumRows;
/// requested decimate/crop behaviour used in all image boxes
DVPSDecimateCropBehaviour decimateCropBehaviour;
/// the current film session instance
OFString filmSessionInstanceUID;
/// the current film box instance
OFString filmBoxInstanceUID;
/** the current presentation LUT instance. If used as Print SCU, the
* content of this string can differ from referencedPresentationLUTInstanceUID
* which contains the UID from the Stored Print object wheras this
* string contains the UID assigned by the remote Print SCP.
* If used as Print SCP, these strings should always be equal.
*/
OFString presentationLUTInstanceUID;
/// stores the "global" presentation LUT that overrides the image box LUTs (optional)
DVPSPresentationLUT globalPresentationLUT;
/// flag indicating whether the globalPresentationLUT is currently valid or not
OFBool globalPresentationLUTValid;
/// transmit images in 12 bit for the current print job
OFBool transmitImagesIn12Bit;
/// presentation LUTs are rendered on SCP side
OFBool renderPresentationLUTinSCP;
/// temporary buffer for getMaxDensity and getMinDensity
OFString tempDensity;
};
#endif