BIM Report/pl

BIM: Raport

Lokalizacja w menu
Zarządzaj → Narzędzia raportów → Raport BIM
Środowisko pracy
BIM
Domyślny skrót
brak
Wprowadzono w wersji
1.2
Zobacz także
brak

Opis

Raport BIM to narzędzie do generowania zestawień i raportów danych z modelu FreeCAD. Wykorzystuje język zapytań podobny do SQL do wybierania, filtrowania i agregowania danych, oferując deklaratywną alternatywę dla innych narzędzi do tworzenia zestawień. Ostatecznie umożliwia użytkownikom tworzenie i automatyczne wypełnianie arkusza kalkulacyjnego w środowisku pracy Arkusz kalkulacyjny danymi zebranymi z modelu.

Możesz wybrać narzędzie Raport BIM, gdy potrzebujesz wykonać:

Użycie

  1. Otwórz lub utwórz dokument FreeCAD zawierający obiekty.
  2. Istnieje kilka sposobów uruchomienia narzędzia:
    • Naciśnij przycisk Raport BIM.
    • Wybierz z menu opcję Zarządzaj → Narzędzia raportów → Raport BIM.
  3. Nowy raport automatycznie otworzy swój panel zadań. Utwórz jedną lub więcej instrukcji dla raportu. Opcjonalnie możesz użyć dostępnego edytora instrukcji, aby zobaczyć podgląd wykonania tych instrukcji.
  4. Naciśnij OK, aby zapisać raport i odświeżyć powiązany arkusz kalkulacyjny wynikami zapytania.

Interfejs użytkownika

System Raport BIM składa się z trzech głównych elementów: obiektu Raport w widoku drzewa, docelowego Arkusza kalkulacyjnego na wyniki oraz Panelu zadań, w którym konfiguruje się raport.

Po utworzeniu nowego raportu w Widoku drzewa pojawią się dwa nowe obiekty: obiekt Report, który przechowuje wszystkie ustawienia, oraz powiązany z nim arkusz kalkulacyjny ReportResult.

Dwukrotne kliknięcie obiektu DANEReport otwiera Panel zadań, który jest głównym obszarem roboczym do edycji raportu. Panel jest podzielony na dwa główne obszary: Instrukcje raportu oraz Edytor instrukcji.

Panel zadań Raportu BIM pokazujący sekcję Przegląd instrukcji na górze.

Instrukcje raportu

Ta sekcja jest zawsze widoczna w górnej części panelu zadań i zawiera podsumowanie wszystkich zapytań (lub "instrukcji") składających się na raport.

Główną funkcją jest tabela zawierająca listę wszystkich instrukcji. Z tego miejsca możesz przeglądać i bezpośrednio edytować Opis oraz przełączać kluczowe opcje dla każdego zapytania:

Dwukrotne kliknięcie wiersza instrukcji otwiera ją do edycji. Naciśnięcie F2 na wierszu instrukcji umożliwia edycję opisu bezpośrednio w tabeli, bez otwierania pełnego edytora.

Pod tabelą znajdują się przyciski do Dodania, Usunięcia, Zduplikowania lub Edycji wybranej instrukcji.

Na końcu rozwijane menu Szablony raportu umożliwia wczytanie kompletnych, wstępnie skonfigurowanych raportów, takich jak "Obmiar pomieszczenia i obszaru".

Edytor instrukcji

Ta sekcja pojawia się w dolnej części Panelu zadań po wybraniu instrukcji i kliknięciu Edytuj wybrane. W tym miejscu piszesz i konfigurujesz pojedyncze zapytanie SQL.

Edytor instrukcji pokazujący edytor SQL, panel podglądu oraz opcje wyświetlania.

Przycisk Zapisz zapisuje zmiany w wybranej instrukcji. Gdy zaznaczone jest pole Zapisz i następne i naciśnięty zostanie przycisk Zapisz, oprócz zapisania zmian zostanie utworzona nowa instrukcja, co ułatwia kontynuację edycji. Przycisk ❌ Odrzuć zamyka edytor instrukcji bez zapisywania wprowadzonych zmian.

