Exemple #1
0
        private void SearchList_SelectedIndexChanged(object sender, System.EventArgs e)
        {
            if (SearchList.SelectedItems.Count == 0)
            {
                return;
            }

            //clear series list
            SerList.Items.Clear();

            //retrieve entire series history for patient
            string studyInsUID = SearchList.SelectedItems[0].SubItems[9].Text;

            QRRequestData request = new QRRequestData(QueryRetrieveLevel.StudyRoot, QRLevelType.Series);

            request.SearchTerms[DICOMTags.StudyInstanceUID]  = studyInsUID;
            request.SearchTerms[DICOMTags.SeriesDescription] = "";
            request.SearchTerms[DICOMTags.BodyPartExamined]  = "";
            request.SearchTerms[DICOMTags.SeriesDate]        = "";
            request.SearchTerms[DICOMTags.SeriesTime]        = "";
            request.SearchTerms[DICOMTags.SeriesNumber]      = "";
            request.SearchTerms[DICOMTags.NumberOfSeriesRelatedInstances] = ""; //see if it works..
            DICOMFinder finder = new DICOMFinder(new NullLogger(), "", false);

            pendingFinders.Add(finder);
            finder.FindResponse += new DICOMFinder.FindResponseHandler(finder_FindResponse_Series);
            finder.Find(new ApplicationEntity(MyAE), TargetAE.ToAE(), request);
        }
Exemple #2
0
        /// <summary>
        /// Starts a C-FIND-RQ operation on a target entity.  The request will be made, and all responses will be aggregated into
        /// a single response structure, which will be returned via the <see cref="FindResponse"/> callback.
        /// </summary>
        /// <param name="hostAE">An entity containing the AE title to represent the SCU.</param>
        /// <param name="remoteAE">An entity containing the SCP to attempt to contact.</param>
        /// <param name="requestData">A filled out <see cref="QRRequestData"/> class with the request information.</param>
        public void Find(ApplicationEntity hostAE, ApplicationEntity remoteAE, QRRequestData requestData)
        {
            findResponse = requestData.GenerateResponse();

            FindRequest = requestData;

            if (requestData.QueryLevel == QueryRetrieveLevel.PatientRoot)
            {
                conn.AddPresentationContext(new PresentationContext(AbstractSyntaxes.PatientRootQueryRetrieveInformationModelFIND, new List <TransferSyntax> {
                    TransferSyntaxes.ImplicitVRLittleEndian
                }));
            }
            else if (requestData.QueryLevel == QueryRetrieveLevel.PatientStudyOnly)
            {
                conn.AddPresentationContext(new PresentationContext(AbstractSyntaxes.PatientStudyOnlyQueryRetrieveInformationModelFINDRetired, new List <TransferSyntax> {
                    TransferSyntaxes.ImplicitVRLittleEndian
                }));
            }
            else if (requestData.QueryLevel == QueryRetrieveLevel.StudyRoot)
            {
                conn.AddPresentationContext(new PresentationContext(AbstractSyntaxes.StudyRootQueryRetrieveInformationModelFIND, new List <TransferSyntax> {
                    TransferSyntaxes.ImplicitVRLittleEndian
                }));
            }

            StartConnection(hostAE, remoteAE);
        }
