ADN Club > AutoCAD .NET API

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

(1/2) > >>

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.

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии