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

ADN Club => AutoCAD .NET API => Тема начата: Atomohod от 07-12-2021, 11:51:27

Название: Пересечение конуса и линии
Отправлено: Atomohod от 07-12-2021, 11:51:27
Здравствуйте!
Пытаюсь найти конусы сквозь которые проходит линия. При вызове на конусе intersectWith получаю ошибку см. скрин. То есть этот метод не подходит, как тогда решить задачу поиска прохождения линий сквозь конус?
Мой метод
Код - C# [Выбрать]
  1. public ObjectIdCollection FindCones(ObjectId edgeId)
  2.         {
  3.             Document doc = Application.DocumentManager.MdiActiveDocument;
  4.             Database db = doc.Database;
  5.             Transaction tr = db.TransactionManager.StartTransaction();
  6.             ObjectIdCollection boundaries = new ObjectIdCollection();
  7.             using (tr)
  8.             {
  9.                 Entity edge = (Entity)tr.GetObject(edgeId, OpenMode.ForRead);
  10.                 Point3dCollection ptcol = new Point3dCollection();
  11.  
  12.                 BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead, false, false);
  13.                 BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace],  OpenMode.ForRead);
  14.                 foreach (ObjectId item in btr)
  15.                 {
  16.                     Entity ent = (Entity)tr.GetObject(item, OpenMode.ForRead);
  17.                     if (ent is Solid3d cone)
  18.                     {
  19.                         cone.IntersectWith(edge, Intersect.OnBothOperands, ptcol, IntPtr.Zero, IntPtr.Zero);
  20.                         if (ptcol.Count>0)
  21.                         {
  22.                             boundaries.Add(ent.ObjectId);
  23.                         }
  24.                     }
  25.                 }
  26.  
  27.                 tr.Commit();
  28.             }
  29.  
  30.             return boundaries;
  31.         }
Название: Re: Пересечение конуса и линии
Отправлено: Александр Ривилис от 07-12-2021, 12:42:51
Пробуй через BREP .NET API: BrepEntity.GetLineContainment
Название: Re: Пересечение конуса и линии
Отправлено: trir от 07-12-2021, 13:12:19
del
Название: Re: Пересечение конуса и линии
Отправлено: Atomohod от 07-12-2021, 15:29:34
Переписал код следующим образом:
Код - C# [Выбрать]
  1.  public ObjectIdCollection FindCones(ObjectId edgeId)
  2.         {
  3.             Document doc = Application.DocumentManager.MdiActiveDocument;
  4.             Database db = doc.Database;
  5.             Transaction tr = db.TransactionManager.StartTransaction();
  6.             ObjectIdCollection boundaries = new ObjectIdCollection();
  7.             using (tr)
  8.             {
  9.                 Line edge = (Line)tr.GetObject(edgeId, OpenMode.ForRead);
  10.                 Point3dCollection ptcol = new Point3dCollection();
  11.  
  12.                 BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead, false, false);
  13.                 BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace],  OpenMode.ForRead);
  14.                 foreach (ObjectId item in btr)
  15.                 {
  16.                     Entity ent = (Entity)tr.GetObject(item, OpenMode.ForRead);
  17.                     if (ent is Solid3d)
  18.                     {
  19.                         LineSegment3d target = new LineSegment3d(edge.StartPoint, edge.EndPoint);
  20.                         Brep brepEntity = new Brep(ent);
  21.                         Hit[] hits = brepEntity.GetLineContainment(target, 1);                      
  22.                         if (hits.Length>0)
  23.                         {
  24.                             boundaries.Add(ent.ObjectId);
  25.                         }
  26.                     }
  27.                 }
  28.  
  29.                 tr.Commit();
  30.             }
  31.  
  32.             return boundaries;
  33.         }

На строке Hit[] hits = brepEntity.GetLineContainment(target, 1) хватаю fatal error. LineSegment3d ранее пытался менять на Line3d. Ошибка та же, как это исправить?
Название: Re: Пересечение конуса и линии
Отправлено: Александр Ривилис от 07-12-2021, 15:53:52
На строке Hit[] hits = brepEntity.GetLineContainment(target, 1) хватаю fatal error. LineSegment3d ранее пытался менять на Line3d. Ошибка та же, как это исправить?
Думаю. что это баг в конкретной версии и никак не исправить.
Название: Re: Пересечение конуса и линии
Отправлено: Atomohod от 07-12-2021, 16:47:18
Думаю. что это баг в конкретной версии и никак не исправить.
То есть найти конусы сквозь которые проходит линия в акаде 2015 нельзя? Или может есть какой-нибудь другой способ?
Название: Re: Пересечение конуса и линии
Отправлено: Александр Ривилис от 07-12-2021, 16:56:46
Или может есть какой-нибудь другой способ?
Сделать из линии тонкий цилиндр и используя метод Solid3d.CheckInterference проверить пересечение.
Название: Re: Пересечение конуса и линии
Отправлено: Александр Ривилис от 07-12-2021, 17:19:49
А вообще попробуй код из этой темы: https://adn-cis.org/kak-poluchit-peresechenie-pryamoj-i-tverdogo-tela-v-net.html
Там есть важное отличие в создании Brep: вместо Brep(Entity) используется Brep(FullSubentityPath) - это может быть существенным.
Название: Re: Пересечение конуса и линии
Отправлено: Atomohod от 08-12-2021, 09:02:56
вместо Brep(Entity) используется Brep(FullSubentityPath) - это может быть существенным.
переписал с учетом этого - ошибка не исчезла.
Название: Re: Пересечение конуса и линии
Отправлено: Александр Ривилис от 08-12-2021, 09:05:13
Код из статьи проверил?
Название: Re: Пересечение конуса и линии
Отправлено: Atomohod от 08-12-2021, 09:24:47
Код из статьи проверил?
Полностью я его не использовал, понял Ваш коммент как то, что важно каким образом идет создание Brep и нужно обратить внимание на это.
Название: Re: Пересечение конуса и линии
Отправлено: Александр Ривилис от 08-12-2021, 15:22:43
Код из статьи проверил?
Полностью я его не использовал, понял Ваш коммент как то, что важно каким образом идет создание Brep и нужно обратить внимание на это.
А если попробовать его полностью? Если работать не будет и будет Fatal (именно Fatal, а не какое-то исключение), то это баг в конкретной версии AutoCAD и значит нужно использовать другой способ (например, с цилиндром, как я предложил выше). А если заработает, то сравнивай со своим кодом и ищи где у тебя ошибка. Как бы очевидный способ отладки.
Название: Re: Пересечение конуса и линии
Отправлено: Александр Ривилис от 08-12-2021, 23:08:55
Я не поленился и проверил код, ссылку на который я дал выше в AutoCAD 2015 SP2 - всё замечательно работает и никаких Fatal Error нет.
Название: Re: Пересечение конуса и линии
Отправлено: Atomohod от 09-12-2021, 12:56:27
например, с цилиндром, как я предложил выше
Спасибо за идею, я переделал свой код этим способом.