using the bed image on 2d view
making bed re-calculate on 2d view
This commit is contained in:
parent
3ae3256f27
commit
a421ca2aae
5 changed files with 86 additions and 100 deletions
|
|
@ -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(() =>
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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
|
||||
Loading…
Add table
Add a link
Reference in a new issue