Exemple #3
0
        void finder_FindResponse_Series(DICOMFinder finder, QRResponseData response)
        {
            pendingFinders.Remove(finder);
            if (response == null)
            {
                return;
            }

            foreach (Dictionary <uint, object> row in response.ResponseRows)
            {
                string SerDesc = "";
                if (row.ContainsKey(DICOMTags.SeriesDescription))
                {
                    SerDesc = (string)row[DICOMTags.SeriesDescription]; //series desc
                }
                else if (row.ContainsKey(DICOMTags.BodyPartExamined))
                {
                    SerDesc = (string)row[DICOMTags.BodyPartExamined];  //bodypartexa
                }
                string SerTime = ValOrBlank(row, DICOMTags.SeriesTime);
                if (SerTime != "" && SerTime.Length >= 6)
                {
                    SerTime = SerTime.Substring(0, 6);
                }

                string seriesInsUID = ValOrBlank(row, DICOMTags.SeriesInstanceUID);

                string imCount = "";
                if (row.ContainsKey(DICOMTags.NumberOfSeriesRelatedInstances))
                {
                    imCount = row[DICOMTags.NumberOfSeriesRelatedInstances].ToString();
                }

                this.Invoke((MethodInvoker) delegate
                {
                    SerList.Items.Add(new ListViewItem(new string[]
                    {
                        ValOrBlank(row, DICOMTags.Modality),     //modality
                        ValOrBlank(row, DICOMTags.SeriesDate),   //ser date
                        SerTime,                                 //ser time
                        ValOrBlank(row, DICOMTags.SeriesNumber), //series number
                        SerDesc,                                 //description
                        imCount,                                 //will be the number of images, after they're retrieved
                        seriesInsUID                             //Series UID, Hidden!
                    }));
                });

                if (imCount == "")
                {
                    QRRequestData request = new QRRequestData(QueryRetrieveLevel.StudyRoot, QRLevelType.Image);
                    request.SearchTerms[DICOMTags.SeriesInstanceUID] = seriesInsUID;
                    DICOMFinder newfinder = new DICOMFinder(new NullLogger(), "", false);
                    pendingFinders.Add(finder);
                    newfinder.FindResponse += new DICOMFinder.FindResponseHandler(newfinder_FindResponse_Image);
                    newfinder.Find(new ApplicationEntity(MyAE), TargetAE.ToAE(), request);
                }
            }
        }
Exemple #4
0
        private void SearchList_DoubleClick(object sender, System.EventArgs e)
        {
            if (SearchList.SelectedItems.Count == 0)
            {
                return;
            }

            foreach (ListViewItem lvi in SearchList.SelectedItems)
            {
                //string patid = lvi.SubItems[0].Text;
                string studyInsUID = lvi.SubItems[9].Text;

                //Start downloading studyid
                QRRequestData request = new QRRequestData(QueryRetrieveLevel.StudyRoot, QRLevelType.Study);
                request.SearchTerms[DICOMTags.StudyInstanceUID] = studyInsUID;
                DICOMMover mover = new DICOMMover(new NullLogger(), "", false);
                mover.StartMove(new ApplicationEntity(MyAE), TargetAE.ToAE(), MyAE, request);
            }
        }
Exemple #5
0
        private void StartSearch_Click(object sender, System.EventArgs e)
        {
            SearchList.Items.Clear();
            SerList.Items.Clear();

            string DateStr = "";

            if (S_Start.Checked)
            {
                DateStr += S_Start.Value.ToString("yyyyMMdd");
                if (!S_End.Checked)
                {
                    DateStr += "-";
                }
            }
            if (S_End.Checked)
            {
                if (DateStr != "")
                {
                    DateStr += "-";
                }
                DateStr += S_End.Value.ToString("yyyyMMdd");
            }

            QRRequestData request = new QRRequestData(QueryRetrieveLevel.StudyRoot, QRLevelType.Study);

            request.SearchTerms[DICOMTags.StudyDate]        = DateStr;
            request.SearchTerms[DICOMTags.StudyTime]        = null;
            request.SearchTerms[DICOMTags.AccessionNumber]  = S_Acc.Text;
            request.SearchTerms[DICOMTags.PatientName]      = S_Name.Text;
            request.SearchTerms[DICOMTags.PatientID]        = S_PatID.Text;
            request.SearchTerms[DICOMTags.Modality]         = null;
            request.SearchTerms[DICOMTags.PatientSex]       = null;
            request.SearchTerms[DICOMTags.PatientBirthDate] = null;
            request.SearchTerms[DICOMTags.StudyDescription] = null;
            request.SearchTerms[DICOMTags.BodyPartExamined] = null;

            DICOMFinder finder = new DICOMFinder(new NullLogger(), "", false);

            pendingFinders.Add(finder);
            finder.FindResponse += new DICOMFinder.FindResponseHandler(finder_FindResponse_Study);
            finder.Find(new ApplicationEntity(MyAE), TargetAE.ToAE(), request);
        }
