public ZTuningWidget(PrinterSettings printerSettings, ThemeConfig theme, bool allowRemoveButton = true)
        {
            this.theme             = theme;
            this.printerSettings   = printerSettings;
            this.allowRemoveButton = allowRemoveButton;
            this.HAnchor           = HAnchor.Fit;
            this.VAnchor           = VAnchor.Fit | VAnchor.Center;

            zOffsetStreamContainer = new FlowLayoutWidget(FlowDirection.LeftToRight)
            {
                Margin          = new BorderDouble(3, 0),
                Padding         = new BorderDouble(3),
                HAnchor         = HAnchor.Fit,
                VAnchor         = VAnchor.Center,
                BackgroundColor = theme.MinimalShade,
                Height          = 20
            };
            this.AddChild(zOffsetStreamContainer);

            double zoffset = printerSettings.GetValue <double>(SettingsKey.baby_step_z_offset);

            zOffsetStreamDisplay = new TextWidget(zoffset.ToString("0.##"), pointSize: theme.DefaultFontSize)
            {
                AutoExpandBoundsToText = true,
                TextColor = theme.TextColor,
                Margin    = new BorderDouble(5, 0, 8, 0),
                VAnchor   = VAnchor.Center
            };
            zOffsetStreamContainer.AddChild(zOffsetStreamDisplay);

            clearZOffsetButton             = theme.CreateSmallResetButton();
            clearZOffsetButton.Name        = "Clear ZOffset button";
            clearZOffsetButton.ToolTipText = "Clear ZOffset".Localize();
            clearZOffsetButton.Visible     = allowRemoveButton && zoffset != 0;
            clearZOffsetButton.Click      += (sender, e) =>
            {
                printerSettings.SetValue(SettingsKey.baby_step_z_offset, "0");
            };
            zOffsetStreamContainer.AddChild(clearZOffsetButton);

            // Register listeners
            printerSettings.SettingChanged += Printer_SettingChanged;
        }
Beispiel #2
0
        public void LevelingMesh3x3CorectInterpolation()
        {
            AggContext.StaticData = new FileSystemStaticData(TestContext.CurrentContext.ResolveProjectPath(4, "StaticData"));
            MatterControlUtilities.OverrideAppDataLocation(TestContext.CurrentContext.ResolveProjectPath(4));

            var printerSettings = new PrinterSettings();

            printerSettings.SetValue(SettingsKey.z_probe_z_offset, "0");

            var printer = new PrinterConfig(printerSettings);

            // a 2 x 2 mesh that goes form 0 on the left to 10 on the right
            {
                var levelingData = new PrintLevelingData();

                // put them in left to right - bottom to top
                levelingData.SampledPositions = new List <Vector3>();
                levelingData.SampledPositions.Add(new Vector3(0, 0, 0));
                levelingData.SampledPositions.Add(new Vector3(10, 0, 10));
                levelingData.SampledPositions.Add(new Vector3(0, 10, 0));
                levelingData.SampledPositions.Add(new Vector3(10, 10, 10));

                LevelingFunctions levelingFunctionsMesh2x2 = new LevelingFunctions(printer, levelingData);

                // check on points
                AssertMeshLevelPoint(new Vector3(0, 0, 0), new Vector3(0, 0, 0), levelingFunctionsMesh2x2);
                AssertMeshLevelPoint(new Vector3(10, 0, 0), new Vector3(10, 0, 10), levelingFunctionsMesh2x2);
                AssertMeshLevelPoint(new Vector3(10, 10, 0), new Vector3(10, 10, 10), levelingFunctionsMesh2x2);
                AssertMeshLevelPoint(new Vector3(0, 10, 0), new Vector3(0, 10, 0), levelingFunctionsMesh2x2);

                // check raised on points
                AssertMeshLevelPoint(new Vector3(0, 0, 5), new Vector3(0, 0, 5), levelingFunctionsMesh2x2);
                AssertMeshLevelPoint(new Vector3(10, 0, 5), new Vector3(10, 0, 15), levelingFunctionsMesh2x2);
                AssertMeshLevelPoint(new Vector3(10, 10, 5), new Vector3(10, 10, 15), levelingFunctionsMesh2x2);
                AssertMeshLevelPoint(new Vector3(0, 10, 5), new Vector3(0, 10, 5), levelingFunctionsMesh2x2);

                // check between points
                AssertMeshLevelPoint(new Vector3(5, 0, 0), new Vector3(5, 0, 5), levelingFunctionsMesh2x2);
                AssertMeshLevelPoint(new Vector3(5, 0, 5), new Vector3(5, 0, 10), levelingFunctionsMesh2x2);

                // check outside points
                AssertMeshLevelPoint(new Vector3(-5, 0, 0), new Vector3(-5, 0, -5), levelingFunctionsMesh2x2);
                AssertMeshLevelPoint(new Vector3(-5, 0, 5), new Vector3(-5, 0, 0), levelingFunctionsMesh2x2);
                AssertMeshLevelPoint(new Vector3(15, 0, 0), new Vector3(15, 0, 15), levelingFunctionsMesh2x2);
                AssertMeshLevelPoint(new Vector3(15, 0, 5), new Vector3(15, 0, 20), levelingFunctionsMesh2x2);
            }

            // a 3 x 3 mesh that goes form 0 on the left to 10 on the right
            {
                var levelingData = new PrintLevelingData();

                // put them in left to right - bottom to top
                levelingData.SampledPositions = new List <Vector3>();
                levelingData.SampledPositions.Add(new Vector3(0, 0, 0));
                levelingData.SampledPositions.Add(new Vector3(5, 0, 5));
                levelingData.SampledPositions.Add(new Vector3(10, 0, 10));
                levelingData.SampledPositions.Add(new Vector3(0, 5, 0));
                levelingData.SampledPositions.Add(new Vector3(5, 5, 5));
                levelingData.SampledPositions.Add(new Vector3(10, 5, 10));
                levelingData.SampledPositions.Add(new Vector3(0, 10, 0));
                levelingData.SampledPositions.Add(new Vector3(5, 10, 5));
                levelingData.SampledPositions.Add(new Vector3(10, 10, 10));

                LevelingFunctions levelingFunctionsMesh2x2 = new LevelingFunctions(printer, levelingData);

                // check on points
                AssertMeshLevelPoint(new Vector3(0, 0, 0), new Vector3(0, 0, 0), levelingFunctionsMesh2x2);
                AssertMeshLevelPoint(new Vector3(10, 0, 0), new Vector3(10, 0, 10), levelingFunctionsMesh2x2);
                AssertMeshLevelPoint(new Vector3(10, 10, 0), new Vector3(10, 10, 10), levelingFunctionsMesh2x2);
                AssertMeshLevelPoint(new Vector3(0, 10, 0), new Vector3(0, 10, 0), levelingFunctionsMesh2x2);

                // check raised on points
                AssertMeshLevelPoint(new Vector3(0, 0, 5), new Vector3(0, 0, 5), levelingFunctionsMesh2x2);
                AssertMeshLevelPoint(new Vector3(10, 0, 5), new Vector3(10, 0, 15), levelingFunctionsMesh2x2);
                AssertMeshLevelPoint(new Vector3(10, 10, 5), new Vector3(10, 10, 15), levelingFunctionsMesh2x2);
                AssertMeshLevelPoint(new Vector3(0, 10, 5), new Vector3(0, 10, 5), levelingFunctionsMesh2x2);

                // check between points
                AssertMeshLevelPoint(new Vector3(5, 0, 0), new Vector3(5, 0, 5), levelingFunctionsMesh2x2);
                AssertMeshLevelPoint(new Vector3(5, 0, 5), new Vector3(5, 0, 10), levelingFunctionsMesh2x2);

                // check outside points
                AssertMeshLevelPoint(new Vector3(-5, 0, 0), new Vector3(-5, 0, -5), levelingFunctionsMesh2x2);
                AssertMeshLevelPoint(new Vector3(-5, 0, 5), new Vector3(-5, 0, 0), levelingFunctionsMesh2x2);
                AssertMeshLevelPoint(new Vector3(15, 0, 0), new Vector3(15, 0, 15), levelingFunctionsMesh2x2);
                AssertMeshLevelPoint(new Vector3(15, 0, 5), new Vector3(15, 0, 20), levelingFunctionsMesh2x2);
            }
        }
        public void MorePauseHandlingStreamTests()
        {
            string[] inputLines = new string[]
            {
                "; the printer is moving normally",
                "G1 X10 Y10 Z10 E0",
                "G1 X11 Y10 Z10 E10",
                "G1 X12 Y10 Z10 E30",

                "; the printer pauses",
                "@pause",

                "; do_resume",                 // just a marker for us to issue a resume

                // move some more
                "G1 X13 Y10 Z10 E40",
                "G1 X14 Y10 Z10 E50",
                "G1 X15 Y10 Z10 E60",
                null,
            };

            // We should go back to the above code when possible. It requires making pause part and move while paused part of the stream.
            // All communication should go through stream to minimize the difference between printing and controlling while not printing (all printing in essence).
            string[] expected = new string[]
            {
                "; the printer is moving normally",
                "G1 X10 Y10 Z10",
                "G1 X11 E10",
                "G1 X12 E30",
                "; the printer pauses",
                "",
                "",
                "G1 Z20 E20 F12000",
                "G90",
                "M114",
                "",
                "; do_resume",
                "G92 E-10",
                "G1 Z16.67 F3001",
                "G1 X12.01 Y10.01 Z13.34",
                "G1 Z10.01",
                "G1 X12 Y10 Z10 F3000",
                "",
                "G1 Z0 E30.8 F12000",
                "G90",
                "M114",
                "G1 X13 Z10 E40",
                "G1 X14 E50",
                "G1 X15 E60",
                null,
            };

            StaticData.Instance = new MatterHackers.Agg.FileSystemStaticData(Path.Combine("..", "..", "..", "..", "StaticData"));

            MatterControlUtilities.OverrideAppDataLocation();

            // this is the pause and resume from the Eris
            PrinterSettings settings = ActiveSliceSettings.Instance;

            settings.SetValue(SettingsKey.pause_gcode, "G91\nG1 Z10 E - 10 F12000\n  G90");
            settings.SetValue(SettingsKey.resume_gcode, "G91\nG1 Z-10 E10.8 F12000\nG90");

            List <GCodeStream>  streamList;
            GCodeStream         pauseHandlingStream = CreateTestGCodeStream(inputLines, out streamList);
            PauseHandlingStream pauseStream         = null;

            foreach (var stream in streamList)
            {
                if (stream as PauseHandlingStream != null)
                {
                    pauseStream = (PauseHandlingStream)stream;
                    break;
                }
            }

            int    expectedIndex = 0;
            string actualLine    = pauseHandlingStream.ReadLine();
            string expectedLine  = expected[expectedIndex++];

            Assert.AreEqual(expectedLine, actualLine, "Unexpected response from PauseHandlingStream");

            while (actualLine != null)
            {
                expectedLine = expected[expectedIndex++];
                actualLine   = pauseHandlingStream.ReadLine();
                //Debug.WriteLine("\"{0}\",".FormatWith(actualLine));
                if (actualLine == "; do_resume")
                {
                    pauseStream.Resume();
                }

                Assert.AreEqual(expectedLine, actualLine, "Unexpected response from PauseHandlingStream");
            }
        }
