/// <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); } } } }
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); }
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); }
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(""); } }
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); }
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()); }
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); } }