Грани/поверхности помещений у наружной стены
Главная › Форумы › Python › Помогите с питон кодом › Грани/поверхности помещений у наружной стены
- В этой теме 29 ответов, 4 участника, последнее обновление 9 лет, 2 месяца назад сделано Vladimir.
-
АвторСообщения
-
Всем здравствуйте! Решаю задачу по вытаскиванию наружных площадей стен из ревитовской модели в ексель. Некоторые примеры уже скидывал сюда в DOWNLOAD. Основная проблема в том, что стены не граничат одна с одним помещением, а обычно идут сразу на много помещений, а ещё как в моем случае одна стена на 9 этажей (т.е. не режется по вертикали). Так же вместо окон встречаются витражи, да и встречаются модели, где все наружные стены выполнены витражами.
На мой взгляд есть несколько способов решения этой задачи:
- В лоб, найдя все грани помещения по основанию, найти грани по основанию стены (предварительно проверив что эта стена граничит с помещением), и найти кратчайшее расстояние от всех граней помещения до наибольшей грани стены и взять только те грани помещения, от которых скажем расстояние до стены меньше 300мм. В таком случае проблема в том, что у меня не получается найти кратчайшее расстояние правильно
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
#Введенные в этом узле данные сохраняется в виде списка в переменных IN.
pA = IN[2]
pB = IN[1]
pC = IN[0]
curveroom = IN[3]
room = IN[4]
high = IN[5]
dist = []
list1 = []
count=pC.Count
i=0
while i<count:
count2=curveroom[i][0].Count
if count2==1:
j=0
dist=[]
count1=pC[i][0][0].Count
while j<count1:
BC=Line.ByStartPointEndPoint(pC[i][0][0][j],pB[i])
AC=Line.ByStartPointEndPoint(pC[i][0][0][j],pA[i])
AB=Line.ByStartPointEndPoint(pA[i],pB[i])
a=AC.Length
b=BC.Length
c=AB.Length
p=a+b+c/2
h=2*((p*(p-a)*(p-b)*(p-c))**0.5)/c
dist.append(h)
if j==0:
min=dist[0]
if j>0:
if dist[j]<min:
min=dist[j]
j=j+1
k=0
while k<count1:
if dist[k]==min:
Swall=curveroom[i][0][0][k].Length*high[i]/1000000
list1.append([room[i],Swall])
k=k+1
i=i+1
#Назначьте вывод переменной OUT.
OUT = list1- На вход подаются 3 точки (середина каждой грани помещения) и начало и конец стены.
в таком случае dist (расстояние от грани до стены) почему-то выдается по 48890 63884 и т.п.
- Через какую-то функцию/нод сразу вытащить поверхность помещения, граничащую со стеной, но я не знаю такой функции/нода =(
- Попробовать задать Пространства и вытащить поверхности помещений, граничащие с наружными стенами из стандартного ревитовского теплотехнического расчета. Но я не нашел какие это категории или как их вытащить.
Александр, я тоже думал сделать теплотехнический расчет.
Решение представляю себе примерно так:
пока отложил..
если интересно вот скрипт, может быть сам быстрее доделаешь.Дак мой скрипт по такой же логике и считает :)
Legantmar, мне кажется я в этой задаче подальше ушел, решая по той же логике.
https://cloud.mail.ru/public/7h6j/Kdgyi5feJ
Основная проблема в том, что очень часто встречаются витражи и ноды Tool.GetSurround… не работают =( не находят элементы. И ещё у помещений с колоннами из-за большого количества граней не строятся Solid’ы.
Эх, если бы так все просто =\ У меня в модели около 3000 помещений, постоянно какие-нибудь 30 да выдадут ошибки, то это не так, то там не замкнутый PolyСurve.
А по поводу витражей, из них не создать Solid и приходится делать солид по каждой панели и чекать граничит ли помещение с ней. И когда начинает список из 21000 элементов прогоняться 3000 раз – комп либо выключается, либо зависает, а в лучшем случае ревит закрывается.
ты поиграйся сначала на
кошкахпростых моделях, чтобы понять как это работает.
про солид я не понял, я сделал по другому. (извини, но твои накрученные скрипты с пользовательскими узлами, нет желания смотреть и вникать).p.s. а так я тебе сочувствую, особенно если архитекторы там накрутили (незамкнутые полилинии и 3000 помещений )))
проблемы лучше дробить на маленькие.тебе сперва нужен проверяющий скрипт, который проверял бы наличие всех “косяков” в модели перед запуском “вычислителя чистой площади”
update: я бы тебе посоветовал скопировать модель и руками ее доработать (для личных целей, все равно на выходе тебе нужен только эксель файл):
1) удалить все что внутри – колонны, мебель и пр.
2) если витражи типовые, то заменить их на окна
3) упростить здание (заметно, что есть похожие секции или этажи)
и пр.На простых моделях у меня мои скрипты работали исправно.
Ну я на самом деле начинаю привыкать. Помещения по этажам нарезал, постоянно нулевые элементы чищу и пустые списки удаляю. Жаль правда что потом многих помещений не досчитаемся и от ручного счета не уйти.
update: а есть скрипт замены витражей на окна? вручную очень уж долго будет (быстрее площади посчитать). А замену не делаю, т.к. такую выгрузку надо будет делать при каждом изменении в модели и каждый раз модель чистить не то чтобы гуд.
еще мысли (может повторюсь):
– отключать в витраже импосты (чтобы весь витраж был одной панелью)
– для создания solid из витража использовать bounding box по элементу (витражу), засада с векторами, нужно будет настраивать для разных сторон здания
– для внешних стен помещения создавать surface с помощью Curve.extrude линий стен (это отдельные линии стен, а не замкнутая полилиния) по вектору Z
далее как-то их вычитать друг из друга и получать площадь стен за вычетом solid’ов.
p.s. а витраж как вставлен в модель? я не понимаю, как его архитекторы создавали, если он не на всю высоту этажа..))update: я не фанат через геометрию и пересечения вычислять площади…
У архитекторов в модели которую я скидывал чуть выше витражами выполнены окна и цветные панели над ними, причем и окна и панели сидят в одном витраже, т.ч. обединить их поменяв тип витража не получится. Есть ещё несколько моделей, там наружные стены полностью выполнены из витражей, в которых вставлены вразнобой стеновые панели и стекло.
Про BoundingBox, как я понял он в системе координат XYZ коробку создает, т.е. если стена не перпендикулярна то бокс по ней будет очень уж некорректный. Пересчитывать постоянно вектор и поворачивать бокс? для этого нужно всеравно определить ориентацию панели, для чего потребуется создание солида.
Александр, это у вас в одном файле столько геометрии и 3000 помещений? Я на практике разделяю такие модели на части для повышения производительности, собираю уже линками. И нужно на каждое помещение наружную стену рассчитать для теплотехнического расчета? У меня инженеры только по всему фасаду запрашивали цифры(думаю я чего-то не знаю). Но помоему как-то все очень усложнено. Я сейчас работал над скриптом по подсчету отделки, но там подсчет основан создание солидов помещений, и считать нужна такую модель точно частями, и выгружаь в Excel для проверки и консолидации.
Да в одном файле. По идеологии BIM я не должен выполнять разовые операции, как например разрезка здания на части, а должен брать работу архитекторов и использовать в следующей работе (например ОВ), так вот если архитекторы не режут здание, то после каждого их сброса модели мне заново выполнять ряд операций по разрезке здания не целесообразно (я только этим и буду заниматься). Площадь наружной стены да для каждого помещения надо знать и площадь окон. Если не просят, значит вручную видимо считают =)
У меня вчера возникла идея, я создал BoundingBox у элементов и по начальной точке бокса нарезал выборки по этажам и блокам, теперь могу запускать в анализ по частям, а потом да в екселе объединять.
Это не идеология BIM) это модель у архитекторов не рационально выстроена и не оптимизирована. Я не в курсе же кто её моделировал) С такой моделью жутко работать. Для анализа геометрии таких вообще ещё можно использовать NavisWorks, хотя для этой задачи врятли это подходит…
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.