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); }
// 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); }