Move ownership of GCode ActiveLayer & FeatureToStart/StopOn to model

This commit is contained in:
John Lewin 2017-06-28 20:48:00 -07:00
parent 781ff748b4
commit 3ab89b8d3f
7 changed files with 119 additions and 94 deletions

View file

@ -52,6 +52,7 @@ namespace MatterHackers.MatterControl
using Agg.Font;
using Agg.Image;
using CustomWidgets;
using MatterHackers.Agg.Transform;
using MatterHackers.DataConverters3D;
using MatterHackers.GCodeVisualizer;
using MatterHackers.MatterControl.ConfigurationPage.PrintLeveling;
@ -69,10 +70,53 @@ namespace MatterHackers.MatterControl
public class BedConfig
{
public event EventHandler ActiveLayerChanged;
public GCodeFile LoadedGCode { get; set; }
// TODO: Make assignment private, wire up post slicing initialization here
public GCodeRenderer GCodeRenderer { get; set; }
public int ActiveLayerIndex
{
get
{
return activeLayerIndex;
}
set
{
if (activeLayerIndex != value)
{
activeLayerIndex = value;
if (this.GCodeRenderer == null || activeLayerIndex < 0)
{
activeLayerIndex = 0;
}
else if (activeLayerIndex >= this.LoadedGCode.NumChangesInZ)
{
activeLayerIndex = this.LoadedGCode.NumChangesInZ - 1;
}
this.RenderInfo.EndLayerIndex = activeLayerIndex;
ActiveLayerChanged?.Invoke(this, null);
}
}
}
private int activeLayerIndex;
public GCodeRenderInfo RenderInfo { get; set; }
internal void RenderExtra()
{
if (this.RenderInfo != null)
{
this.GCodeRenderer.Render3D(this.RenderInfo);
}
}
}
public class PrinterConfig

View file

