示例#1
0
        public static MusicTrack ParseMusicTrack(byte[] data)
        {
            using (var reader = new BinaryReader(new MemoryStream(data)))
            {
                var musicTrack = new MusicTrack(data.Length);
                musicTrack.Id         = reader.ReadUInt32();
                musicTrack.Unknown    = reader.ReadByte();
                musicTrack.SoundCount = reader.ReadUInt32();
                musicTrack.Sounds     = new Sound[musicTrack.SoundCount];
                for (var i = 0; i < musicTrack.SoundCount; i++)
                {
                    var sound = new Sound(0);
                    sound.Unknown_04     = reader.ReadByte();
                    sound.Unknown_05     = reader.ReadByte();
                    sound.Conversion     = (ConversionType)reader.ReadByte();
                    sound.Unknown_07     = reader.ReadByte();
                    sound.Source         = (AudioSource)reader.ReadByte();
                    sound.AudioId        = reader.ReadUInt32();
                    sound.AudioLength    = reader.ReadUInt32();
                    sound.AudioType      = (AudioType)reader.ReadByte();
                    musicTrack.Sounds[i] = sound;
                }
                musicTrack.TimeParameterCount = reader.ReadUInt32();
                musicTrack.TimeParameters     = new TimeParameter[musicTrack.TimeParameterCount];
                for (var i = 0; i < musicTrack.TimeParameterCount; i++)
                {
                    TimeParameter timeParameter = default;
                    timeParameter.SubTrackIndex   = reader.ReadUInt32();
                    timeParameter.AudioId         = reader.ReadUInt32();
                    timeParameter.BeginOffset     = reader.ReadDouble();
                    timeParameter.BeginTrimOffset = reader.ReadDouble();
                    timeParameter.EndOffset       = reader.ReadDouble();
                    timeParameter.EndTrimOffset   = reader.ReadDouble();
                    musicTrack.TimeParameters[i]  = timeParameter;
                }
                musicTrack.SubTrackCount = reader.ReadUInt32();
                musicTrack.CurveCount    = reader.ReadUInt32();
                musicTrack.Curves        = new Curve[musicTrack.CurveCount];
                for (var i = 0; i < musicTrack.CurveCount; i++)
                {
                    Curve curve = default;
                    curve.TimeParameterIndex = reader.ReadUInt32();
                    curve.Type       = (FadeCurveType)reader.ReadUInt32();
                    curve.PointCount = reader.ReadUInt32();
                    curve.Points     = new FadePoint[curve.PointCount];
                    for (var j = 0; j < curve.PointCount; j++)
                    {
                        FadePoint fadePoint = default;
                        fadePoint.FromX = reader.ReadSingle();
                        fadePoint.FromY = reader.ReadSingle();
                        fadePoint.FollowingCurveShape = (BlendCurveShape)reader.ReadUInt32();
                        curve.Points[j] = fadePoint;
                    }
                    musicTrack.Curves[i] = curve;
                }
                musicTrack.Properties = reader.ReadAudioProperties();
                musicTrack.TrackType  = (TrackType)reader.ReadByte();
                if (musicTrack.TrackType == TrackType.Switch)
                {
                    SwitchParameters switchParameters = default;
                    switchParameters.Unknown = reader.ReadByte();
                    switchParameters.GroupId = reader.ReadUInt32();
                    switchParameters.DefaultSwitchOrStateId     = reader.ReadUInt32();
                    switchParameters.SubTrackCount              = reader.ReadUInt32();
                    switchParameters.AssociatedSwitchOrStateIds = new uint[switchParameters.SubTrackCount];
                    for (var i = 0; i < switchParameters.SubTrackCount; i++)
                    {
                        switchParameters.AssociatedSwitchOrStateIds[i] = reader.ReadUInt32();
                    }
                    switchParameters.FadeOutDuration   = reader.ReadUInt32();
                    switchParameters.FadeOutCurveShape = (BlendCurveShape)reader.ReadUInt32();
                    switchParameters.FadeOutOffset     = reader.ReadInt32();
                    switchParameters.ExitSourceAt      = (InteractiveMusicKeyPoint)reader.ReadUInt32();
                    switchParameters.ExitSourceAtCueId = reader.ReadUInt32();
                    switchParameters.FadeInDuration    = reader.ReadUInt32();
                    switchParameters.FadeInCurveShape  = (BlendCurveShape)reader.ReadUInt32();
                    switchParameters.FadeInOffset      = reader.ReadInt32();
                    musicTrack.SwitchParameters        = switchParameters;
                }
                musicTrack.LookAheadTime = reader.ReadUInt32();

                return(musicTrack);
            }
        }
