示例#1
0
        public IEnumerable <DicomCFindResponse> OnCFindRequest(DicomCFindRequest request)
        {
            var queryLevel = request.Level;

            var matchingFiles = new List <string>();
            IDicomImageFinderService finderService = QRServer.CreateFinderService;

            // a QR SCP has to define in a DICOM Conformance Statement for which dicom tags it can query
            // depending on the level of the query. Below there are only very few parameters evaluated.

            switch (queryLevel)
            {
            case DicomQueryRetrieveLevel.Patient:
            {
                var patname = request.Dataset.Get(DicomTag.PatientName, string.Empty);
                var patid   = request.Dataset.Get(DicomTag.PatientID, string.Empty);

                matchingFiles = finderService.FindPatientFiles(patname, patid);
            }
            break;

            case DicomQueryRetrieveLevel.Study:
            {
                var patname  = request.Dataset.Get(DicomTag.PatientName, string.Empty);
                var patid    = request.Dataset.Get(DicomTag.PatientID, string.Empty);
                var accNr    = request.Dataset.Get(DicomTag.AccessionNumber, string.Empty);
                var studyUID = request.Dataset.Get(DicomTag.StudyInstanceUID, string.Empty);

                matchingFiles = finderService.FindStudyFiles(patname, patid, accNr, studyUID);
            }
            break;

            case DicomQueryRetrieveLevel.Series:
            {
                var patname   = request.Dataset.Get(DicomTag.PatientName, string.Empty);
                var patid     = request.Dataset.Get(DicomTag.PatientID, string.Empty);
                var accNr     = request.Dataset.Get(DicomTag.AccessionNumber, string.Empty);
                var studyUID  = request.Dataset.Get(DicomTag.StudyInstanceUID, string.Empty);
                var seriesUID = request.Dataset.Get(DicomTag.SeriesInstanceUID, string.Empty);
                var modality  = request.Dataset.Get(DicomTag.Modality, string.Empty);

                matchingFiles = finderService.FindSeriesFiles(patname, patid, accNr, studyUID, seriesUID, modality);
            }
            break;

            case DicomQueryRetrieveLevel.Image:
                yield return(new DicomCFindResponse(request, DicomStatus.QueryRetrieveUnableToProcess));

                yield break;
            }

            // now read the required dicomtags from the matching files and return as results
            foreach (var matchingFile in matchingFiles)
            {
                var dicomFile = DicomFile.Open(matchingFile);
                var result    = new DicomDataset();
                foreach (var requestedTag in request.Dataset)
                {
                    // most of the requested DICOM tags are stored in the DICOM files and therefore saved into a database.
                    // you can fill the responses by selecting the values from the database.
                    // also be aware that there are some requested DicomTags like "ModalitiesInStudy" or "NumberOfStudyRelatedInstances"
                    // or "NumberOfPatientRelatedInstances" and so on which have to be calculated and cannot be read from a DICOM file.
                    if (dicomFile.Dataset.Contains(requestedTag.Tag))
                    {
                        dicomFile.Dataset.CopyTo(result, requestedTag.Tag);
                    }
                    // else if (requestedTag == DicomTag.NumberOfStudyRelatedInstances)
                    // {
                    //    ... somehow calculate how many instances are stored within the study
                    //    result.Add(DicomTag.NumberOfStudyRelatedInstances, number);
                    // } ....
                    else
                    {
                        result.Add(requestedTag);
                    }
                }
                yield return(new DicomCFindResponse(request, DicomStatus.Pending)
                {
                    Dataset = result
                });
            }

            yield return(new DicomCFindResponse(request, DicomStatus.Success));
        }
