using the bed image on 2d view

making bed re-calculate on 2d view
This commit is contained in:
Lars Brubaker 2018-04-19 14:37:54 -07:00
parent 3ae3256f27
commit a421ca2aae
5 changed files with 86 additions and 100 deletions

View file

@ -290,8 +290,7 @@ namespace MatterHackers.MatterControl
{
// Load bed and build volume meshes
var bedGenerator = new BedMeshGenerator();
(_bedMesh, _buildVolumeMesh) = bedGenerator.CreatePrintBedAndVolume(Printer);
(_bedMesh, _buildVolumeMesh) = BedMeshGenerator.CreatePrintBedAndVolume(Printer);
Task.Run(() =>
{

View file

@ -30,10 +30,12 @@ either expressed or implied, of the FreeBSD Project.
using System;
using MatterControl.Printing;
using MatterHackers.Agg;
using MatterHackers.Agg.Image;
using MatterHackers.Agg.Transform;
using MatterHackers.Agg.UI;
using MatterHackers.Agg.VertexSource;
using MatterHackers.GCodeVisualizer;
using MatterHackers.MatterControl.SlicerConfiguration;
using MatterHackers.RenderOpenGl;
using MatterHackers.RenderOpenGl.OpenGl;
using MatterHackers.VectorMath;
@ -57,30 +59,55 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
private GCodeFile loadedGCode => printer.Bed.LoadedGCode;
private View3DConfig options;
private PrinterConfig printer;
private VertexStorage grid = new VertexStorage();
private static Color gridColor = new Color(190, 190, 190, 255);
private EventHandler unregisterEvents;
private ImageBuffer bedImage;
public GCode2DWidget(Vector2 gridSizeMm, Vector2 gridCenterMm)
public GCode2DWidget(PrinterConfig printer)
{
options = ApplicationController.Instance.ActivePrinter.Bed.RendererOptions;
printer = ApplicationController.Instance.ActivePrinter;
this.printer = printer;
options = printer.Bed.RendererOptions;
this.gridSizeMm = gridSizeMm;
this.gridCenterMm = gridCenterMm;
this.BackgroundColor = ActiveTheme.Instance.PrimaryBackgroundColor;
this.LocalBounds = new RectangleDouble(0, 0, 100, 100);
this.AnchorAll();
printer.Bed.LoadedGCodeChanged += BedPlate_LoadedGCodeChanged;
printer.Bed.LoadedGCodeChanged += LoadedGCodeChanged;
// make sure we have good settings
ActiveSliceSettings.SettingChanged.RegisterEvent(Printer_SettingChanged, ref unregisterEvents);
Printer_SettingChanged(this, null);
this.gridSizeMm = ActiveSliceSettings.Instance.GetValue<Vector2>(SettingsKey.bed_size);
this.gridCenterMm = ActiveSliceSettings.Instance.GetValue<Vector2>(SettingsKey.print_center);
bedImage = BedMeshGenerator.CreatePrintBedImage(printer);
}
private void Printer_SettingChanged(object sender, EventArgs e)
{
if (e is StringEventArgs stringEvent)
{
if (stringEvent.Data == SettingsKey.bed_size
|| stringEvent.Data == SettingsKey.print_center
|| stringEvent.Data == SettingsKey.bed_shape)
{
this.gridSizeMm = ActiveSliceSettings.Instance.GetValue<Vector2>(SettingsKey.bed_size);
this.gridCenterMm = ActiveSliceSettings.Instance.GetValue<Vector2>(SettingsKey.print_center);
bedImage = BedMeshGenerator.CreatePrintBedImage(printer);
}
}
}
private Affine scalingTransform => Affine.NewScaling(layerScale, layerScale);
private Affine totalTransform => Affine.NewTranslation(unscaledRenderOffset) * scalingTransform * Affine.NewTranslation(Width / 2, Height / 2);
private void BedPlate_LoadedGCodeChanged(object sender, EventArgs e)
private void LoadedGCodeChanged(object sender, EventArgs e)
{
if (loadedGCode == null)
{
@ -110,17 +137,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
{
double gridLineWidths = 0.2 * layerScale;
if (graphics2D is Graphics2DOpenGL graphics2DGl)
{
GlRenderGrid(graphics2DGl, transform, gridLineWidths);
}
else
{
CreateGrid(transform);
Stroke stroke = new Stroke(grid, gridLineWidths);
graphics2D.Render(stroke, gridColor);
}
DrawBedImage(graphics2D, transform);
}
}
@ -145,66 +162,15 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
base.OnDraw(graphics2D);
}
private void GlRenderGrid(Graphics2DOpenGL graphics2DGl, Affine transform, double width)
{
graphics2DGl.PreRender();
GL.Begin(BeginMode.Triangles);
Vector2 gridOffset = gridCenterMm - gridSizeMm / 2;
if (gridSizeMm.X > 0 && gridSizeMm.Y > 0)
{
grid.remove_all();
for (int y = 0; y <= gridSizeMm.Y; y += 10)
{
Vector2 start = new Vector2(0, y) + gridOffset;
Vector2 end = new Vector2(gridSizeMm.X, y) + gridOffset;
transform.transform(ref start);
transform.transform(ref end);
graphics2DGl.DrawAALine(start, end, width, gridColor);
}
for (int x = 0; x <= gridSizeMm.X; x += 10)
{
Vector2 start = new Vector2(x, 0) + gridOffset;
Vector2 end = new Vector2(x, gridSizeMm.Y) + gridOffset;
transform.transform(ref start);
transform.transform(ref end);
graphics2DGl.DrawAALine(start, end, width, gridColor);
}
}
GL.End();
graphics2DGl.PopOrthoProjection();
}
public void CreateGrid(Affine transform)
public void DrawBedImage(Graphics2D graphics2D, Affine transform)
{
Vector2 gridOffset = gridCenterMm - gridSizeMm / 2;
if (gridSizeMm.X > 0 && gridSizeMm.Y > 0)
{
grid.remove_all();
for (int y = 0; y <= gridSizeMm.Y; y += 10)
{
Vector2 start = new Vector2(0, y) + gridOffset;
Vector2 end = new Vector2(gridSizeMm.X, y) + gridOffset;
transform.transform(ref start);
transform.transform(ref end);
grid.MoveTo(Math.Round(start.X), Math.Round(start.Y));
grid.LineTo(Math.Round(end.X), Math.Round(end.Y));
}
for (int x = 0; x <= gridSizeMm.X; x += 10)
{
Vector2 start = new Vector2(x, 0) + gridOffset;
Vector2 end = new Vector2(x, gridSizeMm.Y) + gridOffset;
transform.transform(ref start);
transform.transform(ref end);
grid.MoveTo((int)(start.X + .5) + .5, (int)(start.Y + .5));
grid.LineTo((int)(end.X + .5) + .5, (int)(end.Y + .5));
}
}
Vector2 imageStart = Vector2.Zero + gridOffset;
transform.transform(ref imageStart);
Vector2 imageEnd = gridSizeMm + gridOffset;
transform.transform(ref imageEnd);
graphics2D.Render(bedImage, imageStart, imageEnd.X - imageStart.X, imageEnd.Y - imageStart.Y);
}
double startDistanceBetweenPoints = 1;
@ -330,8 +296,10 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
public override void OnClosed(ClosedEventArgs e)
{
unregisterEvents?.Invoke(this, null);
printer.Bed.GCodeRenderer?.Dispose();
printer.Bed.LoadedGCodeChanged -= BedPlate_LoadedGCodeChanged;
printer.Bed.LoadedGCodeChanged -= LoadedGCodeChanged;
base.OnClosed(e);
}

View file

@ -189,8 +189,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
splitContainer.AddChild(gcodeContainer);
var viewerVolume = sceneContext.ViewerVolume;
view3DContainer.AddChild(new RunningTasksWidget(theme)
{
MinimumSize = new Vector2(100, 0),
@ -200,7 +198,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
});
// Create and append new widget
gcode2DWidget = new GCode2DWidget(new Vector2(viewerVolume.X, viewerVolume.Y), sceneContext.BedCenter)
gcode2DWidget = new GCode2DWidget(printer)
{
Visible = (printer.ViewState.ViewMode == PartViewMode.Layers2D)
};

View file

@ -40,21 +40,42 @@ using MatterHackers.VectorMath;
namespace MatterHackers.MatterControl
{
public class BedMeshGenerator
public static class BedMeshGenerator
{
private static ImageBuffer watermarkImage = null;
private Color bedBaseColor = new Color(245, 245, 255);
private Color bedMarkingsColor = Color.Black;
private static Color bedBaseColor = new Color(245, 245, 255);
private static Color bedMarkingsColor = Color.Black;
public (Mesh bed, Mesh volume) CreatePrintBedAndVolume(PrinterConfig printer)
public static ImageBuffer CreatePrintBedImage(PrinterConfig printer)
{
ImageBuffer bedImage;
switch (printer.Bed.BedShape)
{
case BedShape.Rectangular:
bedImage = CreateRectangularBedGridImage(printer);
break;
case BedShape.Circular:
bedImage = CreateCircularBedGridImage(printer);
break;
default:
throw new NotImplementedException();
}
return bedImage;
}
public static (Mesh bed, Mesh volume) CreatePrintBedAndVolume(PrinterConfig printer)
{
Mesh printerBed = null;
Mesh buildVolume = null;
Vector3 displayVolumeToBuild = Vector3.ComponentMax(printer.Bed.ViewerVolume, new Vector3(1, 1, 1));
ImageBuffer bedplateImage;
ImageBuffer bedplateImage = CreatePrintBedImage(printer);
switch (printer.Bed.BedShape)
{
@ -70,10 +91,6 @@ namespace MatterHackers.MatterControl
buildVolume.FaceBspTree = bspTree;
}
bedplateImage = CreateRectangularBedGridImage(printer);
ApplyOemBedImage(bedplateImage, printer);
printerBed = PlatonicSolids.CreateCube(displayVolumeToBuild.X, displayVolumeToBuild.Y, 1.8);
{
Face face = printerBed.Faces[0];
@ -92,10 +109,6 @@ namespace MatterHackers.MatterControl
}
}
bedplateImage = CreateCircularBedGridImage(printer);
ApplyOemBedImage(bedplateImage, printer);
printerBed = VertexSourceToMesh.Extrude(new Ellipse(new Vector2(), displayVolumeToBuild.X / 2, displayVolumeToBuild.Y / 2), 1.8);
{
foreach (Face face in printerBed.Faces)
@ -135,7 +148,7 @@ namespace MatterHackers.MatterControl
return (printerBed, buildVolume);
}
private ImageBuffer CreateCircularBedGridImage(PrinterConfig printer)
private static ImageBuffer CreateCircularBedGridImage(PrinterConfig printer)
{
Vector3 displayVolumeToBuild = Vector3.ComponentMax(printer.Bed.ViewerVolume, new Vector3(1, 1, 1));
@ -155,7 +168,6 @@ namespace MatterHackers.MatterControl
var bedplateImage = new ImageBuffer(1024, 1024);
Graphics2D graphics2D = bedplateImage.NewGraphics2D();
graphics2D.Clear(bedBaseColor);
var originPixels = new Vector2();
{
@ -191,6 +203,10 @@ namespace MatterHackers.MatterControl
}
}
Ellipse bedCircle = new Ellipse(bedplateImage.Width/2, bedplateImage.Height/2, bedplateImage.Width/2, bedplateImage.Height/2);
graphics2D.Render(bedCircle, bedBaseColor);
//graphics2D.Clear(bedBaseColor);
{
double lineSpacePixels = bedplateImage.Width / (displayVolumeToBuild.X / cmPerLine);
@ -239,10 +255,13 @@ namespace MatterHackers.MatterControl
graphics2D.DrawString((yPositionCmInt * skip).ToString(), originPixels.X + 4, linePos + 4, pointSize, color: bedMarkingsColor);
}
}
ApplyOemBedImage(bedplateImage, printer);
return bedplateImage;
}
private ImageBuffer CreateRectangularBedGridImage(PrinterConfig printer)
private static ImageBuffer CreateRectangularBedGridImage(PrinterConfig printer)
{
Vector3 displayVolumeToBuild = Vector3.ComponentMax(printer.Bed.ViewerVolume, new Vector3(1, 1, 1));
double sizeForMarking = Math.Max(displayVolumeToBuild.X, displayVolumeToBuild.Y);
@ -307,10 +326,12 @@ namespace MatterHackers.MatterControl
}
}
ApplyOemBedImage(bedplateImage, printer);
return bedplateImage;
}
private void ApplyOemBedImage(ImageBuffer bedImage, PrinterConfig printer)
private static void ApplyOemBedImage(ImageBuffer bedImage, PrinterConfig printer)
{
// Add an oem/watermark image to the bedplate grid
string imagePathAndFile = Path.Combine("OEMSettings", "bedimage.png");

@ -1 +1 @@
Subproject commit 32c80a6750a68e961c8b8c53f4d7af83a9746144
Subproject commit 5a72ceef8b2c7aa1c2c43b97907d61f9c421765f