Esempio n. 1
0
        public async Task OnCFindRequestAsync_ImmediateSuccess_ShouldRespond()
        {
            var port = Ports.GetNext();

            using (DicomServerFactory.Create <ImmediateSuccessAsyncDicomCFindProvider>(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);

                DicomCFindResponse response             = null;
                DicomRequest.OnTimeoutEventArgs timeout = null;
                var request = new DicomCFindRequest(DicomQueryRetrieveLevel.Study)
                {
                    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);
            }
        }
Esempio n. 2
0
        public async Task <List <DicomDataset> > QuerySeriesByStudyAsync(string serverIp, int serverPort, string serverAET, string localAET, string studyInstanceUid, string modality = null)
        {
            List <DicomDataset> seriesUids = new List <DicomDataset>();

            DicomCFindRequest request = RequestFactory.CreateSeriesQuery(studyInstanceUid, modality);

            request.OnResponseReceived += (req, res) =>
            {
                if (res.Status == DicomStatus.Success ||
                    res.Status == DicomStatus.Pending)
                {
                    if (res.HasDataset)
                    {
                        seriesUids.Add(res.Dataset);
                    }
                    else
                    {
                        logger.Error("Query series response has no dataset.");
                    }
                }
                else
                {
                    logger.Error("Query Series failure. Status - [{0}]", res.Status);
                }
            };

            DicomClient client = new DicomClient(serverIp, serverPort, false, localAET, serverAET);
            await client.AddRequestAsync(request);

            await client.SendAsync();

            return(seriesUids);
        }
Esempio n. 3
0
        public static List <DicomDataset> GetCachedWorklist()
        {
            //记录查询时间
            System.Diagnostics.Stopwatch stopWatch1 = new System.Diagnostics.Stopwatch();
            stopWatch1.Start();
            DateTime dtRequestBeg = DateTime.Now;

            Logger.Info($">>GetCachedWorklist CreateWorklistQuery BeginTime: {dtRequestBeg.ToString("yyyy-MM-dd HH:mm:ss")}");
            Log.Loger($">>GetCachedWorklist CreateWorklistQuery BeginTime: {dtRequestBeg.ToString("yyyy-MM-dd HH:mm:ss")}");

            DateTime       endDate   = System.DateTime.Today.AddDays(1).AddSeconds(-1);
            DateTime       startDate = endDate.AddDays(_cacheDays * -1);
            DicomDateRange dr        = new DicomDateRange(startDate, endDate);
            var            cfind     = DicomCFindRequest.CreateWorklistQuery(null, null, null, null, null, dr);

            //记录查询时间
            DateTime dtRequestEnd = DateTime.Now;

            Logger.Info($">>CreateWorklistQuery EndTime: {dtRequestEnd.ToString("yyyy-MM-dd HH:mm:ss")}");
            Log.Loger($">>CreateWorklistQuery EndTime: {dtRequestEnd.ToString("yyyy-MM-dd HH:mm:ss")}");
            stopWatch1.Stop();
            Logger.Info($">>CreateWorklistQuery SpentTime: {stopWatch1.Elapsed.TotalSeconds}");
            Log.Loger($">>CreateWorklistQuery SpentTime: {stopWatch1.Elapsed.TotalSeconds}");
            Log.Loger($"\r\n");

            return(GetWorkList(cfind));
        }
Esempio n. 4
0
        public virtual IEnumerable <DicomCFindResponse> OnCFindRequest(DicomCFindRequest request)
        {
            DicomStatus               status = DicomStatus.Success;
            IList <DicomDataset>      queries;
            List <DicomCFindResponse> responses = new List <DicomCFindResponse>();

            if (OnZSCFindRequest != null)
            {
                //此处通过代理来返回在服务端本机进行的操作结果,也就是DICOM协议中说的匹配查询结果
                queries = OnZSCFindRequest(request);
                if (queries != null)
                {
                    Logger.Info("查询到{0}个数据", queries.Count);

                    foreach (var item in queries)
                    {
                        //对于每一个查询匹配的结果,都需要有一个单独的C-FIND-RSP消息来返回到请求端
                        //【注】:每次发送的状态都必须是Pending,表明后续还会继续发送查询结果
                        DicomCFindResponse rsp = new DicomCFindResponse(request, DicomStatus.Pending);
                        rsp.Dataset = item;
                        responses.Add(rsp);
                    }
                }
                else
                {
                    status = DicomStatus.QueryRetrieveOutOfResources;
                }
            }
            //随后需要发送查询结束的状态,即Success到C-FIND SCU端
            responses.Add(new DicomCFindResponse(request, DicomStatus.Success));

            //这里貌似是一起将多个response发送出去的?需要后续在研究一下DicomService中的实现代码
            //搞清楚具体的发送机制
            return(responses);
        }
