Adding ability to cancel rebuilding

This commit is contained in:
LarsBrubaker 2021-12-05 22:01:50 -08:00
parent aa795f1d3b
commit dd3912a504
86 changed files with 257 additions and 67 deletions

View file

@ -2171,14 +2171,14 @@ namespace MatterHackers.MatterControl
printer.ViewState.SlicingItem = true;
await this.Tasks.Execute("Slicing".Localize(), printer, async (reporter, cancellationToken) =>
await this.Tasks.Execute("Slicing".Localize(), printer, async (reporter, cancellationTokenSource) =>
{
slicingSucceeded = await Slicer.SliceItem(
object3D,
gcodeFilePath,
printer,
reporter,
cancellationToken);
cancellationTokenSource.Token);
});
printer.ViewState.SlicingItem = false;
@ -2217,13 +2217,13 @@ namespace MatterHackers.MatterControl
}
}
await this.Tasks.Execute("Loading GCode".Localize(), printer, (innerProgress, token) =>
await this.Tasks.Execute("Loading GCode".Localize(), printer, (innerProgress, concelationTokenSource) =>
{
var status = new ProgressStatus();
innerProgress.Report(status);
printer.Bed.LoadActiveSceneGCode(gcodeFilePath, token, (progress0to1, statusText) =>
printer.Bed.LoadActiveSceneGCode(gcodeFilePath, concelationTokenSource.Token, (progress0to1, statusText) =>
{
UiThread.RunOnIdle(() =>
{
@ -2434,7 +2434,7 @@ namespace MatterHackers.MatterControl
public int Priority { get; set; }
public Func<IProgress<ProgressStatus>, CancellationToken, Task> Action { get; set; }
public Func<IProgress<ProgressStatus>, CancellationTokenSource, Task> Action { get; set; }
}
public class StartupAction

View file

@ -159,12 +159,12 @@ namespace MatterHackers.MatterControl
public async Task LoadGCodeContent(Stream stream)
{
await ApplicationController.Instance.Tasks.Execute("Loading G-Code".Localize(), Printer, (reporter, cancellationToken) =>
await ApplicationController.Instance.Tasks.Execute("Loading G-Code".Localize(), Printer, (reporter, cancellationTokenSource) =>
{
var progressStatus = new ProgressStatus();
reporter.Report(progressStatus);
this.LoadGCode(stream, cancellationToken, (progress0To1, status) =>
this.LoadGCode(stream, cancellationTokenSource.Token, (progress0To1, status) =>
{
progressStatus.Status = status;
progressStatus.Progress0To1 = progress0To1;
@ -330,7 +330,7 @@ namespace MatterHackers.MatterControl
await insertionGroup.LoadingItemsTask;
// Persist changes
await this.SaveChanges(null, CancellationToken.None);
await this.SaveChanges(null, null);
// Slice and print
await ApplicationController.Instance.PrintPart(
@ -650,9 +650,9 @@ namespace MatterHackers.MatterControl
/// Persists modified meshes to assets and saves pending changes back to the EditContext
/// </summary>
/// <param name="progress">Allows for progress reporting</param>
/// <param name="cancellationToken">Allows for cancellation during processing</param>
/// <param name="cancellationTokenSource">Allows for cancellation during processing</param>
/// <returns>A task representing success</returns>
public async Task SaveChanges(IProgress<ProgressStatus> progress, CancellationToken cancellationToken)
public async Task SaveChanges(IProgress<ProgressStatus> progress, CancellationTokenSource cancellationTokenSource)
{
var progressStatus = new ProgressStatus()
{

View file

@ -100,7 +100,7 @@ namespace MatterHackers.MatterControl
};
}
public Task Execute(string taskTitle, object owner, Func<IProgress<ProgressStatus>, CancellationToken, Task> func, RunningTaskOptions taskActions = null)
public Task Execute(string taskTitle, object owner, Func<IProgress<ProgressStatus>, CancellationTokenSource, Task> func, RunningTaskOptions taskActions = null)
{
var tokenSource = new CancellationTokenSource();
@ -117,7 +117,7 @@ namespace MatterHackers.MatterControl
{
try
{
await func?.Invoke(taskDetails, tokenSource.Token);
await func?.Invoke(taskDetails, tokenSource);
}
catch
{

View file

@ -82,7 +82,7 @@ namespace MatterHackers.MatterControl
Task LoadLibraryContent(ILibraryItem libraryItem);
Task SaveChanges(IProgress<ProgressStatus> progress, CancellationToken cancellationToken);
Task SaveChanges(IProgress<ProgressStatus> progress, CancellationTokenSource cancellationToken);
// TODO: Isolate printer specifics from ISceneContext

View file

@ -153,7 +153,7 @@ namespace MatterHackers.MatterControl.ConfigurationPage.PrintLeveling
originalEditContext = printer.Bed.EditContext;
Task.Run(() =>
{
printer.Bed.SaveChanges(null, CancellationToken.None);
printer.Bed.SaveChanges(null, null);
});
// loop until we are done calibrating

View file

@ -230,12 +230,12 @@ namespace MatterHackers.MatterControl
ApplicationController.Instance.Tasks.Execute(
"Saving".Localize() + "...",
printer,
async (reporter, cancellationToken) =>
async (reporter, cancellationTokenSource) =>
{
string path = openParams.FolderPath;
if (!string.IsNullOrEmpty(path))
{
await exportPlugin.Generate(libraryItems, path, reporter, cancellationToken);
await exportPlugin.Generate(libraryItems, path, reporter, cancellationTokenSource.Token);
}
});
});
@ -264,7 +264,7 @@ namespace MatterHackers.MatterControl
ApplicationController.Instance.Tasks.Execute(
"Exporting".Localize() + "...",
printer,
async (reporter, cancellationToken) =>
async (reporter, cancellationTokenSource) =>
{
string extension = Path.GetExtension(savePath);
if (!extension.Equals(targetExtension, StringComparison.OrdinalIgnoreCase))
@ -281,7 +281,7 @@ namespace MatterHackers.MatterControl
gCodeExport.CenterOnBed = centerOnBed;
}
exportErrors = await exportPlugin.Generate(libraryItems, savePath, reporter, cancellationToken);
exportErrors = await exportPlugin.Generate(libraryItems, savePath, reporter, cancellationTokenSource.Token);
}
if (exportErrors == null || exportErrors.Count == 0)

View file

@ -133,6 +133,7 @@ namespace MatterHackers.MatterControl.DesignTools
}
}
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children));
}
}

View file

@ -263,8 +263,9 @@ namespace MatterHackers.MatterControl.DesignTools
}
}
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children));
return Task.CompletedTask;
return base.Rebuild();
}
}
}

View file

@ -86,7 +86,7 @@ namespace MatterHackers.MatterControl.DesignTools
this.Mesh = null;
this.Invalidate(InvalidateType.Children);
return Task.CompletedTask;
return base.Rebuild();
}
}
}

