Ejemplo n.º 1
0
        public static bool IsOutOfRange(DicomDataset request)
        {
            if (request.Contains(DicomTag.ScheduledProcedureStepSequence))
            {
                DicomDataset procedureStep = request.GetSequence(DicomTag.ScheduledProcedureStepSequence).First();
                var          scheduledProcedureStepStartDate = procedureStep.GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepStartDate, string.Empty);
                Logger.Info($"scheduledProcedureStepStartDate: {scheduledProcedureStepStartDate}");
                Log.Loger($"scheduledProcedureStepStartDate: {scheduledProcedureStepStartDate}");
                if (!string.IsNullOrEmpty(scheduledProcedureStepStartDate) && scheduledProcedureStepStartDate != "*")
                {
                    var index = scheduledProcedureStepStartDate.IndexOf("-");
                    if (index >= 0)
                    {
                        scheduledProcedureStepStartDate = scheduledProcedureStepStartDate.Substring(0, index);
                        Logger.Info($"New scheduledProcedureStepStartDate: {scheduledProcedureStepStartDate}");
                        Log.Loger($"New scheduledProcedureStepStartDate: {scheduledProcedureStepStartDate}");
                    }
                    if (string.IsNullOrEmpty(scheduledProcedureStepStartDate))
                    {
                        return(true);
                    }
                    DateTime endDate   = System.DateTime.Today.AddDays(1).AddSeconds(-1);
                    DateTime startDate = endDate.AddDays(_cacheDays * -1);
                    //DicomDateRange range = new DicomDateTime(DicomTag.ScheduledProcedureStepStartDate, startDate).Get<DicomDateRange>();
                    DicomDateRange range          = new DicomDateRange(startDate, endDate);
                    DateTime       queryStartDate = new DicomDateTime(DicomTag.ScheduledProcedureStepStartDate, scheduledProcedureStepStartDate).Get <DateTime>();
                    return(!range.Contains(queryStartDate));
                }
            }

            return(false);
        }
Ejemplo n.º 2
0
 internal static IQueryable <WorklistItem> AddDateCondition(IQueryable <WorklistItem> exams, string dateCondition)
 {
     if (!string.IsNullOrEmpty(dateCondition) && dateCondition != "*")
     {
         var range = new DicomDateTime(DicomTag.ScheduledProcedureStepStartDate, dateCondition).Get <DicomDateRange>();
         exams = exams.Where(x => range.Contains(x.ExamDateAndTime));
     }
     return(exams);
 }
		public void OnElement(IByteSource source, DicomTag tag, DicomVR vr, IByteBuffer data) {
			DicomElement element;
			switch (vr.Code) {
				case "AE": element = new DicomApplicationEntity(tag, data); break;
				case "AS": element = new DicomAgeString(tag, data); break;
				case "AT": element = new DicomAttributeTag(tag, data); break;
				case "CS": element = new DicomCodeString(tag, data); break;
				case "DA": element = new DicomDate(tag, data); break;
				case "DS": element = new DicomDecimalString(tag, data); break;
				case "DT": element = new DicomDateTime(tag, data); break;
				case "FD": element = new DicomFloatingPointDouble(tag, data); break;
				case "FL": element = new DicomFloatingPointSingle(tag, data); break;
				case "IS": element = new DicomIntegerString(tag, data); break;
				case "LO": element = new DicomLongString(tag, _encodings.Peek(), data); break;
				case "LT": element = new DicomLongText(tag, _encodings.Peek(), data); break;
				case "OB": element = new DicomOtherByte(tag, data); break;
				case "OD": element = new DicomOtherDouble(tag, data); break;
				case "OF": element = new DicomOtherFloat(tag, data); break;
				case "OW": element = new DicomOtherWord(tag, data); break;
				case "PN": element = new DicomPersonName(tag, _encodings.Peek(), data); break;
				case "SH": element = new DicomShortString(tag, _encodings.Peek(), data); break;
				case "SL": element = new DicomSignedLong(tag, data); break;
				case "SS": element = new DicomSignedShort(tag, data); break;
				case "ST": element = new DicomShortText(tag, _encodings.Peek(), data); break;
				case "TM": element = new DicomTime(tag, data); break;
				case "UC": element = new DicomUnlimitedCharacters(tag, _encodings.Peek(), data); break;
				case "UI": element = new DicomUniqueIdentifier(tag, data); break;
				case "UL": element = new DicomUnsignedLong(tag, data); break;
				case "UN": element = new DicomUnknown(tag, data); break;
				case "UR": element = new DicomUniversalResource(tag, _encodings.Peek(), data); break;
				case "US": element = new DicomUnsignedShort(tag, data); break;
				case "UT": element = new DicomUnlimitedText(tag, _encodings.Peek(), data); break;
				default:
					throw new DicomDataException("Unhandled VR in DICOM parser observer: {0}", vr.Code);
			}

			if (element.Tag == DicomTag.SpecificCharacterSet) {
				Encoding encoding = _encodings.Peek();
				if (element.Count > 0)
					encoding = DicomEncoding.GetEncoding(element.Get<string>(0));
				_encodings.Pop();
				_encodings.Push(encoding);
			}

			DicomDataset ds = _datasets.Peek();
			ds.Add(element);
		}