Przepływ pracy

Ten krótki samouczek poprowadzi Cię przez proces tworzenia kompletnego obmiaru pokoju, od prostej listy po wieloczęściowy raport z obliczonymi sumami.

Krok 1: Nowy raport

  1. Kliknij przycisk Raport BIM na pasku narzędzi środowiska roboczego BIM.
  2. FreeCAD utworzy obiekt Report i arkusz kalkulacyjny ReportResult w Widoku drzewa i automatycznie otworzy Panel zadań.

Krok 2: Prosta instrukcja

Najpierw utwórzmy prostą listę wszystkich przestrzeni i ich powierzchni.

  1. W Instrukcjach raportu kliknij przycisk Dodaj instrukcję. W liście pojawi się nowa, pusta instrukcja.
  2. Z nową instrukcją wybraną, kliknij przycisk Edytuj wybrane. Edytor instrukcji pojawi się w dolnej części Panelu zadań.
  3. W polu Opis wpisz Room List.
  4. W edytorze Zapytanie SQL wpisz następujące zapytanie. Wybiera ono nazwę i powierzchnię wszystkich obiektów typu Space i sortuje je alfabetycznie.
    SELECT Label, Area FROM document WHERE IfcType = 'Space' ORDER BY Label ASC
    
  5. Kliknij przycisk Zapisz w edytorze, aby zatwierdzić zmiany w instrukcji.

Krok 3: Raport o wielu sekcjach

Teraz dodajmy drugą instrukcję do obliczenia całkowitej powierzchni.

  1. W widoku ogólnym ponownie kliknij Dodaj instrukcję, aby utworzyć drugą instrukcję.
  2. Z nową instrukcją wybraną, kliknij Edytuj wybrane.
  3. Ustaw Description na Total Area.
  4. W edytorze Zapytanie SQL wpisz następujące zapytanie agregujące:
    SELECT 'Total Usable Area', SUM(Area) FROM document WHERE IfcType = 'Space'
    
  5. W sekcji Opcje wyświetlania' odznacz Uwzględniaj nazwy kolumn (ponieważ nasza pierwsza kolumna to własna etykieta) i zaznacz Drukuj wyniki w pogrubieniu dla wyróżnienia.
  6. Kliknij Zapisz. Teraz masz raport składający się z dwóch instrukcji. Kliknij główny przycisk OK na dole Panelu zadań, aby go wykonać. Powiązany arkusz kalkulacyjny otworzy się automatycznie z sformatowanymi wynikami.

Krok 4: Potoki dla zaawansowanych zapytań

Potokowanie pozwala łączyć zapytania w łańcuch, gdzie wynik jednego staje się danymi wejściowymi dla następnego. Jest to niezbędne przy złożonych selekcjach hierarchicznych, np. podczas użycia funkcji CHILDREN(). Ponieważ funkcja nie działa rekurencyjnie, znajduje tylko bezpośrednich potomków.

Na przykład, aby znaleźć wszystkie drzwi znajdujące się na "Parterze", trzeba wykonać zapytanie wieloetapowe, ponieważ drzwi są dziećmi ścian, które z kolei są dziećmi kondygnacji.

  1. Utwórz nowy raport.
  2. Instrukcja 1: Znajdź obiekt 'Parter'
    • Dodaj instrukcję z opisem Znajdź parter.
    • To zapytanie wybiera punkt początkowy naszego wyszukiwania.
      SELECT * FROM document WHERE Label = 'Ground Floor'
      
  3. Instrukcja 2: Znajdź ściany na tej kondygnacji
    • Dodaj drugą instrukcję z opisem Znajdź ściany na kondygnacji.
    • W edytorze zaznacz pole Użyj kroku potoku. Informuje to instrukcję, że ma działać na wynikach poprzedniej instrukcji (obiekt kondygnacji).
    • Użyj tego zapytania, aby znaleźć wszystkich bezpośrednich potomków kondygnacji i pozostawić tylko ściany:
      SELECT * FROM CHILDREN(SELECT * FROM document) WHERE IfcType = 'Wall'
      
  4. Instrukcja 3: Znajdź drzwi w tych ścianach
    • Dodaj trzecią instrukcję z opisem Znajdź drzwi w ścianach.
    • Ponownie zaznacz pole Użyj kroku potoku. Teraz łączy ją z wynikiem Instrukcji 2 (lista ścian).
    • Użyj tego zapytania, aby znaleźć obiekty podrzędne ścian i pozostawić tylko drzwi:
      SELECT Label, Width, Height FROM CHILDREN(SELECT * FROM document) WHERE IfcType = 'Door'
      
  5. Kliknij OK. Raport wykona pełny trzyetapowy potok.

