|
|
| Menüeintrag |
|---|
| Verwalten → Bericht-Werkzeuge → BIM Bericht |
| Arbeitsbereich |
| BIM |
| Standardtastenkürzel |
| Keiner |
| Eingeführt in Version |
| 1.2 |
| Siehe auch |
| Keiner |
Beschreibung
Der BIM-Bericht ist ein Werkzeug zur Erstellung von Zeitplänen und Datenberichten aus einem FreeCAD-Modell. Er verwendet eine SQL-ähnliche Abfragesprache zum Auswählen, Filtern und Aggregieren von Daten und bietet damit eine deklarative Alternative zu anderen Planungswerkzeugen. Letztendlich ermöglicht es Benutzern, eine Kalkulationstabelle zu erstellen und automatisch mit Daten aus dem Modell zu füllen.
Das Werkzeug BIM Bericht auswählen, wenn Folgendes ausgeführt werden muss:
- Komplexe Filterung: Objekte anhand einer Kombination von Eigenschaften auswählen, einschließlich verschachtelter Daten (z. B. die Positionierungskoordinaten eines Objekts).
- Datenaggregation: Die Summen, Anzahlen, Mindest- oder Höchstwerte über viele Objekte hinweg berechnen (z. B. die Gesamtfläche aller „Raum“-Objekte ermitteln).
- Hierarchische Abfragen: Objekte anhand ihrer Beziehung zu anderen Objekten auswählen (z. B. alle Fenster finden, die sich in Wänden auf einer bestimmten Etage befinden).
Anwendung
- Ein FreeCAD-Dokument öffnen oder erstellen, das einige Objekte enthält.
- Es gibt mehrere Möglichkeiten, das Werkzeug aufzurufen:
- Die Schaltfläche
BIM Bericht drücken.
- Im Menü Verwalten → Berichtswerkzeuge →
BIM Bericht wählen.
- Die Schaltfläche
- Der neue Bericht öffnet automatisch sein Aufgaben-Fenster. Eine oder mehrere Anweisungen für den Bericht erstellen. Optional kann der bereitgestellte Anweisungseditor verwenden, um eine Vorschau der Ausführung dieser Anweisungen anzuzeigen.
- OK drücken, um den Bericht zu speichern und die zugehörige Tabelle mit den Abfrageergebnissen zu aktualisieren.
Benutzeroberfläche
Das BIM Bericht-System besteht aus drei Hauptkomponenten: Das Report-Objekt in der Baumansicht, dem Ziel Spreadsheet für die Ergebnisse, und dem Aufgaben-Fenster wo der Bericht eingestellt werden kann.
Wenn ein neuer Bericht erstellt wird, werden in der Baumansicht zwei neue Objekte angezeigt: das Berichtsobjekt, in dem alle Einstellungen gespeichert sind, und die zugehörige ReportResult-Tabelle.
Durch Doppelklicken auf das Objekt Daten-EigenschaftReport wird das Aufgaben-Fenster geöffnet, das der primäre Arbeitsbereich für die Bearbeitung des Berichts ist. Das Fenster ist in zwei Hauptbereiche unterteilt: die Report Statements (Berichts-Ausdrücke) und der Statement Editor (Ausdrucks-Editor).

Bericht-Anweisungen
Dieser Abschnitt ist immer oben im Aufgaben-Fenster sichtbar und enthält eine Zusammenfassung aller Abfragen (oder „Anweisungen“), aus denen der Bericht besteht.
Das Hauptmerkmal ist eine Tabelle, in der jede Anweisung aufgeführt ist. Von hier aus kann die Beschreibung angezeigt und direkt bearbeitet werden sowie wichtige Optionen für jede Abfrage umgeschaltet werden:
- Pipe: Aktiviert den Pipeline-Modus für diese Anweisung, wobei die Ausgabe der vorherigen Anweisung als Eingabe verwendet wird.
- Header: Verwendet die Beschreibung der Anweisung als zusammengefasste Abschnittsüberschrift in der Tabelle.
- Cols: Enthält die Spaltennamen (z. B.
Label,Area) als Kopfzeile für die Ergebnisse dieser Anweisung.
Durch Doppelklicken auf eine Zeile des Ausdrucks wird dieser zur Bearbeitung geöffnet. Durch Drücken der Taste F2 in einer Zeile des Ausdrucks kann die Beschreibung des Ausdrucks direkt bearbeitet werden, ohne dass der vollständige Editor geladen werden muss.
Unter der Tabelle sind Schaltflächen zum Hinzufügen,
Entfernen,
Duplizieren, oder
Bearbeiten der ausgewählten Anweisung.
Schließlich können über das Dropdown-Menü Berichtsvorlagen vollständige, vorkonfigurierte Berichte geladen werden, wie beispielsweise ein „Raum- und Flächenplan“.
Anweisungs-Editor
Dieser Abschnitt wird unten im Aufgaben-Fenster angezeigt, wenn eine Anweisung ausgewählt und auf Ausgewählte bearbeiten geklickt wird. Hier wird eine individuelle SQL-Abfrage geschrieben und konfiguriert.