Beispiel #4
0
        private void AddDisplay(PrinterSettings printerSettings,
                                ThemeConfig theme,
                                bool showClearButton,
                                string setting,
                                int toolIndex,
                                TextWidget widget)
        {
            GuiWidget clearZOffsetButton = null;

            void Printer_SettingChanged(object s, StringEventArgs e)
            {
                if (e?.Data == setting)
                {
                    double zOffset = printerSettings.GetValue <double>(setting);
                    bool   hasOverriddenZOffset = zOffset != 0;

                    if (clearZOffsetButton != null)
                    {
                        clearZOffsetButton.Visible = hasOverriddenZOffset;
                    }

                    widget.Text = zOffset.ToString("0.##");
                    DescribeExtruder(widget, toolIndex);
                }
            }

            var zOffsetStreamContainer = new FlowLayoutWidget(FlowDirection.LeftToRight)
            {
                Margin  = new BorderDouble(3, 0),
                Padding = new BorderDouble(3),
                HAnchor = HAnchor.Fit | HAnchor.Right,
                VAnchor = VAnchor.Absolute,
                Height  = 20 * GuiWidget.DeviceScale
            };

            this.AddChild(zOffsetStreamContainer);

            var zoffset = printerSettings.GetValue <double>(setting);

            zOffsetStreamContainer.AddChild(widget);

            if (showClearButton)
            {
                clearZOffsetButton             = theme.CreateSmallResetButton();
                clearZOffsetButton.Name        = "Clear ZOffset button";
                clearZOffsetButton.ToolTipText = "Clear ZOffset".Localize();
                clearZOffsetButton.Visible     = zoffset != 0;
                clearZOffsetButton.Click      += (sender, e) =>
                {
                    printerSettings.SetValue(setting, "0");
                };
                zOffsetStreamContainer.AddChild(clearZOffsetButton);
            }

            printerSettings.SettingChanged += Printer_SettingChanged;

            this.Closed += (s, e) =>
            {
                printerSettings.SettingChanged -= Printer_SettingChanged;
            };
        }