Zrozumienie wyniku: Końcowy arkusz kalkulacyjny pokaże tylko wyniki ostatniej instrukcji w potoku (listę drzwi). Pierwsze dwie instrukcje pełnią rolę filtrów pośrednich – ich wyniki są przekazywane w pamięci, ale nie są drukowane w arkuszu, co daje czysty i precyzyjny końcowy raport.

Krok 5: Gotowe ustawienia i szablony

Odniesienie dla dialektu BIM SQL

W tej sekcji przedstawiono szczegółowe informacje dotyczące dialektu języka SQL używanego przez narzędzie Raport BIM.

Uwaga: Najbardziej aktualne informacje dotyczące wszystkich klauzul i funkcji można zawsze znaleźć w interfejsie użytkownika, klikając przycisk Pomoc w edytorze Panelu zadań raportu.

Klauzule

Notatki użycia GROUP BY oraz ORDER BY

Dialekt posiada określone zasady dotyczące używania wyrażeń (np. funkcji lub działań arytmetycznych) w klauzulach GROUP BY i ORDER BY.

Funkcje

Dialekt zawiera bibliotekę wbudowanych funkcji do manipulacji danymi i analizy.

Kategoria Funkcja Opis
Agreguj COUNT(właściwość|*) Zlicza wystąpienia obiektu. COUNT(*) zlicza wszystkie rzędy; COUNT(właściwość) zlicza rzędy, w których określona właściwość nie jest NULL.
SUM(właściwość) Oblicza sumę właściwości numerycznej.
MIN(właściwość) Znajduje minimalną wartość właściwości numerycznej.
MAX(właściwość) FZnajduje maksymalną wartość właściwości numerycznej.
Hierarchiczne PARENT(*) Zwraca architektonicznie istotny element nadrzędny obiektu (np. ścianę, w której znajduje się okno), pomijając w sposób przejrzysty grupy ogólne.
CHILDREN(zapytanie podrzędne) Funkcja używana w klauzuli FROM. Zwraca wszystkie dzieci obiektów znalezionych przez podzapytanie, uwzględniając zarówno relacje zawierania (.Group), jak i hostingu (.Hosts). Funkcja jest nierekurencyjna. Aby znaleźć wnuki lub dalszych potomków, należy połączyć kilka kroków CHILDREN() w potoku.
CHILDREN_RECURSIVE(zapytanie podrzędne, max_depth=15) Funkcja używana w klauzuli FROM. Zwraca wszystkie potomne obiekty wyników subquery, rekurencyjnie przeszukując hierarchię. Pomija grupy ogólne. Opcjonalnie można określić max_depth (domyślnie 15, 0 dla nieograniczonej głębokości). Zastępuje potrzebę tworzenia złożonych potoków do znajdowania zagnieżdżonych obiektów.
Utility TYPE(*) Zwraca typ obiektu widoczny dla użytkownika, określony przez jego proxy (np. Wall, Space, Part::Box).
CONVERT(wielkość, 'jednostka') Konwertuje obiekt Quantity FreeCAD na nową jednostkę i zwraca ją jako surową liczbę. Przykład:
CONVERT(Area, 'm^2').
String LOWER(właściwość) Konwertuje właściwość tekstową na małe litery.
UPPER(właściwość) Konwertuje właściwość tekstową na wielkie litery.
CONCAT(val1, val2, …) Łączy wiele wartości tekstowych i właściwości w jeden ciąg znaków.

