void SetIsFile() { if (!CheckType) { return; } try { var value = new NEExpression(Expression).Evaluate <string>(Variables); if (value == null) { return; } if (File.Exists(value)) { Type = ResultType.File; } else if (Directory.Exists(value)) { Type = ResultType.Directory; } } catch { } }
void Command_Numeric_Round(NumericFloorRoundCeilingDialog.Result result) { var baseValue = new NEExpression(result.BaseValue).EvaluateList <double>(GetVariables(), Selections.Count()); var interval = new NEExpression(result.Interval).EvaluateList <double>(GetVariables(), Selections.Count()); ReplaceSelections(Selections.AsParallel().AsOrdered().Select((range, index) => (Math.Round((double.Parse(GetString(range), NumberStyles.Float) - baseValue[index]) / interval[index], MidpointRounding.AwayFromZero) * interval[index] + baseValue[index]).ToString()).ToList()); }
void Command_Image_Rotate(ImageRotateDialog.Result result) { var variables = GetVariables(); var angle = new NEExpression(result.AngleExpression).Evaluate <float>(variables, "deg"); var bitmap = GetBitmap(); var path = new System.Drawing.Drawing2D.GraphicsPath(); path.AddRectangle(new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height)); var matrix = new System.Drawing.Drawing2D.Matrix(); matrix.Rotate(angle); var rect = path.GetBounds(matrix); var resultBitmap = new System.Drawing.Bitmap((int)rect.Width, (int)rect.Height, bitmap.PixelFormat); using (var g = System.Drawing.Graphics.FromImage(resultBitmap)) { g.TranslateTransform(-rect.X, -rect.Y); g.RotateTransform(angle); g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear; g.DrawImageUnscaled(bitmap, 0, 0); } Replace(new List <Range> { FullRange }, new List <string> { Coder.BitmapToString(resultBitmap) }); SetSelections(new List <Range> { BeginRange }); }
void Command_Image_Size(ImageSizeDialog.Result result) { var variables = GetVariables(); var width = new NEExpression(result.WidthExpression).Evaluate <int>(variables); var height = new NEExpression(result.HeightExpression).Evaluate <int>(variables); var bitmap = GetBitmap(); var resultBitmap = new System.Drawing.Bitmap(width, height, bitmap.PixelFormat); resultBitmap.SetResolution(bitmap.HorizontalResolution, bitmap.VerticalResolution); using (var graphics = System.Drawing.Graphics.FromImage(resultBitmap)) { graphics.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy; graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; graphics.InterpolationMode = result.InterpolationMode; graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality; using (var wrapMode = new System.Drawing.Imaging.ImageAttributes()) { wrapMode.SetWrapMode(System.Drawing.Drawing2D.WrapMode.TileFlipXY); graphics.DrawImage(bitmap, new System.Drawing.Rectangle(0, 0, width, height), 0, 0, bitmap.Width, bitmap.Height, System.Drawing.GraphicsUnit.Pixel, wrapMode); } } Replace(new List <Range> { FullRange }, new List <string> { Coder.BitmapToString(resultBitmap) }); SetSelections(new List <Range> { BeginRange }); }
void Command_Numeric_Series_LinearGeometric(NumericSeriesDialog.Result result, bool linear) { var variables = GetVariables(); var start = new NEExpression(result.StartExpression).Evaluate <double>(variables); var increment = new NEExpression(result.IncrementExpression).Evaluate <double>(variables); ReplaceSelections(Selections.Select((range, index) => (linear ? start + increment * index : start *Math.Pow(increment, index)).ToString()).ToList()); }
void Command_Numeric_Cycle(NumericCycleDialog.Result result) { var variables = GetVariables(); var minimums = new NEExpression(result.Minimum).EvaluateList <double>(variables, Selections.Count()); var maximums = new NEExpression(result.Maximum).EvaluateList <double>(variables, Selections.Count()); ReplaceSelections(Selections.AsParallel().AsOrdered().Select((range, index) => Cycle(double.Parse(GetString(range)), minimums[index], maximums[index], result.IncludeBeginning).ToString()).ToList()); }
void Command_Numeric_RandomNumber(NumericRandomNumberDialog.Result result) { var variables = GetVariables(); var minValues = new NEExpression(result.MinValue).EvaluateList <int>(variables, Selections.Count()); var maxValues = new NEExpression(result.MaxValue).EvaluateList <int>(variables, Selections.Count()); ReplaceSelections(Selections.AsParallel().Select((range, index) => random.Next(minValues[index], maxValues[index] + 1).ToString()).ToList()); }
void Command_Table_Select_RowsByExpression(GetExpressionDialog.Result result) { var table = GetTable(); var variables = GetTableVariables(table); var results = new NEExpression(result.Expression).EvaluateList <bool>(variables, table.NumRows); var lines = results.Indexes(res => res).Select(row => row + 1).ToList(); SetSelections(lines.AsParallel().AsOrdered().Select(line => new Range(Data.GetOffset(line, Data.GetLineLength(line)), Data.GetOffset(line, 0))).ToList()); }
void Command_Table_AddColumn(TableAddColumnDialog.Result result) { var table = GetTable(); var variables = GetTableVariables(table); var results = new NEExpression(result.Expression).EvaluateList <string>(variables, table.NumRows); table.AddColumn(result.ColumnName, results); SetText(table); }
void Command_Numeric_Scale(NumericScaleDialog.Result result) { var variables = GetVariables(); var prevMins = new NEExpression(result.PrevMin).EvaluateList <double>(variables, Selections.Count()); var prevMaxs = new NEExpression(result.PrevMax).EvaluateList <double>(variables, Selections.Count()); var newMins = new NEExpression(result.NewMin).EvaluateList <double>(variables, Selections.Count()); var newMaxs = new NEExpression(result.NewMax).EvaluateList <double>(variables, Selections.Count()); ReplaceSelections(Selections.AsParallel().AsOrdered().Select((range, index) => ((double.Parse(GetString(range)) - prevMins[index]) * (newMaxs[index] - newMins[index]) / (prevMaxs[index] - prevMins[index]) + newMins[index]).ToString()).ToList()); }
void Command_Image_GIF_Split(ImageGIFSplitDialog.Result result) { var variables = GetVariables(); variables.Add(NEVariable.Constant("chunk", "Chunk number", "{0}")); var files = RelativeSelectedFiles(); var outputTemplates = new NEExpression(result.OutputTemplate).EvaluateList <string>(variables, files.Count); Enumerable.Range(0, files.Count).AsParallel().ForEach(index => SplitGIF(files[index], outputTemplates[index])); }
NEExpression GetExpression(string expression) { if (expression == null) { expression = ""; } if (!expressionUsed.ContainsKey(expression)) { expressionUsed[expression] = new NEExpression(expression); } return(expressionUsed[expression]); }
void Command_Image_Crop(ImageCropDialog.Result result) { var variables = GetVariables(); var destX = new NEExpression(result.XExpression).Evaluate <int>(variables); var destY = new NEExpression(result.YExpression).Evaluate <int>(variables); var newWidth = new NEExpression(result.WidthExpression).Evaluate <int>(variables); var newHeight = new NEExpression(result.HeightExpression).Evaluate <int>(variables); if ((newWidth <= 0) || (newHeight <= 0)) { throw new Exception("Width and height must be greater than 0"); } var bitmap = GetBitmap(); var srcX = 0; var srcY = 0; var width = bitmap.Width; var height = bitmap.Height; if (destX < 0) { width += destX; srcX -= destX; destX = 0; } if (destY < 0) { height += destY; srcY -= destY; destY = 0; } width = Math.Min(width, newWidth - destX); height = Math.Min(height, newHeight - destY); var resultBitmap = new System.Drawing.Bitmap(newWidth, newHeight, bitmap.PixelFormat); resultBitmap.SetResolution(bitmap.HorizontalResolution, bitmap.VerticalResolution); using (var graphics = System.Drawing.Graphics.FromImage(resultBitmap)) using (var wrapMode = new System.Drawing.Imaging.ImageAttributes()) { graphics.FillRectangle(new System.Drawing.SolidBrush(System.Drawing.Color.FromArgb((int)Colorer.StringToValue(result.FillColor))), new System.Drawing.Rectangle(System.Drawing.Point.Empty, resultBitmap.Size)); graphics.DrawImage(bitmap, new System.Drawing.Rectangle(destX, destY, width, height), new System.Drawing.Rectangle(srcX, srcY, width, height), System.Drawing.GraphicsUnit.Pixel); } Replace(new List <Range> { FullRange }, new List <string> { Coder.BitmapToString(resultBitmap) }); SetSelections(new List <Range> { BeginRange }); }
void Command_Image_GIF_Animate(ImageGIFAnimateDialog.Result result) { var variables = GetVariables(); var inputFiles = new NEExpression(result.InputFiles).EvaluateList <string>(variables); var outputFile = new NEExpression(result.OutputFile).Evaluate <string>(variables); var delays = new NEExpression(result.Delay).EvaluateList <int>(variables, inputFiles.Count, "ms"); var repeat = new NEExpression(result.Repeat).Evaluate <int>(variables); using (var writer = new GIFWriter(outputFile, repeat)) for (var ctr = 0; ctr < inputFiles.Count; ++ctr) { using (var image = System.Drawing.Image.FromFile(inputFiles[ctr])) writer.WriteFrame(image, delays[ctr]); } }
void Command_Select_Limit(LimitDialog.Result result) { var variables = GetVariables(); var firstSel = new NEExpression(result.FirstSel).EvaluateRow<int>(variables); var selMult = new NEExpression(result.SelMult).EvaluateRow<int>(variables); var numSels = new NEExpression(result.NumSels).EvaluateRow<int>(variables); IEnumerable<Range> retval = Selections; retval = retval.Skip(firstSel - 1); if (result.JoinSels) retval = retval.Batch(selMult).Select(batch => new Range(batch.Last().End, batch.First().Start)); else retval = retval.EveryNth(selMult); retval = retval.Take(numSels); Selections.Replace(retval.ToList()); }
void SetIsFile() { if (!CheckType) return; try { var value = new NEExpression(Expression).EvaluateRow<string>(Variables); if (value == null) return; if (File.Exists(value)) Type = ResultType.File; else if (Directory.Exists(value)) Type = ResultType.Directory; } catch { } }
void Command_Edit_Rotate(EditRotateDialog.Result result) { var count = new NEExpression(result.Count).Evaluate <int>(GetVariables()); var strs = GetSelectionStrings(); if (count < 0) { count = -count % strs.Count; } else { count = strs.Count - count % strs.Count; } strs.AddRange(strs.Take(count).ToList()); strs.RemoveRange(0, count); ReplaceSelections(strs); }
void Command_Image_GrabImage(ImageGrabImageDialog.Result result) { var variables = GetVariables(); var x = new NEExpression(result.GrabX).EvaluateList <int>(variables, Selections.Count()); var y = new NEExpression(result.GrabY).EvaluateList <int>(variables, Selections.Count()); var width = new NEExpression(result.GrabWidth).EvaluateList <int>(variables, Selections.Count()); var height = new NEExpression(result.GrabHeight).EvaluateList <int>(variables, Selections.Count()); var strs = new List <string>(); for (var ctr = 0; ctr < x.Count; ++ctr) { using (var image = new System.Drawing.Bitmap(width[ctr], height[ctr], System.Drawing.Imaging.PixelFormat.Format32bppArgb)) { using (var dest = System.Drawing.Graphics.FromImage(image)) dest.CopyFromScreen(x[ctr], y[ctr], 0, 0, image.Size); strs.Add(Coder.BitmapToString(image)); } } ReplaceSelections(strs); }
void Command_Macro_Play_Repeat() { var result = MacroPlayRepeatDialog.Run(WindowParent, Macro.ChooseMacro); if (result == null) { return; } var macro = Macro.Load(result.Macro); var expression = new NEExpression(result.Expression); var count = int.MaxValue; if (result.RepeatType == MacroPlayRepeatDialog.RepeatTypeEnum.Number) { count = expression.Evaluate <int>(); } Action startNext = null; startNext = () => { if ((TopMost == null) || (--count < 0)) { return; } if (result.RepeatType == MacroPlayRepeatDialog.RepeatTypeEnum.Condition) { if (!expression.Evaluate <bool>(TopMost.GetVariables())) { return; } } macro.Play(this, playing => MacroPlaying = playing, startNext); }; startNext(); }
void Command_Select_Limit(SelectLimitDialog.Result result) { var variables = GetVariables(); var firstSelection = new NEExpression(result.FirstSelection).Evaluate <int>(variables); var everyNth = new NEExpression(result.EveryNth).Evaluate <int>(variables); var takeCount = new NEExpression(result.TakeCount).Evaluate <int>(variables); var numSels = new NEExpression(result.NumSelections).Evaluate <int>(variables); var sels = Selections.Skip(firstSelection - 1); if (result.JoinSelections) { sels = sels.Batch(everyNth).Select(batch => batch.Take(takeCount)).Select(batch => new Range(batch.Last().End, batch.First().Start)); } else { sels = sels.EveryNth(everyNth, takeCount); } sels = sels.Take(numSels); SetSelections(sels.ToList()); }
public void ExpressionTest() { Assert.AreEqual("1125899906842624", new NEExpression("2^50").Evaluate().ToString()); Assert.AreEqual("4", new NEExpression("-(-4)").Evaluate().ToString()); Assert.AreEqual("4", new NEExpression("2 + 2").Evaluate().ToString()); Assert.AreEqual("7.1", new NEExpression("5.1 + 2").Evaluate().ToString()); Assert.AreEqual("5.1", new NEExpression("5 + .1").Evaluate().ToString()); Assert.AreEqual("5", new NEExpression("4.9 + .1").Evaluate().ToString()); Assert.AreEqual("5.2", new NEExpression("5.1 + .1").Evaluate().ToString()); Assert.AreEqual("bcd", new NEExpression("\"abc\" t++ 1").Evaluate().ToString()); Assert.AreEqual("a1", new NEExpression("\"a\" t+ 1").Evaluate().ToString()); Assert.AreEqual("0", new NEExpression("2 - 2").Evaluate().ToString()); Assert.AreEqual("3.1", new NEExpression("5.1 - 2").Evaluate().ToString()); Assert.AreEqual("4.9", new NEExpression("5 - .1").Evaluate().ToString()); Assert.AreEqual("4.8", new NEExpression("4.9 - .1").Evaluate().ToString()); Assert.AreEqual("5", new NEExpression("5.1 - .1").Evaluate().ToString()); Assert.AreEqual("a", new NEExpression("\"b\" t-- 1").Evaluate().ToString()); Assert.AreEqual("10.8", new NEExpression("5.4 * 2").Evaluate().ToString()); Assert.AreEqual("10.5", new NEExpression("5 * 2.1").Evaluate().ToString()); Assert.AreEqual("okokokok", new NEExpression("\"ok\" t* 4").Evaluate().ToString()); Assert.AreEqual("oooo", new NEExpression("\"o\" t* 4").Evaluate().ToString()); Assert.AreEqual("2.5", new NEExpression("5 / 2").Evaluate().ToString()); Assert.AreEqual("2", new NEExpression("5 // 2").Evaluate().ToString()); Assert.AreEqual("2.5", new NEExpression("5.0 / 2").Evaluate().ToString()); Assert.AreEqual("2.5", new NEExpression("5 / 2.0").Evaluate().ToString()); Assert.AreEqual("64", new NEExpression("4 ^ 3").Evaluate().ToString()); Assert.AreEqual("4", new NEExpression("64 ^ (1 / 3.0)").Evaluate().ToString()); Assert.AreEqual("4.5", new NEExpression("410.0625 ^ .25").Evaluate().ToString()); Assert.AreEqual("8", new NEExpression("2 << 2").Evaluate().ToString()); Assert.AreEqual("1024", new NEExpression("1048576 >> 10").Evaluate().ToString()); Assert.AreEqual("-3735928560", new NEExpression("~[0]").Evaluate(0xdeadbeef).ToString()); Assert.AreEqual("179154957", new NEExpression("&").Evaluate(0xdeadbeef, 0x0badf00d).ToString()); Assert.AreEqual("3573567202", new NEExpression("^^").Evaluate(0xdeadbeef, 0x0badf00d).ToString()); Assert.AreEqual("3752722159", new NEExpression("|").Evaluate(0xdeadbeef, 0x0badf00d).ToString()); Assert.AreEqual(true, new NEExpression("TRUE").Evaluate()); Assert.AreEqual(false, new NEExpression("False").Evaluate()); Assert.AreEqual("7.1", new NEExpression("5.0 + 2.1").Evaluate().ToString()); Assert.AreEqual("14.1", new NEExpression("3.6 + 2.1 * 5.0").Evaluate().ToString()); Assert.AreEqual("28.5", new NEExpression("(3.6 + 2.1) * 5.0").Evaluate().ToString()); Assert.AreEqual("12.1", new NEExpression("[0] + [1]").Evaluate(5.4, 6.7).ToString()); Assert.AreEqual(true, new NEExpression("[0] is \"Int32\"").Evaluate(5)); Assert.AreEqual(true, new NEExpression("\"5a\" t== \"5a\"").Evaluate()); Assert.AreEqual(false, new NEExpression("\"5a\" t== \"5A\"").Evaluate()); Assert.AreEqual(true, new NEExpression("\"5a\" ti== \"5a\"").Evaluate()); Assert.AreEqual(true, new NEExpression("\"5a\" ti== \"5A\"").Evaluate()); Assert.AreEqual(false, new NEExpression("\"5a\" t!= \"5a\"").Evaluate()); Assert.AreEqual(true, new NEExpression("\"5a\" t!= \"5A\"").Evaluate()); Assert.AreEqual(false, new NEExpression("\"5a\" ti!= \"5a\"").Evaluate()); Assert.AreEqual(false, new NEExpression("\"5a\" ti!= \"5A\"").Evaluate()); Assert.AreEqual("5", new NEExpression("[0].\"value\"").Evaluate(new ExpressionDotTest(5)).ToString()); Assert.AreEqual(typeof(ExpressionDotTest).FullName, new NEExpression("Type([0]).\"FullName\"").Evaluate(new ExpressionDotTest(5)).ToString()); Assert.AreEqual(true, new NEExpression("ValidRE([0])").Evaluate(@"\d+")); Assert.AreEqual(false, new NEExpression("ValidRE([0])").Evaluate(@"[")); Assert.AreEqual("15.5", new NEExpression("+").Evaluate(1, 2, 3, 4, 5.5).ToString()); Assert.AreEqual(true, new NEExpression("||").Evaluate(false, false, true, false)); Assert.AreEqual("120", new NEExpression("*").Evaluate(4, 5, 6).ToString()); Assert.AreEqual("5", new NEExpression("([0] || [1]) ? [2] : [3]").Evaluate(false, true, 5, 6).ToString()); Assert.AreEqual("ICanJoinStrings", new NEExpression("t+").Evaluate("I", "Can", null, "Join", "Strings").ToString()); Assert.AreEqual("a\\\'\"\0\a\b\f\n\r\t\v\x1\x12\x123\x1234\u1234\U00001234\U0001d161", new NEExpression(@"""a"" t+ ""\\"" t+ ""\'"" t+ ""\"""" t+ ""\0"" t+ ""\a"" t+ ""\b"" t+ ""\f"" t+ ""\n"" t+ ""\r"" t+ ""\t"" t+ ""\v"" t+ ""\x1"" t+ ""\x12"" t+ ""\x123"" t+ ""\x1234"" t+ ""\u1234"" t+ ""\U00001234"" t+ ""\U0001d161""").Evaluate().ToString()); Assert.AreEqual("", new NEExpression("\"\"").Evaluate().ToString()); Assert.AreEqual(" Slash: \\ Quote: \' Double: \" Null: \0 Alert: \a Backspace: \b Form feed: \f New line: \n Carriage return:\r Tab: \t Vertical quote: \v Hex1: \x1 Hex2: \x12 Hex3: \x123 Hex4: \x1234 Unicode4: \u1234 Unicode8: \U00001234 Unicode8: \U0001d161 ", new NEExpression(@""" Slash: \\ Quote: \' Double: \"" Null: \0 Alert: \a Backspace: \b Form feed: \f New line: \n Carriage return:\r Tab: \t Vertical quote: \v Hex1: \x1 Hex2: \x12 Hex3: \x123 Hex4: \x1234 Unicode4: \u1234 Unicode8: \U00001234 Unicode8: \U0001d161 """).Evaluate().ToString()); Assert.AreEqual("", new NEExpression("@\"\"").Evaluate().ToString()); Assert.AreEqual(@"This \is "" my string", new NEExpression(@"@""This \is """" my string""").Evaluate().ToString()); Assert.AreEqual("", new NEExpression("$\"\"").Evaluate().ToString()); Assert.AreEqual("{2 + 2 = 4}\r\n", new NEExpression(@"$""{{\u0032 + 2 = {2 + 2}}}\r\n""").Evaluate().ToString()); Assert.AreEqual(@"\n ""{2 + 2} \= 4"" \n", new NEExpression(@"@$""\n """"{{2 + 2}} \= {2 + 2}"""" \n""").Evaluate().ToString()); Assert.AreEqual(@"\n ""{2 + 2} \= 4"" \n", new NEExpression(@"$@""\n """"{{2 + 2}} \= {2 + 2}"""" \n""").Evaluate().ToString()); Assert.AreEqual("", new NEExpression("@$\"\"").Evaluate().ToString()); Assert.AreEqual("", new NEExpression("$@\"\"").Evaluate().ToString()); Assert.AreEqual("[0]5+7 is 12", new NEExpression("StrFormat(\"[0]{0}+{1} is {2}\", [0], [1], [0] + [1])").Evaluate(5, 7).ToString()); Assert.AreEqual("Test", new NEExpression("StrFormat(\"Test\")").Evaluate().ToString()); Assert.AreEqual("Test 5", new NEExpression("StrFormat(\"Test {0}\", 5)").Evaluate().ToString()); Assert.AreEqual("Test 5 7", new NEExpression("StrFormat(\"Test {0} {1}\", 5, 7)").Evaluate().ToString()); Assert.AreEqual(false, new NEExpression("!true").Evaluate()); Assert.AreEqual(true, new NEExpression("![0]").Evaluate(false)); Assert.AreEqual("-4", new NEExpression("-4").Evaluate().ToString()); Assert.AreEqual(typeof(byte), new NEExpression("Type([0])").Evaluate((byte)0)); Assert.AreEqual("3931877116", new NEExpression("0xdeadbeef + [0]").Evaluate(0x0badf00d).ToString()); Assert.AreEqual("2", new NEExpression("Min(3,4,2)").Evaluate().ToString()); Assert.AreEqual("4", new NEExpression("Max(3,4,2)").Evaluate().ToString()); Assert.AreEqual("16", new NEExpression("len(\"1125899906842624\")").Evaluate().ToString()); Assert.AreEqual("16,3,4", new NEExpression("len(\"1125899906842624\", 123, \"Test\")").Evaluate().ToString()); Assert.AreEqual("3", new NEExpression("min(len(\"1125899906842624\", 123, \"Test\"))").Evaluate().ToString()); Assert.AreEqual("8", new NEExpression("multiple(8,8)").Evaluate().ToString()); Assert.AreEqual("16", new NEExpression("multiple(9,8)").Evaluate().ToString()); Assert.AreEqual("8.4", new NEExpression("multiple(1.1,8.4)").Evaluate().ToString()); Assert.AreEqual("16.8", new NEExpression("multiple(9.5,8.4)").Evaluate().ToString()); Assert.AreEqual("3 foot", new NEExpression("multiple(30 in,1 foot)").Evaluate().ToString()); Assert.AreEqual("3.14159265358979", new NEExpression("pi").Evaluate().ToString()); Assert.AreEqual("2.71828182845905", new NEExpression("e").Evaluate().ToString()); Assert.AreEqual("120", new NEExpression("5!").Evaluate().ToString()); Assert.AreEqual("Four hundred eleven billion forty five thousand three hundred twelve", new NEExpression("towords(411000045312)").Evaluate().ToString()); Assert.AreEqual("Zero", new NEExpression("towords(0)").Evaluate().ToString()); Assert.AreEqual("Negative five", new NEExpression("towords(-5)").Evaluate().ToString()); Assert.AreEqual("554212019", new NEExpression("fromwords(\" five -hundred-fifty-four million, two hundred twelve thousand, nineteen \")").Evaluate().ToString()); Assert.AreEqual("5110000", new NEExpression("fromwords(\"5.11 million\")").Evaluate().ToString()); Assert.AreEqual("411000045312", new NEExpression("fromwords(\"Four hundred eleven billion forty five thousand three hundred twelve\")").Evaluate().ToString()); Assert.AreEqual("0", new NEExpression("fromwords(\"Zero\")").Evaluate().ToString()); Assert.AreEqual("-5", new NEExpression("fromwords(\"Negative five\")").Evaluate().ToString()); Assert.AreEqual("5", new NEExpression("gcf(30,20,15)").Evaluate().ToString()); Assert.AreEqual("60", new NEExpression("lcm(30,20,15)").Evaluate().ToString()); Assert.AreEqual("1/5", new NEExpression("reduce(20,100)").Evaluate().ToString()); Assert.AreEqual("11 m/s", new NEExpression("5.5 m/(s^2)/s*s * 2 s").Evaluate().ToString()); Assert.AreEqual("1440 minutes", new NEExpression("1 day => minutes").Evaluate().ToString()); Assert.AreEqual("17168.481792 m^2", new NEExpression("5 miles * 7 feet => m^2").Evaluate().ToString()); Assert.AreEqual("5 cm^3", new NEExpression("5 ml => cm^3").Evaluate().ToString()); Assert.AreEqual("5280 feet", new NEExpression("1 mile => feet").Evaluate().ToString()); Assert.AreEqual("147197952000 feet^3", new NEExpression("1 mile^3 => feet^3").Evaluate().ToString()); Assert.AreEqual("328.15 K", new NEExpression("55 degc => K").Evaluate().ToString()); Assert.AreEqual("55 degc", new NEExpression("328.15 K => degc").Evaluate().ToString()); Assert.AreEqual("15 degc", new NEExpression("59 degf => degc").Evaluate().ToString()); Assert.AreEqual("59 degf", new NEExpression("15 degc => degf").Evaluate().ToString()); Assert.AreEqual("26 in", new NEExpression("2 in + 2 ft").Evaluate().ToString()); Assert.AreEqual(true, new NEExpression("5 km = 5000000 mm").Evaluate()); Assert.AreEqual("5000 kg*m^2/s^2", new NEExpression("5 kJ => SI").Evaluate().ToString()); Assert.AreEqual("1E-06 m^3", new NEExpression("1 mL => SI").Evaluate().ToString()); Assert.AreEqual("1000000 s^-1", new NEExpression("1 MHz => SI").Evaluate().ToString()); Assert.AreEqual("10 W", new NEExpression("10 J/s => Simple").Evaluate().ToString()); Assert.AreEqual("25 $/lessons", new NEExpression("1000$ / 40 lessons").Evaluate().ToString()); Assert.AreEqual("-1", new NEExpression("cos(pi)").Evaluate().ToString()); Assert.AreEqual("-1", new NEExpression("cos(pi rad)").Evaluate().ToString()); Assert.AreEqual("-1", new NEExpression("cos(180 deg)").Evaluate().ToString()); Assert.AreEqual("3.14159265358979 rad", new NEExpression("acos(-1)").Evaluate().ToString()); Assert.AreEqual("180 deg", new NEExpression("acos(-1) => deg").Evaluate().ToString()); Assert.AreEqual("0", new NEExpression("factor(0)").Evaluate().ToString()); Assert.AreEqual("-1*2*2*3*5*7*11", new NEExpression("factor(-4620)").Evaluate().ToString()); Assert.AreEqual(true, new NEExpression("valideval(\"(5+2)\")").Evaluate()); Assert.AreEqual(false, new NEExpression("valideval(\"(5+)2\")").Evaluate()); var values = new NEExpression("random(2,10)").EvaluateRows<int>(null, 1000).Distinct().OrderBy().ToList(); Assert.IsTrue(values.Count == 9); var miscVars = new NEVariables( NEVariable.Constant("x", "", 0xdeadbeef), NEVariable.Constant("y", "", 0x0badf00d), NEVariable.Constant("z", "", 0x0defaced) ); var expr = new NEExpression("x - y + [0]"); var vars = expr.Variables; Assert.AreEqual(2, vars.Count); Assert.IsTrue(vars.Contains("x")); Assert.IsTrue(vars.Contains("y")); Assert.AreEqual("7816989104", expr.EvaluateRow(miscVars, 0xfeedface).ToString()); var listVars = new NEVariables(NEVariable.List("y", "", () => new List<string> { "12", "-13.1", "-13", "9", "0.0001" })); Assert.AreEqual("5", new NEExpression("count([y])").EvaluateRow(listVars).ToString()); Assert.AreEqual("-13.1", new NEExpression("min([y])").EvaluateRow(listVars).ToString()); Assert.AreEqual("12", new NEExpression("max([y])").EvaluateRow(listVars).ToString()); Assert.AreEqual("0.0001", new NEExpression("tmin([y])").EvaluateRow(listVars).ToString()); Assert.AreEqual("9", new NEExpression("tmax([y])").EvaluateRow(listVars).ToString()); Assert.AreEqual("-5.0999", new NEExpression("sum([y])").EvaluateRow(listVars).ToString()); CheckDates(); }
string EvalExpression(string expression) { if (!expressions.ContainsKey(expression)) expressions[expression] = new NEExpression(expression); var variables = new NEVariables(values.Select(value => NEVariable.Constant(value.Key, "", value.Value))); return expressions[expression].EvaluateRow(variables).ToString(); }
void Command_Files_Operations_CopyMove(CopyMoveFilesDialog.Result result, bool move) { var variables = GetVariables(); var oldFileNameExpression = new NEExpression(result.OldFileName); var newFileNameExpression = new NEExpression(result.NewFileName); var resultCount = variables.ResultCount(oldFileNameExpression, newFileNameExpression); var oldFileNames = oldFileNameExpression.EvaluateRows<string>(variables, resultCount); var newFileNames = newFileNameExpression.EvaluateRows<string>(variables, resultCount); const int InvalidCount = 10; var invalid = oldFileNames.Distinct().Where(name => !FileOrDirectoryExists(name)).Take(InvalidCount).ToList(); if (invalid.Any()) throw new Exception($"Sources don't exist:\n{string.Join("\n", invalid)}"); invalid = newFileNames.Select(name => Path.GetDirectoryName(name)).Distinct().Where(dir => !Directory.Exists(dir)).Take(InvalidCount).ToList(); if (invalid.Any()) throw new Exception($"Directories don't exist:\n{string.Join("\n", invalid)}"); // If user specified a file and a directory, assume they want the file (with the same name) in that directory newFileNames = newFileNames.Zip(oldFileNames, (newFileName, oldFileName) => (File.Exists(oldFileName)) && (Directory.Exists(newFileName)) ? Path.Combine(newFileName, Path.GetFileName(oldFileName)) : newFileName).ToList(); invalid = oldFileNames.Zip(newFileNames, (oldFileName, newFileName) => new { oldFileName, newFileName }).Where(obj => (Directory.Exists(obj.newFileName)) || ((Directory.Exists(obj.oldFileName)) && (File.Exists(obj.newFileName)))).Select(pair => pair.newFileName).Distinct().Take(InvalidCount).ToList(); if (invalid.Any()) throw new Exception($"Destinations already exist:\n{string.Join("\n", invalid)}"); if (new Message(WindowParent) { Title = "Confirm", Text = $"Are you sure you want to {(move ? "move" : "copy")} these {resultCount} files/directories?", Options = Message.OptionsEnum.YesNo, DefaultAccept = Message.OptionsEnum.Yes, DefaultCancel = Message.OptionsEnum.No, }.Show() != Message.OptionsEnum.Yes) return; invalid = newFileNames.Where(pair => File.Exists(pair)).Distinct().Take(InvalidCount).ToList(); if (invalid.Any()) { if (new Message(WindowParent) { Title = "Confirm", Text = $"Are you sure you want to overwrite these files:\n{string.Join("\n", invalid)}", Options = Message.OptionsEnum.YesNo, DefaultAccept = Message.OptionsEnum.Yes, DefaultCancel = Message.OptionsEnum.No, }.Show() != Message.OptionsEnum.Yes) return; } for (var ctr = 0; ctr < oldFileNames.Count; ++ctr) if (Directory.Exists(oldFileNames[ctr])) { if (move) Directory.Move(oldFileNames[ctr], newFileNames[ctr]); else CopyDirectory(oldFileNames[ctr], newFileNames[ctr]); } else { if (File.Exists(newFileNames[ctr])) File.Delete(newFileNames[ctr]); if (move) File.Move(oldFileNames[ctr], newFileNames[ctr]); else File.Copy(oldFileNames[ctr], newFileNames[ctr]); } }
void Command_Files_Create_FromExpressions(CreateFilesDialog.Result result) { var variables = GetVariables(); var filenameExpression = new NEExpression(result.FileName); var dataExpression = new NEExpression(result.Data); var resultCount = variables.ResultCount(filenameExpression, dataExpression); var filename = filenameExpression.EvaluateRows<string>(variables, resultCount); var data = dataExpression.EvaluateRows<string>(variables, resultCount); for (var ctr = 0; ctr < data.Count; ++ctr) File.WriteAllBytes(filename[ctr], Coder.StringToBytes(data[ctr], result.CodePage, true)); }
void Command_Files_Set_Size(SetSizeDialog.Result result) { var vars = GetVariables(); var files = RelativeSelectedFiles(); var sizes = files.AsParallel().AsOrdered().Select(file => new FileInfo(file).Length); vars.Add(NEVariable.List("size", "File size", () => sizes)); var results = new NEExpression(result.Expression).EvaluateRows<long>(vars, Selections.Count()).Select(size => size * result.Factor).ToList(); files.Zip(results, (file, size) => new { file, size }).AsParallel().ForEach(obj => SetFileSize(obj.file, obj.size)); }
void UpdateChildren() { List <string> variables; List <string> results; Dictionary <string, List <string> > varValues; var useResults = MultiRow ? Math.Max(0, (int)((ActualHeight - Spacing * 2) / RowHeight - 1)) : MaxResults; try { var expression = new NEExpression(Expression); variables = new List <string>(expression.Variables); var resultCount = Math.Min(NumResults ?? ResultCount, useResults); results = expression.EvaluateList <string>(Variables, resultCount).Coalesce("").ToList(); varValues = variables.ToDictionary(variable => variable, variable => Variables.GetValues(variable, resultCount).Select(val => val?.ToString()).ToList()); IsValid = true; ErrorMessage = null; } catch (Exception ex) { results = MultiRow ? Enumerable.Repeat(default(string), useResults).ToList() : new List <string>(); variables = new List <string>(); varValues = new Dictionary <string, List <string> >(); IsValid = false; ErrorMessage = ex.Message; if ((Children.Count != 0) || (ActualHeight == 0) || (ActualWidth == 0)) { return; } } Children.Clear(); ColumnDefinitions.Clear(); RowDefinitions.Clear(); Func <WidthType, int, Tuple <WidthType, List <FrameworkElement> > > GetLine = (widthType, numRows) => Tuple.Create(widthType, Enumerable.Range(0, numRows).Select(row => new Rectangle { Width = Spacing, Fill = BackColor }).Cast <FrameworkElement>().ToList()); var columns = new List <Tuple <WidthType, List <FrameworkElement> > >(); if (MultiRow) { Func <WidthType, int, Tuple <WidthType, List <FrameworkElement> > > GetSpace = (widthType, numRows) => Tuple.Create(widthType, new[] { new Rectangle { Width = Spacing, Fill = BackColor } }.Concat(Enumerable.Range(0, numRows - 1).Select(row => new Rectangle { Width = Spacing })).Cast <FrameworkElement>().ToList()); columns.Add(GetLine(WidthType.None, results.Count + 1)); columns.AddRange(variables.SelectMany(variable => new[] { GetSpace(WidthType.Shrink3, results.Count + 1), Tuple.Create(WidthType.Expand | WidthType.Shrink4, new[] { GetTextBlock(variable, BackColor) }.Concat(Enumerable.Range(0, results.Count).Select(result => GetTextBlock(varValues[variable][result]))).ToList()), GetSpace(WidthType.Shrink3, results.Count + 1), GetLine(WidthType.Shrink5, results.Count + 1), })); if (!variables.Any()) { columns.Add(GetSpace(WidthType.Shrink3, results.Count + 1)); columns.Add(Tuple.Create(WidthType.Expand | WidthType.Shrink4, new[] { GetTextBlock("", BackColor) }.Concat(results.Select(result => GetTextBlock("<No vars>"))).ToList())); columns.Add(GetSpace(WidthType.Shrink3, results.Count + 1)); columns.Add(GetLine(WidthType.Shrink5, results.Count + 1)); } columns.Add(Tuple.Create(WidthType.Shrink1, new[] { default(TextBlock) }.Concat(results.Select(result => GetTextBlock(" => "))).ToList())); columns.Add(GetLine(WidthType.Shrink2, results.Count + 1)); columns.Add(Tuple.Create(WidthType.Shrink6, new[] { new Rectangle { Width = Spacing, Fill = BackColor } }.Concat(Enumerable.Repeat(default(FrameworkElement), results.Count)).ToList())); columns.Add(Tuple.Create(WidthType.Expand | WidthType.Shrink7, new[] { GetTextBlock("Result", BackColor) }.Concat(results.Select(result => GetTextBlock(result))).ToList())); columns.Add(Tuple.Create(WidthType.Shrink6, new[] { new Rectangle { Width = Spacing, Fill = BackColor } }.Concat(Enumerable.Repeat(default(FrameworkElement), results.Count)).ToList())); columns.Add(GetLine(WidthType.None, results.Count + 1)); } else { Func <WidthType, Tuple <WidthType, List <FrameworkElement> > > GetSpace = widthType => Tuple.Create(widthType, new[] { new Rectangle { Width = Spacing } }.Cast <FrameworkElement>().ToList()); columns.Add(GetLine(WidthType.None, 1)); if (results.Count == 0) { columns.Add(Tuple.Create(WidthType.Expand | WidthType.Shrink1, new List <FrameworkElement> { default(FrameworkElement) })); columns.Add(GetLine(WidthType.None, 1)); } else { columns.AddRange(results.SelectMany(result => new[] { GetSpace(WidthType.Shrink1), Tuple.Create(WidthType.Expand | WidthType.Shrink2, new List <FrameworkElement> { GetTextBlock(result) }), GetSpace(WidthType.Shrink1), GetLine(WidthType.Shrink3, 1), }).ToList()); } } // Sanity check: should have same number on all columns if (columns.Select(column => column.Item2.Count).Distinct().Count() != 1) { throw new Exception("Column counts don't match"); } // Measure everything var margin = new Thickness(0); var size = new Size(double.PositiveInfinity, double.PositiveInfinity); columns.SelectMany(column => column.Item2).Where(element => element != null).ForEach(element => { element.Margin = margin; element.Measure(size); }); const int precision = 10000; var widths = columns.Select(column => (int)(column.Item2.Max(text => text?.DesiredSize.Width * precision) ?? 0)).ToList(); var available = Math.Max(0, (int)ActualWidth * precision); // Expand as necessary var expandIndexes = columns.Indexes(column => column.Item1.HasFlag(WidthType.Expand)).ToList(); var extraPerColumn = (available - widths.Sum()) / expandIndexes.Count; if (extraPerColumn > 0) { expandIndexes.ForEach(index => widths[index] += extraPerColumn); } // Shrink as necessary var shrinks = new[] { WidthType.Shrink1, WidthType.Shrink2, WidthType.Shrink3, WidthType.Shrink4, WidthType.Shrink5, WidthType.Shrink6, WidthType.Shrink7 }; foreach (var shrink in shrinks) { var shrinkIndexes = columns.Indexes(column => column.Item1.HasFlag(shrink)).ToList(); while ((widths.Sum() > available) && (shrinkIndexes.Any(index => widths[index] != 0))) { var shrinkWidths = shrinkIndexes.Select(column => widths[column]).OrderByDescending().Distinct().ToList(); var maxIndexes = shrinkIndexes.Where(column => widths[column] == shrinkWidths[0]).ToList(); var minWidth = shrinkWidths.Count > 1 ? shrinkWidths[1] : 0; var extraPerIndex = (widths.Sum() - available + maxIndexes.Count - 1) / maxIndexes.Count; maxIndexes.ForEach(column => widths[column] = Math.Max(minWidth, widths[column] - extraPerIndex)); } } var rows = columns[0].Item2.Count; RowDefinitions.Add(new RowDefinition { Height = new GridLength(Spacing) }); for (var row = 0; row < rows; ++row) { RowDefinitions.Add(new RowDefinition { Height = new GridLength(RowHeight) }); } RowDefinitions.Add(new RowDefinition { Height = new GridLength(Spacing) }); for (var column = 0; column < columns.Count; ++column) { ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength((double)widths[column] / precision) }); for (var row = 0; row < rows; ++row) { AddChild(columns[column].Item2[row], row + 1, column); } } AddChild(new Rectangle { Fill = BackColor, Height = Spacing }, 0, 0, columnSpan: ColumnDefinitions.Count); AddChild(new Rectangle { Fill = BackColor, Height = Spacing }, RowDefinitions.Count - 1, 0, columnSpan: ColumnDefinitions.Count); GetErrorControls().ForEach(control => AddChild(control, 0, 0, RowDefinitions.Count, ColumnDefinitions.Count)); }
void UpdateChildren() { List<string> variables; List<string> results; Dictionary<string, List<string>> varValues; var useResults = MultiRow ? Math.Max(0, (int)((ActualHeight - Spacing * 2) / RowHeight - 1)) : MaxResults; try { var expression = new NEExpression(Expression); variables = new List<string>(expression.Variables); var resultCount = Math.Min(NumResults ?? ResultCount, useResults); results = expression.EvaluateRows<string>(Variables, resultCount).Coalesce("").ToList(); varValues = variables.ToDictionary(variable => variable, variable => Variables.GetValues(variable, resultCount).Select(val => val?.ToString()).ToList()); IsValid = true; ErrorMessage = null; } catch (Exception ex) { results = MultiRow ? Enumerable.Repeat(default(string), useResults).ToList() : new List<string>(); variables = new List<string>(); varValues = new Dictionary<string, List<string>>(); IsValid = false; ErrorMessage = ex.Message; if ((Children.Count != 0) || (ActualHeight == 0) || (ActualWidth == 0)) return; } Children.Clear(); ColumnDefinitions.Clear(); RowDefinitions.Clear(); Func<WidthType, int, Tuple<WidthType, List<FrameworkElement>>> GetLine = (widthType, numRows) => Tuple.Create(widthType, Enumerable.Range(0, numRows).Select(row => new Rectangle { Width = Spacing, Fill = BackColor }).Cast<FrameworkElement>().ToList()); var columns = new List<Tuple<WidthType, List<FrameworkElement>>>(); if (MultiRow) { Func<WidthType, int, Tuple<WidthType, List<FrameworkElement>>> GetSpace = (widthType, numRows) => Tuple.Create(widthType, new[] { new Rectangle { Width = Spacing, Fill = BackColor } }.Concat(Enumerable.Range(0, numRows - 1).Select(row => new Rectangle { Width = Spacing })).Cast<FrameworkElement>().ToList()); columns.Add(GetLine(WidthType.None, results.Count + 1)); columns.AddRange(variables.SelectMany(variable => new[] { GetSpace(WidthType.Shrink3, results.Count + 1), Tuple.Create(WidthType.Expand | WidthType.Shrink4, new[] { GetTextBlock(variable, BackColor) }.Concat(Enumerable.Range(0, results.Count).Select(result => GetTextBlock(varValues[variable][result]))).ToList()), GetSpace(WidthType.Shrink3, results.Count + 1), GetLine(WidthType.Shrink5, results.Count + 1), })); if (!variables.Any()) { columns.Add(GetSpace(WidthType.Shrink3, results.Count + 1)); columns.Add(Tuple.Create(WidthType.Expand | WidthType.Shrink4, new[] { GetTextBlock("", BackColor) }.Concat(results.Select(result => GetTextBlock("<No vars>"))).ToList())); columns.Add(GetSpace(WidthType.Shrink3, results.Count + 1)); columns.Add(GetLine(WidthType.Shrink5, results.Count + 1)); } columns.Add(Tuple.Create(WidthType.Shrink1, new[] { default(TextBlock) }.Concat(results.Select(result => GetTextBlock(" => "))).ToList())); columns.Add(GetLine(WidthType.Shrink2, results.Count + 1)); columns.Add(Tuple.Create(WidthType.Shrink6, new[] { new Rectangle { Width = Spacing, Fill = BackColor } }.Concat(Enumerable.Repeat(default(FrameworkElement), results.Count)).ToList())); columns.Add(Tuple.Create(WidthType.Expand | WidthType.Shrink7, new[] { GetTextBlock("Result", BackColor) }.Concat(results.Select(result => GetTextBlock(result))).ToList())); columns.Add(Tuple.Create(WidthType.Shrink6, new[] { new Rectangle { Width = Spacing, Fill = BackColor } }.Concat(Enumerable.Repeat(default(FrameworkElement), results.Count)).ToList())); columns.Add(GetLine(WidthType.None, results.Count + 1)); } else { Func<WidthType, Tuple<WidthType, List<FrameworkElement>>> GetSpace = widthType => Tuple.Create(widthType, new[] { new Rectangle { Width = Spacing } }.Cast<FrameworkElement>().ToList()); columns.Add(GetLine(WidthType.None, 1)); if (results.Count == 0) { columns.Add(Tuple.Create(WidthType.Expand | WidthType.Shrink1, new List<FrameworkElement> { default(FrameworkElement) })); columns.Add(GetLine(WidthType.None, 1)); } else columns.AddRange(results.SelectMany(result => new[] { GetSpace(WidthType.Shrink1), Tuple.Create(WidthType.Expand | WidthType.Shrink2, new List<FrameworkElement> { GetTextBlock(result) }), GetSpace(WidthType.Shrink1), GetLine(WidthType.Shrink3, 1), }).ToList()); } // Sanity check: should have same number on all columns if (columns.Select(column => column.Item2.Count).Distinct().Count() != 1) throw new Exception("Column counts don't match"); // Measure everything var margin = new Thickness(0); var size = new Size(double.PositiveInfinity, double.PositiveInfinity); columns.SelectMany(column => column.Item2).Where(element => element != null).ForEach(element => { element.Margin = margin; element.Measure(size); }); const int precision = 10000; var widths = columns.Select(column => (int)(column.Item2.Max(text => text?.DesiredSize.Width * precision) ?? 0)).ToList(); var available = Math.Max(0, (int)ActualWidth * precision); // Expand as necessary var expandIndexes = columns.Indexes(column => column.Item1.HasFlag(WidthType.Expand)).ToList(); var extraPerColumn = (available - widths.Sum()) / expandIndexes.Count; if (extraPerColumn > 0) expandIndexes.ForEach(index => widths[index] += extraPerColumn); // Shrink as necessary var shrinks = new[] { WidthType.Shrink1, WidthType.Shrink2, WidthType.Shrink3, WidthType.Shrink4, WidthType.Shrink5, WidthType.Shrink6, WidthType.Shrink7 }; foreach (var shrink in shrinks) { var shrinkIndexes = columns.Indexes(column => column.Item1.HasFlag(shrink)).ToList(); while ((widths.Sum() > available) && (shrinkIndexes.Any(index => widths[index] != 0))) { var shrinkWidths = shrinkIndexes.Select(column => widths[column]).OrderByDescending().Distinct().ToList(); var maxIndexes = shrinkIndexes.Where(column => widths[column] == shrinkWidths[0]).ToList(); var minWidth = shrinkWidths.Count > 1 ? shrinkWidths[1] : 0; var extraPerIndex = (widths.Sum() - available + maxIndexes.Count - 1) / maxIndexes.Count; maxIndexes.ForEach(column => widths[column] = Math.Max(minWidth, widths[column] - extraPerIndex)); } } var rows = columns[0].Item2.Count; RowDefinitions.Add(new RowDefinition { Height = new GridLength(Spacing) }); for (var row = 0; row < rows; ++row) RowDefinitions.Add(new RowDefinition { Height = new GridLength(RowHeight) }); RowDefinitions.Add(new RowDefinition { Height = new GridLength(Spacing) }); for (var column = 0; column < columns.Count; ++column) { ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength((double)widths[column] / precision) }); for (var row = 0; row < rows; ++row) AddChild(columns[column].Item2[row], row + 1, column); } AddChild(new Rectangle { Fill = BackColor, Height = Spacing }, 0, 0, columnSpan: ColumnDefinitions.Count); AddChild(new Rectangle { Fill = BackColor, Height = Spacing }, RowDefinitions.Count - 1, 0, columnSpan: ColumnDefinitions.Count); GetErrorControls().ForEach(control => AddChild(control, 0, 0, RowDefinitions.Count, ColumnDefinitions.Count)); }
void Command_Table_AddColumn(AddColumnDialog.Result result) { var table = GetTable(); var variables = GetTableVariables(table); var results = new NEExpression(result.Expression).EvaluateRows<string>(variables, table.NumRows); table.AddColumn(result.ColumnName, results); SetText(table); }
void Command_Table_Select_RowsByExpression(GetExpressionDialog.Result result) { var table = GetTable(); var variables = GetTableVariables(table); var results = new NEExpression(result.Expression).EvaluateRows<bool>(variables, table.NumRows); var lines = results.Indexes(res => res).Select(row => row + 1).ToList(); Selections.Replace(lines.AsParallel().AsOrdered().Select(line => new Range(Data.GetOffset(line, Data.GetLineLength(line)), Data.GetOffset(line, 0))).ToList()); }
public void ExpressionTest() { Assert.AreEqual("1125899906842624", new NEExpression("2^50").Evaluate().ToString()); Assert.AreEqual("4", new NEExpression("-(-4)").Evaluate().ToString()); Assert.AreEqual("4", new NEExpression("2 + 2").Evaluate().ToString()); Assert.AreEqual("7.1", new NEExpression("5.1 + 2").Evaluate().ToString()); Assert.AreEqual("5.1", new NEExpression("5 + .1").Evaluate().ToString()); Assert.AreEqual("5", new NEExpression("4.9 + .1").Evaluate().ToString()); Assert.AreEqual("5.2", new NEExpression("5.1 + .1").Evaluate().ToString()); Assert.AreEqual("bcd", new NEExpression("\"abc\" t++ 1").Evaluate().ToString()); Assert.AreEqual("25", new NEExpression("\"Z\" t--- \"A\"").Evaluate().ToString()); Assert.AreEqual("a1", new NEExpression("\"a\" t+ 1").Evaluate().ToString()); Assert.AreEqual("0", new NEExpression("2 - 2").Evaluate().ToString()); Assert.AreEqual("3.1", new NEExpression("5.1 - 2").Evaluate().ToString()); Assert.AreEqual("4.9", new NEExpression("5 - .1").Evaluate().ToString()); Assert.AreEqual("4.8", new NEExpression("4.9 - .1").Evaluate().ToString()); Assert.AreEqual("5", new NEExpression("5.1 - .1").Evaluate().ToString()); Assert.AreEqual("a", new NEExpression("\"b\" t-- 1").Evaluate().ToString()); Assert.AreEqual("10.8", new NEExpression("5.4 * 2").Evaluate().ToString()); Assert.AreEqual("10.5", new NEExpression("5 * 2.1").Evaluate().ToString()); Assert.AreEqual("okokokok", new NEExpression("\"ok\" t* 4").Evaluate().ToString()); Assert.AreEqual("oooo", new NEExpression("\"o\" t* 4").Evaluate().ToString()); Assert.AreEqual("2.5", new NEExpression("5 / 2").Evaluate().ToString()); Assert.AreEqual("2", new NEExpression("5 // 2").Evaluate().ToString()); Assert.AreEqual("2.5", new NEExpression("5.0 / 2").Evaluate().ToString()); Assert.AreEqual("2.5", new NEExpression("5 / 2.0").Evaluate().ToString()); Assert.AreEqual("64", new NEExpression("4 ^ 3").Evaluate().ToString()); Assert.AreEqual("4", new NEExpression("64 ^ (1 / 3.0)").Evaluate().ToString()); Assert.AreEqual("4.5", new NEExpression("410.0625 ^ .25").Evaluate().ToString()); Assert.AreEqual("8", new NEExpression("2 << 2").Evaluate().ToString()); Assert.AreEqual("1024", new NEExpression("1048576 >> 10").Evaluate().ToString()); Assert.AreEqual("-3735928560", new NEExpression("~p0").Evaluate(new NEVariables(0xdeadbeef)).ToString()); Assert.AreEqual("179154957", new NEExpression("&").Evaluate(new NEVariables(0xdeadbeef, 0x0badf00d)).ToString()); Assert.AreEqual("3573567202", new NEExpression("^^").Evaluate(new NEVariables(0xdeadbeef, 0x0badf00d)).ToString()); Assert.AreEqual("3752722159", new NEExpression("|").Evaluate(new NEVariables(0xdeadbeef, 0x0badf00d)).ToString()); Assert.AreEqual(true, new NEExpression("TRUE").Evaluate()); Assert.AreEqual(false, new NEExpression("False").Evaluate()); Assert.AreEqual("7.1", new NEExpression("5.0 + 2.1").Evaluate().ToString()); Assert.AreEqual("14.1", new NEExpression("3.6 + 2.1 * 5.0").Evaluate().ToString()); Assert.AreEqual("28.5", new NEExpression("(3.6 + 2.1) * 5.0").Evaluate().ToString()); Assert.AreEqual("12.1", new NEExpression("p0 + p1").Evaluate(new NEVariables(5.4, 6.7)).ToString()); Assert.AreEqual(true, new NEExpression("p0 is \"Int32\"").Evaluate(new NEVariables(5))); Assert.AreEqual(true, new NEExpression("\"5a\" t== \"5a\"").Evaluate()); Assert.AreEqual(false, new NEExpression("\"5a\" t== \"5A\"").Evaluate()); Assert.AreEqual(true, new NEExpression("\"5a\" ti== \"5a\"").Evaluate()); Assert.AreEqual(true, new NEExpression("\"5a\" ti== \"5A\"").Evaluate()); Assert.AreEqual(false, new NEExpression("\"5a\" t!= \"5a\"").Evaluate()); Assert.AreEqual(true, new NEExpression("\"5a\" t!= \"5A\"").Evaluate()); Assert.AreEqual(false, new NEExpression("\"5a\" ti!= \"5a\"").Evaluate()); Assert.AreEqual(false, new NEExpression("\"5a\" ti!= \"5A\"").Evaluate()); Assert.AreEqual("5", new NEExpression("p0.\"value\"").Evaluate(new NEVariables(new ExpressionDotTest(5))).ToString()); Assert.AreEqual(typeof(ExpressionDotTest).FullName, new NEExpression("Type(p0).\"FullName\"").Evaluate(new NEVariables(new ExpressionDotTest(5))).ToString()); Assert.AreEqual(true, new NEExpression("ValidRE(p0)").Evaluate(new NEVariables(@"\d+"))); Assert.AreEqual(false, new NEExpression("ValidRE(p0)").Evaluate(new NEVariables(@"["))); Assert.AreEqual("15.5", new NEExpression("+").Evaluate(new NEVariables(1, 2, 3, 4, 5.5)).ToString()); Assert.AreEqual(true, new NEExpression("||").Evaluate(new NEVariables(false, false, true, false))); Assert.AreEqual("120", new NEExpression("*").Evaluate(new NEVariables(4, 5, 6)).ToString()); Assert.AreEqual("5", new NEExpression("(p0 || p1) ? p2 : p3").Evaluate(new NEVariables(false, true, 5, 6)).ToString()); Assert.AreEqual("ICanJoinStrings", new NEExpression("t+").Evaluate(new NEVariables("I", "Can", null, "Join", "Strings")).ToString()); Assert.AreEqual("a\\\'\"\0\a\b\f\n\r\t\v\x1\x12\x123\x1234\u1234\U00001234\U0001d161", new NEExpression(@"""a"" t+ ""\\"" t+ ""\'"" t+ ""\"""" t+ ""\0"" t+ ""\a"" t+ ""\b"" t+ ""\f"" t+ ""\n"" t+ ""\r"" t+ ""\t"" t+ ""\v"" t+ ""\x1"" t+ ""\x12"" t+ ""\x123"" t+ ""\x1234"" t+ ""\u1234"" t+ ""\U00001234"" t+ ""\U0001d161""").Evaluate().ToString()); Assert.AreEqual("", new NEExpression("\"\"").Evaluate().ToString()); Assert.AreEqual(" Slash: \\ Quote: \' Double: \" Null: \0 Alert: \a Backspace: \b Form feed: \f New line: \n Carriage return:\r Tab: \t Vertical quote: \v Hex1: \x1 Hex2: \x12 Hex3: \x123 Hex4: \x1234 Unicode4: \u1234 Unicode8: \U00001234 Unicode8: \U0001d161 ", new NEExpression(@""" Slash: \\ Quote: \' Double: \"" Null: \0 Alert: \a Backspace: \b Form feed: \f New line: \n Carriage return:\r Tab: \t Vertical quote: \v Hex1: \x1 Hex2: \x12 Hex3: \x123 Hex4: \x1234 Unicode4: \u1234 Unicode8: \U00001234 Unicode8: \U0001d161 """).Evaluate().ToString()); Assert.AreEqual("", new NEExpression("@\"\"").Evaluate().ToString()); Assert.AreEqual(@"This \is "" my string", new NEExpression(@"@""This \is """" my string""").Evaluate().ToString()); Assert.AreEqual("", new NEExpression("$\"\"").Evaluate().ToString()); Assert.AreEqual("{2 + 2 = 4}\r\n", new NEExpression(@"$""{{\u0032 + 2 = {2 + 2}}}\r\n""").Evaluate().ToString()); Assert.AreEqual(@"\n ""{2 + 2} \= 4"" \n", new NEExpression(@"@$""\n """"{{2 + 2}} \= {2 + 2}"""" \n""").Evaluate().ToString()); Assert.AreEqual(@"\n ""{2 + 2} \= 4"" \n", new NEExpression(@"$@""\n """"{{2 + 2}} \= {2 + 2}"""" \n""").Evaluate().ToString()); Assert.AreEqual("", new NEExpression("@$\"\"").Evaluate().ToString()); Assert.AreEqual("", new NEExpression("$@\"\"").Evaluate().ToString()); Assert.AreEqual("p05+7 is 12", new NEExpression("StrFormat(\"p0{0}+{1} is {2}\", p0, p1, p0 + p1)").Evaluate(new NEVariables(5, 7)).ToString()); Assert.AreEqual("Test", new NEExpression("StrFormat(\"Test\")").Evaluate().ToString()); Assert.AreEqual("Test 5", new NEExpression("StrFormat(\"Test {0}\", 5)").Evaluate().ToString()); Assert.AreEqual("Test 5 7", new NEExpression("StrFormat(\"Test {0} {1}\", 5, 7)").Evaluate().ToString()); Assert.AreEqual(false, new NEExpression("!true").Evaluate()); Assert.AreEqual(true, new NEExpression("!p0").Evaluate(new NEVariables(false))); Assert.AreEqual("-4", new NEExpression("-4").Evaluate().ToString()); Assert.AreEqual(typeof(byte), new NEExpression("Type(p0)").Evaluate(new NEVariables((byte)0))); Assert.AreEqual("3931877116", new NEExpression("0xdeadbeef + p0").Evaluate(new NEVariables(0x0badf00d)).ToString()); Assert.AreEqual("2", new NEExpression("Min(3,4,2)").Evaluate().ToString()); Assert.AreEqual("4", new NEExpression("Max(3,4,2)").Evaluate().ToString()); Assert.AreEqual("16", new NEExpression("len(\"1125899906842624\")").Evaluate().ToString()); Assert.AreEqual("8", new NEExpression("multiple(8,8)").Evaluate().ToString()); Assert.AreEqual("16", new NEExpression("multiple(9,8)").Evaluate().ToString()); Assert.AreEqual("8.4", new NEExpression("multiple(1.1,8.4)").Evaluate().ToString()); Assert.AreEqual("16.8", new NEExpression("multiple(9.5,8.4)").Evaluate().ToString()); Assert.AreEqual("3 foot", new NEExpression("multiple(30 in,1 foot)").Evaluate().ToString()); Assert.AreEqual("3.14159265358979", new NEExpression("pi").Evaluate().ToString()); Assert.AreEqual("2.71828182845905", new NEExpression("e").Evaluate().ToString()); Assert.AreEqual("120", new NEExpression("5!").Evaluate().ToString()); Assert.AreEqual("Four hundred eleven billion forty five thousand three hundred twelve", new NEExpression("towords(411000045312)").Evaluate().ToString()); Assert.AreEqual("Zero", new NEExpression("towords(0)").Evaluate().ToString()); Assert.AreEqual("Negative five", new NEExpression("towords(-5)").Evaluate().ToString()); Assert.AreEqual("554212019", new NEExpression("fromwords(\" five -hundred-fifty-four million, two hundred twelve thousand, nineteen \")").Evaluate().ToString()); Assert.AreEqual("5110000", new NEExpression("fromwords(\"5.11 million\")").Evaluate().ToString()); Assert.AreEqual("411000045312", new NEExpression("fromwords(\"Four hundred eleven billion forty five thousand three hundred twelve\")").Evaluate().ToString()); Assert.AreEqual("0", new NEExpression("fromwords(\"Zero\")").Evaluate().ToString()); Assert.AreEqual("-5", new NEExpression("fromwords(\"Negative five\")").Evaluate().ToString()); Assert.AreEqual("5", new NEExpression("gcf(30,20,15)").Evaluate().ToString()); Assert.AreEqual("60", new NEExpression("lcm(30,20,15)").Evaluate().ToString()); Assert.AreEqual("1/5", new NEExpression("reduce(20,100)").Evaluate().ToString()); Assert.AreEqual("11 m/s", new NEExpression("5.5 m/(s^2)/s*s * 2 s").Evaluate().ToString()); Assert.AreEqual("1440 minutes", new NEExpression("1 day => minutes").Evaluate().ToString()); Assert.AreEqual("17168.481792 m^2", new NEExpression("5 miles * 7 feet => m^2").Evaluate().ToString()); Assert.AreEqual("5 cm^3", new NEExpression("5 ml => cm^3").Evaluate().ToString()); Assert.AreEqual("5280 feet", new NEExpression("1 mile => feet").Evaluate().ToString()); Assert.AreEqual("147197952000 feet^3", new NEExpression("1 mile^3 => feet^3").Evaluate().ToString()); Assert.AreEqual("328.15 K", new NEExpression("55 degc => K").Evaluate().ToString()); Assert.AreEqual("55 degc", new NEExpression("328.15 K => degc").Evaluate().ToString()); Assert.AreEqual("15 degc", new NEExpression("59 degf => degc").Evaluate().ToString()); Assert.AreEqual("59 degf", new NEExpression("15 degc => degf").Evaluate().ToString()); Assert.AreEqual("26 in", new NEExpression("2 in + 2 ft").Evaluate().ToString()); Assert.AreEqual(true, new NEExpression("5 km = 5000000 mm").Evaluate()); Assert.AreEqual("5000 kg*m^2/s^2", new NEExpression("5 kJ => SI").Evaluate().ToString()); Assert.AreEqual("1E-06 m^3", new NEExpression("1 mL => SI").Evaluate().ToString()); Assert.AreEqual("1000000 s^-1", new NEExpression("1 MHz => SI").Evaluate().ToString()); Assert.AreEqual("10 W", new NEExpression("10 J/s => Simple").Evaluate().ToString()); Assert.AreEqual("25 $/lessons", new NEExpression("1000$ / 40 lessons").Evaluate().ToString()); Assert.AreEqual("25", new NEExpression("25").Evaluate(unit: "bytes").ToString()); Assert.AreEqual("25", new NEExpression("25 bytes").Evaluate(unit: "bytes").ToString()); Assert.AreEqual("25600", new NEExpression("25 kb").Evaluate(unit: "bytes").ToString()); Assert.AreEqual("26214400", new NEExpression("25 mb").Evaluate(unit: "bytes").ToString()); Assert.AreEqual("25600", new NEExpression("25 mb").Evaluate(unit: "kb").ToString()); Assert.AreEqual("-1", new NEExpression("cos(pi)").Evaluate().ToString()); Assert.AreEqual("-1", new NEExpression("cos(pi rad)").Evaluate().ToString()); Assert.AreEqual("-1", new NEExpression("cos(180 deg)").Evaluate().ToString()); Assert.AreEqual("3.14159265358979 rad", new NEExpression("acos(-1)").Evaluate().ToString()); Assert.AreEqual("180 deg", new NEExpression("acos(-1) => deg").Evaluate().ToString()); Assert.AreEqual("0", new NEExpression("factor(0)").Evaluate().ToString()); Assert.AreEqual("-1*2*2*3*5*7*11", new NEExpression("factor(-4620)").Evaluate().ToString()); Assert.AreEqual(true, new NEExpression("valideval(\"(5+2)\")").Evaluate()); Assert.AreEqual(false, new NEExpression("valideval(\"(5+)2\")").Evaluate()); var values = new NEExpression("random(2,10)").EvaluateList <int>(null, 1000).Distinct().OrderBy().ToList(); Assert.IsTrue(values.Count == 9); var miscVars = new NEVariables( NEVariable.Constant("x", "", () => 0xdeadbeef), NEVariable.Constant("y", "", () => 0x0badf00d), NEVariable.Constant("z", "", () => 0x0defaced) ); var expr = new NEExpression("x - y + 0xfeedface"); var vars = expr.Variables; Assert.AreEqual(2, vars.Count); Assert.IsTrue(vars.Contains("x")); Assert.IsTrue(vars.Contains("y")); Assert.AreEqual("7816989104", expr.Evaluate(miscVars).ToString()); CheckDates(); }
void Command_Expression_InlineVariables_Solve(ExpressionSolveDialog.Result result, AnswerResult answer) { var inlineVars = GetInlineVariables(); var setIndex = inlineVars.FindIndex(inlineVar => inlineVar.Name.Equals(result.SetVariable)); if (setIndex == -1) { throw new Exception($"Unknown variable: {result.SetVariable}"); } var changeIndex = inlineVars.FindIndex(inlineVar => inlineVar.Name.Equals(result.ChangeVariable)); if (changeIndex == -1) { throw new Exception($"Unknown variable: {result.ChangeVariable}"); } var variables = GetVariables(); var target = new NEExpression(result.TargetExpression).Evaluate <double>(variables, ""); var tolerance = new NEExpression(result.ToleranceExpression).Evaluate <double>(variables, ""); var value = new NEExpression(result.StartValueExpression).Evaluate <double>(variables, ""); Func <double, double> GetValue = input => { inlineVars[changeIndex].Expression = input.ToString(); CalculateInlineVariables(inlineVars); var exception = inlineVars.Select(inlineVar => inlineVar.Value).OfType <Exception>().FirstOrDefault(); if (exception != null) { throw exception; } var diff = Math.Abs(inlineVars[setIndex].Value - target); if ((double.IsNaN(diff)) || (double.IsInfinity(diff))) { diff = double.MaxValue; } return(diff); }; var current = GetValue(value); var level = Math.Pow(10, Math.Floor(Math.Log10(value))); var increasing = true; double?prev = null, next = null; var maxLoops = 100; while (maxLoops-- > 0) { if (increasing) { level *= 10; } else if (current <= tolerance) { break; } prev = prev ?? GetValue(value - level); next = next ?? GetValue(value + level); if ((current <= prev) && (current <= next)) { increasing = false; level /= 10; prev = next = null; } else if (increasing) { prev = next = null; } else if (prev <= next) { next = current; current = prev.Value; prev = null; value -= level; } else { prev = current; current = next.Value; next = null; value += level; } } if (maxLoops == 0) { if ((answer.Answer != MessageOptions.YesToAll) && (answer.Answer != MessageOptions.NoToAll)) { answer.Answer = new Message(WindowParent) { Title = "Confirm", Text = "Unable to find value. Use best match?", Options = MessageOptions.YesNoYesAll, DefaultCancel = MessageOptions.No, } }