View file

@ -30,6 +30,7 @@ either expressed or implied, of the FreeBSD Project.
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using MatterHackers.Agg;
using MatterHackers.Agg.Platform;
@ -88,6 +89,19 @@ namespace MatterHackers.MatterControl.Plugins.Lithophane
}
}
private CancellationTokenSource cancellationToken;
public bool IsBuilding => this.cancellationToken != null;
public void CancelBuild()
{
var threadSafe = this.cancellationToken;
if (threadSafe != null)
{
threadSafe.Cancel();
}
}
public override Task Rebuild()
{
this.DebugDepth("Rebuild");
@ -110,8 +124,9 @@ namespace MatterHackers.MatterControl.Plugins.Lithophane
var rebuildLocks = this.RebuilLockAll();
ApplicationController.Instance.Tasks.Execute("Generating Lithophane".Localize(), null, (reporter, cancellationToken) =>
ApplicationController.Instance.Tasks.Execute("Generating Lithophane".Localize(), null, (reporter, cancellationTokenSource) =>
{
this.cancellationToken = cancellationTokenSource as CancellationTokenSource;
var generatedMesh = Lithophane.Generate(
new Lithophane.ImageBufferImageData(activeImage, this.Width),
this.Height,
@ -132,16 +147,18 @@ namespace MatterHackers.MatterControl.Plugins.Lithophane
// Apply offset
this.Matrix *= Matrix4X4.CreateTranslation(-this.ImageOffset);
this.cancellationToken = null;
UiThread.RunOnIdle(() =>
{
rebuildLocks.Dispose();
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children));
});
return Task.CompletedTask;
});
return Task.CompletedTask;
return base.Rebuild();
}
}
}

View file

