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"); } }
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(); } }
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); }
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)); }
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)); }
private DPersonName(DicomPersonName name) { _name = name; _single_byte = true; _ideograph = true; _phonetic = true; }
public void DicomPersonName_FamilyAndSurname_YieldsCompositeName() { var element = new DicomPersonName(DicomTag.ConsultingPhysicianName, "Doe", "John"); var actual = element.Get <string>(0); Assert.Equal("Doe^John", actual); }
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( ); } }
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]); }
internal static DPersonName FromPersonName(DicomPersonName name) { if (name == null) { return(null); } return(new DPersonName(name)); }
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); }
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); }
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); }
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); }
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); }
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); }
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>()); }
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); }
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)); }
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)); }
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); }
//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); }
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(); } }
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); }
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); }
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); }
public void DicomPersonName_FamilyAndSurname_YieldsCompositeName() { var element = new DicomPersonName(DicomTag.ConsultingPhysicianName, "Doe", "John"); var actual = element.Get<string>(0); Assert.Equal("Doe^John", actual); }
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); }
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); }