Files
UVtools/UVtools.Core/Extensions/ReflectionExtensions.cs
T
Tiago Conceição 816898836b v3.9.0
- **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
2022-12-01 04:27:44 +00:00

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);
}