SelectCrossingPolygon. Как отловить некорректный контур?

Автор Тема: SelectCrossingPolygon. Как отловить некорректный контур?  (Прочитано 19639 раз)

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

Оффлайн Константин Виноградов

  • ADN OPEN
  • Сообщений: 12
  • Карма: 2
Александр Ривилис, спасибо большое.

Оффлайн Алексей (IdeaSoft)

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Да кто же его знает, что еще может подразумеваться под "некорректным".

Под "некорректным" может быть скорее еще случай, когда координаты X и Y узлов совпадают.
Может еще на это стоит проверять?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Под "некорректным" может быть скорее еще случай, когда координаты X и Y узлов совпадают.
Может еще на это стоит проверять?
Речь о контуре для Editor.SelectCrossingPolygon? Если да, то несколько соображений на вскидку:
1. Точки должны передаваться в UCS (ПСК), а не в WCS (МСК).
2. Не думаю что совпадающие вершины будут мешать, но нужно проверять экспериментально. Возможно разное поведение в разных версиях AutoCAD.
3. Вершины должны быть в одной плоскости.
4. Не должно быть самопересекающихся сегментов.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Кирилл Захаров

  • ADN OPEN
  • ***
  • Сообщений: 119
  • Карма: 5
Здравствуйте, знаю, что это очень старая тема.
У меня тоже возникла необходимость проверять полилинии на самопересечение. Я решил эту проблему с помощью метода IntersectWith.
Хочу поделиться:
Код - C# [Выбрать]
  1.         private bool PolylineIsSelfIntersecting(Polyline poly)
  2.         {
  3.             Dictionary<Point3d, int?> polyPts = new Dictionary<Point3d, int?>();
  4.             int vertCount = poly.NumberOfVertices;
  5.             for (int i = 0; i < vertCount; i++)
  6.             {
  7.                 Point3d pt3d = poly.GetPoint3dAt(i);
  8.                 //Если точки повторяются, то есть самопересечение
  9.                 //Но допускается повторение первой и последней точек
  10.                 int? existPtNum = null;
  11.                 polyPts.TryGetValue(pt3d, out existPtNum);
  12.                 if (existPtNum==null//Такой точки не было
  13.                     ||(i== vertCount-1 && existPtNum==0))//Такая тока была, но это замыкание, а не самопересечение
  14.                 {
  15.                     polyPts[pt3d]= i;
  16.                 }
  17.                 else
  18.                     return true;  
  19.             }
  20.             //Использование метода IntersectWith
  21.             Point3dCollection intersectionPts = new Point3dCollection();
  22.             poly.IntersectWith(poly, Intersect.OnBothOperands, intersectionPts, IntPtr.Zero, IntPtr.Zero);
  23.  
  24.             foreach (Point3d intersectionPt in intersectionPts)
  25.             {
  26.                 if (!polyPts.Keys.Contains(intersectionPt))
  27.                 {
  28.                     return true;
  29.                 }
  30.             }
  31.  
  32.             return false;
  33.         }
  34.  

Оффлайн RevitTormentor

  • ADN OPEN
  • ***
  • Сообщений: 162
  • Карма: 6
1DhgvrWLWtLBt8hosfjNHt8Lqv8tK59F89
Иногда встречаю в примерах такие кракозябры. Это запутать взломщиков такая штука? Или это как то подвязано с ID кнопок на панели? Тоже у кого то встречал такое "запутанное" дело.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
1DhgvrWLWtLBt8hosfjNHt8Lqv8tK59F89
Иногда встречаю в примерах такие кракозябры. Это запутать взломщиков такая штука? Или это как то подвязано с ID кнопок на панели? Тоже у кого то встречал такое "запутанное" дело.
Где вы этот код нашли? Проверьте свой комп на вирусы/трояны.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн RevitTormentor

  • ADN OPEN
  • ***
  • Сообщений: 162
  • Карма: 6
Да я Александр не про свой комп, про примеры кода на форуме.
Например этот у Александра увидел

Код - C# [Выбрать]
  1.    private void DocumentManager_DocumentCreated(object sender, Autodesk.AutoCAD.ApplicationServices.1DhgvrWLWtLBt8hosfjNHt8Lqv8tK59F89 e)
  2.         {
  3.             AcApp.DocumentManager.MdiActiveDocument.ImpliedSelectionChanged -= MdiActiveDocument_ImpliedSelectionChanged;
  4.             AcApp.DocumentManager.MdiActiveDocument.ImpliedSelectionChanged += MdiActiveDocument_ImpliedSelectionChanged;
  5.         }
  6.  

Почему то не работает у меня вставка кода в виде кода. Попробовал в ручном режиме первый tag не помню как пишется
« Последнее редактирование: 04-02-2018, 14:40:29 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Да я Александр не про свой комп, про примеры кода на форуме.
Например этот у Александра увидел
У какого Александра? Где ссылка на пост с этим кодом?
Почему то не работает у меня вставка кода в виде кода.
Кто-бы сомневался. У тебя на компе вирус, связанный с Bitcoin. Поищи в гугле эту строку: 1DhgvrWLWtLBt8hosfjNHt8Lqv8tK59F89
У нас на сайте и форуме эта строка есть только в твоих сообщениях. В данном коде у тебя строка DocumentCollectionEventArgs заменена на 1DhgvrWLWtLBt8hosfjNHt8Lqv8tK59F89. Явный вирус.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн RevitTormentor

  • ADN OPEN
  • ***
  • Сообщений: 162
  • Карма: 6
Видимо да т.к. даже это сообщение я вижу вот так




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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Да. А должно было быть так:



Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Кирилл Захаров

  • ADN OPEN
  • ***
  • Сообщений: 119
  • Карма: 5
Еще раз, очень старая тема, но я еще хочу добавить по поводу проверки на самопересечение.
Сейчас в AutoCAD 2018 я пользуюсь таким методом:
Код - C# [Выбрать]
  1.         /// <summary>
  2.         /// Полилиния пересекает сама себя
  3.         /// </summary>
  4.         /// <param name="poly"></param>
  5.         /// <returns></returns>
  6.         public static bool PolylineIsSelfIntersecting(Polyline poly)
  7.         {
  8.             Curve3d curve3D = poly.GetGeCurve();
  9.             CurveCurveIntersector3d intersector = new CurveCurveIntersector3d(curve3D, curve3D, Vector3d.ZAxis);
  10.  
  11.             return intersector.NumberOfIntersectionPoints > 0;
  12.         }
  13.  
В документации к классу CurveCurveIntersector3d прямо сказано, что для нахождения самопересечений нужно передать в качестве параметров ссылку на одну и ту же кривую.
Я не знаю, есть ли этот класс в более старых версиях API.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Я не знаю, есть ли этот класс в более старых версиях API.
Есть как минимум с AutoCAD 2008.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение