Установка перемычки над проемом

Автор Тема: Установка перемычки над проемом  (Прочитано 4438 раз)

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

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

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

  • ADN OPEN
  • Сообщений: 27
  • Карма: 0
Добрый день!
Ситуация такова, что в стене находятся проемы (дверь или окно). Сверху посредине для каждого нужно установить перемычку (они присутствуют в проекте, я просто выбираю по имени необходимую):
Код - C# [Выбрать]
  1. Element bar = new FilteredElementCollector(document)
  2.     .WhereElementIsElementType().ToElements().Where(x => x.Name.Equals(nameOfBar)).First();
  3.  
Для каждого проема (окна, например) я получаю ширину, чтоб определить средину:
Код - C# [Выбрать]
  1. foreach (Element aperture in apertures)
  2. {
  3.     apertureWidth = aperture.get_Parameter(BuiltInParameter.WINDOW_WIDTH).AsDouble();
  4. }
  5.  
Как можно реализовать непосредственно установку перемычки?
« Последнее редактирование: 17-09-2020, 16:09:18 от asia »

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Установка перемычки над проемом
« Ответ #1 : 17-09-2020, 18:10:02 »
Краткий ответ: нужно разместить семейство.

Подробный: смотри методы document.Create.NewFamilyInstance, там overload-ов этого метода штук 12, поскольку пользовательские семейства все очень разные, т.е. они могут быть "обычные", могут быть на основе линии, могут размещаться на грани и т.д. Как у тебя сделано семейство этой перемычки мы не знаем, поэтому сказать, какой именно метод тебе нужен я не могу.

Да и ещё, у FamilySymbol нужно проверить свойство IsActive и при необходимости вызвать метод Activate().

Ещё я бы уточнил способ получения типоразмера семейства, обрати внимание, в API порядка 40 классов для создания фильтров, т.е. я бы скомбинировал поиск по категории, по классу FamilySymbol и добавил бы поиск по параметру-имени семейства и типоразмера. Например как-то так:
Код - C# [Выбрать]
  1. private static ElementFilter CreateFamilySymbolFilter(string familyName, string symbolName)
  2. {
  3.         var rules = new[]
  4.                 {
  5.                         ParameterFilterRuleFactory.CreateEqualsRule(new ElementId(BuiltInParameter.ALL_MODEL_FAMILY_NAME), familyName, false),
  6.                         ParameterFilterRuleFactory.CreateEqualsRule(new ElementId(BuiltInParameter.SYMBOL_NAME_PARAM), symbolName, false)
  7.                 };
  8.                
  9.         return new LogicalAndFilter(new ElementFilter[]
  10.                 {
  11.                         new ElementClassFilter(typeof(FamilySymbol)),
  12.                         new ElementCategoryFilter(BuiltInCategory.OST_StructuralFoundationTags), // категория твоего семейтства
  13.                         new ElementParameterFilter(rules)
  14.                 });
  15. }

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

  • ADN OPEN
  • Сообщений: 27
  • Карма: 0
Re: Установка перемычки над проемом
« Ответ #2 : 17-09-2020, 18:52:40 »
Спасибо! Буду разбираться.

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

  • ADN OPEN
  • Сообщений: 27
  • Карма: 0
Re: Установка перемычки над проемом
« Ответ #3 : 17-09-2020, 19:21:08 »
С помощью FamilyPlacementType определил, что семейство OneLevelBased.

Отмечено как Решение asia 18-09-2020, 09:31:44

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Установка перемычки над проемом
« Ответ #4 : 17-09-2020, 20:51:42 »
Тогда пробуй этим методом:
Код - C# [Выбрать]
  1. public FamilyInstance NewFamilyInstance(
  2.         XYZ location,
  3.         FamilySymbol symbol,
  4.         Level level,
  5.         StructuralType structuralType
  6. )

Вероятно, после вставки, придется повернуть методом:
Код - C# [Выбрать]
  1. ElementTransformUtils.RotateElement

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

  • ADN OPEN
  • Сообщений: 27
  • Карма: 0