Exemple #6
0
        /// <summary>
        /// After setting up the mover with your callback(s), call this to start the move process.  All updates
        /// about the operation will be provided via the callbacks.
        /// </summary>
        /// <param name="hostAE">An entity containing the AE title to represent the SCU.</param>
        /// <param name="remoteAE">An entity containing the SCP to attempt to contact.</param>
        /// <param name="sendToAE">This is the AE Title of the move destination.  The remote AE must have full information
        /// about this entity (hostname/address and port), because only the title is passed via this request.</param>
        /// <param name="requestData">A filled out request for what images to target with the MOVE request.</param>
        public void StartMove(ApplicationEntity hostAE, ApplicationEntity remoteAE, string sendToAE, QRRequestData requestData)
        {
            this.FindRequest = requestData;
            this.SendToAE    = sendToAE;

            if (requestData.QueryLevel == QueryRetrieveLevel.PatientRoot)
            {
                conn.AddPresentationContext(new PresentationContext(AbstractSyntaxes.PatientRootQueryRetrieveInformationModelMOVE, new List <TransferSyntax> {
                    TransferSyntaxes.ImplicitVRLittleEndian
                }));
            }
            else if (requestData.QueryLevel == QueryRetrieveLevel.PatientStudyOnly)
            {
                conn.AddPresentationContext(new PresentationContext(AbstractSyntaxes.PatientStudyOnlyQueryRetrieveInformationModelMOVERetired, new List <TransferSyntax> {
                    TransferSyntaxes.ImplicitVRLittleEndian
                }));
            }
            else if (requestData.QueryLevel == QueryRetrieveLevel.StudyRoot)
            {
                conn.AddPresentationContext(new PresentationContext(AbstractSyntaxes.StudyRootQueryRetrieveInformationModelMOVE, new List <TransferSyntax> {
                    TransferSyntaxes.ImplicitVRLittleEndian
                }));
            }

            StartConnection(hostAE, remoteAE);
        }
Exemple #7
0
 private QRResponseData listener_MoveRequest(DICOMConnection conn, QRRequestData request)
 {
     return(this._db.GetQRResponse(request, true));
 }
Exemple #8
0
 private QRResponseData listener_FindRequest(DICOMConnection conn, QRRequestData request)
 {
     return(this._db.GetQRResponse(request, false));
 }
Exemple #9
0
        static QRResponseData listener_FindRequest(DICOMConnection conn, QRRequestData request)
        {
            QRResponseData response = request.GenerateResponse();

            foreach (DICOMData data in storedData)
            {
                //check fields
                bool works = true;
                foreach (uint tag in request.SearchTerms.Keys)
                {
                    object search = request.SearchTerms[tag];
                    if (search.ToString() == "")
                    {
                        continue;
                    }

                    if (!data.Elements.ContainsKey(tag))
                    {
                        works = false;
                        break;
                    }

                    if (search.ToString().Contains("-"))
                    {
                        //range

                        string[] range = search.ToString().Split('-');
                        if (range[0] != "" && data[tag].Display.CompareTo(range[0]) < 0)
                        {
                            works = false;
                            break;
                        }
                        if (range[1] != "" && data[tag].Display.CompareTo(range[1]) > 0)
                        {
                            works = false;
                            break;
                        }
                    }
                    else if (search.ToString().Contains("*"))
                    {
                        if (!Regex.IsMatch(data[tag].Display, search.ToString()))
                        {
                            works = false;
                            break;
                        }
                    }
                    else if (data[tag].Display != search.ToString())
                    {
                        works = false;
                        break;
                    }
                }

                if (!works)
                {
                    continue;
                }

                DICOMData ndata = new DICOMData();
                foreach (uint tag in response.TagsToFill)
                {
                    if (data.Elements.ContainsKey(tag))
                    {
                        ndata[tag].Data = data[tag].Data;
                    }
                }
            }

            return(response);
        }