Ejemplo n.º 4
0
        public async Task GivenDicomTagWithDifferentVR_WhenValidated_ThenShouldSkip()
        {
            var featureConfiguration = Options.Create(new FeatureConfiguration()
            {
                EnableFullDicomItemValidation = false
            });
            DicomTag     tag     = DicomTag.Date;
            DicomElement element = new DicomDateTime(tag, DateTime.Now);

            _dicomDataset.AddOrUpdate(element);

            _queryTags.Clear();
            _queryTags.Add(new QueryTag(tag.BuildExtendedQueryTagStoreEntry()));
            IDicomElementMinimumValidator validator = Substitute.For <IDicomElementMinimumValidator>();

            _dicomDatasetValidator = new DicomDatasetValidator(featureConfiguration, validator, _queryTagService);
            await _dicomDatasetValidator.ValidateAsync(_dicomDataset, requiredStudyInstanceUid : null);

            validator.DidNotReceive().Validate(Arg.Any <DicomElement>());
        }
        /// <summary>
        /// Example *required* by the Anonymisation Engine
        /// </summary>
        /// <returns></returns>
        public static List <AnonExample> RandomiseDateTimeExamples()
        {
            var dateTime  = new DateTime(2018, 2, 15, 3, 20, 58);
            var dicomItem = new DicomDateTime(DicomTag.CreationDate, dateTime);

            var dataset = new DicomDataset()
            {
                { DicomTag.PatientID, "TEST" },
                { dicomItem },
            };

            var output = new AnonExample();

            output.Input.Add(dicomItem + ": " + dateTime);

            AnonExample.InferOutput(dicomItem, RandomiseDateTime(dataset, null, dicomItem), output);

            return(new List <AnonExample> {
                output
            });
        }
        public async Task GivenDicomTagWithDifferentVR_WhenValidated_ThenShouldThrowException()
        {
            var featureConfiguration = Options.Create(new FeatureConfiguration()
            {
                EnableFullDicomItemValidation = false
            });
            DicomTag     tag     = DicomTag.Date;
            DicomElement element = new DicomDateTime(tag, DateTime.Now);

            _dicomDataset.AddOrUpdate(element);

            _queryTags.Clear();
            _queryTags.Add(new QueryTag(tag.BuildExtendedQueryTagStoreEntry()));
            IDicomElementMinimumValidator validator = Substitute.For <IDicomElementMinimumValidator>();

            _dicomDatasetValidator = new DicomDatasetValidator(featureConfiguration, validator, _queryTagService);
            await AssertThrowsAsyncWithMessage <DatasetValidationException>(
                () => _dicomDatasetValidator.ValidateAsync(_dicomDataset, requiredStudyInstanceUid: null),
                expectedMessage : $"The extended query tag '{tag}' is expected to have VR 'DA' but has 'DT' in file.");

            validator.DidNotReceive().Validate(Arg.Any <DicomElement>());
        }
Ejemplo n.º 7
0
        private static void FillElement <TR>(DicomDataset ds, DicomTag tagIn, DVR vrIn, ref int index, int depth, XCollection <TR> qrList, DataRow dr)
            where TR : QueryResultItem, IDicomMappingItem
        {
            TR qr = qrList[index] as TR;

            if (!qr.DPath.Enable)
            {
                return;
            }

            switch (qr.DPath.VR)
            {
            case DVR.Unknown: return;

            case DVR.SQ:
            {
                index++;
                int          count   = qrList.Count;
                DicomDataset eleList = null;
                for (; index < count; index++)
                {
                    qr = qrList[index] as TR;
                    switch (qr.DPath.Type)
                    {
                    case DPathType.BeginItem:
                    {
                        eleList = new DicomDataset();
                        continue;
                    }

                    case DPathType.EndItem:
                    {
                        DicomSequence dicomSequence = new DicomSequence(tagIn);
                        if (eleList != null)
                        {
                            dicomSequence.Items.Add(eleList);
                        }
                        TR qrNext = ((index + 1) < qrList.Count) ? qrList[index + 1] : null;
                        if (qrNext == null || qrNext.DPath.Type != DPathType.BeginItem)
                        {
                            return;
                        }
                        continue;
                    }

                    default:
                    {
                        if (eleList == null)
                        {
                            continue;
                        }
                        if (!qr.DPath.Enable)
                        {
                            continue;
                        }
                        //int tag = qr.DPath.GetTag(depth + 1);
                        List <string> tagList  = qr.DPath.GetTagGE(depth + 1);
                        ushort        uGroup   = DHelper.HexString2ushort(tagList[0]);
                        ushort        uElement = DHelper.HexString2ushort(tagList[1]);
                        DicomTag      tag      = new DicomTag(uGroup, uElement);

                        //DElement ele = new DElement(tag, qr.DPath.VR);
                        FillElement <TR>(eleList, tag, qr.DPath.VR, ref index, depth + 1, qrList, dr);
                        //eleList.Add(ele);
                        break;
                    }
                    }
                }
                break;
            }

            default:
            {
                string value = null;
                object obj   = dr[qr.TargetField];
                if (obj != null)
                {
                    value = obj.ToString();
                }
                if (value == null)
                {
                    value = "";
                }

                if (DHelper.IsDateTime(qr.DPath.VR))
                {
                    try
                    {
                        if (value.Length > 0)
                        {
                            DateTime dt = DateTime.Parse(value);
                            //DDateTime ddt = DDateTime.FromDateTime(qr.DPath.VR, dt);
                            DicomDateTime ddt = new DicomDateTime(tagIn, dt);
                            //rootSQElement.Value = ddt.ToDicomString();
                            ds.Add(ddt);
                        }
                        else
                        {
                            //rootSQElement.Value = value;
                            ds.Add <string>(tagIn, value);
                        }
                    }
                    catch (Exception err)
                    {
                        //SetError(err);
                        //rootSQElement.Value = value;
                        ds.Add <string>(tagIn, value);
                    }
                }
                else
                {
                    //rootSQElement.Value = value;
                    ds.Add <string>(tagIn, value);
                }


                break;
            }
            }
        }
Ejemplo n.º 8
0
        private static DicomItem CreateDicomItem(DicomTag tag, string vr, object data)
        {
            DicomItem item;

            switch (vr)
            {
            case "AE":
                item = new DicomApplicationEntity(tag, (string[])data);
                break;

            case "AS":
                item = new DicomAgeString(tag, (string[])data);
                break;

            case "AT":
                item = new DicomAttributeTag(tag, ((string[])data).Select(ParseTag).ToArray());
                break;

            case "CS":
                item = new DicomCodeString(tag, (string[])data);
                break;

            case "DA":
                item = new DicomDate(tag, (string[])data);
                break;

            case "DS":
                item = new DicomDecimalString(tag, (string[])data);
                break;

            case "DT":
                item = new DicomDateTime(tag, (string[])data);
                break;

            case "FD":
                item = new DicomFloatingPointDouble(tag, (double[])data);
                break;

            case "FL":
                item = new DicomFloatingPointSingle(tag, (float[])data);
                break;

            case "IS":
                item = new DicomIntegerString(tag, (int[])data);
                break;

            case "LO":
                item = new DicomLongString(tag, (string[])data);
                break;

            case "LT":
                item = new DicomLongText(tag, ((string[])data).Single());
                break;

            case "OB":
                item = new DicomOtherByte(tag, (IByteBuffer)data);
                break;

            case "OD":
                item = new DicomOtherDouble(tag, (IByteBuffer)data);
                break;

            case "OF":
                item = new DicomOtherFloat(tag, (IByteBuffer)data);
                break;

            case "OL":
                item = new DicomOtherLong(tag, (IByteBuffer)data);
                break;

            case "OW":
                item = new DicomOtherWord(tag, (IByteBuffer)data);
                break;

            case "PN":
                item = new DicomPersonName(tag, (string[])data);
                break;

            case "SH":
                item = new DicomShortString(tag, (string[])data);
                break;

            case "SL":
                item = new DicomSignedLong(tag, (int[])data);
                break;

            case "SS":
                item = new DicomSignedShort(tag, (short[])data);
                break;

            case "ST":
                item = new DicomShortText(tag, ((string[])data)[0]);
                break;

            case "SQ":
                item = new DicomSequence(tag, ((DicomDataset[])data));
                break;

            case "TM":
                item = new DicomTime(tag, (string[])data);
                break;

            case "UC":
                item = new DicomUnlimitedCharacters(tag, ((string[])data).SingleOrDefault());
                break;

            case "UI":
                item = new DicomUniqueIdentifier(tag, (string[])data);
                break;

            case "UL":
                item = new DicomUnsignedLong(tag, (uint[])data);
                break;

            case "UN":
                item = new DicomUnknown(tag, (IByteBuffer)data);
                break;

            case "UR":
                item = new DicomUniversalResource(tag, ((string[])data).Single());
                break;

            case "US":
                item = new DicomUnsignedShort(tag, (ushort[])data);
                break;

            case "UT":
                item = new DicomUnlimitedText(tag, ((string[])data).Single());
                break;

            default:
                throw new NotSupportedException("Unsupported value representation");
            }
            return(item);
        }
        public void OnElement(IByteSource source, DicomTag tag, DicomVR vr, IByteBuffer data)
        {
            DicomElement element;

            switch (vr.Code)
            {
            case "AE":
                element = new DicomApplicationEntity(tag, data);
                break;

            case "AS":
                element = new DicomAgeString(tag, data);
                break;

            case "AT":
                element = new DicomAttributeTag(tag, data);
                break;

            case "CS":
                element = new DicomCodeString(tag, data);
                break;

            case "DA":
                element = new DicomDate(tag, data);
                break;

            case "DS":
                element = new DicomDecimalString(tag, data);
                break;

            case "DT":
                element = new DicomDateTime(tag, data);
                break;

            case "FD":
                element = new DicomFloatingPointDouble(tag, data);
                break;

            case "FL":
                element = new DicomFloatingPointSingle(tag, data);
                break;

            case "IS":
                element = new DicomIntegerString(tag, data);
                break;

            case "LO":
                element = new DicomLongString(tag, _encodings.Peek(), data);
                break;

            case "LT":
                element = new DicomLongText(tag, _encodings.Peek(), data);
                break;

            case "OB":
                element = new DicomOtherByte(tag, data);
                break;

            case "OD":
                element = new DicomOtherDouble(tag, data);
                break;

            case "OF":
                element = new DicomOtherFloat(tag, data);
                break;

            case "OL":
                element = new DicomOtherLong(tag, data);
                break;

            case "OW":
                element = new DicomOtherWord(tag, data);
                break;

            case "PN":
                element = new DicomPersonName(tag, _encodings.Peek(), data);
                break;

            case "SH":
                element = new DicomShortString(tag, _encodings.Peek(), data);
                break;

            case "SL":
                element = new DicomSignedLong(tag, data);
                break;

            case "SS":
                element = new DicomSignedShort(tag, data);
                break;

            case "ST":
                element = new DicomShortText(tag, _encodings.Peek(), data);
                break;

            case "TM":
                element = new DicomTime(tag, data);
                break;

            case "UC":
                element = new DicomUnlimitedCharacters(tag, _encodings.Peek(), data);
                break;

            case "UI":
                element = new DicomUniqueIdentifier(tag, data);
                break;

            case "UL":
                element = new DicomUnsignedLong(tag, data);
                break;

            case "UN":
                element = new DicomUnknown(tag, data);
                break;

            case "UR":
                element = new DicomUniversalResource(tag, _encodings.Peek(), data);
                break;

            case "US":
                element = new DicomUnsignedShort(tag, data);
                break;

            case "UT":
                element = new DicomUnlimitedText(tag, _encodings.Peek(), data);
                break;

            default:
                throw new DicomDataException("Unhandled VR in DICOM parser observer: {0}", vr.Code);
            }

            if (element.Tag == DicomTag.SpecificCharacterSet)
            {
                Encoding encoding = _encodings.Peek();
                if (element.Count > 0)
                {
                    encoding = DicomEncoding.GetEncoding(element.Get <string>(0));
                }

                _encodings.Pop();
                _encodings.Push(encoding);
            }

            DicomDataset ds = _datasets.Peek();

            ds.AddOrUpdate(element);
        }
