public void OnReceiveRequestMessage(DicomServer server, ServerAssociationParameters association, byte presentationID, ClearCanvas.Dicom.DicomMessage message) { foreach (byte pcid in association.GetPresentationContextIDs()) { DicomPresContext context = association.GetPresentationContext(pcid); if (context.Result == DicomPresContextResult.Accept) { if (context.AbstractSyntax == SopClass.StudyRootQueryRetrieveInformationModelFind) { DicomMessage response = new DicomMessage(); response.DataSet[DicomTags.StudyInstanceUid].SetStringValue("1.2.3"); response.DataSet[DicomTags.PatientId].SetStringValue("1"); response.DataSet[DicomTags.PatientsName].SetStringValue("test"); response.DataSet[DicomTags.StudyId].SetStringValue("1"); response.DataSet[DicomTags.StudyDescription].SetStringValue("dummy"); server.SendCFindResponse(presentationID, message.MessageId, response, DicomStatuses.Pending); DicomMessage finalResponse = new DicomMessage(); server.SendCFindResponse(presentationID, message.MessageId, finalResponse, DicomStatuses.Success); } else if (context.AbstractSyntax == SopClass.VerificationSopClass) { server.SendCEchoResponse(presentationID, message.MessageId, DicomStatuses.Success); } } } }
//private static void WriteLog(string s) //{ // File.AppendAllText("C:\\_store.txt", string.Format("{0}\n",s)); //} /// <summary> /// Hàm xử lý khi nhận xong dữ liệu Dicom /// </summary> /// <param name="server"></param> /// <param name="association"></param> /// <param name="presentationId"></param> /// <param name="message"></param> void IDicomServerHandler.OnReceiveRequestMessage(DicomServer server, ServerAssociationParameters association, byte presentationId, DicomMessage message) { //wc.Stop(); //WriteLog(wc.ElapsedMilliseconds.ToString()); if (message.CommandField == DicomCommandField.CEchoRequest) { server.SendCEchoResponse(presentationId, message.MessageId, DicomStatuses.Success); return; } String studyInstanceUid = null; String seriesInstanceUid = null; DicomUid sopInstanceUid; //String patientName = null; String sex = null; sex = message.DataSet[DicomTags.PatientsSex].GetString(0, "O"); bool ok = message.DataSet[DicomTags.SopInstanceUid].TryGetUid(0, out sopInstanceUid); if (ok) ok = message.DataSet[DicomTags.SeriesInstanceUid].TryGetString(0, out seriesInstanceUid); if (ok) ok = message.DataSet[DicomTags.StudyInstanceUid].TryGetString(0, out studyInstanceUid); //if (ok) ok = message.DataSet[DicomTags.PatientsName].TryGetString(0, out patientName); if (!ok) { VBLogger.LogError("Unable to retrieve UIDs from request message, sending failure status."); server.SendCStoreResponse(presentationId, message.MessageId, sopInstanceUid.UID, DicomStatuses.ProcessingFailure); return; } TransferSyntax syntax = association.GetPresentationContext(presentationId).AcceptedTransferSyntax; server.SendCStoreResponse(presentationId, message.MessageId, sopInstanceUid.UID, DicomStatuses.Success); string pathImage = ""; var path = new StringBuilder(); path.AppendFormat("{0}{1}{2}{3}{4}", StorageLocation, Path.DirectorySeparatorChar, studyInstanceUid, Path.DirectorySeparatorChar, seriesInstanceUid); try { // Save File if (!Directory.Exists(StorageLocation)) Directory.CreateDirectory(StorageLocation); if (!Directory.Exists(path.ToString())) Directory.CreateDirectory(path.ToString()); path.AppendFormat("{0}{1}.dcm", Path.DirectorySeparatorChar, sopInstanceUid.UID); var dicomFile = new DicomFile(message, path.ToString()) { TransferSyntaxUid = syntax.UidString, MediaStorageSopInstanceUid = sopInstanceUid.UID, ImplementationClassUid = DicomImplementation.ClassUID.UID, ImplementationVersionName = DicomImplementation.Version, SourceApplicationEntityTitle = association.CallingAE, MediaStorageSopClassUid = message.SopClass.Uid }; dicomFile.Save(DicomWriteOptions.None); //WriteLog(string.Format("Save File OK!: {0}", wc.ElapsedMilliseconds)); var pd = new DicomUncompressedPixelData(message.DataSet); pathImage = path.ToString(); byte[] thePixels = pd.GetFrame(0); var pixData = new UInt16[thePixels.Length/2]; int h = dicomFile.DataSet[DicomTags.Rows].GetUInt16(0, 0); int w = dicomFile.DataSet[DicomTags.Columns].GetUInt16(0, 0); UInt16 max = 0, min = UInt16.MaxValue; //min = pd.ge unsafe { fixed (byte* pixPointer = thePixels) { var pP = (UInt16*) pixPointer; for (int i = 0; i < w*h; ++i) { pixData[i] = *pP; if (min > pixData[i]) min = pixData[i]; if (max < pixData[i]) max = pixData[i]; pP++; } } } int indexOf = pathImage.LastIndexOf(".dcm"); pathImage = pathImage.Substring(0, indexOf); pathImage = string.Concat(pathImage, "_thumb.jpg"); string photometricInterpretation; message.DataSet[DicomTags.PhotometricInterpretation].TryGetString(0, out photometricInterpretation); Bitmap bmp = CreateBitmap(pixData, min, max, w, h, photometricInterpretation); bmp.Save(pathImage, ImageFormat.Jpeg); bmp.Dispose(); } catch (Exception ex) { // File.WriteAllText(@"C:\log.txt", ex.ToString()); } //WriteLog(string.Format(" Create Thumbnail OK: {0}", wc.ElapsedMilliseconds)); String patientName = message.DataSet[DicomTags.PatientsName].GetString(0, ""); //Xóa các ký tự thừa trong Patient Name patientName = patientName.Replace('^', ' '); VBLogger.LogInfo("Received SOP Instance: {0} for patient {1}", sopInstanceUid, patientName); //Insert Install To DB //InsertInstanceToImageServer(association, message.DataSet); // FeedBack to Rislink string patientId = message.DataSet[DicomTags.PatientId].GetString(0, ""); string bodyPart = message.DataSet[DicomTags.BodyPartExamined].GetString(0, ""); string viewPosition = message.DataSet[DicomTags.ViewPosition].GetString(0, ""); string accessionNumber = message.DataSet[DicomTags.AccessionNumber].GetString(0, "").Trim(); accessionNumber = accessionNumber == "" ? patientId : accessionNumber; //var t = message.DataSet[DicomTags.SourceSerialNumber].GetString(0, "").Trim(); string requestingAe = association.CallingAE; if (viewPosition.Trim() == "") viewPosition = message.DataSet[DicomTags.PatientOrientation].GetString(0, ""); //WriteLog(string.Format("Finish time: {0}",wc.ElapsedMilliseconds)); var updateOk = SpMergeData(bodyPart, patientId, patientName, path.ToString(), sex, studyInstanceUid, seriesInstanceUid, sopInstanceUid.ToString(), viewPosition, accessionNumber, requestingAe); Console.WriteLine(updateOk.ToString(CultureInfo.InvariantCulture)); }
void IDicomServerHandler.OnReceiveRequestMessage(DicomServer server, ServerAssociationParameters association, byte presentationID, DicomMessage message) { if (message.CommandField == DicomCommandField.CEchoRequest) { server.SendCEchoResponse(presentationID, message.MessageId, DicomStatuses.Success); return; } String studyInstanceUid = null; String seriesInstanceUid = null; DicomUid sopInstanceUid; String patientName = null; bool ok = message.DataSet[DicomTags.SopInstanceUid].TryGetUid(0, out sopInstanceUid); if (ok) ok = message.DataSet[DicomTags.SeriesInstanceUid].TryGetString(0, out seriesInstanceUid); if (ok) ok = message.DataSet[DicomTags.StudyInstanceUid].TryGetString(0, out studyInstanceUid); if (ok) ok = message.DataSet[DicomTags.PatientsName].TryGetString(0, out patientName); if (!ok) { Platform.Log(LogLevel.Error, "Unable to retrieve UIDs from request message, sending failure status."); server.SendCStoreResponse(presentationID, message.MessageId, sopInstanceUid.UID, DicomStatuses.ProcessingFailure); return; } TransferSyntax syntax = association.GetPresentationContext(presentationID).AcceptedTransferSyntax; if (List) { Platform.Log(LogLevel.Info, message.Dump()); } if (Bitbucket) { Platform.Log(LogLevel.Info, "Received SOP Instance: {0} for patient {1} in syntax {2}", sopInstanceUid, patientName, syntax.Name); server.SendCStoreResponse(presentationID, message.MessageId, sopInstanceUid.UID, DicomStatuses.Success); return; } if (!Directory.Exists(StorageLocation)) Directory.CreateDirectory(StorageLocation); var path = new StringBuilder(); path.AppendFormat("{0}{1}{2}{3}{4}", StorageLocation, Path.DirectorySeparatorChar, studyInstanceUid, Path.DirectorySeparatorChar,seriesInstanceUid); Directory.CreateDirectory(path.ToString()); path.AppendFormat("{0}{1}.dcm", Path.DirectorySeparatorChar, sopInstanceUid.UID); var dicomFile = new DicomFile(message, path.ToString()) { TransferSyntaxUid = syntax.UidString, MediaStorageSopInstanceUid = sopInstanceUid.UID, ImplementationClassUid = DicomImplementation.ClassUID.UID, ImplementationVersionName = DicomImplementation.Version, SourceApplicationEntityTitle = association.CallingAE, MediaStorageSopClassUid = message.SopClass.Uid }; dicomFile.Save(DicomWriteOptions.None); Platform.Log(LogLevel.Info, "Received SOP Instance: {0} for patient {1} in syntax {2}", sopInstanceUid, patientName, syntax.Name); server.SendCStoreResponse(presentationID, message.MessageId, sopInstanceUid.UID, DicomStatuses.Success); }