Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: zr74 от 21-04-2023, 19:12:49

Название: Как получить длину Мультилинии
Отправлено: zr74 от 21-04-2023, 19:12:49
Добрый день всем, подскажите пожалуйста, как получить длину мультивыноски мультилинии, через curve код ошибку выдает.
Название: Re: Как получить длину Мультилинии
Отправлено: Александр Ривилис от 21-04-2023, 19:17:58
zr74,
Мультилинии или мультивыноски?
Название: Re: Как получить длину Мультилинии
Отправлено: avc от 21-04-2023, 19:19:21
Вы уж определитесь: мультилинии или мультивыноски? И если мультивыноски, то что собственно вы считаете ее длинной?
Название: Re: Как получить длину Мультилинии
Отправлено: zr74 от 21-04-2023, 19:25:14
Мультилинии, конечно, опечатка.
Название: Re: Как получить длину Мультилинии
Отправлено: Александр Ривилис от 21-04-2023, 19:28:52
Мультилинии, конечно, опечатка.

Мультилиния не наследник Curve. Поэтому через неё не получится. Пользуйся методом VertexAt для получения координат вершин и суммируй расстояния между соседними вершинами. Если мультилиния замкнутая, то добавь еще расстояние от первой до последней точки.
Название: Re: Как получить длину Мультилинии
Отправлено: zr74 от 21-04-2023, 20:18:13
Понял, спасибо, а как определить сколько всего вершин у мультилинии? Есть у метода VertexAt  служебный параметр, обозначающий последнюю вершину или их количество?
Название: Re: Как получить длину Мультилинии
Отправлено: zr74 от 21-04-2023, 20:26:13
NumberOfVertices?
Название: Re: Как получить длину Мультилинии
Отправлено: Александр Ривилис от 21-04-2023, 20:34:02
NumberOfVertices?
Угу.
Название: Re: Как получить длину Мультилинии
Отправлено: Привалов Дмитрий от 24-04-2023, 08:34:00
что собственно вы считаете ее длинной?
Это тоже важно уточнить. Мультилиния как правило состоит из нескольких полилиний. Длины будут различаться.
Название: Re: Как получить длину Мультилинии
Отправлено: zr74 от 24-04-2023, 09:06:07
Код - C# [Выбрать]
  1. var mline = (Mline)tr.GetObject(id, OpenMode.ForRead);
  2. for (int i = 0; i < mline.NumberOfVertices; i++)
  3. {
  4.    if ((i + 1) < mline.NumberOfVertices)
  5.    {
  6.       mlinePipe.LengthPipe += mline.VertexAt(i).DistanceTo(mline.VertexAt(i + 1));
  7.    }
  8. }        
  9.  
           
Название: Re: Как получить длину Мультилинии
Отправлено: avc от 24-04-2023, 09:55:14
Код - C# [Выбрать]
  1. var mline = (Mline)tr.GetObject(id, OpenMode.ForRead);
  2. for (int i = 0; i < mline.NumberOfVertices - 1; i++)
  3.       mlinePipe.LengthPipe += mline.VertexAt(i).DistanceTo(mline.VertexAt(i + 1));
Название: Re: Как получить длину Мультилинии
Отправлено: Александр Ривилис от 24-04-2023, 10:33:40
avc,
Не учтен случай замкнутой мультилинии.
Название: Re: Как получить длину Мультилинии
Отправлено: avc от 24-04-2023, 11:28:32
Код - C# [Выбрать]
  1.     /// <summary>
  2.     /// Длина для кривых, Периметр для регионов и поверхностей
  3.     /// </summary>
  4.     public static double
  5.     GetPerimeter(this Entity ent)
  6.     {
  7.       if (ent is null || ent.IsErased)
  8.         return 0.0;
  9.       try
  10.       {
  11.         switch (ent)
  12.         {
  13.           case Line ln: return ln.Length;
  14.           case Polyline pl: return pl.Length;
  15.           case Polyline2d pl2: return pl2.Length;
  16.           case Polyline3d pl3: return pl3.Length;
  17.           case Arc ar: return ar.Length;
  18.           case Circle cir: return cir.Circumference;
  19.           case Curve cur: return cur.GetDistanceAtParameter(cur.EndParam) - cur.GetDistanceAtParameter(cur.StartParam);
  20.           case Region reg: return reg.Perimeter;
  21.           case Db.Surface sur: return sur.Perimeter;
  22.           case Mline mline:
  23.             double len = 0;
  24.             for (int i = 0; i < mline.NumberOfVertices-1; i++)
  25.               len += mline.VertexAt(i).DistanceTo(mline.VertexAt(i + 1));
  26.             if (mline.IsClosed && mline.NumberOfVertices > 1)
  27.               len += mline.VertexAt(0).DistanceTo(mline.VertexAt(mline.NumberOfVertices - 1));
  28.             return len;
  29.           case Solid sol:
  30.             {
  31.               // Исправлен порядок прохода по вершинам
  32.               Point3d p0 = sol.GetPointAt(0), p1 = sol.GetPointAt(1), p2 = sol.GetPointAt(2), p3 = sol.GetPointAt(3);
  33.               return p0.DistanceTo(p1) + p1.DistanceTo(p3) + p3.DistanceTo(p2) + p2.DistanceTo(p0);
  34.             }
  35.           case Face face:
  36.             {
  37.               Point3d p1 = face.GetVertexAt(0), p2 = face.GetVertexAt(1), p3 = face.GetVertexAt(2), p4 = face.GetVertexAt(3);
  38.               return p1.DistanceTo(p2) + p2.DistanceTo(p3) + p3.DistanceTo(p4) + p4.DistanceTo(p1);
  39.             }
  40.         }
  41.       }
  42.       catch { }
  43.       return 0.0;
  44.     }
Название: Re: Как получить длину Мультилинии
Отправлено: Александр Ривилис от 24-04-2023, 11:46:37
avc,
Проверь подсчет периметра для Solid.
Название: Re: Как получить длину Мультилинии
Отправлено: avc от 24-04-2023, 12:08:14
Похоже там какой-то хитрый порядок точек. Методом научного тыка получается надо  0-1-3-2-0
Код - C# [Выбрать]
  1.               Point3d p0 = sol.GetPointAt(0), p1 = sol.GetPointAt(1), p2 = sol.GetPointAt(2), p3 = sol.GetPointAt(3);
  2.               return p0.DistanceTo(p1) + p1.DistanceTo(p3) + p3.DistanceTo(p2) + p2.DistanceTo(p0);
Название: Re: Как получить длину Мультилинии
Отправлено: Александр Ривилис от 24-04-2023, 12:54:23
avc,
Ага. 30 лет назад я тоже этому удивлялся.