예제 #1
0
        /// <summary>
        /// Parses the request and modifies the base response with the results
        /// </summary>
        /// <param name="req"></param>
        /// <param name="resp"></param>
        private IEnumerable <AbstractDIMSEIOD> RetrieveResults(CFindRequest req)
        {
            var keys = req.Data.Elements.Where(e => e.DData != null).ToList();

            if (req.Data.GetSelector().QueryRetrieveLevel?.Data == "STUDY")
            {
                if (FindStudyService != null)
                {
                    foreach (var studyIod in FindStudyService.RetrieveMatches(keys))
                    {
                        yield return(studyIod);
                    }
                }
            }
            else if (req.Data.GetSelector().QueryRetrieveLevel?.Data == "SERIES")
            {
                if (FindSeriesService != null)
                {
                    foreach (var series in FindSeriesService.RetrieveMatches(keys))
                    {
                        yield return(series);
                    }
                }
            }
            else if (req.Data.GetSelector().QueryRetrieveLevel?.Data == "IMAGE")
            {
                if (FindImageService != null)
                {
                    foreach (var image in FindImageService.RetrieveMatches(keys))
                    {
                        yield return(image);
                    }
                }
            }
        }
예제 #2
0
        public IEnumerable <CFindResponse> GetResponse(CFindRequest cFind, Entity ae)
        {
            var client = new TcpClient();

            client.Connect(IPAddress.Parse(ae.IpAddress), ae.Port);
            var assoc = new Association(this, client)
            {
                AeTitle = ae.AeTitle
            };

            PDataMessenger.Send(cFind, assoc);
            List <CFindResponse> responses = new List <CFindResponse>();

            EvilDICOM.Network.Services.DIMSEService.DIMSEResponseHandler <CFindResponse> action = null;
            action = (resp, asc) =>
            {
                responses.Add(resp);
                if (resp.Status != (ushort)Status.PENDING)
                {
                    this.DIMSEService.CFindResponseReceived -= action;
                }
            };
            this.DIMSEService.CFindResponseReceived += action;
            assoc.Listen();
            return(responses);
        }
예제 #3
0
        public List <ImageResult> GetImageUids(List <SeriesResult> series)
        {
            List <ImageResult> results = new List <ImageResult>();

            foreach (var ser in series)
            {
                var query = new CFindIOD(QueryLevel.IMAGE)
                {
                    PatientId         = ser.PatientId,
                    StudyInstanceUID  = ser.StudyUid,
                    SeriesInstanceUID = ser.SeriesUid
                };

                var req        = new CFindRequest(query, Root.STUDY);
                var seriesUids = _scu.GetResponse(req, _scp)
                                 .Where(r => r.Status == (ushort)Status.PENDING)
                                 .Where(r => r.HasData)
                                 .Select(r =>
                                         new ImageResult()
                {
                    PatientId      = ser.PatientId,
                    StudyUid       = ser.StudyUid,
                    SeriesUid      = ser.SeriesUid,
                    Modality       = ser.Modality,
                    SopInstanceUid = r.Data.GetSelector().SOPInstanceUID.Data
                }
                                         )
                                 .ToList();
                results.AddRange(seriesUids);
            }
            return(results);
        }
예제 #4
0
        public static void WithSeries(this IEnumerable <CFindResponse> cFinds, DICOMSCU scu, Entity daemon)
        {
            var iods = cFinds.Where(r => r.Status == (ushort)Status.PENDING)
                       .Where(r => r.HasData)
                       .Where(r => r.Data.Elements.Any(e => e.Tag == TagHelper.STUDY_INSTANCE_UID))
                       .Where(r => !string.IsNullOrEmpty(r.Data.Elements.First(e => e.Tag == TagHelper.STUDY_INSTANCE_UID).DData as string))
                       .Select(r => r.GetIOD())
                       .ToList();

            iods.ForEach(i => i.QueryLevel = QueryLevel.SERIES);

            foreach (var iod in iods)
            {
                var req        = new CFindRequest(iod, Root.STUDY);
                var seriesUids = scu.GetResponse(req, daemon)
                                 .Where(r => r.Status == (ushort)Status.PENDING)
                                 .Where(r => r.HasData)
                                 .Where(r => r.Data.Elements.Any(e => e.Tag == TagHelper.SERIES_INSTANCE_UID))
                                 .Select(r => new
                {
                    // Study = study,
                    Series   = r.Data.GetSelector().SeriesInstanceUID.Data,
                    Modality = r.Data.GetSelector().Modality.Data
                })
                                 .ToList();
                System.Console.Write("");
            }
        }
