Сообщество программистов Autodesk в СНГ
ADN Club => Revit API => Тема начата: Yusuf от 11-01-2021, 16:28:12
-
Здравствуйте уважаемые коллеги, подскажите как можно получить окна на определенном участке стены, т.е наружной стены. вот так получаю наружные стены https://thebuildingcoder.typepad.com/blog/2009/01/room-and-wall-adjacency.html
Если стена содержит слова "Exterior" значит наружная, так вот там получают границы помещения так room.GetBoundarySegments(new SpatialElementBoundaryOptions()), и длину этого сегмента указываю как длина стены, вопрос можно ли по этому сегменту как то получить окно?
-
Наверно окна лучше получить другим путем, найти все помещения найти там все окна, а потом найти все стены, на которой это окно расположено и отсортировать по названию типа стены, кажется так будет лучше, это решение или есть более удобный способ ?
-
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. Возможно, нет, если у тебя какие-то нереально большие окна - одно окно на несколько помещений.
-
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 перешел и с ревитовским еще толком не разобрался, попробую все последовательность выполнить
-
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 ?
-
Хм, ну, в общем, да.
Писал по памяти, лет так 7 назад решал сходную задачу, у меня там были и случаи, когда одно окно на несколько помещений (вроде бы витражной стеной, вставленной в обычную смоделированные, но это не точно) или в каких-то случаях FromRoom не срабатывал.
В общем, рекомендую начать с решения на основе FromRoom, т.е. получаешь ограждающие помещения конструкции, если стена - то FindInserts-ами находишь окна, проверяешь свойство FromRoom, если будут какие-то случаи, когда не хватает, то уже можно пытаться усложнять. Ну или альтернативно находишь все окна в модели и смотришь FromRoom