|
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 |
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ć:
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.

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:
Label, Area) jako wiersz nagłówkowy dla wyników tej instrukcji.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".
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.

Label, Area) do wyników arkusza dla tej instrukcji.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.
Ten krótki samouczek poprowadzi Cię przez proces tworzenia kompletnego obmiaru pokoju, od prostej listy po wieloczęściowy raport z obliczonymi sumami.
Najpierw utwórzmy prostą listę wszystkich przestrzeni i ich powierzchni.
Room List.Space i sortuje je alfabetycznie.SELECT Label, Area FROM document WHERE IfcType = 'Space' ORDER BY Label ASC
Teraz dodajmy drugą instrukcję do obliczenia całkowitej powierzchni.
Total Area.SELECT 'Total Usable Area', SUM(Area) FROM document WHERE IfcType = 'Space'
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.
Znajdź parter.SELECT * FROM document WHERE Label = 'Ground Floor'
Znajdź ściany na kondygnacji.SELECT * FROM CHILDREN(SELECT * FROM document) WHERE IfcType = 'Wall'
Znajdź drzwi w ścianach.SELECT Label, Width, Height FROM CHILDREN(SELECT * FROM document) WHERE IfcType = 'Door'
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.
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.
SELECT: Określa kolumny danych do zwrócenia. Można użyć *, aby wybrać domyślny identyfikator wszystkich obiektów.FROM: Określa źródło danych. W pojedynczym zapytaniu zawsze jest to document. W potoku document jest symbolem zastępczym dla danych z poprzedniego kroku. Można też użyć funkcji CHILDREN().WHERE: Filtruje obiekty na podstawie warunków.GROUP BY: Grupuje wiersze o tych samych wartościach w wiersze podsumowujące, zwykle używane z funkcjami agregującymi.ORDER BY: Sortuje końcowe wyniki. Może być użyte wraz z ASC (rosnąco, domyślnie) lub DESC (malejąco). Obsługuje sortowanie według wielu kolumn.AS: Tworzy alias (własną nazwę) dla kolumny w klauzuli SELECT, np. SELECT Area AS "My Area".
Dialekt posiada określone zasady dotyczące używania wyrażeń (np. funkcji lub działań arytmetycznych) w klauzulach GROUP BY i ORDER BY.
GROUP BY: Przy grupowaniu według wyrażenia należy powtórzyć całe wyrażenie w klauzuli GROUP BY. Nie jest obsługiwane użycie aliasu z listy SELECT.
SELECT TYPE(*) … GROUP BY TYPE(*)
SELECT TYPE(*) AS BimType … GROUP BY BimType
ORDER BY: Natomiast sortowanie według surowego wyrażenia nie jest obsługiwane. Aby posortować według wyniku wyrażenia, najpierw należy uwzględnić je w liście SELECT z aliasem AS, a następnie odwołać się do tego aliasu w klauzuli ORDER BY.
SELECT Label, LOWER(Label) AS sort_key … ORDER BY sort_key
SELECT Label … ORDER BY LOWER(Label)
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:
| |
| 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. |
Możesz uzyskać dostęp do dowolnej właściwości obiektu, w tym do zagnieżdżonych struktur danych.
Label, IfcTypeShape.Volume, Placement.Base.zPARENT().
PARENT(*).Label, PARENT(*).PARENT(*).Height
| 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ć.
|
'), jak i podwójnych (") cudzysłowów. Na przykład, WHERE Label = 'Wall' i WHERE Label = "Wall" są równoważne.--, jak i komentarze wielolinijkowe, otoczone /* … */.
W tej sekcji znajduje się zbiór praktycznych zapytań, które można wykorzystać bezpośrednio lub zmodyfikować do własnych raportów.
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%'
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'
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'
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"
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ł:
Powierzchnia (mm²)1000000,0<span id="Using_CONVERT()">
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:
Powierzchnia (m²)1,0Uż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.
Obiekt Arch Report udostępnia użytkownikowi następujące właściwości.
Raport
SUM(Length) w raporcie zostanie automatycznie zaktualizowana po przeliczeniu. W bardzo dużych modelach może być wskazane wyłączenie tej opcji dla poprawy wydajności przy wprowadzaniu wielu zmian. Gdy właściwość AutoUpdate jest ustawiona na Fałsz, raport można zaktualizować ręcznie w dowolnym momencie, klikając prawym przyciskiem myszy obiekt Report w Widoku drzewa i wybierając Recompute lub naciskając globalny przycisk Przelicz ponownie.
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ą.
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")
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.
'Parter'.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")
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ć:
obj.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