Пересечение лестницы и комнаты

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

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

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Добрый день!
Мне нужно получить пересечение лестницы и комнаты, для этого хочу преобразовать лестницу в Solid и найти пересечение Solid-ов. Но возможно ли получить границы всей лестницы и преобразовать данные границы в Solid.
Пробовал через get_BoundingBox(), но это только для актиного вида модели, что не подходит.

Отмечено как Решение shss 19-05-2017, 14:53:06

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Пересечение лестницы и комнаты
« Ответ #1 : 18-05-2017, 20:51:43 »
Пока выкрутился, так:
Получаю 3D вид и, используя, его получаю BoundingBox лестницы:
Код - C# [Выбрать]
  1. Solid stairSolid = CreateSolidFromBoundingBox(stair, new FilteredElementCollector(doc).OfClass(typeof(View3D)).Cast<View3D>().FirstOrDefault<View3D>(e => e.Name.Equals("{3D}")));
И по BoundingBox создаю Solid:
Код - C# [Выбрать]
  1. public static Solid CreateSolidFromBoundingBox(Stairs stair, View view3D) {
  2.     BoundingBoxXYZ boundingBox = stair.get_BoundingBox(view3D);
  3.     XYZ point0 = new XYZ(boundingBox.Min.X, boundingBox.Min.Y, boundingBox.Min.Z);
  4.     XYZ point1 = new XYZ(boundingBox.Max.X, boundingBox.Min.Y, boundingBox.Min.Z);
  5.     XYZ point2 = new XYZ(boundingBox.Max.X, boundingBox.Max.Y, boundingBox.Min.Z);
  6.     XYZ point3 = new XYZ(boundingBox.Min.X, boundingBox.Max.Y, boundingBox.Min.Z);
  7.     Line edge0 = Line.CreateBound(point0, point1);
  8.     Line edge1 = Line.CreateBound(point1, point2);
  9.     Line edge2 = Line.CreateBound(point2, point3);
  10.     Line edge3 = Line.CreateBound(point3, point0);
  11.     List<Curve> edges = new List<Curve>();
  12.     edges.Add(edge0);
  13.     edges.Add(edge1);
  14.     edges.Add(edge2);
  15.     edges.Add(edge3);
  16.     List<CurveLoop> loopList = new List<CurveLoop>();
  17.     loopList.Add(CurveLoop.Create(edges));
  18.     Solid temporaryExtrusion = GeometryCreationUtilities.CreateExtrusionGeometry(loopList, XYZ.BasisZ, boundingBox.Max.Z - boundingBox.Min.Z);
  19.     Solid solid = SolidUtils.CreateTransformed(temporaryExtrusion, boundingBox.Transform);
  20.     return solid;
  21. }
Далее просто ищу пересечение Solid комнаты и Solid лестницы:
Код - C# [Выбрать]
  1. Solid intersection = BooleanOperationsUtils.ExecuteBooleanOperation(roomSolid, stairSolid, BooleanOperationsType.Intersect);

Но решение мне не нравится, за счет использования 3D вида, потому что в целом его может и не быть и тогда BoundingBox не будет определена.
Есть ли более "красивое" решение?

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Пересечение лестницы и комнаты
« Ответ #2 : 19-05-2017, 14:53:01 »
В итоге решил остановиться на этом варианте, потому что других вариантов не нашел :(.
При отсутствии 3D вида, генерирую автоматически.
Код - C# [Выбрать]
  1. RevitCommandId commandId = RevitCommandId.LookupPostableCommandId(PostableCommand.Default3DView);
  2. if (commandData.Application.CanPostCommand(commandId)) {
  3.     commandData.Application.PostCommand(commandId);
  4. }

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Пересечение лестницы и комнаты
« Ответ #3 : 22-05-2017, 06:47:41 »
Если еще актуально, то можно через геометрию объекта. Там не обязательно использовать 3D вид. Из геометрии извлекаешь все вершины. По минимальным и максимальным координатам у тебя получатся те же самые точки, что ты извлекаешь с помощью BoundingBox

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Пересечение лестницы и комнаты
« Ответ #4 : 22-05-2017, 07:11:41 »
Я пробовал через геометрию:
Код - C# [Выбрать]
  1. GeometryElement geometryElement = stair.get_Geometry(new Options());
  2. foreach (GeometryObject geometryObject in geometryElement){
  3. }
Но у меня все geometryObject были null.

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Пересечение лестницы и комнаты
« Ответ #5 : 22-05-2017, 08:09:00 »
Но у меня все geometryObject были null.
Подозрительно..
Вот что у меня через RevitLookup видно



Попробуй им же поглядеть свою лестницу

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Пересечение лестницы и комнаты
« Ответ #6 : 22-05-2017, 08:41:28 »
У моей лестницы другая картина:

В твоем примере есть свойство Solid, которое бы мне подошло, а у моей такого свойства нет.
А в чем заключается такое различие?

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Пересечение лестницы и комнаты
« Ответ #7 : 22-05-2017, 09:11:20 »
Картина другая, но, тем не менее, видно же, что геометрия не пустая. Так что вариант с геометрией можно добить.
Сам геометрия зависит видимо от типа лестницы. Как в итоге Revit ее разобьет, на какие объект - это уже за пределами моих знаний.
Solid кстати у меня пустой. Площадь поверхностей равна 0.

Но Solid есть у GeometryInstance. D В твоем случае правда их несколько. Я бы пробежался по всем и вершины получил.

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Пересечение лестницы и комнаты
« Ответ #8 : 22-05-2017, 09:14:58 »
Понял, посмотрю в этом направлении. Спасибо.
Видимо, на самом деле геометрия зависит от процесса создания семейства. Просто скачал несколько примеров лестниц, совершенно разные картины.