Example #1
0
        public void OverwriteRegisteredEncoding()
        {
            var ds = new DicomDataset
            {
                new DicomCodeString(DicomTag.SpecificCharacterSet, "ISO IR 144"),
            };

            try
            {
                // patch the encoding - without this, the name would display as gibberish
                DicomEncoding.RegisterEncoding("ISO IR 144", "koi8-r");

                // Грозный^Иван encoded in KOI-8 instead of iso-8859-5
                var         koi8Name    = new byte[] { 0xe7, 0xd2, 0xcf, 0xda, 0xce, 0xd9, 0xca, 0x5e, 0xe9, 0xd7, 0xc1, 0xce };
                IByteBuffer buffer      = new MemoryByteBuffer(koi8Name);
                var         patientName = new DicomPersonName(DicomTag.PatientName, ds.GetEncodingsForSerialization(), buffer);
                ds.Add(patientName); // patient name would show gibberish
                Assert.Equal("Грозный^Иван", ds.GetString(DicomTag.PatientName));
            }
            finally
            {
                // set back the correct encoding to avoid breaking other tests
                DicomEncoding.RegisterEncoding("ISO IR 144", "iso-8859-5");
            }
        }
Example #2
0
        private static void WriteJsonPersonName(JsonWriter writer, DicomPersonName pn)
        {
            if (pn.Count != 0)
            {
                writer.WritePropertyName("Value");
                writer.WriteStartArray();

                foreach (var val in pn.Get <string[]>())
                {
                    if (string.IsNullOrEmpty(val))
                    {
                        writer.WriteNull();
                    }
                    else
                    {
                        writer.WriteStartObject();
                        writer.WritePropertyName("Alphabetic");
                        writer.WriteValue(val);
                        writer.WriteEndObject();
                    }
                }

                writer.WriteEndArray();
            }
        }
Example #3
0
 public void DicomPersonName_TwoNames_YieldsTwoValues()
 {
     var element = new DicomPersonName(DicomTag.ConsultingPhysicianName, new [] { "Doe^John", "Bar^Foo"});
     var actual = element.Get<string[]>();
     Assert.Equal(2, actual.Length);
     Assert.Equal("Bar^Foo", actual[1]);
 }
        [InlineData("0123456789012345678901234567890123456789012345678901234567890123456789", ValidationErrorCode.PersonNameGroupExceedMaxLength)] // group is too long
        public void GivenInvalidPatientName_WhenValidating_ThenShouldThrow(string value, ValidationErrorCode errorCode)
        {
            DicomElement element = new DicomPersonName(DicomTag.PatientName, value);
            var          ex      = Assert.Throws <ElementValidationException>(() => new PersonNameValidation().Validate(element));

            Assert.Equal(errorCode, ex.ErrorCode);
        }
Example #5
0
        public void AsciiUsedIfEncodingIsNotInCharacterSet()
        {
            var ds = new DicomDataset
            {
                new DicomCodeString(DicomTag.SpecificCharacterSet, @"\ISO 2022 IR 100")
            };
            var logCollector = NewLogCollector();

            // Buc^Jérôme encoded, but with the escape sequence  for the second component
            // pointing to shift_jis instead of Latin-1
            var name = new byte[]
            { 0x1b, 0x2d, 0x41, 0x42, 0x75, 0x63, 0x5e, 0x1b, 0x28, 0x4a, 0x4a, 0xe9, 0x72, 0xf4, 0x6d, 0x65 };
            IByteBuffer buffer      = new MemoryByteBuffer(name);
            var         patientName = new DicomPersonName(DicomTag.PatientName, ds.GetEncodingsForSerialization(), buffer);

            ds.Add(patientName);
            Assert.Equal("Buc^J?r?me", ds.GetString(DicomTag.PatientName));
            Assert.Equal(2, logCollector.NumberOfWarnings);
            var expectedMessage =
                "Found escape sequence for 'shift_jis', which is not defined";

            Assert.StartsWith(expectedMessage, logCollector.WarningAt(0));
            expectedMessage =
                "Could not decode string 'J?r?me' with given encoding, using replacement characters.";
            Assert.Equal(expectedMessage, logCollector.WarningAt(1));
        }
Example #6
0
        public void AsciiUsedForUnknownEscapeSequence()
        {
            var ds = new DicomDataset
            {
                new DicomCodeString(DicomTag.SpecificCharacterSet, @"\ISO 2022 IR 100")
            };
            var logCollector = NewLogCollector();

            // Buc^Jérôme encoded, but with an invalid escape sequence instead of Latin-1 for the second component
            var name = new byte[]
            { 0x1b, 0x2d, 0x41, 0x42, 0x75, 0x63, 0x5e, 0x1b, 0x28, 0x4b, 0x4a, 0xe9, 0x72, 0xf4, 0x6d, 0x65 };
            IByteBuffer buffer      = new MemoryByteBuffer(name);
            var         patientName = new DicomPersonName(DicomTag.PatientName, ds.GetEncodingsForSerialization(), buffer);

            ds.Add(patientName);
            Assert.Equal("Buc^J?r?me", ds.GetString(DicomTag.PatientName));
            Assert.Equal(2, logCollector.NumberOfWarnings);
            var expectedMessage =
                "Unknown escape sequence found in string, using ASCII encoding.";

            Assert.Equal(expectedMessage, logCollector.WarningAt(0));
            expectedMessage =
                "Could not decode string 'J?r?me' with given encoding, using replacement characters.";
            Assert.Equal(expectedMessage, logCollector.WarningAt(1));
        }
Example #7
0
 private DPersonName(DicomPersonName name)
 {
     _name        = name;
     _single_byte = true;
     _ideograph   = true;
     _phonetic    = true;
 }
Example #8
0
        public void DicomPersonName_FamilyAndSurname_YieldsCompositeName()
        {
            var element = new DicomPersonName(DicomTag.ConsultingPhysicianName, "Doe", "John");
            var actual  = element.Get <string>(0);

            Assert.Equal("Doe^John", actual);
        }
Example #9
0
        protected virtual void WriteVR_PN(DicomElement element, XmlWriter writer)
        {
            for (int index = 0; index < element.Count; index++)
            {
                writer.WriteStartElement(Constants.PN_PERSON_NAME);
                WriteNumberAttrib(writer, index);

                var pnComponents = GetTrimmedString(element.Get <string> ( )).Split('=');

                for (int compIndex = 0; (compIndex < pnComponents.Length) && (compIndex < 3); compIndex++)
                {
                    writer.WriteStartElement(Utilities.PersonNameComponents.PN_Components[compIndex]);

                    DicomPersonName pn = new DicomPersonName(element.Tag, pnComponents[compIndex]);

                    writer.WriteElementString(Utilities.PersonNameParts.PN_Family, pn.Last);
                    writer.WriteElementString(Utilities.PersonNameParts.PN_Given, pn.First);
                    writer.WriteElementString(Utilities.PersonNameParts.PN_Midlle, pn.Middle);
                    writer.WriteElementString(Utilities.PersonNameParts.PN_Prefix, pn.Prefix);
                    writer.WriteElementString(Utilities.PersonNameParts.PN_Suffix, pn.Suffix);

                    writer.WriteEndElement( );
                }
                writer.WriteEndElement( );
            }
        }
Example #10
0
        public void DicomPersonName_TwoNames_YieldsTwoValues()
        {
            var element = new DicomPersonName(DicomTag.ConsultingPhysicianName, new[] { "Doe^John", "Bar^Foo" });
            var actual  = element.Get <string[]>();

            Assert.Equal(2, actual.Length);
            Assert.Equal("Bar^Foo", actual[1]);
        }
Example #11
0
 internal static DPersonName FromPersonName(DicomPersonName name)
 {
     if (name == null)
     {
         return(null);
     }
     return(new DPersonName(name));
 }
Example #12
0
 public void MiddleTest()
 {
     DicomPersonName target = new DicomPersonName(DicomTag.PatientName, "Last", "First", "Middle", "Prefix", "Suffix");
     Assert.Equal("Middle", target.Middle);
     target = new DicomPersonName(DicomTag.PatientName, "Last^First");
     Assert.Equal("", target.Middle);
     target = new DicomPersonName(DicomTag.PatientName, "Last^First=Doe^John^Peter");
     Assert.Equal("", target.Middle);
 }
