Fix Layer3D view in design_tools, sync part/layer views on enter

- Revert to 1.7/ViewGcodeBasic code and make functional
This commit is contained in:
John Lewin 2017-05-25 17:58:20 -07:00
parent e1421fb779
commit 42898a6f91
11 changed files with 472 additions and 500 deletions

View file

@ -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()

View file

@ -915,7 +915,7 @@ namespace MatterHackers.MatterControl
if (showNamesUnderMouse)
{
List<WidgetAndPosition> namedChildren = new List<WidgetAndPosition>();
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));

View file

@ -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;

View file

@ -117,8 +117,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
disabledTextColor = ActiveTheme.Instance.PrimaryTextColor
};
BackgroundColor = RGBA_Bytes.White;
}
}
}

View file

@ -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<GuiWidget> DynamicPopupContent { get; set; }
public List<Func<GuiWidget>> DynamicPopupContent { get; set; } = new List<Func<GuiWidget>>();
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)

View file

@ -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)

View file

@ -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);
}

View file

@ -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<double>(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 }

View file

@ -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<MeshViewerWidget> meshViewers = new List<MeshViewerWidget>();
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<TransformStateChangedEventArgs> 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<double>(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);
});
}
}
}

View file

@ -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<Vector2>(SettingsKey.bed_size), ActiveSliceSettings.Instance.GetValue<double>(SettingsKey.build_height));
bedShape = ActiveSliceSettings.Instance.GetValue<BedShape>(SettingsKey.bed_shape);
bedCenter = ActiveSliceSettings.Instance.GetValue<Vector2>(SettingsKey.print_center);
double buildHeight = ActiveSliceSettings.Instance.GetValue<double>(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<Vector2>(SettingsKey.bed_size), ActiveSliceSettings.Instance.GetValue<double>(SettingsKey.build_height));
bedShape = ActiveSliceSettings.Instance.GetValue<BedShape>(SettingsKey.bed_shape);
bedCenter = ActiveSliceSettings.Instance.GetValue<Vector2>(SettingsKey.print_center);
double buildHeight = ActiveSliceSettings.Instance.GetValue<double>(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<int>(SettingsKey.extruder_count) > 1)
// put in a simulate extrusion checkbox
if (ActiveSliceSettings.Instance.GetValue<int>(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;
}
}

@ -1 +1 @@
Subproject commit ad644c6103b0ae28a105b886e00f7fc34382a380
Subproject commit b366b6dcc98da47611565cbe638ccf04fb2067ea