ADN Club > AutoCAD .NET API
Как найти точки пересечения с помощью IntersectWith?
Klo:
Добрый день!
Мне нужно найти точку пересечения эллипса и луча для дальнейших построений, но почему-то функция IntersectWith выдаёт ошибку...
Я не очень хорошо разбираюсь в объектной модели автокад и программировании в нём, но вот мой код:
--- Код - C# [Выбрать] ---using Autodesk.AutoCAD.ApplicationServices;using Autodesk.AutoCAD.DatabaseServices;using Autodesk.AutoCAD.Geometry;using Autodesk.AutoCAD.Runtime;using Autodesk.AutoCAD.EditorInput;using System;namespace Zigzag{ public class Zigzag { [CommandMethod("DrawLine")] public void DrawLine() { Database db = Application.DocumentManager.MdiActiveDocument.Database; Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; Ellipse el = null; Ray ray = null; using (Transaction tr = db.TransactionManager.StartTransaction()) { try { BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); //получаем ссылку на модель чертежа BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite); Point3d center = new Point3d(0, 0, 0); //объявляем и задаём параметры для эллипса Vector3d normal = Vector3d.ZAxis; Vector3d majorAxis = new Vector3d(1000, 0.0, 0.0); el = new Ellipse(center, normal, majorAxis, 0.5, 0.0, Math.PI*2.0); //создаём экземпляр эллипса using (el) //добавление эллипса в бд чертежа { btr.AppendEntity(el); //добавляем в пространство модели tr.AddNewlyCreatedDBObject(el, true); //запускаем транзакцию } ray = new Ray(); //объявляем примитив чертежа ray.BasePoint = center; ray.SecondPoint = new Point3d(0, 1, 0); using (ray) //добавление луча в бд чертежа { btr.AppendEntity(ray); tr.AddNewlyCreatedDBObject(ray, true); } Point3dCollection collection = new Point3dCollection(); el.IntersectWith(ray, Intersect.ExtendThis, collection, IntPtr.Zero, IntPtr.Zero); tr.Commit(); //коммитим транзакцию } catch (Autodesk.AutoCAD.Runtime.Exception ex) { ed.WriteMessage($"\n {ex.Message}"); } } //end using } }}Эллипс и луч строится без проблем, если закомментировать строку с поиском пересечения.
Прошу подсказку
Александр Ривилис:
using (el) и using (ray) лишние. И какая ошибка возникает?
avc:
Да, забавно вы сначала диспозите объекты луча и эллипса, а затем пытаетесь вызывать их методы. Объявляйте переменные внутри using чтоб не делать таких глупостей впредь. Да и есть же простой using без блока кода.
Хуже того, у вас переменные Ray и Ellipse объявлены вне блока кода транзакции, то есть будут жить после закрытия транзакции. Это прямой путь к фаталу AutoCAD, если попробуете их использовать после диспоза и закрытия транзакции. Не делайте так никогда.
И я что-то не уверен, что IntersectWith работает с бесконечными кривыми. Если будет сбой - замените на Ray на Line и соответственно поменяйте условие Intersect, что можно продлять линию (ExtendArgument).
Klo:
--- Цитата: Александр Ривилис от 28-05-2026, 13:04:42 ---using (el) и using (ray) лишние. И какая ошибка возникает?
--- Конец цитаты ---
спасибо огромное, помогло удаление лишних using!
--- Цитата: avc от 28-05-2026, 13:15:14 ---Да, забавно вы сначала диспозите объекты луча и эллипса, а затем пытаетесь вызывать их методы. Объявляйте переменные внутри using чтоб не делать таких глупостей впредь.
--- Конец цитаты ---
тут не заметил. Просто хотел добавленный в модель чертежа примитив сохранить, чтобы использовать позднее, но, видимо, это не так надо было делать...
avc:
--- Цитата: Klo от 28-05-2026, 13:41:34 ---Просто хотел добавленный в модель чертежа примитив сохранить, чтобы использовать позднее, но, видимо, это не так надо было делать...
--- Конец цитаты ---
Если использовать - то внутри той же транзакции в том же методе. Если где-то еще надо будет использовать - то обязательно заново получать через транзакцию, а передавать в другие методы только ObjectId.
Навигация
Перейти к полной версии