Example #13
0
 public void LastTest()
 {
     DicomPersonName target = new DicomPersonName(DicomTag.PatientName, "Last", "First", "Middle", "Prefix", "Suffix");
     Assert.Equal("Last", target.Last);
     target = new DicomPersonName(DicomTag.PatientName, "");
     Assert.Equal("", target.Last);
     target = new DicomPersonName(DicomTag.PatientName, "=Doe^John");
     Assert.Equal("", target.Last);
 }
        public void MiddleTest()
        {
            DicomPersonName target = new DicomPersonName(DicomTag.PatientName, "Last", "First", "Middle", "Prefix", "Suffix");

            Assert.AreEqual("Middle", target.Middle);
            target = new DicomPersonName(DicomTag.PatientName, "Last^First");
            Assert.AreEqual("", target.Middle);
            target = new DicomPersonName(DicomTag.PatientName, "Last^First=Doe^John^Peter");
            Assert.AreEqual("", target.Middle);
        }
Example #15
0
        public void PrefixTest()
        {
            var target = new DicomPersonName(DicomTag.PatientName, "Last", "First", "Middle", "Prefix", "Suffix");

            Assert.Equal("Prefix", target.Prefix);
            target = new DicomPersonName(DicomTag.PatientName, "Last");
            Assert.Equal("", target.Prefix);
            target = new DicomPersonName(DicomTag.PatientName, "Last^First^Middle=Doe^John^Peter^MD^xx");
            Assert.Equal("", target.Prefix);
        }
Example #16
0
        public void FirstTest()
        {
            var target = new DicomPersonName(DicomTag.PatientName, "Last", "First", "Middle", "Prefix", "Suffix");

            Assert.Equal("First", target.First);
            target = new DicomPersonName(DicomTag.PatientName, "Last");
            Assert.Equal("", target.First);
            target = new DicomPersonName(DicomTag.PatientName, "Last=Doe^John");
            Assert.Equal("", target.First);
        }
        public void LastTest()
        {
            DicomPersonName target = new DicomPersonName(DicomTag.PatientName, "Last", "First", "Middle", "Prefix", "Suffix");

            Assert.AreEqual("Last", target.Last);
            target = new DicomPersonName(DicomTag.PatientName, "");
            Assert.AreEqual("", target.Last);
            target = new DicomPersonName(DicomTag.PatientName, "=Doe^John");
            Assert.AreEqual("", target.Last);
        }
        public void SuffixTest()
        {
            DicomPersonName target = new DicomPersonName(DicomTag.PatientName, "Last", "First", "Middle", "Prefix", "Suffix");

            Assert.AreEqual("Suffix", target.Suffix);
            target = new DicomPersonName(DicomTag.PatientName, "Last");
            Assert.AreEqual("", target.Suffix);
            target = new DicomPersonName(DicomTag.PatientName, "Last^First^Middle^Prefix=Doe^John^Peter^MD");
            Assert.AreEqual("", target.Suffix);
        }
Example #19
0
 public void DicomPersonNameConstructorTest1()
 {
     DicomPersonName target = new DicomPersonName(DicomTag.PatientName, DicomEncoding.GetEncoding("ISO IR 144"), "Тарковский", "Андрей", "Арсеньевич");
     byte[] b = target.Buffer.GetByteRange(0, (int)target.Buffer.Size);
     byte[] c = Encoding.GetEncoding("iso-8859-5").GetBytes("Тарковский^Андрей^Арсеньевич");
     Assert.Equal(c, b);
     // foloowing test checks also padding with space!
     target = new DicomPersonName(DicomTag.PatientName, DicomEncoding.GetEncoding("ISO IR 144"), "Тарковский", "Андрей");
     b = target.Buffer.GetByteRange(0, (int)target.Buffer.Size);
     c = Encoding.GetEncoding("iso-8859-5").GetBytes("Тарковский^Андрей ");
     Assert.Equal(c, b);
 }
Example #20
0
 public void DicomPersonNameConstructorTest()
 {
     DicomPersonName target = new DicomPersonName(DicomTag.PatientName, "Last", "First", "Middle", "Prefix", "Suffix");
     Assert.AreEqual("Last^First^Middle^Prefix^Suffix", target.Get<string>());
     target = new DicomPersonName(DicomTag.PatientName, "Last", "First", "Middle", "", "");
     Assert.AreEqual("Last^First^Middle", target.Get<string>());
     target = new DicomPersonName(DicomTag.PatientName, "Last", "First", null, "");
     Assert.AreEqual("Last^First", target.Get<string>());
     target = new DicomPersonName(DicomTag.PatientName, "Last", "First", "", null, "Suffix");
     Assert.AreEqual("Last^First^^^Suffix", target.Get<string>());
     target = new DicomPersonName(DicomTag.PatientName, "", "", "", null, null);
     Assert.AreEqual("", target.Get<string>());
 }
        public void DicomPersonNameConstructorTest1()
        {
            DicomPersonName target = new DicomPersonName(DicomTag.PatientName, DicomEncoding.GetEncoding("ISO IR 144"), "Тарковский", "Андрей", "Арсеньевич");

            byte[] b = target.Buffer.GetByteRange(0, (int)target.Buffer.Size);
            byte[] c = Encoding.GetEncoding("iso-8859-5").GetBytes("Тарковский^Андрей^Арсеньевич");
            CollectionAssert.AreEqual(c, b);
            // foloowing test checks also padding with space!
            target = new DicomPersonName(DicomTag.PatientName, DicomEncoding.GetEncoding("ISO IR 144"), "Тарковский", "Андрей");
            b      = target.Buffer.GetByteRange(0, (int)target.Buffer.Size);
            c      = Encoding.GetEncoding("iso-8859-5").GetBytes("Тарковский^Андрей ");
            CollectionAssert.AreEqual(c, b);
        }
Example #22
0
        private string GetPatientName(DicomCFindRequest request)
        {
            var familyName = string.Empty;

            if (request.Dataset.Contains(PatientNameTag))
            {
                DicomPersonName dicomPersonNameItem = request.Dataset.Get <DicomPersonName>(PatientNameTag);
                if (!string.IsNullOrEmpty(dicomPersonNameItem.Last) && dicomPersonNameItem.Last != "*")
                {
                    familyName = dicomPersonNameItem.Last;
                }
            }
            return(familyName);
        }
        public void DicomPersonNameConstructorTest()
        {
            DicomPersonName target = new DicomPersonName(DicomTag.PatientName, "Last", "First", "Middle", "Prefix", "Suffix");

            Assert.AreEqual("Last^First^Middle^Prefix^Suffix", target.Get <string>());
            target = new DicomPersonName(DicomTag.PatientName, "Last", "First", "Middle", "", "");
            Assert.AreEqual("Last^First^Middle", target.Get <string>());
            target = new DicomPersonName(DicomTag.PatientName, "Last", "First", null, "");
            Assert.AreEqual("Last^First", target.Get <string>());
            target = new DicomPersonName(DicomTag.PatientName, "Last", "First", "", null, "Suffix");
            Assert.AreEqual("Last^First^^^Suffix", target.Get <string>());
            target = new DicomPersonName(DicomTag.PatientName, "", "", "", null, null);
            Assert.AreEqual("", target.Get <string>());
        }
Example #24
0
        public void RegisterNewEncoding()
        {
            DicomEncoding.RegisterEncoding("KOI 8", "koi8-r");
            var ds = new DicomDataset
            {
                new DicomCodeString(DicomTag.SpecificCharacterSet, "KOI 8"),
            };
            // Грозный^Иван encoded in KOI-8
            var         koi8Name    = new byte[] { 0xe7, 0xd2, 0xcf, 0xda, 0xce, 0xd9, 0xca, 0x5e, 0xe9, 0xd7, 0xc1, 0xce };
            IByteBuffer buffer      = new MemoryByteBuffer(koi8Name);
            var         patientName = new DicomPersonName(DicomTag.PatientName, ds.GetEncodingsForSerialization(), buffer);

            ds.Add(patientName);

            Assert.Equal("Грозный^Иван", ds.GetString(DicomTag.PatientName));
        }
		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);
		}
Example #26
0
        public void SingleByteCodeExtensions(string encodingName, string expectedName, byte[] rawData)
        {
            var ds = new DicomDataset
            {
                // empty first encoding defaults to ASCII
                new DicomCodeString(DicomTag.SpecificCharacterSet, $"\\{encodingName}"),
            };

            // combine ASCII text with text encoded with another single byte encoding
            // and use the respective code extension
            var         asciiPart = new byte[] { 0x41, 0x53, 0x43, 0x49, 0x49 }; // "ASCII"
            IByteBuffer buffer    = new MemoryByteBuffer(asciiPart.Concat(rawData).ToArray());

            var patientName = new DicomPersonName(DicomTag.PatientName, ds.GetEncodingsForSerialization(), buffer);

            ds.Add(patientName);
            Assert.Equal("ASCII" + expectedName, ds.GetString(DicomTag.PatientName));
        }
Example #27
0
        public void ReplacementCharactersUsedForBadEncoding()
        {
            var ds = new DicomDataset
            {
                new DicomCodeString(DicomTag.SpecificCharacterSet, "ISO IR 192"),
            };
            var logCollector = NewLogCollector();
            // not a valid UTF-8 encoding
            var         badName     = new byte[] { 0xc4, 0xe9, 0xef, 0xed, 0xf5, 0xf3, 0xe9, 0xef, 0xf2 };
            IByteBuffer buffer      = new MemoryByteBuffer(badName);
            var         patientName = new DicomPersonName(DicomTag.PatientName, ds.GetEncodingsForSerialization(), buffer);

            ds.Add(patientName);
            Assert.Equal("���������", ds.GetString(DicomTag.PatientName));
            Assert.Equal(1, logCollector.NumberOfWarnings);
            var expectedMessage =
                "Could not decode string '���������' with given encoding, using replacement characters.";

            Assert.Equal(expectedMessage, logCollector.WarningAt(0));
        }
Example #28
0
        public void DicomPersonNameConstructorTest1()
        {
            var target = new DicomPersonName(DicomTag.PatientName, "Тарковский", "Андрей", "Арсеньевич");

            target.TargetEncoding = DicomEncoding.GetEncoding("ISO IR 144");
            var b = new byte[(int)target.Buffer.Size];

            target.Buffer.GetByteRange(0, (int)target.Buffer.Size, b);
            byte[] c = Encoding.GetEncoding("iso-8859-5").GetBytes("Тарковский^Андрей^Арсеньевич");
            Assert.Equal(c, b);
            // following test checks also padding with space!
            target = new DicomPersonName(DicomTag.PatientName, "Тарковский", "Андрей")
            {
                TargetEncoding = DicomEncoding.GetEncoding("ISO IR 144")
            };
            b = new byte[(int)target.Buffer.Size];
            target.Buffer.GetByteRange(0, (int)target.Buffer.Size, b);
            c = Encoding.GetEncoding("iso-8859-5").GetBytes("Тарковский^Андрей ");
            Assert.Equal(c, b);
        }
Example #29
0
        //Splits patient name into 2 separte strings surname and forename and send then to the addstringcondition subroutine.
        internal static IQueryable <WorklistItem> AddNameCondition(IQueryable <WorklistItem> exams, string dicomName)
        {
            if (string.IsNullOrEmpty(dicomName) || dicomName == "*")
            {
                return(exams);
            }

            DicomPersonName personName = new DicomPersonName(DicomTag.PatientName, dicomName);

            if (dicomName.Contains("*"))
            {
                var firstNameRegex = new Regex("^" + Regex.Escape(personName.First).Replace("\\*", ".*") + "$");
                var lastNameRegex  = new Regex("^" + Regex.Escape(personName.Last).Replace("\\*", ".*") + "$");
                exams = exams.Where(x => firstNameRegex.IsMatch(x.Forename) || lastNameRegex.IsMatch(x.Surname));
            }
            else
            {
                exams = exams.Where(x => (x.Forename.Equals(personName.First) && x.Surname.Equals(personName.Last)));
            }

            return(exams);
        }
Example #30
0
        private static void WriteJsonPersonName(JsonWriter writer, DicomPersonName pn)
        {
            if (pn.Count != 0)
            {
                writer.WritePropertyName("Value");
                writer.WriteStartArray();

                foreach (var val in pn.Get <string[]>())
                {
                    if (string.IsNullOrEmpty(val))
                    {
                        writer.WriteNull();
                    }
                    else
                    {
                        var componentGroupValues = val.Split(_personNameComponentGroupDelimiter);
                        int i = 0;

                        writer.WriteStartObject();
                        foreach (var componentGroupValue in componentGroupValues)
                        {
                            // Based on standard http://dicom.nema.org/dicom/2013/output/chtml/part18/sect_F.2.html
                            // 1. Empty values are skipped
                            // 2. Leading componentGroups even if null need to have delimiters. Trailing componentGroup delimiter can be omitted
                            if (!string.IsNullOrWhiteSpace(componentGroupValue))
                            {
                                writer.WritePropertyName(_personNameComponentGroupNames[i]);
                                writer.WriteValue(componentGroupValue);
                            }
                            i++;
                        }
                        writer.WriteEndObject();
                    }
                }

                writer.WriteEndArray();
            }
        }
Example #31
0
        private void CreateDicomFile(int[] frameIdArray, string directoryName, string fileName)
        {
            int frameId = frameIdArray[0];
            int fileId = ObjectContext.DicomFrame.Single(x => x.FrameId == frameId).FileId;
            var query1 = from dev in ObjectContext.DicomElementValue.Include("DicomElement")
                         where dev.FileId == fileId && (dev.GroupNumber != 40 && dev.GroupNumber != 32736) // Okrem GroupNumber 0x0028 a 0x7FE0
                         select new { dev.GroupNumber, dev.ElementNumber, dev.Value, dev.DicomElement.ValueRepresentation };

            DicomDataset dataset = new DicomDataset();

            foreach (var item in query1)
            {
                if (item.ValueRepresentation == "PN")
                {
                    var x = new DicomPersonName(new DicomTag((ushort) item.GroupNumber, (ushort) item.ElementNumber),
                                                Encoding.UTF7, item.Value);
                    dataset.Add(x);
                }
                else
                {
                    dataset.Add(new DicomTag((ushort)item.GroupNumber, (ushort)item.ElementNumber), item.Value);
                }
            }

            var query2 = from dev in ObjectContext.DicomElementValue
                         where dev.FileId == fileId && dev.GroupNumber == 40 // GroupNumber 0x0028
                         select new { dev.GroupNumber, dev.ElementNumber, dev.Value };

            DicomPixelData pixelData = DicomPixelData.Create(dataset, true);

            pixelData.BitsAllocated =
                ushort.Parse(query2.Single(x => (x.GroupNumber == 40 && x.ElementNumber == 256)).Value);
            pixelData.BitsStored =
                ushort.Parse(query2.Single(x => (x.GroupNumber == 40 && x.ElementNumber == 257)).Value);
            pixelData.HighBit =
                ushort.Parse(query2.Single(x => (x.GroupNumber == 40 && x.ElementNumber == 258)).Value);
            pixelData.PhotometricInterpretation =
                PhotometricInterpretation.Parse(query2.Single(x => (x.GroupNumber == 40 && x.ElementNumber == 4)).Value);
            pixelData.PixelRepresentation =
                (PixelRepresentation)int.Parse(query2.Single(x => (x.GroupNumber == 40 && x.ElementNumber == 259)).Value);
            pixelData.PlanarConfiguration =
                (PlanarConfiguration)int.Parse(query2.Single(x => (x.GroupNumber == 40 && x.ElementNumber == 6)).Value);
            pixelData.SamplesPerPixel =
                ushort.Parse(query2.Single(x => (x.GroupNumber == 40 && x.ElementNumber == 2)).Value);

            ushort width = ushort.Parse(query2.Single(x => (x.GroupNumber == 40 && x.ElementNumber == 17)).Value);
            ushort height = ushort.Parse(query2.Single(x => (x.GroupNumber == 40 && x.ElementNumber == 16)).Value);

            var query3 = from dfr in ObjectContext.DicomFrame
                         where frameIdArray.Contains(dfr.FrameId)
                         orderby dfr.FrameId ascending
                         select new { dfr.Frame };

            foreach (var item in query3)
            {
                byte[] pixels = item.Frame;
                MemoryByteBuffer buffer = new MemoryByteBuffer(pixels);
                pixelData.Width = width;
                pixelData.Height = height;
                pixelData.AddFrame(buffer);
            }

            string dirPath = HttpRuntime.AppDomainAppPath + @"\temp\" + directoryName;
            string filePath = dirPath + @"\" + fileName + ".dcm";
            if (!Directory.Exists(dirPath))
                Directory.CreateDirectory(dirPath);

            var file = new Dicom.DicomFile(dataset);
            file.Save(filePath);
        }