Esempio n. 5
0
        public void Constructor_CreatesStudyRootQuery()
        {
            var query = new DicomCFindRequest(DicomUID.StudyRootQueryRetrieveInformationModelFind, DicomQueryRetrieveLevel.Study);

            Assert.Equal(DicomQueryRetrieveLevel.Study, query.Level);
            Assert.Equal(DicomUID.StudyRootQueryRetrieveInformationModelFind, query.SOPClassUID);
        }
Esempio n. 6
0
        private static async Task <List <DicomDataset> > GetAllItemsFromWorklistAsync(string serverIP, int serverPort, string serverAET, string clientAET)
        {
            var worklistItems = new List <DicomDataset>();
            var cfind         = DicomCFindRequest.CreateWorklistQuery(); // no filter, so query all awailable entries

            cfind.OnResponseReceived = (DicomCFindRequest rq, DicomCFindResponse rp) =>
            {
                if (rp.HasDataset)
                {
                    Console.WriteLine("Study UID: {0}", rp.Dataset.GetSingleValue <string>(DicomTag.StudyInstanceUID));
                    worklistItems.Add(rp.Dataset);
                }
                else
                {
                    Console.WriteLine(rp.Status.ToString());
                }
            };

            var client = new DicomClient(serverIP, serverPort, false, clientAET, serverAET);
            await client.AddRequestAsync(cfind);

            await client.SendAsync();

            return(worklistItems);
        }
Esempio n. 7
0
        private List <Study> GetStudies(RetriveEntity RetriveFrom, DicomCFindRequest request)
        {
            DicomClient _client = new DicomClient();

            _studyList = new List <Study>();
            request.OnResponseReceived = (DicomCFindRequest rec_request, DicomCFindResponse response) =>
            {
                if (response.HasDataset)
                {
                    _studyList.Add(FillStudy(response.Dataset));
                }
                autoEvent.Set();
            };
            _client.AddRequest(request);
            if (RetriveFrom == RetriveEntity.Modality)
            {
                _client.Send(_MoverSettings.Host, _MoverSettings.Port, false, _MoverSettings.Store_AE_Name, _MoverSettings.CalledAE);
            }
            else
            {
                _client.Send(_MoverSettings.StoreHost, _MoverSettings.StorePort, false, _MoverSettings.Store_AE_Name, _MoverSettings.CalledAE);
            }

            autoEvent.WaitOne();
            return(_studyList);
        }
Esempio n. 8
0
        static void Main(string[] args)
        {
            //构造要发送的C-FIND-RQ消息,如果查看DicomCFindRequest类的话
            //可以看到其定义与DICOM3.0标准第7部分第9章中规定的编码格式一致

            //在构造Study级别的查询时,我们的参数patientID会被填充到消息的Indentifier部分,用来在SCP方进行匹配查询
            var cfind = DicomCFindRequest.CreateStudyQuery(patientId: "12345");


            //当接收到对方发挥的响应消息时,进行相应的操作【注】:该操作在DICOM3.0协议
            //第7部分第8章中有说明,DIMSE协议并未对其做出规定,而应该有用户自己设定

            cfind.OnResponseReceived = (rq, rsp) =>
            {
                //此处我们只是简单的将查询到的结果输出到屏幕
                Console.WriteLine("PatientAge:{0} PatientName:{1}", rsp.Dataset.Get <string>(DicomTag.PatientAge), rsp.Dataset.Get <string>(DicomTag.PatientName));
            };

            //发起C-FIND-RQ:
            //该部分就是利用A-ASSOCIATE服务来建立DICOM实体双方之间的连接。
            var client = new DicomClient();

            client.AddRequest(cfind);
            client.Send(host: "127.0.0.1", port: 12345, useTls: false, callingAe: "SCU-AE", calledAe: "SCP-AE");
            Console.ReadLine();
        }
Esempio n. 9
0
        public static DicomCFindRequest CreateStudyRequestByPatientName(string patientName)
        {
            // there is a built in function to create a Study-level CFind request very easily:
            // return DicomCFindRequest.CreateStudyQuery(patientName: patientName);

            // but consider to create your own request that contains exactly those DicomTags that
            // you realy need pro process your data and not to cause unneccessary traffic and IO load:

            var request = new DicomCFindRequest(DicomQueryRetrieveLevel.Study);

            // always add the encoding
            request.Dataset.AddOrUpdate(new DicomTag(0x8, 0x5), "ISO_IR 100");

            // add the dicom tags with empty values that should be included in the result of the QR Server
            request.Dataset.AddOrUpdate(DicomTag.PatientName, "");
            request.Dataset.AddOrUpdate(DicomTag.PatientID, "");
            request.Dataset.AddOrUpdate(DicomTag.ModalitiesInStudy, "");
            request.Dataset.AddOrUpdate(DicomTag.StudyDate, "");
            request.Dataset.AddOrUpdate(DicomTag.StudyInstanceUID, "");
            request.Dataset.AddOrUpdate(DicomTag.StudyDescription, "");

            // add the dicom tags that contain the filter criterias
            request.Dataset.AddOrUpdate(DicomTag.PatientName, patientName);

            return(request);
        }
