mirror of
https://github.com/riegera2412/UVtools.git
synced 2026-07-08 17:42:31 +02:00
816898836b
- **File formats:** - (Add) File extension: .gktwo.ctb to `ChituboxFile` to be able to convert files for UniFormation GKtwo under special CTB format - (Add) UniFormation GKtwo compatibility under CTB format, if exporting JXS rename to CTB before open - (Fix) CTB, CBDDLP, PHOTON, FDG, PHZ: Read and write files larger then 4GB (#608) - **PCB Exposure:** - (Add) Offset X/Y to offset the PCB from it origin - (Add) Allow to toggle between "Show preview image cropped by it bounds" and "Show full preview image (The final result)" - (Improvement) Use rectangle instead of line for center line primitive (#607) - (Fix) Implement rotation to polygon and center line primitives (#607) - (Fix) Macros in a single line was not being parsed (#607) - (Fix) Invert color per file was not affecting primitives - **Network printers:** - (Add) Socket requests with TCP and UDP - (Add) AnyCubic printer preset (However it can't upload a file) - (Add) Scripts in request path to allow a first request to fetch data to the final request: - A script starts with **<\?** and ends with **?>** - First parameter is the first request to get response content from - Second parameter is the regex pattern to match content with - Third parameter is the final request that supports a parameter from regex matching group, eg: **{#1}** is match Group[1] value - **Example:** <\? getfiles > {0}\/(\d+\.[\da-zA-Z]+), > printfile,{#1} ?> - (Change) Allow to print a filename without send it when upload request path is empty - (Fix) Do not show printers with empty requests - (Change) Default layer compression to Lz4 instead of Png - (Improvement) Application is now culture aware but set part of `NumberFormat` to the `InvariantCulture.NumberFormat` - (Improvement) Material cost now show with the current culture currency symbol due previous change - (Improvement) Better submit of bug reports using sections and forms - (Improvement) Linux: AppImage now have a help manual with possible arguments and parameters - (Improvement) macOS: Codesign app on auto-installer and auto-upgrade to bypass arm64 run restriction (#431) - (Improvement) macOS: Rebuilt arm64 libcvextern.dylib to run with less dependencies (#431) - (Improvement) macOS: Try to show missing dependencies from openCV (if any) on the error message - (Fix) UI: layers sorted lexicographically instead of numerically in the issues list view (#611) - (Fix) PrusaSlicer printer parameters: UniFormation GKtwo
125 lines
4.1 KiB
C#
125 lines
4.1 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.Globalization;
|
|
using System.Reflection;
|
|
|
|
namespace UVtools.Core.Extensions;
|
|
|
|
public static class ReflectionExtensions
|
|
{
|
|
public static bool SetValueFromString(this PropertyInfo attribute, object obj, string value)
|
|
{
|
|
if (attribute.PropertyType == typeof(string))
|
|
{
|
|
attribute.SetValue(obj, value.Convert<string>());
|
|
return true;
|
|
}
|
|
|
|
if (string.IsNullOrEmpty(value)) return false;
|
|
|
|
if (attribute.PropertyType.IsEnum)
|
|
{
|
|
if (Enum.TryParse(attribute.PropertyType, value, true, out var enumValue))
|
|
{
|
|
attribute.SetValue(obj, enumValue);
|
|
return true;
|
|
}
|
|
|
|
throw new ArgumentException($"The requested enum name '{value}' was not found.\nAvailable names: ({string.Join(", ", Enum.GetNames(attribute.PropertyType))}).");
|
|
}
|
|
|
|
if (attribute.PropertyType == typeof(bool))
|
|
{
|
|
//if (value == "!") attribute.SetValue(obj, !bool.Parse(attribute.GetValue(obj).ToString()));
|
|
if (value.Length == 1 && char.IsDigit(value[0])) attribute.SetValue(obj, value[0] != '0');
|
|
else attribute.SetValue(obj, value.Equals("true", StringComparison.OrdinalIgnoreCase));
|
|
return true;
|
|
}
|
|
|
|
if (attribute.PropertyType == typeof(byte))
|
|
{
|
|
if (value.Equals("true", StringComparison.OrdinalIgnoreCase)) attribute.SetValue(obj, (byte)1);
|
|
else if (value.Equals("false", StringComparison.OrdinalIgnoreCase)) attribute.SetValue(obj, byte.MinValue);
|
|
else attribute.SetValue(obj, value.Convert<byte>());
|
|
return true;
|
|
}
|
|
|
|
if (attribute.PropertyType == typeof(sbyte))
|
|
{
|
|
attribute.SetValue(obj, value.Convert<sbyte>());
|
|
return true;
|
|
}
|
|
|
|
if (attribute.PropertyType == typeof(ushort))
|
|
{
|
|
attribute.SetValue(obj, value.Convert<ushort>());
|
|
return true;
|
|
}
|
|
|
|
if (attribute.PropertyType == typeof(short))
|
|
{
|
|
attribute.SetValue(obj, value.Convert<short>());
|
|
return true;
|
|
}
|
|
|
|
if (attribute.PropertyType == typeof(uint))
|
|
{
|
|
attribute.SetValue(obj, value.Convert<uint>());
|
|
return true;
|
|
}
|
|
|
|
if (attribute.PropertyType == typeof(int))
|
|
{
|
|
attribute.SetValue(obj, value.Convert<int>());
|
|
return true;
|
|
}
|
|
|
|
if (attribute.PropertyType == typeof(ulong))
|
|
{
|
|
attribute.SetValue(obj, value.Convert<ulong>());
|
|
return true;
|
|
}
|
|
|
|
if (attribute.PropertyType == typeof(long))
|
|
{
|
|
attribute.SetValue(obj, value.Convert<long>());
|
|
return true;
|
|
}
|
|
|
|
if (attribute.PropertyType == typeof(Half))
|
|
{
|
|
attribute.SetValue(obj, Half.Parse(value, CultureInfo.InvariantCulture));
|
|
return true;
|
|
}
|
|
|
|
if (attribute.PropertyType == typeof(float))
|
|
{
|
|
attribute.SetValue(obj, float.Parse(value, CultureInfo.InvariantCulture));
|
|
return true;
|
|
}
|
|
|
|
if (attribute.PropertyType == typeof(double))
|
|
{
|
|
attribute.SetValue(obj, double.Parse(value, CultureInfo.InvariantCulture));
|
|
return true;
|
|
}
|
|
|
|
if (attribute.PropertyType == typeof(decimal))
|
|
{
|
|
attribute.SetValue(obj, decimal.Parse(value, CultureInfo.InvariantCulture));
|
|
return true;
|
|
}
|
|
|
|
throw new Exception($"Data type '{attribute.PropertyType.Name}' not recognized nor implemented.");
|
|
}
|
|
|
|
public static bool SetValueFromString(this PropertyInfo attribute, object obj, object? value) =>
|
|
attribute.SetValueFromString(obj, value?.ToString() ?? string.Empty);
|
|
} |