/// <summary>
/// Длина для кривых, Периметр для регионов и поверхностей
/// </summary>
public static double
GetPerimeter(this Entity ent)
{
if (ent is null || ent.IsErased)
return 0.0;
try
{
switch (ent)
{
case Line ln: return ln.Length;
case Polyline pl: return pl.Length;
case Polyline2d pl2: return pl2.Length;
case Polyline3d pl3: return pl3.Length;
case Arc ar: return ar.Length;
case Circle cir: return cir.Circumference;
case Curve cur: return cur.GetDistanceAtParameter(cur.EndParam) - cur.GetDistanceAtParameter(cur.StartParam);
case Region reg: return reg.Perimeter;
case Db.Surface sur: return sur.Perimeter;
case Mline mline:
double len = 0;
for (int i = 0; i < mline.NumberOfVertices-1; i++)
len += mline.VertexAt(i).DistanceTo(mline.VertexAt(i + 1));
if (mline.IsClosed && mline.NumberOfVertices > 1)
len += mline.VertexAt(0).DistanceTo(mline.VertexAt(mline.NumberOfVertices - 1));
return len;
case Solid sol:
{
// Исправлен порядок прохода по вершинам
Point3d p0 = sol.GetPointAt(0), p1 = sol.GetPointAt(1), p2 = sol.GetPointAt(2), p3 = sol.GetPointAt(3);
return p0.DistanceTo(p1) + p1.DistanceTo(p3) + p3.DistanceTo(p2) + p2.DistanceTo(p0);
}
case Face face:
{
Point3d p1 = face.GetVertexAt(0), p2 = face.GetVertexAt(1), p3 = face.GetVertexAt(2), p4 = face.GetVertexAt(3);
return p1.DistanceTo(p2) + p2.DistanceTo(p3) + p3.DistanceTo(p4) + p4.DistanceTo(p1);
}
}
}
catch { }
return 0.0;
}