Получение окон по сегментам границы помещения

Автор Тема: Получение окон по сегментам границы помещения  (Прочитано 3755 раз)

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

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

  • ADN OPEN
  • ***
  • Сообщений: 117
  • Карма: 4
Здравствуйте уважаемые коллеги, подскажите как можно получить окна на определенном участке стены, т.е наружной стены. вот так получаю наружные стены https://thebuildingcoder.typepad.com/blog/2009/01/room-and-wall-adjacency.html
Если стена содержит слова "Exterior" значит наружная, так вот  там получают границы помещения так room.GetBoundarySegments(new SpatialElementBoundaryOptions()), и длину этого сегмента указываю как длина стены, вопрос можно ли по этому сегменту как то получить окно?
« Последнее редактирование: 11-01-2021, 19:40:56 от Yusuf »

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

  • ADN OPEN
  • ***
  • Сообщений: 117
  • Карма: 4
Наверно окна лучше получить другим путем, найти все помещения найти там все окна, а потом найти все стены, на которой это окно расположено и отсортировать по названию типа стены, кажется так будет лучше, это решение или есть более удобный способ ?

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
1) Смотри, стена - это HostObject, у него есть метод FindInserts - позволяет находить окна, двери, проемы и т.д.

2) Дальше нужно определить, окошко это заданного помещения или нет. Тут больше подойдет SpatialElementGeometryCalculator, а не просто получение сегментов.
Создаешь его, вызываешь метод CalculateSpatialElementGeometry, возвращается SpatialElementGeometryResults, дальше получаешь solid помещения методом SpatialElementGeometryResults.GetGeometry, перебираешь его face-ы, для каждого вызываешь SpatialElementGeometryResults.GetBoundaryFaceInfo - получаешь SpatialElementBoundarySubface-ы, смотришь SpatialBoundaryElement, если это стенка, то находишь в ней окошки, из SpatialElementBoundarySubface вызываешь GetSpatialElementFace (The face of the spatial element's 3D geometry - поверхность solid-а помещения) и анализируешь, находится ли окошко в границах этого face-а. Тут уже зависит от твоей конкретной задачи и фантазий архитекторов, возможно хватит проверки того, что locationpoint инстанса семейства окошка проецируется на этот face. Возможно, нет, если у тебя какие-то нереально большие окна - одно окно на несколько помещений.

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

  • ADN OPEN
  • ***
  • Сообщений: 117
  • Карма: 4
1) Смотри, стена - это HostObject, у него есть метод FindInserts - позволяет находить окна, двери, проемы и т.д.

2) Дальше нужно определить, окошко это заданного помещения или нет. Тут больше подойдет SpatialElementGeometryCalculator, а не просто получение сегментов.
Создаешь его, вызываешь метод CalculateSpatialElementGeometry, возвращается SpatialElementGeometryResults, дальше получаешь solid помещения методом SpatialElementGeometryResults.GetGeometry, перебираешь его face-ы, для каждого вызываешь SpatialElementGeometryResults.GetBoundaryFaceInfo - получаешь SpatialElementBoundarySubface-ы, смотришь SpatialBoundaryElement, если это стенка, то находишь в ней окошки, из SpatialElementBoundarySubface вызываешь GetSpatialElementFace (The face of the spatial element's 3D geometry - поверхность solid-а помещения) и анализируешь, находится ли окошко в границах этого face-а. Тут уже зависит от твоей конкретной задачи и фантазий архитекторов, возможно хватит проверки того, что locationpoint инстанса семейства окошка проецируется на этот face. Возможно, нет, если у тебя какие-то нереально большие окна - одно окно на несколько помещений.

спасибо за такой развернутый ответ, первый способ как то переварил но со вторым...
окон больших нет, я недавно с autocad api перешел и с ревитовским еще толком не разобрался, попробую все последовательность выполнить
« Последнее редактирование: 13-01-2021, 17:15:04 от Yusuf »

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

  • ADN OPEN
  • ***
  • Сообщений: 117
  • Карма: 4
1) Смотри, стена - это HostObject, у него есть метод FindInserts - позволяет находить окна, двери, проемы и т.д.

2) Дальше нужно определить, окошко это заданного помещения или нет. Тут больше подойдет SpatialElementGeometryCalculator, а не просто получение сегментов.
Создаешь его, вызываешь метод CalculateSpatialElementGeometry, возвращается SpatialElementGeometryResults, дальше получаешь solid помещения методом SpatialElementGeometryResults.GetGeometry, перебираешь его face-ы, для каждого вызываешь SpatialElementGeometryResults.GetBoundaryFaceInfo - получаешь SpatialElementBoundarySubface-ы, смотришь SpatialBoundaryElement, если это стенка, то находишь в ней окошки, из SpatialElementBoundarySubface вызываешь GetSpatialElementFace (The face of the spatial element's 3D geometry - поверхность solid-а помещения) и анализируешь, находится ли окошко в границах этого face-а. Тут уже зависит от твоей конкретной задачи и фантазий архитекторов, возможно хватит проверки того, что locationpoint инстанса семейства окошка проецируется на этот face. Возможно, нет, если у тебя какие-то нереально большие окна - одно окно на несколько помещений.
а зачем такой долгий путь оказывается есть же у окон свойство FromRoom ?

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Хм, ну, в общем, да.

Писал по памяти, лет так 7 назад решал сходную задачу, у меня там были и случаи, когда одно окно на несколько помещений (вроде бы витражной стеной, вставленной в обычную смоделированные, но это не точно) или в каких-то случаях FromRoom не срабатывал.

В общем, рекомендую начать с решения на основе FromRoom, т.е. получаешь ограждающие помещения конструкции, если стена - то FindInserts-ами находишь окна, проверяешь свойство FromRoom, если будут какие-то случаи, когда не хватает, то уже можно пытаться усложнять. Ну или альтернативно находишь все окна в модели и смотришь FromRoom