Esempio n. 1
0
        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());
        }
Esempio n. 3
0
        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
            });
        }
Esempio n. 4
0
        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());
        }
Esempio n. 11
0
        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]));
        }
Esempio n. 12
0
 NEExpression GetExpression(string expression)
 {
     if (expression == null)
     {
         expression = "";
     }
     if (!expressionUsed.ContainsKey(expression))
     {
         expressionUsed[expression] = new NEExpression(expression);
     }
     return(expressionUsed[expression]);
 }
Esempio n. 13
0
        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
            });
        }
Esempio n. 14
0
        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]);
                }
        }
Esempio n. 15
0
		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());
		}
Esempio n. 16
0
		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 { }
		}
Esempio n. 17
0
        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);
        }
Esempio n. 18
0
        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);
        }
Esempio n. 19
0
        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());
        }
Esempio n. 21
0
		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();
		}
Esempio n. 22
0
		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();
		}
Esempio n. 23
0
		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]);
				}
		}
Esempio n. 24
0
		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));
		}
Esempio n. 25
0
		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));
		}
Esempio n. 26
0
        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));
        }
Esempio n. 27
0
		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));
		}
Esempio n. 28
0
		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);
		}
Esempio n. 29
0
		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());
		}
Esempio n. 30
0
        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();
        }
Esempio n. 31
0
        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,
                    }
                }