Re: Установка перемычки над проемом
« Ответ #5 : 17-09-2020, 21:31:38 »
Метод работает, перемычка добавляется, но как ее расположить посредине над проемом в стене? Для этого мне нужно как-то задействовать ширину проема? Или в XYZ указывать, используя начальную и конечную точки проема для поиска центра?

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Установка перемычки над проемом
« Ответ #6 : 17-09-2020, 22:03:46 »
Из геометрии или bounding box-а проема получить, например. У тебя, похоже, что проемы - это окна, они имеют точку вставки, которую с вероятностью 99% можно просто поднять на Max.Z Bounding box-а проема. Может быть, толщину перемычки ещё учесть придется, тут опять же зависит от того, как всё замоделировано

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

  • ADN OPEN
  • Сообщений: 27
  • Карма: 0
Re: Установка перемычки над проемом
« Ответ #7 : 18-09-2020, 14:38:36 »
А можно ли как-то совместить центры? Вот я получаю центр boundingBox стены, чтоб посредине установить перемычку, но в центр устанавливается грань.
Код - C# [Выбрать]
  1. BoundingBoxXYZ wallBb= wall.get_BoundingBox(document.ActiveView);
  2.                     double wallCenter = (wallBb.Max.Y + wallBb.Min.Y) * 0.5;
  3.  




Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Установка перемычки над проемом
« Ответ #8 : 18-09-2020, 15:03:46 »
Подвинуть на половину ширины палки?

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

  • ADN OPEN
  • Сообщений: 27
  • Карма: 0
Re: Установка перемычки над проемом
« Ответ #9 : 18-09-2020, 16:20:43 »
А если палка у меня определяется как FamilySymbol, что мне нужно сделать чтоб получить boundingBox для нее?

Код - C# [Выбрать]
  1. FamilySymbol bar = new FilteredElementCollector(document)
  2.                 .WhereElementIsElementType().ToElements().Where(x => x.Name.Equals(barName)).First() as FamilySymbol;
  3.  
А создается так:
Код - C# [Выбрать]
  1. FamilyInstance barInstance = document.Create.NewFamilyInstance(point, bar, level, StructuralType.NonStructural);
  2.  
« Последнее редактирование: 18-09-2020, 20:04:13 от asia »

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Установка перемычки над проемом
« Ответ #10 : 22-09-2020, 16:24:37 »
после создания barInstance вызвать document.Regenerate(), затем получить bounding box из barInstance-а

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

  • ADN OPEN
  • Сообщений: 27
  • Карма: 0
Re: Установка перемычки над проемом
« Ответ #11 : 23-09-2020, 09:45:45 »
Александр Игнатович, спасибо! Разобрался, все работает.

Оффлайн RevitTormentor

  • ADN OPEN
  • ***
  • Сообщений: 162
  • Карма: 6
Re: Установка перемычки над проемом
« Ответ #12 : 06-10-2020, 13:02:58 »

Вероятно, после вставки, придется повернуть методом:
Код - C# [Выбрать]
  1. ElementTransformUtils.RotateElement

А на 270 градусов не должно быть проблем с поворотом?

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Установка перемычки над проемом
« Ответ #13 : 08-10-2020, 11:48:23 »
Нет. Можно на 270, можно на -90, как больше нравится

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

  • ADN OPEN
  • Сообщений: 27
  • Карма: 0
Re: Установка перемычки над проемом
« Ответ #14 : 22-10-2020, 09:20:53 »
Добрый день,
продолжая работу над установкой перемычек, столкнулся с проблемой. Решение через получение boundingBoxов проемов работает некорректно, если, допустим, в проекте несколько стен с разным направлением, максимумы/минимумы проемов в этих стенах уже другие. Подскажите, пожалуйста, как можно решить эту проблему, можно ли как-то получать глобальные координаты середин проемов, чтоб потом совмещать с серединами перемычек?

upd
Решил попробовать следующее: выбирать проем и получать хост-стену, появился вопрос: можно ли определить направление стены (запад/восток) или как-то получить фасад из вида?
Для северного и южного фасадов все работает корректно.


Возможно, лучшим вариантом было бы получать вектор направления стены, но как тогда его использовать в методе NewFamilyInstance?
« Последнее редактирование: 22-10-2020, 18:14:24 от asia »