Теперь Кью работает в режиме чтения

Мы сохранили весь контент, но добавить что-то новое уже нельзя
Архитектор, BIM-эксперт и Аналитик данных  · 23 нояб 2022

Тюнинг IFC-моделей. Вращаем объекты. Практика.

Вопрос: "Как вручную повернуть объект IFC-модели?"
Прочитав предыдущий пост, мы с вами теоретически подготовились к тому, чтобы начать вращать любые объекты в IFC-модели. И теперь мы переходим к практике.
Я опишу реальную проблему, с которой столкнулся пользователь, чтобы вам было понятно зачем вообще это надо делать. Представьте ситуацию:
Вы работаете с подрядчиком над одним проектом и разрабатываете архитектурно-строительную часть, а он выполняет раздел ОВ. Вы работаете в разных программах и обмениваетесь моделями через IFC (настоящий OpenBIM). В какой-то момент возникла необходимость изменить расположение/ориентацию некоторых объектов воздуховодной системы, но вы не можете отредактировать в своей программе. И подрядчик тоже пока не может помочь, но есть его файл IFC…
…Вот как бы действовал я в такой ситуации
Для начала откроем IFC-модель в просмотрщике FZKViewer (из всех подобных программ она является самой функциональной в плане работы с IFC) и найдём ту часть модели, которую хотим изменить:
Для примера буду изменять ориентацию выделенной в центре вентиляционной установки. Я полезу внутрь файла IFC и чтобы найти этот объект мне нужен его GUID:
 1m3Faz9Qv4ougIp1QSo8Xf
Я скопирую его в буфер обмена, выделив значение (Value) во вкладке Свойства элемента (Element Properties) панели свойств (Property Toolbar):
Продолжим исследовать модель. Меня интересует как объекты ориентированы в модели. Для этого включим в 3D Виде опцию "Show Local Placements". Эта опция вызывается из контекстного меню (правая кнопка мыши). Щелкаем в свободном месте 3D Вида и выбираем "3D View Menu" → "Show" → "Show Local Placements":
Чтобы лишние объекты не мешали, можно показать только выделенный объект, опять через контекстное меню выбрав опцию "View Only":
Теперь видно, что локальная ось Z объекта ориентирована вертикально вверх и совпадает с направлением оси Z проекта. Направление локальных осей X и Y объекта также совпадают с направлениями осей проекта (указатель в нижнем-левом углу вида). На первом этапе - это всё, что хотелось выяснить.
Теперь я открою эту же самую модель в другом просмотрщике GeometryGym IFC Tree Viewer. Он маленький, текстовый и очень удобный в плане быстрого нахождения внутри IFC-модели нужной информации. Рядом с кнопками открыть и сохранить есть поле для поиска, вводим туда наш скопированный GUID и он тут же показывает строки нашего объекта (в виде древовидного списка):
Тут же можно развернуть группу "Placement" и посмотреть номера строк, где указана информация об относительном размещении объекта - IfcLocalPlacement (строка #77155), относительных координатах его декартовой точки - IfcCartesianPoint (строка #77154) и направлении локальных осей (Axis и RefDirection).
Собственно мы теперь знаем какие строки надо редактировать, чтобы вручную поизменять расположение объекта и его ориентацию. НО НИ В КОЕМ СЛУЧАЕ НЕЛЬЗЯ ЭТОГО ДЕЛАТЬ! Тут надо действовать по правилу:
Не лезь туда, где и так работает!
Лучше добавить новые строки в файл IFC и сослаться на них в нашем объекте, иначе можно сломать всю модель, потому что на это же расположение или направление могут ссылаться несколько объектов. Но перед этим не плохо бы потренироваться. Я воспользуюсь еще одной возможностью программы GeometryGym IFC Tree Viewer и, выбрав строку с моим объектом IfcBuildingElementProxy (#77152), нажму правую кнопку мыши. В контекстном меню появится одна команда "Isolate 1":
Выбрав эту команду, я смогу сохранить данные только по этому объекту в новом IFC-файле. Это просто супер-опция для такой маленькой утилитки! Единственное неудобство, на мой взгляд, ‒ во вновь созданном IFC-файле нумерация строк не сохраняется из первоначального проекта, а создается своя, начиная с #1. Зато на нём можно сколько угодно тренироваться, не боясь испортить весь проект.
Если надо вентустановку повернуть вокруг оси X, то надо изменять направление оси Z:
/* на 30° вокруг оси X*/
#10000= IFCDIRECTION((0.0,0.5,0.866025403784438))
Если надо повернуть вокруг оси Z, то надо изменять направление оси X: 
/* на 45° вокруг оси Y*/
#10001= IFCDIRECTION((0.707106781186547,0.707106781186547,0.0))
А если надо повернуть вокруг оси Y, тогда надо изменять направление и оси X, и оси Z.
Натренировавшись, можно открыть исходную IFC-модель, в конце файла добавить свои строки с новыми направлениями осей:
И сослаться на них из того класса IfcAxis2Placement3D, который описывает относительное размещение и ориентацию выбранной вентустановки (в моей модели это строка, с номером #77153).
Ну а если с пониманием как вращать объекты возникают трудности, то поизучайте вращение элементов в Renga с помощью углов Эйлера. Они выполняются по той же логике, что и в IFC. На этом всё. Жду ваших вопросов.
5 экспертов согласны
чтобы повернуть ВСЮ присланную модель от субчика, в какой ifc элемент нужно запускать свои руки?
@Павел Слепнев, если в Renga импортировать, то с IfcBuilding надо работать, поскольку Renga работает в ЛСК Здания. Если собирать в Pilot-BIM, то можно IfcSite повернуть, поскольку Pilot-BIM работает уже в ЛСК Участка.
Еще вопрос - инструкция применима к ifc2х3?
@Павел Слепнев, да. Модель для примера в этом посте версии IFC 2x3.
Если идет одновременное смещение объекта и его поворот, правильно понимаю, что сначала объект смещается, после поворачивается относительно НУЛЕВОЙ своей координаты?
@Павел Слепнев, видимо декартова точка (центр осей) находится на удалении от объекта (в FZKViewer'е можно посмотреть). Если так, то лучше указать вручную новую, в центре объекта, тогда смещаться не будет при повороте.