Move ownership of GCode ActiveLayer & FeatureToStart/StopOn to model
This commit is contained in:
parent
781ff748b4
commit
3ab89b8d3f
7 changed files with 119 additions and 94 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -275,6 +275,11 @@ namespace MatterHackers.GCodeVisualizer
|
|||
|
||||
public void Render3D(GCodeRenderInfo renderInfo)
|
||||
{
|
||||
if (renderInfo == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (layerVertexBuffer == null)
|
||||
{
|
||||
layerVertexBuffer = new List<GCodeVertexBuffer>();
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue