The IDLffDicomEx::AddGroup function method creates a series of repeating tags within a sequence. For example, the same set of 10 tags could be repeated 4 times in one sequence, which means the sequence would have 4 groups, each with the same 10 tags.
            When calling AddGroup the DicomTag argument specifies a sequence (SQ) attribute. If the sequence does not exist, the AddGroup method creates the sequence before creating the group in this sequence. Once the group has been created, member items can be added via the IDLffDicomEx::SetValue method using the return value from this method as the SEQID value
            Changes are not written to the DICOM file until you call the IDLffDicomEx::Commit method. When you commit changes, all sequence identifiers are invalidated. You need to call IDLffDicomEx::GetValue to re-access the sequence identifiers. See Adding Groups to a Nested Sequence for an example.
            Syntax
            Result = Obj->[IDLffDicomEx::]AddGroup (DicomTag [, PARENTSEQID=integer] )
            Return Value
            Returns a long integer containing the group identifier for the newly created group. This identifier can be used by other methods that use the SEQID keyword such as IDLffDicomEx::GetValue and IDLffDicomEx::SetValue methods.
            Arguments
            DicomTag
            A string that identifies the group and element of a DICOM sequence (SQ) attribute in the form 'XXXX,XXXX'. The DicomTag argument must reference a public tag that is part of the standard IOD for the image type and must be of the SQ VR type. See DICOM Attributes for a list of tags.
            Keywords
            PARENTSEQID
            Set this keyword only if adding the new group to an existing sequence. Use this keyword to specify a parent sequence identifier to add the group to as follows:
            
                - If set to a non-zero value, then the group will be added as a member item to the specified nested sequence. This sequence identifier may have been returned via a previous call to the IDLffDicomEx::AddSequence method. 
 
                - If set to 0 or not specified, then the group is added to a sequence specified by the DicomTag argument, which exists at the root level of the DICOM file. This is the default.
 
            
            Examples
            Adding Groups to a Root Level Sequence
            The following example adds a public sequence containing three groups to the root level of a selected file. This public sequence is typically associated with Ultrasound (US) files. Use the NON-CONFORMING keyword when creating a clone in order to avoid errors encountered when attempting to add non-standard attributes to the DICOM file. The new groups within the sequence are printed to the Output Log window. 
            
            This example does not write the cloned file to memory. To write to memory, use the IDLffDicomEx::Commit method. 
            PRO dicom_addgroup_doc
             
            
             sFile = DIALOG_PICKFILE( $
                PATH=FILEPATH('',SUBDIRECTORY=['examples','data']), $
                TITLE='Select DICOM Patient File', FILTER='*.dcm', $
                GET_PATH=path)
             
            
            
            
            
             oImg = OBJ_NEW('IDLffDicomEx', path + 'aImgClone.dcm', $
                CLONE=sfile, /NON_CONFORMING)
             
            
            
            
            
            
             
            
            groupId_1 = oImg->AddGroup('0018,6011')
            oImg->SetValue,'0018,6012', 'US', 1, SEQID = groupId_1
            oImg->SetValue,'0018,6014', 'US', 2, SEQID = groupId_1
             
            groupId_2 = oImg->AddGroup('0018,6011')
            oImg->SetValue,'0018,6012', 'US', 3, SEQID = groupId_2
            oImg->SetValue,'0018,6014', 'US', 4, SEQID = groupId_2
             
            groupId_3 = oImg->AddGroup('0018,6011')
            oImg->SetValue,'0018,6012', 'US', 5, SEQID = groupId_3
            oImg->SetValue,'0018,6014', 'US', 6, SEQID = groupId_3
             
            
            
            vTags = oImg->EnumerateTags(COUNT=vTagCnt, $
               START_TAG='0018,6011', STOP_TAG='0020,0000')
             
            
            PRINT, FORMAT= $
               '(%"%3s, %2s, %-12s, %3s, %5s, %30s, %8s")', $
               'IDX', 'LVL', 'TAG', 'VR', 'SEQID', $
               'DESCRIPTION', 'VALUE'
             
            
            FOR xx = 0, vTagCnt-1  DO BEGIN
             
               
               
               IF (vTags[xx].Level GT 0) THEN BEGIN
                  vLvl = STRJOIN(REPLICATE('>',vTags[xx].Level))
                  vtg =  vLvl + vTags[xx].Tag
               ENDIF ELSE BEGIN
                  vtg = vTags[xx].Tag
               ENDELSE
             
               
               IF (vTags[xx].GroupNum GT 0) THEN BEGIN
                  PRINT, FORMAT='(%"%15s, %1d")', 'Group', vTags[xx].GroupNum
               ENDIF
             
               
               PRINT, FORMAT = $
                  '(%"%3d, %2d, %-12s, %3s, %5d, %30s, %8s")', $
                  xx, vTags[xx].Level, vtg,vTags[xx].VR, vTags[xx].SeqId, $
                  vTags[xx].Description, vTags[xx].Value
             
            ENDFOR
             
            
            OBJ_DESTROY, oImg
             
            END
            This program generates the following output. A root-level sequence (SQ) attribute (0018,6011) and three sets of repeating tags are added to the file. 
                             
            
            Adding Groups to a Nested Sequence
            The following example adds two groups to a nested sequence by first adding a sequence (‘0054,0016’) to the root level of the cloned file. The code then adds an attribute (‘0018,1071’) to the sequence. Another sequence (‘0054,0300’) is added to the root level sequence using the IDLffDicomEx::AddGroup method. 
            After adding the first set of repeating tags, call the IDLffDicomEx::Commit method to save the changes. Before you can add a second group of tags, you need to retrieve sequence identifiers. After returning the sequence identifier using IDLffDicomEx::GetValue, add the second group of tags. The root sequence is defined as the PARENTSEQID of the two groups. 
            Note: You do not have to call Commit after adding the first group of tags. This example calls Commit at this point to illustrates re-accessing the sequence identifier reference, which is lost when Commit is called. 
            Use the NON-CONFORMING keyword when creating a clone in order to avoid errors encountered when attempting to add non-standard attributes to the DICOM file. The new sequences and groups are printed to the Output Log window. 
            PRO dicom_addgrouptonestedseq_doc
             
            
            sFile = DIALOG_PICKFILE( $
                PATH=FILEPATH('',SUBDIRECTORY=['examples','data']), $
                TITLE='Select DICOM Patient File', FILTER='*.dcm', $
                GET_PATH=path)
             
            
            
            
             oImg = OBJ_NEW('IDLffDicomEx', path + 'aImgClone.dcm', $
                CLONE=sfile, /NON_CONFORMING)
             
            
            vRootSeq = oImg->AddSequence('0054,0016')
             
            
            oImg->SetValue, '0018,1071', 'DS', '0', SEQID=vRootSeq
             
            
            
            
            
            
            
            groupId_1 = oImg->AddGroup('0054,0300', PARENTSEQID=vRootSeq)
            oImg->SetValue,'0008,0100', 'SH', 'Tc-99m', SEQID = groupId_1
            oImg->SetValue,'0008,0102', 'SH', '99SDM', SEQID = groupId_1
             
            
            oImg->Commit
             
            
            
            vNewSeqid = oImg->GetValue('0054,0016') 
            groupId_2 = oImg->AddGroup('0054,0300', PARENTSEQID=vNewSeqid)
            oImg->SetValue,'0008,0100', 'SH', 'Tc-99m', SEQID = groupId_2
            oImg->SetValue,'0008,0102', 'SH', '99SDM', SEQID = groupId_2
             
            
            
            vTags = oImg->EnumerateTags(COUNT=vTagCnt, $
               START_TAG='0054,0016', STOP_TAG='0056,0000')
             
            
            PRINT, FORMAT= $
               '(%"%3s, %2s, %-12s, %3s, %5s, %30s, %10s")', $
               'IDX', 'LVL', 'TAG',  'VR', 'SEQID', $
               'DESCRIPTION', 'VALUE'
             
            
            FOR xx = 0, vTagCnt-1  DO BEGIN
             
               
               
                IF (vTags[xx].Level GT 0) THEN BEGIN
                  vLvl = STRJOIN(REPLICATE('>',vTags[xx].Level))
                  vtg =  vLvl + vTags[xx].Tag
                ENDIF ELSE BEGIN
                  vtg = vTags[xx].Tag
                ENDELSE
             
                
                IF (vTags[xx].GroupNum GT 0) THEN BEGIN
                   PRINT, FORMAT='(%"%15s, %1d")', 'Group', vTags[xx].GroupNum
                ENDIF
             
               
               PRINT, FORMAT = $
                  '(%"%3d, %2d, %-12s, %3s, %5d, %30s, %10s")', $
                   xx, vTags[xx].Level, vtg, vTags[xx].VR, vTags[xx].SeqId, $
                   vTags[xx].Description, vTags[xx].Value
             
            ENDFOR
             
            
            OBJ_DESTROY, oImg
             
            
            
            FILE_DELETE, path + 'aImgClone.dcm', /ALLOW_NONEXISTENT
             
            END
            This produces the following output. Notice that sequence (0054,0300) is nested inside sequence (0054,0016). 
            
                
            
            Version History