QRFrm.cs 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. using Dicom;
  2. using Dicom.Network;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.ComponentModel;
  6. using System.Configuration;
  7. using System.Data;
  8. using System.Drawing;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. using System.Windows.Forms;
  13. namespace PacsView3D
  14. {
  15. public partial class QRFrm : Form
  16. {
  17. private static string QRServerHost = ConfigurationManager.AppSettings["QRHOST"];
  18. private static string QRServerAET = ConfigurationManager.AppSettings["QRAETITLE"];
  19. private static int QRServerPort = int.Parse(ConfigurationManager.AppSettings["QRPORT"]);
  20. private static string AET = ConfigurationManager.AppSettings["AETITLE"];
  21. DicomClient client = new DicomClient();
  22. private static List<QRstudy> qrstudys = new List<QRstudy>();
  23. public QRFrm()
  24. {
  25. InitializeComponent();
  26. panel1.Visible = false;
  27. client.NegotiateAsyncOps();
  28. }
  29. public void iniPanel ()
  30. {
  31. panel1.Left = this.Width / 2 - panel1.Width / 2;
  32. panel1.Top = (this.Height - groupBox1.Height) / 2 - panel1.Height / 2;
  33. }
  34. private void btnQuery_Click(object sender, EventArgs e)
  35. {
  36. dataGridView1.DataSource = null;
  37. qrstudys = new List<QRstudy>();
  38. DateTime dt1 = this.datetimeStart.Value;
  39. string startData = dt1.ToString("yyyyMMdd");
  40. DateTime dt2 = this.datetimeEnd.Value;
  41. string endData = dt2.ToString("yyyyMMdd");
  42. string studyDate = startData + "-" + endData;
  43. var request = CreateStudyRequestByParam(txtName.Text,txtPatientid.Text,txtAccessNumber.Text,txtModality.Text, studyDate);
  44. request.OnResponseReceived += ResponseReceived;
  45. client.AddRequest(request);
  46. client.Send(QRServerHost, QRServerPort, false, AET, QRServerAET);
  47. dataGridView1.DataSource = qrstudys;
  48. }
  49. private void ResponseReceived(DicomCFindRequest req, DicomCFindResponse response)
  50. {
  51. QRstudy qrstudy = new QRstudy();
  52. DebugStudyResponse(response);
  53. qrstudy.patientID = GetTagValue(response, DicomTag.PatientID);
  54. qrstudy.patientName = GetTagValue(response, DicomTag.PatientName);
  55. qrstudy.sex = GetTagValue(response, DicomTag.PatientSex);
  56. qrstudy.birthDate = GetTagValue(response, DicomTag.PatientBirthDate);
  57. qrstudy.accessionNumber = GetTagValue(response, DicomTag.AccessionNumber);
  58. qrstudy.Modality = GetTagValue(response, DicomTag.ModalitiesInStudy);
  59. qrstudy.studyDate = GetTagValue(response, DicomTag.StudyDate);
  60. qrstudy.studyDesc = GetTagValue(response, DicomTag.StudyDescription);
  61. qrstudy.studyUID = GetTagValue(response, DicomTag.StudyInstanceUID);
  62. qrstudys.Add(qrstudy);
  63. }
  64. public string GetTagValue(DicomCFindResponse response, DicomTag dt)
  65. {
  66. try
  67. {
  68. return response.Dataset?.GetSingleValue<string>(dt);
  69. }
  70. catch(Exception ex)
  71. {
  72. return "";
  73. }
  74. }
  75. public static DicomCFindRequest CreateStudyRequestByParam(string patientName,string patientID,string accessionNumber, string modality, string studyDate)
  76. {
  77. // there is a built in function to create a Study-level CFind request very easily:
  78. // return DicomCFindRequest.CreateStudyQuery(patientName: patientName);
  79. // but consider to create your own request that contains exactly those DicomTags that
  80. // you realy need pro process your data and not to cause unneccessary traffic and IO load:
  81. var request = new DicomCFindRequest(DicomQueryRetrieveLevel.Study);
  82. // always add the encoding
  83. request.Dataset.AddOrUpdate(new DicomTag(0x8, 0x5), "ISO_IR 100");
  84. // add the dicom tags with empty values that should be included in the result of the QR Server
  85. request.Dataset.AddOrUpdate(DicomTag.PatientName, "");
  86. request.Dataset.AddOrUpdate(DicomTag.PatientID, "");
  87. request.Dataset.AddOrUpdate(DicomTag.PatientSex, "");
  88. request.Dataset.AddOrUpdate(DicomTag.ModalitiesInStudy, "");
  89. request.Dataset.AddOrUpdate(DicomTag.StudyDate, "");
  90. request.Dataset.AddOrUpdate(DicomTag.StudyTime, "");
  91. request.Dataset.AddOrUpdate(DicomTag.AccessionNumber, "");
  92. request.Dataset.AddOrUpdate(DicomTag.StudyInstanceUID, "");
  93. request.Dataset.AddOrUpdate(DicomTag.StudyDescription, "");
  94. // add the dicom tags that contain the filter criterias
  95. if (patientName.Length>0 )
  96. {
  97. request.Dataset.AddOrUpdate(DicomTag.PatientName, patientName);
  98. }
  99. else
  100. {
  101. request.Dataset.AddOrUpdate(DicomTag.PatientName, "*");
  102. }
  103. if (patientID.Length>0)
  104. {
  105. request.Dataset.AddOrUpdate(DicomTag.PatientID, patientID);
  106. }
  107. if (accessionNumber.Length > 0)
  108. {
  109. request.Dataset.AddOrUpdate(DicomTag.AccessionNumber, accessionNumber);
  110. }
  111. if (modality.Length > 0)
  112. {
  113. request.Dataset.AddOrUpdate(DicomTag.Modality, modality);
  114. }
  115. if (studyDate.Length > 0)
  116. {
  117. request.Dataset.AddOrUpdate(DicomTag.StudyDate, studyDate);
  118. }
  119. return request;
  120. }
  121. public static void DebugStudyResponse(DicomCFindResponse response)
  122. {
  123. if (response.Status == DicomStatus.Pending)
  124. {
  125. // print the results
  126. 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)} ");
  127. }
  128. if (response.Status == DicomStatus.Success)
  129. {
  130. Console.WriteLine(response.Status.ToString());
  131. }
  132. }
  133. public static DicomCMoveRequest CreateCMoveByStudyUID(string destination, string studyUID)
  134. {
  135. Log4NetHelper.WriteLogDebug("Cmove:destination:" + destination, null);
  136. Log4NetHelper.WriteLogDebug("Cmove:studyUID:" + studyUID, null);
  137. var request = new DicomCMoveRequest(destination, studyUID);
  138. // no more dicomtags have to be set
  139. return request;
  140. }
  141. private void dataGridView1_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e)
  142. {
  143. int selectindex = dataGridView1.CurrentRow.Index;
  144. QRstudy study = qrstudys[selectindex];
  145. string studyUID = study.studyUID;
  146. Log4NetHelper.WriteLog("studyUID" + studyUID);
  147. DicomClient client = new DicomClient();
  148. var cMoveRequest = CreateCMoveByStudyUID(AET, studyUID);
  149. bool? moveSuccessfully = null;
  150. panel1.Visible = true;
  151. int imageNo = 0;
  152. cMoveRequest.OnResponseReceived += (DicomCMoveRequest requ, DicomCMoveResponse response) =>
  153. {
  154. //Log4NetHelper.WriteLogDebug("Cmove:response.Status:" + response.Status.State, null);
  155. //Log4NetHelper.WriteLog("Cmove:response.Status:" + response.Status.State);
  156. imageNo = imageNo + 1;
  157. this.label7.Text = "正在回调图像请等候...(" + imageNo.ToString() +")";
  158. if (response.Status.State == DicomState.Pending)
  159. {
  160. Console.WriteLine("Sending is in progress. please wait: " + response.Remaining.ToString());
  161. }
  162. else if (response.Status.State == DicomState.Success)
  163. {
  164. Console.WriteLine("Sending successfully finished");
  165. moveSuccessfully = true;
  166. }
  167. else if (response.Status.State == DicomState.Failure)
  168. {
  169. //Log4NetHelper.WriteLogDebug("response.Status.Description:" + response.Status.Description, null);
  170. //Log4NetHelper.WriteLog("response.Status.Description:" + response.Status.Description);
  171. Console.WriteLine("Error sending datasets: " + response.Status.Description);
  172. moveSuccessfully = false;
  173. panel1.Visible = false;
  174. MessageBox.Show("图像回调失败!");
  175. }
  176. Console.WriteLine(response.Status);
  177. };
  178. client.AddRequest(cMoveRequest);
  179. client.Send(QRServerHost, QRServerPort, false, AET, QRServerAET);
  180. if (moveSuccessfully.GetValueOrDefault(false))
  181. {
  182. Console.WriteLine("images sent successfully");
  183. //MessageBox.Show("图像回调成功!");
  184. panel1.Visible = false;
  185. this.Hide();
  186. // images sent successfully from QR Server to the store scp
  187. }
  188. }
  189. private void QRFrm_Resize(object sender, EventArgs e)
  190. {
  191. iniPanel();
  192. }
  193. }
  194. }