using System.IO; using System.Collections.Generic; using System.Xml; using UnityEngine; namespace PDollarGestureRecognizer { public class GestureIO { /// /// Reads a multistroke gesture from an XML file /// /// /// public static Gesture ReadGestureFromXML(string xml) { XmlTextReader xmlReader = null; Gesture gesture = null; try { xmlReader = new XmlTextReader(new StringReader(xml)); gesture = ReadGesture(xmlReader); } finally { if (xmlReader != null) xmlReader.Close(); } return gesture; } /// /// Reads a multistroke gesture from an XML file /// /// /// public static Gesture ReadGestureFromFile(string fileName) { XmlTextReader xmlReader = null; Gesture gesture = null; try { xmlReader = new XmlTextReader(File.OpenText(fileName)); gesture = ReadGesture(xmlReader); } finally { if (xmlReader != null) xmlReader.Close(); } return gesture; } private static Gesture ReadGesture(XmlTextReader xmlReader) { List points = new List(); int currentStrokeIndex = -1; string gestureName = ""; try { while (xmlReader.Read()) { if (xmlReader.NodeType != XmlNodeType.Element) continue; switch (xmlReader.Name) { case "Gesture": gestureName = xmlReader["Name"]; if (gestureName.Contains("~")) // '~' character is specific to the naming convention of the MMG set gestureName = gestureName.Substring(0, gestureName.LastIndexOf('~')); if (gestureName.Contains("_")) // '_' character is specific to the naming convention of the MMG set gestureName = gestureName.Replace('_', ' '); break; case "Stroke": currentStrokeIndex++; break; case "Point": points.Add(new Point( float.Parse(xmlReader["X"]), float.Parse(xmlReader["Y"]), currentStrokeIndex )); break; } } } finally { if (xmlReader != null) xmlReader.Close(); } return new Gesture(points.ToArray(), gestureName); } /// /// Writes a multistroke gesture to an XML file /// public static void WriteGesture(PDollarGestureRecognizer.Point[] points, string gestureName, string fileName) { using (StreamWriter sw = new StreamWriter(fileName)) { sw.WriteLine(""); sw.WriteLine("", gestureName); int currentStroke = -1; for (int i = 0; i < points.Length; i++) { if (points[i].StrokeID != currentStroke) { if (i > 0) sw.WriteLine("\t"); sw.WriteLine("\t"); currentStroke = points[i].StrokeID; } sw.WriteLine("\t\t", points[i].X, points[i].Y ); } sw.WriteLine("\t"); sw.WriteLine(""); } } } }