Пересечение коридора трубой

Автор Тема: Пересечение коридора трубой  (Прочитано 6471 раз)

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

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

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Здравствуйте!

Как определить пересекает ли труба коридор?

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Re: Пересечение коридора трубой
« Ответ #1 : 20-03-2019, 10:51:53 »
Я так подозреваю, что задача не имеет простого решения.
Какого-то прямого метода типа:
Код - C# [Выбрать]
  1. bool Corridor.IsIntersect(Pipe pipe)
или:
Код - C# [Выбрать]
  1. bool Pipe.IsIntersect(Corridor corridor)
явно нет.
Тут надо проявлять фантазию и смекалку: получить всё что можно из коридора и из трубы, а потом анализировать эту информацию.

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

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: Пересечение коридора трубой
« Ответ #2 : 20-03-2019, 10:55:21 »
этого я и боялся)
Спасибо! буду думать

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Re: Пересечение коридора трубой
« Ответ #3 : 20-03-2019, 11:02:56 »
Тут ещё вопрос - что считать пересечением? Например, если они в плане пересекаются, но труба проходит ниже - это считать пересечением? Или надо чтобы труба проходила через тело коридора?

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

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: Пересечение коридора трубой
« Ответ #4 : 20-03-2019, 11:05:37 »
именно в 3d, т е когда труба сквозь тело коридора проходит

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Re: Пересечение коридора трубой
« Ответ #5 : 20-03-2019, 11:15:01 »
Я так подозреваю, что если труба пересекает коридор, то она должна пересекать какую-то из его поверхностей. Можно попробовать от этого отталкиваться. Для получения точки пересечения поверхности и трубы вроде есть подходящий метод

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

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: Пересечение коридора трубой
« Ответ #6 : 20-03-2019, 11:39:31 »
а вот метод Entity.IntersectWith нашел
он применим тут? как то не получается его приручить

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Re: Пересечение коридора трубой
« Ответ #7 : 20-03-2019, 11:47:09 »
Все примитивы Civil 3D наследуют от AutoCAD.DatabaseServices.CurveEntity,  у которого есть этот метод. У некоторых объектов он реализован и даёт вполне адекватные результаты. Например, я одно время с помощью него получал точки пересечения труб c трассами. Но в случае более сложных объектов он, скорее всего, будет выдавать какую-то чушь.
P.S. Хотя, стоит его попробовать. Мало ли - вдруг случится чудо и он вернёт нужные точки.
« Последнее редактирование: 20-03-2019, 13:06:01 от Дмитрий Загорулькин »

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

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: Пересечение коридора трубой
« Ответ #8 : 20-03-2019, 12:34:05 »
Проблема все та же, не все коридоры имеют поверхности

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

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: Пересечение коридора трубой
« Ответ #9 : 20-03-2019, 13:01:36 »
P.S. Хотя, стоит его попробовать. Мало ли - вдруг случится чудо и он вернёт нужные точки.
точки пересечения он вернет в переданную коллекцию точек?

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Re: Пересечение коридора трубой
« Ответ #10 : 20-03-2019, 13:06:49 »
Пример из моей библиотеки:
Код - C# [Выбрать]
  1. /// <summary>
  2. ///
  3. /// </summary>
  4. /// <param name="alignment"></param>
  5. /// <param name="pipe"></param>
  6. /// <returns></returns>
  7. public static List<Point2d> IntersectWithPipe2d(this Alignment alignment, Pipe pipe)
  8. {
  9.     List<Point2d> ret = new List<Point2d>();
  10.  
  11.     try
  12.     {
  13.         if (pipe.Length3DCenterToCenter > 0.0 && alignment.Length > 0.0)
  14.         {
  15.             Point3dCollection col = new Point3dCollection();
  16.             Plane xy = new Plane(Point3d.Origin, Vector3d.ZAxis);
  17.             alignment.IntersectWith(pipe, Intersect.OnBothOperands, xy, col, IntPtr.Zero, IntPtr.Zero);
  18.  
  19.             foreach (Point3d pt in col)
  20.             {
  21.                 ret.Add(pt.Convert2d(xy));
  22.             }
  23.         }
  24.     }
  25.     catch (System.Exception ex)
  26.     {
  27.         Debug.WriteLine(ex.Message);
  28.         Debug.WriteLine(ex.StackTrace);
  29.     }
  30.  
  31.     return ret;
  32. }
  33.  

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

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: Пересечение коридора трубой
« Ответ #11 : 20-03-2019, 14:45:21 »
не удалось этим методом найти точки пересечения

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Пересечение коридора трубой
« Ответ #12 : 20-03-2019, 16:53:04 »
Проблема все та же, не все коридоры имеют поверхности
Думаю, что тебе нужно преобразовать коридор в Solid3d (пример здесь: https://forums.autodesk.com/t5/civil-3d-customization/how-could-i-export-corridor-to-solids-by-civil-3d-api/m-p/8625770/highlight/true#M16235 или команда EXPORTCORRIDORTOSOLIDS)
Аналогично из трубы получить Solid3d. Затем найти пересечение двух Solid3d. Если есть пересечение, то получится еще один Solid3d из которого можно взять точку центроида.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение