123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 |
- 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<QRstudy> qrstudys = new List<QRstudy>();
- 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<QRstudy>();
- 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<string>(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();
- }
- }
- }
|