Розробка AI-системи аналізу BIM-моделей

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1566 послуг
Розробка AI-системи аналізу BIM-моделей
Складний
~2-4 тижні
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1284
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1196
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    901
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1119
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    586
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    853

AI-система аналізу BIM-моделей

BIM (Building Information Modeling) зберігає не просто геометрію будівлі, а й метадані: матеріали, постачальники, терміни, вартість. IFC файл великого об'єкта містить десятки тисяч елементів. Ручний аналіз такого обсягу – вузьке місце у будівельних проектах. AI-аналіз BIM автоматизує clash detection, контроль відповідності нормам, генерацію звітів.

Парсинг та аналіз IFC-файлів

import ifcopenshell
import ifcopenshell.geom
import numpy as np
from typing import Optional
import json

class BIMAnalyzer:
    def __init__(self, ifc_path: str):
        self.model = ifcopenshell.open(ifc_path)
        self.settings = ifcopenshell.geom.settings()
        self.settings.set(self.settings.USE_WORLD_COORDS, True)

    def get_elements_by_type(self, ifc_type: str) -> list:
        """Получить все элементы определённого типа"""
        return self.model.by_type(ifc_type)

    def check_structural_clearances(self,
                                      min_clearance_mm: float = 300) -> list[dict]:
        """
        Проверка зазоров между инженерными системами.
        Типичная clash detection задача: трубы проходят сквозь балки.
        """
        pipes = self.model.by_type('IfcPipeSegment')
        beams = self.model.by_type('IfcBeam')
        columns = self.model.by_type('IfcColumn')
        structural = beams + columns

        clashes = []

        for pipe in pipes:
            try:
                pipe_shape = ifcopenshell.geom.create_shape(
                    self.settings, pipe
                )
                pipe_bbox = self._get_bbox(pipe_shape)
            except Exception:
                continue

            for struct_el in structural:
                try:
                    struct_shape = ifcopenshell.geom.create_shape(
                        self.settings, struct_el
                    )
                    struct_bbox = self._get_bbox(struct_shape)
                except Exception:
                    continue

                # Проверка пересечения bounding boxes с отступом
                if self._bboxes_overlap(pipe_bbox, struct_bbox,
                                         margin=min_clearance_mm):
                    clashes.append({
                        'element_1': {
                            'guid': pipe.GlobalId,
                            'type': 'IfcPipeSegment',
                            'name': pipe.Name
                        },
                        'element_2': {
                            'guid': struct_el.GlobalId,
                            'type': struct_el.is_a(),
                            'name': struct_el.Name
                        },
                        'clash_type': 'clearance_violation',
                        'min_clearance_mm': min_clearance_mm
                    })

        return clashes

    def analyze_quantities(self) -> dict:
        """Автоматический подсчёт объёмов и площадей"""
        quantities = {}

        for wall in self.model.by_type('IfcWall'):
            area = self._get_quantity(wall, 'NetSideArea')
            if area:
                quantities.setdefault('walls_area_m2', 0)
                quantities['walls_area_m2'] += area

        for slab in self.model.by_type('IfcSlab'):
            area = self._get_quantity(slab, 'NetArea')
            if area:
                quantities.setdefault('slabs_area_m2', 0)
                quantities['slabs_area_m2'] += area

        return quantities

    def check_fire_safety_compliance(self) -> list[dict]:
        """Проверка требований пожарной безопасности"""
        issues = []

        # Проверка расстояния между эвакуационными выходами
        exits = [d for d in self.model.by_type('IfcDoor')
                  if self._is_emergency_exit(d)]

        if len(exits) < 2:
            issues.append({
                'type': 'insufficient_emergency_exits',
                'severity': 'critical',
                'description': f'Найдено {len(exits)} аварийных выходов, требуется минимум 2'
            })

        # Проверка наличия систем пожаротушения
        sprinklers = self.model.by_type('IfcFireSuppressionTerminal')
        if not sprinklers:
            issues.append({
                'type': 'no_sprinkler_system',
                'severity': 'critical',
                'description': 'Система пожаротушения не найдена в BIM'
            })

        return issues

AI-класифікація елементів та автоматизація розмітки

Іноді BIM-моделі приходять із неповною класифікацією елементів. NLP-модель на ім'я та атрибути елемента автоматично визначає тип:

from transformers import pipeline

class BIMElementClassifier:
    def __init__(self):
        self.classifier = pipeline(
            'zero-shot-classification',
            model='facebook/bart-large-mnli',
            device=0
        )
        self.categories = [
            'structural_beam', 'structural_column', 'wall',
            'floor_slab', 'roof', 'pipe', 'duct', 'electrical_conduit',
            'window', 'door', 'stair', 'elevator'
        ]

    def classify_element(self, element_name: str,
                          element_description: str = '') -> dict:
        text = f"{element_name}. {element_description}"
        result = self.classifier(text, self.categories)
        return {
            'predicted_class': result['labels'][0],
            'confidence': result['scores'][0]
        }

Візуалізація та звіти

BIM-аналіз марний без зручного звіту для інженерів:

import plotly.graph_objects as go

class BIMReportGenerator:
    def generate_clash_report(self, clashes: list[dict],
                               output_path: str):
        # Группировка по типам столкновений
        by_type = {}
        for clash in clashes:
            t = clash['clash_type']
            by_type.setdefault(t, 0)
            by_type[t] += 1

        fig = go.Figure(data=[go.Bar(
            x=list(by_type.keys()),
            y=list(by_type.values())
        )])
        fig.update_layout(title='Количество конфликтов по типам')
        fig.write_html(output_path)

Кейс: житловий комплекс, 30 000 м²

IFC-модель ЖК: 85 000 елементів, 3 корпуси, 18 поверхів кожен. Ручна перевірка clash detection: 2 BIM-координатори, 4 робочі дні.

Після автоматизації:

  • Обробка моделі: 18 хвилин
  • Знайдено 347 clash-конфліктів (труба-балка, повітропровід-колона)
  • з них критичних (фізичний перетин): 23
  • Усі підтверджені інженером - 0 помилкових спрацьовувань
Тип проекту Термін
Clash detection пайплайн 3-5 тижнів
Повний BIM QC (clash + норми + кількості) 6-10 тижнів
AI-класифікація + звіти + інтеграція з Autodesk 10-16 тижнів