Beispiel #1
0
        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);
        }
Beispiel #2
0
        // 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);
        }