/* * GNU AFFERO GENERAL PUBLIC LICENSE * Version 3, 19 November 2007 * Copyright (C) 2007 Free Software Foundation, Inc. * Everyone is permitted to copy and distribute verbatim copies * of this license document, but changing it is not allowed. */ using Emgu.CV; using Emgu.CV.CvEnum; using System; using System.Collections; using System.IO; using System.Reflection; using System.Text; using System.Threading.Tasks; using UVtools.Core.EmguCV; using UVtools.Core.Extensions; using UVtools.Core.FileFormats; namespace UVtools.Core.Operations; public sealed class OperationLayerExportHtml : Operation { #region Members private string _filePath = null!; private bool _exportThumbnails = true; private bool _exportLayerSettings = true; private bool _exportGCode = true; private bool _exportLayerPreview = true; private bool _exportRawData = true; #endregion #region Overrides public override LayerRangeSelection StartLayerRangeSelection => LayerRangeSelection.None; public override bool CanROI => false; public override bool CanMask => false; public override string IconClass => "fa-brands fa-html5"; public override string Title => "Export layers to HTML"; public override string Description => "Export file information and layers to an html file.\n"; public override string ConfirmationText => $"export layers {LayerIndexStart} through {LayerIndexEnd}?"; public override string ProgressTitle => $"Exporting layers {LayerIndexStart} through {LayerIndexEnd}"; public override string ProgressAction => "Exported layers"; public override string ToString() { var result = $"[Thumbnails: {_exportThumbnails}]" + $" [Raw data: {_exportRawData}]" + $" [Layers: {_exportLayerSettings}]" + $" [GCode: {_exportGCode}]" + $" [Preview: {_exportLayerPreview}]"; if (!string.IsNullOrEmpty(ProfileName)) result = $"{ProfileName}: {result}"; return result; } #endregion #region Properties public string FilePath { get => _filePath; set => RaiseAndSetIfChanged(ref _filePath, value); } public bool ExportThumbnails { get => _exportThumbnails; set => RaiseAndSetIfChanged(ref _exportThumbnails, value); } public bool ExportRawData { get => _exportRawData; set => RaiseAndSetIfChanged(ref _exportRawData, value); } public bool ExportLayerSettings { get => _exportLayerSettings; set => RaiseAndSetIfChanged(ref _exportLayerSettings, value); } public bool ExportGCode { get => _exportGCode; set => RaiseAndSetIfChanged(ref _exportGCode, value); } public bool ExportLayerPreview { get => _exportLayerPreview; set => RaiseAndSetIfChanged(ref _exportLayerPreview, value); } #endregion #region Constructor public OperationLayerExportHtml() { } public OperationLayerExportHtml(FileFormat slicerFile) : base(slicerFile) { } public override void InitWithSlicerFile() { _filePath = SlicerFile.FileFullPath + ".html"; } #endregion #region Methods protected override bool ExecuteInternally(OperationProgress progress) { using TextWriter html = new StreamWriter(_filePath); html.WriteLine(""); html.WriteLine(""); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine($" "); html.WriteLine($" "); html.WriteLine($" "); html.WriteLine($" {About.Software} · {SlicerFile.Filename}"); html.WriteLine(); html.WriteLine($" "); html.WriteLine($" "); html.WriteLine($" "); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine(); html.WriteLine($"
"); // Start Navbar html.WriteLine($" "); // Start Header // End Header html.WriteLine($"
"); html.WriteLine(); html.WriteLine("
"); html.WriteLine("
"); html.WriteLine($"

{SlicerFile.Filename}

"); if (_exportThumbnails) { var thumbnailCount = 0; foreach (var thumbnail in SlicerFile.Thumbnails) { if (thumbnail is null) continue; thumbnailCount++; html.WriteLine($" \"Thumbnail"); } } html.WriteLine("
"); html.WriteLine("
"); html.WriteLine(); html.WriteLine("
"); html.WriteLine("
"); // Start Content html.WriteLine("
"); html.WriteLine("
"); html.WriteLine("

"); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine("

"); html.WriteLine("
"); html.WriteLine("
"); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine($" "); html.WriteLine($" "); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine($" "); html.WriteLine($" "); html.WriteLine(" "); if (SlicerFile is {DisplayWidth: > 0, DisplayHeight: > 0}) { html.WriteLine(" "); html.WriteLine($" "); html.WriteLine($" "); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine($" "); html.WriteLine($" "); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine($" "); html.WriteLine($" "); html.WriteLine(" "); } html.WriteLine(" "); html.WriteLine($" "); html.WriteLine($" "); html.WriteLine(" "); if (SlicerFile.MaterialMilliliters > 0) { html.WriteLine(" "); html.WriteLine($" "); html.WriteLine($" "); html.WriteLine(" "); } if (SlicerFile.MaterialCost > 0) { html.WriteLine(" "); html.WriteLine($" "); html.WriteLine($" "); html.WriteLine(" "); } if (!string.IsNullOrWhiteSpace(SlicerFile.MaterialName)) { html.WriteLine(" "); html.WriteLine($" "); html.WriteLine($" "); html.WriteLine(" "); } if (!string.IsNullOrWhiteSpace(SlicerFile.MachineName)) { html.WriteLine(" "); html.WriteLine($" "); html.WriteLine($" "); html.WriteLine(" "); } html.WriteLine(" "); html.WriteLine($" "); html.WriteLine($" "); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine($" "); html.WriteLine($" "); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine($" "); html.WriteLine($" "); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine($" "); html.WriteLine($" "); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine($" "); html.WriteLine($" "); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine("
PropertyValue
Class{SlicerFile.GetType().Name}, Version: {SlicerFile.Version}
Image resolution{SlicerFile.Resolution} px
Display size{SlicerFile.Display} mm
Pixel size{SlicerFile.PixelSizeMicrons} µm
Pixels per millimeters{SlicerFile.Ppmm} px
Print time{SlicerFile.PrintTimeString}
Material milliliters{SlicerFile.MaterialMilliliters} ml
Material cost{SlicerFile.MaterialCost} $
Material name{SlicerFile.MaterialName}
Machine name{SlicerFile.MachineName}
Layer count{SlicerFile.LayerCount} layers
Layer height{SlicerFile.LayerHeight} mm
Print height{SlicerFile.PrintHeight} mm
Print bounding rectangle{SlicerFile.BoundingRectangleMillimeters} mm
Print volume{SlicerFile.Volume} mm³
"); html.WriteLine("
"); html.WriteLine("
"); html.WriteLine("
"); if (SlicerFile.PrintParameterModifiers is not null) { html.WriteLine("
"); html.WriteLine("

"); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine("

"); html.WriteLine("
"); html.WriteLine("
"); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine(" "); SlicerFile.RefreshPrintParametersModifiersValues(); foreach (var modifier in SlicerFile.PrintParameterModifiers) { html.WriteLine(" "); html.WriteLine($" "); html.WriteLine($" "); html.WriteLine(" "); } html.WriteLine(" "); html.WriteLine("
PropertyValue
{modifier.Name}{modifier.Value.ToString($"F{modifier.DecimalPlates}")} {modifier.ValueUnit}
"); html.WriteLine("
"); html.WriteLine("
"); html.WriteLine("
"); } if (_exportRawData && SlicerFile.Configs?.Length > 0) { html.WriteLine("
"); html.WriteLine("

"); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine("

"); html.WriteLine("
"); html.WriteLine("
"); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine(" "); foreach (var config in SlicerFile.Configs) { var type = config.GetType(); foreach (var property in type.GetProperties(BindingFlags.Public | BindingFlags.Instance)) { if (property.Name.Equals("Item")) continue; html.WriteLine(" "); html.WriteLine($" "); html.WriteLine($" "); var value = property.GetValue(config); switch (value) { case null: continue; case IList list: html.WriteLine($" "); break; default: html.WriteLine($" "); break; } html.WriteLine(" "); } } html.WriteLine(" "); html.WriteLine("
ClassPropertyValue
{type.Name}{property.Name}{list.Count}{value}
"); html.WriteLine("
"); html.WriteLine("
"); html.WriteLine("
"); } if (_exportLayerSettings && SlicerFile.PrintParameterPerLayerModifiers is not null) { html.WriteLine("
"); html.WriteLine("

"); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine("

"); html.WriteLine("
"); html.WriteLine("
"); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine(" "); foreach (var modifier in SlicerFile.PrintParameterPerLayerModifiers) { html.WriteLine($" "); } html.WriteLine(" "); html.WriteLine(" "); html.WriteLine(" "); SlicerFile.RefreshPrintParametersModifiersValues(); foreach (var layer in SlicerFile) { html.WriteLine(" "); html.WriteLine($" "); SlicerFile.RefreshPrintParametersPerLayerModifiersValues(layer.Index); foreach (var modifier in SlicerFile.PrintParameterPerLayerModifiers) { html.WriteLine($" "); } html.WriteLine(" "); } html.WriteLine(" "); html.WriteLine("
#{modifier.Name}
{layer.Index}{modifier.Value.ToString($"F{modifier.DecimalPlates}")} {modifier.ValueUnit}
"); html.WriteLine("
"); html.WriteLine("
"); html.WriteLine("
"); } if (_exportGCode && SlicerFile.HaveGCode) { html.WriteLine("
"); html.WriteLine("

"); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine("

"); html.WriteLine("
"); html.WriteLine("
"); html.WriteLine("
");
            html.WriteLine(SlicerFile.GCodeStr);
            html.WriteLine("              
"); html.WriteLine("
"); html.WriteLine("
"); html.WriteLine("
"); } if(_exportLayerPreview) { html.WriteLine($" "); html.WriteLine($"

Layer preview

"); html.WriteLine($" "); html.WriteLine($" "); html.WriteLine($" "); html.WriteLine($" "); html.WriteLine($" "); html.WriteLine($" "); html.WriteLine($" "); html.WriteLine($" "); html.WriteLine($" "); html.WriteLine($" "); html.WriteLine($" "); html.WriteLine($"
0{SlicerFile.LastLayerIndex}
0
"); html.WriteLine($" "); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine($" "); html.WriteLine($" "); html.WriteLine(" "); html.WriteLine(" "); } html.WriteLine("
"); // End Content html.WriteLine("
"); html.WriteLine("
"); html.WriteLine(); html.WriteLine(" "); html.WriteLine(); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine(" "); html.WriteLine(""); return !progress.Token.IsCancellationRequested; } #endregion #region Equality private bool Equals(OperationLayerExportHtml other) { return _filePath == other._filePath && _exportThumbnails == other._exportThumbnails && _exportLayerSettings == other._exportLayerSettings && _exportGCode == other._exportGCode && _exportLayerPreview == other._exportLayerPreview && _exportRawData == other._exportRawData; } public override bool Equals(object? obj) { return ReferenceEquals(this, obj) || obj is OperationLayerExportHtml other && Equals(other); } public override int GetHashCode() { return HashCode.Combine(_filePath, _exportThumbnails, _exportLayerSettings, _exportGCode, _exportLayerPreview, _exportRawData); } #endregion }