@ -84,14 +84,14 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
return ApplicationController.Instance.Tasks.Execute(
"Combine".Localize(),
null,
(reporter, cancellationToken) =>
(reporter, cancellationTokenSource) =>
{
var progressStatus = new ProgressStatus();
reporter.Report(progressStatus);
try
{
Combine(cancellationToken, reporter);
Combine(cancellationTokenSource.Token, reporter);
}
catch
{
@ -100,10 +100,11 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
UiThread.RunOnIdle(() =>
{
rebuildLocks.Dispose();
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children));
});
return Task.CompletedTask;
return base.Rebuild();
});
}

View file

@ -194,10 +194,11 @@ namespace MatterHackers.MatterControl.DesignTools
Matrix = currentMatrix;
}
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Mesh));
Invalidate(InvalidateType.DisplayValues);
return Task.CompletedTask;
return base.Rebuild();
}
}
}

View file

@ -120,6 +120,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
});
}
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children));
}
@ -141,6 +142,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
});
}
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children));
}
@ -200,8 +202,9 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
}
}
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Matrix));
return Task.CompletedTask;
return base.Rebuild();
}
public override AxisAlignedBoundingBox GetAxisAlignedBoundingBox(Matrix4X4 matrix)

View file

@ -78,14 +78,14 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
{
var rebuildLocks = this.RebuilLockAll();
return ApplicationController.Instance.Tasks.Execute("Intersection".Localize(), null, (reporter, cancellationToken) =>
return ApplicationController.Instance.Tasks.Execute("Intersection".Localize(), null, (reporter, cancellationTokenSource) =>
{
var progressStatus = new ProgressStatus();
reporter.Report(progressStatus);
try
{
Intersect(cancellationToken, reporter);
Intersect(cancellationTokenSource.Token, reporter);
}
catch
{
@ -94,9 +94,10 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
UiThread.RunOnIdle(() =>
{
rebuildLocks.Dispose();
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children));
});
return Task.CompletedTask;
return base.Rebuild();
});
}

View file

@ -93,6 +93,7 @@ namespace MatterHackers.MatterControl.DesignTools
this.Matrix = oldMatrix;
}
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children));
return Task.CompletedTask;

View file

@ -125,6 +125,7 @@ namespace MatterHackers.MatterControl.DesignTools
Matrix = currentMatrix;
}
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children));
return Task.CompletedTask;
}

View file

@ -93,6 +93,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
}
}
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Matrix));
return Task.CompletedTask;

View file

@ -91,6 +91,7 @@ namespace MatterHackers.MatterControl.Library
Invalidate(InvalidateType.DisplayValues);
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Mesh));
return Task.CompletedTask;
}

View file

@ -386,6 +386,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
});
}
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Matrix));
return Task.CompletedTask;
}

View file

@ -108,6 +108,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
UiThread.RunOnIdle(() =>
{
rebuildLock.Dispose();
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children));
});
return Task.CompletedTask;

View file

@ -98,6 +98,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
SourceContainer.Visible = false;
rebuildLock.Dispose();
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children));
return Task.CompletedTask;

View file

@ -135,6 +135,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
UiThread.RunOnIdle(() =>
{
rebuildLock.Dispose();
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children));
});
return Task.CompletedTask;

View file

@ -227,6 +227,7 @@ namespace MatterHackers.MatterControl.DesignTools
{
rebuildLocks.Dispose();
Invalidate(InvalidateType.DisplayValues);
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children));
});

View file

@ -162,6 +162,19 @@ namespace MatterHackers.MatterControl.DesignTools
}
}
private CancellationTokenSource cancellationToken;
public bool IsBuilding => this.cancellationToken != null;
public void CancelBuild()
{
var threadSafe = this.cancellationToken;
if (threadSafe != null)
{
threadSafe.Cancel();
}
}
public override Task Rebuild()
{
this.DebugDepth("Rebuild");
@ -197,8 +210,9 @@ namespace MatterHackers.MatterControl.DesignTools
return ApplicationController.Instance.Tasks.Execute(
"Curve".Localize(),
null,
(reporter, cancellationToken) =>
(reporter, cancellationTokenSource) =>
{
this.cancellationToken = cancellationTokenSource as CancellationTokenSource;
var sourceAabb = this.SourceContainer.GetAxisAlignedBoundingBox();
var radius = diameter / 2;
@ -295,10 +309,12 @@ namespace MatterHackers.MatterControl.DesignTools
list.AddRange(curvedChildren);
});
this.cancellationToken = null;
UiThread.RunOnIdle(() =>
{
rebuildLocks.Dispose();
Invalidate(InvalidateType.DisplayValues);
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children));
});