Esempio n. 10
0
            public IEnumerable <DicomCFindResponse> OnCFindRequest(DicomCFindRequest request)
            {
                yield return(new DicomCFindResponse(request, DicomStatus.Pending));

                Thread.Sleep(3000);
                yield return(new DicomCFindResponse(request, DicomStatus.Success));
            }
Esempio n. 11
0
        public void AddSeveralUIDsToQuery()
        {
            var e = Record.Exception(() =>
            {
                var request = new DicomCFindRequest(DicomQueryRetrieveLevel.Series);
                request.Dataset.Add(DicomTag.SeriesInstanceUID, "1.2.3\\3.4.5");
                Assert.Equal(2, request.Dataset.GetValueCount(DicomTag.SeriesInstanceUID));
            });

            Assert.Null(e);

            e = Record.Exception(() =>
            {
                var request = new DicomCFindRequest(DicomQueryRetrieveLevel.Series);
                request.Dataset.Add(DicomTag.SeriesInstanceUID, "1.2.3", "2.3.4");
                Assert.Equal(2, request.Dataset.GetValueCount(DicomTag.SeriesInstanceUID));
            });
            Assert.Null(e);

            e = Record.Exception(() =>
            {
                var request = new DicomCFindRequest(DicomQueryRetrieveLevel.Series);
                request.Dataset.Add(new DicomUniqueIdentifier(DicomTag.SeriesInstanceUID, "1.2.3", "3.4.5"));
                Assert.Equal(2, request.Dataset.GetValueCount(DicomTag.SeriesInstanceUID));
            });
            Assert.Null(e);
        }
Esempio n. 12
0
        public async Task <List <DicomDataset> > QueryStudiesByPatientAsync(string serverIp, int serverPort, string serverAET, string localAET, string patientId = null, string patientName = null, DicomDateRange studyDateTime = null)
        {
            List <DicomDataset> studyUids = new List <DicomDataset>();

            DicomCFindRequest request = RequestFactory.CreateStudyQuery(patientId, patientName, studyDateTime);

            request.OnResponseReceived += (req, res) =>
            {
                if (res.Status == DicomStatus.Success ||
                    res.Status == DicomStatus.Pending)
                {
                    if (res.HasDataset)
                    {
                        studyUids.Add(res.Dataset);
                    }
                    else
                    {
                        logger.Error("Query studies response has no dataset.");
                    }
                }
                else
                {
                    logger.Error("Query Studies failure. Status - [{0}]", res.Status);
                }
            };

            DicomClient client = new DicomClient(serverIp, serverPort, false, localAET, serverAET);
            await client.AddRequestAsync(request);

            await client.SendAsync();

            return(studyUids);
        }
Esempio n. 13
0
        internal static async Task FindAsync <U>(
            DicomCFindRequest request,
            DicomSearchServiceSettings serviceSettings,
            SemaphoreSlim requestSemaphore,
            CancellationToken ct)
        {
            // always add the encoding
            request.Dataset.AddOrUpdate(new DicomTag(0x8, 0x5), "ISO_IR 100");

            // add the dicom tags with empty values that should be included in the result of the QR Server
            request.Dataset.Fill <U>();

            var client = serviceSettings.DicomSettings.CreateClient();
            await client.AddRequestAsync(request);

            if (requestSemaphore != null)
            {
                await requestSemaphore.WaitAsync(ct);
            }

            try
            {
                if (!ct.IsCancellationRequested)
                {
                    await client.SendAsync(ct);
                }
            }
            finally
            {
                if (requestSemaphore != null)
                {
                    requestSemaphore.Release();
                }
            }
        }
