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

ADN Club => AutoCAD .NET API => Тема начата: Вильдар от 15-10-2015, 15:49:32

Название: Проблема определения пересечения полилинии с блоком.
Отправлено: Вильдар от 15-10-2015, 15:49:32
Всем добрый день,

Нужно определить пересечение блока с полилинией. Тестовый чертеж прилагается.
Тестовый код:
Код - 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.       }    
Такой способ норм работал. Но попался странный блок, на котором это не работает. На тестовом чертеже он подписан "Проблемный".
Есть предположения, что может быть с этим блоком не так?
Спасибо!
Название: Re: Проблема определения пересечения полилинии с блоком.
Отправлено: Вильдар от 16-10-2015, 08:56:45
Решилось, добавлением параметра Plane в метод IntersectWith
Код - C# [Выбрать]
  1. Plane plane = poly.GetPlane();
  2. poly.IntersectWith(blRef, Intersect.ExtendBoth, plane, pts, IntPtr.Zero, IntPtr.Zero);
Типа, Extents блока и полилиния были на разных уровнях по Z. Хотя, блок в 0, и полилиния тоже.
Название: Re: Проблема определения пересечения полилинии с блоком.
Отправлено: Александр Ривилис от 16-10-2015, 12:59:20
Хотя, блок в 0, и полилиния тоже.
А Extents?
Название: Re: Проблема определения пересечения полилинии с блоком.
Отправлено: Вильдар от 16-10-2015, 13:01:43
В отладчике смотрел значения коодинаты Z у полилинии и у точек в GeometricExtents блока, везде они не равны 0 - числа со степенью близкие к 0.
Название: Re: Проблема определения пересечения полилинии с блоком.
Отправлено: Александр Ривилис от 16-10-2015, 13:03:47
Понятно. Скорее всего это проблемы работы с числами с плавающей точкой. Так что вариант с проекцией на плоскость самый правильный.