View file

@ -172,6 +172,7 @@ namespace MatterHackers.MatterControl.DesignTools
{
rebuildLocks.Dispose();
Invalidate(InvalidateType.DisplayValues);
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children));
});

View file

@ -182,6 +182,7 @@ namespace MatterHackers.MatterControl.DesignTools
{
rebuildLocks.Dispose();
Invalidate(InvalidateType.DisplayValues);
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children));
});

View file

@ -223,6 +223,8 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
}
}
this.CancelAllParentBuilding();
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Matrix | additonalInvalidate));
return Task.CompletedTask;
}

View file

@ -191,6 +191,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
}
}
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Matrix | additonalInvalidate));
return Task.CompletedTask;
}

View file

@ -172,6 +172,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
}
}
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Matrix));
return Task.CompletedTask;
}

View file

@ -144,6 +144,7 @@ namespace MatterHackers.MatterControl.DesignTools
{
rebuildLocks.Dispose();
Invalidate(InvalidateType.DisplayValues);
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children));
});

View file

@ -370,6 +370,7 @@ namespace MatterHackers.MatterControl.DesignTools
UiThread.RunOnIdle(() =>
{
rebuildLock.Dispose();
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Path));
});

View file

@ -415,6 +415,7 @@ namespace MatterHackers.MatterControl.DesignTools
{
rebuildLock.Dispose();
Invalidate(InvalidateType.DisplayValues);
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Path));
});

View file

@ -113,6 +113,7 @@ namespace MatterHackers.MatterControl.DesignTools
UiThread.RunOnIdle(() =>
{
rebuildLock.Dispose();
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children));
});

View file

@ -103,6 +103,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
this.Mesh = this.VertexSource.Extrude(Constants.PathPolygonsHeight);
}
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Path));
return Task.CompletedTask;
}

View file

@ -189,6 +189,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
{
rebuildLock.Dispose();
Invalidate(InvalidateType.DisplayValues);
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Mesh));
});

View file

@ -83,14 +83,14 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
return ApplicationController.Instance.Tasks.Execute(
operationName,
null,
(reporter, cancellationToken) =>
(reporter, cancellationTokenSource) =>
{
var progressStatus = new ProgressStatus();
reporter.Report(progressStatus);
try
{
Merge(reporter, cancellationToken);
Merge(reporter, cancellationTokenSource.Token);
}
catch
{
@ -102,6 +102,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
UiThread.RunOnIdle(() =>
{
rebuildLocks.Dispose();
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children));
});
return Task.CompletedTask;

View file

@ -114,6 +114,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
Invalidate(InvalidateType.DisplayValues);
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Path));
return Task.CompletedTask;
}

View file

@ -150,6 +150,19 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
}
}
private CancellationTokenSource cancellationToken;
public bool IsBuilding => this.cancellationToken != null;
public void CancelBuild()
{
var threadSafe = this.cancellationToken;
if (threadSafe != null)
{
threadSafe.Cancel();
}
}
public override Task Rebuild()
{
this.DebugDepth("Rebuild");
@ -176,8 +189,9 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
return ApplicationController.Instance.Tasks.Execute(
"Revolve".Localize(),
null,
(reporter, cancellationToken) =>
(reporter, cancellationTokenSource) =>
{
this.cancellationToken = cancellationTokenSource as CancellationTokenSource;
var vertexSource = this.VertexSource;
var pathBounds = vertexSource.GetBounds();
vertexSource = vertexSource.Translate(-pathBounds.Left - axisPosition, 0);
@ -197,9 +211,11 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
Mesh = mesh;
this.cancellationToken = null;
UiThread.RunOnIdle(() =>
{
rebuildLock.Dispose();
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children));
});

View file

@ -107,6 +107,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
{
rebuildLock.Dispose();
this.Invalidate(InvalidateType.DisplayValues);
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Path));
});
return Task.CompletedTask;

View file

@ -175,6 +175,7 @@ namespace MatterHackers.MatterControl.DesignTools
{
rebuildLocks.Dispose();
Invalidate(InvalidateType.DisplayValues);
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children));
});

View file