Esempio n. 14
0
        public async Task OnCFindRequestAsync_Pending_ShouldRespond()
        {
            var port = Ports.GetNext();

            using (DicomServerFactory.Create <PendingAsyncDicomCFindProvider>(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);

                var responses = new ConcurrentQueue <DicomCFindResponse>();
                DicomRequest.OnTimeoutEventArgs timeout = null;
                var request = new DicomCFindRequest(DicomQueryRetrieveLevel.Study)
                {
                    OnResponseReceived = (req, res) => responses.Enqueue(res),
                    OnTimeout          = (sender, args) => timeout = args
                };

                await client.AddRequestAsync(request).ConfigureAwait(false);

                await client.SendAsync().ConfigureAwait(false);

                Assert.Collection(
                    responses,
                    response1 => Assert.Equal(DicomStatus.Pending, response1.Status),
                    response2 => Assert.Equal(DicomStatus.Pending, response2.Status),
                    response3 => Assert.Equal(DicomStatus.Success, response3.Status)
                    );
                Assert.Null(timeout);
            }
        }
Esempio n. 15
0
        void onStudyClicked(ListViewItem sender)
        {
            // find series ...............................
            var studyQueryOut       = sender.Content as StudyQueryOut;
            DicomCFindRequest cfind = new DicomCFindRequest(DicomQueryRetrieveLevel.Series);

            PropertyInfo[] properties = typeof(SeriesQueryOut).GetProperties();
            foreach (var property in properties)
            {
                string   tag    = typeof(DicomTag).GetField(property.Name).GetValue(null).ToString();
                DicomTag theTag = (DicomTag.Parse(tag));
                if (theTag == DicomTag.StudyInstanceUID)
                {
                    cfind.Dataset.Add(DicomTag.StudyInstanceUID, studyQueryOut.StudyInstanceUID);
                }
                else
                {
                    cfind.Dataset.Add(theTag, "");
                }
            }
            cfind.OnResponseReceived = (request, response) =>
            {
                if (response.HasDataset)
                {
                    seriesResponses.Add(new SeriesQueryOut(response));
                }
                else
                {
                    Console.WriteLine("got " + seriesResponses.Count + " series");
                }
            };

            var client = new DicomClient();

            client.AddRequest(cfind);

            mainWindow.frame.Navigate(mainWindow.downloadPage);
            mainWindow.downloadPage.dataGrid.Items.Clear();
            seriesResponses = new List <SeriesQueryOut>();

            try
            {
                Console.WriteLine(Environment.NewLine + "#############################################################" + Environment.NewLine + Environment.NewLine
                                  + "Querying server " + configuration.ip + ":" + configuration.port +
                                  " for SERIES in study no. " + studyQueryOut.StudyInstanceUID);
                client.Send(configuration.ip, configuration.port, false, configuration.thisNodeAET, configuration.AET);
            }
            catch (Exception ec)
            {
                Console.WriteLine("Impossible to connect to server");
            }
            // arrange results in table
            foreach (SeriesQueryOut seriesResponse in seriesResponses)
            {
                Console.WriteLine("Added series to table" + Environment.NewLine +
                                  "-------------------------------------------------------------------" + Environment.NewLine);
                SetupGUI.addElementToSeriesTable(mainWindow.downloadPage, seriesResponse);
            }
        }
Esempio n. 16
0
        public async Task ShouldSendAllRequestsEvenThoughTheyAllTimeOut(int numberOfRequests, int maximumRequestsPerAssociation, int asyncOpsInvoked)
        {
            var options = new
            {
                Requests            = numberOfRequests,
                TimeBetweenRequests = TimeSpan.FromMilliseconds(100),
                MaxRequestsPerAssoc = maximumRequestsPerAssociation,
            };

            var port = Ports.GetNext();

            using (CreateServer <NeverRespondingDicomServer>(port))
            {
                var client = CreateClient(port);
                client.NegotiateAsyncOps(asyncOpsInvoked);

                // Ensure the client is quite impatient
                client.ServiceOptions.RequestTimeout = TimeSpan.FromMilliseconds(200);

                var testLogger = _logger.IncludePrefix("Test");
                testLogger.Info($"Beginning {options.Requests} parallel requests with {options.MaxRequestsPerAssoc} requests / association");

                var requests = new List <DicomRequest>();
                for (var i = 1; i <= options.Requests; i++)
                {
                    var request = new DicomCFindRequest(DicomQueryRetrieveLevel.Study);

                    requests.Add(request);
                    await client.AddRequestAsync(request).ConfigureAwait(false);

                    if (i < options.Requests)
                    {
                        testLogger.Info($"Waiting {options.TimeBetweenRequests.TotalMilliseconds}ms between requests");
                        await Task.Delay(options.TimeBetweenRequests);

                        testLogger.Info($"Waited {options.TimeBetweenRequests.TotalMilliseconds}ms, moving on to next request");
                    }
                }

                var timedOutRequests = new List <DicomRequest>();
                client.RequestTimedOut += (sender, args) => { timedOutRequests.Add(args.Request); };

                var sendTask = client.SendAsync();
                var sendTimeoutCancellationTokenSource = new CancellationTokenSource();
                var sendTimeout = Task.Delay(TimeSpan.FromMinutes(1), sendTimeoutCancellationTokenSource.Token);

                var winner = await Task.WhenAny(sendTask, sendTimeout).ConfigureAwait(false);

                sendTimeoutCancellationTokenSource.Cancel();
                sendTimeoutCancellationTokenSource.Dispose();

                if (winner != sendTask)
                {
                    throw new Exception("DicomClient.SendAsync timed out");
                }

                Assert.Equal(requests.OrderBy(m => m.MessageID), timedOutRequests.OrderBy(m => m.MessageID));
            }
        }
