diff --git a/ApplicationView/PrinterModels.cs b/ApplicationView/PrinterModels.cs index 125d0eec0..525e27647 100644 --- a/ApplicationView/PrinterModels.cs +++ b/ApplicationView/PrinterModels.cs @@ -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(() => { diff --git a/PartPreviewWindow/GCode2DWidget.cs b/PartPreviewWindow/GCode2DWidget.cs index 604219f1f..5d3c2d208 100644 --- a/PartPreviewWindow/GCode2DWidget.cs +++ b/PartPreviewWindow/GCode2DWidget.cs @@ -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(SettingsKey.bed_size); + this.gridCenterMm = ActiveSliceSettings.Instance.GetValue(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(SettingsKey.bed_size); + this.gridCenterMm = ActiveSliceSettings.Instance.GetValue(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); } diff --git a/PartPreviewWindow/PrinterTabPage.cs b/PartPreviewWindow/PrinterTabPage.cs index 880ddb5c9..2763bc79d 100644 --- a/PartPreviewWindow/PrinterTabPage.cs +++ b/PartPreviewWindow/PrinterTabPage.cs @@ -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) }; diff --git a/PartPreviewWindow/View3D/BedMeshGenerator.cs b/PartPreviewWindow/View3D/BedMeshGenerator.cs index e27acb9c0..98484a805 100644 --- a/PartPreviewWindow/View3D/BedMeshGenerator.cs +++ b/PartPreviewWindow/View3D/BedMeshGenerator.cs @@ -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"); diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index 32c80a675..5a72ceef8 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit 32c80a6750a68e961c8b8c53f4d7af83a9746144 +Subproject commit 5a72ceef8b2c7aa1c2c43b97907d61f9c421765f