private async void Analyze_Click(object sender, RoutedEventArgs e) { try { recogCanvas.Children.Clear(); debugCanvas.Children.Clear(); var status = await inkRecognizer.RecognizeAsync(); if (status == HttpStatusCode.OK) { var root = inkRecognizer.GetRecognizerRoot(); if (root != null) { var pic = new DrawsomePic(root, inkRecognizer.strokes, (int)hook.Value); if (pic.Root != null) { DrawRect(pic); DrawStorkes(pic); var composerBot = await BotGenerator.Parse(pic); this.botInstance = composerBot; this.gButton.Visibility = Visibility.Visible; } } } } catch (Exception ex) { var messageDialog = new MessageDialog(ex.Message); await messageDialog.ShowAsync(); } }
private void DrawRect(DrawsomePic pic) { foreach (var shape in pic.AllShapes) { debugCanvas.Children.Add(GetPolygon(shape.RecogUnit.BoundingRect, ColorHelper.FromArgb(255, 0, 255, 0))); debugCanvas.Children.Add(GetPolyLocationTextBlock(shape)); } }
public static async Task <ComposerBot> Parse(DrawsomePic pic) { var root = pic.Root; var allSteps = new List <ComposerStep>(); var rootSteps = await BuildFromStepUntil(pic, root, null, allSteps, new HashSet <DrawsomeObj>()); var bot = new ComposerBot(rootSteps); bot.AllSteps = allSteps; return(bot); }
private void DrawStorkes(DrawsomePic pic) { var lines = pic.AllLines; foreach (var line in lines) { foreach (var rect in line.LittleRects) { var poly = GetPolygon(rect, ColorHelper.FromArgb(255, 255, 255, 0)); recogCanvas.Children.Add(poly); } } }
// return a list of step from cur root public static async Task <List <ComposerStep> > BuildFromStepUntil(DrawsomePic pic, DrawsomeObj root, DrawsomeObj target, List <ComposerStep> allSteps, HashSet <DrawsomeObj> visited) { var steps = new List <ComposerStep>(); if (root == target) { return(steps); } if (visited.Contains(root)) { return(steps); } visited.Add(root); // only one next if (root.Next.Count != 2) { if (root is DrawsomeShape) { var step = await BuildComposerStepFromShape(root as DrawsomeShape); steps.Add(step); allSteps.Add(step); steps.AddRange(await BuildFromStepUntil(pic, root.Next.FirstOrDefault(), target, allSteps, visited)); } else if (root is DrawsomeLine) { steps.AddRange(await BuildFromStepUntil(pic, root.Next.FirstOrDefault(), target, allSteps, visited)); } } if (root.Next.Count == 2) { if (root is DrawsomeShape) { var firstCommon = NearestObj(pic, root); var step = new IfCondition((root as DrawsomeShape).Text, root as DrawsomeShape); allSteps.Add(step); step.Steps = await BuildFromStepUntil(pic, root.Next.FirstOrDefault(), firstCommon, allSteps, visited); step.ElseSteps = await BuildFromStepUntil(pic, root.Next.LastOrDefault(), firstCommon, allSteps, visited); steps.Add(step); steps.AddRange(await BuildFromStepUntil(pic, firstCommon, target, allSteps, visited)); } } return(steps); }
private static DrawsomeObj NearestObj(DrawsomePic pic, DrawsomeObj root) { var trueList = new List <DrawsomeObj>(); var trueRoot = root.Next?[0]; while (trueRoot != null) { if (trueList.Find(item => item == trueRoot) == null) { trueList.Add(trueRoot); } else { break; } trueRoot = trueRoot.Next.FirstOrDefault(); } var falseList = new List <DrawsomeObj>(); var falseRoot = root.Next?[1]; while (falseRoot != null) { if (falseList.Find(item => item == falseRoot) == null) { falseList.Add(falseRoot); } else { break; } falseRoot = falseRoot.Next.FirstOrDefault(); } var commonList = trueList.Intersect(falseList); var firstCommon = commonList?.FirstOrDefault(); return(firstCommon); }