diff --git a/ApplicationView/ApplicationController.cs b/ApplicationView/ApplicationController.cs index afaadd531..09d750ec4 100644 --- a/ApplicationView/ApplicationController.cs +++ b/ApplicationView/ApplicationController.cs @@ -75,7 +75,8 @@ namespace MatterHackers.MatterControl public RGBA_Bytes TabBodyBackground => new RGBA_Bytes(ActiveTheme.Instance.TertiaryBackgroundColor, 160); - TextImageButtonFactory textImageButtonFactory = new TextImageButtonFactory(); + public TextImageButtonFactory ViewControlsButtonFactory { get; internal set; } + private EventHandler unregisterEvents; public ThemeConfig() @@ -153,6 +154,29 @@ namespace MatterHackers.MatterControl borderWidth = 0, FixedHeight = 32, }; + + int buttonHeight; + if (UserSettings.Instance.IsTouchScreen) + { + buttonHeight = 40; + } + else + { + buttonHeight = 0; + } + + this.ViewControlsButtonFactory = new TextImageButtonFactory() + { + normalTextColor = ActiveTheme.Instance.PrimaryTextColor, + hoverTextColor = ActiveTheme.Instance.PrimaryTextColor, + disabledTextColor = ActiveTheme.Instance.PrimaryTextColor, + pressedTextColor = ActiveTheme.Instance.PrimaryTextColor, + FixedHeight = buttonHeight, + FixedWidth = buttonHeight, + AllowThemeToAdjustImage = false, + checkedBorderColor = RGBA_Bytes.White + }; + } internal TabControl CreateTabControl() diff --git a/MatterControlApplication.cs b/MatterControlApplication.cs index d45dad8e4..1fb296df2 100644 --- a/MatterControlApplication.cs +++ b/MatterControlApplication.cs @@ -915,7 +915,7 @@ namespace MatterHackers.MatterControl if (showNamesUnderMouse) { List namedChildren = new List(); - this.FindNamedChildrenRecursive("", namedChildren, new RectangleDouble(mousePosition.x, mousePosition.y, mousePosition.x + 1 , mousePosition.y + 1), SearchType.Partial); + this.FindNamedChildrenRecursive("", namedChildren, new RectangleDouble(mousePosition.x, mousePosition.y, mousePosition.x + 1 , mousePosition.y + 1), SearchType.Partial, allowInvalidItems: false); Vector2 start = new Vector2(10, 50); int lineHeight = 20; e.graphics2D.FillRectangle(start, start + new Vector2(500, namedChildren.Count * lineHeight), new RGBA_Bytes(RGBA_Bytes.Black, 120)); diff --git a/PartPreviewWindow/BaseClasses/PartPreview3DWidget.cs b/PartPreviewWindow/BaseClasses/PartPreview3DWidget.cs index 5b7044b90..aec43df26 100644 --- a/PartPreviewWindow/BaseClasses/PartPreview3DWidget.cs +++ b/PartPreviewWindow/BaseClasses/PartPreview3DWidget.cs @@ -56,7 +56,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow // Proxy to MeshViewerWidget public InteractiveScene Scene => meshViewerWidget.Scene; - protected ViewControls3D viewControls3D; + protected ViewControls3D viewControls3D { get; } private bool needToRecreateBed = false; diff --git a/PartPreviewWindow/BaseClasses/PartPreviewWidget.cs b/PartPreviewWindow/BaseClasses/PartPreviewWidget.cs index 30f0b0b6c..1321c61a6 100644 --- a/PartPreviewWindow/BaseClasses/PartPreviewWidget.cs +++ b/PartPreviewWindow/BaseClasses/PartPreviewWidget.cs @@ -117,8 +117,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow disabledTextColor = ActiveTheme.Instance.PrimaryTextColor }; - - BackgroundColor = RGBA_Bytes.White; } } } \ No newline at end of file diff --git a/PartPreviewWindow/OverflowDropdown.cs b/PartPreviewWindow/OverflowDropdown.cs index e18d041ae..c5db56e06 100644 --- a/PartPreviewWindow/OverflowDropdown.cs +++ b/PartPreviewWindow/OverflowDropdown.cs @@ -36,6 +36,7 @@ using MatterHackers.Agg.PlatformAbstract; using MatterHackers.Agg.Image; using MatterHackers.Agg.ImageProcessing; using System; +using System.Collections.Generic; namespace MatterHackers.MatterControl.PartPreviewWindow { @@ -66,7 +67,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow public GuiWidget PopupContent { get; set; } - public Func DynamicPopupContent { get; set; } + public List> DynamicPopupContent { get; set; } = new List>(); public bool AlignToRightEdge { get; set; } @@ -93,9 +94,18 @@ namespace MatterHackers.MatterControl.PartPreviewWindow this.PopupContent?.ClearRemovedFlag(); + // Invoke registered funcs until content is found if (this.DynamicPopupContent != null) { - this.PopupContent = this.DynamicPopupContent(); + foreach(var action in this.DynamicPopupContent) + { + var content = action(); + if(content != null) + { + this.PopupContent = content; + break; + } + } } if (this.PopupContent == null) diff --git a/PartPreviewWindow/PartPreviewContent.cs b/PartPreviewWindow/PartPreviewContent.cs index 2f3e5f760..320e6eb1d 100644 --- a/PartPreviewWindow/PartPreviewContent.cs +++ b/PartPreviewWindow/PartPreviewContent.cs @@ -60,7 +60,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow this.autoRotate3DView = autoRotate3DView; this.windowMode = windowMode; - BackgroundColor = ActiveTheme.Instance.PrimaryBackgroundColor; this.AnchorAll(); // LoadPrintItem {{ @@ -121,7 +120,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow topToBottom.AddChild(new PrinterActionsBar()); - viewControls3D = new ViewControls3D() + viewControls3D = new ViewControls3D(ApplicationController.Instance.Theme.ViewControlsButtonFactory) { PartSelectVisible = false, VAnchor = VAnchor.ParentTop | VAnchor.FitToChildren | VAnchor.AbsolutePosition, @@ -173,10 +172,12 @@ namespace MatterHackers.MatterControl.PartPreviewWindow if (layersVisible) { // Copy layers tumble state to partpreview + modelViewer.meshViewerWidget.TrackballTumbleWidget.TrackBallController.CopyTransforms(gcodeViewer.meshViewerWidget.TrackballTumbleWidget.TrackBallController); } else { // Copy partpreview tumble state to layers + gcodeViewer.meshViewerWidget.TrackballTumbleWidget.TrackBallController.CopyTransforms(modelViewer.meshViewerWidget.TrackballTumbleWidget.TrackBallController); } modelViewer.Visible = layersVisible; @@ -186,7 +187,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow private async void LoadActivePrintItem() { await modelViewer.ClearBedAndLoadPrintItemWrapper(printItem); - gcodeViewer.LoadItem(); } public override void OnLoad(EventArgs args) diff --git a/PartPreviewWindow/View3D/PrinterActionsBar.cs b/PartPreviewWindow/View3D/PrinterActionsBar.cs index 9dc6ac5ff..84d548994 100644 --- a/PartPreviewWindow/View3D/PrinterActionsBar.cs +++ b/PartPreviewWindow/View3D/PrinterActionsBar.cs @@ -84,8 +84,15 @@ namespace MatterHackers.MatterControl.PartPreviewWindow var overflowDropdown = new OverflowDropdown(allowLightnessInvert: true) { AlignToRightEdge = true, - DynamicPopupContent = GeneratePopupContent }; + overflowDropdown.DynamicPopupContent.Add(GeneratePopupContent); + + // Deregister on close + this.Closed += (s, e) => + { + overflowDropdown.DynamicPopupContent.Add(GeneratePopupContent); + }; + this.AddChild(overflowDropdown); } diff --git a/PartPreviewWindow/View3D/View3DWidget.cs b/PartPreviewWindow/View3D/View3DWidget.cs index f399381d2..c13f57653 100644 --- a/PartPreviewWindow/View3D/View3DWidget.cs +++ b/PartPreviewWindow/View3D/View3DWidget.cs @@ -267,7 +267,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { meshViewerWidget = new MeshViewerWidget(viewerVolume, bedCenter, bedShape); - viewControls3D.RegisterViewer(meshViewerWidget); + //viewControls3D.RegisterViewer(meshViewerWidget); PutOemImageOnBed(); @@ -2393,6 +2393,203 @@ namespace MatterHackers.MatterControl.PartPreviewWindow SelectedTransformChanged?.Invoke(this, null); } + + + // ViewControls3D {{ + private GuiWidget ShowOverflowMenu() + { + var popupContainer = new FlowLayoutWidget(FlowDirection.TopToBottom); + + var meshViewer = meshViewerWidget; + + popupContainer.AddChild( + AddCheckbox( + "Show Print Bed".Localize(), + "Show Help Checkbox", + meshViewer.RenderBed, + 5, + (s, e) => + { + var checkbox = s as CheckBox; + if (checkbox != null) + { + meshViewer.RenderBed = checkbox.Checked; + } + })); + + double buildHeight = ActiveSliceSettings.Instance.GetValue(SettingsKey.build_height); + if (buildHeight > 0) + { + popupContainer.AddChild( + AddCheckbox( + "Show Print Area".Localize(), + "Show Help Checkbox", + meshViewer.RenderBed, + 5, + (s, e) => + { + var checkbox = s as CheckBox; + if (checkbox != null) + { + meshViewer.RenderBuildVolume = checkbox.Checked; + } + })); + } + + var widget = new FlowLayoutWidget(FlowDirection.TopToBottom) + { + HAnchor = HAnchor.ParentLeftRight, + Margin = new BorderDouble(5, 5, 5, 0) + }; + + popupContainer.AddChild(new HorizontalLine()); + CreateRenderTypeRadioButtons(widget); + + popupContainer.AddChild(widget); + + return popupContainer; + } + + private void CreateRenderTypeRadioButtons(GuiWidget parentContainer) + { + string renderTypeString = UserSettings.Instance.get(UserSettingsKey.defaultRenderSetting); + if (renderTypeString == null) + { + if (UserSettings.Instance.IsTouchScreen) + { + renderTypeString = "Shaded"; + } + else + { + renderTypeString = "Outlines"; + } + UserSettings.Instance.set(UserSettingsKey.defaultRenderSetting, renderTypeString); + } + + //var itemTextColor = ActiveTheme.Instance.PrimaryTextColor; + var itemTextColor = RGBA_Bytes.Black; + + RenderTypes renderType; + bool canParse = Enum.TryParse(renderTypeString, out renderType); + if (canParse) + { + meshViewerWidget.RenderType = renderType; + } + + { + RadioButton renderTypeCheckBox = new RadioButton("Shaded".Localize(), textColor: itemTextColor); + renderTypeCheckBox.Checked = (meshViewerWidget.RenderType == RenderTypes.Shaded); + + renderTypeCheckBox.CheckedStateChanged += (sender, e) => + { + if (renderTypeCheckBox.Checked) + { + meshViewerWidget.RenderType = RenderTypes.Shaded; + UserSettings.Instance.set(UserSettingsKey.defaultRenderSetting, meshViewerWidget.RenderType.ToString()); + } + }; + parentContainer.AddChild(renderTypeCheckBox); + } + + { + RadioButton renderTypeCheckBox = new RadioButton("Outlines".Localize(), textColor: itemTextColor); + renderTypeCheckBox.Checked = (meshViewerWidget.RenderType == RenderTypes.Outlines); + renderTypeCheckBox.CheckedStateChanged += (sender, e) => + { + if (renderTypeCheckBox.Checked) + { + meshViewerWidget.RenderType = RenderTypes.Outlines; + UserSettings.Instance.set(UserSettingsKey.defaultRenderSetting, meshViewerWidget.RenderType.ToString()); + } + }; + parentContainer.AddChild(renderTypeCheckBox); + } + + { + RadioButton renderTypeCheckBox = new RadioButton("Polygons".Localize(), textColor: itemTextColor); + renderTypeCheckBox.Checked = (meshViewerWidget.RenderType == RenderTypes.Polygons); + renderTypeCheckBox.CheckedStateChanged += (sender, e) => + { + if (renderTypeCheckBox.Checked) + { + meshViewerWidget.RenderType = RenderTypes.Polygons; + UserSettings.Instance.set(UserSettingsKey.defaultRenderSetting, meshViewerWidget.RenderType.ToString()); + } + }; + parentContainer.AddChild(renderTypeCheckBox); + } + + { + RadioButton renderTypeCheckBox = new RadioButton("Overhang".Localize(), textColor: itemTextColor); + renderTypeCheckBox.Checked = (meshViewerWidget.RenderType == RenderTypes.Overhang); + + renderTypeCheckBox.CheckedStateChanged += (sender, e) => + { + if (renderTypeCheckBox.Checked) + { + // TODO: Determine if Scene is available in scope + var scene = MatterControlApplication.Instance.ActiveView3DWidget.Scene; + + meshViewerWidget.RenderType = RenderTypes.Overhang; + + UserSettings.Instance.set("defaultRenderSetting", meshViewerWidget.RenderType.ToString()); + foreach (var meshAndTransform in scene.VisibleMeshes(Matrix4X4.Identity)) + { + meshAndTransform.MeshData.MarkAsChanged(); + // change the color to be the right thing + GLMeshTrianglePlugin glMeshPlugin = GLMeshTrianglePlugin.Get(meshAndTransform.MeshData, (faceEdge) => + { + Vector3 normal = faceEdge.containingFace.normal; + normal = Vector3.TransformVector(normal, meshAndTransform.Matrix).GetNormal(); + VertexColorData colorData = new VertexColorData(); + + double startColor = 223.0 / 360.0; + double endColor = 5.0 / 360.0; + double delta = endColor - startColor; + + RGBA_Bytes color = RGBA_Floats.FromHSL(startColor, .99, .49).GetAsRGBA_Bytes(); + if (normal.z < 0) + { + color = RGBA_Floats.FromHSL(startColor - delta * normal.z, .99, .49).GetAsRGBA_Bytes(); + } + + colorData.red = color.red; + colorData.green = color.green; + colorData.blue = color.blue; + return colorData; + }); + } + } + else + { + // TODO: Implement + /* + foreach (var meshTransform in Scene.VisibleMeshes(Matrix4X4.Identity)) + { + // turn off the overhang colors + } */ + } + }; + + parentContainer.AddChild(renderTypeCheckBox); + } + } + + private static MenuItem AddCheckbox(string text, string itemValue, bool itemChecked, BorderDouble padding, EventHandler eventHandler) + { + var checkbox = new CheckBox(text) + { + Checked = itemChecked + }; + checkbox.CheckedStateChanged += eventHandler; + + return new MenuItem(checkbox, itemValue) + { + Padding = padding, + }; + } + // ViewControls3D }} + } public enum HitQuadrant { LB, LT, RB, RT } diff --git a/PartPreviewWindow/ViewControls3D.cs b/PartPreviewWindow/ViewControls3D.cs index c7aff64ca..6ac21ca29 100644 --- a/PartPreviewWindow/ViewControls3D.cs +++ b/PartPreviewWindow/ViewControls3D.cs @@ -52,11 +52,14 @@ namespace MatterHackers.MatterControl.PartPreviewWindow PartSelect } + public class TransformStateChangedEventArgs : EventArgs + { + public ViewControls3DButtons TransformMode { get; set; } + } + public class ViewControls3D : FlowLayoutWidget { private GuiWidget partSelectSeparator; - private List meshViewers = new List(); - private Button resetViewButton; private RadioButton translateButton; @@ -68,10 +71,9 @@ namespace MatterHackers.MatterControl.PartPreviewWindow private OverflowDropdown overflowButton; - private int buttonHeight; - public event EventHandler ResetView; + public event EventHandler TransformStateChanged; public bool PartSelectVisible { @@ -94,84 +96,58 @@ namespace MatterHackers.MatterControl.PartPreviewWindow set { this.activeTransformState = value; - - foreach (var meshViewerWidget in meshViewers) + switch (this.activeTransformState) { - switch (value) - { - case ViewControls3DButtons.Rotate: - meshViewerWidget.TrackballTumbleWidget.TransformState = TrackBallController.MouseDownType.Rotation; - rotateButton.Checked = true; - break; + case ViewControls3DButtons.Rotate: + rotateButton.Checked = true; + break; - case ViewControls3DButtons.Translate: - meshViewerWidget.TrackballTumbleWidget.TransformState = TrackBallController.MouseDownType.Translation; - translateButton.Checked = true; - break; + case ViewControls3DButtons.Translate: + translateButton.Checked = true; + break; - case ViewControls3DButtons.Scale: - meshViewerWidget.TrackballTumbleWidget.TransformState = TrackBallController.MouseDownType.Scale; - scaleButton.Checked = true; - break; + case ViewControls3DButtons.Scale: + scaleButton.Checked = true; + break; - case ViewControls3DButtons.PartSelect: - meshViewerWidget.TrackballTumbleWidget.TransformState = TrackBallController.MouseDownType.None; - partSelectButton.Checked = true; - break; - } + case ViewControls3DButtons.PartSelect: + partSelectButton.Checked = true; + break; } + + TransformStateChanged?.Invoke(this, new TransformStateChangedEventArgs() + { + TransformMode = activeTransformState + }); } } - public MeshViewerWidget FirstMeshViewer { get; private set; } - - public ViewControls3D() + public ViewControls3D(TextImageButtonFactory buttonFactory) { - if (UserSettings.Instance.IsTouchScreen) - { - buttonHeight = 40; - } - else - { - buttonHeight = 0; - } - - var textImageButtonFactory = new TextImageButtonFactory() - { - normalTextColor = ActiveTheme.Instance.PrimaryTextColor, - hoverTextColor = ActiveTheme.Instance.PrimaryTextColor, - disabledTextColor = ActiveTheme.Instance.PrimaryTextColor, - pressedTextColor = ActiveTheme.Instance.PrimaryTextColor, - FixedHeight = buttonHeight, - FixedWidth = buttonHeight, - AllowThemeToAdjustImage = false, - checkedBorderColor = RGBA_Bytes.White - }; - string iconPath; iconPath = Path.Combine("ViewTransformControls", "reset.png"); - resetViewButton = textImageButtonFactory.Generate("", StaticData.Instance.LoadIcon(iconPath,32,32).InvertLightness()); + resetViewButton = buttonFactory.Generate("", StaticData.Instance.LoadIcon(iconPath,32,32).InvertLightness()); resetViewButton.ToolTipText = "Reset View".Localize(); resetViewButton.Click += (s, e) => ResetView?.Invoke(this, null); AddChild(resetViewButton); iconPath = Path.Combine("ViewTransformControls", "rotate.png"); - rotateButton = textImageButtonFactory.GenerateRadioButton("", StaticData.Instance.LoadIcon(iconPath,32,32)); + rotateButton = buttonFactory.GenerateRadioButton("", StaticData.Instance.LoadIcon(iconPath,32,32)); rotateButton.ToolTipText = "Rotate (Alt + Left Mouse)".Localize(); rotateButton.Margin = new BorderDouble(3); rotateButton.Click += (s, e) => this.ActiveButton = ViewControls3DButtons.Rotate; AddChild(rotateButton); iconPath = Path.Combine("ViewTransformControls", "translate.png"); - translateButton = textImageButtonFactory.GenerateRadioButton("", StaticData.Instance.LoadIcon(iconPath,32,32)); + translateButton = buttonFactory.GenerateRadioButton("", StaticData.Instance.LoadIcon(iconPath,32,32)); translateButton.ToolTipText = "Move (Shift + Left Mouse)".Localize(); translateButton.Margin = new BorderDouble(3); translateButton.Click += (s, e) => this.ActiveButton = ViewControls3DButtons.Translate; AddChild(translateButton); iconPath = Path.Combine("ViewTransformControls", "scale.png"); - scaleButton = textImageButtonFactory.GenerateRadioButton("", StaticData.Instance.LoadIcon(iconPath,32,32)); + scaleButton = buttonFactory.GenerateRadioButton("", StaticData.Instance.LoadIcon(iconPath,32,32)); scaleButton.ToolTipText = "Zoom (Ctrl + Left Mouse)".Localize(); scaleButton.Margin = 3; scaleButton.Click += (s, e) => this.ActiveButton = ViewControls3DButtons.Scale; @@ -183,14 +159,14 @@ namespace MatterHackers.MatterControl.PartPreviewWindow AddChild(partSelectSeparator); iconPath = Path.Combine("ViewTransformControls", "partSelect.png"); - partSelectButton = textImageButtonFactory.GenerateRadioButton("", StaticData.Instance.LoadIcon(iconPath,32,32)); + partSelectButton = buttonFactory.GenerateRadioButton("", StaticData.Instance.LoadIcon(iconPath,32,32)); partSelectButton.ToolTipText = "Select Part".Localize(); partSelectButton.Margin = new BorderDouble(3); partSelectButton.Click += (s, e) => this.ActiveButton = ViewControls3DButtons.PartSelect; AddChild(partSelectButton); iconPath = Path.Combine("ViewTransformControls", "layers.png"); - var layersButton = textImageButtonFactory.Generate("", StaticData.Instance.LoadIcon(iconPath, 32, 32).InvertLightness()); + var layersButton = buttonFactory.Generate("", StaticData.Instance.LoadIcon(iconPath, 32, 32).InvertLightness()); layersButton.ToolTipText = "Layers".Localize(); layersButton.Margin = 3; layersButton.Click += (s, e) => @@ -210,217 +186,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow rotateButton.Checked = true; BackgroundColor = new RGBA_Bytes(0, 0, 0, 120); - - SetMeshViewerDisplayTheme(); - partSelectButton.CheckedStateChanged += SetMeshViewerDisplayTheme; - - ActiveTheme.ThemeChanged.RegisterEvent(ThemeChanged, ref unregisterEvents); - } - - public override void OnLoad(EventArgs args) - { - overflowButton.PopupContent = ShowOverflowMenu(); - base.OnLoad(args); - } - - public void RegisterViewer(MeshViewerWidget meshViewer) - { - if (this.FirstMeshViewer == null) - { - this.FirstMeshViewer = meshViewer; - } - this.meshViewers.Add(meshViewer); - } - - private GuiWidget ShowOverflowMenu() - { - var popupContainer = new FlowLayoutWidget(FlowDirection.TopToBottom); - - popupContainer.AddChild( - AddCheckbox( - "Show Print Bed".Localize(), - "Show Help Checkbox", - this.FirstMeshViewer.RenderBed, - 5, - (s, e) => - { - var checkbox = s as CheckBox; - if (checkbox != null) - { - meshViewers.ForEach(m => m.RenderBed = checkbox.Checked); - } - })); - - double buildHeight = ActiveSliceSettings.Instance.GetValue(SettingsKey.build_height); - if (buildHeight > 0) - { - popupContainer.AddChild( - AddCheckbox( - "Show Print Area".Localize(), - "Show Help Checkbox", - this.FirstMeshViewer.RenderBed, - 5, - (s, e) => - { - var checkbox = s as CheckBox; - if (checkbox != null) - { - meshViewers.ForEach(m => m.RenderBuildVolume = checkbox.Checked); - } - })); - } - - var widget = new FlowLayoutWidget(FlowDirection.TopToBottom) - { - HAnchor = HAnchor.ParentLeftRight, - Margin = new BorderDouble(5, 5, 5, 0) - }; - - popupContainer.AddChild(new HorizontalLine()); - CreateRenderTypeRadioButtons(widget); - - popupContainer.AddChild(widget); - - return popupContainer; - } - - private void CreateRenderTypeRadioButtons(GuiWidget parentContainer) - { - string renderTypeString = UserSettings.Instance.get(UserSettingsKey.defaultRenderSetting); - if (renderTypeString == null) - { - if (UserSettings.Instance.IsTouchScreen) - { - renderTypeString = "Shaded"; - } - else - { - renderTypeString = "Outlines"; - } - UserSettings.Instance.set(UserSettingsKey.defaultRenderSetting, renderTypeString); - } - - //var itemTextColor = ActiveTheme.Instance.PrimaryTextColor; - var itemTextColor = RGBA_Bytes.Black; - - RenderTypes renderType; - bool canParse = Enum.TryParse(renderTypeString, out renderType); - if (canParse) - { - meshViewers.ForEach(m => m.RenderType = renderType); - } - - { - RadioButton renderTypeCheckBox = new RadioButton("Shaded".Localize(), textColor: itemTextColor); - renderTypeCheckBox.Checked = (this.FirstMeshViewer.RenderType == RenderTypes.Shaded); - - renderTypeCheckBox.CheckedStateChanged += (sender, e) => - { - if (renderTypeCheckBox.Checked) - { - meshViewers.ForEach(m => m.RenderType = RenderTypes.Shaded); - UserSettings.Instance.set(UserSettingsKey.defaultRenderSetting, this.FirstMeshViewer.RenderType.ToString()); - } - }; - parentContainer.AddChild(renderTypeCheckBox); - } - - { - RadioButton renderTypeCheckBox = new RadioButton("Outlines".Localize(), textColor: itemTextColor); - renderTypeCheckBox.Checked = (this.FirstMeshViewer.RenderType == RenderTypes.Outlines); - renderTypeCheckBox.CheckedStateChanged += (sender, e) => - { - if (renderTypeCheckBox.Checked) - { - meshViewers.ForEach(m => m.RenderType = RenderTypes.Outlines); - UserSettings.Instance.set(UserSettingsKey.defaultRenderSetting, this.FirstMeshViewer.RenderType.ToString()); - } - }; - parentContainer.AddChild(renderTypeCheckBox); - } - - { - RadioButton renderTypeCheckBox = new RadioButton("Polygons".Localize(), textColor: itemTextColor); - renderTypeCheckBox.Checked = (this.FirstMeshViewer.RenderType == RenderTypes.Polygons); - renderTypeCheckBox.CheckedStateChanged += (sender, e) => - { - if (renderTypeCheckBox.Checked) - { - meshViewers.ForEach(m => m.RenderType = RenderTypes.Polygons); - UserSettings.Instance.set(UserSettingsKey.defaultRenderSetting, this.FirstMeshViewer.RenderType.ToString()); - } - }; - parentContainer.AddChild(renderTypeCheckBox); - } - - { - RadioButton renderTypeCheckBox = new RadioButton("Overhang".Localize(), textColor: itemTextColor); - renderTypeCheckBox.Checked = (this.FirstMeshViewer.RenderType == RenderTypes.Overhang); - - renderTypeCheckBox.CheckedStateChanged += (sender, e) => - { - if (renderTypeCheckBox.Checked) - { - // TODO: Determine if Scene is available in scope - var scene = MatterControlApplication.Instance.ActiveView3DWidget.Scene; - - meshViewers.ForEach(m => m.RenderType = RenderTypes.Overhang); - - UserSettings.Instance.set("defaultRenderSetting", this.FirstMeshViewer.RenderType.ToString()); - foreach (var meshAndTransform in scene.VisibleMeshes(Matrix4X4.Identity)) - { - meshAndTransform.MeshData.MarkAsChanged(); - // change the color to be the right thing - GLMeshTrianglePlugin glMeshPlugin = GLMeshTrianglePlugin.Get(meshAndTransform.MeshData, (faceEdge) => - { - Vector3 normal = faceEdge.containingFace.normal; - normal = Vector3.TransformVector(normal, meshAndTransform.Matrix).GetNormal(); - VertexColorData colorData = new VertexColorData(); - - double startColor = 223.0 / 360.0; - double endColor = 5.0 / 360.0; - double delta = endColor - startColor; - - RGBA_Bytes color = RGBA_Floats.FromHSL(startColor, .99, .49).GetAsRGBA_Bytes(); - if (normal.z < 0) - { - color = RGBA_Floats.FromHSL(startColor - delta * normal.z, .99, .49).GetAsRGBA_Bytes(); - } - - colorData.red = color.red; - colorData.green = color.green; - colorData.blue = color.blue; - return colorData; - }); - } - } - else - { - // TODO: Implement - /* - foreach (var meshTransform in Scene.VisibleMeshes(Matrix4X4.Identity)) - { - // turn off the overhang colors - } */ - } - }; - - parentContainer.AddChild(renderTypeCheckBox); - } - } - - private static MenuItem AddCheckbox(string text, string itemValue, bool itemChecked, BorderDouble padding, EventHandler eventHandler) - { - var checkbox = new CheckBox(text) - { - Checked = itemChecked - }; - checkbox.CheckedStateChanged += eventHandler; - - return new MenuItem(checkbox, itemValue) - { - Padding = padding, - }; } public override void OnClosed(ClosedEventArgs e) @@ -428,19 +193,5 @@ namespace MatterHackers.MatterControl.PartPreviewWindow unregisterEvents?.Invoke(this, null); base.OnClosed(e); } - - public void ThemeChanged(object sender, EventArgs e) - { - SetMeshViewerDisplayTheme(null, null); - } - - protected void SetMeshViewerDisplayTheme(object sender = null, EventArgs e = null) - { - meshViewers.ForEach(meshViewerWidget => - { - meshViewerWidget.TrackballTumbleWidget.RotationHelperCircleColor = ActiveTheme.Instance.PrimaryBackgroundColor; - meshViewerWidget.BuildVolumeColor = new RGBA_Bytes(ActiveTheme.Instance.PrimaryAccentColor.Red0To255, ActiveTheme.Instance.PrimaryAccentColor.Green0To255, ActiveTheme.Instance.PrimaryAccentColor.Blue0To255, 50); - }); - } } } \ No newline at end of file diff --git a/PartPreviewWindow/ViewGcodeBasic.cs b/PartPreviewWindow/ViewGcodeBasic.cs index 6ca172929..769281490 100644 --- a/PartPreviewWindow/ViewGcodeBasic.cs +++ b/PartPreviewWindow/ViewGcodeBasic.cs @@ -46,11 +46,11 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { public enum WindowMode { Embeded, StandAlone }; - //public SolidSlider selectLayerSlider; + public SolidSlider selectLayerSlider; - //private SetLayerWidget setLayerWidget; - //private LayerNavigationWidget navigationWidget; - //public DoubleSolidSlider layerRenderRatioSlider; + private SetLayerWidget setLayerWidget; + private LayerNavigationWidget navigationWidget; + public DoubleSolidSlider layerRenderRatioSlider; private TextWidget gcodeProcessingStateInfoText; private ViewGcodeWidget gcodeViewWidget; @@ -89,7 +89,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow private int sliderWidth; public ViewGcodeBasic(Vector3 viewerVolume, Vector2 bedCenter, BedShape bedShape, WindowMode windowMode, ViewControls3D viewControls3D) - :base(viewControls3D) + : base(viewControls3D) { this.viewerVolume = viewerVolume; this.bedShape = bedShape; @@ -108,28 +108,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow CreateAndAddChildren(); ActiveSliceSettings.SettingChanged.RegisterEvent(CheckSettingChanged, ref unregisterEvents); - - ApplicationController.Instance.AdvancedControlsPanelReloading.RegisterEvent(RecreateBedAndPartPosition, ref unregisterEvents); - ActiveSliceSettings.ActivePrinterChanged.RegisterEvent(RecreateBedAndPartPosition, ref unregisterEvents); - - ActiveSliceSettings.ActivePrinterChanged.RegisterEvent(CheckSettingChanged, ref unregisterEvents); - } - - private void RecreateBedAndPartPosition(object sender, EventArgs e) - { - viewerVolume = new Vector3(ActiveSliceSettings.Instance.GetValue(SettingsKey.bed_size), ActiveSliceSettings.Instance.GetValue(SettingsKey.build_height)); - bedShape = ActiveSliceSettings.Instance.GetValue(SettingsKey.bed_shape); - bedCenter = ActiveSliceSettings.Instance.GetValue(SettingsKey.print_center); - - double buildHeight = ActiveSliceSettings.Instance.GetValue(SettingsKey.build_height); - - UiThread.RunOnIdle(() => - { - meshViewerWidget.CreatePrintBed( - viewerVolume, - bedCenter, - bedShape); - }); + ApplicationController.Instance.AdvancedControlsPanelReloading.RegisterEvent((s, e) => Clear3DGCode(), ref unregisterEvents); } private void CheckSettingChanged(object sender, EventArgs e) @@ -154,63 +133,27 @@ namespace MatterHackers.MatterControl.PartPreviewWindow || stringEvent.Data == SettingsKey.bed_shape || stringEvent.Data == SettingsKey.center_part_on_bed) { - RecreateBedAndPartPosition(null, null); + viewerVolume = new Vector3(ActiveSliceSettings.Instance.GetValue(SettingsKey.bed_size), ActiveSliceSettings.Instance.GetValue(SettingsKey.build_height)); + bedShape = ActiveSliceSettings.Instance.GetValue(SettingsKey.bed_shape); + bedCenter = ActiveSliceSettings.Instance.GetValue(SettingsKey.print_center); + + double buildHeight = ActiveSliceSettings.Instance.GetValue(SettingsKey.build_height); + + UiThread.RunOnIdle(() => + { + meshViewerWidget.CreatePrintBed( + viewerVolume, + bedCenter, + bedShape); + }); } - else if(stringEvent.Data == "extruder_offset") + else if (stringEvent.Data == "extruder_offset") { Clear3DGCode(); } } } - public void LoadItem() - { - Clear3DGCode(); - - gcodeDisplayWidget.CloseAllChildren(); - - if (printItem == null) - { - return; - } - - //firstProcessingMessage = "Loading G-Code...".Localize(); - if (Path.GetExtension(printItem.FileLocation).ToUpper() == ".GCODE") - { - gcodeDisplayWidget.AddChild(CreateGCodeViewWidget(printItem.FileLocation)); - } - else - { - if (File.Exists(printItem.FileLocation)) - { - string gcodePathAndFileName = printItem.GetGCodePathAndFileName(); - bool gcodeFileIsComplete = printItem.IsGCodeFileComplete(gcodePathAndFileName); - - //if (printItem.SlicingHadError) - //{ - // firstProcessingMessage = slicingErrorMessage; - //} - //else - //{ - // firstProcessingMessage = pressGenerateMessage; - //} - - if (File.Exists(gcodePathAndFileName) && gcodeFileIsComplete) - { - gcodeDisplayWidget.AddChild(CreateGCodeViewWidget(gcodePathAndFileName)); - } - - // we only hook these up to make sure we can regenerate the gcode when we want - printItem.SlicingOutputMessage += sliceItem_SlicingOutputMessage; - printItem.SlicingDone += sliceItem_Done; - } - //else - //{ - // firstProcessingMessage = string.Format("{0}\n'{1}'", fileNotFoundMessage, printItem.Name); - //} - } - } - private void Clear3DGCode() { if (gcodeViewWidget?.gCodeRenderer != null) @@ -292,6 +235,49 @@ namespace MatterHackers.MatterControl.PartPreviewWindow }; string firstProcessingMessage = "Press 'Add' to select an item.".Localize(); + if (printItem != null) + { + firstProcessingMessage = "Loading G-Code...".Localize(); + if (Path.GetExtension(printItem.FileLocation).ToUpper() == ".GCODE") + { + gcodeDisplayWidget.AddChild(CreateGCodeViewWidget(printItem.FileLocation)); + } + else + { + if (File.Exists(printItem.FileLocation)) + { + string gcodePathAndFileName = printItem.GetGCodePathAndFileName(); + bool gcodeFileIsComplete = printItem.IsGCodeFileComplete(gcodePathAndFileName); + + if (printItem.SlicingHadError) + { + firstProcessingMessage = slicingErrorMessage; + } + else + { + firstProcessingMessage = pressGenerateMessage; + } + + if (File.Exists(gcodePathAndFileName) && gcodeFileIsComplete) + { + gcodeDisplayWidget.AddChild(CreateGCodeViewWidget(gcodePathAndFileName)); + } + + // we only hook these up to make sure we can regenerate the gcode when we want + printItem.SlicingOutputMessage += sliceItem_SlicingOutputMessage; + printItem.SlicingDone += sliceItem_Done; + } + else + { + firstProcessingMessage = string.Format("{0}\n'{1}'", fileNotFoundMessage, printItem.Name); + } + } + } + else + { + generateGCodeButton.Visible = false; + } + SetProcessingMessage(firstProcessingMessage); centerPartPreviewAndControls.AddChild(gcodeDisplayWidget); @@ -315,7 +301,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow meshViewerWidget.AllowBedRenderingWhenEmpty = true; gcodeDisplayWidget.AddChild(meshViewerWidget); meshViewerWidget.Visible = false; - meshViewerWidget.TrackballTumbleWidget.DrawGlContent += TrackballTumbleWidget_DrawGlContent; + meshViewerWidget.TrackballTumbleWidget.DrawGlContent += new EventHandler(TrackballTumbleWidget_DrawGlContent); viewControls2D = new ViewControls2D(); viewControls2D.Visible = false; @@ -326,7 +312,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow SetDefaultView2D(); }; - viewControls3D.RegisterViewer(meshViewerWidget); viewControls3D.ResetView += (sender, e) => { meshViewerWidget.ResetView(); @@ -341,10 +326,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow //viewControls3D.translateButton.ClickButton(null); - meshViewerWidget.ResetView(); + //meshViewerWidget.ResetView(); - PrinterConnectionAndCommunication.Instance.ActivePrintItemChanged.RegisterEvent(HookUpGCodeMessagesWhenDonePrinting, ref unregisterEvents); - viewControls2D.translateButton.Click += (sender, e) => { gcodeViewWidget.TransformState = ViewGcodeWidget.ETransformState.Move; @@ -354,7 +337,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow gcodeViewWidget.TransformState = ViewGcodeWidget.ETransformState.Scale; }; - AddHandlers(); + expandModelOptions.CheckedStateChanged += expandModelOptions_CheckedStateChanged; + expandDisplayOptions.CheckedStateChanged += expandDisplayOptions_CheckedStateChanged; } private void SetDefaultView2D() @@ -377,15 +361,15 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { renderType |= RenderType.SpeedColors; } - if (gcodeViewWidget.SimulateExtrusion) - { - renderType |= RenderType.SimulateExtrusion; - } - if (gcodeViewWidget.TransparentExtrusion) - { - renderType |= RenderType.TransparentExtrusion; - } - if (gcodeViewWidget.HideExtruderOffsets) + if (gcodeViewWidget.SimulateExtrusion) + { + renderType |= RenderType.SimulateExtrusion; + } + if (gcodeViewWidget.TransparentExtrusion) + { + renderType |= RenderType.TransparentExtrusion; + } + if (gcodeViewWidget.HideExtruderOffsets) { renderType |= RenderType.HideExtruderOffsets; } @@ -409,7 +393,22 @@ namespace MatterHackers.MatterControl.PartPreviewWindow gcodeViewWidget.gCodeRenderer.Render3D(renderInfo); } - private Action ResetAnimationPosition; + private void SetAnimationPosition() + { + int currentLayer = PrinterConnectionAndCommunication.Instance.CurrentlyPrintingLayer; + if (currentLayer <= 0) + { + selectLayerSlider.Value = 0; + layerRenderRatioSlider.SecondValue = 0; + layerRenderRatioSlider.FirstValue = 0; + } + else + { + selectLayerSlider.Value = currentLayer - 1; + layerRenderRatioSlider.SecondValue = PrinterConnectionAndCommunication.Instance.RatioIntoCurrentLayer; + layerRenderRatioSlider.FirstValue = 0; + } + } private FlowLayoutWidget CreateRightButtonPanel() { @@ -532,6 +531,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow modelInfoContainer.AddChild(GetEstimatedMassInfo()); modelInfoContainer.AddChild(GetEstimatedCostInfo()); + PrinterConnectionAndCommunication.Instance.CommunicationStateChanged.RegisterEvent(HookUpGCodeMessagesWhenDonePrinting, ref unregisterEvents); + buttonPanel.AddChild(modelInfoContainer); textImageButtonFactory.FixedWidth = oldWidth; @@ -728,24 +729,24 @@ namespace MatterHackers.MatterControl.PartPreviewWindow layerInfoContainer.AddChild(simulateExtrusion); } - // put in a render extrusion transparent checkbox - { - CheckBox transparentExtrusion = new CheckBox("Transparent".Localize(), textColor: ActiveTheme.Instance.PrimaryTextColor) - { - Checked = gcodeViewWidget.TransparentExtrusion, - Margin = new BorderDouble(5, 0, 0, 0), - HAnchor = HAnchor.ParentLeft, - }; + // put in a render extrusion transparent checkbox + { + CheckBox transparentExtrusion = new CheckBox("Transparent".Localize(), textColor: ActiveTheme.Instance.PrimaryTextColor) + { + Checked = gcodeViewWidget.TransparentExtrusion, + Margin = new BorderDouble(5, 0, 0, 0), + HAnchor = HAnchor.ParentLeft, + }; - transparentExtrusion.CheckedStateChanged += (sender, e) => - { - gcodeViewWidget.TransparentExtrusion = transparentExtrusion.Checked; - }; - layerInfoContainer.AddChild(transparentExtrusion); - } + transparentExtrusion.CheckedStateChanged += (sender, e) => + { + gcodeViewWidget.TransparentExtrusion = transparentExtrusion.Checked; + }; + layerInfoContainer.AddChild(transparentExtrusion); + } - // put in a simulate extrusion checkbox - if (ActiveSliceSettings.Instance.GetValue(SettingsKey.extruder_count) > 1) + // put in a simulate extrusion checkbox + if (ActiveSliceSettings.Instance.GetValue(SettingsKey.extruder_count) > 1) { CheckBox hideExtruderOffsets = new CheckBox("Hide Offsets", textColor: ActiveTheme.Instance.PrimaryTextColor); hideExtruderOffsets.Checked = gcodeViewWidget.HideExtruderOffsets; @@ -806,7 +807,34 @@ namespace MatterHackers.MatterControl.PartPreviewWindow textImageButtonFactory.FixedWidth = oldWidth; } - private Action SetSyncToPrintVisibility; + private void SetSyncToPrintVisibility() + { + if (windowMode == WindowMode.Embeded) + { + bool printerIsRunningPrint = PrinterConnectionAndCommunication.Instance.PrinterIsPaused || PrinterConnectionAndCommunication.Instance.PrinterIsPrinting; + + if (syncToPrint.Checked && printerIsRunningPrint) + { + SetAnimationPosition(); + //navigationWidget.Visible = false; + //setLayerWidget.Visible = false; + layerRenderRatioSlider.Visible = false; + selectLayerSlider.Visible = false; + } + else + { + if (layerRenderRatioSlider != null) + { + layerRenderRatioSlider.FirstValue = 0; + layerRenderRatioSlider.SecondValue = 1; + } + navigationWidget.Visible = true; + setLayerWidget.Visible = true; + layerRenderRatioSlider.Visible = true; + selectLayerSlider.Visible = true; + } + } + } private void SetLayerViewType() { @@ -842,7 +870,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow generateGCodeButton.Visible = true; } - //SetSyncToPrintVisibility(); + SetSyncToPrintVisibility(); } private string partToStartLoadingOnFirstDraw = null; @@ -866,7 +894,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow && syncToPrint.Checked && printerIsRunningPrint) { - ResetAnimationPosition(); + SetAnimationPosition(); } EnsureKeyDownHooked(); @@ -988,7 +1016,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow return false; } - private void DoneLoadingGCode(object sender, EventArgs ex) + private void DoneLoadingGCode(object sender, EventArgs e) { SetProcessingMessage(""); if (gcodeViewWidget != null @@ -1019,112 +1047,39 @@ namespace MatterHackers.MatterControl.PartPreviewWindow buttonRightPanel.Visible = true; viewControlsToggle.Visible = true; - var setLayerWidget = new SetLayerWidget(gcodeViewWidget); + CloseIfNotNull(setLayerWidget); + setLayerWidget = new SetLayerWidget(gcodeViewWidget); setLayerWidget.VAnchor = Agg.UI.VAnchor.ParentTop; layerSelectionButtonsPanel.AddChild(setLayerWidget); - var navigationWidget = new LayerNavigationWidget(gcodeViewWidget); + CloseIfNotNull(navigationWidget); + navigationWidget = new LayerNavigationWidget(gcodeViewWidget); navigationWidget.Margin = new BorderDouble(0, 0, 20, 0); layerSelectionButtonsPanel.AddChild(navigationWidget); - var selectLayerSlider = new SolidSlider(new Vector2(), sliderWidth, 0, gcodeViewWidget.LoadedGCode.NumChangesInZ - 1, Orientation.Vertical); - selectLayerSlider.ValueChanged += (s, e) => - { - gcodeViewWidget.ActiveLayerIndex = (int)(selectLayerSlider.Value + .5); - }; - gcodeViewWidget.ActiveLayerChanged += (s, e) => - { - if (gcodeViewWidget.ActiveLayerIndex != (int)(selectLayerSlider.Value + .5)) - { - selectLayerSlider.Value = gcodeViewWidget.ActiveLayerIndex; - } - }; + CloseIfNotNull(selectLayerSlider); + selectLayerSlider = new SolidSlider(new Vector2(), sliderWidth, 0, gcodeViewWidget.LoadedGCode.NumChangesInZ - 1, Orientation.Vertical); + selectLayerSlider.ValueChanged += new EventHandler(selectLayerSlider_ValueChanged); + gcodeViewWidget.ActiveLayerChanged += new EventHandler(gcodeViewWidget_ActiveLayerChanged); AddChild(selectLayerSlider); - var layerRenderRatioSlider = new DoubleSolidSlider(new Vector2(), sliderWidth); + CloseIfNotNull(layerRenderRatioSlider); + layerRenderRatioSlider = new DoubleSolidSlider(new Vector2(), sliderWidth); layerRenderRatioSlider.FirstValue = 0; - layerRenderRatioSlider.FirstValueChanged += (s, e) => - { - gcodeViewWidget.FeatureToStartOnRatio0To1 = layerRenderRatioSlider.FirstValue; - gcodeViewWidget.FeatureToEndOnRatio0To1 = layerRenderRatioSlider.SecondValue; - gcodeViewWidget.Invalidate(); - }; + layerRenderRatioSlider.FirstValueChanged += new EventHandler(layerStartRenderRatioSlider_ValueChanged); layerRenderRatioSlider.SecondValue = 1; - layerRenderRatioSlider.SecondValueChanged += (s, e) => - { - gcodeViewWidget.FeatureToStartOnRatio0To1 = layerRenderRatioSlider.FirstValue; - gcodeViewWidget.FeatureToEndOnRatio0To1 = layerRenderRatioSlider.SecondValue; - gcodeViewWidget.Invalidate(); - }; + layerRenderRatioSlider.SecondValueChanged += new EventHandler(layerEndRenderRatioSlider_ValueChanged); AddChild(layerRenderRatioSlider); - ResetAnimationPosition = () => - { - int currentLayer = PrinterConnectionAndCommunication.Instance.CurrentlyPrintingLayer; - if (currentLayer <= 0) - { - selectLayerSlider.Value = 0; - layerRenderRatioSlider.SecondValue = 0; - layerRenderRatioSlider.FirstValue = 0; - } - else - { - selectLayerSlider.Value = currentLayer - 1; - layerRenderRatioSlider.SecondValue = PrinterConnectionAndCommunication.Instance.RatioIntoCurrentLayer; - layerRenderRatioSlider.FirstValue = 0; - } - }; - - SetSyncToPrintVisibility = () => - { - if (windowMode == WindowMode.Embeded) - { - bool printerIsRunningPrint = PrinterConnectionAndCommunication.Instance.PrinterIsPaused || PrinterConnectionAndCommunication.Instance.PrinterIsPrinting; - - if (syncToPrint?.Checked == true - && printerIsRunningPrint) - { - ResetAnimationPosition(); - //navigationWidget.Visible = false; - //setLayerWidget.Visible = false; - layerRenderRatioSlider.Visible = false; - selectLayerSlider.Visible = false; - } - else - { - if (layerRenderRatioSlider != null) - { - layerRenderRatioSlider.FirstValue = 0; - layerRenderRatioSlider.SecondValue = 1; - } - navigationWidget.Visible = true; - setLayerWidget.Visible = true; - layerRenderRatioSlider.Visible = true; - selectLayerSlider.Visible = true; - } - } - }; - - SetSliderSizes = () => - { - selectLayerSlider.OriginRelativeParent = new Vector2(gcodeDisplayWidget.Width - 20, 70); - selectLayerSlider.TotalWidthInPixels = gcodeDisplayWidget.Height - 80; - - layerRenderRatioSlider.OriginRelativeParent = new Vector2(60, 70); - layerRenderRatioSlider.TotalWidthInPixels = gcodeDisplayWidget.Width - 100; - }; - SetSliderSizes(); // let's change the active layer so that it is set to the first layer with data gcodeViewWidget.ActiveLayerIndex = gcodeViewWidget.ActiveLayerIndex + 1; gcodeViewWidget.ActiveLayerIndex = gcodeViewWidget.ActiveLayerIndex - 1; - BoundsChanged += PartPreviewGCode_BoundsChanged; + BoundsChanged += new EventHandler(PartPreviewGCode_BoundsChanged); meshViewerWidget.partProcessingInfo.Visible = false; - - } } @@ -1140,13 +1095,47 @@ namespace MatterHackers.MatterControl.PartPreviewWindow } } + private void layerStartRenderRatioSlider_ValueChanged(object sender, EventArgs e) + { + gcodeViewWidget.FeatureToStartOnRatio0To1 = layerRenderRatioSlider.FirstValue; + gcodeViewWidget.FeatureToEndOnRatio0To1 = layerRenderRatioSlider.SecondValue; + gcodeViewWidget.Invalidate(); + } + + private void layerEndRenderRatioSlider_ValueChanged(object sender, EventArgs e) + { + gcodeViewWidget.FeatureToStartOnRatio0To1 = layerRenderRatioSlider.FirstValue; + gcodeViewWidget.FeatureToEndOnRatio0To1 = layerRenderRatioSlider.SecondValue; + gcodeViewWidget.Invalidate(); + } + + private void gcodeViewWidget_ActiveLayerChanged(object sender, EventArgs e) + { + if (gcodeViewWidget.ActiveLayerIndex != (int)(selectLayerSlider.Value + .5)) + { + selectLayerSlider.Value = gcodeViewWidget.ActiveLayerIndex; + } + } + + private void selectLayerSlider_ValueChanged(object sender, EventArgs e) + { + gcodeViewWidget.ActiveLayerIndex = (int)(selectLayerSlider.Value + .5); + } + private void PartPreviewGCode_BoundsChanged(object sender, EventArgs e) { SetSliderSizes(); } - private Action SetSliderSizes; - + private void SetSliderSizes() + { + selectLayerSlider.OriginRelativeParent = new Vector2(gcodeDisplayWidget.Width - 20, 70); + selectLayerSlider.TotalWidthInPixels = gcodeDisplayWidget.Height - 80; + + layerRenderRatioSlider.OriginRelativeParent = new Vector2(60, 70); + layerRenderRatioSlider.TotalWidthInPixels = gcodeDisplayWidget.Width - 100; + } + private void AddHandlers() { expandModelOptions.CheckedStateChanged += expandModelOptions_CheckedStateChanged; @@ -1181,10 +1170,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { UnHookWidgetThatHasKeyDownHooked(); - if (unregisterEvents != null) - { - unregisterEvents(this, null); - } + unregisterEvents?.Invoke(this, null); if (printItem != null) { @@ -1220,8 +1206,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow printItem.SlicingOutputMessage -= sliceItem_SlicingOutputMessage; printItem.SlicingDone -= sliceItem_Done; - UiThread.RunOnIdle(() => LoadItem()); - + UiThread.RunOnIdle(CreateAndAddChildren); startedSliceFromGenerateButton = false; } } diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index ad644c610..b366b6dcc 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit ad644c6103b0ae28a105b886e00f7fc34382a380 +Subproject commit b366b6dcc98da47611565cbe638ccf04fb2067ea