diff --git a/PartPreviewWindow/PrinterTabPage.cs b/PartPreviewWindow/PrinterTabPage.cs index bacf684f8..13fd756d2 100644 --- a/PartPreviewWindow/PrinterTabPage.cs +++ b/PartPreviewWindow/PrinterTabPage.cs @@ -46,6 +46,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { private View3DWidget modelViewer; internal ViewGcodeBasic gcodeViewer; + internal GCode2DWidget gcode2DWidget; + private PrintItemWrapper printItem; private ViewControls3D viewControls3D; @@ -61,6 +63,9 @@ namespace MatterHackers.MatterControl.PartPreviewWindow private ValueDisplayInfo currentLayerInfo; + private Vector3 viewerVolume; + private Vector2 bedCenter; + public PrinterTabPage(PrinterSettings activeSettings, PrintItemWrapper printItem) { printer = ApplicationController.Instance.Printer; @@ -85,9 +90,36 @@ namespace MatterHackers.MatterControl.PartPreviewWindow this.ViewMode = e.ViewMode; }; + viewControls3D.TransformStateChanged += (s, e) => + { + switch (e.TransformMode) + { + case ViewControls3DButtons.Translate: + if (gcode2DWidget != null) + { + gcode2DWidget.TransformState = GCode2DWidget.ETransformState.Move; + } + break; + + case ViewControls3DButtons.Scale: + if (gcode2DWidget != null) + { + gcode2DWidget.TransformState = GCode2DWidget.ETransformState.Scale; + } + break; + } + }; + viewControls3D.ResetView += (sender, e) => { - modelViewer.meshViewerWidget.ResetView(); + if (gcode2DWidget.Visible) + { + gcode2DWidget.CenterPartInView(); + } + else if (modelViewer.Visible) + { + modelViewer.meshViewerWidget.ResetView(); + } }; viewControls3D.OverflowButton.DynamicPopupContent = () => { @@ -149,10 +181,13 @@ namespace MatterHackers.MatterControl.PartPreviewWindow SetSliderSizes(); + this.viewerVolume = new Vector3(activeSettings.GetValue(SettingsKey.bed_size), buildHeight); + this.bedCenter = activeSettings.GetValue(SettingsKey.print_center); + // The 3D model view modelViewer = new View3DWidget(printItem, - new Vector3(activeSettings.GetValue(SettingsKey.bed_size), buildHeight), - activeSettings.GetValue(SettingsKey.print_center), + this.viewerVolume, + this.bedCenter, activeSettings.GetValue(SettingsKey.bed_shape), View3DWidget.WindowMode.Embeded, View3DWidget.AutoRotate.Disabled, @@ -286,6 +321,18 @@ namespace MatterHackers.MatterControl.PartPreviewWindow }, this.GetRenderType, MeshViewerWidget.GetMaterialColor); + + // Close and remove any existing widget reference + gcode2DWidget?.Close(); + + // Create and append new widget + gcode2DWidget = new GCode2DWidget( new Vector2(viewerVolume.x, viewerVolume.y), this.bedCenter) + { + Visible = (this.ViewMode == PartViewMode.Layers2D) + }; + view3DContainer.AddChild(gcode2DWidget); + + viewControls3D.Layers2DButton.Enabled = true; } private RenderType GetRenderType() @@ -390,21 +437,21 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { case PartViewMode.Layers2D: UserSettings.Instance.set("LayerViewDefault", "2D Layer"); - if (gcodeViewer.gcode2DWidget != null) + if (gcode2DWidget != null) { - gcodeViewer.gcode2DWidget.Visible = true; + gcode2DWidget.Visible = true; // HACK: Getting the Layer2D view to show content only works if CenterPartInView is called after the control is visible and after some cycles have passed - UiThread.RunOnIdle(gcodeViewer.gcode2DWidget.CenterPartInView); + UiThread.RunOnIdle(gcode2DWidget.CenterPartInView); } this.ShowSliceLayers = true; break; case PartViewMode.Layers3D: UserSettings.Instance.set("LayerViewDefault", "3D Layer"); - if (gcodeViewer.gcode2DWidget != null) + if (gcode2DWidget != null) { - gcodeViewer.gcode2DWidget.Visible = false; + gcode2DWidget.Visible = false; } this.ShowSliceLayers = true; break; diff --git a/PartPreviewWindow/ViewControls3D.cs b/PartPreviewWindow/ViewControls3D.cs index 1f38d2da8..f74469ae7 100644 --- a/PartPreviewWindow/ViewControls3D.cs +++ b/PartPreviewWindow/ViewControls3D.cs @@ -69,6 +69,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow private RadioButton scaleButton; private RadioButton partSelectButton; + public RadioButton Layers2DButton; + private EventHandler unregisterEvents; private ViewControls3DButtons activeTransformState = ViewControls3DButtons.Rotate; @@ -222,14 +224,15 @@ namespace MatterHackers.MatterControl.PartPreviewWindow } iconPath = Path.Combine("ViewTransformControls", "2d.png"); - var layers2DButton = buttonFactory.GenerateRadioButton("", StaticData.Instance.LoadIcon(iconPath, 32, 32)); - layers2DButton.SiblingRadioButtonList = buttonGroupB; - layers2DButton.Name = "Layers2D Button"; - layers2DButton.ToolTipText = "2D Layers".Localize(); - layers2DButton.Margin = 3; - layers2DButton.Click += SwitchModes_Click; - buttonGroupB.Add(layers2DButton); - this.AddChild(layers2DButton); + Layers2DButton = buttonFactory.GenerateRadioButton("", StaticData.Instance.LoadIcon(iconPath, 32, 32)); + Layers2DButton.SiblingRadioButtonList = buttonGroupB; + Layers2DButton.Name = "Layers2D Button"; + Layers2DButton.ToolTipText = "2D Layers".Localize(); + Layers2DButton.Enabled = false; + Layers2DButton.Margin = 3; + Layers2DButton.Click += SwitchModes_Click; + buttonGroupB.Add(Layers2DButton); + this.AddChild(Layers2DButton); OverflowButton = new OverflowDropdown(allowLightnessInvert: false) { diff --git a/PartPreviewWindow/ViewGcodeBasic.cs b/PartPreviewWindow/ViewGcodeBasic.cs index fc0efa3d2..9f038f653 100644 --- a/PartPreviewWindow/ViewGcodeBasic.cs +++ b/PartPreviewWindow/ViewGcodeBasic.cs @@ -45,7 +45,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow public class ViewGcodeBasic : GuiWidget { private TextWidget gcodeProcessingStateInfoText; - internal GCode2DWidget gcode2DWidget; private PrintItemWrapper printItem => ApplicationController.Instance.ActivePrintItem; private GuiWidget gcodeDisplayWidget; @@ -132,7 +131,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { CloseAllChildren(); - gcode2DWidget = null; gcodeProcessingStateInfoText = null; var mainContainerTopToBottom = new FlowLayoutWidget(FlowDirection.TopToBottom) @@ -154,15 +152,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow bool isGCode = Path.GetExtension(printItem.FileLocation).ToUpper() == ".GCODE"; string gcodeFilePath = isGCode ? printItem.FileLocation : printItem.GetGCodePathAndFileName(); - if (File.Exists(gcodeFilePath)) - { - gcode2DWidget = new GCode2DWidget(new Vector2(viewerVolume.x, viewerVolume.y), bedCenter) - { - Visible = (activeViewMode == PartViewMode.Layers2D) - }; - gcodeDisplayWidget.AddChild(gcode2DWidget); - } - else + if (!File.Exists(gcodeFilePath)) { SetProcessingMessage(string.Format("{0}\n'{1}'", fileNotFoundMessage, printItem.Name)); } @@ -172,37 +162,9 @@ namespace MatterHackers.MatterControl.PartPreviewWindow this.AddChild(mainContainerTopToBottom); - viewControls3D.ResetView += (sender, e) => - { - if (gcodeDisplayWidget.Visible) - { - gcode2DWidget.CenterPartInView(); - } - }; - viewControls3D.TransformStateChanged += (s, e) => - { - switch (e.TransformMode) - { - case ViewControls3DButtons.Translate: - if (gcode2DWidget != null) - { - gcode2DWidget.TransformState = GCode2DWidget.ETransformState.Move; - } - break; - - case ViewControls3DButtons.Scale: - if (gcode2DWidget != null) - { - gcode2DWidget.TransformState = GCode2DWidget.ETransformState.Scale; - } - break; - } - }; - // *************** AddGCodeFileControls *************** SetProcessingMessage(""); - if (gcode2DWidget != null - && loadedGCode == null) + if (loadedGCode == null) { // If we have finished loading the gcode and the source file exists but we don't have any loaded gcode it is because the loader decided to not load it. if (File.Exists(printItem.FileLocation))