diff --git a/ApplicationView/ApplicationController.cs b/ApplicationView/ApplicationController.cs index b21fd4d5c..7494956e1 100644 --- a/ApplicationView/ApplicationController.cs +++ b/ApplicationView/ApplicationController.cs @@ -52,6 +52,7 @@ namespace MatterHackers.MatterControl using Agg.Font; using Agg.Image; using CustomWidgets; + using MatterHackers.Agg.Transform; using MatterHackers.DataConverters3D; using MatterHackers.GCodeVisualizer; using MatterHackers.MatterControl.ConfigurationPage.PrintLeveling; @@ -69,10 +70,53 @@ namespace MatterHackers.MatterControl public class BedConfig { + public event EventHandler ActiveLayerChanged; + public GCodeFile LoadedGCode { get; set; } // TODO: Make assignment private, wire up post slicing initialization here public GCodeRenderer GCodeRenderer { get; set; } + + public int ActiveLayerIndex + { + get + { + return activeLayerIndex; + } + + set + { + if (activeLayerIndex != value) + { + activeLayerIndex = value; + + if (this.GCodeRenderer == null || activeLayerIndex < 0) + { + activeLayerIndex = 0; + } + else if (activeLayerIndex >= this.LoadedGCode.NumChangesInZ) + { + activeLayerIndex = this.LoadedGCode.NumChangesInZ - 1; + } + + this.RenderInfo.EndLayerIndex = activeLayerIndex; + + ActiveLayerChanged?.Invoke(this, null); + } + } + } + + private int activeLayerIndex; + + public GCodeRenderInfo RenderInfo { get; set; } + + internal void RenderExtra() + { + if (this.RenderInfo != null) + { + this.GCodeRenderer.Render3D(this.RenderInfo); + } + } } public class PrinterConfig diff --git a/MatterControl.OpenGL/GCodeRenderer/GCodeRenderInfo.cs b/MatterControl.OpenGL/GCodeRenderer/GCodeRenderInfo.cs index f8546087d..5c648b0c0 100644 --- a/MatterControl.OpenGL/GCodeRenderer/GCodeRenderInfo.cs +++ b/MatterControl.OpenGL/GCodeRenderer/GCodeRenderInfo.cs @@ -53,7 +53,7 @@ namespace MatterHackers.GCodeVisualizer public int StartLayerIndex { get; set; } - public int EndLayerIndex { get; } + public int EndLayerIndex { get; set; } public Affine Transform { get; } @@ -61,9 +61,9 @@ namespace MatterHackers.GCodeVisualizer public RenderType CurrentRenderType { get; } - public double FeatureToStartOnRatio0To1 { get; } + public double FeatureToStartOnRatio0To1 { get; set; } - public double FeatureToEndOnRatio0To1 { get; } + public double FeatureToEndOnRatio0To1 { get; set; } public GCodeRenderInfo() { diff --git a/MatterControl.OpenGL/GCodeRenderer/GCodeRenderer.cs b/MatterControl.OpenGL/GCodeRenderer/GCodeRenderer.cs index 822d0056b..c581e27ea 100644 --- a/MatterControl.OpenGL/GCodeRenderer/GCodeRenderer.cs +++ b/MatterControl.OpenGL/GCodeRenderer/GCodeRenderer.cs @@ -275,6 +275,11 @@ namespace MatterHackers.GCodeVisualizer public void Render3D(GCodeRenderInfo renderInfo) { + if (renderInfo == null) + { + return; + } + if (layerVertexBuffer == null) { layerVertexBuffer = new List(); diff --git a/PartPreviewWindow/GCode2DWidget.cs b/PartPreviewWindow/GCode2DWidget.cs index 22b86fe9a..da23239f5 100644 --- a/PartPreviewWindow/GCode2DWidget.cs +++ b/PartPreviewWindow/GCode2DWidget.cs @@ -48,9 +48,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { public event EventHandler DoneLoading; - public double FeatureToStartOnRatio0To1 = 0; - public double FeatureToEndOnRatio0To1 = 1; - public enum ETransformState { Move, Scale }; public ETransformState TransformState { get; set; } @@ -59,7 +56,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow private Vector2 mouseDownPosition = new Vector2(0, 0); private double layerScale = 1; - private int activeLayerIndex; private Vector2 gridSizeMm; private Vector2 gridCenterMm; @@ -88,38 +84,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow private Vector2 unscaledRenderOffset = new Vector2(0, 0); - public event EventHandler ActiveLayerChanged; - private GCodeFile loadedGCode => printer.BedPlate.LoadedGCode; - public int ActiveLayerIndex - { - get - { - return activeLayerIndex; - } - - set - { - if (activeLayerIndex != value) - { - activeLayerIndex = value; - - if (printer.BedPlate.GCodeRenderer == null || activeLayerIndex < 0) - { - activeLayerIndex = 0; - } - else if (activeLayerIndex >= loadedGCode.NumChangesInZ) - { - activeLayerIndex = loadedGCode.NumChangesInZ - 1; - } - Invalidate(); - - ActiveLayerChanged?.Invoke(this, null); - } - } - } - private ReportProgressRatio progressReporter; private View3DConfig options; @@ -127,6 +93,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow public GCode2DWidget(Vector2 gridSizeMm, Vector2 gridCenterMm, ReportProgressRatio progressReporter) { + options = ApplicationController.Instance.Options.View3D; printer = ApplicationController.Instance.Printer; @@ -141,7 +108,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow private void SetInitalLayer() { - activeLayerIndex = 0; if (loadedGCode.LineCount > 0) { int firstExtrusionIndex = 0; @@ -166,7 +132,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { if (firstExtrusionIndex < loadedGCode.GetInstructionIndexAtLayer(layerIndex)) { - activeLayerIndex = Math.Max(0, layerIndex - 1); + printer.BedPlate.ActiveLayerIndex = Math.Max(0, layerIndex - 1); break; } } @@ -207,13 +173,13 @@ namespace MatterHackers.MatterControl.PartPreviewWindow } var renderInfo = new GCodeRenderInfo( - activeLayerIndex, - activeLayerIndex, + printer.BedPlate.ActiveLayerIndex, + printer.BedPlate.ActiveLayerIndex, transform, layerScale, CreateRenderInfo(), - FeatureToStartOnRatio0To1, - FeatureToEndOnRatio0To1, + printer.BedPlate.RenderInfo.FeatureToStartOnRatio0To1, + printer.BedPlate.RenderInfo.FeatureToEndOnRatio0To1, new Vector2[] { ActiveSliceSettings.Instance.Helpers.ExtruderOffset(0), diff --git a/PartPreviewWindow/LayerNavigationWidget.cs b/PartPreviewWindow/LayerNavigationWidget.cs index f4bd08a62..a606e2db1 100644 --- a/PartPreviewWindow/LayerNavigationWidget.cs +++ b/PartPreviewWindow/LayerNavigationWidget.cs @@ -49,7 +49,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow var prevLayerButton = buttonFactory.Generate("<<"); prevLayerButton.Click += (s, e) => { - gcode2DWidget.ActiveLayerIndex = (gcode2DWidget.ActiveLayerIndex - 1); + printer.BedPlate.ActiveLayerIndex -= 1; }; this.AddChild(prevLayerButton); @@ -65,7 +65,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow var nextLayerButton = buttonFactory.Generate(">>"); nextLayerButton.Click += (s, e) => { - gcode2DWidget.ActiveLayerIndex = (gcode2DWidget.ActiveLayerIndex + 1); + printer.BedPlate.ActiveLayerIndex += 1; }; this.AddChild(nextLayerButton); } @@ -75,7 +75,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { if (printer.BedPlate.LoadedGCode != null) { - layerCountTextWidget.Text = string.Format("{0} / {1}", gcode2DWidget.ActiveLayerIndex + 1, printer.BedPlate.LoadedGCode.NumChangesInZ.ToString()); + layerCountTextWidget.Text = string.Format("{0} / {1}", printer.BedPlate.ActiveLayerIndex + 1, printer.BedPlate.LoadedGCode.NumChangesInZ.ToString()); } base.OnDraw(graphics2D); diff --git a/PartPreviewWindow/SetLayerWidget.cs b/PartPreviewWindow/SetLayerWidget.cs index 09e815359..53707d23c 100644 --- a/PartPreviewWindow/SetLayerWidget.cs +++ b/PartPreviewWindow/SetLayerWidget.cs @@ -35,7 +35,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { public class SetLayerWidget : FlowLayoutWidget { - public SetLayerWidget(GCode2DWidget gcode2DWidget, TextImageButtonFactory buttonFactory) + public SetLayerWidget(GCode2DWidget gcode2DWidget, TextImageButtonFactory buttonFactory, BedConfig bedConfig) : base(FlowDirection.LeftToRight) { var editCurrentLayerIndex = new NumberEdit(1, pixelWidth: 40) @@ -46,21 +46,21 @@ namespace MatterHackers.MatterControl.PartPreviewWindow }; editCurrentLayerIndex.EditComplete += (s, e) => { - gcode2DWidget.ActiveLayerIndex = ((int)editCurrentLayerIndex.Value - 1); - editCurrentLayerIndex.Value = gcode2DWidget.ActiveLayerIndex + 1; + bedConfig.ActiveLayerIndex = ((int)editCurrentLayerIndex.Value - 1); + editCurrentLayerIndex.Value = bedConfig.ActiveLayerIndex + 1; }; this.AddChild(editCurrentLayerIndex); - gcode2DWidget.ActiveLayerChanged += (s, e) => + bedConfig.ActiveLayerChanged += (s, e) => { - editCurrentLayerIndex.Value = gcode2DWidget.ActiveLayerIndex + 1; + editCurrentLayerIndex.Value = bedConfig.ActiveLayerIndex + 1; }; var setLayerButton = buttonFactory.Generate("Go".Localize()); setLayerButton.VAnchor = VAnchor.ParentCenter; setLayerButton.Click += (s, e) => { - gcode2DWidget.ActiveLayerIndex = ((int)editCurrentLayerIndex.Value - 1); + bedConfig.ActiveLayerIndex = ((int)editCurrentLayerIndex.Value - 1); }; this.AddChild(setLayerButton); } diff --git a/PartPreviewWindow/ViewGcodeBasic.cs b/PartPreviewWindow/ViewGcodeBasic.cs index 523344d17..8b51b5f54 100644 --- a/PartPreviewWindow/ViewGcodeBasic.cs +++ b/PartPreviewWindow/ViewGcodeBasic.cs @@ -92,6 +92,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow private PrinterConfig printer; private ViewControls3D viewControls3D; + private BedConfig bedPlate; + public ViewGcodeBasic(Vector3 viewerVolume, Vector2 bedCenter, BedShape bedShape, WindowMode windowMode, ViewControls3D viewControls3D, ThemeConfig theme, MeshViewerWidget externalMeshViewer) { this.externalMeshViewer = externalMeshViewer; @@ -128,10 +130,22 @@ namespace MatterHackers.MatterControl.PartPreviewWindow } }, ref unregisterEvents); + bedPlate = ApplicationController.Instance.Printer.BedPlate; + + bedPlate.ActiveLayerChanged += ActiveLayer_Changed; + // TODO: Why do we clear GCode on AdvancedControlsPanelReloading - assume some slice settings should invalidate. If so, code should be more specific and bound to slice settings changed ApplicationController.Instance.AdvancedControlsPanelReloading.RegisterEvent((s, e) => printer.BedPlate.GCodeRenderer?.Clear3DGCode(), ref unregisterEvents); } + private void ActiveLayer_Changed(object sender, EventArgs e) + { + if (bedPlate.ActiveLayerIndex != (int)(selectLayerSlider.Value + .5)) + { + selectLayerSlider.Value = bedPlate.ActiveLayerIndex; + } + } + private GCodeFile loadedGCode => printer.BedPlate.LoadedGCode; private void CreateAndAddChildren() @@ -145,8 +159,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow gcodeProcessingStateInfoText = null; FlowLayoutWidget mainContainerTopToBottom = new FlowLayoutWidget(FlowDirection.TopToBottom); - mainContainerTopToBottom.HAnchor = Agg.UI.HAnchor.Max_FitToChildren_ParentWidth; - mainContainerTopToBottom.VAnchor = Agg.UI.VAnchor.Max_FitToChildren_ParentHeight; + mainContainerTopToBottom.HAnchor = HAnchor.Max_FitToChildren_ParentWidth; + mainContainerTopToBottom.VAnchor = VAnchor.Max_FitToChildren_ParentHeight; buttonBottomPanel = new FlowLayoutWidget(FlowDirection.LeftToRight); buttonBottomPanel.HAnchor = HAnchor.ParentLeftRight; @@ -345,24 +359,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow return; } - GCodeRenderer.ExtrusionColor = ActiveTheme.Instance.PrimaryAccentColor; - - var renderInfo = new GCodeRenderInfo( - 0, - Math.Min(gcode2DWidget.ActiveLayerIndex + 1, loadedGCode.NumChangesInZ), - gcode2DWidget.TotalTransform, - 1, - GetRenderType(), - gcode2DWidget.FeatureToStartOnRatio0To1, - gcode2DWidget.FeatureToEndOnRatio0To1, - new Vector2[] - { - ActiveSliceSettings.Instance.Helpers.ExtruderOffset(0), - ActiveSliceSettings.Instance.Helpers.ExtruderOffset(1) - }, - MeshViewerWidget.GetMaterialColor); - - printer.BedPlate.GCodeRenderer.Render3D(renderInfo); + printer.BedPlate.RenderExtra(); } private void SetAnimationPosition() @@ -646,6 +643,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow } } + var printer = ApplicationController.Instance.Printer; + if (gcode2DWidget != null && loadedGCode?.LineCount > 0) { @@ -660,8 +659,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow viewControlsToggle.Visible = true; setLayerWidget?.Close(); - setLayerWidget = new SetLayerWidget(gcode2DWidget, ApplicationController.Instance.Theme.GCodeLayerButtons); - setLayerWidget.VAnchor = Agg.UI.VAnchor.ParentTop; + setLayerWidget = new SetLayerWidget(gcode2DWidget, ApplicationController.Instance.Theme.GCodeLayerButtons, ApplicationController.Instance.Printer.BedPlate); + setLayerWidget.VAnchor = VAnchor.ParentTop; layerSelectionButtonsPanel.AddChild(setLayerWidget); navigationWidget?.Close(); @@ -673,20 +672,15 @@ namespace MatterHackers.MatterControl.PartPreviewWindow selectLayerSlider = new SolidSlider(new Vector2(), sliderWidth, 0, loadedGCode.NumChangesInZ - 1, Orientation.Vertical); selectLayerSlider.ValueChanged += (s, e) => { - gcode2DWidget.FeatureToStartOnRatio0To1 = layerRenderRatioSlider.FirstValue; - gcode2DWidget.FeatureToEndOnRatio0To1 = layerRenderRatioSlider.SecondValue; - gcode2DWidget.Invalidate(); + // TODO: Why would these need to be updated here as well as in assigned in the hslider below? + printer.BedPlate.RenderInfo.FeatureToStartOnRatio0To1 = layerRenderRatioSlider.FirstValue; + printer.BedPlate.RenderInfo.FeatureToEndOnRatio0To1 = layerRenderRatioSlider.SecondValue; - gcode2DWidget.ActiveLayerIndex = (int)(selectLayerSlider.Value + .5); + printer.BedPlate.ActiveLayerIndex = (int)(selectLayerSlider.Value + .5); + + this.Invalidate(); }; - gcode2DWidget.ActiveLayerChanged += (s, e) => - { - if (gcode2DWidget.ActiveLayerIndex != (int)(selectLayerSlider.Value + .5)) - { - selectLayerSlider.Value = gcode2DWidget.ActiveLayerIndex; - } - }; AddChild(selectLayerSlider); layerRenderRatioSlider?.Close(); @@ -694,24 +688,40 @@ namespace MatterHackers.MatterControl.PartPreviewWindow layerRenderRatioSlider.FirstValue = 0; layerRenderRatioSlider.FirstValueChanged += (s, e) => { - gcode2DWidget.FeatureToStartOnRatio0To1 = layerRenderRatioSlider.FirstValue; - gcode2DWidget.FeatureToEndOnRatio0To1 = layerRenderRatioSlider.SecondValue; - gcode2DWidget.Invalidate(); + printer.BedPlate.RenderInfo.FeatureToStartOnRatio0To1 = layerRenderRatioSlider.FirstValue; + printer.BedPlate.RenderInfo.FeatureToEndOnRatio0To1 = layerRenderRatioSlider.SecondValue; + + this.Invalidate(); }; layerRenderRatioSlider.SecondValue = 1; layerRenderRatioSlider.SecondValueChanged += (s, e) => { - gcode2DWidget.FeatureToStartOnRatio0To1 = layerRenderRatioSlider.FirstValue; - gcode2DWidget.FeatureToEndOnRatio0To1 = layerRenderRatioSlider.SecondValue; - gcode2DWidget.Invalidate(); + printer.BedPlate.RenderInfo.FeatureToStartOnRatio0To1 = layerRenderRatioSlider.FirstValue; + printer.BedPlate.RenderInfo.FeatureToEndOnRatio0To1 = layerRenderRatioSlider.SecondValue; + + + this.Invalidate(); }; AddChild(layerRenderRatioSlider); SetSliderSizes(); - // let's change the active layer so that it is set to the first layer with data - gcode2DWidget.ActiveLayerIndex = gcode2DWidget.ActiveLayerIndex + 1; - gcode2DWidget.ActiveLayerIndex = gcode2DWidget.ActiveLayerIndex - 1; + GCodeRenderer.ExtrusionColor = ActiveTheme.Instance.PrimaryAccentColor; + // ResetRenderInfo + printer.BedPlate.RenderInfo = new GCodeRenderInfo( + 0, + 1, + Agg.Transform.Affine.NewIdentity(), + 1, + GetRenderType(), + 0, + 1, + new Vector2[] + { + ActiveSliceSettings.Instance.Helpers.ExtruderOffset(0), + ActiveSliceSettings.Instance.Helpers.ExtruderOffset(1) + }, + MeshViewerWidget.GetMaterialColor); this.gcodeDetails = new GCodeDetails(this.loadedGCode);