mirror of
https://github.com/riegera2412/UVtools.git
synced 2026-07-11 19:12:31 +02:00
9c9540646c
* (Improvement) Cache per layer and global used material for faster calculations * (Improvement) Better internal PrintTime management * **(Improvement) GUI:** * Show per layer used material percentage compared to the rest model * Show total of millimeters cured per layer if available * Show bounds and ROI in millimeters if available * Show display width and height below resolution if available * Don't split (Actions / Refresh / Save) region when resize window and keep those fixed * **(Improvement) Calibrate - Grayscale:** * Add a option to convert brightness to exposure time on divisions text * Adjust text position to be better centered and near from the center within divisions * (Fix) Calculate the used material with global layer height instead of calculate height from layer difference which lead to wrong values in parallel computation * (Fix) Converting files were not setting the new file as parent for the layer manager, this affected auto convertions from SL1 and lead to crashes and bad calculations if file were not reloaded from the disk (#150, #151) * (Fix) PositionZ rounding error when removing layers
121 lines
3.7 KiB
C#
121 lines
3.7 KiB
C#
/*
|
|
* GNU AFFERO GENERAL PUBLIC LICENSE
|
|
* Version 3, 19 November 2007
|
|
* Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
|
* Everyone is permitted to copy and distribute verbatim copies
|
|
* of this license document, but changing it is not allowed.
|
|
*/
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using Emgu.CV;
|
|
using UVtools.Core.FileFormats;
|
|
|
|
namespace UVtools.Core.Operations
|
|
{
|
|
[Serializable]
|
|
public sealed class OperationLayerRemove : Operation
|
|
{
|
|
#region Overrides
|
|
|
|
public override Enumerations.LayerRangeSelection StartLayerRangeSelection => Enumerations.LayerRangeSelection.Current;
|
|
public override bool CanROI => false;
|
|
public override bool PassActualLayerIndex => true;
|
|
|
|
public override string Title => "Remove layers";
|
|
|
|
public override string Description =>
|
|
"Remove Layers in a given range.";
|
|
|
|
public override string ConfirmationText =>
|
|
$"remove layers {LayerIndexStart} through {LayerIndexEnd}?";
|
|
|
|
public override string ProgressTitle =>
|
|
$"Removing layers {LayerIndexStart} through {LayerIndexEnd}";
|
|
|
|
public override string ProgressAction => "Removed layers";
|
|
|
|
public override bool CanCancel => false;
|
|
|
|
public override bool CanHaveProfiles => false;
|
|
|
|
#endregion
|
|
|
|
#region Properties
|
|
|
|
|
|
#endregion
|
|
|
|
#region Constructor
|
|
|
|
public OperationLayerRemove() { }
|
|
|
|
public OperationLayerRemove(FileFormat slicerFile) : base(slicerFile) { }
|
|
|
|
#endregion
|
|
|
|
#region Methods
|
|
|
|
protected override bool ExecuteInternally(OperationProgress progress)
|
|
{
|
|
progress.CanCancel = false;
|
|
var layersRemove = new List<uint>();
|
|
for (uint layerIndex = LayerIndexStart; layerIndex <= LayerIndexEnd; layerIndex++)
|
|
{
|
|
layersRemove.Add(layerIndex);
|
|
}
|
|
|
|
return RemoveLayers(SlicerFile, layersRemove, progress);
|
|
}
|
|
|
|
public static bool RemoveLayers(FileFormat slicerFile, List<uint> layersRemove, OperationProgress progress = null)
|
|
{
|
|
if (layersRemove.Count == 0) return false;
|
|
|
|
progress ??= new OperationProgress(false);
|
|
|
|
progress.Reset("removed layers", (uint)layersRemove.Count);
|
|
|
|
var oldLayers = slicerFile.LayerManager.Layers;
|
|
var layerHeight = slicerFile.LayerHeight;
|
|
|
|
var layers = new Layer[oldLayers.Length - layersRemove.Count];
|
|
|
|
// Re-set
|
|
uint newLayerIndex = 0;
|
|
for (uint layerIndex = 0; layerIndex < oldLayers.Length; layerIndex++)
|
|
{
|
|
if (layersRemove.Contains(layerIndex)) continue;
|
|
layers[newLayerIndex] = oldLayers[layerIndex];
|
|
layers[newLayerIndex].Index = newLayerIndex;
|
|
|
|
// Re-Z
|
|
float posZ = layerHeight;
|
|
if (newLayerIndex > 0)
|
|
{
|
|
if (oldLayers[layerIndex - 1].PositionZ == oldLayers[layerIndex].PositionZ)
|
|
{
|
|
posZ = layers[newLayerIndex - 1].PositionZ;
|
|
}
|
|
else
|
|
{
|
|
posZ = (float) Math.Round(layers[newLayerIndex - 1].PositionZ + layerHeight, 2);
|
|
}
|
|
}
|
|
|
|
layers[newLayerIndex].PositionZ = posZ;
|
|
layers[newLayerIndex].IsModified = true;
|
|
|
|
newLayerIndex++;
|
|
progress++;
|
|
}
|
|
|
|
slicerFile.LayerManager.Layers = layers;
|
|
|
|
return true;
|
|
}
|
|
#endregion
|
|
}
|
|
}
|