@ -74,7 +74,7 @@ namespace MatterHackers.MatterControl.DesignTools
return TaskBuilder(
"Repair".Localize(),
(reporter, cancellationToken) =>
(reporter, cancellationTokenSource) =>
{
SourceContainer.Visible = true;
RemoveAllButSource();
@ -88,7 +88,7 @@ namespace MatterHackers.MatterControl.DesignTools
var originalMesh = sourceItem.Mesh;
inititialFaces += originalMesh.Faces.Count;
inititialVertices += originalMesh.Vertices.Count;
var repairedMesh = Repair(originalMesh, cancellationToken);
var repairedMesh = Repair(originalMesh, cancellationTokenSource.Token);
finalFaces += repairedMesh.Faces.Count;
finalVertices += repairedMesh.Vertices.Count;
@ -111,6 +111,7 @@ namespace MatterHackers.MatterControl.DesignTools
{
rebuildLocks.Dispose();
Invalidate(InvalidateType.DisplayValues);
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children));
});

View file

@ -152,6 +152,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
ItemWithTransform.Matrix = RotationMatrix;
}
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Matrix));
return Task.CompletedTask;

View file

@ -245,6 +245,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
}
}
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Matrix));
return Task.CompletedTask;

View file

@ -297,6 +297,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
}
}
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Matrix));
return Task.CompletedTask;

View file

@ -373,6 +373,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
Invalidate(InvalidateType.DisplayValues);
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Matrix));
return Task.CompletedTask;

View file

@ -181,7 +181,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
scene.SelectedItem = this;
this.CancelAllParentBuilding();
parent?.Invalidate(new InvalidateArgs(parent, InvalidateType.Children));
}
@ -228,6 +228,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
parentLock?.Dispose();
this.CancelAllParentBuilding();
parent?.Invalidate(new InvalidateArgs(parent, InvalidateType.Children));
}
}

View file

@ -106,6 +106,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
ItemWithTransform.Matrix = Matrix4X4.CreateTranslation(Translation);
}
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Matrix));
return Task.CompletedTask;
}

View file

@ -326,6 +326,7 @@ namespace MatterHackers.MatterControl.DesignTools
UiThread.RunOnIdle(() =>
{
rebuildLocks.Dispose();
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children));
Invalidate(InvalidateType.DisplayValues);
});

View file

@ -259,6 +259,7 @@ namespace MatterHackers.MatterControl.DesignTools
{
rebuildLock.Dispose();
Invalidate(InvalidateType.DisplayValues);
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children));
});

View file

@ -129,6 +129,7 @@ namespace MatterHackers.MatterControl.DesignTools
}
}
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Path));
return Task.CompletedTask;
}

View file

@ -107,6 +107,7 @@ namespace MatterHackers.MatterControl.DesignTools
}
}
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children));
return Task.CompletedTask;
}

View file

@ -146,8 +146,11 @@ namespace MatterHackers.MatterControl.DesignTools
}
}
// if any of our parest are re-bulding cancel it as we just changed and they need to start over
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Mesh));
return Task.CompletedTask;
return base.Rebuild();
}
public void UpdateControls(PublicPropertyChange change)

View file

@ -207,6 +207,7 @@ namespace MatterHackers.MatterControl.DesignTools
Invalidate(InvalidateType.DisplayValues);
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Mesh));
return Task.CompletedTask;
}

View file

@ -220,6 +220,7 @@ namespace MatterHackers.MatterControl.DesignTools
}
}
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Mesh));
return Task.CompletedTask;
}

View file

@ -112,6 +112,7 @@ namespace MatterHackers.MatterControl.DesignTools
Invalidate(InvalidateType.DisplayValues);
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Mesh));
return Task.CompletedTask;
}

View file

@ -135,6 +135,7 @@ namespace MatterHackers.MatterControl.DesignTools
Invalidate(InvalidateType.DisplayValues);
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Mesh));
return Task.CompletedTask;
}

View file

@ -102,6 +102,7 @@ namespace MatterHackers.MatterControl.DesignTools
}
}
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Mesh));
return Task.CompletedTask;
}

View file

@ -114,6 +114,7 @@ namespace MatterHackers.MatterControl.DesignTools
_image = image;
// send the invalidate on image change
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Image));
Invalidate(InvalidateType.DisplayValues);
}

View file

@ -128,6 +128,7 @@ namespace MatterHackers.MatterControl.DesignTools
Invalidate(InvalidateType.DisplayValues);
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Mesh));
return Task.CompletedTask;
});

View file

@ -228,6 +228,7 @@ namespace MatterHackers.MatterControl.DesignTools
}
}
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Mesh));
return Task.CompletedTask;
}

View file