Dostęp do właściwości

Możesz uzyskać dostęp do dowolnej właściwości obiektu, w tym do zagnieżdżonych struktur danych.

Operatory

Typ Operatory Opis
Porównanie =, !=, >, <, >=, <= Standardowe operatory porównania.
LIKE Dopasowywanie wzorców bez rozróżniania wielkości liter. Użyj % dla wielu znaków i _ dla pojedynczego znaku.
IS NULL, IS NOT NULL Sprawdza, czy właściwość ma wartość.
IN (value1, value2, …) Sprawdza, czy wartość właściwości znajduje się na podanej liście literałów.
Logiczne AND, OR Używane w klauzuli WHERE do łączenia wielu warunków.
Arytmetyczne +, -, *, / Wykonuj obliczenia dotyczące właściwości numerycznych. Przestrzegaj standardowej kolejności operatorów; użyj (), aby ją zmienić.

Ogólna składnia

Przykładowe zapytania

W tej sekcji znajduje się zbiór praktycznych zapytań, które można wykorzystać bezpośrednio lub zmodyfikować do własnych raportów.

Podstawowe zaznaczanie

Zaznacz wszystkie elementy konstrukcyjne (kolumny i belki):

SELECT Label, IfcType 
FROM document 
WHERE IfcType IN ('Column', 'Beam') 
ORDER BY IfcType, Label

Wybierz wszystkie ściany z "Exterior" w nazwie:

SELECT Label, Length, Height 
FROM document 
WHERE IfcType = 'Wall' AND Label LIKE '%Exterior%'

Agregacja danych i podsumowania

Zlicz wszystkie obiekty BIM, pogrupowane po typie:

SELECT IfcType, COUNT(*) 
FROM document 
WHERE IfcType IS NOT NULL 
GROUP BY IfcType 
ORDER BY IfcType ASC

Uzyskaj pełny zestawienie ilościowe dla wszystkich ścian:

To zapytanie oblicza całkowitą liczbę ścian, ich łączną długość oraz minimalną i maksymalną wysokość ścian.

SELECT 
    COUNT(*) AS "Total Count", 
    SUM(Length) AS "Total Length (mm)", 
    MIN(Height) AS "Min Height (mm)", 
    MAX(Height) AS "Max Height (mm)" 
FROM document 
WHERE IfcType = 'Wall'

Zapytania hierarchiczne

Wypisz wszystkie obiekty zlokalizowane bezpośrednia na "Parterze":

Wykorzystuje funkcję CHILDREN() do sprawdzania zawartości określonego obiektu kontenera.

SELECT Label, IfcType 
FROM CHILDREN(SELECT * FROM document WHERE Label = 'Ground Floor') 
ORDER BY IfcType

Wymień wszystkie drzwi i ściany, w których się znajdują:

Wykorzystuje to funkcję PARENT() do znalezienia hosta każdego portu.

SELECT 
    Label AS "Door_Name", 
    PARENT(*).Label AS "Host_Wall_Name" 
FROM document 
WHERE IfcType = 'Door' 
ORDER BY "Host_Wall_Name"

Znajdź wszystkie okna na "Parterze" (sprawdzając element nadrzędny):

To zapytanie wyszukuje okna, sprawdza ich element nadrzędny (ścianę), a następnie sprawdza element nadrzędny tej ściany (podłogę).

SELECT Label 
FROM document 
WHERE IfcType = 'Window' AND PARENT(*).PARENT(*).Label = 'Ground Floor'

Zaawansowane zapytania

Wygeneruj kompletny obmiar pomieszczeń i obszarów:

To zapytanie generuje sformatowaną listę wszystkich pomieszczeń, pogrupowanych według pięter, do których należą, wraz z ich powierzchnią przeliczoną na metry kwadratowe.

SELECT 
    PARENT(*).Label AS "Floor", 
    Label AS "Room Name", 
    CONVERT(Area, 'm^2') AS "Area (m²)" 
FROM document 
WHERE IfcType = 'Space' 
ORDER BY "Floor", "Room Name"

Uwagi dotyczące użycia

Jednostki

Po wybraniu właściwości, która ma jednostki (`Ilość`), takie jak `Długość` lub `Powierzchnia`, silnik BIM Report zwraca surową wartość liczbową tej właściwości, tak jak jest ona przechowywana wewnętrznie w dokumencie FreeCAD. Wewnętrzne jednostki FreeCAD są zawsze oparte na milimetrach (mm).

Oznacza to, że domyślnym wynikiem będzie mm dla długości, mm² dla powierzchni i mm³ dla objętości, niezależnie od aktualnego schematu jednostek lub preferencji użytkownika. Automatycznie wygenerowany nagłówek kolumny będzie prawidłowo odzwierciedlał tę wewnętrzną jednostkę.

Przykład: domyślne zachowanie

Jeśli uruchomisz to proste zapytanie na obszarze o wymiarach 1 metr na 1 metr:

SELECT Label, Area FROM document WHERE IfcType = 'Space'

Wynikowy arkusz kalkulacyjny będzie zawierał:

<span id="Using_CONVERT()">

Użycie CONVERT()

Aby uzyskać wyniki w żądanych jednostkach, można użyć funkcji CONVERT(), która zapewnia wyraźną kontrolę nad wynikami. Aby uzyskać powierzchnię w metrach kwadratowych, zmodyfikuj zapytanie w następujący sposób:

SELECT Label, CONVERT(Area, 'm^2') AS "Area (m²)" FROM document WHERE IfcType = 'Space'

To zapytanie generuje teraz wynik w żądanej jednostce:

Użycie funkcji CONVERT() gwarantuje, że wynik raportu będzie jednoznaczny, a wszelkie obliczenia wykonywane w zapytaniu (np. SUM(CONVERT(Area, 'm^2'))) będą poprawne matematycznie.

Właściwości

Obiekt Arch Report udostępnia użytkownikowi następujące właściwości.

Dane

Raport

Tworzenie skryptów

Silnik BIM Report jest w pełni dostępny poprzez Python, co pozwala na zintegrowanie jego zaawansowanych funkcji wyszukiwania z własnymi skryptami i automatyzacją.

Arch.selectObjects(query_string)

Jest to podstawowa funkcja służąca do wykonywania pojedynczego, prostego zapytania SQL. Przyjmuje ona ciąg zapytania jako dane wejściowe i zwraca listę obiektów FreeCAD DocumentObjects, które pasują do zapytania. Jeśli zapytanie jest nieprawidłowe lub nie znajdzie żadnych obiektów, zwraca pustą listę i wyświetla komunikat o błędzie w konsoli.

Przykład: Pobierz wszystkie obiekty ścian, których nazwa zawiera słowo "Exterior"

import FreeCAD
import Arch

# This query selects all Wall objects whose Label contains the substring "Exterior"
query = "SELECT * FROM document WHERE IfcType = 'Wall' AND Label LIKE '%Exterior%'"

exterior_walls = Arch.selectObjects(query)

# The result is a list of FreeCAD objects
FreeCAD.Console.PrintMessage(f"Found {len(exterior_walls)} exterior walls.\n")
for wall in exterior_walls:
    FreeCAD.Console.PrintMessage(f"- {wall.Label} (Length: {wall.Length})\n")

Arch.selectObjectsFromPipeline(statements)

W przypadku bardziej złożonych, wieloetapowych wyborów można użyć tej funkcji do wykonania potoku. Pobiera ona listę obiektów ArchSql.ReportStatement i zwraca ostateczną listę obiektów FreeCAD DocumentObjects, które są wynikiem pełnego potoku.

Jest to programowy odpowiednik zaznaczenia pola wyboru "Użyj jako krok potoku" w interfejsie użytkownika.

Przykład: Znajdź wszystkie drzwi na "parterze"

