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); } }
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); }
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)); }
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); }
public void Constructor_CreatesStudyRootQuery() { var query = new DicomCFindRequest(DicomUID.StudyRootQueryRetrieveInformationModelFind, DicomQueryRetrieveLevel.Study); Assert.Equal(DicomQueryRetrieveLevel.Study, query.Level); Assert.Equal(DicomUID.StudyRootQueryRetrieveInformationModelFind, query.SOPClassUID); }
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); }
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); }
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(); }
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); }
public IEnumerable <DicomCFindResponse> OnCFindRequest(DicomCFindRequest request) { yield return(new DicomCFindResponse(request, DicomStatus.Pending)); Thread.Sleep(3000); yield return(new DicomCFindResponse(request, DicomStatus.Success)); }
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); }
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); }
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(); } } }
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); } }
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); } }
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)); } }
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)); }
public static DicomCFindRequest CreateStudyQueryRequest(IDicomQuery query) { var request = new DicomCFindRequest(DicomQueryRetrieveLevel.Study); request.Dataset.AddOrUpdate(DicomTag.StudyInstanceUID, ""); query?.CopyTo(request.Dataset); return(request); }
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); }
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); }
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()); } } }
/// <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); }
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); }
// 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); } }
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); }
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); }
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); }
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); }
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); }