private static string AddPrefix(String strAccPrefix, MElementList elmlist, String accNoOrg, String patIDOrg, int PrefixLength) { AddPrefixForAccNo(strAccPrefix, elmlist, accNoOrg); //Modify PatientID if (patIDOrg.Length > PrefixLength) { patIDOrg = patIDOrg.Remove(PrefixLength); } using (MElementRef element = elmlist.get_Element(tag_t.kPatientID)) { string patIDNew = strAccPrefix + patIDOrg; //delete special char string patIDNew_temp = ""; Regex re = new Regex(@"[a-zA-Z0-9-_]+", RegexOptions.None); MatchCollection collection = re.Matches(patIDNew); foreach (Match ma in collection) { patIDNew_temp += ma.ToString(); } patIDNew = patIDNew_temp; if (element == null || (element != null && element.value_count <= 0)) { MElement ele = new MElement(tag_t.kPatientID, vr_t.LO); ele.set_string(0, patIDNew); elmlist.addElement(ele); } else { element.set_string(0, patIDNew); } } return(patIDOrg); }
private string GetStringTagValue(MElementList elmlist, tag_t tag) { var strValue = string.Empty; try { using (MElementRef eref = elmlist.get_Element(tag)) { if (eref != null && eref.value_count != 0 && eref.value_count != -1) { strValue = eref.get_string(0); } else { strValue = ""; } return(strValue); } } catch (Exception e) { _logger.Error("DicomHeader.GetStringTagValue(): " + "get string for tag " + tag.ToString() + " pop up an exception--" + e.Message + "."); return(strValue); } }
private static void SetTSN(MElementList elmlist) { string str_tsn = ""; using (MElementRef element = elmlist.get_Element(tag_t.kTransferSyntaxUID)) { if (element != null && element.value_count > 0) { str_tsn = element.get_string(0); if (str_tsn == "") { str_tsn = "1.2.840.10008.1.2"; kdt_managed.UID tsn = new kdt_managed.UID(str_tsn); element.set_uid(0, tsn); } } } if (str_tsn == "") { MElement tsnUid = new MElement(tag_t.kTransferSyntaxUID, vr_t.UI); kdt_managed.UID tsn = new kdt_managed.UID("1.2.840.10008.1.2"); tsnUid.set_uid(0, tsn); elmlist.addElement(tsnUid); } }
private string GetDateTimeTagValue(MElementList elmlist, tag_t tag) { var strValue = string.Empty; var strRet = string.Empty; try { using (MElementRef eref = elmlist.get_Element(tag)) { if (eref != null && eref.value_count != 0 && eref.value_count != -1) { strValue = eref.get_string(0); } if (!string.IsNullOrEmpty((strValue))) { strRet = System.DateTime.ParseExact(strValue, "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture).ToString("yyyy-MM-dd"); } return(strRet); } } catch (Exception e) { _logger.Error("DCMHeader.GetDateTimeTagValue(): " + "get datetime for tag " + tag.ToString() + " pop up an exception--" + e.Message + "."); strRet = System.DateTime.ParseExact(strValue, "yyyy.MM.dd", System.Globalization.CultureInfo.CurrentCulture).ToString("yyyy-MM-dd"); return(strRet); } }
private static void AddPrefixForAccNo(String strAccPrefix, MElementList elmlist, String accNoOrg) { using (MElementRef element = elmlist.get_Element(tag_t.kAccessionNumber)) { string accNoNew = strAccPrefix + accNoOrg; //delete special char string accNoNew_temp = ""; Regex re = new Regex(@"[a-zA-Z0-9-_]+", RegexOptions.None); MatchCollection collection = re.Matches(accNoNew); foreach (Match ma in collection) { accNoNew_temp += ma.ToString(); } accNoNew = accNoNew_temp; if (element == null || (element != null && element.value_count <= 0)) { MElement ele = new MElement(tag_t.kAccessionNumber, vr_t.LO); ele.set_string(0, accNoNew); elmlist.addElement(ele); } else { element.set_string(0, accNoNew); } } }
public static void GetDcmInfo(List <string> PrcFileList, out List <DCMInfo> dcmInfoList) { dcmInfoList = new List <DCMInfo>(); try { foreach (String prcFilePath in PrcFileList) { FileInfo file = new FileInfo(prcFilePath); MElementList elmlist = new MElementList(); using (DicomHeader dicomHeader = new DicomHeader()) { if (!MDecoder.read_pt10_file(prcFilePath, ref elmlist, null, -1)) { _logger.Error("Archiver.ProcessDcmFile(): " + "read dicom file " + prcFilePath + " error."); continue; } bool bRet = dicomHeader.BuildDicomInfo(elmlist); elmlist.Dispose(); if (bRet) { DCMInfo dcmInfo = dicomHeader.GetDCMInfo(); dcmInfo.ImageDto.SrcFilePath = prcFilePath; dcmInfo.ImageDto.FileSize = file.Length; dcmInfoList.Add(dcmInfo); } } } } catch (Exception ex) { _logger.Error("Archiver.ProcessDcmFile(): " + "archive file failed " + ex.Message); } }
/// <summary> /// For some tag with local language, e.g PatientName /// ISO_IR 192: use UTF8 encoding local string /// ISO_IR 100: use GB2312 encoding local string /// </summary> /// <param name="strValue"></param> /// <param name="elmlist"></param> /// <param name="tag"></param> private string GetLocalStringTagValue(MElementList elmlist, tag_t tag) { var strValue = string.Empty; try { String str_speccharacter = ""; using (MElementRef intereref = elmlist.get_Element(tag_t.kSpecificCharacterSet)) { if (intereref != null && intereref.value_count != 0 && intereref.value_count != -1) { str_speccharacter = intereref.get_string(0); } else { str_speccharacter = ""; } } using (MElementRef eref = elmlist.get_Element(tag)) { Byte[] byte_patName = null; if (str_speccharacter.Trim() == "ISO_IR 192") { if (eref != null && eref.value_count != 0 && eref.value_count != -1) { byte_patName = eref.get_blob(0); } strValue = Encoding.UTF8.GetString(byte_patName); } else if (str_speccharacter.Trim() == "ISO_IR 100") { if (eref != null && eref.value_count != 0 && eref.value_count != -1) { byte_patName = eref.get_blob(0); } strValue = Encoding.GetEncoding("GB2312").GetString(byte_patName); } else { if (eref != null && eref.value_count != 0 && eref.value_count != -1) { strValue = eref.get_string(0); } else { strValue = " "; } } return(strValue); } } catch (Exception e) { _logger.Error("DCMHeader.GetStringTagValue(): " + "get string for tag " + tag.ToString() + " pop up an exception--" + e.Message + "."); return(strValue); } }
private bool SaveFile(MElementList dataset) { string rootPath = m_theStore.StoragePath + Convert.ToString(System.IO.Path.DirectorySeparatorChar); DAPBussiness bussiness = new DAPBussiness(); var result = bussiness.SaveDICOMInfo(dataset, base.getNegotiatedTsn(), m_theObserver.getImplClassUid(), m_theObserver.getImplVersionName(), rootPath); return(result); }
public static bool BuildDICOMInfo(MElementList elmlist, ref DICOMInfoDto dicomDto) { try { var dicom = Mapper.Map <DICOMInfo>(elmlist); dicomDto.StudyInstanceUID = dicom.StudyInstanceUID; dicomDto.SeriesInstanceUID = dicom.SeriesInstanceUID; dicomDto.SOPInstanceUID = dicom.SOPInstanceUID; dicomDto.PatientID = dicom.PatientID; dicomDto.PatientName = dicom.PatientName; dicomDto.PatientDOB = dicom.PatientDOB; dicomDto.PatientAge = dicom.PatientAge; dicomDto.PatientSex = dicom.PatientSex; dicomDto.AccessionNo = dicom.AccessionNo; dicomDto.BodyPart = dicom.BodyPart; dicomDto.Modality = dicom.Modality; dicomDto.ExamCode = string.Empty; dicomDto.StudyDate = dicom.StudyDate; dicomDto.StudyTime = dicom.StudyTime; dicomDto.StudyDescription = dicom.StudyDescription; dicomDto.ReferPhysician = dicom.ReferPhysician; dicomDto.SeriesNo = dicom.SeriesNo; int parseNo; int.TryParse(dicom.ImageNo, out parseNo); dicomDto.ImageNo = parseNo; if (dicom.PatientID == "") { _logger.Error("DicomHeader.BuildDcmInfo(): " + "PatientID is empty."); return(false); } if (dicom.StudyInstanceUID == "") { _logger.Error("DicomHeader.BuildDcmInfo(): " + "StudyInstanceUID is empty."); return(false); } //Series Group if (dicom.SeriesInstanceUID == "") { _logger.Error("DicomHeader.BuildDcmInfo(): " + "SeriesInstanceUID is empty."); return(false); } if (dicom.SOPInstanceUID == "") { _logger.Error("DicomHeader.BuildDcmInfo(): " + "SOPInstanceUID is empty."); return(false); } _logger.Error("DicomHeader.BuildDcmInfo(): " + "build dicom info successfully."); return(true); } catch (Exception e) { _logger.Error("DicomHeader.BuildDcmInfo(): " + "pop up an exception--" + e.Message + "."); return(false); } }
private string GetUIDTagValue(MElementList elmlist, tag_t tag) { var strUID = string.Empty; using (MElementRef eref = elmlist.get_Element(tag)) { if (eref != null && eref.value_count != 0 && eref.value_count != -1) { strUID = eref.get_uid(0); } return(strUID); } }
private void GetUIDTagValue(ref string strUID, MElementList elmlist, tag_t tag) { using (MElementRef eref = elmlist.get_Element(tag)) { if (eref != null && eref.value_count != 0 && eref.value_count != -1) { strUID = eref.get_uid(0); } else { strUID = ""; } } }
private static void GetDICOMInfo(MElementList elmlist, ref String accNoOrg, ref String patIDOrg) { using (MElementRef element = elmlist.get_Element(tag_t.kAccessionNumber)) { if (element != null && element.value_count > 0) { accNoOrg = element.get_string(0); } } using (MElementRef element = elmlist.get_Element(tag_t.kPatientID)) { if (element != null && element.value_count > 0) { patIDOrg = element.get_string(0); } } }
/// <summary> /// indicate receiving over of an image /// </summary> /// <param name="ind">all the information about the received image</param> /// <param name="status">status that returned to the SCU</param> public override void indication(MElementList ind, MElementList status) { using (MElementRef eref = ind.get_Element(tag_t.kSOPInstanceUID)) { if (eref != null) { m_fileName = eref.get_string(0); } } MElementList pt10file = ind.getDataset(); // save image and update case information if (!SaveFile(pt10file)) { try { using (MElementRef statusRef = status.get_Element(tag_t.kStatus)) { // notify the client that image processing failed and cancel the whole association statusRef.set_ushort(0, (ushort)MDTService.status_t.PROCESSING_FAILURE); statusRef.set_ushort(1, (ushort)MDTService.status_t.CANCEL); } // file saving failed,the case should not be submitted m_theObserver.m_OK = false; } catch (Exception e) { m_theObserver.m_OK = false; _logger.Info("DAPStoreService.indication(): " + "set response status error " + e.Message); } } // release the memory used by MElementList pt10file.Dispose(); ind.Dispose(); GC.Collect(); GC.WaitForPendingFinalizers(); }
/// <summary> /// Save DICOM data and file /// </summary> public bool SaveDICOMInfo(MElementList dataset, ts_t baseTsn, string implClassUid, string versionName, string rootPath) { var dicom = new DICOMInfoDto(); DICOMUtility.BuildDICOMInfo(dataset, ref dicom); var path = rootPath + dicom.AccessionNo + Convert.ToString(Path.DirectorySeparatorChar); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } var filePath = path + dicom.SOPInstanceUID + ".dcm"; var result1 = SaveDICOMFile(dataset, baseTsn, implClassUid, versionName, filePath); var result2 = false; if (result1) { result2 = SaveDICOMData(dicom, filePath); } return(result1 && result2); }
private int GetIntTagValue(MElementList elmlist, tag_t tag) { var nValue = 0; try { using (MElementRef eref = elmlist.get_Element(tag)) { if (eref != null && eref.value_count != 0 && eref.value_count != -1) { nValue = eref.get_sint(0); } return(nValue); } } catch (Exception e) { _logger.Error("DCMHeader.GetIntTagValue(): " + "get int for tag " + tag.ToString() + " pop up an exception--" + e.Message + "."); return(nValue); } }
private void GetDateTimeTagValue(ref string strValue, MElementList elmlist, tag_t tag) { try { using (MElementRef eref = elmlist.get_Element(tag)) { if (eref != null && eref.value_count != 0 && eref.value_count != -1) { strValue = eref.get_string(0); } else { strValue = " "; } } } catch (Exception e) { strValue = " "; _logger.Error("DCMHeader.GetDateTimeTagValue(): " + "get datetime for tag " + tag.ToString() + " pop up an exception--" + e.Message + "."); } }
public bool BuildDicomInfo(MElementList elmlist) { bool bRet = false; try { //Patient Group //PK Verify GetStringTagValue(ref PatientID, elmlist, tag_t.kPatientID); if (PatientID == "") { _logger.Error("DicomHeader.BuildDcmInfo(): " + "PatientID is empty."); return(false); } GetLocalStringTagValue(ref PatientName, elmlist, tag_t.kPatientsName); GetDateTimeTagValue(ref PatientDOB, elmlist, tag_t.kPatientsBirthDate); //yyyy-MM-dd if (PatientDOB != " ") { PatientDOB = ParseDateTime(PatientDOB); } GetStringTagValue(ref PatientAge, elmlist, tag_t.kPatientsAge); GetStringTagValue(ref PatientSex, elmlist, tag_t.kPatientsSex); //Study Group GetUIDTagValue(ref StudyInstanceUID, elmlist, tag_t.kStudyInstanceUID); if (StudyInstanceUID == "") { _logger.Error("DicomHeader.BuildDcmInfo(): " + "StudyInstanceUID is empty."); return(false); } GetStringTagValue(ref AccessionNo, elmlist, tag_t.kAccessionNumber); GetStringTagValue(ref BodyPart, elmlist, tag_t.kBodyPartExamined); GetStringTagValue(ref Modality, elmlist, tag_t.kModality); GetDateTimeTagValue(ref StudyDate, elmlist, tag_t.kStudyDate); if (StudyDate != " ") { StudyDate = ParseDateTime(StudyDate); } GetDateTimeTagValue(ref StudyTime, elmlist, tag_t.kStudyTime); GetStringTagValue(ref StudyDescription, elmlist, tag_t.kStudyDescription); GetStringTagValue(ref ReferPhysician, elmlist, tag_t.kReferringPhysiciansName); GetStringTagValue(ref Manufacture, elmlist, tag_t.kManufacturer); GetStringTagValue(ref InstitutionName, elmlist, tag_t.kInstitutionName); GetStringTagValue(ref StationName, elmlist, tag_t.kStationName); //Series Group GetUIDTagValue(ref SeriesInstanceUID, elmlist, tag_t.kSeriesInstanceUID); if (SeriesInstanceUID == "") { _logger.Error("DicomHeader.BuildDcmInfo(): " + "SeriesInstanceUID is empty."); return(false); } GetIntTagValue(ref SeriesNo, elmlist, tag_t.kSeriesNumber); GetStringTagValue(ref PatientPosition, elmlist, tag_t.kPatientPosition); GetStringTagValue(ref ViewPosition, elmlist, tag_t.kViewPosition); GetDateTimeTagValue(ref SeriesDate, elmlist, tag_t.kSeriesDate); if (SeriesDate != " ") { SeriesDate = ParseDateTime(SeriesDate); } GetDateTimeTagValue(ref SeriesTime, elmlist, tag_t.kSeriesTime); GetStringTagValue(ref SeriesDescription, elmlist, tag_t.kSeriesDescription); //Image Group GetUIDTagValue(ref SOPInstanceUID, elmlist, tag_t.kSOPInstanceUID); if (SOPInstanceUID == "") { _logger.Error("DicomHeader.BuildDcmInfo(): " + "SOPInstanceUID is empty."); return(false); } GetStringTagValue(ref ImageNo, elmlist, tag_t.kInstanceNumber); //InstanceNumber of some dicom is "" if (string.IsNullOrEmpty(ImageNo)) { ImageNo = "0"; } GetStringTagValue(ref ImageType, elmlist, tag_t.kImageType); GetIntTagValue(ref NumberOfFrames, elmlist, tag_t.kNumberOfFrames); GetDateTimeTagValue(ref ImageDate, elmlist, tag_t.kAcquisitionDate); if (ImageDate != " ") { ImageDate = ParseDateTime(ImageDate); } GetDateTimeTagValue(ref ImageTime, elmlist, tag_t.kAcquisitionTime); GetIntTagValue(ref SamplesPerPixel, elmlist, tag_t.kSamplesPerPixel); GetIntTagValue(ref ImageRows, elmlist, tag_t.kRows); GetIntTagValue(ref ImageColumns, elmlist, tag_t.kColumns); GetIntTagValue(ref BitsAllocated, elmlist, tag_t.kBitsAllocated); GetIntTagValue(ref BitsStored, elmlist, tag_t.kBitsStored); GetStringTagValue(ref PixelSpacing, elmlist, tag_t.kPixelSpacing); GetStringTagValue(ref PhotometricIntr, elmlist, tag_t.kPhotometricInterpretation); GetIntTagValue(ref KVP, elmlist, tag_t.kKVP); GetIntTagValue(ref Exposure, elmlist, tag_t.kExposureTime); _logger.Error("DicomHeader.BuildDcmInfo(): " + "build dicom info successfully."); } catch (Exception e) { _logger.Error("DicomHeader.BuildDcmInfo(): " + "pop up an exception--" + e.Message + "."); } return(true); }
/// <summary> /// used by SCU /// </summary> /// <param name="con">confirm information from SCP</param> public override void confirmation(MElementList con) { }
/// <summary> /// Save DICOM file /// </summary> /// <param name="dataset"></param> /// <param name="baseTsn"></param> /// <param name="implClassUid"></param> /// <param name="versionName"></param> /// <param name="path"></param> /// <returns></returns> private bool SaveDICOMFile(MElementList dataset, ts_t baseTsn, string implClassUid, string versionName, string filePath) { try { // add the following group 2 element for writing pt10 files string str_tsn = "1.2.840.10008.1.2"; switch (baseTsn) { case ts_t.ImplicitVRLittleEndian: str_tsn = "1.2.840.10008.1.2"; break; case ts_t.ExplicitVRBigEndian: str_tsn = "1.2.840.10008.1.2.2"; break; case ts_t.ExplicitVRLittleEndian: str_tsn = "1.2.840.10008.1.2.1"; break; case ts_t.JPEGLosslessNonHierarchical_14: str_tsn = "1.2.840.10008.1.2.4.57"; break; case ts_t.JPEGLosslessNonHierarchicalFirstOrderPrediction: str_tsn = "1.2.840.10008.1.2.4.70"; break; default: str_tsn = "1.2.840.10008.1.2"; break; } MElement tsnUid = new MElement(tag_t.kTransferSyntaxUID, vr_t.UI); UID tsn = new UID(str_tsn); tsnUid.set_uid(0, tsn); dataset.addElement(tsnUid); MElement implUid = new MElement(tag_t.kImplementationClassUID, vr_t.UI); UID uid = new UID(implClassUid); implUid.set_uid(0, uid); dataset.addElement(implUid); MElement implVer = new MElement(tag_t.kImplementationVersionName, vr_t.SH); string version = versionName; implVer.set_string(0, version); dataset.addElement(implVer); // Note: in the current version,saving file will use a large size of memory,this is a limitation // of the managed class in KDT,in the later version,if the limitation is resolved,we will use // the MDecoder to save files,not the MEncoder.wirte_pt10_file if (MEncoder.write_pt10_file ( filePath, dataset, true, // item length is explicit false // do not check group 2 items )) { _logger.Info("DAPStoreService.SaveFile(): " + "save file:" + filePath + "OK."); return(true); } else { _logger.Info("DAPStoreService.SaveFile(): " + "save file:" + filePath + "failed."); return(false); } } catch (Exception e) { _logger.Info("DAPStoreService.SaveFile(): " + "error occurred while trying to write part-10 file " + e.Message); return(false); } }
public static bool ModifyAccNoAndPatientID(string filePath, string tempFilePath, string prefix, out string message) { Boolean ret = false; message = ""; //String strAccPrefix = @"-" + m_infoDAP.HospitalID.ToString(); String strAccPrefix = prefix; try { MElementList elmlist = new MElementList(); if (!MDecoder.read_pt10_file(filePath, ref elmlist, null, -1)) { _logger.Error("ImageSubmitService.ModifyAccNoAndPatientID(): " + "read dicom file " + filePath + " error."); message = "SendFTPError002"; return(ret); } //Modify AccessionNumber String accNoOrg = ""; String patIDOrg = ""; GetDICOMInfo(elmlist, ref accNoOrg, ref patIDOrg); #region process Num //PID,AccNo为空时拒绝接受该图像 if (patIDOrg.Length == 0 || accNoOrg.Length == 0) { IDEmptyProcess(patIDOrg); elmlist.Dispose(); message = "SendFTPError003"; return(false); } #endregion int PrefixLength = 32 - strAccPrefix.Length; if (accNoOrg.Length > PrefixLength) { accNoOrg = accNoOrg.Remove(PrefixLength); } patIDOrg = AddPrefix(strAccPrefix, elmlist, accNoOrg, patIDOrg, PrefixLength); //judge TransferSyntax SetTSN(elmlist); if (MEncoder.write_pt10_file ( tempFilePath, elmlist, true, // item length is explicit false // do not check group 2 items )) { elmlist.Dispose(); _logger.Debug("ImageSubmitService.ModifyAccNoAndPatientID(): " + "save dicom file " + tempFilePath + " ok."); return(true); } else { elmlist.Dispose(); _logger.Error("ImageSubmitService.ModifyAccNoAndPatientID(): " + "save dicom file " + tempFilePath + " error."); message = "SendFTPError002"; return(false); } } catch (Exception e) { _logger.Error("ImageSubmitService.ModifyAccNoAndPatientID(): " + "pop up an exception--" + e.Message); } return(ret); }