@ -44,8 +44,8 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
{
public class OperationSourceContainerObject3D : Object3D
{
public static Func<string, Func<IProgress<ProgressStatus>, CancellationToken, Task>, Task> TaskBuilder { get; set; } =
(name, func) => Task.Run(() => func(null, CancellationToken.None));
public static Func<string, Func<IProgress<ProgressStatus>, CancellationTokenSource, Task>, Task> TaskBuilder { get; set; } =
(name, func) => Task.Run(() => func(null, null));
public override Mesh Mesh
{

View file

@ -103,6 +103,7 @@ namespace MatterHackers.MatterControl.DesignTools
}
}
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Mesh));
return Task.CompletedTask;
}

View file

@ -232,6 +232,7 @@ namespace MatterHackers.MatterControl.DesignTools
Invalidate(InvalidateType.DisplayValues);
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Mesh));
return Task.CompletedTask;
}

View file

@ -105,6 +105,7 @@ namespace MatterHackers.MatterControl.DesignTools
UpdateTexture();
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Mesh));
return Task.CompletedTask;
}

View file

@ -156,6 +156,7 @@ namespace MatterHackers.MatterControl.DesignTools
Invalidate(InvalidateType.DisplayValues);
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Mesh));
return Task.CompletedTask;
}

View file

@ -186,6 +186,7 @@ namespace MatterHackers.MatterControl.DesignTools
Invalidate(InvalidateType.DisplayValues);
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Mesh));
return Task.CompletedTask;
}

View file

@ -191,6 +191,7 @@ namespace MatterHackers.MatterControl.DesignTools
{
rebuildLock.Dispose();
Invalidate(InvalidateType.DisplayValues);
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children));
});
});

View file

@ -153,6 +153,7 @@ namespace MatterHackers.MatterControl.DesignTools
this.Mesh = this.VertexSource.Extrude(Constants.PathPolygonsHeight);
}
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Path));
return Task.CompletedTask;
}

View file

@ -158,6 +158,7 @@ namespace MatterHackers.MatterControl.DesignTools
Invalidate(InvalidateType.DisplayValues);
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Mesh));
return Task.CompletedTask;
}

View file

@ -132,6 +132,7 @@ namespace MatterHackers.MatterControl.DesignTools
}
}
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Mesh));
return Task.CompletedTask;

View file

@ -146,6 +146,7 @@ namespace MatterHackers.MatterControl.DesignTools
}
}
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Mesh));
return Task.CompletedTask;

View file

@ -157,6 +157,7 @@ namespace MatterHackers.MatterControl.DesignTools
}
}
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Mesh));
return Task.CompletedTask;
}

View file

@ -149,6 +149,7 @@ namespace MatterHackers.MatterControl.DesignTools
}
}
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Mesh));
return Task.CompletedTask;
}

View file

@ -144,6 +144,11 @@ namespace MatterHackers.MatterControl.DesignTools
}
public Task Create(IProgress<ProgressStatus> progress, CancellationToken cancellationToken)
{
return Create(progress, null);
}
public Task Create(IProgress<ProgressStatus> progress, CancellationTokenSource cancellationTokenSource)
{
var selectedItem = scene.SelectedItem;

View file

@ -80,11 +80,11 @@ namespace MatterControlLib
return ApplicationController.Instance.Tasks.Execute(
"Preparing help index".Localize(),
null,
(progress, cancellationToken) =>
(progress, cancellationTokenSource) =>
{
string relativePath = System.IO.Path.Combine("OemSettings", "help-docs.zip");
IndexZipFile(relativePath, progress, cancellationToken);
IndexZipFile(relativePath, progress, cancellationTokenSource.Token);
return Task.CompletedTask;
});

View file

@ -254,7 +254,7 @@ namespace MatterHackers.MatterControl.Library.Export
Printer,
(reporter, cancellationToken2) =>
{
return Slicer.SliceItem(loadedItem, gcodePath, Printer, reporter, cancellationToken2);
return Slicer.SliceItem(loadedItem, gcodePath, Printer, reporter, cancellationToken2.Token);
});
Printer.Settings.SetValue(SettingsKey.spiral_vase, oldSpiralVaseSetting ? "1" : "0");

View file

@ -43,9 +43,11 @@ using MatterHackers.VectorMath;
namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
{
[ShowUpdateButton(false)]
public class CombineObject3D_2 : OperationSourceContainerObject3D, IPropertyGridModifier
public class CombineObject3D_2 : OperationSourceContainerObject3D, IPropertyGridModifier, IBuildsOnThread
{
public CombineObject3D_2()
private CancellationTokenSource cancellationToken;
public CombineObject3D_2()
{
Name = "Combine";
}
@ -67,6 +69,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
private IplicitSurfaceMethod MeshAnalysis { get; set; }
private ProcessingResolution InputResolution { get; set; } = ProcessingResolution._64;
#endif
public bool IsBuilding => this.cancellationToken != null;
public override Task Rebuild()
{
this.DebugDepth("Rebuild");
@ -76,22 +80,25 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
return ApplicationController.Instance.Tasks.Execute(
"Combine".Localize(),
null,
(reporter, cancellationToken) =>
(reporter, cancellationTokenSource) =>
{
this.cancellationToken = cancellationTokenSource as CancellationTokenSource;
var progressStatus = new ProgressStatus();
reporter.Report(progressStatus);
try
{
Combine(cancellationToken, reporter);
Combine(cancellationTokenSource.Token, reporter);
}
catch
{
}
this.cancellationToken = null;
UiThread.RunOnIdle(() =>
{
rebuildLocks.Dispose();
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children));
});
return Task.CompletedTask;
@ -197,5 +204,14 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
change.SetRowVisible(nameof(MeshAnalysis), () => Processing != ProcessingModes.Polygons);
change.SetRowVisible(nameof(InputResolution), () => Processing != ProcessingModes.Polygons && MeshAnalysis == IplicitSurfaceMethod.Grid);
}
}
public void CancelBuild()
{
var threadSafe = this.cancellationToken;
if(threadSafe != null)
{
threadSafe.Cancel();
}
}
}
}

View file

