using Dicom; using Dicom.Network; using System; using System.Collections.Generic; using System.ComponentModel; using System.Configuration; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace PacsView3D { public partial class QRFrm : Form { private static string QRServerHost = ConfigurationManager.AppSettings["QRHOST"]; private static string QRServerAET = ConfigurationManager.AppSettings["QRAETITLE"]; private static int QRServerPort = int.Parse(ConfigurationManager.AppSettings["QRPORT"]); private static string AET = ConfigurationManager.AppSettings["AETITLE"]; DicomClient client = new DicomClient(); private static List qrstudys = new List(); public QRFrm() { InitializeComponent(); panel1.Visible = false; client.NegotiateAsyncOps(); } public void iniPanel () { panel1.Left = this.Width / 2 - panel1.Width / 2; panel1.Top = (this.Height - groupBox1.Height) / 2 - panel1.Height / 2; } private void btnQuery_Click(object sender, EventArgs e) { dataGridView1.DataSource = null; qrstudys = new List(); DateTime dt1 = this.datetimeStart.Value; string startData = dt1.ToString("yyyyMMdd"); DateTime dt2 = this.datetimeEnd.Value; string endData = dt2.ToString("yyyyMMdd"); string studyDate = startData + "-" + endData; var request = CreateStudyRequestByParam(txtName.Text,txtPatientid.Text,txtAccessNumber.Text,txtModality.Text, studyDate); request.OnResponseReceived += ResponseReceived; client.AddRequest(request); client.Send(QRServerHost, QRServerPort, false, AET, QRServerAET); dataGridView1.DataSource = qrstudys; } private void ResponseReceived(DicomCFindRequest req, DicomCFindResponse response) { QRstudy qrstudy = new QRstudy(); DebugStudyResponse(response); qrstudy.patientID = GetTagValue(response, DicomTag.PatientID); qrstudy.patientName = GetTagValue(response, DicomTag.PatientName); qrstudy.sex = GetTagValue(response, DicomTag.PatientSex); qrstudy.birthDate = GetTagValue(response, DicomTag.PatientBirthDate); qrstudy.accessionNumber = GetTagValue(response, DicomTag.AccessionNumber); qrstudy.Modality = GetTagValue(response, DicomTag.ModalitiesInStudy); qrstudy.studyDate = GetTagValue(response, DicomTag.StudyDate); qrstudy.studyDesc = GetTagValue(response, DicomTag.StudyDescription); qrstudy.studyUID = GetTagValue(response, DicomTag.StudyInstanceUID); qrstudys.Add(qrstudy); } public string GetTagValue(DicomCFindResponse response, DicomTag dt) { try { return response.Dataset?.GetSingleValue(dt); } catch(Exception ex) { return ""; } } public static DicomCFindRequest CreateStudyRequestByParam(string patientName,string patientID,string accessionNumber, string modality, string studyDate) { // there is a built in function to create a Study-level CFind request very easily: // return DicomCFindRequest.CreateStudyQuery(patientName: patientName); // but consider to create your own request that contains exactly those DicomTags that // you realy need pro process your data and not to cause unneccessary traffic and IO load: var request = new DicomCFindRequest(DicomQueryRetrieveLevel.Study); // always add the encoding request.Dataset.AddOrUpdate(new DicomTag(0x8, 0x5), "ISO_IR 100"); // add the dicom tags with empty values that should be included in the result of the QR Server request.Dataset.AddOrUpdate(DicomTag.PatientName, ""); request.Dataset.AddOrUpdate(DicomTag.PatientID, ""); request.Dataset.AddOrUpdate(DicomTag.PatientSex, ""); request.Dataset.AddOrUpdate(DicomTag.ModalitiesInStudy, ""); request.Dataset.AddOrUpdate(DicomTag.StudyDate, ""); request.Dataset.AddOrUpdate(DicomTag.StudyTime, ""); request.Dataset.AddOrUpdate(DicomTag.AccessionNumber, ""); request.Dataset.AddOrUpdate(DicomTag.StudyInstanceUID, ""); request.Dataset.AddOrUpdate(DicomTag.StudyDescription, ""); // add the dicom tags that contain the filter criterias if (patientName.Length>0 ) { request.Dataset.AddOrUpdate(DicomTag.PatientName, patientName); } else { request.Dataset.AddOrUpdate(DicomTag.PatientName, "*"); } if (patientID.Length>0) { request.Dataset.AddOrUpdate(DicomTag.PatientID, patientID); } if (accessionNumber.Length > 0) { request.Dataset.AddOrUpdate(DicomTag.AccessionNumber, accessionNumber); } if (modality.Length > 0) { request.Dataset.AddOrUpdate(DicomTag.Modality, modality); } if (studyDate.Length > 0) { request.Dataset.AddOrUpdate(DicomTag.StudyDate, studyDate); } return request; } public static void DebugStudyResponse(DicomCFindResponse response) { if (response.Status == DicomStatus.Pending) { // print the results Console.WriteLine($"Patient {response.Dataset.GetSingleValueOrDefault(DicomTag.PatientName, string.Empty)}, {(response.Dataset.TryGetString(DicomTag.ModalitiesInStudy, out var dummy) ? dummy : string.Empty)}-Study from {response.Dataset.GetSingleValueOrDefault(DicomTag.StudyDate, new DateTime())} with UID {response.Dataset.GetSingleValueOrDefault(DicomTag.StudyInstanceUID, string.Empty)} "); } if (response.Status == DicomStatus.Success) { Console.WriteLine(response.Status.ToString()); } } public static DicomCMoveRequest CreateCMoveByStudyUID(string destination, string studyUID) { Log4NetHelper.WriteLogDebug("Cmove:destination:" + destination, null); Log4NetHelper.WriteLogDebug("Cmove:studyUID:" + studyUID, null); var request = new DicomCMoveRequest(destination, studyUID); // no more dicomtags have to be set return request; } private void dataGridView1_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e) { int selectindex = dataGridView1.CurrentRow.Index; QRstudy study = qrstudys[selectindex]; string studyUID = study.studyUID; Log4NetHelper.WriteLog("studyUID" + studyUID); DicomClient client = new DicomClient(); var cMoveRequest = CreateCMoveByStudyUID(AET, studyUID); bool? moveSuccessfully = null; panel1.Visible = true; int imageNo = 0; cMoveRequest.OnResponseReceived += (DicomCMoveRequest requ, DicomCMoveResponse response) => { //Log4NetHelper.WriteLogDebug("Cmove:response.Status:" + response.Status.State, null); //Log4NetHelper.WriteLog("Cmove:response.Status:" + response.Status.State); imageNo = imageNo + 1; this.label7.Text = "正在回调图像请等候...(" + imageNo.ToString() +")"; if (response.Status.State == DicomState.Pending) { Console.WriteLine("Sending is in progress. please wait: " + response.Remaining.ToString()); } else if (response.Status.State == DicomState.Success) { Console.WriteLine("Sending successfully finished"); moveSuccessfully = true; } else if (response.Status.State == DicomState.Failure) { //Log4NetHelper.WriteLogDebug("response.Status.Description:" + response.Status.Description, null); //Log4NetHelper.WriteLog("response.Status.Description:" + response.Status.Description); Console.WriteLine("Error sending datasets: " + response.Status.Description); moveSuccessfully = false; panel1.Visible = false; MessageBox.Show("图像回调失败!"); } Console.WriteLine(response.Status); }; client.AddRequest(cMoveRequest); client.Send(QRServerHost, QRServerPort, false, AET, QRServerAET); if (moveSuccessfully.GetValueOrDefault(false)) { Console.WriteLine("images sent successfully"); //MessageBox.Show("图像回调成功!"); panel1.Visible = false; this.Hide(); // images sent successfully from QR Server to the store scp } } private void QRFrm_Resize(object sender, EventArgs e) { iniPanel(); } } }