Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/sn4k3/UVtools.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'UVtools.Core/Gerber/Primitives/VectorLinePrimitive.cs')
-rw-r--r--UVtools.Core/Gerber/Primitives/VectorLinePrimitive.cs184
1 files changed, 184 insertions, 0 deletions
diff --git a/UVtools.Core/Gerber/Primitives/VectorLinePrimitive.cs b/UVtools.Core/Gerber/Primitives/VectorLinePrimitive.cs
new file mode 100644
index 0000000..6c165dd
--- /dev/null
+++ b/UVtools.Core/Gerber/Primitives/VectorLinePrimitive.cs
@@ -0,0 +1,184 @@
+/*
+ * 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.Data;
+using System.Drawing;
+using System.Text.RegularExpressions;
+using Emgu.CV;
+using Emgu.CV.CvEnum;
+using Emgu.CV.Structure;
+using UVtools.Core.Extensions;
+
+namespace UVtools.Core.Gerber.Primitives;
+
+/// <summary>
+/// A vector line is a rectangle defined by its line width, start and end points. The line ends are rectangular.
+/// </summary>
+public class VectorLinePrimitive : Primitive
+{
+ #region Constants
+ public const byte Code = 20;
+ #endregion
+
+ #region Properties
+ public override string Name => "VectorLine";
+
+ /// <summary>
+ /// Exposure off/on (0/1)
+ /// 1
+ /// </summary>
+ public string ExposureExpression { get; set; } = "1";
+ public byte Exposure { get; set; } = 1;
+
+ /// <summary>
+ /// Width of the line ≥ 0
+ /// 2
+ /// </summary>
+ public string LineWidthExpression { get; set; } = "0";
+ public float LineWidth { get; set; }
+
+ /// <summary>
+ /// Start point X coordinate
+ /// 3
+ /// </summary>
+ public string StartXExpression { get; set; } = "0";
+
+ public float StartX { get; set; }
+
+ /// <summary>
+ /// Start point Y coordinate
+ /// 4
+ /// </summary>
+ public string StartYExpression { get; set; } = "0";
+
+ public float StartY { get; set; }
+
+ /// <summary>
+ /// End point X coordinate
+ /// 5
+ /// </summary>
+ public string EndXExpression { get; set; } = "0";
+
+ public float EndX { get; set; }
+
+ /// <summary>
+ /// Start point Y coordinate
+ /// 6
+ /// </summary>
+ public string EndYExpression { get; set; } = "0";
+
+ public float EndY { get; set; }
+
+ /// <summary>
+ /// Rotation angle, in degrees counterclockwise, a decimal.
+ /// The primitive is rotated around the origin of the macro definition, i.e. the (0, 0) point of macro coordinates.
+ /// 7
+ /// </summary>
+ public string RotationExpression { get; set; } = "0";
+ public float Rotation { get; set; } = 0;
+ #endregion
+
+ protected VectorLinePrimitive() { }
+
+ public VectorLinePrimitive(string exposureExpression, string lineWidthExpression, string startXExpression, string startYExpression, string endXExpression, string endYExpression, string rotationExpression = "0")
+ {
+ ExposureExpression = exposureExpression;
+ LineWidthExpression = lineWidthExpression;
+ StartXExpression = startXExpression;
+ StartYExpression = startYExpression;
+ EndXExpression = endXExpression;
+ EndYExpression = endYExpression;
+ RotationExpression = rotationExpression;
+ }
+
+ public override void DrawFlashD3(Mat mat, SizeF xyPpmm, Point at, MCvScalar color, LineType lineType = LineType.EightConnected)
+ {
+ if (!IsParsed) return;
+ if (LineWidth <= 0) return;
+
+ if (Exposure == 0) color = EmguExtensions.BlackColor;
+ else if (color.V0 == 0) color = EmguExtensions.WhiteColor;
+
+ var pt1 = new Point(at.X + (int) (StartX * xyPpmm.Width), at.Y + (int) (StartY * xyPpmm.Height));
+ var pt2 = new Point(at.X + (int) (EndX * xyPpmm.Height), at.Y + (int) (EndY * xyPpmm.Height));
+ CvInvoke.Line(mat, pt1, pt2, color, (int)(LineWidth * xyPpmm.Height), lineType);
+ //CvInvoke.Rectangle(mat, rectangle, color, -1, lineType);
+ }
+
+ public override void ParseExpressions(params string[] args)
+ {
+ string csharpExp, result;
+ float num;
+ var exp = new DataTable();
+
+ if (byte.TryParse(ExposureExpression, out var exposure)) Exposure = exposure;
+ else
+ {
+ csharpExp = string.Format(Regex.Replace(ExposureExpression, @"\$(\d+)", "{$1}"), args);
+ result = exp.Compute(csharpExp, null).ToString()!;
+ if (byte.TryParse(result, out var val)) Exposure = val;
+ }
+
+ if (float.TryParse(LineWidthExpression, out num)) LineWidth = num;
+ else
+ {
+ csharpExp = Regex.Replace(LineWidthExpression, @"\$(\d+)", "{$1}");
+ csharpExp = string.Format(csharpExp, args);
+ result = exp.Compute(csharpExp, null).ToString()!;
+ if (float.TryParse(result, out var val)) LineWidth = val;
+ }
+
+ if (float.TryParse(StartXExpression, out num)) StartX = num;
+ else
+ {
+ csharpExp = Regex.Replace(StartXExpression, @"\$(\d+)", "{$1}");
+ csharpExp = string.Format(csharpExp, args);
+ result = exp.Compute(csharpExp, null).ToString()!;
+ if (float.TryParse(result, out num)) StartX = num;
+ }
+
+ if (float.TryParse(EndXExpression, out num)) EndX = num;
+ else
+ {
+ csharpExp = Regex.Replace(EndXExpression, @"\$(\d+)", "{$1}");
+ csharpExp = string.Format(csharpExp, args);
+ result = exp.Compute(csharpExp, null).ToString()!;
+ if (float.TryParse(result, out num)) EndX = num;
+ }
+
+ if (float.TryParse(StartYExpression, out num)) StartY = num;
+ else
+ {
+ csharpExp = Regex.Replace(StartYExpression, @"\$(\d+)", "{$1}");
+ csharpExp = string.Format(csharpExp, args);
+ result = exp.Compute(csharpExp, null).ToString()!;
+ if (float.TryParse(result, out num)) StartY = num;
+ }
+
+ if (float.TryParse(EndYExpression, out num)) EndY = num;
+ else
+ {
+ csharpExp = Regex.Replace(EndYExpression, @"\$(\d+)", "{$1}");
+ csharpExp = string.Format(csharpExp, args);
+ result = exp.Compute(csharpExp, null).ToString()!;
+ if (float.TryParse(result, out num)) EndY = num;
+ }
+
+
+ if (float.TryParse(RotationExpression, out num)) Rotation = (short)num;
+ else
+ {
+ csharpExp = Regex.Replace(RotationExpression, @"\$(\d+)", "{$1}");
+ csharpExp = string.Format(csharpExp, args);
+ result = exp.Compute(csharpExp, null).ToString()!;
+ if (float.TryParse(result, out num)) Rotation = num;
+ }
+
+ IsParsed = true;
+ }
+} \ No newline at end of file