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("");
}
}
}
}