Esempio n. 17
0
        public async IAsyncEnumerable <DicomCFindResponse> OnCFindRequestAsync(DicomCFindRequest request)
        {
            yield return(new DicomCFindResponse(request, DicomStatus.Pending));

            yield return(new DicomCFindResponse(request, DicomStatus.Pending));

            yield return(new DicomCFindResponse(request, DicomStatus.Success));
        }
Esempio n. 18
0
        public static DicomCFindRequest CreateStudyQueryRequest(IDicomQuery query)
        {
            var request = new DicomCFindRequest(DicomQueryRetrieveLevel.Study);

            request.Dataset.AddOrUpdate(DicomTag.StudyInstanceUID, "");
            query?.CopyTo(request.Dataset);
            return(request);
        }
Esempio n. 19
0
        public void Constructor_ParamatersAreSet()
        {
            var cfind = new DicomCFindRequest(DicomUID.UnifiedProcedureStepEvent, DicomQueryRetrieveLevel.NotApplicable, DicomPriority.High);

            Assert.Equal(DicomPriority.High, cfind.Priority);
            Assert.Equal(DicomQueryRetrieveLevel.NotApplicable, cfind.Level);
            Assert.Equal(DicomUID.UnifiedProcedureStepEvent, cfind.SOPClassUID);
        }
Esempio n. 20
0
        public void autofind(string dt)
        {//string AutoscanLog = Directory.GetCurrentDirectory() + "\\Autoscan"+"--"+DateTime.Now.ToString()+".txt" + " ";
            bool   findloop        = false;
            string scanresultsfile = Directory.GetCurrentDirectory() + "\\autocfindresults.txt" + " ";

            var cfind = DicomCFindRequest.CreateStudyQuery(patientId: "*");

            cfind.OnResponseReceived = (DicomCFindRequest rq, DicomCFindResponse rp) => {
                if (!findloop)
                {
                    if (rp.Status == DicomStatus.Success || rp.Status == DicomStatus.Pending)
                    {
                        MessageBox.Show(string.Format("Patient details are writeen into file: {0}", scanresultsfile));
                        using (StreamWriter sw = File.AppendText(dt))
                        {
                            sw.WriteLine(string.Format("C-Find status: Pass \n"));
                        }
                    }
                    else if (!(rp.Status == DicomStatus.Success || rp.Status == DicomStatus.Pending))
                    {
                        MessageBox.Show("Cannot dump patient details");
                        this.Close();
                        using (StreamWriter sw = File.AppendText(dt))
                        {
                            sw.WriteLine(string.Format("C-Find status: Fail \n"));
                        }
                    }

                    if (!(File.Exists(scanresultsfile)))
                    {
                        // Create a file to write to.
                        using (StreamWriter sw = File.CreateText(scanresultsfile))
                        {
                            sw.WriteLine("Auto C-Find Results\n");
                        }
                    }
                    else if (File.Exists(scanresultsfile))
                    {
                        File.WriteAllText(scanresultsfile, String.Empty);
                    }
                }


                using (StreamWriter sw = File.AppendText(scanresultsfile))
                {
                    sw.WriteLine(string.Format("Patient ID: {0}\t", rp.Dataset.Get <string>(DicomTag.PatientID)));
                    sw.WriteLine(string.Format("PatientName: {0}\n", rp.Dataset.Get <string>(DicomTag.PatientName)));
                }
                findstat = true;
                findloop = true;
            };

            var client = new DicomClient();

            client.AddRequest(cfind);
            //client.Send("127.0.0.1", 11112, false, "SCU-AE", "SCP-AE");
            client.Send(Basic_called_ip, System.Convert.ToInt32(Basic_called_port), false, Basic_called_ae, Basic_calling_ae);
        }
