Как получить длину Мультилинии

Автор Тема: Как получить длину Мультилинии  (Прочитано 11303 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн zr74Автор темы

  • ADN OPEN
  • Сообщений: 47
  • Карма: 1
Добрый день всем, подскажите пожалуйста, как получить длину мультивыноски мультилинии, через curve код ошибку выдает.
« Последнее редактирование: 21-04-2023, 19:26:24 от Александр Ривилис »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как получить длину Мультилинии
« Ответ #1 : 21-04-2023, 19:17:58 »
zr74,
Мультилинии или мультивыноски?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: Как получить длину Мультилинии
« Ответ #2 : 21-04-2023, 19:19:21 »
Вы уж определитесь: мультилинии или мультивыноски? И если мультивыноски, то что собственно вы считаете ее длинной?

Оффлайн zr74Автор темы

  • ADN OPEN
  • Сообщений: 47
  • Карма: 1
Re: Как получить длину Мультилинии
« Ответ #3 : 21-04-2023, 19:25:14 »
Мультилинии, конечно, опечатка.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как получить длину Мультилинии
« Ответ #4 : 21-04-2023, 19:28:52 »
Мультилинии, конечно, опечатка.

Мультилиния не наследник Curve. Поэтому через неё не получится. Пользуйся методом VertexAt для получения координат вершин и суммируй расстояния между соседними вершинами. Если мультилиния замкнутая, то добавь еще расстояние от первой до последней точки.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн zr74Автор темы

  • ADN OPEN
  • Сообщений: 47
  • Карма: 1
Re: Как получить длину Мультилинии
« Ответ #5 : 21-04-2023, 20:18:13 »
Понял, спасибо, а как определить сколько всего вершин у мультилинии? Есть у метода VertexAt  служебный параметр, обозначающий последнюю вершину или их количество?

Оффлайн zr74Автор темы

  • ADN OPEN
  • Сообщений: 47
  • Карма: 1
Re: Как получить длину Мультилинии
« Ответ #6 : 21-04-2023, 20:26:13 »
NumberOfVertices?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как получить длину Мультилинии
« Ответ #7 : 21-04-2023, 20:34:02 »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Re: Как получить длину Мультилинии
« Ответ #8 : 24-04-2023, 08:34:00 »
что собственно вы считаете ее длинной?
Это тоже важно уточнить. Мультилиния как правило состоит из нескольких полилиний. Длины будут различаться.

Оффлайн zr74Автор темы

  • ADN OPEN
  • Сообщений: 47
  • Карма: 1
Re: Как получить длину Мультилинии
« Ответ #9 : 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.  
           

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: Как получить длину Мультилинии
« Ответ #10 : 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));

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как получить длину Мультилинии
« Ответ #11 : 24-04-2023, 10:33:40 »
avc,
Не учтен случай замкнутой мультилинии.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: Как получить длину Мультилинии
« Ответ #12 : 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.     }
« Последнее редактирование: 24-04-2023, 15:36:34 от Александр Ривилис »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как получить длину Мультилинии
« Ответ #13 : 24-04-2023, 11:46:37 »
avc,
Проверь подсчет периметра для Solid.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: Как получить длину Мультилинии
« Ответ #14 : 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);