예제 #5
0
        private IReadOnlyList <TInfo> PerformCFind <TIdentifier, TInfo>(DicomAssociation association, TIdentifier identifier)
            where TInfo : new()
        {
            var cFindRequest = new CFindRequest
            {
                AffectedSOPClassUID = DicomUID.SOPClass.PatientRootQueryRetrieveInformationModelFind,
                Priority            = RequestPriority.Medium
            };

            association.SendRequest(PresentationContextID, cFindRequest, identifier);

            var infoList = new List <TInfo>();

            void CFindResponseHandler(DicomAssociation association, byte presentationContextID,
                                      DicomUID transferSyntaxUID, ICommand command, out bool stop)
            {
                if (command.IsFollowedByDataSet())
                {
                    var info = association.ReceiveDataSet <TInfo>(command, presentationContextID);
                    infoList.Add(info);
                    stop = false;
                }
                else
                {
                    stop = true;
                }
            }

            association.ReceiveCommands(CFindResponseHandler);

            return(infoList);
        }
예제 #6
0
        public List <StudyResult> GetStudyUids(string patientId)
        {
            var query = new CFindIOD(QueryLevel.STUDY)
            {
                PatientId = patientId
            };
            var req       = new CFindRequest(query, Root.STUDY);
            var studyUids = _scu.GetResponse(req, _scp) // Studies
                            .Where(r => r.Status == (ushort)Status.PENDING)
                            .Where(r => r.HasData)
                            .ToList();

            return(studyUids.Select(r => new StudyResult()
            {
                PatientId = query.PatientId,
                StudyUid = r.Data.GetSelector().StudyInstanceUID.Data
            })
                   .ToList());
        }
예제 #7
0
        public void OnRequestRecieved(CFindRequest req, Association asc)
        {
            asc.Logger.LogInformation("<-- DIMSE" + req.GetLogString());
            req.LogData(asc);
            asc.LastActive = DateTime.Now;
            asc.IdleClock.Restart();
            asc.State = NetworkState.TRANSPORT_CONNECTION_OPEN;
            var resp = new CFindResponse(req, Status.SUCCESS);

            dms.RaiseDIMSERequestReceived(req, asc);
            var results = RetrieveResults(req);

            if (results != null)
            {
                foreach (var result in results)
                {
                    resp.Data        = new DICOMObject(result.Elements);
                    resp.Status      = (ushort)Status.PENDING;
                    resp.GroupLength = (uint)GroupWriter.WriteGroupBytes(new DICOMObject(resp.Elements.Skip(1).ToList()),
                                                                         new DICOMIOSettings(), "0000").Length;
                    PDataMessenger.Send(resp, asc,
                                        asc.PresentationContexts.First(p => p.Id == req.DataPresentationContextId));
                }
                //Finish
                resp.Status      = results.Any() ? (ushort)Status.SUCCESS : (ushort)Status.FAILURE_UNABLE_TO_FIND;
                resp.Data        = null;
                resp.GroupLength = (uint)GroupWriter.WriteGroupBytes(new DICOMObject(resp.Elements.Skip(1).ToList()),
                                                                     new DICOMIOSettings(), "0000").Length;
                PDataMessenger.Send(resp, asc);
            }
            else
            {
                resp.Status      = (ushort)Status.FAILURE;
                resp.Data        = null;
                resp.GroupLength = (uint)GroupWriter.WriteGroupBytes(new DICOMObject(resp.Elements.Skip(1).ToList()),
                                                                     new DICOMIOSettings(), "0000").Length;
                PDataMessenger.Send(resp, asc);
            }
        }