Ejemplo n.º 10
0
        public IEnumerable <DicomDataset> FilterWorklistItems(DicomDataset request)
        {
            var exams = WorklistItems.AsQueryable();

            if (request.TryGetSingleValue(DicomTag.PatientID, out string patientId) && !string.IsNullOrEmpty(patientId))
            {
                exams = exams.Where(x => x.PatientID == patientId);
            }

            if (request.TryGetSingleValue(DicomTag.PatientName, out string patientName))
            {
                exams = FilterWorklistItemsByName(exams, patientName);
            }

            DicomDataset procedureStep = null;

            if (request.TryGetSequence(DicomTag.ScheduledProcedureStepSequence, out DicomSequence procedureStepSequence) &&
                procedureStepSequence.Items.Any())
            {
                procedureStep = procedureStepSequence.First();

                if (procedureStep.TryGetSingleValue(DicomTag.ScheduledStationAETitle, out string scheduledStationAet) && !string.IsNullOrEmpty(scheduledStationAet))
                {
                    exams = exams.Where(x => x.ScheduledAET == scheduledStationAet);
                }

                if (procedureStep.TryGetSingleValue(DicomTag.Modality, out string modality) && !string.IsNullOrEmpty(modality))
                {
                    exams = exams.Where(x => x.Modality == modality);
                }

                if (procedureStep.TryGetSingleValue(DicomTag.PerformingPhysicianName, out string performingPhysician) && !string.IsNullOrEmpty(performingPhysician))
                {
                    exams = exams.Where(x => x.PerformingPhysician == performingPhysician);
                }

                if (procedureStep.TryGetSingleValue(DicomTag.ScheduledProcedureStepLocation, out string procedureStepLocation) && !string.IsNullOrEmpty(procedureStepLocation))
                {
                    exams = exams.Where(x => x.ExamRoom == procedureStepLocation);
                }

                if (procedureStep.TryGetSingleValue(DicomTag.ScheduledProcedureStepDescription, out string procedureStepDescription) && !string.IsNullOrEmpty(procedureStepDescription))
                {
                    exams = exams.Where(x => x.ExamDescription == procedureStepDescription);
                }

                if (procedureStep.TryGetSingleValue(DicomTag.ScheduledProcedureStepStartDateTime, out string scheduledStartDateTime) && !string.IsNullOrEmpty(scheduledStartDateTime))
                {
                    if (scheduledStartDateTime != "*")
                    {
                        var dateRange = new DicomDateTime(DicomTag.ScheduledProcedureStepStartDate, scheduledStartDateTime).Get <DicomDateRange>();
                        exams = exams.Where(x => dateRange.Contains(x.ExamDateAndTime));
                    }
                }
            }

            var results = exams.AsEnumerable();

            foreach (var item in results)
            {
                var resultDataset = new DicomDataset();

                AddIfExistsInRequest(resultDataset, request, DicomTag.AccessionNumber, item.AccessionNumber);
                AddIfExistsInRequest(resultDataset, request, DicomTag.InstitutionName, item.HospitalName);
                AddIfExistsInRequest(resultDataset, request, DicomTag.ReferringPhysicianName, item.ReferringPhysician);
                AddIfExistsInRequest(resultDataset, request, DicomTag.PatientName, item.PatientName);
                AddIfExistsInRequest(resultDataset, request, DicomTag.PatientID, item.PatientID);
                AddIfExistsInRequest(resultDataset, request, DicomTag.PatientBirthDate, item.DateOfBirth);
                AddIfExistsInRequest(resultDataset, request, DicomTag.PatientAge, item.Age);
                AddIfExistsInRequest(resultDataset, request, DicomTag.PatientSex, item.Sex);
                AddIfExistsInRequest(resultDataset, request, DicomTag.StudyInstanceUID, item.StudyUID);
                AddIfExistsInRequest(resultDataset, request, DicomTag.RequestingPhysician, item.ReferringPhysician);
                AddIfExistsInRequest(resultDataset, request, DicomTag.RequestedProcedureDescription, item.ExamDescription);
                AddIfExistsInRequest(resultDataset, request, DicomTag.RequestedProcedureID, item.ProcedureID);

                if (procedureStep != null)
                {
                    var resultingSps = new DicomDataset();

                    AddIfExistsInRequest(resultingSps, procedureStep, DicomTag.ScheduledStationAETitle, item.ScheduledAET);
                    AddIfExistsInRequest(resultingSps, procedureStep, DicomTag.ScheduledProcedureStepStartDate, item.ExamDateAndTime);
                    AddIfExistsInRequest(resultingSps, procedureStep, DicomTag.ScheduledProcedureStepStartTime, item.ExamDateAndTime);
                    AddIfExistsInRequest(resultingSps, procedureStep, DicomTag.Modality, item.Modality);
                    AddIfExistsInRequest(resultingSps, procedureStep, DicomTag.ScheduledPerformingPhysicianName, item.PerformingPhysician);
                    AddIfExistsInRequest(resultingSps, procedureStep, DicomTag.ScheduledProcedureStepDescription, item.ExamDescription);
                    AddIfExistsInRequest(resultingSps, procedureStep, DicomTag.ScheduledProcedureStepID, item.ProcedureStepID);
                    AddIfExistsInRequest(resultingSps, procedureStep, DicomTag.ScheduledStationName, item.ExamRoom);
                    AddIfExistsInRequest(resultingSps, procedureStep, DicomTag.ScheduledProcedureStepLocation, item.ExamRoom);

                    resultDataset.Add(new DicomSequence(DicomTag.ScheduledProcedureStepSequence, resultingSps));
                }

                // Put blanks in for unsupported fields which are type 2 (i.e. must have a value even if NULL)
                // In a real server, you may wish to support some or all of these, but they are not commonly supported
                AddIfExistsInRequest(resultDataset, request, DicomTag.ReferencedStudySequence, new DicomDataset());
                AddIfExistsInRequest(resultDataset, request, DicomTag.Priority, string.Empty);
                AddIfExistsInRequest(resultDataset, request, DicomTag.PatientTransportArrangements, string.Empty);
                AddIfExistsInRequest(resultDataset, request, DicomTag.AdmissionID, string.Empty);
                AddIfExistsInRequest(resultDataset, request, DicomTag.CurrentPatientLocation, string.Empty);
                AddIfExistsInRequest(resultDataset, request, DicomTag.ReferencedPatientSequence, new DicomDataset());
                AddIfExistsInRequest(resultDataset, request, DicomTag.PatientWeight, string.Empty);
                AddIfExistsInRequest(resultDataset, request, DicomTag.ConfidentialityConstraintOnPatientDataDescription, string.Empty);

                // Send Reponse Back
                yield return(resultDataset);
            }
        }
