private DicomNSetResponse SetImageBox(DicomNSetRequest request) { if (_filmSession == null) { this.Logger.Error("A basic film session does not exist for this association {0}", CallingAE); return(new DicomNSetResponse(request, DicomStatus.NoSuchObjectInstance)); } this.Logger.Info("Set image box {0}", request.SOPInstanceUID.UID); var imageBox = _filmSession.FindImageBox(request.SOPInstanceUID); if (imageBox == null) { this.Logger.Error( "Received N-SET request for invalid image box instance {0} for this association {1}", request.SOPInstanceUID.UID, CallingAE); return(new DicomNSetResponse(request, DicomStatus.NoSuchObjectInstance)); } request.Dataset.CopyTo(imageBox); return(new DicomNSetResponse(request, DicomStatus.Success)); }
private DicomNSetResponse SetFilmBox(DicomNSetRequest request) { if (_filmSession == null) { this.Logger.Error("A basic film session does not exist for this association {0}", CallingAE); return(new DicomNSetResponse(request, DicomStatus.NoSuchObjectInstance)); } this.Logger.Info("Set film box {0}", request.SOPInstanceUID.UID); var filmBox = _filmSession.FindFilmBox(request.SOPInstanceUID); if (filmBox == null) { this.Logger.Error( "Received N-SET request for invalid film box {0} from {1}", request.SOPInstanceUID.UID, CallingAE); return(new DicomNSetResponse(request, DicomStatus.NoSuchObjectInstance)); } request.Dataset.CopyTo(filmBox); filmBox.Initialize(); var response = new DicomNSetResponse(request, DicomStatus.Success); response.Command.Add(DicomTag.AffectedSOPInstanceUID, filmBox.SOPInstanceUID); response.Command.Add(DicomTag.CommandDataSetType, (ushort)0x0202); response.Dataset = filmBox; return(response); }
public async Task OnNSetRequestAsync_ShouldRespond() { var port = Ports.GetNext(); using (DicomServerFactory.Create <AsyncDicomNServiceProvider>(port, logger: _logger.IncludePrefix("DicomServer"))) { var client = DicomClientFactory.Create("127.0.0.1", port, false, "SCU", "ANY-SCP"); client.Logger = _logger.IncludePrefix(typeof(DicomClient).Name); DicomNSetResponse response = null; DicomRequest.OnTimeoutEventArgs timeout = null; var request = new DicomNSetRequest( DicomUID.BasicFilmSession, new DicomUID("1.2.3", null, DicomUidType.SOPInstance)) { OnResponseReceived = (req, res) => response = res, OnTimeout = (sender, args) => timeout = args }; await client.AddRequestAsync(request).ConfigureAwait(false); await client.SendAsync().ConfigureAwait(false); Assert.NotNull(response); Assert.Equal(DicomStatus.Success, response.Status); Assert.Null(timeout); } }
public DicomNSetResponse OnNSetRequest(DicomNSetRequest request) { UpdateMppsStatusInLocalCollections(request); var resp = new DicomNSetResponse(request, DicomStatus.Success); return(resp); }
public void Print() { var dicomClient = new DicomClient(); dicomClient.NegotiateAsyncOps(); dicomClient.AddRequest( new DicomNCreateRequest(FilmSession.SOPClassUID, FilmSession.SOPInstanceUID) { Dataset = FilmSession }); foreach (var filmbox in FilmSession.BasicFilmBoxes) { var imageBoxRequests = new List <DicomNSetRequest>(); var filmBoxRequest = new DicomNCreateRequest(FilmBox.SOPClassUID, filmbox.SOPInstanceUID) { Dataset = filmbox }; filmBoxRequest.OnResponseReceived = (request, response) => { if (response.HasDataset) { var seq = response.Dataset.Get <DicomSequence>(DicomTag.ReferencedImageBoxSequence); for (int i = 0; i < seq.Items.Count; i++) { var req = imageBoxRequests[i]; var imageBox = req.Dataset; var sopInstanceUid = seq.Items[i].Get <string>(DicomTag.ReferencedSOPInstanceUID); imageBox.Add(DicomTag.SOPInstanceUID, sopInstanceUid); req.Command.Add(DicomTag.RequestedSOPInstanceUID, sopInstanceUid); } } }; dicomClient.AddRequest(filmBoxRequest); foreach (var image in filmbox.BasicImageBoxes) { var req = new DicomNSetRequest(image.SOPClassUID, image.SOPInstanceUID) { Dataset = image }; imageBoxRequests.Add(req); dicomClient.AddRequest(req); } } dicomClient.AddRequest(new DicomNActionRequest(FilmSession.SOPClassUID, FilmSession.SOPInstanceUID, 0x0001)); dicomClient.Send(RemoteAddress, RemotePort, false, CallingAE, CalledAE); }
public DicomNSetResponse OnNSetRequest(DicomNSetRequest request) { if (request.SOPClassUID != DicomUID.ModalityPerformedProcedureStepSOPClass) { return(new DicomNSetResponse(request, DicomStatus.SOPClassNotSupported)); } // on N-Create the UID is stored in AffectedSopInstanceUID, in N-Set the UID is stored in RequestedSopInstanceUID var requestedSopInstanceUID = request.Command.GetSingleValue <string>(DicomTag.RequestedSOPInstanceUID); Logger.Log(LogLevel.Info, $"receiving N-Set with SOPUID {requestedSopInstanceUID}"); Log.Loger($"receiving N-Set with SOPUID {requestedSopInstanceUID}"); var status = request.Dataset.GetSingleValue <string>(DicomTag.PerformedProcedureStepStatus); if (status == "COMPLETED") { // most vendors send some informations with the mpps-completed message. // this information should be stored into the datbase var doseDescription = request.Dataset.GetSingleValueOrDefault(DicomTag.CommentsOnRadiationDose, string.Empty); var listOfInstanceUIDs = new List <string>(); foreach (var seriesDataset in request.Dataset.GetSequence(DicomTag.PerformedSeriesSequence)) { // you can read here some information about the series that the modalidy created //seriesDataset.Get(DicomTag.SeriesDescription, string.Empty); //seriesDataset.Get(DicomTag.PerformingPhysicianName, string.Empty); //seriesDataset.Get(DicomTag.ProtocolName, string.Empty); foreach (var instanceDataset in seriesDataset.GetSequence(DicomTag.ReferencedImageSequence)) { // here you can read the SOPClassUID and SOPInstanceUID var instanceUID = instanceDataset.GetSingleValueOrDefault(DicomTag.ReferencedSOPInstanceUID, string.Empty); if (!string.IsNullOrEmpty(instanceUID)) { listOfInstanceUIDs.Add(instanceUID); } } } var ok = MppsSource.SetCompleted(requestedSopInstanceUID, doseDescription, listOfInstanceUIDs); return(new DicomNSetResponse(request, ok ? DicomStatus.Success : DicomStatus.ProcessingFailure)); } else if (status == "DISCONTINUED") { // some vendors send a reason code or description with the mpps-discontinued message // var reason = request.Dataset.Get(DicomTag.PerformedProcedureStepDiscontinuationReasonCodeSequence); var ok = MppsSource.SetDiscontinued(requestedSopInstanceUID, string.Empty); return(new DicomNSetResponse(request, ok ? DicomStatus.Success : DicomStatus.ProcessingFailure)); } else { return(new DicomNSetResponse(request, DicomStatus.InvalidAttributeValue)); } }
private DicomNSetResponse SetFilmSession(DicomNSetRequest request) { if (_filmSession == null || _filmSession.SOPInstanceUID.UID != request.SOPInstanceUID.UID) { this.Logger.Error("A basic film session does not exist for this association {0}", CallingAE); return(new DicomNSetResponse(request, DicomStatus.NoSuchObjectInstance)); } this.Logger.Info("Set film session {0}", request.SOPInstanceUID.UID); request.Dataset.CopyTo(_filmSession); return(new DicomNSetResponse(request, DicomStatus.Success)); }
public DicomNSetResponse OnNSetRequest(DicomNSetRequest request) { lock (_synchRoot) { if (request.SOPClassUID == DicomUID.BasicFilmSessionSOPClass) { return(SetFilmSession(request)); } if (request.SOPClassUID == DicomUID.BasicFilmBoxSOPClass) { return(SetFilmBox(request)); } if (request.SOPClassUID == DicomUID.BasicColorImageBoxSOPClass || request.SOPClassUID == DicomUID.BasicGrayscaleImageBoxSOPClass) { return(SetImageBox(request)); } return(new DicomNSetResponse(request, DicomStatus.SOPClassNotSupported)); } }
public Task <DicomNSetResponse> OnNSetRequestAsync(DicomNSetRequest request) { lock (_synchRoot) { if (request.SOPClassUID == DicomUID.BasicFilmSession) { return(Task.FromResult(SetFilmSession(request))); } else if (request.SOPClassUID == DicomUID.BasicFilmBox) { return(Task.FromResult(SetFilmBox(request))); } else if (request.SOPClassUID == DicomUID.BasicColorImageBox || request.SOPClassUID == DicomUID.BasicGrayscaleImageBox) { return(Task.FromResult(SetImageBox(request))); } else { return(Task.FromResult(new DicomNSetResponse(request, DicomStatus.SOPClassNotSupported))); } } }
public static string SendPrintTask(string callingAE, string calledAE, string calledIP, int calledPort, string taskPath) { PrintTaskInfo task = new PrintTaskInfo() { CallingAETitle = callingAE, TaskPath = taskPath }; string strErr = string.Empty; LogManager.Instance.Log("Start to send print task: " + taskPath); try { DirectoryInfo dirTask = new DirectoryInfo(taskPath); if (!dirTask.Exists) { throw new Exception("invalid task path"); } string filmSessionFile = Path.Combine(taskPath, "FilmSession.dcm"); if (!File.Exists(filmSessionFile)) { throw new Exception("can't find film session file"); } //load filmSession from dcmFile FilmSession filmSession = FilmSession.Load(filmSessionFile); //load filmBox from dcmFiles var subDirs = dirTask.EnumerateDirectories(); foreach (DirectoryInfo dirFilmBox in subDirs) { FilmBox filmBox = FilmBox.Load(filmSession, dirFilmBox.FullName); filmSession.BasicFilmBoxes.Add(filmBox); } var dicomClient = new DicomClient(); var filmSessionRequest = new DicomNCreateRequest(filmSession.SOPClassUID, filmSession.SOPInstanceUID); filmSessionRequest.Dataset = filmSession; dicomClient.AddRequest(filmSessionRequest); foreach (var filmbox in filmSession.BasicFilmBoxes) { var imageBoxRequests = new List <DicomNSetRequest>(); var filmBoxRequest = new DicomNCreateRequest(FilmBox.SOPClassUID, filmbox.SOPInstanceUID); filmBoxRequest.Dataset = filmbox; filmBoxRequest.OnResponseReceived = (request, response) => { if (response.HasDataset) { var seq = response.Dataset.Get <DicomSequence>(DicomTag.ReferencedImageBoxSequence); for (int i = 0; i < seq.Items.Count; i++) { var req = imageBoxRequests[i]; var imageBox = req.Dataset; var sopInstanceUid = seq.Items[i].Get <string>(DicomTag.ReferencedSOPInstanceUID); imageBox.AddOrUpdate(DicomTag.SOPInstanceUID, sopInstanceUid); req.Command.AddOrUpdate(DicomTag.RequestedSOPInstanceUID, sopInstanceUid); } } }; dicomClient.AddRequest(filmBoxRequest); foreach (var image in filmbox.BasicImageBoxes) { var req = new DicomNSetRequest(image.SOPClassUID, image.SOPInstanceUID) { Dataset = image }; imageBoxRequests.Add(req); dicomClient.AddRequest(req); } } dicomClient.AddRequest(new DicomNActionRequest(filmSession.SOPClassUID, filmSession.SOPInstanceUID, 0x0001)); dicomClient.Send(calledIP, calledPort, false, callingAE, calledAE); task.HasError = false; if (PrintTaskEvent != null) { PrintTaskEvent(task); } } catch (Exception e) { strErr = e.Message; LogManager.Instance.Log("Send task failed due to " + e.Message); task.HasError = true; task.ErrorMessage = e.Message; if (PrintTaskEvent != null) { PrintTaskEvent(task); } } return(strErr); }
public Task <DicomNSetResponse> OnNSetRequestAsync(DicomNSetRequest request) => throw new NotImplementedException();
/// <summary> /// Initializes an instance of the <see cref="DicomNSetResponse"/> class. /// </summary> /// <param name="request">Associated N-SET request.</param> /// <param name="status">Response status.</param> public DicomNSetResponse(DicomNSetRequest request, DicomStatus status) : base(request, status) { SOPInstanceUID = request.SOPInstanceUID; }
public async Task <bool> SendMppsCompletedAsync(string serverIp, int serverPort, string serverAET, string localAET, string studyInstanceUid, DicomUID affectedInstanceUid, DicomDataset worklistItem) { DicomSequence procedureStepSq = worklistItem.GetSequence(DicomTag.ScheduledProcedureStepSequence); // A worklistitem may have a list of scheduledprocedureSteps. // For each of them you have to send separate MPPS InProgress- and Completed-messages. // there in this example we will only send for the first procedure step DicomDataset procedureStep = procedureStepSq.First(); // data DicomDataset dataset = new DicomDataset { { DicomTag.StudyInstanceUID, studyInstanceUid }, { DicomTag.PerformedProcedureStepEndDate, DateTime.Now }, { DicomTag.PerformedProcedureStepEndTime, DateTime.Now }, { DicomTag.PerformedProcedureStepStatus, COMPLETED }, { DicomTag.PerformedProcedureStepDescription, procedureStep.GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepID, string.Empty) }, { DicomTag.PerformedProcedureTypeDescription, string.Empty }, { DicomTag.PerformedProtocolCodeSequence, new DicomDataset() }, { DicomTag.ProcedureCodeSequence, new DicomDataset() }, // dose and reports { DicomTag.ImageAndFluoroscopyAreaDoseProduct, 0.0m }, // if there has bee sone dose while examination { DicomTag.CommentsOnRadiationDose, string.Empty }, // a free text that contains all dose parameters { DicomTag.PerformedSeriesSequence, new DicomDataset() { { DicomTag.RetrieveAETitle, string.Empty }, // the aetitle of the archive where the images have been sent to { DicomTag.SeriesDescription, "series 1" }, { DicomTag.PerformingPhysicianName, string.Empty }, { DicomTag.OperatorsName, string.Empty }, { DicomTag.ProtocolName, "protocol 1" }, { DicomTag.SeriesInstanceUID, DicomUID.Generate() }, { DicomTag.ReferencedImageSequence, new DicomDataset() { { DicomTag.ReferencedSOPClassUID, DicomUID.SecondaryCaptureImageStorage }, { DicomTag.ReferencedSOPInstanceUID, DicomUID.Generate() } } }, } } }; //// images created //DicomSequence performedSeriesSq = new DicomSequence(DicomTag.PerformedSeriesSequence); //// iterate all Series that have been created while examination //DicomDataset serie = new DicomDataset() //{ // { DicomTag.RetrieveAETitle, string.Empty }, // the aetitle of the archive where the images have been sent to // { DicomTag.SeriesDescription, "serie 1" }, // { DicomTag.PerformingPhysicianName, string.Empty }, // { DicomTag.OperatorsName, string.Empty }, // { DicomTag.ProtocolName, string.Empty }, // { DicomTag.SeriesInstanceUID, DicomUID.Generate() } //}; //DicomSequence refImagesInSerie = new DicomSequence(DicomTag.ReferencedImageSequence); //// iterate all images in the serie //DicomDataset image = new DicomDataset() //{ // { DicomTag.ReferencedSOPClassUID, DicomUID.SecondaryCaptureImageStorage }, // { DicomTag.ReferencedSOPInstanceUID, DicomUID.Generate() } //}; //refImagesInSerie.Items.Add(image); //serie.Add(refImagesInSerie); //performedSeriesSq.Items.Add(serie); //dataset.Add(performedSeriesSq); bool result = false; DicomNSetRequest dicomFinished = new DicomNSetRequest(DicomUID.ModalityPerformedProcedureStepSOPClass, affectedInstanceUid) { Dataset = dataset, OnResponseReceived = (req, res) => { if (res != null) { if (res.Status == DicomStatus.Success) { result = true; Logger.Debug("Set study [{0}] [Complete] Success.", studyInstanceUid); } else { Logger.Warn("Set study [{0}] [Complete] Failed. [{1}]", studyInstanceUid, res.Status); } } } }; DicomClient client = new DicomClient(serverIp, serverPort, false, localAET, serverAET); await client.AddRequestAsync(dicomFinished); await client.SendAsync(); return(result); }
private static (string responseStatus, string responseMessage) SendMppsCompleted(string serverIP, int serverPort, string serverAET, string clientAET, DicomUID affectedInstanceUid, DicomDataset worklistItem) { var client = new DicomClient(); var dataset = new DicomDataset(); DicomSequence procedureStepSq = worklistItem.GetSequence(DicomTag.ScheduledProcedureStepSequence); // A worklistitem may have a list of scheduledprocedureSteps. // For each of them you have to send separate MPPS InProgress- and Completed-messages. // there in this example we will only send for the first procedure step var procedureStep = procedureStepSq.First(); // data dataset.Add(DicomTag.PerformedProcedureStepEndDate, DateTime.Now); dataset.Add(DicomTag.PerformedProcedureStepEndTime, DateTime.Now); dataset.Add(DicomTag.PerformedProcedureStepStatus, "COMPLETED"); dataset.Add(DicomTag.PerformedProcedureStepDescription, procedureStep.GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepID, String.Empty)); dataset.Add(DicomTag.PerformedProcedureTypeDescription, string.Empty); dataset.Add(DicomTag.PerformedProtocolCodeSequence, new DicomDataset()); // dose and reports dataset.Add(DicomTag.ImageAndFluoroscopyAreaDoseProduct, 0.0m); // if there has bee sone dose while examination dataset.Add(DicomTag.CommentsOnRadiationDose, string.Empty); // a free text that contains all dose parameters // images created var performedSeriesSq = new DicomSequence(DicomTag.PerformedSeriesSequence); // iterate all Series that have been created while examination var serie = new DicomDataset { { DicomTag.RetrieveAETitle, string.Empty }, // the aetitle of the archive where the images have been sent to { DicomTag.SeriesDescription, "serie 1" }, { DicomTag.PerformingPhysicianName, string.Empty }, { DicomTag.OperatorsName, string.Empty }, { DicomTag.ProtocolName, string.Empty }, { DicomTag.SeriesInstanceUID, DicomUID.Generate() } }; var refImagesInSerie = new DicomSequence(DicomTag.ReferencedImageSequence); // iterate all images in the serie var image = new DicomDataset { { DicomTag.ReferencedSOPClassUID, DicomUID.SecondaryCaptureImageStorage }, { DicomTag.ReferencedSOPInstanceUID, DicomUID.Generate() } }; refImagesInSerie.Items.Add(image); serie.Add(refImagesInSerie); performedSeriesSq.Items.Add(serie); dataset.Add(performedSeriesSq); var dicomFinished = new DicomNSetRequest(DicomUID.ModalityPerformedProcedureStepSOPClass, affectedInstanceUid) { Dataset = dataset }; string responseStatus = string.Empty; string responseMessage = string.Empty; dicomFinished.OnResponseReceived += (req, response) => { if (response != null) { Console.WriteLine(response); responseStatus = response.Status.ToString(); responseMessage = response.ToString(); } }; client.AddRequest(dicomFinished); client.SendAsync(serverIP, serverPort, false, clientAET, serverAET).Wait(); return(responseStatus, responseMessage); }
public DicomNSetResponse OnNSetRequest(DicomNSetRequest request) { throw new NotImplementedException(); }
public async Task <bool> SendMppsDiscontinuedAsync(string serverIp, int serverPort, string serverAET, string localAET, string studyInstanceUid, DicomUID affectedInstanceUid, DicomDataset worklistItem) { DicomSequence procedureStepSq = worklistItem.GetSequence(DicomTag.ScheduledProcedureStepSequence); // A worklistitem may have a list of scheduledprocedureSteps. // For each of them you have to send separate MPPS InProgress- and Completed-messages. // there in this example we will only send for the first procedure step DicomDataset procedureStep = procedureStepSq.First(); DicomDataset dataset = new DicomDataset() { { DicomTag.StudyInstanceUID, studyInstanceUid }, { DicomTag.PerformedProcedureStepEndDate, DateTime.Now }, { DicomTag.PerformedProcedureStepEndTime, DateTime.Now }, { DicomTag.PerformedProcedureStepStatus, DISCONTINUED }, { DicomTag.PerformedProcedureStepDescription, procedureStep.GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepID, string.Empty) }, { DicomTag.PerformedProcedureTypeDescription, string.Empty }, { DicomTag.PerformedProtocolCodeSequence, new DicomDataset() }, { DicomTag.ProcedureCodeSequence, new DicomDataset() }, { DicomTag.PerformedSeriesSequence, new DicomDataset() { { DicomTag.RetrieveAETitle, string.Empty }, // the aetitle of the archive where the images have been sent to { DicomTag.SeriesDescription, "series 1" }, { DicomTag.PerformingPhysicianName, string.Empty }, { DicomTag.OperatorsName, string.Empty }, { DicomTag.ProtocolName, "protocol 1" }, { DicomTag.SeriesInstanceUID, DicomUID.Generate() }, { DicomTag.ReferencedImageSequence, new DicomDataset() { { DicomTag.ReferencedSOPClassUID, DicomUID.SecondaryCaptureImageStorage }, { DicomTag.ReferencedSOPInstanceUID, DicomUID.Generate() } } }, } } }; bool result = false; DicomNSetRequest dicomAbort = new DicomNSetRequest(DicomUID.ModalityPerformedProcedureStepSOPClass, affectedInstanceUid) { Dataset = dataset, OnResponseReceived = (req, res) => { if (res != null) { if (res.Status == DicomStatus.Success) { result = true; Logger.Debug("Set study [{0}] [Discontinued] Success.", studyInstanceUid); } else { Logger.Warn("Set study [{0}] [Discontinued] Failed. [{1}]", studyInstanceUid, res.Status); } } } }; DicomClient client = new DicomClient(serverIp, serverPort, false, localAET, serverAET); await client.AddRequestAsync(dicomAbort); await client.SendAsync(); return(result); }
public DicomNSetResponse(DicomNSetRequest request, DicomStatus status) : base(request, status) { SOPInstanceUID = request.SOPInstanceUID; }
public Task <DicomNSetResponse> OnNSetRequestAsync(DicomNSetRequest request) => Task.FromResult(new DicomNSetResponse(request, DicomStatus.Success) { Dataset = request.Dataset });