mirror of
https://github.com/riegera2412/UVtools.git
synced 2026-07-11 11:02:32 +02:00
8e4995a6a5
- **UVtoolsCmd:**
- **print-properties:**
- (Change) `-b`, `--base` option to `-a`, `-all` to indicate all properties and sub-properties, now defaults to only show base properties
- (Add) `-r`, `--range` option to prints only the matching layer(s) index(es) in a range
- (Add) `-i`, `--indexes` option to prints only the matching layer(s) index(es)
- (Add) Command: `set-properties <input-file> <property=value> Set properties in a file or to it layers with new values`
- (Add) Command: `print-issues <input-file> Detect and print issues in a file`
- (Add) New option to the `run` command: `-p, --property <property=value> Set a property with a new value (Compatible with operations only)`
- (Remove) Command: `print-layers` as it has been moved to `print-properties`, use `-r :` to obtain same result as default on `print-layers`
- **Issues:**
- (Fix) Issues groups with only one issue was displaying the wrong area value
- (Fix) Volume incorrectly calculated, resulting in a high value for group of issues
- (Fix) Incorrect calculation of the bounding rectangle for a group of issues
- **Repair layers:**
- (Add) Switch to opt between "Re-detect the selected issues before repair" and "Use and repair the previous detected issues" (Default)
- (Improvement) Do not allow to run the tool if there are no detected issues when the option "Use and repair the previous detected issues" is selected
- (Improvement) Linux: Recompile libcvextern.so on a older system to be able to run on both older and newest system (#603)
- (Upgrade) .NET from 6.0.10 to 6.0.11
166 lines
7.8 KiB
C#
166 lines
7.8 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.CommandLine;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
using System.Text.Json.Serialization;
|
|
using System.Xml.Serialization;
|
|
using UVtools.Core.FileFormats;
|
|
|
|
namespace UVtools.Cmd.Symbols;
|
|
|
|
internal static class PrintPropertiesCommand
|
|
{
|
|
internal static Command CreateCommand()
|
|
{
|
|
var matchNamesOption = new Option<string[]>(new[] {"-n", "--names"}, "Prints only the name matching properties")
|
|
{
|
|
AllowMultipleArgumentsPerToken = true
|
|
};
|
|
var allPropertiesOption = new Option<bool>(new[] { "-a", "--all" }, "Also prints the sub properties of the file (No effect on layers)");
|
|
var layerRangeOption = new Option<string>(new[] { "-r", "--range" }, "Prints only the matching layer(s) index(es) in a range")
|
|
{
|
|
ArgumentHelpName = "startindex:endindex"
|
|
};
|
|
var layerIndexesOption = new Option<uint[]>(new[] { "-i", "--indexes" }, "Prints only the matching layer(s) index(es)")
|
|
{
|
|
AllowMultipleArgumentsPerToken = true
|
|
};
|
|
|
|
var command = new Command("print-properties", "Prints available properties")
|
|
{
|
|
GlobalArguments.InputFileArgument,
|
|
matchNamesOption,
|
|
allPropertiesOption,
|
|
layerRangeOption,
|
|
layerIndexesOption,
|
|
GlobalOptions.OpenInPartialMode
|
|
};
|
|
|
|
command.SetHandler((inputFile, matchNames, allProperties, layerRange, layerIndexes, partialMode) =>
|
|
{
|
|
var slicerFile = Program.OpenInputFile(inputFile, partialMode ? FileFormat.FileDecodeType.Partial : FileFormat.FileDecodeType.Full);
|
|
uint count = 0;
|
|
|
|
var layerIndexesList = new List<uint>();
|
|
|
|
if (!string.IsNullOrWhiteSpace(layerRange))
|
|
{
|
|
if (slicerFile.TryParseLayerIndexRange(layerRange, out var layerIndexStart, out var layerIndexEnd))
|
|
{
|
|
for (var layerIndex = layerIndexStart; layerIndex <= layerIndexEnd; layerIndex++)
|
|
{
|
|
layerIndexesList.Add(layerIndex);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Program.WriteLineError($"The specified layer range '{layerRange}' is malformed, use startindex:endindex with positive numbers");
|
|
}
|
|
}
|
|
|
|
if (layerIndexes.Length > 0)
|
|
{
|
|
layerIndexesList.AddRange(layerIndexes.Select(layerIndex => slicerFile.SanitizeLayerIndex(layerIndex)));
|
|
}
|
|
|
|
layerIndexesList = layerIndexesList.Distinct().OrderBy(layerIndex => layerIndex).ToList();
|
|
Console.WriteLine("-------------------------");
|
|
|
|
if (layerIndexesList.Count == 0)
|
|
{
|
|
if (allProperties)
|
|
{
|
|
foreach (var config in slicerFile.Configs)
|
|
{
|
|
//Program.WriteLine("******************************");
|
|
//Program.WriteLine($"\t{config.GetType().Name}");
|
|
//Program.WriteLine("******************************");
|
|
foreach (var propertyInfo in config.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
|
|
{
|
|
if (propertyInfo.Name.Equals("Item")) continue;
|
|
if (matchNames.Length > 0)
|
|
{
|
|
if(matchNames.All(s => s != propertyInfo.Name)) continue;
|
|
}
|
|
if (propertyInfo.GetCustomAttributes().Any(attribute =>
|
|
{
|
|
var type = attribute.GetType();
|
|
if (type == typeof(XmlIgnoreAttribute)) return true;
|
|
if (type == typeof(JsonIgnoreAttribute)) return true;
|
|
return false;
|
|
})) continue;
|
|
count++;
|
|
Console.WriteLine($"{propertyInfo.Name}: {propertyInfo.GetValue(config)}");
|
|
}
|
|
}
|
|
}
|
|
|
|
//Program.WriteLine("******************************");
|
|
//Program.WriteLine("\tBase");
|
|
//Program.WriteLine("******************************");
|
|
|
|
|
|
foreach (var propertyInfo in slicerFile.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
|
|
{
|
|
if (propertyInfo.Name.Equals("Item")) continue;
|
|
if (matchNames is not null && matchNames.Length > 0)
|
|
{
|
|
if (matchNames.All(s => s != propertyInfo.Name)) continue;
|
|
}
|
|
if (propertyInfo.GetCustomAttributes().Any(attribute =>
|
|
{
|
|
var type = attribute.GetType();
|
|
if (type == typeof(XmlIgnoreAttribute)) return true;
|
|
if (type == typeof(JsonIgnoreAttribute)) return true;
|
|
return false;
|
|
})) continue;
|
|
count++;
|
|
Console.WriteLine($"{propertyInfo.Name}: {propertyInfo.GetValue(slicerFile)}");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (var i = 0; i < layerIndexesList.Count; i++)
|
|
{
|
|
var layerIndex = layerIndexesList[i];
|
|
if(i > 0) Console.WriteLine("-------------------------");
|
|
Console.WriteLine($"# Layer: {layerIndex}");
|
|
foreach (var propertyInfo in slicerFile[layerIndex].GetType()
|
|
.GetProperties(BindingFlags.Public | BindingFlags.Instance))
|
|
{
|
|
if (propertyInfo.Name.Equals("Item")) continue;
|
|
if (matchNames is not null && matchNames.Length > 0)
|
|
{
|
|
if (matchNames.All(s => s != propertyInfo.Name)) continue;
|
|
}
|
|
|
|
if (propertyInfo.GetCustomAttributes().Any(attribute =>
|
|
{
|
|
var type = attribute.GetType();
|
|
if (type == typeof(XmlIgnoreAttribute)) return true;
|
|
if (type == typeof(JsonIgnoreAttribute)) return true;
|
|
return false;
|
|
})) continue;
|
|
Console.WriteLine($"{propertyInfo.Name}: {propertyInfo.GetValue(slicerFile[layerIndex])}");
|
|
count++;
|
|
}
|
|
}
|
|
}
|
|
|
|
Console.WriteLine("-------------------------");
|
|
Console.WriteLine($"Total properties: {count}");
|
|
|
|
}, GlobalArguments.InputFileArgument, matchNamesOption, allPropertiesOption, layerRangeOption, layerIndexesOption, GlobalOptions.OpenInPartialMode);
|
|
|
|
return command;
|
|
}
|
|
} |