214 lines
5.0 KiB
C#
214 lines
5.0 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
|
|
namespace DeepNestLib
|
|
{
|
|
public class NFP : IStringify
|
|
{
|
|
public int Z;
|
|
public bool fitted { get { return sheet != null; } }
|
|
public NFP sheet;
|
|
public object Tag;
|
|
public override string ToString()
|
|
{
|
|
var str1 = (Points != null) ? Points.Count() + "" : "null";
|
|
return $"nfp: id: {id}; source: {source}; rotation: {rotation}; points: {str1}";
|
|
}
|
|
public NFP()
|
|
{
|
|
Points = new SvgPoint[] { };
|
|
}
|
|
|
|
public string Name { get; set; }
|
|
public void AddPoint(SvgPoint point)
|
|
{
|
|
var list = Points.ToList();
|
|
list.Add(point);
|
|
Points = list.ToArray();
|
|
}
|
|
|
|
#region gdi section
|
|
public bool isBin;
|
|
|
|
#endregion
|
|
public void reverse()
|
|
{
|
|
Points = Points.Reverse().ToArray();
|
|
}
|
|
|
|
public StringBuilder GetXml()
|
|
{
|
|
StringBuilder sb = new StringBuilder();
|
|
sb.AppendLine("<?xml version=\"1.0\"?>");
|
|
sb.AppendLine("<root>");
|
|
sb.AppendLine("<region>");
|
|
foreach (var item in Points)
|
|
{
|
|
sb.AppendLine($"<point x=\"{item.x}\" y=\"{item.y}\"/>");
|
|
}
|
|
sb.AppendLine("</region>");
|
|
if (children != null)
|
|
foreach (var item in children)
|
|
{
|
|
sb.AppendLine("<region>");
|
|
foreach (var citem in item.Points)
|
|
{
|
|
sb.AppendLine($"<point x=\"{citem.x}\" y=\"{citem.y}\"/>");
|
|
}
|
|
sb.AppendLine("</region>");
|
|
}
|
|
|
|
sb.AppendLine("</root>");
|
|
|
|
return sb;
|
|
}
|
|
public double x { get; set; }
|
|
public double y { get; set; }
|
|
|
|
public double WidthCalculated
|
|
{
|
|
get
|
|
{
|
|
var maxx = Points.Max(z => z.x);
|
|
var minx = Points.Min(z => z.x);
|
|
|
|
return maxx - minx;
|
|
}
|
|
}
|
|
|
|
public double HeightCalculated
|
|
{
|
|
get
|
|
{
|
|
var maxy = Points.Max(z => z.y);
|
|
var miny = Points.Min(z => z.y);
|
|
return maxy - miny;
|
|
}
|
|
}
|
|
|
|
public SvgPoint this[int ind]
|
|
{
|
|
get
|
|
{
|
|
return Points[ind];
|
|
}
|
|
}
|
|
|
|
public List<NFP> children;
|
|
|
|
|
|
|
|
|
|
public int Length
|
|
{
|
|
get
|
|
{
|
|
return Points.Length;
|
|
}
|
|
}
|
|
|
|
//public float? width;
|
|
//public float? height;
|
|
public int length
|
|
{
|
|
get
|
|
{
|
|
return Points.Length;
|
|
}
|
|
}
|
|
|
|
public int Id;
|
|
public int id
|
|
{
|
|
get
|
|
{
|
|
return Id;
|
|
}
|
|
set
|
|
{
|
|
Id = value;
|
|
}
|
|
}
|
|
|
|
public double? offsetx;
|
|
public double? offsety;
|
|
public int? source = null;
|
|
public float Rotation;
|
|
|
|
public float rotation
|
|
{
|
|
get
|
|
{
|
|
return Rotation;
|
|
}
|
|
set
|
|
{
|
|
Rotation = value;
|
|
}
|
|
}
|
|
public SvgPoint[] Points;
|
|
public float Area
|
|
{
|
|
get
|
|
{
|
|
float ret = 0;
|
|
if (Points.Length < 3) return 0;
|
|
List<SvgPoint> pp = new List<SvgPoint>();
|
|
pp.AddRange(Points);
|
|
pp.Add(Points[0]);
|
|
for (int i = 1; i < pp.Count; i++)
|
|
{
|
|
var s0 = pp[i - 1];
|
|
var s1 = pp[i];
|
|
ret += (float)(s0.x * s1.y - s0.y * s1.x);
|
|
}
|
|
return (float)Math.Abs(ret / 2);
|
|
}
|
|
}
|
|
|
|
public void push(SvgPoint svgPoint)
|
|
{
|
|
List<SvgPoint> points = new List<SvgPoint>();
|
|
if (Points == null)
|
|
{
|
|
Points = new SvgPoint[] { };
|
|
}
|
|
points.AddRange(Points);
|
|
points.Add(svgPoint);
|
|
Points = points.ToArray();
|
|
|
|
}
|
|
|
|
public NFP slice(int v)
|
|
{
|
|
var ret = new NFP();
|
|
List<SvgPoint> pp = new List<SvgPoint>();
|
|
for (int i = v; i < length; i++)
|
|
{
|
|
pp.Add(new SvgPoint(this[i].x, this[i].y));
|
|
|
|
}
|
|
ret.Points = pp.ToArray();
|
|
return ret;
|
|
}
|
|
|
|
public string stringify()
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
public static NFP Create(params SvgPoint[] points)
|
|
{
|
|
if (points == null || points.Length == 0)
|
|
return new NFP();
|
|
else
|
|
return new NFP
|
|
{
|
|
Points = points
|
|
};
|
|
}
|
|
}
|
|
}
|