static public int EvalValue(String parsingText, StatisticsDataInput dimensions, Control control) { int iRet = 0; Random rand = new Random(); // When adding a child, it is important to place the child on the other side of the parent, if the parent is flipped. var dt = new DataTable(); var screen = Screen.PrimaryScreen; parsingText = parsingText.Replace("screenW", dimensions.Screen.X.ToString(CultureInfo.InvariantCulture)); parsingText = parsingText.Replace("screenH", dimensions.Screen.Y.ToString(CultureInfo.InvariantCulture)); parsingText = parsingText.Replace("areaW", dimensions.Area.X.ToString(CultureInfo.InvariantCulture)); parsingText = parsingText.Replace("areaH", dimensions.Screen.Y.ToString(CultureInfo.InvariantCulture)); parsingText = parsingText.Replace("imageW", dimensions.Image.Width.ToString(CultureInfo.InvariantCulture)); parsingText = parsingText.Replace("imageH", dimensions.Image.Height.ToString(CultureInfo.InvariantCulture)); parsingText = parsingText.Replace("imageX", dimensions.Image.X.ToString(CultureInfo.InvariantCulture)); parsingText = parsingText.Replace("imageY", dimensions.Image.Y.ToString(CultureInfo.InvariantCulture)); if (dimensions.Random >= 0) { parsingText = parsingText.Replace("random", dimensions.Random.ToString(CultureInfo.InvariantCulture)); } else { parsingText = parsingText.Replace("random", rand.Next(0, 100).ToString(CultureInfo.InvariantCulture)); } if (dimensions.SRandom >= 0) { parsingText = parsingText.Replace("randS", dimensions.SRandom.ToString(CultureInfo.InvariantCulture)); } else { parsingText = parsingText.Replace("randS", 50.ToString()); } try { var v = dt.Compute(parsingText, ""); double dv; if (double.TryParse(v.ToString(), out dv)) { iRet = (int)dv; } } catch (Exception ex) { Program.AddLog("Unable to parse string " + parsingText + " - " + ex.Message, "Parse value", Program.LOG_TYPE.ERROR, control); return(int.MinValue); } return(iRet); }
static public AnimationStatistics GetAnimationStatistics(XmlData.AnimationNode node, StatisticsDataInput dimensions, Control c) { var stat = new AnimationStatistics(); bool variableRand = false; bool variableScreen = false; stat.Frames = node.Sequence.Frame.Length; if (node.Sequence.RepeatCount.IndexOf("screen") >= 0 || node.Sequence.RepeatCount.IndexOf("area") >= 0) { variableScreen = true; } if (node.Sequence.RepeatCount.IndexOf("random") >= 0) { variableRand = true; } stat.Repeats = EvalValue(node.Sequence.RepeatCount, dimensions, c); stat.RepeatFrom = node.Sequence.RepeatFromFrame; stat.TotalFrames = stat.Frames + (stat.Frames - stat.RepeatFrom) * stat.Repeats; stat.Start = new AnimationStatistics.StepValues(); if (node.Start.X.IndexOf("screen") >= 0 || node.Start.X.IndexOf("area") >= 0) { variableScreen = true; } if (node.Start.X.IndexOf("random") >= 0) { variableRand = true; } stat.Start.X = EvalValue(node.Start.X, dimensions, c); if (node.Start.Y.IndexOf("screen") >= 0 || node.Start.Y.IndexOf("area") >= 0) { variableScreen = true; } if (node.Start.Y.IndexOf("random") >= 0) { variableRand = true; } stat.Start.Y = EvalValue(node.Start.Y, dimensions, c); if (node.Start.Interval.IndexOf("screen") >= 0 || node.Start.Interval.IndexOf("area") >= 0) { variableScreen = true; } if (node.Start.Interval.IndexOf("random") >= 0) { variableRand = true; } stat.Start.Interval = EvalValue(node.Start.Interval, dimensions, c); stat.Start.Offset = node.Start.OffsetY; stat.Start.Opacity = node.Start.Opacity; stat.End = new AnimationStatistics.StepValues(); if (node.End.X.IndexOf("screen") >= 0 || node.End.X.IndexOf("area") >= 0) { variableScreen = true; } if (node.End.X.IndexOf("random") >= 0) { variableRand = true; } stat.End.X = EvalValue(node.End.X, dimensions, c); if (node.End.Y.IndexOf("screen") >= 0 || node.End.Y.IndexOf("area") >= 0) { variableScreen = true; } if (node.End.Y.IndexOf("random") >= 0) { variableRand = true; } stat.End.Y = EvalValue(node.End.Y, dimensions, c); if (node.End.Interval.IndexOf("screen") >= 0 || node.End.Interval.IndexOf("area") >= 0) { variableScreen = true; } if (node.End.Interval.IndexOf("random") >= 0) { variableRand = true; } stat.End.Interval = EvalValue(node.End.Interval, dimensions, c); stat.End.Offset = node.End.OffsetY; stat.End.Opacity = node.End.Opacity; stat.SubSteps = new List <AnimationStatistics.StepValues>(); for (var k = 0; k < stat.TotalFrames; k++) { var step = new AnimationStatistics.StepValues(); step.X = (int)(stat.Start.X + (stat.End.X - stat.Start.X) * ((double)k / stat.TotalFrames)); step.Y = (int)(stat.Start.Y + (stat.End.Y - stat.Start.Y) * ((double)k / stat.TotalFrames)); step.Interval = (int)(stat.Start.Interval + (stat.End.Interval - stat.Start.Interval) * ((double)k / stat.TotalFrames)); step.Opacity = (int)(stat.Start.Opacity + (stat.End.Opacity - stat.Start.Opacity) * ((double)k / stat.TotalFrames)); step.Offset = (int)(stat.Start.Offset + (stat.End.Offset - stat.Start.Offset) * ((double)k / stat.TotalFrames)); stat.SubSteps.Add(step); } stat.RandomVariable = variableRand; stat.ScreenVariable = variableScreen; stat.TotalTime = 0; stat.TotalX = 0; stat.TotalY = 0; foreach (var s in stat.SubSteps) { stat.TotalTime += s.Interval; stat.TotalX += s.X; stat.TotalY += s.Y; } return(stat); }