Esempio n. 21
0
        private void find_click(object sender, EventArgs e)
        {
            try
            {
                bool   findloop        = false;
                string scanresultsfile = Directory.GetCurrentDirectory() + "\\cfindresults.txt" + " ";

                var cfind = DicomCFindRequest.CreateStudyQuery(patientId: "*");
                cfind.OnResponseReceived = (DicomCFindRequest rq, DicomCFindResponse rp) => {
                    if (!findloop)
                    {
                        if (rp.Status == DicomStatus.Success || rp.Status == DicomStatus.Pending)
                        {
                            MessageBox.Show(string.Format("C-Find is sucess and the results are writeen into file: {0}", scanresultsfile));
                        }
                        else if (!(rp.Status == DicomStatus.Success || rp.Status == DicomStatus.Pending))
                        {
                            MessageBox.Show(string.Format("C-Find failure {0}", rp.Status.ToString()));
                            this.Close();
                        }

                        if (!(File.Exists(scanresultsfile)))
                        {
                            // Create a file to write to.
                            using (StreamWriter sw = File.CreateText(scanresultsfile))
                            {
                                sw.WriteLine("C-Find Results\n");
                            }
                        }
                        else if (File.Exists(scanresultsfile))
                        {
                            File.WriteAllText(scanresultsfile, String.Empty);
                        }
                    }


                    using (StreamWriter sw = File.AppendText(scanresultsfile))
                    {
                        sw.WriteLine(string.Format("Patient ID: {0}\t", rp.Dataset.Get <string>(DicomTag.PatientID)));
                        sw.WriteLine(string.Format("PatientName: {0}\n", rp.Dataset.Get <string>(DicomTag.PatientName)));
                    }
                    findstat = true;
                    findloop = true;
                };

                var client = new DicomClient();
                client.AddRequest(cfind);
                //client.Send("127.0.0.1", 11112, false, "SCU-AE", "SCP-AE");
                client.Send(Basic_called_ip, System.Convert.ToInt32(Basic_called_port), false, Basic_called_ae, Basic_calling_ae);
            }
            catch (Exception exc)
            {
                if (!(exc is DicomException))
                {
                    Console.WriteLine(exc.ToString());
                }
            }
        }
Esempio n. 22
0
        /// <summary>
        /// Convenience method for creating a C-FIND image query.
        /// </summary>
        /// <param name="studyInstanceUid">Study instance UID.</param>
        /// <param name="seriesInstanceUid">Series instance UID.</param>
        /// <param name="modality">Modality.</param>
        /// <returns>C-FIND image query object.</returns>
        public static DicomCFindRequest CreateImageQuery(
            string studyInstanceUid,
            string seriesInstanceUid,
            string modality = null)
        {
            DicomCFindRequest dimse = DicomCFindRequest.CreateImageQuery(studyInstanceUid, seriesInstanceUid, modality);

            return(dimse);
        }
Esempio n. 23
0
        public static DicomCFindRequest CreateSeriesQueryRequest(string studyUid, IDicomQuery query)
        {
            var request = new DicomCFindRequest(DicomQueryRetrieveLevel.Series);

            request.Dataset.AddOrUpdate(DicomTag.StudyInstanceUID, studyUid);
            request.Dataset.AddOrUpdate(DicomTag.SeriesInstanceUID, "");
            query?.CopyTo(request.Dataset);
            return(request);
        }
Esempio n. 24
0
        // extern search---------------------------------------------------------------------

        // search STUDIES-----------------------------------------------
        void onSearchButtonClicked(object a, EventArgs b)
        {
            mainWindow.queryPage.study_ClickEvent -= onLocalStudyClicked;
            mainWindow.queryPage.study_ClickEvent += onStudyClicked;
            //

            StudyQueryIn studyQuery = new StudyQueryIn(mainWindow.queryPage);

            // find studies
            DicomCFindRequest cfind = new DicomCFindRequest(DicomQueryRetrieveLevel.Study);

            cfind.Dataset.Add(DicomTag.PatientName, studyQuery.PatientName);
            cfind.Dataset.Add(DicomTag.StudyDate, studyQuery.StudyDate);
            cfind.Dataset.Add(DicomTag.ModalitiesInStudy, studyQuery.ModalitiesInStudy);
            cfind.Dataset.Add(DicomTag.StudyInstanceUID, "");
            cfind.Dataset.Add(DicomTag.PatientID, studyQuery.PatientID);
            cfind.Dataset.Add(DicomTag.PatientBirthDate, "");
            cfind.Dataset.Add(DicomTag.StudyDescription, "");

            int numResponses = 0;

            cfind.OnResponseReceived = (request, response) =>
            {
                if (response.HasDataset)
                {
                    numResponses++;
                    studyResponses.Add(new StudyQueryOut(response));
                }
                if (!response.HasDataset)
                {
                    Console.WriteLine("got " + numResponses.ToString() + " studies" + Environment.NewLine);
                }
            };

            var client = new DicomClient();

            client.AddRequest(cfind);

            mainWindow.queryPage.listView.Items.Clear();
            studyResponses = new List <StudyQueryOut>();

            try
            {
                Console.WriteLine("Querying server " + configuration.ip + ":" + configuration.port
                                  + " for STUDIES with:" + Environment.NewLine + studyQuery.ToString());
                client.Send(configuration.ip, configuration.port, false, configuration.thisNodeAET, configuration.AET);
            }
            catch (Exception ec)
            {
                Console.WriteLine(ec.Message + Environment.NewLine + ec.StackTrace);
            }
            // arrange results in table
            foreach (StudyQueryOut studyResponse in studyResponses)
            {
                mainWindow.queryPage.listView.Items.Add(studyResponse);
            }
        }
