Пересечение конуса и линии

Автор Тема: Пересечение конуса и линии  (Прочитано 10918 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Здравствуйте!
Пытаюсь найти конусы сквозь которые проходит линия. При вызове на конусе 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.         }

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Пересечение конуса и линии
« Ответ #1 : 07-12-2021, 12:42:51 »
Пробуй через BREP .NET API: BrepEntity.GetLineContainment
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
Re: Пересечение конуса и линии
« Ответ #2 : 07-12-2021, 13:12:19 »
del

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Пересечение конуса и линии
« Ответ #3 : 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. Ошибка та же, как это исправить?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Пересечение конуса и линии
« Ответ #4 : 07-12-2021, 15:53:52 »
На строке Hit[] hits = brepEntity.GetLineContainment(target, 1) хватаю fatal error. LineSegment3d ранее пытался менять на Line3d. Ошибка та же, как это исправить?
Думаю. что это баг в конкретной версии и никак не исправить.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Пересечение конуса и линии
« Ответ #5 : 07-12-2021, 16:47:18 »
Думаю. что это баг в конкретной версии и никак не исправить.
То есть найти конусы сквозь которые проходит линия в акаде 2015 нельзя? Или может есть какой-нибудь другой способ?

Отмечено как Решение Atomohod 09-12-2021, 12:56:52

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Пересечение конуса и линии
« Ответ #6 : 07-12-2021, 16:56:46 »
Или может есть какой-нибудь другой способ?
Сделать из линии тонкий цилиндр и используя метод Solid3d.CheckInterference проверить пересечение.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Пересечение конуса и линии
« Ответ #7 : 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) - это может быть существенным.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Пересечение конуса и линии
« Ответ #8 : 08-12-2021, 09:02:56 »
вместо Brep(Entity) используется Brep(FullSubentityPath) - это может быть существенным.
переписал с учетом этого - ошибка не исчезла.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Пересечение конуса и линии
« Ответ #9 : 08-12-2021, 09:05:13 »
Код из статьи проверил?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Пересечение конуса и линии
« Ответ #10 : 08-12-2021, 09:24:47 »
Код из статьи проверил?
Полностью я его не использовал, понял Ваш коммент как то, что важно каким образом идет создание Brep и нужно обратить внимание на это.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Пересечение конуса и линии
« Ответ #11 : 08-12-2021, 15:22:43 »
Код из статьи проверил?
Полностью я его не использовал, понял Ваш коммент как то, что важно каким образом идет создание Brep и нужно обратить внимание на это.
А если попробовать его полностью? Если работать не будет и будет Fatal (именно Fatal, а не какое-то исключение), то это баг в конкретной версии AutoCAD и значит нужно использовать другой способ (например, с цилиндром, как я предложил выше). А если заработает, то сравнивай со своим кодом и ищи где у тебя ошибка. Как бы очевидный способ отладки.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Пересечение конуса и линии
« Ответ #12 : 08-12-2021, 23:08:55 »
Я не поленился и проверил код, ссылку на который я дал выше в AutoCAD 2015 SP2 - всё замечательно работает и никаких Fatal Error нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Пересечение конуса и линии
« Ответ #13 : 09-12-2021, 12:56:27 »
например, с цилиндром, как я предложил выше
Спасибо за идею, я переделал свой код этим способом.