Ejemplo n.º 11
0
        public static List <DicomDataset> QueryWorklistItems(DicomDataset request)
        {
            if (_isRealTime)
            {
                //记录查询时间
                System.Diagnostics.Stopwatch stopWatch1 = new System.Diagnostics.Stopwatch();
                stopWatch1.Start();
                DateTime dtRequestBeg = DateTime.Now;
                Logger.Info($">>QueryWorklistItems CreateWorklistQuery BeginTime: {dtRequestBeg.ToString("yyyy-MM-dd HH:mm:ss")}");
                Log.Loger($">>QueryWorklistItems 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);
                string   patientId = string.Empty;

                if (!request.TryGetSingleValue(DicomTag.PatientID, out patientId))
                {
                    patientId = null;
                }
                if (request.Contains(DicomTag.ScheduledProcedureStepSequence))
                {
                    DicomDataset procedureStep = request.GetSequence(DicomTag.ScheduledProcedureStepSequence).First();

                    var scheduledProcedureStepStartDate = procedureStep.GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepStartDate, string.Empty);
                    var scheduledProcedureStepEndDate   = procedureStep.GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepEndDate, string.Empty);
                    Logger.Info($"Exam scheduledProcedureStepStartDate: {scheduledProcedureStepStartDate}");
                    Log.Loger($"Exam scheduledProcedureStepStartDate: {scheduledProcedureStepStartDate}");
                    Logger.Info($"Exam scheduledProcedureStepEndDate: {scheduledProcedureStepEndDate}");
                    Log.Loger($"Exam scheduledProcedureStepEndDate: {scheduledProcedureStepEndDate}");

                    var index = scheduledProcedureStepStartDate.IndexOf("-");
                    if (index >= 0)
                    {
                        scheduledProcedureStepEndDate = scheduledProcedureStepStartDate.Substring(index + 1);
                        Logger.Info($"Exam New scheduledProcedureStepEndDate: {scheduledProcedureStepEndDate}");
                        Log.Loger($"Exam New scheduledProcedureStepEndDate: {scheduledProcedureStepEndDate}");

                        scheduledProcedureStepStartDate = scheduledProcedureStepStartDate.Substring(0, index);
                        Logger.Info($"Exam New scheduledProcedureStepStartDate: {scheduledProcedureStepStartDate}");
                        Log.Loger($"Exam New scheduledProcedureStepStartDate: {scheduledProcedureStepStartDate}");
                    }
                    scheduledProcedureStepStartDate = scheduledProcedureStepStartDate.Replace(":", "").Replace(" ", "");
                    scheduledProcedureStepEndDate   = scheduledProcedureStepEndDate.Replace(":", "").Replace(" ", "");

                    if (!string.IsNullOrEmpty(scheduledProcedureStepStartDate) && scheduledProcedureStepStartDate != "*")
                    {
                        startDate = new DicomDateTime(DicomTag.ScheduledProcedureStepStartDate, scheduledProcedureStepStartDate).Get <System.DateTime>();
                    }
                    if (!string.IsNullOrEmpty(scheduledProcedureStepEndDate) && scheduledProcedureStepEndDate != "*")
                    {
                        endDate = new DicomDateTime(DicomTag.ScheduledProcedureStepStartDate, scheduledProcedureStepEndDate).Get <System.DateTime>();
                    }
                }

                DicomDateRange dr    = new DicomDateRange(startDate, endDate);
                var            cfind = DicomCFindRequest.CreateWorklistQuery(patientId, 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");

                var newWorklistItems = GetWorkList(cfind);
                Logger.Info($"Get new work list, length: {newWorklistItems.Count}");
                Log.Loger($"Get new work list, length: {newWorklistItems.Count}");
                return(newWorklistItems);
            }
            else
            {
                if (CurrentWorklistItems != null && CurrentWorklistItems.Count == 0)
                {
                    var newWorklistItems = GetCachedWorklist();
                    Logger.Info($"Get new work list, length: {newWorklistItems.Count}");
                    Log.Loger($"Get new work list, length: {newWorklistItems.Count}");
                    CurrentWorklistItems = newWorklistItems;
                }
                return(CurrentWorklistItems);
            }
        }
Ejemplo n.º 12
0
        public static DateTimeObject[] ParseDicomDateTime(DicomDateTime item)
        {
            EnsureArg.IsNotNull(item, nameof(item));

            return(item.Get <string[]>().Select(ParseDicomDateTime).ToArray());
        }
Ejemplo n.º 13
0
        private static DicomItem CreateDicomItem(DicomTag tag, BsonValue data, DicomVR vr = null)
        {
            // Ok to throw an exception here - we should always be writing the VR into the Bson document if it's ambiguous
            if (vr == null)
            {
                vr = tag.DictionaryEntry.ValueRepresentations.Single();
            }

            DicomItem item;

            switch (vr.Code)
            {
            case "AE":
                item = new DicomApplicationEntity(tag, GetString(data));
                break;

            case "AS":
                item = new DicomAgeString(tag, GetString(data));
                break;

            case "AT":
                item = ParseAttributeTag(tag, data);
                break;

            case "CS":
                item = new DicomCodeString(tag, GetString(data));
                break;

            case "DA":
                item = new DicomDate(tag, GetString(data));
                break;

            case "DS":
                item = new DicomDecimalString(tag, GetString(data));
                break;

            case "DT":
                item = new DicomDateTime(tag, GetString(data));
                break;

            case "FD":
                item = new DicomFloatingPointDouble(tag, (double[])GetTypedArray <double>(data));
                break;

            case "FL":
                item = new DicomFloatingPointSingle(tag, (float[])GetTypedArray <float>(data));
                break;

            case "IS":
                item = new DicomIntegerString(tag, GetString(data));
                break;

            case "LO":
                item = new DicomLongString(tag, Encoding.UTF8, GetString(data));
                break;

            case "LT":
                item = new DicomLongText(tag, Encoding.UTF8, GetString(data));
                break;

            case "OB":
                item = data.IsBsonNull
                        ? new DicomOtherByte(tag)
                        : new DicomOtherByte(tag, data.AsByteArray);
                break;

            case "OD":
                item = new DicomOtherDouble(tag, (double[])GetTypedArray <double>(data));
                break;

            case "OF":
                item = new DicomOtherFloat(tag, (float[])GetTypedArray <float>(data));
                break;

            case "OL":
                item = new DicomOtherLong(tag, (uint[])GetTypedArray <uint>(data));
                break;

            case "OW":
                item = data.IsBsonNull
                        ? new DicomOtherWord(tag)
                        : new DicomOtherWord(tag, (ushort[])GetTypedArray <ushort>(data));
                break;

            case "PN":
                item = new DicomPersonName(tag, Encoding.UTF8, GetString(data));
                break;

            case "SH":
                item = new DicomShortString(tag, Encoding.UTF8, GetString(data));
                break;

            case "SL":
                item = new DicomSignedLong(tag, (int[])GetTypedArray <int>(data));
                break;

            case "SS":
                item = new DicomSignedShort(tag, (short[])GetTypedArray <short>(data));
                break;

            case "ST":
                item = new DicomShortText(tag, Encoding.UTF8, GetString(data));
                break;

            case "SQ":
                item = GetDicomSequence(tag, data);
                break;

            case "TM":
                item = new DicomTime(tag, GetString(data));
                break;

            case "UC":
                item = new DicomUnlimitedCharacters(tag, Encoding.UTF8, GetString(data));
                break;

            case "UI":
                item = new DicomUniqueIdentifier(tag, GetString(data));
                break;

            case "UL":
                item = new DicomUnsignedLong(tag, (uint[])GetTypedArray <uint>(data));
                break;

            case "UN":
                item = data.IsBsonNull
                        ? new DicomUnknown(tag)
                        : new DicomUnknown(tag, (byte[])GetTypedArray <byte>(data));
                break;

            case "UR":
                item = new DicomUniversalResource(tag, Encoding.UTF8, GetString(data));
                break;

            case "US":
                item = new DicomUnsignedShort(tag, (ushort[])GetTypedArray <ushort>(data));
                break;

            case "UT":
                item = new DicomUnlimitedText(tag, Encoding.UTF8, GetString(data));
                break;

            default:
                throw new NotSupportedException($"Unsupported value representation {vr}");
            }

            return(item);
        }
