using Speckle.Objects.Geometry;
namespace Speckle.Objects;
public static class CurveTypeEncoding
{
public const double Arc = 0;
public const double Circle = 1;
public const double Curve = 2;
public const double Ellipse = 3;
public const double Line = 4;
public const double Polyline = 5;
public const double PolyCurve = 6;
}
///
/// This class is a helper class for Brep curve encoding!!
///
public static class CurveArrayEncodingExtensions
{
public static List ToArray(IReadOnlyCollection curves)
{
var list = new List();
foreach (var curve in curves)
{
switch (curve)
{
case Arc a:
list.AddRange(a.ToList());
break;
case Circle c:
list.AddRange(c.ToList());
break;
case Curve c:
list.AddRange(c.ToList());
break;
case Ellipse e:
list.AddRange(e.ToList());
break;
case Line l:
list.AddRange(l.ToList());
break;
case Polycurve p:
list.AddRange(p.ToList());
break;
case Polyline p:
list.AddRange(p.ToList());
break;
default:
throw new ArgumentOutOfRangeException(nameof(curves), $"Unkown curve type: {curve.GetType()}.");
}
}
return list;
}
public static List FromArray(List list)
{
var curves = new List();
if (list.Count == 0)
{
return curves;
}
var done = false;
var currentIndex = 0;
while (!done)
{
var itemLength = (int)list[currentIndex];
var item = list.GetRange(currentIndex, itemLength + 1);
switch (item[1])
{
case CurveTypeEncoding.Arc:
curves.Add(Arc.FromList(item));
break;
case CurveTypeEncoding.Circle:
curves.Add(Circle.FromList(item));
break;
case CurveTypeEncoding.Curve:
curves.Add(Curve.FromList(item));
break;
case CurveTypeEncoding.Ellipse:
curves.Add(Ellipse.FromList(item));
break;
case CurveTypeEncoding.Line:
curves.Add(Line.FromList(item));
break;
case CurveTypeEncoding.Polyline:
curves.Add(Polyline.FromList(item));
break;
case CurveTypeEncoding.PolyCurve:
curves.Add(Polycurve.FromList(item));
break;
}
currentIndex += itemLength + 1;
done = currentIndex >= list.Count;
}
return curves;
}
}