@ -68,6 +68,19 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
private ProcessingResolution InputResolution { get; set; } = ProcessingResolution._64;
#endif
private CancellationTokenSource cancellationToken;
public bool IsBuilding => this.cancellationToken != null;
public void CancelBuild()
{
var threadSafe = this.cancellationToken;
if (threadSafe != null)
{
threadSafe.Cancel();
}
}
public override Task Rebuild()
{
this.DebugDepth("Rebuild");
@ -77,22 +90,25 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
return ApplicationController.Instance.Tasks.Execute(
"Intersection".Localize(),
null,
(reporter, cancellationToken) =>
(reporter, cancellationTokenSource) =>
{
this.cancellationToken = cancellationTokenSource as CancellationTokenSource;
var progressStatus = new ProgressStatus();
reporter.Report(progressStatus);
try
{
Intersect(cancellationToken, reporter);
Intersect(cancellationTokenSource.Token, reporter);
}
catch
{
}
this.cancellationToken = null;
UiThread.RunOnIdle(() =>
{
rebuildLocks.Dispose();
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children));
});

View file

@ -202,11 +202,11 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
var rebuildLocks = this.RebuilLockAll();
// spin up a task to calculate the paint
return ApplicationController.Instance.Tasks.Execute("Replacing".Localize(), null, (reporter, cancellationToken) =>
return ApplicationController.Instance.Tasks.Execute("Replacing".Localize(), null, (reporter, cancellationTokenSource) =>
{
try
{
SubtractAndReplace(cancellationToken, reporter);
SubtractAndReplace(cancellationTokenSource.Token, reporter);
}
catch
{
@ -215,6 +215,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
UiThread.RunOnIdle(() =>
{
rebuildLocks.Dispose();
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children));
});

View file

@ -129,16 +129,32 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
}
}
private CancellationTokenSource cancellationToken;
public bool IsBuilding => this.cancellationToken != null;
public void CancelBuild()
{
var threadSafe = this.cancellationToken;
if (threadSafe != null)
{
threadSafe.Cancel();
}
}
public override Task Rebuild()
{
var rebuildLocks = this.RebuilLockAll();
// spin up a task to calculate the paint
return ApplicationController.Instance.Tasks.Execute("Replacing".Localize(), null, (reporter, cancellationToken) =>
return ApplicationController.Instance.Tasks.Execute("Replacing".Localize(),
null,
(reporter, cancellationTokenSource) =>
{
this.cancellationToken = cancellationTokenSource as CancellationTokenSource;
try
{
SubtractAndReplace(cancellationToken, reporter);
SubtractAndReplace(cancellationTokenSource.Token, reporter);
var newComputedChildren = new SelectedChildren();
foreach (var id in SelectedChildren)
@ -152,9 +168,11 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
{
}
this.cancellationToken = null;
UiThread.RunOnIdle(() =>
{
rebuildLocks.Dispose();
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children));
});

View file

@ -85,14 +85,14 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
return ApplicationController.Instance.Tasks.Execute(
"Subtract".Localize(),
null,
(reporter, cancellationToken) =>
(reporter, cancellationTokenSource) =>
{
var progressStatus = new ProgressStatus();
reporter.Report(progressStatus);
try
{
Subtract(cancellationToken, reporter);
Subtract(cancellationTokenSource.Token, reporter);
}
catch
{
@ -101,6 +101,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
UiThread.RunOnIdle(() =>
{
rebuildLocks.Dispose();
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children));
});

View file

@ -45,7 +45,7 @@ using MatterHackers.VectorMath;
namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
{
[ShowUpdateButton(false)]
public class SubtractObject3D_2 : OperationSourceContainerObject3D, ISelectableChildContainer, ICustomEditorDraw, IPropertyGridModifier
public class SubtractObject3D_2 : OperationSourceContainerObject3D, ISelectableChildContainer, ICustomEditorDraw, IPropertyGridModifier, IBuildsOnThread
{
public SubtractObject3D_2()
{
@ -130,6 +130,19 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
}
}
private CancellationTokenSource cancellationToken;
public bool IsBuilding => this.cancellationToken != null;
public void CancelBuild()
{
var threadSafe = this.cancellationToken;
if (threadSafe != null)
{
threadSafe.Cancel();
}
}
public override Task Rebuild()
{
this.DebugDepth("Rebuild");
@ -139,22 +152,25 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
return ApplicationController.Instance.Tasks.Execute(
"Subtract".Localize(),
null,
(reporter, cancellationToken) =>
(reporter, cancellationTokenSource) =>
{
this.cancellationToken = cancellationTokenSource as CancellationTokenSource;
var progressStatus = new ProgressStatus();
reporter.Report(progressStatus);
try
{
Subtract(cancellationToken, reporter);
Subtract(cancellationTokenSource.Token, reporter);
}
catch
{
}
this.cancellationToken = null;
UiThread.RunOnIdle(() =>
{
rebuildLocks.Dispose();
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children));
});

View file

@ -106,14 +106,14 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
return ApplicationController.Instance.Tasks.Execute(
"Subtract".Localize(),
null,
(reporter, cancellationToken) =>
(reporter, cancellationTokenSource) =>
{
var progressStatus = new ProgressStatus();
reporter.Report(progressStatus);
try
{
Subtract(cancellationToken, reporter);
Subtract(cancellationTokenSource.Token, reporter);
}
catch
{
@ -133,6 +133,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
UiThread.RunOnIdle(() =>
{
rebuildLocks.Dispose();
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children));
});

View file

@ -78,7 +78,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
await ApplicationController.Instance.Tasks.Execute(
"Ungroup".Localize(),
null,
(reporter, cancellationToken) =>
(reporter, cancellationTokenSource) =>
{
var progressStatus = new ProgressStatus();
reporter.Report(progressStatus);
@ -90,16 +90,16 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
// try to cut it up into multiple meshes
progressStatus.Status = "Split".Localize();
var cleanMesh = selectedItem.Mesh.Copy(cancellationToken);
var cleanMesh = selectedItem.Mesh.Copy(cancellationTokenSource.Token);
cleanMesh.MergeVertices(.01);
var discreetMeshes = CreateDiscreteMeshes.SplitVolumesIntoMeshes(cleanMesh, cancellationToken, (double progress0To1, string processingState) =>
var discreetMeshes = CreateDiscreteMeshes.SplitVolumesIntoMeshes(cleanMesh, cancellationTokenSource.Token, (double progress0To1, string processingState) =>
{
progressStatus.Progress0To1 = .5 + progress0To1 * .5;
progressStatus.Status = processingState;
reporter.Report(progressStatus);
});
if (cancellationToken.IsCancellationRequested)
if (cancellationTokenSource.IsCancellationRequested)
{
return Task.CompletedTask;
}

@ -1 +1 @@
Subproject commit 17fb182f8ef221a9fbe94eb831cef9956c6c1ba6
Subproject commit dc55feeb1e043b0772aa2c21b4d6947e1cccc14f

@ -1 +1 @@
Subproject commit e996ffa5eb793d8b7e4d832b9d1b33e08bf0c152
Subproject commit 8c801ba65845521e2a0e13a00f318952caa80336