public AnnoTrigger(AnnoList annoList, PluginCaller trigger, Dictionary <string, object> args) { this.annoList = annoList; this.trigger = trigger; this.args = args; position = 0; currentOrNextItemIndex = annoList.Count == 0 ? -1 : 0; object result = trigger.call("open", args); if (result != null) { MessageTools.Error(result.ToString()); } }
public static AnnoList LoadfromFile(string filepath) { AnnoList list = new AnnoList(); list.Source.File.Path = filepath; list.Scheme = new AnnoScheme(); list.Scheme.Labels = new List <AnnoScheme.Label>(); //try { XmlDocument doc = new XmlDocument(); doc.Load(filepath); XmlNode annotation = doc.SelectSingleNode("annotation"); XmlNode info = annotation.SelectSingleNode("info"); list.Source.File.Type = info.Attributes["ftype"].Value == AnnoSource.FileSource.TYPE.ASCII.ToString() ? AnnoSource.FileSource.TYPE.ASCII : AnnoSource.FileSource.TYPE.BINARY; int size = int.Parse(info.Attributes["size"].Value); XmlNode meta = annotation.SelectSingleNode("meta"); if (meta != null) { if (meta.Attributes["role"] != null) { list.Meta.Role = meta.Attributes["role"].Value; } if (meta.Attributes["annotator"] != null) { list.Meta.Annotator = meta.Attributes["annotator"].Value; } } XmlNode scheme = annotation.SelectSingleNode("scheme"); if (scheme.Attributes["name"] != null) { list.Scheme.Name = scheme.Attributes["name"].Value; } string type = "FREE"; if (scheme.Attributes["type"] != null) { type = scheme.Attributes["type"].Value; } if (type == AnnoScheme.TYPE.DISCRETE.ToString()) { list.Scheme.Type = AnnoScheme.TYPE.DISCRETE; } else if (type == AnnoScheme.TYPE.CONTINUOUS.ToString()) { list.Scheme.Type = AnnoScheme.TYPE.CONTINUOUS; } else if (type == AnnoScheme.TYPE.FREE.ToString()) { list.Scheme.Type = AnnoScheme.TYPE.FREE; } else if (type == AnnoScheme.TYPE.POINT.ToString()) { list.Scheme.Type = AnnoScheme.TYPE.POINT; } else if (type == AnnoScheme.TYPE.POLYGON.ToString()) { list.Scheme.Type = AnnoScheme.TYPE.POLYGON; } else if (type == AnnoScheme.TYPE.GRAPH.ToString()) { list.Scheme.Type = AnnoScheme.TYPE.GRAPH; } else if (type == AnnoScheme.TYPE.SEGMENTATION.ToString()) { list.Scheme.Type = AnnoScheme.TYPE.SEGMENTATION; } if (scheme.Attributes["color"] != null) { list.Scheme.MinOrBackColor = (Color)ColorConverter.ConvertFromString(scheme.Attributes["color"].Value); } else if (scheme.Attributes["mincolor"] != null) { list.Scheme.MinOrBackColor = (Color)ColorConverter.ConvertFromString(scheme.Attributes["mincolor"].Value); } else if (list.Scheme.Type == AnnoScheme.TYPE.CONTINUOUS) { list.Scheme.MinOrBackColor = Defaults.Colors.GradientMin; } if (scheme.Attributes["maxcolor"] != null) { list.Scheme.MaxOrForeColor = (Color)ColorConverter.ConvertFromString(scheme.Attributes["maxcolor"].Value); } else if (list.Scheme.Type == AnnoScheme.TYPE.CONTINUOUS) { list.Scheme.MaxOrForeColor = Defaults.Colors.GradientMax; } Dictionary <string, string> LabelIds = new Dictionary <string, string>(); if (list.Scheme.Type == AnnoScheme.TYPE.DISCRETE) { foreach (XmlNode item in scheme) { LabelIds.Add(item.Attributes["id"].Value, item.Attributes["name"].Value); Color color = Defaults.Colors.Foreground; if (item.Attributes["color"] != null) { color = (Color)ColorConverter.ConvertFromString(item.Attributes["color"].Value); } AnnoScheme.Label lcp = new AnnoScheme.Label(item.Attributes["name"].Value, color); list.Scheme.Labels.Add(lcp); } AnnoScheme.Label garbage = new AnnoScheme.Label("GARBAGE", Defaults.Colors.Foreground); list.Scheme.Labels.Add(garbage); } else if (list.Scheme.Type == AnnoScheme.TYPE.FREE) { } else if (list.Scheme.Type == AnnoScheme.TYPE.CONTINUOUS) { list.Scheme.MinScore = double.Parse(scheme.Attributes["min"].Value); list.Scheme.MaxScore = double.Parse(scheme.Attributes["max"].Value); list.Scheme.SampleRate = double.Parse(scheme.Attributes["sr"].Value); } else if (list.Scheme.Type == AnnoScheme.TYPE.POINT || list.Scheme.Type == AnnoScheme.TYPE.POLYGON || list.Scheme.Type == AnnoScheme.TYPE.GRAPH || list.Scheme.Type == AnnoScheme.TYPE.SEGMENTATION) { list.Scheme.SampleRate = double.Parse(scheme.Attributes["sr"].Value); list.Scheme.NumberOfPoints = int.Parse(scheme.Attributes["num"].Value); } if (File.Exists(filepath + "~")) { if (list.Source.File.Type == AnnoSource.FileSource.TYPE.ASCII) { StreamReader sr = new StreamReader(filepath + "~", System.Text.Encoding.UTF8); string line = null; double start = 0.0; while ((line = sr.ReadLine()) != null) { string[] data = line.Split(';'); if (list.Scheme.Type == AnnoScheme.TYPE.CONTINUOUS) { double value = double.NaN; double.TryParse(data[0], out value); double confidence = Convert.ToDouble(data[1], CultureInfo.InvariantCulture); AnnoListItem e = new AnnoListItem(start, 1 / list.Scheme.SampleRate, value, "", Defaults.Colors.Foreground, confidence); list.Add(e); start = start + 1 / list.Scheme.SampleRate; } else if (list.Scheme.Type == AnnoScheme.TYPE.DISCRETE) { start = Convert.ToDouble(data[0], CultureInfo.InvariantCulture); double stop = Convert.ToDouble(data[1], CultureInfo.InvariantCulture); double dur = stop - start; string label = ""; if (int.Parse(data[2]) < 0) { label = "GARBAGE"; } else { LabelIds.TryGetValue(data[2], out label); } Color color = Colors.Black; if (list.Scheme.Labels.Find(x => x.Name == label) != null) { color = list.Scheme.Labels.Find(x => x.Name == label).Color; } double confidence = Convert.ToDouble(data[3], CultureInfo.InvariantCulture); AnnoListItem e = new AnnoListItem(start, dur, label, "", color, confidence); list.AddSorted(e); } else if (list.Scheme.Type == AnnoScheme.TYPE.FREE) { start = Convert.ToDouble(data[0], CultureInfo.InvariantCulture); double stop = Convert.ToDouble(data[1], CultureInfo.InvariantCulture); double dur = stop - start; string label = data[2]; double confidence = Convert.ToDouble(data[3], CultureInfo.InvariantCulture); Color color = Colors.Black; if (data.Length > 4) { string[] metapairs = data[4].Split('='); for (int i = 0; i < metapairs.Length; i++) { if (metapairs[i].Contains("color")) { color = (Color)ColorConverter.ConvertFromString(metapairs[i + 1]); break; } } } AnnoListItem e = new AnnoListItem(start, dur, label, "", color, confidence); list.AddSorted(e); } else if (list.Scheme.Type == AnnoScheme.TYPE.POINT) { string frameLabel = data[0]; double frameConfidence = Convert.ToDouble(data[data.Count() - 1], CultureInfo.InvariantCulture); PointList points = new PointList(); for (int i = 1; i < data.Count() - 1; ++i) { string pd = data[i].Replace("(", ""); pd = pd.Replace(")", ""); string[] pointData = pd.Split(':'); points.Add(new PointListItem(double.Parse(pointData[1]), double.Parse(pointData[2]), pointData[0], double.Parse(pointData[3]))); } AnnoListItem ali = new AnnoListItem(start, 1 / list.Scheme.SampleRate, frameLabel, "", list.Scheme.MinOrBackColor, frameConfidence, true, points); list.Add(ali); start = start + 1 / list.Scheme.SampleRate; } } sr.Close(); } else if (list.Source.File.Type == AnnoSource.FileSource.TYPE.BINARY) { BinaryReader binaryReader = new BinaryReader(File.Open(filepath + "~", FileMode.Open)); long length = (binaryReader.BaseStream.Length); double start = 0.0; while (binaryReader.BaseStream.Position < binaryReader.BaseStream.Length) { if (list.Scheme.Type == AnnoScheme.TYPE.CONTINUOUS) { double value = (double)binaryReader.ReadSingle(); double confidence = (double)binaryReader.ReadSingle(); AnnoListItem e = new AnnoListItem(start, 1 / list.Scheme.SampleRate, value, "", Defaults.Colors.Foreground, confidence); list.Add(e); start = start + 1 / list.Scheme.SampleRate; } else if (list.Scheme.Type == AnnoScheme.TYPE.DISCRETE) { start = binaryReader.ReadDouble(); double stop = binaryReader.ReadDouble(); double dur = stop - start; string label = ""; int index = binaryReader.ReadInt32(); if (index < 0) { label = "GARBAGE"; } else { LabelIds.TryGetValue(index.ToString(), out label); } Color color = Colors.Black; if (list.Scheme.Labels.Find(x => x.Name == label) != null) { color = list.Scheme.Labels.Find(x => x.Name == label).Color; } double confidence = Math.Round(binaryReader.ReadSingle(), 3, MidpointRounding.AwayFromZero); AnnoListItem e = new AnnoListItem(start, dur, label, "", color, confidence); list.AddSorted(e); } else if (list.Scheme.Type == AnnoScheme.TYPE.FREE) { start = binaryReader.ReadDouble(); double stop = binaryReader.ReadDouble(); double dur = stop - start; int stringlength = (int)binaryReader.ReadUInt32(); byte[] labelasbytes = (binaryReader.ReadBytes(stringlength)); string label = System.Text.Encoding.Default.GetString(labelasbytes); Color color = Colors.Black; double confidence = Math.Round(binaryReader.ReadSingle(), 3, MidpointRounding.AwayFromZero); AnnoListItem e = new AnnoListItem(start, dur, label, "", color, confidence); list.AddSorted(e); } } binaryReader.Close(); } } //Plugin logic should be called after parsing if (meta != null && meta.Attributes["trigger"] != null) { string[] triggers = meta.Attributes["trigger"].Value.Split(';'); foreach (string trigger in triggers) { try { Match match = Regex.Match(trigger, @"([^{]+)\{([^}]*)\}"); if (match.Success && match.Groups.Count == 3) { string dllName = match.Groups[1].Value; string arguments = match.Groups[2].Value; Dictionary <string, object> args = arguments.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) .Select(part => part.Split('=')) .ToDictionary(split => split[0], split => (object)split[1]); PluginCaller pluginCaller = new PluginCaller(dllName + ".dll", dllName); AnnoTrigger annoTrigger = new AnnoTrigger(list, pluginCaller, args); list.Meta.Trigger.Add(annoTrigger); } else { MessageTools.Warning("could not parse trigger '" + trigger + "'"); } } catch (Exception) { MessageTools.Warning("could not parse trigger '" + trigger + "'"); } } } if (meta != null && meta.Attributes["pipeline"] != null) { string[] pipelines = meta.Attributes["pipeline"].Value.Split(';'); foreach (string pipeline in pipelines) { try { Pipeline pipe = new Pipeline(list, pipeline); list.Meta.Pipeline.Add(pipe); } catch (Exception) { MessageTools.Warning("could not parse pipeline '" + pipeline + "'"); } } } } //catch(Exception e) //{ // MessageBox.Show("An exception occured while reading annotation from '" + filepath + "'"); //} return(list); }