Проблема определения пересечения полилинии с блоком.

Автор Тема: Проблема определения пересечения полилинии с блоком.  (Прочитано 8415 раз)

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

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Всем добрый день,

Нужно определить пересечение блока с полилинией. Тестовый чертеж прилагается.
Тестовый код:
Код - C# [Выбрать]
  1.       [CommandMethod("Test")]
  2.       public void Test ()
  3.       {
  4.          Document doc = Application.DocumentManager.MdiActiveDocument;
  5.          Editor ed = doc.Editor;
  6.          Database db = doc.Database;
  7.          using (var t = db.TransactionManager.StartTransaction() )
  8.          {
  9.             var prompt = ed.GetEntity("Выбери полилинию");
  10.             if (prompt.Status != PromptStatus.OK || prompt.ObjectId.ObjectClass.Name != "AcDbPolyline")
  11.             {
  12.                ed.WriteMessage("Не выбрана полилиния");
  13.                return;
  14.             }
  15.             var poly = t.GetObject(prompt.ObjectId, OpenMode.ForRead) as Polyline;
  16.             prompt = ed.GetEntity("Выбери блок");
  17.             if (prompt.Status != PromptStatus.OK || prompt.ObjectId.ObjectClass.Name != "AcDbBlockReference")
  18.             {
  19.                ed.WriteMessage("Не выбран блок");
  20.                return;
  21.             }                        
  22.             var blRef = t.GetObject(prompt.ObjectId, OpenMode.ForRead) as BlockReference;
  23.  
  24.             // Проверить - пересекаются ли блок и полилиния
  25.             bool isIntersect = false;
  26.             using (var pts = new Point3dCollection())
  27.             {
  28.                poly.IntersectWith(blRef, Intersect.ExtendBoth, pts, IntPtr.Zero, IntPtr.Zero);
  29.                isIntersect = pts.Count > 0;
  30.             }
  31.             ed.WriteMessage("\nПересекаются {0}", isIntersect);
  32.  
  33.             t.Commit();
  34.          }
  35.       }    
Такой способ норм работал. Но попался странный блок, на котором это не работает. На тестовом чертеже он подписан "Проблемный".
Есть предположения, что может быть с этим блоком не так?
Спасибо!

Отмечено как Решение Александр Ривилис 16-10-2015, 13:04:05

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Решилось, добавлением параметра Plane в метод IntersectWith
Код - C# [Выбрать]
  1. Plane plane = poly.GetPlane();
  2. poly.IntersectWith(blRef, Intersect.ExtendBoth, plane, pts, IntPtr.Zero, IntPtr.Zero);
Типа, Extents блока и полилиния были на разных уровнях по Z. Хотя, блок в 0, и полилиния тоже.

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

  • Administrator
  • *****
  • Сообщений: 13923
  • Карма: 1793
  • Рыцарь ObjectARX
  • Skype: rivilis
Хотя, блок в 0, и полилиния тоже.
А Extents?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
В отладчике смотрел значения коодинаты Z у полилинии и у точек в GeometricExtents блока, везде они не равны 0 - числа со степенью близкие к 0.

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

  • Administrator
  • *****
  • Сообщений: 13923
  • Карма: 1793
  • Рыцарь ObjectARX
  • Skype: rivilis
Понятно. Скорее всего это проблемы работы с числами с плавающей точкой. Так что вариант с проекцией на плоскость самый правильный.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение