- (Fix) ZCode: lcd.gcode was blank / not generating when converting from any file format
- (Fix) Zcodex: Change MaterialId from `uint` to `string` (#223, #224)
- (Fix) CXDLP: Set the default printer name to `CL-89` when creating new instance, was `null` before
- (Fix) Some tools were unable to pull certain settings from profiles and imported settings:
   - Elephant foot
   - Exposure finder
   - Grayscale
   - Stress tower
   - Tolerance
   - XYZ Accuracy
   - Change resolution
   - Dynamic lifts
- (Change) `Layer repair` icon at Issues tab and `Outline` icon on preview toolbar (#227)
- (Developers) Created `UVtools.AvaloniaControls` project with `AdvancedImageBox` control for AvaloniaUI
This commit is contained in:
Tiago Conceição
2021-06-25 21:43:30 +01:00
parent 57c4825d16
commit 74b6335f64
39 changed files with 427 additions and 223 deletions
+17
View File
@@ -1,5 +1,22 @@
# Changelog
## 25/06/2021 - v2.13.4
- (Fix) ZCode: lcd.gcode was blank / not generating when converting from any file format
- (Fix) Zcodex: Change MaterialId from `uint` to `string` (#223, #224)
- (Fix) CXDLP: Set the default printer name to `CL-89` when creating new instance, was `null` before
- (Fix) Some tools were unable to pull certain settings from profiles and imported settings:
- Elephant foot
- Exposure finder
- Grayscale
- Stress tower
- Tolerance
- XYZ Accuracy
- Change resolution
- Dynamic lifts
- (Change) `Layer repair` icon at Issues tab and `Outline` icon on preview toolbar (#227)
- (Developers) Created `UVtools.AvaloniaControls` project with `AdvancedImageBox` control for AvaloniaUI
## 12/06/2021 - v2.13.3
- **File formats:**
+2
View File
@@ -5,6 +5,8 @@
// Authors: Julien Delnatte
//------------------------------------------------
BigEndian();
typedef struct {
BitfieldDisablePadding(); ushort startY:13; ushort endY:13; ushort x:14;
ubyte grey <fgcolor=cBlack, bgcolor=cWhite>;
+2
View File
@@ -10,6 +10,8 @@
// Add byte offset[64] after resolutionY (Zeros)
BigEndian();
typedef struct {
BitfieldDisablePadding(); ushort startY:13; ushort endY:13; ushort x:14;
ubyte grey <fgcolor=cBlack, bgcolor=cWhite>;
+2
View File
@@ -5,6 +5,8 @@
// Authors: Julien Delnatte
//------------------------------------------------
BigEndian();
typedef struct {
uint16 startY <fgcolor=cBlack, bgcolor=cWhite>;
uint16 endY <fgcolor=cBlack, bgcolor=cWhite>;
+74
View File
@@ -0,0 +1,74 @@
//------------------------------------------------
//--- 010 Editor v8.0.1 Binary Template
//
// File: Longer Orange 10, 30
// Authors: Tiago Conceição
//------------------------------------------------
LittleEndian();
typedef struct() {
uint32 DataSize <fgcolor=cBlack, bgcolor=cWhite>;
BYTE LayerRLE[DataSize] <fgcolor=cBlack, bgcolor=cRed>;
} layerData;
typedef struct(int size) {
BYTE layerDataBlock[size] <fgcolor=cBlack, bgcolor=0x00FF00>;
} rgbPreviewImageRawData;
struct HEADER {
char name[8] <fgcolor=cBlack, bgcolor=cWhite>;
uint32 Uint_08 <fgcolor=cBlack, bgcolor=cRed>;
uint32 Uint_0C <fgcolor=cBlack, bgcolor=cRed>;
uint32 Uint_10 <fgcolor=cBlack, bgcolor=cRed>;
uint32 Uint_14 <fgcolor=cBlack, bgcolor=cRed>;
uint32 Uint_18 <fgcolor=cBlack, bgcolor=cRed>;
float PixelPerMmX <fgcolor=cBlack, bgcolor=cRed>;
float PixelPerMmY <fgcolor=cBlack, bgcolor=cRed>;
float ResolutionX <fgcolor=cBlack, bgcolor=cRed>;
float ResolutionY <fgcolor=cBlack, bgcolor=cRed>;
float LayerHeight <fgcolor=cBlack, bgcolor=cRed>;
float ExposureTimeMs <fgcolor=cBlack, bgcolor=cRed>;
float BottomExposureTimeMs <fgcolor=cBlack, bgcolor=cRed>;
float Float_38 <fgcolor=cBlack, bgcolor=cRed>;
float LightOffDelayMs <fgcolor=cBlack, bgcolor=cRed>;
float BottomLightOffDelayMs <fgcolor=cBlack, bgcolor=cRed>;
float BottomHeight <fgcolor=cBlack, bgcolor=cRed>;
float Float_48 <fgcolor=cBlack, bgcolor=cRed>;
float BottomLiftHeight <fgcolor=cBlack, bgcolor=cRed>;
float LiftHeight <fgcolor=cBlack, bgcolor=cRed>;
float LiftSpeed <fgcolor=cBlack, bgcolor=cRed>;
float LiftSpeed_ <fgcolor=cBlack, bgcolor=cRed>;
float BottomLiftSpeed <fgcolor=cBlack, bgcolor=cRed>;
float BottomLiftSpeed_ <fgcolor=cBlack, bgcolor=cRed>;
float Float_64 <fgcolor=cBlack, bgcolor=cRed>;
float Float_68 <fgcolor=cBlack, bgcolor=cRed>;
float Float_6c <fgcolor=cBlack, bgcolor=cRed>;
float Float_70 <fgcolor=cBlack, bgcolor=cRed>;
float Float_74 <fgcolor=cBlack, bgcolor=cRed>;
float Float_78 <fgcolor=cBlack, bgcolor=cRed>;
float Float_7c <fgcolor=cBlack, bgcolor=cRed>;
float Float_80 <fgcolor=cBlack, bgcolor=cRed>;
float Float_84 <fgcolor=cBlack, bgcolor=cRed>;
float Float_88 <fgcolor=cBlack, bgcolor=cRed>;
float Float_8c <fgcolor=cBlack, bgcolor=cRed>;
float Float_90 <fgcolor=cBlack, bgcolor=cRed>;
float Float_94 <fgcolor=cBlack, bgcolor=cRed>;
uint32 Uint_98 <fgcolor=cBlack, bgcolor=cRed>;
uint32 Uint_9c <fgcolor=cBlack, bgcolor=cRed>;
uint32 Uint_a0 <fgcolor=cBlack, bgcolor=cRed>;
uint32 LayerCount <fgcolor=cBlack, bgcolor=cRed>;
uint32 Uint_a8 <fgcolor=cBlack, bgcolor=cRed>;
uint32 PreviewSizeX <fgcolor=cBlack, bgcolor=cRed>;
uint32 PreviewSizeY <fgcolor=cBlack, bgcolor=cRed>;
rgbPreviewImageRawData preview(PreviewSizeX*PreviewSizeY*2);
} header;
struct LAYERS {
local int i;
for( i = 0; i < header.LayerCount; i++ ){
layerData lD();
}
} layers;
+2
View File
@@ -5,6 +5,8 @@
// Authors: Julien Delnatte
//------------------------------------------------
BigEndian();
typedef struct {
uint16 startY <fgcolor=cBlack, bgcolor=cWhite>;
uint16 endY <fgcolor=cBlack, bgcolor=cWhite>;
+53
View File
@@ -0,0 +1,53 @@
//------------------------------------------------
//--- 010 Editor v8.0.1 Binary Template
//
// File: Anycubic PhotonS
// Authors: Tiago Conceição
//------------------------------------------------
BigEndian();
typedef struct() {
uint32 Unknown1 <fgcolor=cBlack, bgcolor=cWhite>; // 44944
uint32 Unknown2 <fgcolor=cBlack, bgcolor=cWhite>; // 0
uint32 Unknown3 <fgcolor=cBlack, bgcolor=cWhite>; // 0
uint32 ResolutionX <fgcolor=cBlack, bgcolor=cWhite>;
uint32 ResolutionY <fgcolor=cBlack, bgcolor=cWhite>;
uint32 DataSize <fgcolor=cBlack, bgcolor=cWhite>;
uint32 Unknown4 <fgcolor=cBlack, bgcolor=cWhite>; // 2684702720
BYTE LayerRLE[DataSize / 8 - 4] <fgcolor=cBlack, bgcolor=cRed>;
} layerData;
typedef struct(int size) {
BYTE layerDataBlock[size] <fgcolor=cBlack, bgcolor=0x00FF00>;
} rgbPreviewImageRawData;
struct HEADER {
uint32 Tag1 <fgcolor=cBlack, bgcolor=cRed>; // 2
uint16 Tag2 <fgcolor=cBlack, bgcolor=cRed>; // 49
double XYPixelSize <fgcolor=cBlack, bgcolor=cRed>;
double LayerHeight <fgcolor=cBlack, bgcolor=cRed>;
double ExposureSeconds <fgcolor=cBlack, bgcolor=cRed>;
double LightOffDelay <fgcolor=cBlack, bgcolor=cRed>;
double BottomExposureSeconds <fgcolor=cBlack, bgcolor=cRed>;
uint32 BottomLayerCount <fgcolor=cBlack, bgcolor=cRed>;
double LiftHeight <fgcolor=cBlack, bgcolor=cRed>; // mm
double LiftSpeed <fgcolor=cBlack, bgcolor=cRed>; // mm/s
double RetractSpeed <fgcolor=cBlack, bgcolor=cRed>; // mm/s
double VolumeMl <fgcolor=cBlack, bgcolor=cRed>; // ml
uint32 PreviewResolutionX <fgcolor=cBlack, bgcolor=cRed>;
uint32 Unknown1 <fgcolor=cBlack, bgcolor=cRed>; // 42
uint32 PreviewResolutionY <fgcolor=cBlack, bgcolor=cRed>;
uint32 Unknown2 <fgcolor=cBlack, bgcolor=cRed>; // 10
rgbPreviewImageRawData preview(PreviewResolutionX*PreviewResolutionY*2);
uint32 LayerCount <fgcolor=cBlack, bgcolor=cRed>;
} header;
struct LAYERS {
local int i;
for( i = 0; i < header.LayerCount; i++ ){
layerData lD();
}
} layers;
+13 -10
View File
@@ -509,13 +509,16 @@ namespace UVtools.Core.FileFormats
public CWSFile()
{
GCode.UseComments = true;
GCode.GCodePositioningType = GCodeBuilder.GCodePositioningTypes.Partial;
GCode.GCodeSpeedUnit = GCodeBuilder.GCodeSpeedUnits.MillimetersPerMinute;
GCode.GCodeTimeUnit = GCodeBuilder.GCodeTimeUnits.Milliseconds;
GCode.GCodeShowImageType = GCodeBuilder.GCodeShowImageTypes.LayerIndexZero;
GCode.CommandShowImageM6054.Reset(";<Slice>", "{0}");
GCode.CommandWaitG4.Reset(";<Delay>", "{0}");
GCode = new GCodeBuilder
{
UseComments = true,
GCodePositioningType = GCodeBuilder.GCodePositioningTypes.Partial,
GCodeSpeedUnit = GCodeBuilder.GCodeSpeedUnits.MillimetersPerMinute,
GCodeTimeUnit = GCodeBuilder.GCodeTimeUnits.Milliseconds,
GCodeShowImageType = GCodeBuilder.GCodeShowImageTypes.LayerIndexZero
};
GCode.CommandShowImageM6054.Set(";<Slice>", "{0}");
GCode.CommandWaitG4.Set(";<Delay>", "{0}");
}
#region Methods
@@ -647,7 +650,7 @@ namespace UVtools.Core.FileFormats
}
RebuildGCode();
outputFile.PutFileContent($"{filename}.gcode", GCode.ToString(), ZipArchiveMode.Create);
outputFile.PutFileContent($"{filename}.gcode", GCodeStr, ZipArchiveMode.Create);
}
protected override void DecodeInternally(string fileFullPath, OperationProgress progress)
@@ -839,7 +842,7 @@ namespace UVtools.Core.FileFormats
//GCode.Clear();
//GCode.AppendLine($"; {About.Website} {About.Software} {Assembly.GetExecutingAssembly().GetName().Version} {arch} {DateTime.Now}");
StringBuilder sb = new();
sb.AppendLine(";(****Build and Slicing Parameters ****)");
sb.AppendLine(";(**** Build and Slicing Parameters ****)");
foreach (var propertyInfo in OutputSettings.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
@@ -987,7 +990,7 @@ namespace UVtools.Core.FileFormats
break;
}
}
outputFile.PutFileContent($"{Path.GetFileNameWithoutExtension(FileFullPath)}.gcode", GCode.ToString(), ZipArchiveMode.Update);
outputFile.PutFileContent($"{Path.GetFileNameWithoutExtension(FileFullPath)}.gcode", GCodeStr, ZipArchiveMode.Update);
/*foreach (var layer in this)
{
+6 -2
View File
@@ -82,13 +82,17 @@ namespace UVtools.Core.FileFormats
[FieldOrder(4)]
[FieldLength(nameof(PrinterModelSize))]
public byte[] PrinterModelArray { get; set; }
public byte[] PrinterModelArray { get; set; } = { 0x43, 0x4C, 0x2D, 0x38, 0x39, 0x0 }; // CL-89
[Ignore]
public string PrinterModel
{
get => Encoding.ASCII.GetString(PrinterModelArray).TrimEnd(char.MinValue);
set => PrinterModelArray = Encoding.ASCII.GetBytes(value+char.MinValue);
set
{
PrinterModelArray = Encoding.ASCII.GetBytes(value + char.MinValue);
PrinterModelSize = (uint) PrinterModelArray.Length;
}
}
/// <summary>
+15 -9
View File
@@ -16,6 +16,7 @@ using System.Reflection;
using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Util;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using UVtools.Core.Extensions;
using UVtools.Core.GCode;
using UVtools.Core.Objects;
@@ -73,7 +74,7 @@ namespace UVtools.Core.FileFormats
#region Properties
public Header HeaderSettings { get; } = new Header();
public override FileFormatType FileType => FileFormatType.Archive;
public override FileExtension[] FileExtensions { get; } = {
@@ -325,16 +326,21 @@ namespace UVtools.Core.FileFormats
public override object[] Configs => new object[] { HeaderSettings };
public override bool SupportsGCode => base.SupportsGCode && !IsPHZZip;
public bool IsPHZZip;
#endregion
public ChituboxZipFile()
{
GCode.UseComments = true;
GCode.GCodePositioningType = GCodeBuilder.GCodePositioningTypes.Absolute;
GCode.GCodeSpeedUnit = GCodeBuilder.GCodeSpeedUnits.MillimetersPerMinute;
GCode.GCodeTimeUnit = GCodeBuilder.GCodeTimeUnits.Milliseconds;
GCode.GCodeShowImageType = GCodeBuilder.GCodeShowImageTypes.FilenameNonZeroPNG;
GCode = new GCodeBuilder
{
UseComments = true,
GCodePositioningType = GCodeBuilder.GCodePositioningTypes.Absolute,
GCodeSpeedUnit = GCodeBuilder.GCodeSpeedUnits.MillimetersPerMinute,
GCodeTimeUnit = GCodeBuilder.GCodeTimeUnits.Milliseconds,
GCodeShowImageType = GCodeBuilder.GCodeShowImageTypes.FilenameNonZeroPNG
};
}
#region Methods
@@ -372,7 +378,7 @@ namespace UVtools.Core.FileFormats
if (!IsPHZZip)
{
RebuildGCode();
outputFile.PutFileContent(GCodeFilename, GCode.ToString(), ZipArchiveMode.Create);
outputFile.PutFileContent(GCodeFilename, GCodeStr, ZipArchiveMode.Create);
}
for (uint layerIndex = 0; layerIndex < LayerCount; layerIndex++)
@@ -444,7 +450,7 @@ namespace UVtools.Core.FileFormats
progress.ItemCount = LayerCount;
var gcode = GCode?.ToString();
var gcode = GCodeStr;
float lastPostZ = LayerHeight;
for (uint layerIndex = 0; layerIndex < LayerCount; layerIndex++)
@@ -537,7 +543,7 @@ namespace UVtools.Core.FileFormats
if (!IsPHZZip)
{
outputFile.PutFileContent(GCodeFilename, GCode.ToString(), ZipArchiveMode.Update);
outputFile.PutFileContent(GCodeFilename, GCodeStr, ZipArchiveMode.Update);
}
}
+10 -5
View File
@@ -1175,7 +1175,7 @@ namespace UVtools.Core.FileFormats
/// <summary>
/// Gets the GCode, returns null if not supported
/// </summary>
public GCodeBuilder GCode { get; set; } = new();
public GCodeBuilder GCode { get; set; }
/// <summary>
/// Gets the GCode, returns null if not supported
@@ -1183,9 +1183,14 @@ namespace UVtools.Core.FileFormats
public string GCodeStr => GCode?.ToString();
/// <summary>
/// Gets if this file have available gcode
/// Gets if this file format supports gcode
/// </summary>
public bool HaveGCode => !GCode?.IsEmpty ?? false;
public virtual bool SupportsGCode => GCode is not null;
/// <summary>
/// Gets if this file have available gcode to read
/// </summary>
public bool HaveGCode => SupportsGCode && !GCode.IsEmpty;
/// <summary>
/// Get all configuration objects with properties and values
@@ -1301,7 +1306,7 @@ namespace UVtools.Core.FileFormats
{
FileFullPath = null;
LayerManager.Clear();
GCode.Clear();
GCode?.Clear();
if (Thumbnails is not null)
{
@@ -1984,7 +1989,7 @@ namespace UVtools.Core.FileFormats
/// </summary>
public virtual void RebuildGCode()
{
if (GCode.IsEmpty) return;
if (!SupportsGCode) return;
GCode.RebuildGCode(this);
}
-2
View File
@@ -6,8 +6,6 @@
* of this license document, but changing it is not allowed.
*/
// https://github.com/cbiffle/catibo/blob/master/doc/cbddlp-ctb.adoc
using System;
using System.Collections.Generic;
using System.Diagnostics;
+105 -106
View File
@@ -426,14 +426,17 @@ namespace UVtools.Core.FileFormats
#region Constructor
public ZCodeFile()
{
GCode.UseTailComma = true;
GCode.UseComments = false;
GCode.GCodePositioningType = GCodeBuilder.GCodePositioningTypes.Absolute;
GCode.GCodeSpeedUnit = GCodeBuilder.GCodeSpeedUnits.CentimetersPerMinute;
GCode.GCodeTimeUnit = GCodeBuilder.GCodeTimeUnits.Milliseconds;
GCode.GCodeShowImageType = GCodeBuilder.GCodeShowImageTypes.FilenameNonZeroPNG;
GCode.MaxLEDPower = MaxLEDPower;
GCode.CommandClearImage.Enabled = false;
GCode = new GCodeBuilder
{
UseTailComma = true,
UseComments = false,
GCodePositioningType = GCodeBuilder.GCodePositioningTypes.Absolute,
GCodeSpeedUnit = GCodeBuilder.GCodeSpeedUnits.CentimetersPerMinute,
GCodeTimeUnit = GCodeBuilder.GCodeTimeUnits.Milliseconds,
GCodeShowImageType = GCodeBuilder.GCodeShowImageTypes.FilenameNonZeroPNG,
MaxLEDPower = MaxLEDPower,
CommandClearImage = {Enabled = false}
};
}
#endregion
@@ -441,123 +444,119 @@ namespace UVtools.Core.FileFormats
protected override void EncodeInternally(string fileFullPath, OperationProgress progress)
{
using (ZipArchive outputFile = ZipFile.Open(fileFullPath, ZipArchiveMode.Create))
using ZipArchive outputFile = ZipFile.Open(fileFullPath, ZipArchiveMode.Create);
if (Thumbnails.Length > 0 && Thumbnails[0] is not null)
{
if (Thumbnails.Length > 0 && Thumbnails[0] is not null)
{
using var thumbnailsStream = outputFile.CreateEntry(PreviewFilename).Open();
using var vec = new VectorOfByte();
CvInvoke.Imencode(".png", Thumbnails[0], vec);
thumbnailsStream.WriteBytes(vec.ToArray());
thumbnailsStream.Close();
}
for (uint layerIndex = 0; layerIndex < LayerCount; layerIndex++)
{
progress.Token.ThrowIfCancellationRequested();
var layer = this[layerIndex];
outputFile.PutFileContent($"{layerIndex + 1}.png", layer.CompressedBytes, ZipArchiveMode.Create);
progress++;
}
XmlSerializer serializer = new(ManifestFile.GetType());
XmlSerializerNamespaces ns = new();
ns.Add("", "");
var entry = outputFile.CreateEntry(ManifestFilename);
using (var stream = entry.Open())
{
serializer.Serialize(stream, ManifestFile, ns);
}
outputFile.PutFileContent(GCodeFilename, EncryptGCode(progress), ZipArchiveMode.Create);
using var thumbnailsStream = outputFile.CreateEntry(PreviewFilename).Open();
using var vec = new VectorOfByte();
CvInvoke.Imencode(".png", Thumbnails[0], vec);
thumbnailsStream.WriteBytes(vec.ToArray());
thumbnailsStream.Close();
}
for (uint layerIndex = 0; layerIndex < LayerCount; layerIndex++)
{
progress.Token.ThrowIfCancellationRequested();
var layer = this[layerIndex];
outputFile.PutFileContent($"{layerIndex + 1}.png", layer.CompressedBytes, ZipArchiveMode.Create);
progress++;
}
XmlSerializer serializer = new(ManifestFile.GetType());
XmlSerializerNamespaces ns = new();
ns.Add("", "");
var entry = outputFile.CreateEntry(ManifestFilename);
using (var stream = entry.Open())
{
serializer.Serialize(stream, ManifestFile, ns);
}
outputFile.PutFileContent(GCodeFilename, EncryptGCode(progress), ZipArchiveMode.Create);
}
protected override void DecodeInternally(string fileFullPath, OperationProgress progress)
{
using (var inputFile = ZipFile.Open(FileFullPath, ZipArchiveMode.Read))
using var inputFile = ZipFile.Open(FileFullPath, ZipArchiveMode.Read);
var entry = inputFile.GetEntry(ManifestFilename);
if (entry is null)
{
var entry = inputFile.GetEntry(ManifestFilename);
if (entry is null)
{
Clear();
throw new FileLoadException($"{ManifestFilename} not found", fileFullPath);
}
Clear();
throw new FileLoadException($"{ManifestFilename} not found", fileFullPath);
}
try
{
var serializer = new XmlSerializer(ManifestFile.GetType());
using var stream = entry.Open();
ManifestFile = (ZCodePrint)serializer.Deserialize(stream);
}
catch (Exception e)
{
Clear();
throw new FileLoadException($"Unable to deserialize '{entry.Name}'\n{e}", fileFullPath);
}
try
{
var serializer = new XmlSerializer(ManifestFile.GetType());
using var stream = entry.Open();
ManifestFile = (ZCodePrint)serializer.Deserialize(stream);
}
catch (Exception e)
{
Clear();
throw new FileLoadException($"Unable to deserialize '{entry.Name}'\n{e}", fileFullPath);
}
entry = inputFile.GetEntry(GCodeFilename);
if (entry is null)
{
Clear();
throw new FileLoadException($"{GCodeFilename} not found", fileFullPath);
}
entry = inputFile.GetEntry(GCodeFilename);
if (entry is null)
{
Clear();
throw new FileLoadException($"{GCodeFilename} not found", fileFullPath);
}
var encryptEngine = new RsaEngine();
using var txtreader = new StringReader(GCodeRSAPublicKey);
var keyParameter = (AsymmetricKeyParameter)new PemReader(txtreader).ReadObject();
encryptEngine.Init(true, keyParameter);
var encryptEngine = new RsaEngine();
using var txtreader = new StringReader(GCodeRSAPublicKey);
var keyParameter = (AsymmetricKeyParameter)new PemReader(txtreader).ReadObject();
encryptEngine.Init(true, keyParameter);
using (TextReader tr = new StreamReader(entry.Open()))
using (TextReader tr = new StreamReader(entry.Open()))
{
string line;
progress.Reset("Decrypting GCode", (uint) (entry.Length / 88));
while ((line = tr.ReadLine()) != null)
{
string line;
progress.Reset("Decrypting GCode", (uint) (entry.Length / 88));
while ((line = tr.ReadLine()) != null)
{
if (string.IsNullOrEmpty(line)) continue;
if (!line.EndsWith("==")) continue;
if (string.IsNullOrEmpty(line)) continue;
if (!line.EndsWith("==")) continue;
byte[] data = System.Convert.FromBase64String(line);
var decodedBytes = encryptEngine.ProcessBlock(data, 0, data.Length);
decodedBytes = decodedBytes.Skip(2).SkipWhile(b => b == 255 || b == 0).ToArray();
GCode.AppendLine(Encoding.UTF8.GetString(decodedBytes));
byte[] data = System.Convert.FromBase64String(line);
var decodedBytes = encryptEngine.ProcessBlock(data, 0, data.Length);
decodedBytes = decodedBytes.Skip(2).SkipWhile(b => b is 255 or 0).ToArray();
GCode.AppendLine(Encoding.UTF8.GetString(decodedBytes));
progress++;
}
tr.Close();
}
LayerManager.Init(ManifestFile.Job.LayerCount);
progress.Reset(OperationProgress.StatusDecodeLayers, LayerCount);
//var gcode = GCode.ToString();
//float lastPostZ = LayerHeight;
for (uint layerIndex = 0; layerIndex < LayerCount; layerIndex++)
{
if (progress.Token.IsCancellationRequested) break;
entry = inputFile.GetEntry($"{layerIndex+1}.png");
if (entry is null)
{
Clear();
throw new FileLoadException($"Layer {layerIndex+1} not found", fileFullPath);
}
using var stream = entry.Open();
this[layerIndex] = new Layer(layerIndex, stream, LayerManager);
progress++;
}
GCode.ParseLayersFromGCode(this);
tr.Close();
}
entry = inputFile.GetEntry(PreviewFilename);
if (entry is not null)
LayerManager.Init(ManifestFile.Job.LayerCount);
progress.Reset(OperationProgress.StatusDecodeLayers, LayerCount);
//var gcode = GCode.ToString();
//float lastPostZ = LayerHeight;
for (uint layerIndex = 0; layerIndex < LayerCount; layerIndex++)
{
if (progress.Token.IsCancellationRequested) break;
entry = inputFile.GetEntry($"{layerIndex+1}.png");
if (entry is null)
{
Thumbnails[0] = new Mat();
CvInvoke.Imdecode(entry.Open().ToArray(), ImreadModes.AnyColor, Thumbnails[0]);
Clear();
throw new FileLoadException($"Layer {layerIndex+1} not found", fileFullPath);
}
using var stream = entry.Open();
this[layerIndex] = new Layer(layerIndex, stream, LayerManager);
progress++;
}
GCode.ParseLayersFromGCode(this);
entry = inputFile.GetEntry(PreviewFilename);
if (entry is not null)
{
Thumbnails[0] = new Mat();
CvInvoke.Imdecode(entry.Open().ToArray(), ImreadModes.AnyColor, Thumbnails[0]);
}
LayerManager.GetBoundingRectangle(progress);
@@ -619,7 +618,7 @@ namespace UVtools.Core.FileFormats
var keyParameter = (AsymmetricKeyParameter)new PemReader(txtreader).ReadObject();
encryptEngine.Init(true, keyParameter);
using StringReader sr = new(GCode.ToString());
using StringReader sr = new(GCodeStr);
string line;
while ((line = sr.ReadLine()) != null)
{
+13 -4
View File
@@ -50,7 +50,7 @@ namespace UVtools.Core.FileFormats
public string Guid { get; set; } = "07452AC2-7494-4576-BA60-BFEA8815F917";
public string Material { get; set; }
public uint MaterialId { get; set; }
public string MaterialId { get; set; }
public float LayerThickness { get; set; }
public uint PrintTime { get; set; }
public uint LayerTime { get; set; }
@@ -350,6 +350,15 @@ namespace UVtools.Core.FileFormats
public override object[] Configs => new[] {(object) ResinMetadataSettings, UserSettings, ZCodeMetadataSettings};
#endregion
#region Constructor
public ZCodexFile()
{
GCode = new();
}
#endregion
#region Methods
public override void Clear()
@@ -521,7 +530,7 @@ M106 S255
M106 S0
*/
var gcode = GCode.ToString();
var gcode = GCodeStr;
if (line.StartsWith(GCodeKeywordDelaySupportFull) || line.StartsWith(GCodeKeywordDelayModel))
{
@@ -594,7 +603,7 @@ M106 S0
public override void RebuildGCode()
{
var gcode = GCode.ToString();
var gcode = GCodeStr;
gcode = Regex.Replace(gcode, @"Z[+]?([0-9]*\.[0-9]+|[0-9]+) F[+]?([0-9]*\.[0-9]+|[0-9]+)",
$"Z{UserSettings.ZLiftDistance} F{UserSettings.ZLiftFeedRate}");
@@ -629,7 +638,7 @@ M106 S0
outputFile.PutFileContent("ResinMetadata", JsonConvert.SerializeObject(ResinMetadataSettings, Formatting.Indented), ZipArchiveMode.Update);
outputFile.PutFileContent("UserSettingsData", JsonConvert.SerializeObject(UserSettings, Formatting.Indented), ZipArchiveMode.Update);
outputFile.PutFileContent("ZCodeMetadata", JsonConvert.SerializeObject(ZCodeMetadataSettings, Formatting.Indented), ZipArchiveMode.Update);
outputFile.PutFileContent("ResinGCodeData", GCode.ToString(), ZipArchiveMode.Update);
outputFile.PutFileContent("ResinGCodeData", GCodeStr, ZipArchiveMode.Update);
}
//Decode(FileFullPath, progress);
+3 -3
View File
@@ -40,7 +40,7 @@ namespace UVtools.Core.GCode
Comment = comment;
}
public void Reset(string command, string arguments, string comment, bool enabled = true)
public void Set(string command, string arguments, string comment, bool enabled = true)
{
Enabled = enabled;
Command = command;
@@ -48,13 +48,13 @@ namespace UVtools.Core.GCode
Comment = comment;
}
public void Reset(string command, string arguments)
public void Set(string command, string arguments)
{
Command = command;
Arguments = arguments;
}
public void Reset(string command)
public void Set(string command)
{
Command = command;
}
@@ -26,12 +26,12 @@ namespace UVtools.Core.Operations
public sealed class OperationCalibrateElephantFoot : Operation
{
#region Members
private decimal _layerHeight = 0.05M;
private decimal _layerHeight;
private bool _syncLayers;
private ushort _bottomLayers = 10;
private ushort _normalLayers = 70;
private decimal _bottomExposure = 60;
private decimal _normalExposure = 12;
private ushort _bottomLayers;
private ushort _normalLayers;
private decimal _bottomExposure;
private decimal _normalExposure;
private decimal _partScale = 1;
private byte _margin = 30;
private bool _extrudeText = true;
@@ -364,10 +364,12 @@ namespace UVtools.Core.Operations
public override void InitWithSlicerFile()
{
base.InitWithSlicerFile();
_layerHeight = (decimal)SlicerFile.LayerHeight;
//_bottomLayers = slicerFile.BottomLayerCount;
_bottomExposure = (decimal)SlicerFile.BottomExposureTime;
_normalExposure = (decimal)SlicerFile.ExposureTime;
if(_layerHeight <= 0) _layerHeight = (decimal)SlicerFile.LayerHeight;
if(_bottomExposure <= 0) _bottomExposure = (decimal)SlicerFile.BottomExposureTime;
if(_normalExposure <= 0) _normalExposure = (decimal)SlicerFile.ExposureTime;
if (_bottomLayers <= 0) _bottomLayers = (ushort) Slicer.Slicer.MillimetersToLayers(1M, _layerHeight);
if (_normalLayers <= 0) _normalLayers = (ushort) Slicer.Slicer.MillimetersToLayers(3.5M, _layerHeight);
_mirrorOutput = SlicerFile.MirrorDisplay;
}
@@ -61,10 +61,10 @@ namespace UVtools.Core.Operations
#region Members
private decimal _displayWidth;
private decimal _displayHeight;
private decimal _layerHeight = 0.05M;
private ushort _bottomLayers = 3;
private decimal _bottomExposure = 60;
private decimal _normalExposure = 12;
private decimal _layerHeight;
private ushort _bottomLayers;
private decimal _bottomExposure;
private decimal _normalExposure;
private decimal _topBottomMargin = 5;
private decimal _leftRightMargin = 10;
private byte _chamferLayers = 0;
@@ -960,10 +960,7 @@ namespace UVtools.Core.Operations
public override void InitWithSlicerFile()
{
base.InitWithSlicerFile();
_layerHeight = (decimal)SlicerFile.LayerHeight;
_bottomLayers = SlicerFile.BottomLayerCount;
_bottomExposure = (decimal)SlicerFile.BottomExposureTime;
_normalExposure = (decimal)SlicerFile.ExposureTime;
_mirrorOutput = SlicerFile.MirrorDisplay;
if (SlicerFile.DisplayWidth > 0)
@@ -971,14 +968,17 @@ namespace UVtools.Core.Operations
if (SlicerFile.DisplayHeight > 0)
DisplayHeight = (decimal)SlicerFile.DisplayHeight;
if(_layerHeight <= 0) _layerHeight = (decimal)SlicerFile.LayerHeight;
if(_bottomLayers <= 0) _bottomLayers = SlicerFile.BottomLayerCount;
if(_bottomExposure <= 0) _bottomExposure = (decimal)SlicerFile.BottomExposureTime;
if(_normalExposure <= 0) _normalExposure = (decimal)SlicerFile.ExposureTime;
if (_exposureGenManualBottom == 0)
_exposureGenManualBottom = (decimal) SlicerFile.BottomExposureTime;
if (_exposureGenManualNormal == 0)
_exposureGenManualNormal = (decimal)SlicerFile.ExposureTime;
if (_multipleBrightnessGenExposureTime == 0)
{
_multipleBrightnessGenExposureTime = (decimal)SlicerFile.ExposureTime;
}
if (!SlicerFile.HavePrintParameterPerLayerModifier(FileFormat.PrintParameterModifier.ExposureSeconds))
{
@@ -23,12 +23,12 @@ namespace UVtools.Core.Operations
public sealed class OperationCalibrateGrayscale : Operation
{
#region Members
private decimal _layerHeight = 0.05M;
private ushort _bottomLayers = 10;
private decimal _layerHeight;
private ushort _bottomLayers;
private ushort _interfaceLayers = 5;
private ushort _normalLayers = 30;
private decimal _bottomExposure = 60;
private decimal _normalExposure = 12;
private decimal _bottomExposure;
private decimal _normalExposure;
private ushort _outerMargin = 200;
private ushort _innerMargin = 50;
private bool _enableAntiAliasing = true;
@@ -108,10 +108,10 @@ namespace UVtools.Core.Operations
public override void InitWithSlicerFile()
{
base.InitWithSlicerFile();
_layerHeight = (decimal)SlicerFile.LayerHeight;
_bottomLayers = SlicerFile.BottomLayerCount;
_bottomExposure = (decimal)SlicerFile.BottomExposureTime;
_normalExposure = (decimal)SlicerFile.ExposureTime;
if(_layerHeight <= 0) _layerHeight = (decimal)SlicerFile.LayerHeight;
if(_bottomLayers <= 0) _bottomLayers = SlicerFile.BottomLayerCount;
if(_bottomExposure <= 0) _bottomExposure = (decimal)SlicerFile.BottomExposureTime;
if(_normalExposure <= 0) _normalExposure = (decimal)SlicerFile.ExposureTime;
_mirrorOutput = SlicerFile.MirrorDisplay;
}
@@ -25,10 +25,10 @@ namespace UVtools.Core.Operations
#region Members
private decimal _displayWidth;
private decimal _displayHeight;
private decimal _layerHeight = 0.05M;
private ushort _bottomLayers = 3;
private decimal _bottomExposure = 60;
private decimal _normalExposure = 12;
private decimal _layerHeight;
private ushort _bottomLayers;
private decimal _bottomExposure;
private decimal _normalExposure;
private decimal _baseDiameter = 30;
private decimal _baseHeight = 3;
private decimal _bodyHeight = 50;
@@ -107,10 +107,10 @@ namespace UVtools.Core.Operations
public override void InitWithSlicerFile()
{
base.InitWithSlicerFile();
_layerHeight = (decimal)SlicerFile.LayerHeight;
_bottomLayers = SlicerFile.BottomLayerCount;
_bottomExposure = (decimal)SlicerFile.BottomExposureTime;
_normalExposure = (decimal)SlicerFile.ExposureTime;
if(_layerHeight <= 0) _layerHeight = (decimal)SlicerFile.LayerHeight;
if(_bottomLayers <= 0) _bottomLayers = SlicerFile.BottomLayerCount;
if(_bottomExposure <= 0) _bottomExposure = (decimal)SlicerFile.BottomExposureTime;
if(_normalExposure <= 0) _normalExposure = (decimal)SlicerFile.ExposureTime;
_mirrorOutput = SlicerFile.MirrorDisplay;
if (SlicerFile.DisplayWidth > 0)
@@ -27,10 +27,10 @@ namespace UVtools.Core.Operations
#region Members
private decimal _displayWidth;
private decimal _displayHeight;
private decimal _layerHeight = 0.05M;
private ushort _bottomLayers = 3;
private decimal _bottomExposure = 60;
private decimal _normalExposure = 12;
private decimal _layerHeight;
private ushort _bottomLayers;
private decimal _bottomExposure;
private decimal _normalExposure;
private decimal _zSize = 10;
private ushort _topBottomMargin = 100;
private ushort _leftRightMargin = 100;
@@ -427,10 +427,10 @@ namespace UVtools.Core.Operations
public override void InitWithSlicerFile()
{
base.InitWithSlicerFile();
_layerHeight = (decimal)SlicerFile.LayerHeight;
_bottomLayers = SlicerFile.BottomLayerCount;
_bottomExposure = (decimal)SlicerFile.BottomExposureTime;
_normalExposure = (decimal)SlicerFile.ExposureTime;
if (_layerHeight <= 0) _layerHeight = (decimal)SlicerFile.LayerHeight;
if (_bottomLayers <= 0) _bottomLayers = SlicerFile.BottomLayerCount;
if (_bottomExposure <= 0) _bottomExposure = (decimal)SlicerFile.BottomExposureTime;
if (_normalExposure <= 0) _normalExposure = (decimal)SlicerFile.ExposureTime;
_mirrorOutput = SlicerFile.MirrorDisplay;
if (SlicerFile.DisplayWidth > 0)
@@ -22,10 +22,10 @@ namespace UVtools.Core.Operations
public sealed class OperationCalibrateXYZAccuracy : Operation
{
#region Members
private decimal _layerHeight = 0.05M;
private ushort _bottomLayers = 3;
private decimal _bottomExposure = 60;
private decimal _normalExposure = 12;
private decimal _layerHeight;
private ushort _bottomLayers;
private decimal _bottomExposure;
private decimal _normalExposure;
private ushort _topBottomMargin = 100;
private ushort _leftRightMargin = 100;
private decimal _displayWidth;
@@ -459,10 +459,10 @@ namespace UVtools.Core.Operations
public override void InitWithSlicerFile()
{
base.InitWithSlicerFile();
_layerHeight = (decimal)SlicerFile.LayerHeight;
_bottomLayers = SlicerFile.BottomLayerCount;
_bottomExposure = (decimal)SlicerFile.BottomExposureTime;
_normalExposure = (decimal)SlicerFile.ExposureTime;
if (_layerHeight <= 0) _layerHeight = (decimal)SlicerFile.LayerHeight;
if (_bottomLayers <= 0) _bottomLayers = SlicerFile.BottomLayerCount;
if (_bottomExposure <= 0) _bottomExposure = (decimal)SlicerFile.BottomExposureTime;
if (_normalExposure <= 0) _normalExposure = (decimal)SlicerFile.ExposureTime;
_mirrorOutput = SlicerFile.MirrorDisplay;
if (SlicerFile.DisplayWidth > 0)
@@ -126,8 +126,8 @@ namespace UVtools.Core.Operations
public override void InitWithSlicerFile()
{
base.InitWithSlicerFile();
NewResolutionX = SlicerFile.ResolutionX;
NewResolutionY = SlicerFile.ResolutionY;
if(_newResolutionX <= 0) _newResolutionX = SlicerFile.ResolutionX;
if(_newResolutionY <= 0) _newResolutionY = SlicerFile.ResolutionY;
}
#endregion
@@ -235,12 +235,26 @@ namespace UVtools.Core.Operations
{ }
public OperationDynamicLifts(FileFormat slicerFile) : base(slicerFile)
{
_minBottomLiftHeight = _maxBottomLiftHeight = SlicerFile.BottomLiftHeight;
_minLiftHeight = _maxLiftHeight = SlicerFile.LiftHeight;
{ }
_minBottomLiftSpeed = _maxBottomLiftSpeed = SlicerFile.BottomLiftSpeed;
_minLiftSpeed = _maxLiftSpeed = SlicerFile.LiftSpeed;
public override void InitWithSlicerFile()
{
base.InitWithSlicerFile();
if(_minBottomLiftHeight <= 0) _minBottomLiftHeight = SlicerFile.BottomLiftHeight;
if (_maxBottomLiftHeight <= 0 || _maxBottomLiftHeight < _minBottomLiftHeight) _maxBottomLiftHeight = _minBottomLiftHeight;
if (_minLiftHeight <= 0) _minLiftHeight = SlicerFile.LiftHeight;
if (_maxLiftHeight <= 0 || _maxLiftHeight < _minLiftHeight) _maxLiftHeight = _minLiftHeight;
if (_minBottomLiftSpeed <= 0) _minBottomLiftSpeed = SlicerFile.BottomLiftSpeed;
if (_maxBottomLiftSpeed <= 0 || _maxBottomLiftSpeed < _minBottomLiftSpeed) _maxBottomLiftSpeed = _minBottomLiftSpeed;
if(_minLiftSpeed <= 0) _minLiftSpeed = SlicerFile.LiftSpeed;
if (_maxLiftSpeed <= 0 || _maxLiftSpeed < _minLiftSpeed) _maxLiftSpeed = _minLiftSpeed;
RaisePropertyChanged(nameof(IsBottomLayersEnabled));
RaisePropertyChanged(nameof(IsNormalLayersEnabled));
}
#endregion
@@ -8,7 +8,6 @@
using System;
using System.Text;
using System.Threading.Tasks;
using UVtools.Core.FileFormats;
using UVtools.Core.Managers;
using UVtools.Core.Objects;
@@ -24,6 +24,7 @@ namespace UVtools.Core.Operations
[Serializable]
public sealed class OperationLayerExportGif : Operation
{
#region Enums
public enum ExportGifRotateDirection : byte
{
None = 9,
@@ -45,7 +46,7 @@ namespace UVtools.Core.Operations
Vertically,
Both,
}
#endregion
#region Members
private string _filePath;
@@ -10,8 +10,6 @@ using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.ComTypes;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
-1
View File
@@ -12,7 +12,6 @@ using System.Threading.Tasks;
using Emgu.CV;
using Emgu.CV.Structure;
using UVtools.Core.FileFormats;
using UVtools.Core.Objects;
namespace UVtools.Core.Operations
{
@@ -13,7 +13,6 @@ using System.Threading.Tasks;
using Emgu.CV;
using UVtools.Core.Extensions;
using UVtools.Core.FileFormats;
using UVtools.Core.Objects;
namespace UVtools.Core.Operations
{
@@ -16,7 +16,6 @@ using Emgu.CV;
using Emgu.CV.CvEnum;
using UVtools.Core.Extensions;
using UVtools.Core.FileFormats;
using UVtools.Core.Objects;
namespace UVtools.Core.Operations
{
@@ -16,7 +16,6 @@ using Emgu.CV.Structure;
using Emgu.CV.Util;
using UVtools.Core.Extensions;
using UVtools.Core.FileFormats;
using UVtools.Core.Objects;
namespace UVtools.Core.Operations
{
+7 -8
View File
@@ -12,7 +12,6 @@ using System.Threading.Tasks;
using Emgu.CV;
using UVtools.Core.Extensions;
using UVtools.Core.FileFormats;
using UVtools.Core.Objects;
namespace UVtools.Core.Operations
{
@@ -55,6 +54,13 @@ namespace UVtools.Core.Operations
return sb.ToString();
}
public override string ToString()
{
var result = $"[X: {_x}%, Y: {_y}%] [Fade: {_isFade}] [Constrain: {_constrainXy}]" + LayerRangeString;
if (!string.IsNullOrEmpty(ProfileName)) result = $"{ProfileName}: {result}";
return result;
}
#endregion
#region Properties
@@ -111,13 +117,6 @@ namespace UVtools.Core.Operations
#endregion
public override string ToString()
{
var result = $"[X: {_x}%, Y: {_y}%] [Fade: {_isFade}] [Constrain: {_constrainXy}]"+ LayerRangeString;
if (!string.IsNullOrEmpty(ProfileName)) result = $"{ProfileName}: {result}";
return result;
}
#region Equality
protected bool Equals(OperationResize other)
@@ -10,7 +10,6 @@ using System;
using System.Threading.Tasks;
using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using UVtools.Core.Extensions;
using UVtools.Core.FileFormats;
+8
View File
@@ -205,5 +205,13 @@ namespace UVtools.Core.Slicer
public static uint PixelsFromMillimetersX(Size resolution, SizeF display, decimal millimeters) => (uint)Math.Floor(resolution.Width / display.Width * (double) millimeters);
public static uint PixelsFromMillimetersY(Size resolution, SizeF display, decimal millimeters) => (uint)Math.Floor(resolution.Height / display.Height * (double) millimeters);
public static uint MillimetersToLayers(float millimeters, float layerHeight) => (uint) Math.Floor(millimeters / layerHeight);
public static uint MillimetersToLayers(double millimeters, double layerHeight) => (uint) Math.Floor(millimeters / layerHeight);
public static uint MillimetersToLayers(decimal millimeters, decimal layerHeight) => (uint) Math.Floor(millimeters / layerHeight);
public static uint LayersToMillimeters(uint layers, float layerHeight) => (uint)Math.Floor(layers * layerHeight);
public static uint LayersToMillimeters(uint layers, double layerHeight) => (uint)Math.Floor(layers * layerHeight);
public static uint LayersToMillimeters(uint layers, decimal layerHeight) => (uint)Math.Floor(layers * layerHeight);
}
}
+1 -1
View File
@@ -10,7 +10,7 @@
<RepositoryUrl>https://github.com/sn4k3/UVtools</RepositoryUrl>
<PackageProjectUrl>https://github.com/sn4k3/UVtools</PackageProjectUrl>
<Description>MSLA/DLP, file analysis, calibration, repair, conversion and manipulation</Description>
<Version>2.13.3</Version>
<Version>2.13.4</Version>
<Copyright>Copyright © 2020 PTRTECH</Copyright>
<PackageIcon>UVtools.png</PackageIcon>
<Platforms>AnyCPU;x64</Platforms>
@@ -833,6 +833,12 @@
<Component Id="owc7382C9C8FF3A521BF6356335630BD375" Guid="aa17a4dd-086a-d8ca-2a94-5bed85c6d151">
<File Id="owf7382C9C8FF3A521BF6356335630BD375" Source="$(var.SourceDir)\ucrtbase.dll" KeyPath="yes" />
</Component>
<Component Id="owc569F1566ECE625286E8493EC67315736" Guid="c148e3e9-5880-6add-e3f9-b0bbc36f5071">
<File Id="owf569F1566ECE625286E8493EC67315736" Source="$(var.SourceDir)\UVtools.AvaloniaControls.dll" KeyPath="yes" />
</Component>
<Component Id="owc9783B2A71C9B9BA65282E5F7847AF853" Guid="5d8bba8d-dd57-3bf5-32a2-79feff36a7e0">
<File Id="owf9783B2A71C9B9BA65282E5F7847AF853" Source="$(var.SourceDir)\UVtools.AvaloniaControls.pdb" KeyPath="yes" />
</Component>
<Component Id="owc540CF8CDBE6617C60879532E387E1716" Guid="bd0331df-7b7e-28be-f87a-809cdbfa07f0">
<File Id="owf540CF8CDBE6617C60879532E387E1716" Source="$(var.SourceDir)\UVtools.Core.dll" KeyPath="yes" />
</Component>
Binary file not shown.

After

Width:  |  Height:  |  Size: 112 B

+1 -1
View File
@@ -17,7 +17,7 @@ namespace UVtools.WPF
{
public partial class MainWindow
{
public bool HaveGCode => IsFileLoaded && SlicerFile.HaveGCode;
public bool HaveGCode => IsFileLoaded && SlicerFile.SupportsGCode;
public string GCodeStr => SlicerFile?.GCodeStr;
public uint GCodeLines => !HaveGCode ? 0 : SlicerFile.GCode.LineCount;
+9 -3
View File
@@ -648,6 +648,7 @@
Spacing="2"
VerticalAlignment="Center">
<RepeatButton
VerticalAlignment="Stretch"
HotKey="Ctrl + Shift + Down"
ToolTip.Tip="Go to the previous issue [Ctrl + Shift + Down]"
IsEnabled="{Binding IssueCanGoPrevious}"
@@ -659,7 +660,7 @@
<TextBlock VerticalAlignment="Center">
<TextBlock.Text>
<MultiBinding StringFormat="\{0\}/\{1\}">
<MultiBinding StringFormat="{}{0}/{1}">
<Binding Path="IssueSelectedIndexStr"/>
<Binding Path="Issues.Count"/>
</MultiBinding>
@@ -667,6 +668,7 @@
</TextBlock>
<RepeatButton
VerticalAlignment="Stretch"
HotKey="Ctrl + Shift + Up"
ToolTip.Tip="Go to the next issue [Ctrl + Shift + Up]"
IsEnabled="{Binding IssueCanGoNext}"
@@ -677,6 +679,7 @@
</RepeatButton>
<Button
VerticalAlignment="Stretch"
ToolTip.Tip="Hides and ignores the selected issues, they won't be re-detected.
&#x0a;ALT + Click to re-enable the ignored issues."
IsEnabled="{Binding #IssuesGrid.SelectedItem, Converter={x:Static ObjectConverters.IsNotNull}}"
@@ -685,6 +688,7 @@
</Button>
<Button
VerticalAlignment="Stretch"
ToolTip.Tip="Remove selected issue when possible.
&#x0a;Islands: All pixels are removed (turn black).
&#x0a;ResinTrap: All trap areas are filled with white pixels.
@@ -709,14 +713,16 @@
<Button
IsEnabled="{Binding IsFileLoaded}"
ToolTip.Tip="Attempt to repair issues"
VerticalAlignment="Stretch"
Command="{Binding OnClickRepairIssues}">
<StackPanel Orientation="Horizontal" Spacing="5">
<Image Source="/Assets/Icons/wrench-16x16.png" />
<Image Source="/Assets/Icons/toolbox-16x16.png" />
<!--<TextBlock VerticalAlignment="Center" Text="Repair"/>!-->
</StackPanel>
</Button>
<Button
VerticalAlignment="Stretch"
ToolTip.Tip="Compute Issues.
&#x0a;Right click to access settings."
Command="{Binding OnClickDetectIssues}">
@@ -1883,7 +1889,7 @@
</ContextMenu>
</Button.ContextMenu>
<StackPanel Orientation="Horizontal">
<Image Source="/Assets/Icons/geometry-16x16.png"/>
<Image Source="/Assets/Icons/vector-square-16x16.png"/>
<TextBlock Margin="5,0,5,0" Text="Outline ⮟"/>
</StackPanel>
</Button>
+2 -2
View File
@@ -12,7 +12,7 @@
<PackageLicenseFile>LICENSE</PackageLicenseFile>
<RepositoryUrl>https://github.com/sn4k3/UVtools</RepositoryUrl>
<RepositoryType>Git</RepositoryType>
<Version>2.13.3</Version>
<Version>2.13.4</Version>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
@@ -30,7 +30,7 @@
<PackageReference Include="Avalonia.Desktop" Version="0.10.6" />
<PackageReference Include="Avalonia.Diagnostics" Version="0.10.6" />
<PackageReference Include="Emgu.CV.runtime.windows" Version="4.5.1.4349" />
<PackageReference Include="MessageBox.Avalonia" Version="1.5.0" />
<PackageReference Include="MessageBox.Avalonia" Version="1.5.1" />
<PackageReference Include="ThemeEditor.Controls.ColorPicker" Version="0.10.4" />
</ItemGroup>
<ItemGroup>