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:
parent
e1421fb779
commit
42898a6f91
11 changed files with 472 additions and 500 deletions
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -117,8 +117,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
|
|||
|
||||
disabledTextColor = ActiveTheme.Instance.PrimaryTextColor
|
||||
};
|
||||
|
||||
BackgroundColor = RGBA_Bytes.White;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 }
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
Loading…
Add table
Add a link
Reference in a new issue