Jest to klasyczny problem hierarchiczny, który wymaga wielu kroków. Celem jest znalezienie "obiektów podrzędnych" (drzwi) "obiektu nadrzędnego" (podłogi). Ponieważ funkcja CHILDREN() nie jest rekurencyjna, musimy połączyć wiele kroków w łańcuch.

  1. Najpierw znajdujemy obiekt 'Parter'.
  2. Następnie znajdujemy jego bezpośrednie elementy podrzędne (ściany, przestrzenie itp.).
  3. Potem znajdujemy elementy podrzędne tych obiektów (w tym drzwi i okna umieszczone w ścianach).
  4. Na koniec filtrujemy tę ostatnią grupę, aby zachować tylko drzwi.
import FreeCAD
import Arch
import ArchSql

# Step 1: Define the pipeline statements.
# The ReportStatement class must be imported from the ArchSql module.

# Statement 1: Find the parent 'Ground Floor' object.
# Output of this step: [Ground_Floor_Object]
stmt1 = ArchSql.ReportStatement(
    query_string="SELECT * FROM document WHERE Label = 'Ground Floor'"
)

# Statement 2: Find the direct children of the floor (walls, spaces, etc.).
# is_pipelined=True tells this to run on the output of stmt1.
# Output of this step: [Wall_Object_1, Wall_Object_2, Space_Object_1, …]
stmt2 = ArchSql.ReportStatement(
    query_string="SELECT * FROM CHILDREN(SELECT * FROM document)",
    is_pipelined=True
)

# Statement 3: Find the children of the objects from the previous step.
# This finds the doors and windows hosted by the walls.
# Output of this step: [Door_Object, Window_Object_1, …]
stmt3 = ArchSql.ReportStatement(
    query_string="SELECT * FROM CHILDREN(SELECT * FROM document)",
    is_pipelined=True
)

# Statement 4: Filter the final list to keep only the doors.
# This runs on the output of stmt3.
# Final Output: [Door_Object]
stmt4 = ArchSql.ReportStatement(
    query_string="SELECT * FROM document WHERE IfcType = 'Door'",
    is_pipelined=True
)

# Step 2: Execute the full pipeline.
pipeline_statements = [stmt1, stmt2, stmt3, stmt4]
doors_on_floor = Arch.selectObjectsFromPipeline(pipeline_statements)

# The result is the final list of door objects.
FreeCAD.Console.PrintMessage(f"Found {len(doors_on_floor)} doors on the ground floor.\n")
for door in doors_on_floor:
    FreeCAD.Console.PrintMessage(f"- {door.Label}\n")

Sprawdzanie i udostępnianie raportu za pomocą Konsoli Pythona

W celu debugowania, tworzenia skryptów lub udostępniania swojej pracy innym osobom można uzyskać kompletne, czytelne dla człowieka podsumowanie konfiguracji raportu bezpośrednio z Konsoli Pythona.

Logika niestandardowa i szczegółowa zawartość raportu BIM są przechowywane w jego obiekcie proxy. Dostęp do atrybutu .Proxy zapewnia pełny wydruk wszystkich instrukcji i zapytań SQL. Jest to wygodny sposób na skopiowanie całej definicji raportu do schowka w celu udostępnienia jej na forum lub w zgłoszeniu błędu.

Jak z niego korzystać:

  1. Wybierz obiekt Report w Widoku drzewa.
  2. Naciśnij Ctrl+Shift+P. Spowoduje to wysłanie wybranego obiektu do Konsoli Pythona jako zmienna obj.
  3. W konsoli wpisz następujące polecenie i naciśnij Enter:
print(obj.Proxy)

Przykładowy wynik:

>>> print(obj.Proxy)
BIM Report: 'My Door Schedule' (2 statements)

--- Statement [1]: Find All Walls on Ground Floor ---
    SELECT * 
    FROM CHILDREN(SELECT * FROM document WHERE Label = 'Ground Floor')
    WHERE IfcType = 'Wall'

--- Statement [2]: Final Door Schedule (Pipelined, Header) ---
    SELECT
        Tag,
        COUNT(*) AS "Count"
    FROM
        document
    GROUP BY
        Tag