* (Add) Shortcut "ESC" under Islands list view to deselect all items
* (Add) Shortcut "CTRL+A" under Islands list view to select all items
* (Add) Shortcut "*" under Islands list view to invert selection
* (Add) Shortcut "CTRL+F" to go to a layer number
* (Change) Layer image is now a RGB image for better manipulation and draws
* (Change) Layer difference now shows previous and next layers (only pixels not present on current layer) were previous are pink and next are cyan, if a pixel are present in both layers a red pixel will be painted.
* (Fix) Save modified layers on .cbddlp and .cbt corrupts the file to print when Anti-Aliasing is used (> 1)
* (Fix) cbdlp layer encoding
This commit is contained in:
Tiago Conceição
2020-06-05 22:35:35 +01:00
parent e5dd60b3cf
commit 7788fffa9f
13 changed files with 2409 additions and 137 deletions
+11
View File
@@ -1,5 +1,16 @@
# Changelog
## 05/06/2020 - v0.4.2.2 - Beta
* (Add) Shortcut "ESC" under Islands list view to deselect all items
* (Add) Shortcut "CTRL+A" under Islands list view to select all items
* (Add) Shortcut "*" under Islands list view to invert selection
* (Add) Shortcut "CTRL+F" to go to a layer number
* (Change) Layer image is now a RGB image for better manipulation and draws
* (Change) Layer difference now shows previous and next layers (only pixels not present on current layer) were previous are pink and next are cyan, if a pixel are present in both layers a red pixel will be painted.
* (Fix) Save modified layers on .cbddlp and .cbt corrupts the file to print when Anti-Aliasing is used (> 1)
* (Fix) cbdlp layer encoding
## 04/06/2020 - v0.4.2.1 - Beta
* (Add) PrusaSlicer Printer "AnyCubic Photon"
+89 -31
View File
@@ -713,39 +713,48 @@ namespace PrusaSL1Reader
HeaderSettings.LayersDefinitionOffsetAddress = currentOffset;
uint layerDataCurrentOffset = currentOffset + (uint) Helpers.Serializer.SizeOf(new LayerData()) * HeaderSettings.LayerCount * HeaderSettings.AntiAliasLevel;
for (uint layerIndex = 0; layerIndex < LayerCount; layerIndex++)
for (byte aaIndex = 0; aaIndex < HeaderSettings.AntiAliasLevel; aaIndex++)
{
LayerData layerData = new LayerData();
LayerData layerDataHash = null;
var image = this[layerIndex].Image;
rawData = IsCbtFile ? EncodeCbtImage(image, layerIndex) : EncodeCbddlpImage(image);
var byteArr = rawData.ToArray();
if (HeaderSettings.EncryptionKey == 0)
for (uint layerIndex = 0; layerIndex < LayerCount; layerIndex++)
{
string hash = Helpers.ComputeSHA1Hash(byteArr);
if (!LayersHash.TryGetValue(hash, out layerDataHash))
LayerData layerData = new LayerData();
LayerData layerDataHash = null;
var image = this[layerIndex].Image;
rawData = IsCbtFile ? EncodeCbtImage(image, layerIndex) : EncodeCbddlpImage(image, aaIndex);
var byteArr = rawData.ToArray();
if (HeaderSettings.EncryptionKey == 0)
{
LayersHash.Add(hash, layerData);
string hash = Helpers.ComputeSHA1Hash(byteArr);
if (!LayersHash.TryGetValue(hash, out layerDataHash))
{
LayersHash.Add(hash, layerData);
}
}
//layer.DataAddress = CurrentOffset + (uint)Helpers.Serializer.SizeOf(layer);
layerData.DataAddress = layerDataHash?.DataAddress ?? layerDataCurrentOffset;
layerData.DataSize = layerDataHash?.DataSize ?? (uint) byteArr.Length;
layerData.LayerPositionZ = layerIndex * HeaderSettings.LayerHeightMilimeter;
layerData.LayerOffTimeSeconds = layerIndex < HeaderSettings.BottomLayersCount
? PrintParametersSettings.BottomLightOffDelay
: PrintParametersSettings.LightOffDelay;
layerData.LayerExposure = layerIndex < HeaderSettings.BottomLayersCount
? HeaderSettings.BottomExposureSeconds
: HeaderSettings.LayerExposureSeconds;
LayersDefinitions[layerIndex, aaIndex] = layerData;
currentOffset += Helpers.SerializeWriteFileStream(outputFile, layerData);
if (!ReferenceEquals(layerDataHash, null)) continue;
outputFile.Seek(layerDataCurrentOffset, SeekOrigin.Begin);
layerDataCurrentOffset += Helpers.WriteFileStream(outputFile, byteArr);
outputFile.Seek(currentOffset, SeekOrigin.Begin);
}
//layer.DataAddress = CurrentOffset + (uint)Helpers.Serializer.SizeOf(layer);
layerData.DataAddress = layerDataHash?.DataAddress ?? layerDataCurrentOffset;
layerData.DataSize = layerDataHash?.DataSize ?? (uint)byteArr.Length;
layerData.LayerPositionZ = layerIndex * HeaderSettings.LayerHeightMilimeter;
layerData.LayerOffTimeSeconds = layerIndex < HeaderSettings.BottomLayersCount ? PrintParametersSettings.BottomLightOffDelay : PrintParametersSettings.LightOffDelay;
layerData.LayerExposure = layerIndex < HeaderSettings.BottomLayersCount ? HeaderSettings.BottomExposureSeconds : HeaderSettings.LayerExposureSeconds;
LayersDefinitions[layerIndex, 0] = layerData;
currentOffset += Helpers.SerializeWriteFileStream(outputFile, layerData);
if (!ReferenceEquals(layerDataHash, null)) continue;
outputFile.Seek(layerDataCurrentOffset, SeekOrigin.Begin);
layerDataCurrentOffset += Helpers.WriteFileStream(outputFile, byteArr);
outputFile.Seek(currentOffset, SeekOrigin.Begin);
}
outputFile.Seek(0, SeekOrigin.Begin);
@@ -764,11 +773,60 @@ namespace PrusaSL1Reader
}
}
private List<byte> EncodeCbddlpImage(Image<L8> image)
private List<byte> EncodeCbddlpImage(Image<L8> image, byte aalevel)
{
List<byte> rawData = new List<byte>();
byte color;
bool obit = false;
int rep = 0;
void AddRep()
{
if (rep <= 0) return;
byte by = (byte) rep;
if (obit)
{
by |= 0x80;
//bitsOn += uint(rep)
}
rawData.Add(by);
}
for (int y = 0; y < image.Height; y++)
{
Span<L8> pixelRowSpan = image.GetPixelRowSpan(y);
for (int x = 0; x < image.Width; x++)
{
//ngrey:= uint16(r | g | b)
var nbit = (pixelRowSpan[x].PackedValue & (1 << (int)(8 - HeaderSettings.AntiAliasLevel + aalevel))) != 0;
if (nbit == obit)
{
rep++;
if (rep == RLE8EncodingLimit)
{
AddRep();
rep = 0;
}
}
else
{
AddRep();
obit = nbit;
rep = 1;
}
}
}
// Collect stragglers
AddRep();
/*byte color;
byte black = 0;
byte white = 1;
@@ -796,7 +854,7 @@ namespace PrusaSL1Reader
nrOfColor = 1;
}
}
}
}*/
return rawData;
}
+1 -1
View File
@@ -28,7 +28,7 @@ namespace PrusaSL1Reader
public static class Helpers
{
public static PngEncoder PngEncoder { get; } = new PngEncoder();
public static BmpEncoder BmpEncoder { get; } = new BmpEncoder();
public static BmpEncoder BmpEncoder { get; } = new BmpEncoder{SupportTransparency = true, BitsPerPixel = BmpBitsPerPixel.Pixel32};
/// <summary>
/// Gets the <see cref="BinarySerializer"/> instance
/// </summary>
+5
View File
@@ -123,6 +123,11 @@ namespace PrusaSL1Reader
}
}
/// <summary>
/// Gets a new RGBA image instance
/// </summary>
public Image<Rgba32> ImageRbga32 => Image.CloneAs<Rgba32>();
#endregion
#region Constructor
+3 -3
View File
@@ -7,9 +7,9 @@
<PackageProjectUrl>https://github.com/sn4k3/PrusaSL1Viewer</PackageProjectUrl>
<PackageIcon></PackageIcon>
<RepositoryUrl>https://github.com/sn4k3/PrusaSL1Viewer</RepositoryUrl>
<AssemblyVersion>0.4.2.1</AssemblyVersion>
<FileVersion>0.4.2.1</FileVersion>
<Version>0.4.2.1</Version>
<AssemblyVersion>0.4.2.2</AssemblyVersion>
<FileVersion>0.4.2.2</FileVersion>
<Version>0.4.2.2</Version>
<Description>Open, view, edit, extract and convert DLP/SLA files generated from Slicers</Description>
</PropertyGroup>
+13 -11
View File
@@ -28,10 +28,11 @@
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmInputBox));
this.lbDescription = new System.Windows.Forms.Label();
this.lbCurrentValue = new System.Windows.Forms.Label();
this.tbCurrentValue = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.lbNewValue = new System.Windows.Forms.Label();
this.numNewValue = new System.Windows.Forms.NumericUpDown();
this.btnModify = new System.Windows.Forms.Button();
this.btnCancel = new System.Windows.Forms.Button();
@@ -73,15 +74,15 @@
this.tbCurrentValue.Size = new System.Drawing.Size(376, 26);
this.tbCurrentValue.TabIndex = 2;
//
// label1
// lbNewValue
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(13, 189);
this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(89, 20);
this.label1.TabIndex = 3;
this.label1.Text = "New Value:";
this.lbNewValue.AutoSize = true;
this.lbNewValue.Location = new System.Drawing.Point(13, 189);
this.lbNewValue.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.lbNewValue.Name = "lbNewValue";
this.lbNewValue.Size = new System.Drawing.Size(89, 20);
this.lbNewValue.TabIndex = 3;
this.lbNewValue.Text = "New Value:";
//
// numNewValue
//
@@ -136,12 +137,13 @@
this.Controls.Add(this.btnModify);
this.Controls.Add(this.btnCancel);
this.Controls.Add(this.numNewValue);
this.Controls.Add(this.label1);
this.Controls.Add(this.lbNewValue);
this.Controls.Add(this.tbCurrentValue);
this.Controls.Add(this.lbCurrentValue);
this.Controls.Add(this.lbDescription);
this.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.KeyPreview = true;
this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.MaximizeBox = false;
@@ -161,7 +163,7 @@
private System.Windows.Forms.Label lbDescription;
private System.Windows.Forms.Label lbCurrentValue;
private System.Windows.Forms.TextBox tbCurrentValue;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label lbNewValue;
private System.Windows.Forms.NumericUpDown numNewValue;
private System.Windows.Forms.Button btnCancel;
private System.Windows.Forms.Button btnModify;
+6 -3
View File
@@ -50,17 +50,20 @@ namespace PrusaSL1Viewer
}
public FrmInputBox(FileFormat.PrintParameterModifier modifier, decimal currentValue) : this(modifier.Name,
modifier.Description, currentValue, modifier.ValueUnit, modifier.Minimum, modifier.Maximum)
public FrmInputBox(FileFormat.PrintParameterModifier modifier, decimal currentValue, byte decimals = 2) : this(modifier.Name,
modifier.Description, currentValue, modifier.ValueUnit, modifier.Minimum, modifier.Maximum, decimals)
{ }
public FrmInputBox(string title, string description, decimal currentValue, string valueUnit = null, decimal minValue = 0, decimal maxValue = 100) : this()
public FrmInputBox(string title, string description, decimal currentValue, string valueUnit = null, decimal minValue = 0, decimal maxValue = 100, byte decimals = 2, string valueLabel = "Value") : this()
{
Text = title;
lbCurrentValue.Text = $"Current {valueLabel}";
lbNewValue.Text = $"New {valueLabel}";
Description = description;
ValueUint = valueUnit ?? string.Empty;
CurrentValue = currentValue;
numNewValue.Minimum = minValue;
numNewValue.Maximum = maxValue;
numNewValue.DecimalPlaces = decimals;
NewValue = currentValue;
}
#endregion
File diff suppressed because it is too large Load Diff
+1
View File
@@ -946,6 +946,7 @@
this.lvIslands.View = System.Windows.Forms.View.Details;
this.lvIslands.ItemActivate += new System.EventHandler(this.lvIslands_ItemActivate);
this.lvIslands.SelectedIndexChanged += new System.EventHandler(this.lvIslands_SelectedIndexChanged);
this.lvIslands.KeyUp += new System.Windows.Forms.KeyEventHandler(this.EventKeyUp);
//
// columnHeader1
//
+167 -54
View File
@@ -93,7 +93,7 @@ namespace PrusaSL1Viewer
set => Program.SlicerFile = value;
}
public uint ActualLayer => (uint)(sbLayers.Maximum - sbLayers.Value);
public uint ActualLayer { get; set; }
public Image<L8> ActualLayerImage { get; private set; }
@@ -142,18 +142,39 @@ namespace PrusaSL1Viewer
{
base.OnKeyUp(e);
if (e.KeyCode == Keys.R && e.Control)
if (ReferenceEquals(SlicerFile, null))
{
tsLayerImageRotate.PerformClick();
e.Handled = true;
return;
}
if ((e.KeyCode == Keys.NumPad0 || e.KeyCode == Keys.D0) && e.Control)
if (e.Control)
{
pbLayer.ZoomToFit();
e.Handled = true;
return;
if (e.KeyCode == Keys.F)
{
using (FrmInputBox inputBox = new FrmInputBox("Go to layer", "Select a layer index to go to.", ActualLayer, null, 0, SlicerFile.LayerCount-1, 0, "Layer"))
{
if (inputBox.ShowDialog() == DialogResult.OK)
{
ShowLayer((uint)inputBox.NewValue);
}
}
e.Handled = true;
return;
}
if (e.KeyCode == Keys.R)
{
tsLayerImageRotate.PerformClick();
e.Handled = true;
return;
}
if (e.KeyCode == Keys.NumPad0 || e.KeyCode == Keys.D0)
{
pbLayer.ZoomToFit();
e.Handled = true;
return;
}
}
}
@@ -488,7 +509,7 @@ namespace PrusaSL1Viewer
FrmLoading.ShowDialog();
ShowLayer(ActualLayer);
ShowLayer();
ComputeIslands();
@@ -825,7 +846,7 @@ namespace PrusaSL1Viewer
***********************/
if (ReferenceEquals(sender, tsLayerImageRotate) || ReferenceEquals(sender, tsLayerImageLayerDifference) || ReferenceEquals(sender, tsLayerImageHighlightIslands) || ReferenceEquals(sender, tsLayerImageLayerOutline))
{
sbLayers_ValueChanged(sbLayers, null);
ShowLayer();
return;
}
@@ -861,7 +882,8 @@ namespace PrusaSL1Viewer
private void sbLayers_ValueChanged(object sender, EventArgs e)
{
ShowLayer(ActualLayer);
ActualLayer = (uint) (sbLayers.Maximum - sbLayers.Value);
ShowLayer();
}
private void ConvertToItemOnClick(object sender, EventArgs e)
@@ -905,10 +927,10 @@ namespace PrusaSL1Viewer
});
FrmLoading.ShowDialog();
if (task.Result)
{
if (MessageBox.Show($"Convertion is completed: {Path.GetFileName(dialog.FileName)} in {FrmLoading.StopWatch.ElapsedMilliseconds/1000}s\n" +
if (MessageBox.Show($"Convertion is completed: {Path.GetFileName(dialog.FileName)} in {FrmLoading.StopWatch.ElapsedMilliseconds / 1000}s\n" +
"Do you want open the converted file in a new window?",
"Convertion completed", MessageBoxButtons.YesNo,
MessageBoxIcon.Information) == DialogResult.Yes)
@@ -924,7 +946,7 @@ namespace PrusaSL1Viewer
}
}
private void pbLayer_Zoomed(object sender, Cyotek.Windows.Forms.ImageBoxZoomEventArgs e)
{
tsLayerImageZoom.Text = $"Zoom: {e.NewZoom}% ({e.NewZoom/100f}x)";
@@ -1350,9 +1372,25 @@ namespace PrusaSL1Viewer
AddStatusBarItem(nameof(SlicerFile.MachineName), SlicerFile.MachineName);
}
/// <summary>
/// Reshow current layer
/// </summary>
void ShowLayer() => ShowLayer(ActualLayer);
/// <summary>
/// Shows a layer number
/// </summary>
/// <param name="layerNum">Layer number</param>
void ShowLayer(uint layerNum)
{
if (ReferenceEquals(SlicerFile, null)) return;
int layerOnSlider = (int)(SlicerFile.LayerCount - layerNum - 1);
if (sbLayers.Value != layerOnSlider)
{
sbLayers.Value = layerOnSlider;
return;
}
try
{
// OLD
@@ -1363,31 +1401,78 @@ namespace PrusaSL1Viewer
Stopwatch watch = Stopwatch.StartNew();
var image = SlicerFile[layerNum].Image;
ActualLayerImage = image.Clone();
ActualLayerImage = SlicerFile[layerNum].Image;
//ActualLayerImage = image;
var imageRgba = ActualLayerImage.CloneAs<Rgba32>();
if (tsLayerImageLayerOutline.Checked)
{
Image<Gray, byte> grayscale = image.ToEmguImage();
Image<Gray, byte> grayscale = ActualLayerImage.ToEmguImage();
grayscale = grayscale.Canny(100, 200, 3, true);
image = grayscale.ToImageSharpL8();
imageRgba = grayscale.ToImageSharpL8().CloneAs<Rgba32>();
grayscale.Dispose();
/*imageRgba.Mutate(imgMaskIn =>
{
imgMaskIn.DetectEdges();
});*/
}
else if (tsLayerImageLayerDifference.Checked)
{
if (layerNum > 0)
if (layerNum > 0 && layerNum < SlicerFile.LayerCount-1)
{
var previousImage = SlicerFile[layerNum-1].Image;
var nextImage = SlicerFile[layerNum+1].Image;
/*var newImage = new Image<Rgba32>(previousImage.Width, previousImage.Height);
Parallel.For(0, ActualLayerImage.Height, y => {
var newImageSpan = newImage.GetPixelRowSpan(y);
var previousImageSpan = previousImage.GetPixelRowSpan(y);
for (int x = 0; x < ActualLayerImage.Width; x++)
{
if (previousImageSpan[x].PackedValue == 0) continue;
newImageSpan[x] = new Rgba32(0, 0, previousImageSpan[x].PackedValue);
}
});
imageRgba.Mutate(imgMaskIn =>
{
imgMaskIn.DrawImage(newImage, PixelColorBlendingMode.Normal, 0.7f);
});*/
//var nextImage = SlicerFile.GetLayerImage(layerNum+1);
Parallel.For(0, image.Height, y => {
var imageSpan = image.GetPixelRowSpan(y);
Parallel.For(0, ActualLayerImage.Height, y => {
var imageSpan = imageRgba.GetPixelRowSpan(y);
var previousImageSpan = previousImage.GetPixelRowSpan(y);
for (int x = 0; x < image.Width; x++)
var nextImageSpan = nextImage.GetPixelRowSpan(y);
for (int x = 0; x < ActualLayerImage.Width; x++)
{
if (imageSpan[x].PackedValue == 0 || previousImageSpan[x].PackedValue == 0) continue;
imageSpan[x].PackedValue = (byte)(previousImageSpan[x].PackedValue / 2);
if (imageSpan[x].PackedValue == 4278190080)
{
if (previousImageSpan[x].PackedValue > 0 && nextImageSpan[x].PackedValue > 0)
{
imageSpan[x] = new Rgba32(255, 0, 0);
}
else if (previousImageSpan[x].PackedValue > 0)
{
imageSpan[x] = new Rgba32(previousImageSpan[x].PackedValue, 0, previousImageSpan[x].PackedValue);
}
else if (nextImageSpan[x].PackedValue > 0)
{
imageSpan[x] = new Rgba32(0, nextImageSpan[x].PackedValue, nextImageSpan[x].PackedValue);
}
}
/*else
{
if (previousImageSpan[x].PackedValue > 0 && nextImageSpan[x].PackedValue > 0)
{
imageSpan[x] = new Rgba32(225, 225, 225);
}
}*/
//if (previousImageSpan[x].PackedValue == 0) continue;
//imageSpan[x] = new Rgba32(0, 0, 255, 50);
}
});
@@ -1405,17 +1490,6 @@ namespace PrusaSL1Viewer
}
}
if (tsLayerImageRotate.Checked)
{
//watch.Restart();
image.Mutate(x => x.Rotate(RotateMode.Rotate90));
//Debug.Write($"/{watch.ElapsedMilliseconds}");
}
//watch.Restart();
var imageBmp = image.ToBitmap();
if (tsLayerImageHighlightIslands.Checked && !ReferenceEquals(Islands, null) && Islands.Count > ActualLayer)
{
var islands = Islands[ActualLayer];
@@ -1425,27 +1499,27 @@ namespace PrusaSL1Viewer
if (ReferenceEquals(island, null)) continue; // Removed islands
foreach (var pixel in island)
{
int x = pixel.X;
int y = pixel.Y;
if (tsLayerImageRotate.Checked)
{
x = ActualLayerImage.Height - 1 - pixel.Y;
y = pixel.X;
}
var alpha = ActualLayerImage[pixel.X, pixel.Y].PackedValue;
if (alpha == 0) continue;
// alpha, Color.Yellow
alpha = Math.Max((byte)70, alpha);
imageBmp.SetPixel(x, y, Color.FromArgb(alpha, alpha, 0));
imageRgba[pixel.X, pixel.Y] = new Rgba32(alpha, alpha, 0);
}
}
}
if (tsLayerImageRotate.Checked)
{
//watch.Restart();
imageRgba.Mutate(x => x.Rotate(RotateMode.Rotate90));
//Debug.Write($"/{watch.ElapsedMilliseconds}");
}
//watch.Restart();
var imageBmp = imageRgba.ToBitmap();
//imageBmp.MakeTransparent();
pbLayer.Image = imageBmp;
pbLayer.Image.Tag = image;
pbLayer.Image.Tag = imageRgba;
//Debug.WriteLine(watch.ElapsedMilliseconds);
//UniversalLayer layer = new UniversalLayer(image);
@@ -1506,9 +1580,51 @@ namespace PrusaSL1Viewer
{
scLeft.SplitterDistance = Math.Min(pbThumbnail.Image.Height + 5, 400);
}
private void lvIslands_SelectedIndexChanged(object sender, EventArgs e)
{
tsIslandsRemove.Enabled = lvIslands.SelectedIndices.Count > 0;
}
private void EventKeyUp(object sender, KeyEventArgs e)
{
if (ReferenceEquals(sender, lvIslands))
{
if (e.KeyCode == Keys.Escape)
{
foreach (ListViewItem item in lvIslands.Items)
{
item.Selected = false;
}
e.Handled = true;
return;
}
if (e.Control && e.KeyCode == Keys.A)
{
foreach (ListViewItem item in lvIslands.Items)
{
item.Selected = true;
}
e.Handled = true;
return;
}
if (e.KeyCode == Keys.Multiply)
{
foreach (ListViewItem item in lvIslands.Items)
{
item.Selected = !item.Selected;
}
e.Handled = true;
return;
}
return;
}
}
#endregion
void DrawPixel(bool isAdd, Point location)
{
@@ -1657,7 +1773,7 @@ namespace PrusaSL1Viewer
}
catch (Exception ex)
{
MessageBox.Show($"{ex.Message}\nPlease try diferent values for the mutation", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
MessageBox.Show($"{ex.Message}\nPlease try different values for the mutation", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
@@ -1672,7 +1788,7 @@ namespace PrusaSL1Viewer
FrmLoading.ShowDialog();
ShowLayer(ActualLayer);
ShowLayer();
menuFileSave.Enabled =
menuFileSaveAs.Enabled = true;
@@ -1774,9 +1890,6 @@ namespace PrusaSL1Viewer
UpdateIslandsInfo();
}
private void lvIslands_SelectedIndexChanged(object sender, EventArgs e)
{
tsIslandsRemove.Enabled = lvIslands.SelectedIndices.Count > 0;
}
}
}
+29 -32
View File
@@ -126,6 +126,12 @@
<metadata name="tsLayer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>201, 17</value>
</metadata>
<metadata name="tsThumbnails.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>291, 17</value>
</metadata>
<metadata name="tsProperties.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>649, 17</value>
</metadata>
<metadata name="tsGCode.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>551, 17</value>
</metadata>
@@ -140,61 +146,61 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAD2
DQAAAk1TRnQBSQFMAgEBBAEAAYABAgGAAQIBEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
DQAAAk1TRnQBSQFMAgEBBAEAAZgBAgGYAQIBEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
AwABIAMAAQEBAAEgBgABIP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AZgADUAGjA1IBqQNS
AakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1ABo1wAAxYBHgMjATMDIwEz
AyMBMwMjATMDGAEhAwIBAwwAA1UBtANZAccDLwFJAwABAQMbASYDHAEnAxwBJwMcAScDHAEnAxwBJwMc
AScDHAEnAxwBJwMcAScDHAEnAwIBAwQAA1IBqTAAA1IBqRAAAycBOgMwAUwDMAFMAzABTAMwAUwDMAFM
AzABTAMwAUwDMAFMAycBOhwAAwQBBgMjATMDUgGpAbMBUQEXAf8BsgFQARUB/wGyAU8BFQH/AbMBUAEW
AzABTAMwAUwDMAFMAycBOhwAAwQBBgMjATMDUgGpAbMBTgEUAf8BsgFNARIB/wGyAUwBEgH/AbMBTQET
Af8CWAFWAbkDKQE/AwQBBgsAAf8DAAH/A0MBdwMpAT4DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/
AwAB/wMAAf8DAAH/AwAB/wMyAVEEAANSAakEAANQAZ0DUwGqA1MBqgNTAaoDUwGqA1MBqgNTAaoDUAGd
DAADUgGpEAADTgH7AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DTgH7GAADBQEHAzABTAGz
AVABFgH/AdkBswGMAf8B9QHfAcUB/wH+Ae4B2AH/Af4B7gHYAf8B+gHnAc8B/wHZAbMBjAH/AbMBUAEV
AU0BEwH/AdkBswGMAf8B9QHfAcUB/wH+Ae4B2AH/Af4B7gHYAf8B+gHnAc8B/wHZAbMBjAH/AbMBTQES
Af8CMQEwAU0DAgEDBAADUQGiA1YBtgMqAUAEAAMQARUDEQEXAxEBFwMRARcDEQEXAxEBFwMRARcDEQEX
AxEBFwMRARcDEAEWCAADUgGpBAADUAGdA1MBqgNTAaoDHwEsHAADUgGpEwAB/wMAAf8DAAH/AwAB/wMA
Af8DAAH/AwAB/wMAAf8DAAH/AwAB/xgAAjEBMAFNAbcBgQEfAf8B6gHNAawB/wH6AeUBywH/AfgB4QHG
Af8B9gHgAcQB/wH2Ad8BxAH/AfcB4QHFAf8B+gHlAcsB/wHvAdUBtwH/AbMBUAEWAf8DIAEuBAADCgEO
Af8DAAH/AwAB/wMAAf8DAAH/AwAB/xgAAjEBMAFNAbcBgQEcAf8B6gHNAawB/wH6AeUBywH/AfgB4QHG
Af8B9gHgAcQB/wH2Ad8BxAH/AfcB4QHFAf8B+gHlAcsB/wHvAdUBtwH/AbMBTQETAf8DIAEuBAADCgEO
AxEBFwMAAQE4AANSAakwAANSAakTAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/
GAACagFEAfkB5QHHAaQB/wH3Ad8BwgH/AfMB2wG7Af8B8wHaAbsB/wHzAdsBvAH/AfMB2wG8Af8B8wHb
AbwB/wHzAdwBvQH/AfYB4QHDAf8B1QGvAYQB/wJYAVYBuQQAA1IB9AMAAf8DPgFsAw4BEwNCAXYDQwF3
A0MBdwNDAXcDQwF3A0MBdwNDAXcDQwF3A0MBdwNDAXcDQgF2AxQBGwQAA1IBqQMiATIDUgGpA1IBqQNS
AakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpAyIBMgNSAakTAAH/AwAB/wMAAf8DAAH/AwAB/wMA
Af8DAAH/AwAB/wMAAf8DAAH/GAABtAFSARgC/wHwAdwC/wHvAdwB/wH+AesB1wH/AfkB5AHKAf8B8QHW
AbQB/wHxAdYBswH/AfEB1gG0Af8B8QHWAbQB/wHyAdgBtgH/AfMB2QG3Af8BswFSARgB/wcAAf4DAAH/
Af8DAAH/AwAB/wMAAf8DAAH/GAABtAFPARUC/wHwAdwC/wHvAdwB/wH+AesB1wH/AfkB5AHKAf8B8QHW
AbQB/wHxAdYBswH/AfEB1gG0Af8B8QHWAbQB/wHyAdgBtgH/AfMB2QG3Af8BswFPARUB/wcAAf4DAAH/
A0MBdwMeASsDVwHFA1kBxwNZAccDWQHHA1kBxwNZAccDWQHHA1kBxwNZAccDWQHHA1gBxgMmATkEAANS
AakDNAFVAzQBVSAAAzQBVQM0AVUDUgGpEwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/
AwAB/xgAA0gBhQG4AYIBHwH/AccBlwE7Af8BzwGlAU0B/wHtAdIBtAH/Af0B6AHSAf8B7wHSAa0B/wHu
AdIBrAH/Ae4B0gGtAf8B7gHSAa0B/wH1AdwBvAH/AbMBUAEXAf8EAAMzAVMDPAFnAxQBHDgAA1IBqQM0
AwAB/xgAA0gBhQG4AYIBHAH/AccBlwE4Af8BzwGlAUoB/wHtAdIBtAH/Af0B6AHSAf8B7wHSAa0B/wHu
AdIBrAH/Ae4B0gGtAf8B7gHSAa0B/wH1AdwBvAH/AbMBTQEUAf8EAAMzAVMDPAFnAxQBHDgAA1IBqQM0
AVUDNAFVA0YBgANSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNFAX8DNAFVAzQBVQNSAakTAAH/AwAB/wMA
Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/EAADCgEOAyEBMQMjATMDIwEzAjEBMAFNAzMBUwGz
AU8BEgH/AeMBxQGiAf8B+QHjAckB/wHrAc4BpAH/AesBzgGmAf8B6wHOAaUB/wH3Ad8BwAH/AbMBUAEW
AUwBDwH/AeMBxQGiAf8B+QHjAckB/wHrAc4BpAH/AesBzgGmAf8B6wHOAaUB/wH3Ad8BwAH/AbMBTQET
Af8EAAMzAVMDPAFnAxQBHDgAA1IBqQM0AVUDNAFVAz8BbgMyAVAQAAMnATsDRAF8AzQBVQM0AVUDUgGp
EwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wwAAwoBDgM/AW0DXAH4AYUBiQGN
Af8BUgFVAYQB/wNfAfMDOgFiAwkBDAGzAU8BEgH/Ae0B0QG0Af8B6QHJAZ0B/wHpAckBnQH/AekByAGb
Af8B/AHoAdIB/wGzAVEBFwH/BwAB/gMAAf8DQwF3Ax8BLANXAcUDWQHHA1kBxwNZAccDWQHHA1kBxwNZ
Af8BTwFSAYQB/wNfAfMDOgFiAwkBDAGzAUwBDwH/Ae0B0QG0Af8B6QHJAZ0B/wHpAckBnQH/AekByAGb
Af8B/AHoAdIB/wGzAU4BFAH/BwAB/gMAAf8DQwF3Ax8BLANXAcUDWQHHA1kBxwNZAccDWQHHA1kBxwNZ
AccDWQHHA1kBxwNZAccDWAHGAyYBOQQAA1IBqQM0AVUDNAFVAwUBBwNVAbUDEQEXA1IBqQMpAT4EAANQ
AZ8DEQEXAzQBVQM0AVUDUgGpEwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wwA
Az4BawOAAf8C0gHRAf8B7wHuAe0B/wLvAe4B/wHSAdMB0gH/AVQBgAGBAf8DOgFgAzIBUAHQAacBUgH/
Az4BawOAAf8C0gHRAf8B7wHuAe0B/wLvAe4B/wHSAdMB0gH/AVEBgAGBAf8DOgFgAzIBUAHQAacBTwH/
AeoByQGcAf8B5AHDAZIB/wHyAdcBtQH/AdoBtgGQAf8CUwFSAagEAANSAfQDAAH/Az4BbAMOARMDQgF1
A0MBdwNDAXcDQwF3A0MBdwNDAXcDQwF3A0MBdwNDAXcDQwF3A0MBdwMUARsEAANSAakDNAFVAzQBVQQA
AzwBaANWAb4DIwE0A1UBtQMSARkDUQGgBAADNAFVAzQBVQNSAakTAAH/AwAB/wMAAf8DAAH/AwAB/wMA
Af8DAwH/AwgB/wMIAf8DXAHfDAADXAH4As0BzAH/AeMB4gHhAf8B3wHeAd0B/wHfAd4B3QH/AeMB4gHh
Af8DzAH/A2cB8gMZASMByAGYAT4B/wHzAdoBtwH/AfEB1gGyAf8B/gHtAdkB/wG3AYEBHgH/AwoBDQQA
Af8DAAH/AwUB/wMFAf8DXAHfDAADXAH4As0BzAH/AeMB4gHhAf8B3wHeAd0B/wHfAd4B3QH/AeMB4gHh
Af8DzAH/A2cB8gMZASMByAGYATsB/wHzAdoBtwH/AfEB1gGyAf8B/gHtAdkB/wG3AYEBGwH/AwoBDQQA
AwoBDgMRARcDAAEBOAADUgGpAzQBVQM0AVUDAAEBAy0BRgMKAQ4EAAM5AV8DXAHOAygBPAQAAzQBVQM0
AVUDUgGpEwAB/wOCAf8DHgH/AwgB/wMAAf8DAAH/AxIB/wMZAf8DXAHfAxcBIAwAA08B/wHjAeIB4QH/
AdcB1gHUAf8B1wHWAdQB/wHXAdYB1AH/AdcB1gHUAf8B4gHhAeAB/wGDAYgBjQH/BAABtwGAARsC/wHw
AdwB/wH6AeYBzgH/AcEBkAEyAf8DQAFuCAADUQGiA1YBtgMqAUAEAAMQARUDEQEXAxEBFwMRARcDEQEX
AVUDUgGpEwAB/wOCAf8DGwH/AwUB/wMAAf8DAAH/Aw8B/wMWAf8DXAHfAxcBIAwAA0wB/wHjAeIB4QH/
AdcB1gHUAf8B1wHWAdQB/wHXAdYB1AH/AdcB1gHUAf8B4gHhAeAB/wGDAYgBjQH/BAABtwGAARgC/wHw
AdwB/wH6AeYBzgH/AcEBkAEvAf8DQAFuCAADUQGiA1YBtgMqAUAEAAMQARUDEQEXAxEBFwMRARcDEQEX
AxEBFwMRARcDEQEXAxEBFwMRARcDEAEWCAADUgGpAzQBVQM0AVUDMwFTA1IBpgNKAYwHAAEBA0cBgwgA
AzQBVQM0AVUDUgGpEwAB/wOZAf8DhQH/AysB/wMAAf8DAAH/AxIB/wNcAd8DFwEgEAADTwH/AfIB8QHw
Af8BzwHNAcsB/wHQAc4BywH/AdABzgHLAf8BzwHNAcsB/wHyAvAB/wFTAYEBhQH/BAADNwFbAbQBUgEY
Af8BtAFSARcB/wNAAW8PAAH/AwAB/wNDAXcDKQE+AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA
AzQBVQM0AVUDUgGpEwAB/wOZAf8DhQH/AygB/wMAAf8DAAH/Aw8B/wNcAd8DFwEgEAADTAH/AfIB8QHw
Af8BzwHNAcsB/wHQAc4BywH/AdABzgHLAf8BzwHNAcsB/wHyAvAB/wFQAYEBhQH/BAADNwFbAbQBTwEV
Af8BtAFPARQB/wNAAW8PAAH/AwAB/wNDAXcDKQE+AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA
Af8DAAH/AwAB/wMAAf8DMgFRBAADUgGpAzQBVQM0AVUDEQEXA1ABngMkATYUAAM0AVUDNAFVA1IBqRAA
A1AB+wMKAf8DCgH/AwoB/wMAAf8DAAH/A1wB3wMXASAUAANiAfYB2wLaAf8B6AHnAeYB/wHRAc8BzgH/
A1AB+wMHAf8DBwH/AwcB/wMAAf8DAAH/A1wB3wMXASAUAANiAfYB2wLaAf8B6AHnAeYB/wHRAc8BzgH/
AdEBzwHOAf8B6AHnAeYB/wHbAtoB/wNiAfYgAANVAbQDWQHHAy8BSQMAAQEDGwEmAxwBJwMcAScDHAEn
AxwBJwMcAScDHAEnAxwBJwMcAScDHAEnAxwBJwMCAQMEAANSAakDIgEyA1IBqQNSAakDUgGpA1IBqQNS
AakDUgGpA1IBqQNSAakDUgGpA1IBqQMiATIDUgGpEAADIAEuAykBPwMpAT8DKQE/AykBPwMpAT8DEQEX
GAADLgFIA4AB/wHYAtcB/wH3AvYB/wH3AvYB/wHYAtcB/wOAAf8DLgFIZAADUAGjA1IBqQNSAakDUgGp
A1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1ABo0gAAy4BSANiAfYDTgH/A04B/wNi
A1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1ABo0gAAy4BSANiAfYDSwH/A0sB/wNi
AfYDLgFIJAABQgFNAT4HAAE+AwABKAMAAUADAAEgAwABAQEAAQEGAAEBFgAD/4EAAv8BgAEBAv8B/AEH
AgABvwH9AeABBwHwAQMCAAGgAR0B4AEHAeABAQEQAQEBoQH9AeABBwHgAQEBHwH/Ab8B/QHgAQcB4AEB
AgABgAEBAeABBwHgAQECAAGPAfEB4AEHAeABAQEfAf8BgAEBAeABBwGAAQEBHwH/AYMBwQHgAQcBAAEB
@@ -202,15 +208,6 @@
AgABgQHxAeABHwEAAf8CAAGAAQEB4AE/AQAD/wGAAQEC/wGBAf8L
</value>
</data>
<metadata name="tsThumbnails.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>291, 17</value>
</metadata>
<metadata name="tsProperties.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>649, 17</value>
</metadata>
<metadata name="tsGCode.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>551, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
+1
View File
@@ -21,6 +21,7 @@ namespace PrusaSL1Viewer
using (var memoryStream = new MemoryStream())
{
//var imageEncoder = image.GetConfiguration().ImageFormatsManager.FindEncoder(SixLabors.ImageSharp.Formats.Bmp.BmpFormat.Instance);
Helpers.BmpEncoder.SupportTransparency = true;
image.Save(memoryStream, Helpers.BmpEncoder);
//memoryStream.Seek(0, SeekOrigin.Begin);
+2 -2
View File
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("0.4.2.1")]
[assembly: AssemblyFileVersion("0.4.2.1")]
[assembly: AssemblyVersion("0.4.2.2")]
[assembly: AssemblyFileVersion("0.4.2.2")]