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

ADN Club => Civil 3D API => Тема начата: simson43 от 20-03-2019, 10:38:41

Название: Пересечение коридора трубой
Отправлено: simson43 от 20-03-2019, 10:38:41
Здравствуйте!

Как определить пересекает ли труба коридор?
Название: Re: Пересечение коридора трубой
Отправлено: Дмитрий Загорулькин от 20-03-2019, 10:51:53
Я так подозреваю, что задача не имеет простого решения.
Какого-то прямого метода типа:
Код - C# [Выбрать]
  1. bool Corridor.IsIntersect(Pipe pipe)
или:
Код - C# [Выбрать]
  1. bool Pipe.IsIntersect(Corridor corridor)
явно нет.
Тут надо проявлять фантазию и смекалку: получить всё что можно из коридора и из трубы, а потом анализировать эту информацию.
Название: Re: Пересечение коридора трубой
Отправлено: simson43 от 20-03-2019, 10:55:21
этого я и боялся)
Спасибо! буду думать
Название: Re: Пересечение коридора трубой
Отправлено: Дмитрий Загорулькин от 20-03-2019, 11:02:56
Тут ещё вопрос - что считать пересечением? Например, если они в плане пересекаются, но труба проходит ниже - это считать пересечением? Или надо чтобы труба проходила через тело коридора?
Название: Re: Пересечение коридора трубой
Отправлено: simson43 от 20-03-2019, 11:05:37
именно в 3d, т е когда труба сквозь тело коридора проходит
Название: Re: Пересечение коридора трубой
Отправлено: Дмитрий Загорулькин от 20-03-2019, 11:15:01
Я так подозреваю, что если труба пересекает коридор, то она должна пересекать какую-то из его поверхностей (http://docs.autodesk.com/CIV3D/2019/ENU/API_Reference_Guide/html/7f2c3d51-06cc-410e-173a-66b3ea7470a2.htm). Можно попробовать от этого отталкиваться. Для получения точки пересечения поверхности и трубы вроде есть подходящий метод (http://docs.autodesk.com/CIV3D/2019/ENU/API_Reference_Guide/html/5fe781e7-9605-cf6f-e158-128acc988e5a.htm)
Название: Re: Пересечение коридора трубой
Отправлено: simson43 от 20-03-2019, 11:39:31
а вот метод Entity.IntersectWith нашел
он применим тут? как то не получается его приручить
Название: Re: Пересечение коридора трубой
Отправлено: Дмитрий Загорулькин от 20-03-2019, 11:47:09
Все примитивы Civil 3D наследуют от AutoCAD.DatabaseServices.CurveEntity,  у которого есть этот метод. У некоторых объектов он реализован и даёт вполне адекватные результаты. Например, я одно время с помощью него получал точки пересечения труб c трассами. Но в случае более сложных объектов он, скорее всего, будет выдавать какую-то чушь.
P.S. Хотя, стоит его попробовать. Мало ли - вдруг случится чудо и он вернёт нужные точки.
Название: Re: Пересечение коридора трубой
Отправлено: simson43 от 20-03-2019, 12:34:05
Проблема все та же, не все коридоры имеют поверхности
Название: Re: Пересечение коридора трубой
Отправлено: simson43 от 20-03-2019, 13:01:36
P.S. Хотя, стоит его попробовать. Мало ли - вдруг случится чудо и он вернёт нужные точки.
точки пересечения он вернет в переданную коллекцию точек?
Название: Re: Пересечение коридора трубой
Отправлено: Дмитрий Загорулькин от 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.  
Название: Re: Пересечение коридора трубой
Отправлено: simson43 от 20-03-2019, 14:45:21
не удалось этим методом найти точки пересечения
Название: Re: Пересечение коридора трубой
Отправлено: Александр Ривилис от 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 из которого можно взять точку центроида.