1.먼저 수정하고자 선택한 DICOM Element를 가져오기 위해
고유 ID에 dcmElementPtr을 Table에 row 추가시 dictionary로 저장

var ID2Elements = {};
function loadDICOMFileHierarchy(fileName){
    ///load시 재 초기화
    ID2Elements = {};
}

function AddTableRow(dcmElementPtr, level, parentRow, id, isLeaf){
    ///insert to dictionary
    ID2Elements[id] = dcmElementPtr;
    ...
}

2.수정 popup에서 ok후 rowData 및 SetElementValue()로 실제 DcmElement에 update

...
callback: function (data) {
            if (!data) 
                return;
                
            ///modify
            rowData['value'] = data.value.trim();
            nodeDCMTK.SetElementValue(ID2Elements[id], rowData['vr']);
}

3.SetElementValue()는 아래 형태로 수정

int SetElementValue(void* elementPtr, char* value)
{
	DcmElement* pElement = (DcmElement*)elementPtr;
	if (pElement == NULL)
		return 0;

	try
	{
		OFCondition status = pElement->putString(value);
		if (!status.good())
			return 0;
	}
	catch (...)
	{
		OutputDebugStringA("SetElementValue Exception!");
		return 0;
	}
	return 1;
}

4.File Save를 위해 menu에 save file…기능 추가

{
    label: 'Save File...',
    click: ()=>{
        var fileName=[];
        fileName = dialog.showSaveDialog({
            properties: ['saveFile'],
            filters: [
                {name: 'DICOM', extensions: ['dcm', 'dic']},
                {name: 'All Files', extensions: ['*']}
                ]
        }); 
        if(fileName == null)
            return;
        
        dcmTK.saveDICOMFile(fileName);
    }
},

5.SaveDICOMFile()함수는 아래 형태로 구현


int SaveDcmFileFormat(void* dcmPtr, char* fileName)
{
	DcmFileFormat* pDcmFileFormat = (DcmFileFormat*)dcmPtr;
	if (pDcmFileFormat == NULL)
		return 0;

	try
	{
		OFFilename *pOFFileName = new OFFilename(fileName);
		OFCondition status = pDcmFileFormat->saveFile(*pOFFileName);
		if (!status.good())
			return 0;
	}
	catch (...)
	{
		OutputDebugStringA("SaveDcmFileFormat::saveFile Exception!");
	}
	return 1;
}

7.수정된 DICOM 파일로 정상 저장 됨