mattercontrol/PartPreviewWindow/ColorGradientWidget.cs
Lars Brubaker b51b38b249 Moved TextWidget.GlobalPointSizeScaleRatio -> GuiWidget.DeviceScale
Significantly improved the layout consistency when enlarging the device scale.
Created a DeviceMargin and DevicePadding on GuiWidget
Deleted dead code
Made many images have default larger disk sizes and scale in memory.
Made the menus have horizontal spacers rather than dashed lines
2016-05-06 17:56:27 -07:00

106 lines
No EOL
3.1 KiB
C#

using MatterHackers.Agg;
using MatterHackers.Agg.UI;
using MatterHackers.GCodeVisualizer;
using MatterHackers.MatterControl.CustomWidgets;
using System;
using System.Collections.Generic;
using System.Linq;
namespace MatterHackers.MatterControl.PartPreviewWindow
{
public class ColorGradientWidget : FlowLayoutWidget
{
public ColorGradientWidget(GCodeFile gcodeFileTest)
: base(FlowDirection.TopToBottom)
{
BackgroundColor = new RGBA_Bytes(0, 0, 0, 120);
HashSet<float> speeds = new HashSet<float>();
PrinterMachineInstruction previousInstruction = gcodeFileTest.Instruction(0);
for (int i = 1; i < gcodeFileTest.LineCount; i++)
{
PrinterMachineInstruction instruction = gcodeFileTest.Instruction(i);
if (instruction.EPosition > previousInstruction.EPosition && (instruction.Line.IndexOf('X') != -1 || instruction.Line.IndexOf('Y') != -1))
{
speeds.Add((float)instruction.FeedRate);
}
previousInstruction = instruction;
}
ExtrusionColors extrusionColors = new ExtrusionColors();
speeds.Select(speed => extrusionColors.GetColorForSpeed(speed)).ToArray();
if(speeds.Count <= 0)
{
// There are no paths so don't generate the rest of the widget.
return;
}
float min = speeds.Min();
float max = speeds.Max();
int maxItems = Math.Min(7, speeds.Count());
int count = maxItems - 1;
float increment = (max - min) / count;
int index = 0;
int[] rangeValues;
if (speeds.Count < 8)
{
rangeValues = speeds.Select(s => (int)s).OrderBy(i => i).ToArray();
}
else
{
rangeValues = Enumerable.Range(0, maxItems).Select(x => (int)(min + increment * index++)).ToArray();
}
RGBA_Bytes[] speedColors = rangeValues.OrderBy(s => s).Select(speed => extrusionColors.GetColorForSpeed(speed)).ToArray();
for (int i = 0; i < speedColors.Length; i++)
{
RGBA_Bytes color = speedColors[i];
int speed = rangeValues[i];
GuiWidget colorWidget = new GuiWidget();
colorWidget.Width = 20;
colorWidget.Height = 20;
colorWidget.BackgroundColor = color;
colorWidget.Margin = new BorderDouble(2);
double feedRateToMMPerSecond = speed / 60;
ColorToSpeedWidget colorToSpeedWidget = new ColorToSpeedWidget(colorWidget, feedRateToMMPerSecond);
this.AddChild(colorToSpeedWidget);
}
Margin = new BorderDouble(5, 5, 200, 50);
HAnchor |= Agg.UI.HAnchor.ParentLeft;
VAnchor = Agg.UI.VAnchor.ParentTop;
}
public class ColorToSpeedWidget : FlowLayoutWidget
{
public string layerSpeed;
public ColorToSpeedWidget(GuiWidget colorWidget, double speed)
: base(FlowDirection.LeftToRight)
{
Margin = new BorderDouble(2);
layerSpeed = "{0} mm/s".FormatWith(speed);
colorWidget.Margin = new BorderDouble(left: 2);
TextWidget speedTextBox = new TextWidget(layerSpeed, pointSize: 12);
speedTextBox.TextColor = RGBA_Bytes.White;
speedTextBox.VAnchor = VAnchor.ParentCenter;
speedTextBox.Margin = new BorderDouble(5, 0);
this.AddChild(colorWidget);
this.AddChild(new HorizontalSpacer());
this.AddChild(speedTextBox);
this.HAnchor |= HAnchor.ParentLeftRight;
}
}
}
}