Ejemplo n.º 14
0
        public static IEnumerable <DicomDataset> FilterWorklistItemsByDataset(DicomDataset request, List <DicomDataset> allDatasetItems, Logger Logger)
        {
            var exams = allDatasetItems.AsQueryable();

            if (request.TryGetSingleValue(DicomTag.PatientID, out string patientId))
            {
                if (patientId != "*")
                {
                    Logger.Info($"Exam patientId: {patientId}");
                    Log.Loger($"Exam patientId: {patientId}");
                    exams = exams.Where(x => x.GetSingleValue <string>(DicomTag.PatientID).Equals(patientId));
                }
            }

            /*      var patientName = request.GetSingleValueOrDefault(DicomTag.PatientName, string.Empty);
             *    if (!string.IsNullOrEmpty(patientName))
             *    {
             *        Logger.Info($"Exam patientName: {patientName}");
             *        exams = exams.Where(x => x.GetSingleValueOrDefault<string>(DicomTag.PatientName, string.Empty).Contains(patientName));
             *    }
             */
            if (request.Contains(DicomTag.ScheduledProcedureStepSequence))
            {
                DicomDataset procedureStep = request.GetSequence(DicomTag.ScheduledProcedureStepSequence).First();

                var scheduledProcedureStepStartDate = procedureStep.GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepStartDate, string.Empty);
                var scheduledProcedureStepEndDate   = procedureStep.GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepEndDate, string.Empty);
                Logger.Info($"Exam scheduledProcedureStepStartDate: {scheduledProcedureStepStartDate}");
                Log.Loger($"Exam scheduledProcedureStepStartDate: {scheduledProcedureStepStartDate}");
                Logger.Info($"Exam scheduledProcedureStepEndDate: {scheduledProcedureStepEndDate}");
                Log.Loger($"Exam scheduledProcedureStepEndDate: {scheduledProcedureStepEndDate}");

                var index = scheduledProcedureStepStartDate.IndexOf("-");
                if (index >= 0)
                {
                    scheduledProcedureStepEndDate = scheduledProcedureStepStartDate.Substring(index + 1);
                    Logger.Info($"Exam New scheduledProcedureStepEndDate: {scheduledProcedureStepEndDate}");
                    Log.Loger($"Exam New scheduledProcedureStepEndDate: {scheduledProcedureStepEndDate}");

                    scheduledProcedureStepStartDate = scheduledProcedureStepStartDate.Substring(0, index);
                    Logger.Info($"Exam New scheduledProcedureStepStartDate: {scheduledProcedureStepStartDate}");
                    Log.Loger($"Exam New scheduledProcedureStepStartDate: {scheduledProcedureStepStartDate}");
                }

                if (!string.IsNullOrEmpty(scheduledProcedureStepStartDate) && scheduledProcedureStepStartDate != "*" &&
                    !string.IsNullOrEmpty(scheduledProcedureStepEndDate) && scheduledProcedureStepEndDate != "*")
                {
                    var st    = new DicomDateTime(DicomTag.ScheduledProcedureStepStartDate, scheduledProcedureStepStartDate).Get <System.DateTime>();
                    var et    = new DicomDateTime(DicomTag.ScheduledProcedureStepEndDate, scheduledProcedureStepEndDate).Get <System.DateTime>();
                    var range = new DicomDateRange(st, et);
                    exams = exams.Where(x => range.Contains(System.DateTime.ParseExact(x.GetSequence(DicomTag.ScheduledProcedureStepSequence).First().GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepStartDate, string.Empty), "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture)));
                }
                else if (string.IsNullOrEmpty(scheduledProcedureStepStartDate))
                {
                    // if no start date is specified, we just query today's data
                    System.DateTime endDate   = System.DateTime.Today.AddDays(1).AddSeconds(-1);
                    System.DateTime startDate = System.DateTime.Today;
                    DicomDateRange  range     = new DicomDateRange(startDate, endDate);
                    exams = exams.Where(x => range.Contains(System.DateTime.ParseExact(x.GetSequence(DicomTag.ScheduledProcedureStepSequence).First().GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepStartDate, string.Empty), "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture)));
                }
            }



            /*
             * var scheduledProcedureStepStartDateTime = request.GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepStartDateTime, string.Empty);
             * if (!string.IsNullOrEmpty(scheduledProcedureStepStartDateTime) && scheduledProcedureStepStartDateTime != "*")
             * {
             *  DicomDateRange range = new DicomDateTime(DicomTag.ScheduledProcedureStepStartDate, scheduledProcedureStepStartDateTime).Get<DicomDateRange>();
             *  exams = exams.Where(x => range.Contains(System.DateTime.Parse(x.GetSingleValueOrDefault<string>(DicomTag.ScheduledProcedureStepStartDateTime, string.Empty))));
             * }
             */

            var results = exams.ToList();

            Logger.Info($"Exam Resutls number: {results.Count}");
            Log.Loger($"Exam Resutls number: {results.Count}");

            //  Parsing result
            foreach (var result in results)
            {
                string log = WorklistItemsProvider.LogToConsole(result);
                Logger.Info(log);
                Log.Loger(log);
                // Send Reponse Back
                yield return(result);
            }
        }
Ejemplo n.º 15
0
        public static IEnumerable <DicomDataset> NewFilterWLIteamsByDataset(DicomDataset request, List <DicomDataset> allDatasetItems, Logger Logger)
        {
            var exams = allDatasetItems.AsQueryable();

            if (request.TryGetSingleValue(DicomTag.PatientID, out string patientId))
            {
                if (patientId != "*" && !string.IsNullOrEmpty(patientId))
                {
                    Logger.Info($"Exam patientId: {patientId}");
                    Log.Loger($"Exam patientId: {patientId}");
                    exams = exams.Where(x => x.GetSingleValue <string>(DicomTag.PatientID).Equals(patientId));
                }
            }
            if (request.Contains(DicomTag.ScheduledProcedureStepSequence))
            {
                DicomDataset procedureStep = request.GetSequence(DicomTag.ScheduledProcedureStepSequence).First();

                var scheduledProcedureStepStartDate = procedureStep.GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepStartDate, string.Empty);
                var scheduledProcedureStepEndDate   = procedureStep.GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepEndDate, string.Empty);
                Logger.Info($"Exam scheduledProcedureStepStartDate: {scheduledProcedureStepStartDate}");
                Log.Loger($"Exam scheduledProcedureStepStartDate: {scheduledProcedureStepStartDate}");
                Logger.Info($"Exam scheduledProcedureStepEndDate: {scheduledProcedureStepEndDate}");
                Log.Loger($"Exam scheduledProcedureStepEndDate: {scheduledProcedureStepEndDate}");

                var index = scheduledProcedureStepStartDate.IndexOf("-");
                if (index >= 0)
                {
                    scheduledProcedureStepEndDate = scheduledProcedureStepStartDate.Substring(index + 1);
                    Logger.Info($"Exam New scheduledProcedureStepEndDate: {scheduledProcedureStepEndDate}");
                    Log.Loger($"Exam New scheduledProcedureStepEndDate: {scheduledProcedureStepEndDate}");

                    scheduledProcedureStepStartDate = scheduledProcedureStepStartDate.Substring(0, index);
                    Logger.Info($"Exam New scheduledProcedureStepStartDate: {scheduledProcedureStepStartDate}");
                    Log.Loger($"Exam New scheduledProcedureStepStartDate: {scheduledProcedureStepStartDate}");
                }
                scheduledProcedureStepStartDate = scheduledProcedureStepStartDate.Replace(":", "").Replace(" ", "");
                scheduledProcedureStepEndDate   = scheduledProcedureStepEndDate.Replace(":", "").Replace(" ", "");

                if (!string.IsNullOrEmpty(scheduledProcedureStepStartDate) && scheduledProcedureStepStartDate != "*")
                {
                    var st = new DicomDateTime(DicomTag.ScheduledProcedureStepStartDate, scheduledProcedureStepStartDate).Get <System.DateTime>();
                    exams = exams.Where(x => st <= System.DateTime.ParseExact(
                                            x.GetSequence(DicomTag.ScheduledProcedureStepSequence).First().GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepStartDate, string.Empty)
                                            + x.GetSequence(DicomTag.ScheduledProcedureStepSequence).First().GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepStartTime, string.Empty)
                                            , "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture));
                }
                if (!string.IsNullOrEmpty(scheduledProcedureStepEndDate) && scheduledProcedureStepEndDate != "*")
                {
                    var et = new DicomDateTime(DicomTag.ScheduledProcedureStepStartDate, scheduledProcedureStepEndDate).Get <System.DateTime>();
                    exams = exams.Where(x => et >= System.DateTime.ParseExact(
                                            x.GetSequence(DicomTag.ScheduledProcedureStepSequence).First().GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepStartDate, string.Empty)
                                            + x.GetSequence(DicomTag.ScheduledProcedureStepSequence).First().GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepStartTime, string.Empty)
                                            , "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture));
                }
            }
            //仅到检
            var appConfig = System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Reflection.Assembly.GetExecutingAssembly().Location);

            if (appConfig.AppSettings.Settings.AllKeys.Contains("isOnlyArrived"))
            {
                bool _isOnlyArrived = appConfig.AppSettings.Settings["isOnlyArrived"].Value.ToString() == "1";
                if (_isOnlyArrived)
                {
                    exams = exams.Where(o => o.GetSequence(DicomTag.ScheduledProcedureStepSequence).First().GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepStatus, string.Empty) == "ARRIVED");
                }
            }
            //exams = exams.Where(o => o.GetSequence(DicomTag.ScheduledProcedureStepSequence).First().GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepStatus, string.Empty) == "ARRIVED");

            var results = exams.ToList();

            Logger.Info($"Exam Resutls number: {results.Count}");
            Log.Loger($"Exam Resutls number: {results.Count}");

            //  Parsing result
            foreach (var result in results)
            {
                string log = WorklistItemsProvider.LogToConsole(result);
                Logger.Info(log);
                Log.Loger(log);
                // Send Reponse Back
                yield return(result);
            }
        }
