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

ADN Club => Revit API => Тема начата: shss от 18-05-2017, 16:28:20

Название: Пересечение лестницы и комнаты
Отправлено: shss от 18-05-2017, 16:28:20
Добрый день!
Мне нужно получить пересечение лестницы и комнаты, для этого хочу преобразовать лестницу в Solid и найти пересечение Solid-ов. Но возможно ли получить границы всей лестницы и преобразовать данные границы в Solid.
Пробовал через get_BoundingBox(), но это только для актиного вида модели, что не подходит.
Название: Re: Пересечение лестницы и комнаты
Отправлено: shss от 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 не будет определена.
Есть ли более "красивое" решение?
Название: Re: Пересечение лестницы и комнаты
Отправлено: shss от 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. }
Название: Re: Пересечение лестницы и комнаты
Отправлено: Виктор Чекалин от 22-05-2017, 06:47:41
Если еще актуально, то можно через геометрию объекта. Там не обязательно использовать 3D вид. Из геометрии извлекаешь все вершины. По минимальным и максимальным координатам у тебя получатся те же самые точки, что ты извлекаешь с помощью BoundingBox
Название: Re: Пересечение лестницы и комнаты
Отправлено: shss от 22-05-2017, 07:11:41
Я пробовал через геометрию:
Код - C# [Выбрать]
  1. GeometryElement geometryElement = stair.get_Geometry(new Options());
  2. foreach (GeometryObject geometryObject in geometryElement){
  3. }
Но у меня все geometryObject были null.
Название: Re: Пересечение лестницы и комнаты
Отправлено: Виктор Чекалин от 22-05-2017, 08:09:00
Но у меня все geometryObject были null.
Подозрительно..
Вот что у меня через RevitLookup видно

(https://s4.postimg.org/gx9kfa06h/2017-05-21_10-07.png) (https://postimg.org/image/gx9kfa06h/)

Попробуй им же поглядеть свою лестницу
Название: Re: Пересечение лестницы и комнаты
Отправлено: shss от 22-05-2017, 08:41:28
У моей лестницы другая картина:
(https://s27.postimg.org/tku72ncq7/Stair.png) (https://postimg.org/image/tku72ncq7/)
В твоем примере есть свойство Solid, которое бы мне подошло, а у моей такого свойства нет.
А в чем заключается такое различие?
Название: Re: Пересечение лестницы и комнаты
Отправлено: Виктор Чекалин от 22-05-2017, 09:11:20
Картина другая, но, тем не менее, видно же, что геометрия не пустая. Так что вариант с геометрией можно добить.
Сам геометрия зависит видимо от типа лестницы. Как в итоге Revit ее разобьет, на какие объект - это уже за пределами моих знаний.
Solid кстати у меня пустой. Площадь поверхностей равна 0.
(https://s11.postimg.org/e0bu2frj3/2017-05-22_1109.png) (https://postimg.org/image/e0bu2frj3/)
Но Solid есть у GeometryInstance. D В твоем случае правда их несколько. Я бы пробежался по всем и вершины получил.
Название: Re: Пересечение лестницы и комнаты
Отправлено: shss от 22-05-2017, 09:14:58
Понял, посмотрю в этом направлении. Спасибо.
Видимо, на самом деле геометрия зависит от процесса создания семейства. Просто скачал несколько примеров лестниц, совершенно разные картины.