示例#2
0
        private List <DicomPatientData> ParseXml(string xmlfile, out List <Patient> patients)
        {
            var doc = new XmlDocument();

            doc.Load(xmlfile);
            var dicomPatients = new List <DicomPatientData>();

            patients = new List <Patient>();
            XmlNodeList nodes = doc.DocumentElement.SelectNodes("/responses/data-set");

            foreach (XmlNode node in nodes)
            {
                string patientFirstName = null, patientLastName = null, patientId = null,
                             patientBirthDate = null, patientSex = null, characterSet = null;
                string        transliteratedPatientFirstName = null, transliteratedPatientLastName = null;
                TimeParameter tp       = null;
                TRICS.Planner.Model.Common.Gender gender = TRICS.Planner.Model.Common.Gender.Unknown;
                bool transliterationOk = false;

                foreach (XmlNode elem in node.SelectNodes("element"))
                {
                    var el = elem.Attributes.GetNamedItem("name");
                    if (el.InnerText.StartsWith("PatientName"))
                    {
                        var    patientName = elem.InnerText;
                        var    group1      = patientName.Split('=')[0];
                        string converted   = GetConvertedString(group1);
                        if (converted != null)
                        {
                            transliterationOk = true;
                            var namePieces = group1.Split('^');
                            if (namePieces.Length == 1)
                            {
                                // just the last name is given
                                patientLastName = namePieces[0];
                            }
                            if (namePieces.Length >= 2)
                            {
                                patientLastName  = namePieces[0];
                                patientFirstName = namePieces[1];
                            }

                            var transliteratedPieces = converted.Split('^');
                            if (transliteratedPieces.Length == 1)
                            {
                                // just the last name is given
                                transliteratedPatientLastName = transliteratedPieces[0];
                            }
                            if (transliteratedPieces.Length >= 2)
                            {
                                transliteratedPatientLastName  = transliteratedPieces[0];
                                transliteratedPatientFirstName = transliteratedPieces[1];
                            }
                        }
                    }
                    else if (el.InnerText.StartsWith("PatientID"))
                    {
                        patientId = elem.InnerText;
                    }
                    else if (el.InnerText.StartsWith("PatientBirthDate"))
                    {
                        if (elem.InnerText.Length >= 8)
                        {
                            tp = new TimeParameter {
                                Year  = Int32.Parse(elem.InnerText.Substring(0, 4)),
                                Month = Int32.Parse(elem.InnerText.Substring(4, 2)),
                                Day   = Int32.Parse(elem.InnerText.Substring(6, 2))
                            };

                            var year  = Int32.Parse(elem.InnerText.Substring(0, 4));
                            var month = Int32.Parse(elem.InnerText.Substring(4, 2));
                            var day   = Int32.Parse(elem.InnerText.Substring(6, 2));

                            patientBirthDate = day + "/" + month + "/" + year;
                        }
                    }
                    else if (el.InnerText.StartsWith("PatientSex"))
                    {
                        if (String.IsNullOrWhiteSpace(elem.InnerText))
                        {
                            gender = TRICS.Planner.Model.Common.Gender.Unknown;
                        }
                        else
                        {
                            if (elem.InnerText.StartsWith("M"))
                            {
                                gender = TRICS.Planner.Model.Common.Gender.Male;
                            }
                            else if (elem.InnerText.StartsWith("F"))
                            {
                                gender = TRICS.Planner.Model.Common.Gender.Female;
                            }
                            else
                            {
                                gender = TRICS.Planner.Model.Common.Gender.Any;
                            }
                        }

                        patientSex = elem.InnerText;
                    }
                    else if (el.InnerText.StartsWith("SpecificCharacterSet"))
                    {
                        characterSet = elem.InnerText;
                    }
                }
                if (transliterationOk)
                {
                    // even if transliteration succeeds, check the character set

                    if (!String.IsNullOrWhiteSpace(characterSet))
                    {
                        // check if we support the first alphabet given
                        string alphabet = characterSet.Split('\\')[0].Trim();
                        if (alphabet.Count() > 0)
                        {
                            if (!supportedAplhabets.Contains(alphabet))
                            {
                                // alphabet not supported, so we reject this patient altogheter
                                transliterationOk = false;
                            }
                        } // else it is the default ASCII
                    }
                    if (transliterationOk)
                    {
                        Patient patient = new Patient {
                            ChartNumber = patientId,
                            LastName    = transliteratedPatientLastName,
                            FirstName   = transliteratedPatientFirstName,
                            Birthday    = tp,
                            Gender      = gender
                        };
                        patient.Birthday.UserFormat = "dd/MM/yyyy";
                        patients.Add(patient);

                        if (String.IsNullOrWhiteSpace(characterSet))
                        {
                            // in case we don't have a SpecificCharacterSet from findscu
                            // and the transliterated names don't coincide with the original ones,
                            // we need to specify UTF8 as character set, since the default ASCII won't do
                            if (
                                (
                                    (transliteratedPatientFirstName != null) &&
                                    !transliteratedPatientFirstName.Equals(patientFirstName, StringComparison.InvariantCultureIgnoreCase)
                                ) ||
                                (
                                    (transliteratedPatientLastName != null) &&
                                    !transliteratedPatientLastName.Equals(patientLastName, StringComparison.InvariantCultureIgnoreCase)
                                )
                                )
                            {
                                characterSet = SupportedCharacterSets.UTF8;
                            }
                        }

                        DicomPatientData person = new DicomPatientData {
                            Identity = new DicomWorkItem {
                                PatientLastName      = patientLastName,
                                PatientFirstName     = patientFirstName,
                                PatientID            = patientId,
                                PatientBirthDate     = patientBirthDate,
                                PatientSex           = patientSex,
                                SpecificCharacterSet = characterSet
                            },
                            PatientKey = patient.GetFallbackKey().ToUpper()
                        };
                        dicomPatients.Add(person);
                    }
                    else
                    {
                        Logger.WriteMsg(LogSeverity.Warning, $"Given character set {characterSet} not supported");
                    }
                }
                else
                {
                    Logger.WriteMsg(LogSeverity.Warning, $"Can't transliterate patient with ID {patientId}");
                }
            }
            return(dicomPatients);
        }