Как найти точки пересечения с помощью IntersectWith?

Автор Тема: Как найти точки пересечения с помощью IntersectWith?  (Прочитано 193 раз)

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

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

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
Добрый день!
Мне нужно найти точку пересечения эллипса и луча для дальнейших построений, но почему-то функция IntersectWith выдаёт ошибку...
Я не очень хорошо разбираюсь в объектной модели автокад и программировании в нём, но вот мой код:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.Geometry;
  4. using Autodesk.AutoCAD.Runtime;
  5. using Autodesk.AutoCAD.EditorInput;
  6. using System;
  7. namespace Zigzag
  8. {    
  9.     public class Zigzag
  10.     {
  11.         [CommandMethod("DrawLine")]
  12.         public void DrawLine()
  13.         {
  14.             Database db = Application.DocumentManager.MdiActiveDocument.Database;
  15.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  16.             Ellipse el = null;
  17.             Ray ray = null;
  18.  
  19.             using (Transaction tr = db.TransactionManager.StartTransaction())
  20.             {
  21.                 try
  22.                 {
  23.                     BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); //получаем ссылку на модель чертежа
  24.                     BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  25.  
  26.                     Point3d center = new Point3d(0, 0, 0); //объявляем и задаём параметры для эллипса
  27.                     Vector3d normal = Vector3d.ZAxis;
  28.                     Vector3d majorAxis = new Vector3d(1000, 0.0, 0.0);
  29.                     el = new Ellipse(center, normal, majorAxis, 0.5, 0.0, Math.PI*2.0); //создаём экземпляр эллипса
  30.  
  31.                     using (el) //добавление эллипса в бд чертежа
  32.                     {
  33.                         btr.AppendEntity(el); //добавляем в пространство модели
  34.                         tr.AddNewlyCreatedDBObject(el, true); //запускаем транзакцию
  35.                     }
  36.    
  37.                     ray = new Ray(); //объявляем примитив чертежа
  38.                     ray.BasePoint = center;
  39.                     ray.SecondPoint = new Point3d(0, 1, 0);
  40.                     using (ray) //добавление луча в бд чертежа
  41.                     {
  42.                         btr.AppendEntity(ray);
  43.                         tr.AddNewlyCreatedDBObject(ray, true);
  44.                     }
  45.  
  46.                     Point3dCollection collection = new Point3dCollection();
  47.                     el.IntersectWith(ray, Intersect.ExtendThis, collection, IntPtr.Zero, IntPtr.Zero);
  48.  
  49.                     tr.Commit(); //коммитим транзакцию
  50.                 }
  51.                 catch (Autodesk.AutoCAD.Runtime.Exception ex)
  52.                 {
  53.                     ed.WriteMessage($"\n {ex.Message}");
  54.                 }
  55.             } //end using            
  56.         }
  57.     }
  58. }
Эллипс и луч строится без проблем, если закомментировать строку с поиском пересечения.
Прошу подсказку
« Последнее редактирование: 28-05-2026, 12:58:32 от Александр Ривилис »

Отмечено как Решение Klo 28-05-2026, 13:41:41

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

  • Administrator
  • *****
  • Сообщений: 13938
  • Карма: 1796
  • Рыцарь ObjectARX
  • Skype: rivilis
using (el) и using (ray) лишние. И какая ошибка возникает?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 865
  • Карма: 174
    • Мои плагины к Автокаду
Да, забавно вы сначала диспозите объекты луча и эллипса, а затем пытаетесь вызывать их методы. Объявляйте переменные внутри using чтоб не делать таких глупостей впредь. Да и есть же простой using без блока кода.
Хуже того, у вас переменные Ray и Ellipse объявлены вне блока кода транзакции, то есть будут жить после закрытия транзакции. Это прямой путь к фаталу AutoCAD, если попробуете их использовать после диспоза и закрытия транзакции. Не делайте так никогда.
И я что-то не уверен, что IntersectWith работает с бесконечными кривыми. Если будет сбой - замените на Ray на Line и соответственно поменяйте условие Intersect, что можно продлять линию (ExtendArgument).

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

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
using (el) и using (ray) лишние. И какая ошибка возникает?
спасибо огромное, помогло удаление лишних using!
Да, забавно вы сначала диспозите объекты луча и эллипса, а затем пытаетесь вызывать их методы. Объявляйте переменные внутри using чтоб не делать таких глупостей впредь.
тут не заметил. Просто хотел добавленный в модель чертежа примитив сохранить, чтобы использовать позднее, но, видимо, это не так надо было делать...

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 865
  • Карма: 174
    • Мои плагины к Автокаду
Просто хотел добавленный в модель чертежа примитив сохранить, чтобы использовать позднее, но, видимо, это не так надо было делать...
Если использовать - то внутри той же транзакции в том же методе. Если где-то еще надо будет использовать - то обязательно заново получать через транзакцию, а передавать в другие методы только ObjectId.

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

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
обязательно заново получать через транзакцию, а передавать в другие методы только ObjectId
так и подумал, спасибо!