Esempio n. 25
0
        string getImagesInSeries(SeriesQueryOut seriesResponse)
        {
            // find images ...............................
            DicomCFindRequest cfind = new DicomCFindRequest(DicomQueryRetrieveLevel.Image);

            cfind.Dataset.Add(DicomTag.StudyInstanceUID, seriesResponse.StudyInstanceUID);
            cfind.Dataset.Add(DicomTag.SeriesInstanceUID, seriesResponse.SeriesInstanceUID);
            cfind.Dataset.Add(DicomTag.SOPInstanceUID, "");
            cfind.Dataset.Add(DicomTag.InstanceNumber, "");
            int numImages = 0;

            cfind.OnResponseReceived = (request, response) =>
            {
                if (response.HasDataset)
                {
                    imageIDs.Add(response.Dataset.GetSingleValue <string>(DicomTag.SOPInstanceUID));
                    numImages++;
                }
                if (!response.HasDataset)
                {
                    Console.WriteLine("got " + numImages + " images" + Environment.NewLine);
                }
            };

            var client = new DicomClient();

            client.AddRequest(cfind);

            /* var pcs = DicomPresentationContext.GetScpRolePresentationContextsFromStorageUids(
             *   DicomStorageCategory.Image,
             *   DicomTransferSyntax.ExplicitVRLittleEndian,
             *   DicomTransferSyntax.ImplicitVRLittleEndian,
             *   DicomTransferSyntax.ImplicitVRBigEndian);
             * client.AdditionalPresentationContexts.AddRange(pcs); */

            imageIDs = new List <string>();

            try
            {
                Console.WriteLine(Environment.NewLine + "Querying server " + configuration.ip + ":" + configuration.port +
                                  " for IMAGES in series no. " + seriesResponse.SeriesInstanceUID);
                client.Send(configuration.ip, configuration.port, false, configuration.thisNodeAET, configuration.AET);
            }
            catch (Exception ec)
            {
                Console.WriteLine("Impossible to connect to server");
            }

            string SOPInstanceUID = "";

            if (imageIDs.Count > 0)
            {
                SOPInstanceUID = imageIDs[(int)(imageIDs.Count / 2.0f)];
            }

            return(SOPInstanceUID);
        }
Esempio n. 26
0
        public async Task <List <TempDicomSeries> > GetDicomSeries(TempDicomStudy d)
        {
            var result  = new List <TempDicomSeries>();
            var request = new DicomCFindRequest(DicomQueryRetrieveLevel.Series);

            #region seriesDataset
            request.Dataset.AddOrUpdate(DicomTag.Modality, "");
            request.Dataset.AddOrUpdate(DicomTag.SeriesNumber, "");
            request.Dataset.AddOrUpdate(DicomTag.SeriesInstanceUID, "");
            request.Dataset.AddOrUpdate(DicomTag.SeriesDate, "");
            request.Dataset.AddOrUpdate(DicomTag.SeriesTime, "");
            request.Dataset.AddOrUpdate(DicomTag.SeriesDescription, "");
            request.Dataset.AddOrUpdate(DicomTag.StudyInstanceUID, d.StudyInstanceUID);
            #endregion

            request.OnResponseReceived += (re, response) =>
            {
                if ((response as DicomCFindResponse).Status == DicomStatus.Success)
                {
                    ;
                }
                logger.Trace(" C-Find response = " + response);
                try
                {
                    if ((response as DicomCFindResponse).HasDataset)
                    {
                        TempDicomSeries s = new TempDicomSeries((response as DicomCFindResponse).Dataset);
                        if (result.Where(x => x.SeriesInstanceUID == s.SeriesInstanceUID).Any() == false)
                        {
                            s.TempDicomStudy = d;
                            d.DicomSeries.Add(s);
                            result.Add(s);
                            //s.Debug();
                            logger.Trace("Picked up Series Instance UID " + (response as DicomCFindResponse).Dataset.GetString(DicomTag.SeriesInstanceUID));
                        }
                    }
                }
                catch (Exception ex)
                {
                    logger.Warn(ex, "Exception in getting TempDicomSeries");
                }
            };

            foreach (StoredDicomServer s in DicomServers.Where(x => x.Online))
            {
                logger.Trace("Running series query on " + s.AETitle);
                DicomClient client = new DicomClient(s.IPAddress, s.Port, false, _preferences.AETitle, s.AETitle);
                client.AssociationRejected += Client_AssociationRejected;
                client.AssociationAccepted += Client_AssociationAccepted;
                client.NegotiateAsyncOps();
                await client.AddRequestAsync(request);

                await client.SendAsync();
            }
            return(result);
        }
Esempio n. 27
0
        public async Task <List <TempDicomStudy> > GetDicomStudies(DateTime studyDate)
        {
            logger.Trace("GetDicomStudies(" + studyDate + ")");
            var Studies = new List <TempDicomStudy>();
            var request = new DicomCFindRequest(DicomQueryRetrieveLevel.Study);

            #region studyDataset
            request.Dataset.AddOrUpdate(DicomTag.PatientName, "");
            request.Dataset.AddOrUpdate(DicomTag.PatientID, "");
            request.Dataset.AddOrUpdate(DicomTag.StudyDate, studyDate.ToString("yyyyMMdd"));
            request.Dataset.AddOrUpdate(DicomTag.StudyInstanceUID, "");
            request.Dataset.AddOrUpdate(DicomTag.AccessionNumber, "");
            request.Dataset.AddOrUpdate(DicomTag.StudyDescription, "");
            request.Dataset.AddOrUpdate(DicomTag.ModalitiesInStudy, "");
            #endregion

            request.OnResponseReceived += (re, response) =>
            {
                logger.Trace(" C-Find response = " + response);
                try
                {
                    if ((response as DicomCFindResponse).HasDataset)
                    {
                        if (Studies.Where(x => x.StudyInstanceUID == (response as DicomCFindResponse).Dataset.GetString(DicomTag.StudyInstanceUID)).Any() == false)
                        {
                            Studies.Add(new TempDicomStudy((response as DicomCFindResponse).Dataset));
                            logger.Trace("Picked up Study Instance UID " + (response as DicomCFindResponse).Dataset.GetString(DicomTag.StudyInstanceUID));
                        }
                        else
                        {
                            logger.Trace("Already picked up Study Instance UID " + (response as DicomCFindResponse).Dataset.GetString(DicomTag.StudyInstanceUID));
                        }
                    }
                }
                catch (Exception ex)
                {
                    logger.Warn(ex, "Exception in getting studyUID");
                }
            };

            foreach (StoredDicomServer s in DicomServers.Where(x => x.Online))
            {
                logger.Trace("Running study level query on " + s.AETitle);
                DicomClient client = new DicomClient(s.IPAddress, s.Port, false, _preferences.AETitle, s.AETitle);
                client.AssociationRejected += Client_AssociationRejected;
                client.AssociationAccepted += Client_AssociationAccepted;
                client.NegotiateAsyncOps();
                await client.AddRequestAsync(request);

                await client.SendAsync();

                //client.Send(s.IPAddress, s.Port, false, LocalAETitle, s.AETitle, 5000);
            }
            return(Studies);
        }
Esempio n. 28
0
        public void CreateQueryWithInvalidUID()
        {
            var invalidStudyUID = "1.2.0004";
            var e = Record.Exception(() =>
            {
                var request = DicomCFindRequest.CreateSeriesQuery(invalidStudyUID);
                Assert.Equal(invalidStudyUID, request.Dataset.GetSingleValue <string>(DicomTag.StudyInstanceUID));
            });

            Assert.Null(e);
        }
Esempio n. 29
0
        private string GetPatientId(DicomCFindRequest request)
        {
            // TODO: Get patientId from dataset.

            if (request.Dataset.Contains(PatientNumberTag))
            {
                DicomLongString dicomLongStringItem = request.Dataset.Get <DicomLongString>(PatientNumberTag);
            }

            return("dummy");
        }
        public Patient GetPatientData(string patientId)
        {
            var cfind = DicomCFindRequest.CreatePatientQuery(patientId);

            cfind.OnResponseReceived = (DicomCFindRequest rq, DicomCFindResponse rp) =>
            {
                _patient = GetPatientInformation(rp);
            };
            _client.AddRequest(cfind);
            _client.Send(_host, _port, _useTls, _callingAe, _calledAe);
            return(_patient);
        }