Example #32
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);
        }
Example #33
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);
        }
Example #34
0
 public void DicomPersonName_FamilyAndSurname_YieldsCompositeName()
 {
     var element = new DicomPersonName(DicomTag.ConsultingPhysicianName, "Doe", "John");
     var actual = element.Get<string>(0);
     Assert.Equal("Doe^John", actual);
 }
Example #35
0
 public void SuffixTest()
 {
     DicomPersonName target = new DicomPersonName(DicomTag.PatientName, "Last", "First", "Middle", "Prefix", "Suffix");
     Assert.AreEqual("Suffix", target.Suffix);
     target = new DicomPersonName(DicomTag.PatientName, "Last");
     Assert.AreEqual("", target.Suffix);
     target = new DicomPersonName(DicomTag.PatientName, "Last^First^Middle^Prefix=Doe^John^Peter^MD");
     Assert.AreEqual("", target.Suffix);
 }
Example #36
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);
        }
        public void GivenValidatePersonName_WhenValidating_ThenShouldPass()
        {
            DicomElement element = new DicomPersonName(DicomTag.PatientName, "abc^xyz=abc^xyz^xyz^xyz^xyz=abc^xyz");

            new PersonNameValidation().Validate(element);
        }
Example #38
0
        private static void DicomElementToXml(StringBuilder xmlOutput, DicomElement item)
        {
            WriteDicomAttribute(xmlOutput, item);

            var vr = item.ValueRepresentation.Code;

            if (vr == DicomVRCode.OB || vr == DicomVRCode.OD || vr == DicomVRCode.OF || vr == DicomVRCode.OW ||
                vr == DicomVRCode.OL || vr == DicomVRCode.UN)
            {
                var binaryString = GetBinaryBase64(item);
                xmlOutput.AppendLine($@"<InlineBinary>{binaryString}</InlineBinary>");
            }
            else if (vr == DicomVRCode.PN)
            {
                for (int i = 0; i < item.Count; i++)
                {
                    xmlOutput.AppendLine($@"<PersonName number=""{i+1}"">");
                    xmlOutput.AppendLine(@"<Alphabetic>");

                    var person = new DicomPersonName(item.Tag, item.Get <string>(i));

                    string lastName = person.Last;
                    if (!string.IsNullOrEmpty(lastName))
                    {
                        xmlOutput.AppendLine($@"<FamilyName>{EscapeXml(lastName)}</FamilyName>");
                    }
                    string givenName = person.First;
                    if (!string.IsNullOrEmpty(givenName))
                    {
                        xmlOutput.AppendLine($@"<GivenName>{EscapeXml(givenName)}</GivenName>");
                    }
                    string middleName = person.Middle;
                    if (!string.IsNullOrEmpty(middleName))
                    {
                        xmlOutput.AppendLine($@"<MiddleName>{EscapeXml(middleName)}</MiddleName>");
                    }
                    string prefixName = person.Prefix;
                    if (!string.IsNullOrEmpty(prefixName))
                    {
                        xmlOutput.AppendLine($@"<NamePrefix>{EscapeXml(prefixName)}</NamePrefix>");
                    }
                    string suffixName = person.Suffix;
                    if (!string.IsNullOrEmpty(suffixName))
                    {
                        xmlOutput.AppendLine($@"<NameSuffix>{EscapeXml(suffixName)}</NameSuffix>");
                    }

                    xmlOutput.AppendLine(@"</Alphabetic>");
                    xmlOutput.AppendLine(@"</PersonName>");
                }
            }
            else
            {
                for (int i = 0; i < item.Count; i++)
                {
                    var valueString = EscapeXml(item.Get <string>(i));
                    xmlOutput.AppendLine($@"<Value number=""{i+1}"">{valueString}</Value>");
                }
            }

            xmlOutput.AppendLine(@"</DicomAttribute>");
        }
        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);
        }