@ -53,7 +53,7 @@ namespace MatterHackers.GCodeVisualizer
public int StartLayerIndex { get; set; }
public int EndLayerIndex { get; }
public int EndLayerIndex { get; set; }
public Affine Transform { get; }
@ -61,9 +61,9 @@ namespace MatterHackers.GCodeVisualizer
public RenderType CurrentRenderType { get; }
public double FeatureToStartOnRatio0To1 { get; }
public double FeatureToStartOnRatio0To1 { get; set; }
public double FeatureToEndOnRatio0To1 { get; }
public double FeatureToEndOnRatio0To1 { get; set; }
public GCodeRenderInfo()
{

View file

@ -275,6 +275,11 @@ namespace MatterHackers.GCodeVisualizer
public void Render3D(GCodeRenderInfo renderInfo)
{
if (renderInfo == null)
{
return;
}
if (layerVertexBuffer == null)
{
layerVertexBuffer = new List<GCodeVertexBuffer>();

View file

@ -48,9 +48,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
{
public event EventHandler DoneLoading;
public double FeatureToStartOnRatio0To1 = 0;
public double FeatureToEndOnRatio0To1 = 1;
public enum ETransformState { Move, Scale };
public ETransformState TransformState { get; set; }
@ -59,7 +56,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
private Vector2 mouseDownPosition = new Vector2(0, 0);
private double layerScale = 1;
private int activeLayerIndex;
private Vector2 gridSizeMm;
private Vector2 gridCenterMm;
@ -88,38 +84,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
private Vector2 unscaledRenderOffset = new Vector2(0, 0);
public event EventHandler ActiveLayerChanged;
private GCodeFile loadedGCode => printer.BedPlate.LoadedGCode;
public int ActiveLayerIndex
{
get
{
return activeLayerIndex;
}
set
{
if (activeLayerIndex != value)
{
activeLayerIndex = value;
if (printer.BedPlate.GCodeRenderer == null || activeLayerIndex < 0)
{
activeLayerIndex = 0;
}
else if (activeLayerIndex >= loadedGCode.NumChangesInZ)
{
activeLayerIndex = loadedGCode.NumChangesInZ - 1;
}
Invalidate();
ActiveLayerChanged?.Invoke(this, null);
}
}
}
private ReportProgressRatio progressReporter;
private View3DConfig options;
@ -127,6 +93,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
public GCode2DWidget(Vector2 gridSizeMm, Vector2 gridCenterMm, ReportProgressRatio progressReporter)
{
options = ApplicationController.Instance.Options.View3D;
printer = ApplicationController.Instance.Printer;
@ -141,7 +108,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
private void SetInitalLayer()
{
activeLayerIndex = 0;
if (loadedGCode.LineCount > 0)
{
int firstExtrusionIndex = 0;
@ -166,7 +132,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
{
if (firstExtrusionIndex < loadedGCode.GetInstructionIndexAtLayer(layerIndex))
{
activeLayerIndex = Math.Max(0, layerIndex - 1);
printer.BedPlate.ActiveLayerIndex = Math.Max(0, layerIndex - 1);
break;
}
}
@ -207,13 +173,13 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
}
var renderInfo = new GCodeRenderInfo(
activeLayerIndex,
activeLayerIndex,
printer.BedPlate.ActiveLayerIndex,
printer.BedPlate.ActiveLayerIndex,
transform,
layerScale,
CreateRenderInfo(),
FeatureToStartOnRatio0To1,
FeatureToEndOnRatio0To1,
printer.BedPlate.RenderInfo.FeatureToStartOnRatio0To1,
printer.BedPlate.RenderInfo.FeatureToEndOnRatio0To1,
new Vector2[]
{
ActiveSliceSettings.Instance.Helpers.ExtruderOffset(0),

View file

@ -49,7 +49,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
var prevLayerButton = buttonFactory.Generate("<<");
prevLayerButton.Click += (s, e) =>
{
gcode2DWidget.ActiveLayerIndex = (gcode2DWidget.ActiveLayerIndex - 1);
printer.BedPlate.ActiveLayerIndex -= 1;
};
this.AddChild(prevLayerButton);
@ -65,7 +65,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
var nextLayerButton = buttonFactory.Generate(">>");
nextLayerButton.Click += (s, e) =>
{
gcode2DWidget.ActiveLayerIndex = (gcode2DWidget.ActiveLayerIndex + 1);
printer.BedPlate.ActiveLayerIndex += 1;
};
this.AddChild(nextLayerButton);
}
@ -75,7 +75,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
{
if (printer.BedPlate.LoadedGCode != null)
{
layerCountTextWidget.Text = string.Format("{0} / {1}", gcode2DWidget.ActiveLayerIndex + 1, printer.BedPlate.LoadedGCode.NumChangesInZ.ToString());
layerCountTextWidget.Text = string.Format("{0} / {1}", printer.BedPlate.ActiveLayerIndex + 1, printer.BedPlate.LoadedGCode.NumChangesInZ.ToString());
}
base.OnDraw(graphics2D);

View file

@ -35,7 +35,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
{
public class SetLayerWidget : FlowLayoutWidget
{
public SetLayerWidget(GCode2DWidget gcode2DWidget, TextImageButtonFactory buttonFactory)
public SetLayerWidget(GCode2DWidget gcode2DWidget, TextImageButtonFactory buttonFactory, BedConfig bedConfig)
: base(FlowDirection.LeftToRight)
{
var editCurrentLayerIndex = new NumberEdit(1, pixelWidth: 40)
@ -46,21 +46,21 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
};
editCurrentLayerIndex.EditComplete += (s, e) =>
{
gcode2DWidget.ActiveLayerIndex = ((int)editCurrentLayerIndex.Value - 1);
editCurrentLayerIndex.Value = gcode2DWidget.ActiveLayerIndex + 1;
bedConfig.ActiveLayerIndex = ((int)editCurrentLayerIndex.Value - 1);
editCurrentLayerIndex.Value = bedConfig.ActiveLayerIndex + 1;
};
this.AddChild(editCurrentLayerIndex);
gcode2DWidget.ActiveLayerChanged += (s, e) =>
bedConfig.ActiveLayerChanged += (s, e) =>
{
editCurrentLayerIndex.Value = gcode2DWidget.ActiveLayerIndex + 1;
editCurrentLayerIndex.Value = bedConfig.ActiveLayerIndex + 1;
};
var setLayerButton = buttonFactory.Generate("Go".Localize());
setLayerButton.VAnchor = VAnchor.ParentCenter;
setLayerButton.Click += (s, e) =>
{
gcode2DWidget.ActiveLayerIndex = ((int)editCurrentLayerIndex.Value - 1);
bedConfig.ActiveLayerIndex = ((int)editCurrentLayerIndex.Value - 1);
};
this.AddChild(setLayerButton);
}

View file

@ -92,6 +92,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
private PrinterConfig printer;
private ViewControls3D viewControls3D;
private BedConfig bedPlate;
public ViewGcodeBasic(Vector3 viewerVolume, Vector2 bedCenter, BedShape bedShape, WindowMode windowMode, ViewControls3D viewControls3D, ThemeConfig theme, MeshViewerWidget externalMeshViewer)
{
this.externalMeshViewer = externalMeshViewer;
@ -128,10 +130,22 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
}
}, ref unregisterEvents);
bedPlate = ApplicationController.Instance.Printer.BedPlate;
bedPlate.ActiveLayerChanged += ActiveLayer_Changed;
// TODO: Why do we clear GCode on AdvancedControlsPanelReloading - assume some slice settings should invalidate. If so, code should be more specific and bound to slice settings changed
ApplicationController.Instance.AdvancedControlsPanelReloading.RegisterEvent((s, e) => printer.BedPlate.GCodeRenderer?.Clear3DGCode(), ref unregisterEvents);
}
private void ActiveLayer_Changed(object sender, EventArgs e)
{
if (bedPlate.ActiveLayerIndex != (int)(selectLayerSlider.Value + .5))
{
selectLayerSlider.Value = bedPlate.ActiveLayerIndex;
}
}
private GCodeFile loadedGCode => printer.BedPlate.LoadedGCode;
private void CreateAndAddChildren()
@ -145,8 +159,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
gcodeProcessingStateInfoText = null;
FlowLayoutWidget mainContainerTopToBottom = new FlowLayoutWidget(FlowDirection.TopToBottom);
mainContainerTopToBottom.HAnchor = Agg.UI.HAnchor.Max_FitToChildren_ParentWidth;
mainContainerTopToBottom.VAnchor = Agg.UI.VAnchor.Max_FitToChildren_ParentHeight;
mainContainerTopToBottom.HAnchor = HAnchor.Max_FitToChildren_ParentWidth;
mainContainerTopToBottom.VAnchor = VAnchor.Max_FitToChildren_ParentHeight;
buttonBottomPanel = new FlowLayoutWidget(FlowDirection.LeftToRight);
buttonBottomPanel.HAnchor = HAnchor.ParentLeftRight;
@ -345,24 +359,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
return;
}
GCodeRenderer.ExtrusionColor = ActiveTheme.Instance.PrimaryAccentColor;
var renderInfo = new GCodeRenderInfo(
0,
Math.Min(gcode2DWidget.ActiveLayerIndex + 1, loadedGCode.NumChangesInZ),
gcode2DWidget.TotalTransform,
1,
GetRenderType(),
gcode2DWidget.FeatureToStartOnRatio0To1,
gcode2DWidget.FeatureToEndOnRatio0To1,
new Vector2[]
{
ActiveSliceSettings.Instance.Helpers.ExtruderOffset(0),
ActiveSliceSettings.Instance.Helpers.ExtruderOffset(1)
},
MeshViewerWidget.GetMaterialColor);
printer.BedPlate.GCodeRenderer.Render3D(renderInfo);
printer.BedPlate.RenderExtra();
}
private void SetAnimationPosition()
@ -646,6 +643,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
}
}
var printer = ApplicationController.Instance.Printer;
if (gcode2DWidget != null
&& loadedGCode?.LineCount > 0)
{
@ -660,8 +659,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
viewControlsToggle.Visible = true;
setLayerWidget?.Close();
setLayerWidget = new SetLayerWidget(gcode2DWidget, ApplicationController.Instance.Theme.GCodeLayerButtons);
setLayerWidget.VAnchor = Agg.UI.VAnchor.ParentTop;
setLayerWidget = new SetLayerWidget(gcode2DWidget, ApplicationController.Instance.Theme.GCodeLayerButtons, ApplicationController.Instance.Printer.BedPlate);
setLayerWidget.VAnchor = VAnchor.ParentTop;
layerSelectionButtonsPanel.AddChild(setLayerWidget);
navigationWidget?.Close();
@ -673,20 +672,15 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
selectLayerSlider = new SolidSlider(new Vector2(), sliderWidth, 0, loadedGCode.NumChangesInZ - 1, Orientation.Vertical);
selectLayerSlider.ValueChanged += (s, e) =>
{
gcode2DWidget.FeatureToStartOnRatio0To1 = layerRenderRatioSlider.FirstValue;
gcode2DWidget.FeatureToEndOnRatio0To1 = layerRenderRatioSlider.SecondValue;
gcode2DWidget.Invalidate();
// TODO: Why would these need to be updated here as well as in assigned in the hslider below?
printer.BedPlate.RenderInfo.FeatureToStartOnRatio0To1 = layerRenderRatioSlider.FirstValue;
printer.BedPlate.RenderInfo.FeatureToEndOnRatio0To1 = layerRenderRatioSlider.SecondValue;
gcode2DWidget.ActiveLayerIndex = (int)(selectLayerSlider.Value + .5);
printer.BedPlate.ActiveLayerIndex = (int)(selectLayerSlider.Value + .5);
this.Invalidate();
};
gcode2DWidget.ActiveLayerChanged += (s, e) =>
{
if (gcode2DWidget.ActiveLayerIndex != (int)(selectLayerSlider.Value + .5))
{
selectLayerSlider.Value = gcode2DWidget.ActiveLayerIndex;
}
};
AddChild(selectLayerSlider);
layerRenderRatioSlider?.Close();
@ -694,24 +688,40 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
layerRenderRatioSlider.FirstValue = 0;
layerRenderRatioSlider.FirstValueChanged += (s, e) =>
{
gcode2DWidget.FeatureToStartOnRatio0To1 = layerRenderRatioSlider.FirstValue;
gcode2DWidget.FeatureToEndOnRatio0To1 = layerRenderRatioSlider.SecondValue;
gcode2DWidget.Invalidate();
printer.BedPlate.RenderInfo.FeatureToStartOnRatio0To1 = layerRenderRatioSlider.FirstValue;
printer.BedPlate.RenderInfo.FeatureToEndOnRatio0To1 = layerRenderRatioSlider.SecondValue;
this.Invalidate();
};
layerRenderRatioSlider.SecondValue = 1;
layerRenderRatioSlider.SecondValueChanged += (s, e) =>
{
gcode2DWidget.FeatureToStartOnRatio0To1 = layerRenderRatioSlider.FirstValue;
gcode2DWidget.FeatureToEndOnRatio0To1 = layerRenderRatioSlider.SecondValue;
gcode2DWidget.Invalidate();
printer.BedPlate.RenderInfo.FeatureToStartOnRatio0To1 = layerRenderRatioSlider.FirstValue;
printer.BedPlate.RenderInfo.FeatureToEndOnRatio0To1 = layerRenderRatioSlider.SecondValue;
this.Invalidate();
};
AddChild(layerRenderRatioSlider);
SetSliderSizes();
// let's change the active layer so that it is set to the first layer with data
gcode2DWidget.ActiveLayerIndex = gcode2DWidget.ActiveLayerIndex + 1;
gcode2DWidget.ActiveLayerIndex = gcode2DWidget.ActiveLayerIndex - 1;
GCodeRenderer.ExtrusionColor = ActiveTheme.Instance.PrimaryAccentColor;
// ResetRenderInfo
printer.BedPlate.RenderInfo = new GCodeRenderInfo(
0,
1,
Agg.Transform.Affine.NewIdentity(),
1,
GetRenderType(),
0,
1,
new Vector2[]
{
ActiveSliceSettings.Instance.Helpers.ExtruderOffset(0),
ActiveSliceSettings.Instance.Helpers.ExtruderOffset(1)
},
MeshViewerWidget.GetMaterialColor);
this.gcodeDetails = new GCodeDetails(this.loadedGCode);