Ejemplo n.º 16
0
        private static DicomItem CreateDicomItem(DicomTag tag, string vr, object data)
        {
            DicomItem item;

            switch (vr)
            {
            case "AE":
                item = new DicomApplicationEntity(tag, (string[])data);
                break;

            case "AS":
                item = new DicomAgeString(tag, (string[])data);
                break;

            case "AT":
                item = new DicomAttributeTag(tag, ((string[])data).Select(ParseTag).ToArray());
                break;

            case "CS":
                item = new DicomCodeString(tag, (string[])data);
                break;

            case "DA":
                item = new DicomDate(tag, (string[])data);
                break;

            case "DS":
                if (data is IByteBuffer dataBufferDS)
                {
                    item = new DicomDecimalString(tag, dataBufferDS);
                }
                else if (data is decimal[] dataAsNumbers)
                {
                    item = new DicomDecimalString(tag, dataAsNumbers);
                }
                else
                {
                    item = new DicomDecimalString(tag, (string[])data);
                }
                break;

            case "DT":
                item = new DicomDateTime(tag, (string[])data);
                break;

            case "FD":
                if (data is IByteBuffer dataBufferFD)
                {
                    item = new DicomFloatingPointDouble(tag, dataBufferFD);
                }
                else
                {
                    item = new DicomFloatingPointDouble(tag, (double[])data);
                }
                break;

            case "FL":
                if (data is IByteBuffer dataBufferFL)
                {
                    item = new DicomFloatingPointSingle(tag, dataBufferFL);
                }
                else
                {
                    item = new DicomFloatingPointSingle(tag, (float[])data);
                }
                break;

            case "IS":
                if (data is IByteBuffer dataBufferIS)
                {
                    item = new DicomIntegerString(tag, dataBufferIS);
                }
                else if (data is string[] dataAsStrings)
                {
                    item = new DicomIntegerString(tag, dataAsStrings);
                }
                else
                {
                    item = new DicomIntegerString(tag, (int[])data);
                }
                break;

            case "LO":
                item = new DicomLongString(tag, (string[])data);
                break;

            case "LT":
                if (data is IByteBuffer dataBufferLT)
                {
                    item = new DicomLongText(tag, _jsonTextEncodings, dataBufferLT);
                }
                else
                {
                    item = new DicomLongText(tag, data.AsStringArray().SingleOrEmpty());
                }
                break;

            case "OB":
                item = new DicomOtherByte(tag, (IByteBuffer)data);
                break;

            case "OD":
                item = new DicomOtherDouble(tag, (IByteBuffer)data);
                break;

            case "OF":
                item = new DicomOtherFloat(tag, (IByteBuffer)data);
                break;

            case "OL":
                item = new DicomOtherLong(tag, (IByteBuffer)data);
                break;

            case "OW":
                item = new DicomOtherWord(tag, (IByteBuffer)data);
                break;

            case "OV":
                item = new DicomOtherVeryLong(tag, (IByteBuffer)data);
                break;

            case "PN":
                item = new DicomPersonName(tag, (string[])data);
                break;

            case "SH":
                item = new DicomShortString(tag, (string[])data);
                break;

            case "SL":
                if (data is IByteBuffer dataBufferSL)
                {
                    item = new DicomSignedLong(tag, dataBufferSL);
                }
                else
                {
                    item = new DicomSignedLong(tag, (int[])data);
                }
                break;

            case "SQ":
                item = new DicomSequence(tag, ((DicomDataset[])data));
                break;

            case "SS":
                if (data is IByteBuffer dataBufferSS)
                {
                    item = new DicomSignedShort(tag, dataBufferSS);
                }
                else
                {
                    item = new DicomSignedShort(tag, (short[])data);
                }
                break;

            case "ST":
                if (data is IByteBuffer dataBufferST)
                {
                    item = new DicomShortText(tag, _jsonTextEncodings, dataBufferST);
                }
                else
                {
                    item = new DicomShortText(tag, data.AsStringArray().FirstOrEmpty());
                }
                break;

            case "SV":
                if (data is IByteBuffer dataBufferSV)
                {
                    item = new DicomSignedVeryLong(tag, dataBufferSV);
                }
                else if (data is string[] dataAsStrings)
                {
                    var dataAsLongs = dataAsStrings.Select(s => long.Parse(s)).ToArray();
                    item = new DicomSignedVeryLong(tag, dataAsLongs);
                }
                else
                {
                    item = new DicomSignedVeryLong(tag, (long[])data);
                }
                break;

            case "TM":
                item = new DicomTime(tag, (string[])data);
                break;

            case "UC":
                if (data is IByteBuffer dataBufferUC)
                {
                    item = new DicomUnlimitedCharacters(tag, _jsonTextEncodings, dataBufferUC);
                }
                else
                {
                    item = new DicomUnlimitedCharacters(tag, data.AsStringArray().SingleOrDefault());
                }
                break;

            case "UI":
                item = new DicomUniqueIdentifier(tag, (string[])data);
                break;

            case "UL":
                if (data is IByteBuffer dataBufferUL)
                {
                    item = new DicomUnsignedLong(tag, dataBufferUL);
                }
                else
                {
                    item = new DicomUnsignedLong(tag, (uint[])data);
                }
                break;

            case "UN":
                item = new DicomUnknown(tag, (IByteBuffer)data);
                break;

            case "UR":
                item = new DicomUniversalResource(tag, data.AsStringArray().SingleOrEmpty());
                break;

            case "US":
                if (data is IByteBuffer dataBufferUS)
                {
                    item = new DicomUnsignedShort(tag, dataBufferUS);
                }
                else
                {
                    item = new DicomUnsignedShort(tag, (ushort[])data);
                }
                break;

            case "UT":
                if (data is IByteBuffer dataBufferUT)
                {
                    item = new DicomUnlimitedText(tag, _jsonTextEncodings, dataBufferUT);
                }
                else
                {
                    item = new DicomUnlimitedText(tag, data.AsStringArray().SingleOrEmpty());
                }
                break;

            case "UV":
                if (data is IByteBuffer dataBufferUV)
                {
                    item = new DicomUnsignedVeryLong(tag, dataBufferUV);
                }
                else if (data is string[] dataAsStrings)
                {
                    var dataAsULongs = dataAsStrings.Select(s => ulong.Parse(s)).ToArray();
                    item = new DicomUnsignedVeryLong(tag, dataAsULongs);
                }
                else
                {
                    item = new DicomUnsignedVeryLong(tag, (ulong[])data);
                }
                break;

            default:
                throw new NotSupportedException("Unsupported value representation");
            }
            return(item);
        }