示例#2
0
        public IEnumerable <DicomCFindResponse> OnCFindRequest(DicomCFindRequest request)
        {
            var queryLevel = request.Level;

            DataTable resultsDt = null;
            IDicomImageFinderService finderService = QRServer.CreateFinderService;

            // a QR SCP has to define in a DICOM Conformance Statement for which dicom tags it can query
            // depending on the level of the query. Below there are only very few parameters evaluated.

            switch (queryLevel)
            {
            case DicomQueryRetrieveLevel.Patient:
            {
                var patname = request.Dataset.GetSingleValueOrDefault(DicomTag.PatientName, string.Empty);
                var patid   = request.Dataset.GetSingleValueOrDefault(DicomTag.PatientID, string.Empty);

                resultsDt = finderService.FindPatientFiles(patname, patid);
            }
            break;

            case DicomQueryRetrieveLevel.Study:
            {
                var patname   = request.Dataset.GetSingleValueOrDefault(DicomTag.PatientName, string.Empty);
                var patid     = request.Dataset.GetSingleValueOrDefault(DicomTag.PatientID, string.Empty);
                var accNr     = request.Dataset.GetSingleValueOrDefault(DicomTag.AccessionNumber, string.Empty);
                var studyUID  = request.Dataset.GetSingleValueOrDefault(DicomTag.StudyInstanceUID, string.Empty);
                var StudyDate = request.Dataset.GetSingleValueOrDefault(DicomTag.StudyDate, string.Empty);
                var StudyTime = request.Dataset.GetSingleValueOrDefault(DicomTag.StudyTime, string.Empty);

                resultsDt = finderService.FindStudyFiles(patname, patid, accNr, studyUID, StudyDate, StudyTime);
            }
            break;

            case DicomQueryRetrieveLevel.Series:
            {
                var patname   = request.Dataset.GetSingleValueOrDefault(DicomTag.PatientName, string.Empty);
                var patid     = request.Dataset.GetSingleValueOrDefault(DicomTag.PatientID, string.Empty);
                var accNr     = request.Dataset.GetSingleValueOrDefault(DicomTag.AccessionNumber, string.Empty);
                var studyUID  = request.Dataset.GetSingleValueOrDefault(DicomTag.StudyInstanceUID, string.Empty);
                var seriesUID = request.Dataset.GetSingleValueOrDefault(DicomTag.SeriesInstanceUID, string.Empty);
                var modality  = request.Dataset.GetSingleValueOrDefault(DicomTag.Modality, string.Empty);

                resultsDt = finderService.FindSeriesFiles(patname, patid, accNr, studyUID, seriesUID, modality);
            }
            break;

            case DicomQueryRetrieveLevel.Image:
                yield return(new DicomCFindResponse(request, DicomStatus.QueryRetrieveUnableToProcess));

                yield break;
            }

            bool _autoValidateDICOM = Config.GetConfigBoolValueByName(Config.Key_Enable_DICOM_AutoValidate);
            var  columns            = new List <string>();

            foreach (DataColumn column in resultsDt.Columns)
            {
                columns.Add(column.ColumnName);
            }
            // now read the required dicomtags from the matching files and return as results
            foreach (DataRow row in resultsDt.Rows)
            {
                var rtnResult = new DicomDataset();
                rtnResult.AutoValidate = _autoValidateDICOM; //Not sure if we need this so se up as config value
                //rtnResult.Clear(); //Could clear existing rather than create new.
                foreach (var requestedTag in request.Dataset)
                {
                    // most of the requested DICOM tags are stored in the DICOM files and therefore saved into a database.
                    // you can fill the responses by selecting the values from the database.
                    // also be aware that there are some requested DicomTags like "ModalitiesInStudy" or "NumberOfStudyRelatedInstances"
                    // or "NumberOfPatientRelatedInstances" and so on which have to be calculated and cannot be read from a DICOM file.
                    string columnName = requestedTag.Tag.DictionaryEntry.Keyword.ToString();
                    if (columns.Contains(columnName))
                    {
                        rtnResult.Add(requestedTag.Tag, row[columnName].ToString());
                    }
                    else
                    {
                        rtnResult.Add(requestedTag);
                    }
                }
                yield return(new DicomCFindResponse(request, DicomStatus.Pending)
                {
                    Dataset = rtnResult
                });
            }
            resultsDt.Dispose();
            yield return(new DicomCFindResponse(request, DicomStatus.Success));
        }