#include "ltdic.h"
L_UINT16 LDicomDS::CopyDS(pDstParent, pSrcDS, pSrcParent)
L_UINT16 LDicomDS::CopyDS(pDstParent, pSrcDS, pSrcParent, pfnCallback, pUserData)
Copies the data elements from one data set to another.
A pointer to a DICOMELEMENT structure that contains a Data element within the destination data set. A copy of the source data set will be inserted as the child of this data element.
A DICOM object that contains the data set to be copied (the source data set).
A pointer to a DICOMELEMENT structure that contains a Data element within the source data set. All children, grandchildren, etc. of this element will be added to the destination data set.
Optional callback function. If you do not provide a callback function, use NULL as the value of this parameter. If you do provide a callback function, use the function pointer as the value of this parameter. The callback function must adhere to the function prototype described in COPYDSCALLBACK Function.
Void pointer that you can use to pass one or more additional parameters that the callback function needs.To use this feature, assign a value to a variable or create a structure that contains as many fields as you need. Then, in this parameter, pass the address of the variable or structure, casting it to L_VOID *. The callback function, which receives the address in its own pUserData parameter, can cast it to a pointer of the appropriate data type to access your variable or structure.If the additional parameters are not needed, you can pass NULL in this parameter.
Value | Meaning |
---|---|
0 | SUCCESS |
>0 | An error occurred. Refer to Return Codes. |
If both pSrcParent and pDstParent are NULL, the source data set will be inserted at the root level of the destination data set. Therefore the highest level elements of the source data set will be added as siblings to the highest level elements of the destination data set. This can be seen in the diagram below.
If pSrcParent is not NULL and pDstParent is NULL, the children of pSrcParent will be added at the root level of the destination data set (i.e. as siblings to elements at the highest level). This can be seen in the diagram below. Note that the source elements to be added are in blue.
If pScrParent is NULL and pDstParent is not NULL, the entire source data set will be added as children to pDstParent. This can be seen in the diagram below.
If pSrcParent and pDstParent are both not NULL, then the children of pSrcParent are added as the children of pDstParent. This can be seen in the diagram below. The original children of pDstParent are in red and the source elements to be added are in blue.
If an inserted element has the same tag value as a destination element at the same level and with the same parent, then the value from the source element is copied into the destination element and any child elements are added accordingly. For example, the diagram below shows the result of a call to LDicomDS::CopyDS. If the two elements indicated by the arrows have the same tag value, the value from the source element is copied into the destination element and the structure on the right results. This is shown by the red outline of the destination element with the blue center of the source element.
To make the destination data set an exact copy of the source data set, instead of inserting it within the destination data set, you must call LDicomDS::ResetDS with the destination data set as the parameter, before calling LDicomDS::CopyDS.
To copy only portions of a data set, call the LDicomDS::CopyDS overload that takes a callback. The callback gets called before each DICOM element gets copied. Return TRUE in the callback function to copy the element. Return FALSE in the callback function to leave the element out of the data set. For more information, see the documentation for COPYDSCALLBACK.
Required DLLs and Libraries
Win32, x64
These examples copy the elements from a Data Set to another Data Set.
The first example does a full copy.
The second example copies all elements except the pixel data element.
L_INT LDicomDS_CopyDSExample()
{
L_UINT32 nClass;
L_UINT16 uFlags;
L_TCHAR buf[180];
LDicomDS DS1(NULL);
LDicomDS DS2(NULL);
DS1.InitDS( CLASS_CR_IMAGE_STORAGE, DS_LITTLE_ENDIAN | DS_IMPLICIT_VR);
DS1.GetInfoDS(&nClass, &uFlags);
wsprintf(buf, TEXT("Data Set #1\nClass = %d\nFlags = %d"), nClass, uFlags);
::MessageBox(NULL, buf, TEXT("Test"), MB_OK);
DS2.CopyDS(NULL, &DS1, NULL);
DS2.GetInfoDS(&nClass, &uFlags);
wsprintf(buf, TEXT("Data Set #2\nClass = %d\nFlags = %d"), nClass, uFlags);
::MessageBox(NULL, buf, TEXT("Test"), MB_OK);
return DICOM_SUCCESS;
}
L_BOOL EXT_CALLBACK pfnCopyDSCallBack(pDICOMELEMENT pElement, L_UINT16 nFlags, L_VOID *pUserData)
{
UNREFERENCED_PARAMETER(nFlags);
UNREFERENCED_PARAMETER(pUserData);
if (pElement->nTag == TAG_PIXEL_DATA)
return FALSE;
return TRUE;
}
L_INT LDicomDS_CopyDSExample2(LDicomDS *pSrcDS, L_TCHAR * pszName)
{
L_INT nRet = DICOM_SUCCESS;
LDicomDS ds;
if (pSrcDS && pszName)
{
nRet = ds.CopyDS(NULL, pSrcDS, NULL, pfnCopyDSCallBack, NULL);
}
ds.SaveDS(pszName, 0);
return nRet;
}