- The SQL Query Editor is a text box with syntax highlighting. Autocompletion for SQL keywords and property names from your model is automatically enabled. Use the ↑ and ↓ keys as needed, and press the Tab to apply the chosen suggestion.
- Below the editor, a Live Validation status label gives you immediate feedback, indicating if your syntax is valid and showing a live count of matching objects.
- The
Show Preview button will run the current query on-demand and display the full data results in a temporary table, allowing you to test your query without closing the editor.
- The
Help button opens a dialog with a "cheatsheet" of all supported SQL clauses and functions.
- The Display Options group contains checkboxes for controlling the final formatting in the spreadsheet:
Use as Pipeline Step: When checked, this statement will use the results of the previous statement as its data source instead of querying the entire document. This is the key control for enabling pipeline workflows.
Use Description as Section Header: When checked, the statement's description (e.g., "Room List") will be written as a merged, centered header row in the spreadsheet before its data results.
Include Column Names: This option, enabled by default, includes the column headers (e.g.,
Label,Area) in the spreadsheet output for this statement.Add Empty Row After: When checked, a blank row will be inserted after this statement's results, providing visual separation in a multi-section report.
Print Results in Bold: Renders the data cells for this statement's results in a bold font for emphasis.
- The Query Presets dropdown allows you to load and save individual, commonly used SQL queries.
Die Schaltfläche Speichern speichert die Änderungen an der geladenen Anweisung. Wenn das Kontrollkästchen
Speichern und Weiter aktiviert und die Schaltfläche
Speichern gedrückt wird, wird zusätzlich zum Speichern eine neue Anweisung erstellt, um die Bearbeitung zu optimieren. Die Schaltfläche ❌ Verwerfen schließt den Anweisungseditor, ohne die vorgenommenen Änderungen zu speichern.
Arbeitsablauf
Dieses kurze Tutorial führt durch die Erstellung eines vollständigen Raumplans, von einer einfachen Liste bis hin zu einem mehrteiligen Bericht mit berechneten Summen.
Schritt 1: Neuer Bericht
- Die Schaltfläche
BIM Bericht in der Werkzeugleiste des Arbeitsbereichs BIM anklicken.
- FreeCAD erzeugt ein Report-Objekt und eine ReportResult-Kalkulationstabelle in der Baumansicht und öffnet automatisch das Aufgaben-Fenster.
Schritt 2: Einfache Anweisung
First, let's create a simple list of all spaces and their areas.
- In the Report Statements, click the
Add Statement button. A new, empty statement will appear in the list.
- With the new statement selected, click the
Edit Selected button. The Statement Editor will appear at the bottom of the Task Panel.
- In the Description field, type
Room List. - In the SQL Query editor, enter the following query. This selects the name and area of all objects that are
Spaces and sorts them alphabetically.SELECT Label, Area FROM document WHERE IfcType = 'Space' ORDER BY Label ASC
- Click the
Save button in the editor to commit your changes to the statement.
Schritt 3: Mehrteiliger Bericht
Now, let's add a second statement to calculate the total area.
- In the overview, click
Add Statement again to create a second statement.
- With this new statement selected, click
Edit Selected.
- Set the Description to
Total Area. - In the SQL Query editor, enter this aggregation query:
SELECT 'Total Usable Area', SUM(Area) FROM document WHERE IfcType = 'Space'
- Under Display Options, uncheck Include Column Names (since our first column is a custom label) and check Print Results in Bold for emphasis.
- Click
Save. You now have a two-statement report. Click the main OK button at the bottom of the Task Panel to execute it. The associated spreadsheet will open automatically with the formatted results.
Schritt 4: Befehlsverknüpfung für erweiterte Abfragen
Mit Befehlsverknüpfung können Abfragen miteinander verknüpft werden, wobei die Ausgabe einer Abfrage als Eingabe für die nächste dient. Dies ist für komplexe hierarchische Auswahlen unerlässlich, beispielsweise bei Verwendung der Funktion CHILDREN(). Da es sich nicht um eine rekursive Funktion handelt, werden nur direkte Nachkommen gefunden.
Um beispielsweise alle Türen im „Erdgeschoss“ zu finden, muss eine mehrstufige Abfrage durchgeführt werden, da Türen Unterelemente von Wänden sind, die wiederum Unterelemente des Stockwerks sind.
- Create a new report.
- Statement 1: Find the 'Ground Floor' Object
- Add a statement with the description
Find Ground Floor. - This query selects the starting point of our search.
SELECT * FROM document WHERE Label = 'Ground Floor'
- Add a statement with the description
- Statement 2: Find the Walls on that Floor
- Add a second statement with the description
Find Walls on Floor. - In the editor, check the
Use as Pipeline Step checkbox. This tells the statement to run on the results of the previous one (the floor object).
- Use this query to find all direct children of the floor and keep only the walls:
SELECT * FROM CHILDREN(SELECT * FROM document) WHERE IfcType = 'Wall'
- Add a second statement with the description
- Statement 3: Find the Doors in those Walls
- Add a third statement with the description
Find Doors in Walls. - Check the
Use as Pipeline Step checkbox again. This now links it to the output of Statement 2 (the list of walls).
- Use this query to find the children of the walls and keep only the doors:
SELECT Label, Width, Height FROM CHILDREN(SELECT * FROM document) WHERE IfcType = 'Door'
- Add a third statement with the description
- Click OK. The report will execute the full three-step pipeline.
Das Ergebnis verstehen: Die endgültige Tabelle zeigt nur die Ergebnisse der letzten Anweisung in der Pipeline (die Liste der Türen). Die ersten beiden Anweisungen fungieren als Zwischenfilter, deren Ergebnisse im Speicher weitergegeben, aber nicht in die Tabelle gedruckt werden, sodass Sie einen übersichtlichen und präzisen Abschlussbericht erhalten.
Schritt 5: Voreinstellungen und Vorlagen
- Report Templates load a full, multi-statement report. In the Report Statements, select a template like "Room and Area Schedule" from the dropdown to instantly load the configuration from Steps 2 & 3. You can save your own reports as new templates for reuse.
- Query Presets load a single query into the editor. In the Statement Editor, select a preset like "All Walls" from the dropdown to populate the SQL editor. You can save your own frequently used queries by clicking the Save… button.
BIM SQL-Dialektreferenz
Dieser Abschnitt enthält detaillierte Informationen zum SQL-Dialekt, der vom BIM Berichtswerkzeug verwendet wird.
Hinweis: Die aktuellsten Informationen zu allen Klauseln und Funktionen findet man jederzeit in der Benutzeroberfläche, indem man im Aufgaben-Fenster-Editor des Berichts auf die Schaltfläche Hilfe klickt.
Klauseln
SELECT: Specifies the columns of data to return. Can use*to select a default identifier for all objects.FROM: Specifies the data source. In a standalone query, this is alwaysdocument. In a pipeline,documentis a placeholder for the data from the previous step. Can also use theCHILDREN()function.WHERE: Filters objects based on conditions.GROUP BY: Groups rows that have the same values into summary rows, typically used with aggregate functions.ORDER BY: Sorts the final results. Can be followed byASC(ascending, default) orDESC(descending). Supports sorting by multiple columns.AS: Creates an alias (a custom name) for a column in theSELECTclause, e.g.,SELECT Area AS "My Area".
Anwendungshinweise für GROUP BY und ORDER BY
Der Dialekt hat spezifische Regeln für die Verwendung von Ausdrücken (wie Funktionen oder Arithmetik) in den Klauseln GROUP BY und ORDER BY.
- For
GROUP BY: When grouping by an expression, you must repeat the entire expression in theGROUP BYclause. Using an alias from theSELECTlist is not supported.- ✅ Correct:
SELECT TYPE(*) … GROUP BY TYPE(*)
- ❌ Incorrect:
SELECT TYPE(*) AS BimType … GROUP BY BimType
- ✅ Correct:
- For
ORDER BY: Conversely, sorting by a raw expression is not supported. To sort by the result of an expression, you must first include it in theSELECTlist with anASalias, and then refer to that alias in theORDER BYclause.- ✅ Correct:
SELECT Label, LOWER(Label) AS sort_key … ORDER BY sort_key
- ❌ Incorrect:
SELECT Label … ORDER BY LOWER(Label)
- ✅ Correct:
Funktionen
The dialect includes a library of built-in functions for data manipulation and analysis.
| Category | Function | Description |
|---|---|---|
| Aggregate | COUNT(property|*)
|
Counts the number of objects. COUNT(*) counts all rows; COUNT(property) counts rows where the specified property is not NULL.
|
SUM(property)
|
Calculates the sum of a numerical property. | |
MIN(property)
|
Finds the minimum value of a numerical property. | |
MAX(property)
|
Finds the maximum value of a numerical property. | |
| Hierarchical | PARENT(*)
|
Returns the architecturally significant parent of an object (e.g., the Wall a Window is in), transparently skipping over generic groups. |
CHILDREN(subquery)
|
A function used in the FROM clause. Returns all children of objects found by the subquery, resolving both containment (.Group) and hosting (.Hosts) relationships. This function is not recursive. To find grandchildren or deeper descendants, chain multiple CHILDREN() steps together using a pipeline.
| |
CHILDREN_RECURSIVE(subquery, max_depth=15)
|
A function used in the FROM clause. Returns all descendant objects of the subquery results by recursively traversing the hierarchy. It transparently skips generic groups. An optional max_depth can be specified (default: 15, 0 for unlimited). This replaces the need for complex pipelines to find nested objects.
| |
| Utility | TYPE(*)
|
Returns the object's user-facing type, as determined by its proxy (e.g., Wall, Space, Part::Box).
|
CONVERT(quantity, 'unit')
|
Converts a FreeCAD Quantity object to a new unit and returns it as a raw number. Example: CONVERT(Area, 'm^2').
| |
| String | LOWER(property)
|
Converts a text property to lowercase. |
UPPER(property)
|
Converts a text property to uppercase. | |
CONCAT(val1, val2, …)
|
Joins multiple text values and properties together into a single string. |
Eigenschaftenzugriff
Es kann auf alle Eigenschaften eines Objekts zugegriffen werden, einschließlich verschachtelter Datenstrukturen.
- Direct Access: Access a simple property directly by its name.
- Example:
Label,IfcType
- Example:
- Nested Access: Use dot notation to access sub-properties.
- Example:
Shape.Volume,Placement.Base.z
- Example:
- Chained Access: Chain property access onto the result of a function, most commonly
PARENT().- Example:
PARENT(*).Label,PARENT(*).PARENT(*).Height
- Example:
Operatoren
| Type | Operators | Description |
|---|---|---|
| Comparison | =, !=, >, <, >=, <=
|
Standard comparison operators. |
LIKE
|
Case-insensitive pattern matching. Use % for multiple characters and _ for a single character.
| |
IS NULL, IS NOT NULL
|
Checks if a property has a value. | |
IN (value1, value2, …)
|
Checks if a property's value is in a given list of literals. | |
| Logical | AND, OR
|
Used in the WHERE clause to combine multiple conditions.
|
| Arithmetic | +, -, *, /
|
Perform calculations on numerical properties. Obeys standard operator precedence; use () to override.
|
Allgemeine Syntax
- Literals and Quotes: Both single quotes (
') and double quotes (") can be used for text literals (strings). For example,WHERE Label = 'Wall'andWHERE Label = "Wall"are equivalent. - Comments: The parser ignores both single-line comments, which start with
--, and multi-line comments, which are enclosed in/* … */. - Internationalization: The parser correctly handles non-ASCII (Unicode) characters in property names (e.g., Fläche).
Beispiel-Abfragen
Dieser Abschnitt enthält eine Sammlung praktischer Abfragen, die direkt verwendet werden oder für die Berichte angepasst werden können.
Grundlegende Auswahlen
Alle Strukturelemente auswählen (Säulen und Träger):
SELECT Label, IfcType
FROM document
WHERE IfcType IN ('Column', 'Beam')
ORDER BY IfcType, Label
Alle Wände auswählen, deren Name „Außen“ enthält:
SELECT Label, Length, Height
FROM document
WHERE IfcType = 'Wall' AND Label LIKE '%Exterior%'
Datenaggregation und Zusammenfassungen
Alle BIM-Objekte zählen, gruppiert nach ihrem Typ:
SELECT IfcType, COUNT(*)
FROM document
WHERE IfcType IS NOT NULL
GROUP BY IfcType
ORDER BY IfcType ASC
Eine vollständige Mengenermittlung für alle Wände erhalten:
Diese Abfrage berechnet die Gesamtzahl der Wände, ihre Gesamtlänge sowie die minimale und maximale Wandhöhe.
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'
Hierarchische Abfragen
Liste aller Objekte, die sich direkt im „Erdgeschoss“ befinden:
Hierbei wird die Funktion CHILDREN() verwendet, um den Inhalt eines bestimmten Containerobjekts abzufragen.
SELECT Label, IfcType
FROM CHILDREN(SELECT * FROM document WHERE Label = 'Ground Floor')
ORDER BY IfcType
Alle Türen und die jeweilige Wand auflisten, in der sie sich befinden:
Hierbei wird die Funktion PARENT() verwendet, um den Host jeder Tür zu ermitteln.
SELECT
Label AS "Door_Name",
PARENT(*).Label AS "Host_Wall_Name"
FROM document
WHERE IfcType = 'Door'
ORDER BY "Host_Wall_Name"
Alle Fenster im „Erdgeschoss“ finden (indem die Vorgänger überprüft werden):
Diese Abfrage findet Fenster, überprüft deren übergeordnetes Element (die Wand) und anschließend das übergeordnete Element dieser Wand (den Boden).
SELECT Label
FROM document
WHERE IfcType = 'Window' AND PARENT(*).PARENT(*).Label = 'Ground Floor'
Erweiterte Abfragen
Einen vollständigen Raum- und Flächenplan erstellen:
Diese Abfrage erzeugt eine formatierte Liste aller Räume, gruppiert nach der Etage, zu der sie gehören, mit ihrer Fläche umgerechnet in Quadratmeter.
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"
Anwendungshinweise
Einheiten
Wenn eine Eigenschaft ausgewählt wird, die Einheiten (eine „Quantität“) hat, wie z. B. „Länge“ oder „Fläche“, gibt die BIM-Report-Engine den rohen numerischen Wert dieser Eigenschaft zurück, wie er intern im FreeCAD-Dokument gespeichert ist. Die internen Einheiten von FreeCAD basieren immer auf Millimetern (mm).
Das bedeutet, dass die Standardausgabe unabhängig vom aktuellen Einheitenschema oder den Benutzereinstellungen in mm für Länge, mm² für Fläche und mm³ für Volumen erfolgt. Die automatisch generierte Spaltenüberschrift gibt diese interne Einheit korrekt wieder.
Beispiel: Standardverhalten
Wenn diese einfache Abfrage auf einer Fläche von 1 Meter mal 1 Meter ausgeführt wird:
SELECT Label, Area FROM document WHERE IfcType = 'Space'
Die resultierende Kalkulationstabelle zeigt:
- Header:
Area (mm²) - Value:
1000000.0
<span id="Using_CONVERT()">
Verwendung von CONVERT()
Um die Ergebnisse in den gewünschten Einheiten zu erhalten, kann die Funktion CONVERT() verwendet werden, die eine explizite Kontrolle über die Ausgabe ermöglicht. Um die Fläche in Quadratmetern zu erhalten, ändert man die Abfrage wie folgt:
SELECT Label, CONVERT(Area, 'm^2') AS "Area (m²)" FROM document WHERE IfcType = 'Space'
Diese Abfrage liefert nun das Ergebnis in der gewünschten Einheit.:
- Header:
Area (m²) - Value:
1.0
Die Verwendung von CONVERT() garantiert, dass die Ausgabe des Berichts eindeutig ist und dass alle Berechnungen, die innerhalb der Abfrage durchgeführt werden (z. B. SUM(CONVERT(Area, 'm^2'))), mathematisch korrekt sind.
Eigenschaften
Ein Arch Report-Objekt stellt dem Benutzer die folgenden Eigenschaften zur Verfügung.
Daten
Report
- Daten-EigenschaftAutoUpdate: Diese Eigenschaft, die standardmäßig auf „True“ gesetzt ist, steuert, ob der Bericht bei jeder Neuberechnung des Dokuments automatisch erneut ausgeführt wird. Wenn diese Option aktiviert ist, wird die Berichtstabelle immer mit dem Modell synchronisiert. Wenn beispielsweise die Länge einer Wand geändert wird, wird der Wert
SUM(Length)im Bericht nach der Neuberechnung automatisch aktualisiert. Bei sehr großen Modellen kann es aus Leistungsgründen ratsam sein, diese Option zu deaktivieren, wenn viele Änderungen vorgenommen werden. Wenn „AutoUpdate“ auf „False“ gesetzt ist, kann der Bericht jederzeit manuell aktualisiert werden, indem mit der rechten Maustaste auf das Berichtsobjekt in der Baumansicht geklickt wird und „Recompute“ ausgewählt oder indem auf die globale Schaltfläche „Recompute“ geklickt wird. - Daten-EigenschaftTarget: enthält einen Link zum Spreadsheet-Objekt, in das die Ergebnisse des Berichts geschrieben werden. Beim Erstellen eines neuen Berichts wird automatisch eine neue Tabelle erstellt und hier verknüpft. Diese Eigenschaft kann geändert werden, um bei Bedarf auf eine andere, bereits vorhandene Tabelle im aktuellen Dokument zu verweisen.
Skripten
Die BIM Bericht-Engine ist vollständig über Python zugänglich, sodass die erweiterten Abfragefunktionen in die eigenen Skripte und Automatisierungen integrieren kann.
Arch.selectObjects(query_string)
Dies ist die Hauptfunktion zum Ausführen einer einzelnen, einfachen SQL-Abfrage. Sie nimmt eine Abfragezeichenfolge als Eingabe entgegen und gibt eine Liste der FreeCAD-Dokumentobjekte zurück, die der Abfrage entsprechen. Wenn die Abfrage ungültig ist oder keine Objekte findet, gibt sie eine leere Liste zurück und gibt eine Fehlermeldung an die Konsole aus.
Beispiel: Alle Wandobjekte mit „Exterior“ (Außenbereich) im Namen abrufen
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)
Für komplexere, mehrstufige Auswahlen kann diese Funktion verwendet werden, um eine Pipeline auszuführen. Sie nimmt eine Liste von ArchSql.ReportStatement-Objekten entgegen und gibt die endgültige Liste der FreeCAD-Dokumentobjekte zurück, die aus der vollständigen Pipeline resultieren.
Dies entspricht programmatisch der Verwendung des Kontrollkästchens „Als Pipeline-Schritt verwenden“ in der Benutzeroberfläche.
Beispiel: Finde alle Türen im „Erdgeschoss“"
Dies ist ein klassisches hierarchisches Problem, das mehrere Schritte erfordert. Das Ziel besteht darin, die „Enkelkinder” (Türen) eines „Großelternteils” (des Stockwerks) zu finden. Da die Funktion CHILDREN() nicht rekursiv ist, müssen wir mehrere Schritte in einer Pipeline verketten.
- Zuerst suchen wir das Objekt
'Ground Floor'. - Zweitens finden wir seine direkten Kinder (die Wände, Räume usw.).
- Drittens finden wir die Kinder dieser Objekte (zu denen auch die Türen und Fenster gehören, die von den Wänden gehostet werden).
- Schließlich filtern wir diese letzte Gruppe, um nur die Türen zu behalten.
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")
Überprüfen und Teilen eines Berichts über die Python-Konsole
Zum Debuggen, Skripten oder Teilen der Arbeit mit anderen kann eine vollständige, für Menschen lesbare Zusammenfassung der Konfiguration eines Berichts direkt aus der Python-Konsole abgerufen werden.
Die benutzerdefinierte Logik und der detaillierte Inhalt eines BIM-Berichts werden in seinem „Proxy-Objekt” gespeichert. Durch Zugriff auf das Attribut .Proxy erhält man einen vollständigen Ausdruck aller Anweisungen und der SQL-Abfragen. Auf diese Weise kann man die gesamte Berichtsdefinition bequem in die Zwischenablage kopieren, um sie in einem Forum oder einem Fehlerbericht zu teilen.
Wie man es benutzt:
- Das Berichtsobjekt in der Baumansicht auswählen.
- Strg+Umschalt+P drücken. Dadurch wird das ausgewählte Objekt als Variable
objan die Python-Konsole gesendet. - In der Konsole Folgendes eingeben und die Eingabetaste drücken:
print(obj.Proxy)
Beispiel-Ausgabe:
>>> 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
Diese Seite wird abgerufen von https://wiki.freecad.org/BIM_Report