Teil 3 der Serie „KI für Ingenieure"
Lesezeit: ~8 Minuten Zielgruppe: FreeCAD-Anwender, Konstrukteure, CAD-Einsteiger Takeaway: 3 fertige FreeCAD-Macros + KI-Prompt zum Selberschreiben
FreeCAD + KI: Ein unschlagbares Duo
FreeCAD hat eine Superkraft, die viele nicht nutzen: eine vollständige Python-API. Jeder Klick, jedes Feature, jede Bemaßung lässt sich als Python-Code ausdrücken. Und Python ist genau die Sprache, in der KI-Modelle am besten sind.
Die Kombination ist mächtig:
- Kennst du FreeCAD, aber nicht Python? → Die KI schreibt das Macro für dich.
- Kannst du Python, aber nicht FreeCADs API? → Sag der KI, was das Bauteil machen soll, sie nutzt die richtigen API-Calls.
- Kannst du beides nicht? → Beschreib dein Problem auf Deutsch, die KI liefert fertigen Code.
FreeCAD Python API — die Basics (auch ohne Vorkenntnisse)
Ein FreeCAD-Macro ist nichts anderes als eine .py-Datei, die in FreeCAD ausgeführt wird. Die wichtigsten Module:
# Basismodule
import FreeCAD # Die App selbst
import FreeCADGui # Die grafische Oberfläche
import Part # 3D-Geometrie
import Draft # 2D-Zeichnungen
import Mesh # Mesh-Operationen
# Hilfreich
import math # Mathematik
import os # Dateioperationen
Ein minimalistisches Macro, das einen Würfel erstellt:
import FreeCAD
import Part
# Neues Dokument
doc = FreeCAD.newDocument("MeinBauteil")
# Würfel erstellen
box = Part.makeBox(100, 50, 30)
# Zum Dokument hinzufügen
obj = doc.addObject("Part::Feature", "Grundplatte")
obj.Shape = box
# Ansicht aktualisieren
doc.recompute()
FreeCADGui.SendMsgToActiveView("ViewFit")
Kern der Idee: Statt dieses Wissen mühsam aus Dokumentationen zusammenzusuchen, schreibst du einen deutschen Satz wie „Erstelle einen Würfel 100x50x30 mm in einem neuen Dokument" und die KI liefert dir genau diesen Code.
Wie du mit KI Macros schreibst (auch ohne Python-Profi zu sein)
Der Prompt-Ansatz
Beschreibe der KI genau, was das Macro tun soll:
Schreibe ein FreeCAD-Python-Macro, das folgendes macht:
1. Öffnet ein neues Dokument "Baugruppe_001"
2. Erstellt eine Grundplatte (200 x 150 x 20 mm) aus S235JR
3. Setzt 4 Bohrungen (Durchmesser 12 mm) in die Ecken:
- Abstand zum Rand: 20 mm
- Durchgangsloch
4. Fügt eine Nut (Breite 10 mm, Tiefe 5 mm) in der Mitte der Längsseite hinzu
5. Speichert das Dokument als "Baugruppe_001.FCStd"
Wichtige FreeCAD-API-Hinweise:
- Für zylindrische Bohrungen: Part.makeCylinder(radius, height) und cut davon
- Für Nuten: Part.makeBox() und cut
- Verwende deutsche Einheiten (mm)
- Füge Kommentare für jeden Schritt hinzu
Das Ergebnis ist ein sofort lauffähiges Macro — kopieren, in FreeCAD einfügen, ausführen.
Wichtige API-Konzepte, die du dem Prompt mitgeben solltest
Damit die KI guten FreeCAD-Code schreibt, gib ihr diese Hinweise mit:
- Part.makeBox(L, B, H) = Quader
- Part.makeCylinder(Radius, Höhe) = Zylinder
- Part.makeSphere(Radius) = Kugel
- obj.Shape = shape = Form dem Dokument hinzufügen
- shape1.cut(shape2) = Differenz (z.B. Bohrung)
- shape1.fuse(shape2) = Vereinigung
- doc.recompute() = Aktualisieren nach Änderungen
- Part.show(shape) = Form in aktuellem Dokument anzeigen
Macro #1: Automatische Bemaßung
Problem: Du hast ein Bauteil konstruiert und willst schnell eine bemaßte 2D-Ableitung für die Fertigungszeichnung.
# Automatische Bemaßung - KI-generiertes Macro
# Erstellt TechDraw-Bemaßungen für ein ausgewähltes Bauteil
import FreeCAD
import FreeCADGui
import TechDraw
import math
# Aktuelles Dokument und Auswahl
doc = FreeCAD.ActiveDocument
if doc is None:
raise Exception("Kein geöffnetes Dokument!")
selection = FreeCADGui.Selection.getSelection()
if len(selection) == 0:
raise Exception("Bitte wähle ein Bauteil aus!")
obj = selection[0]
# TechDraw-Seite erstellen
page = doc.addObject("TechDraw::DrawPage", "Zeichnung")
template = doc.addObject("TechDraw::DrawSVGTemplate", "Vorlage")
template.Template = "/usr/share/freecad/Mod/TechDraw/Templates/A4_Landscape.svg"
page.Template = template
# Ansicht des Bauteils erstellen
view = doc.addObject("TechDraw::DrawViewPart", "Ansicht")
view.Source = obj
page.addView(view)
# Grundmaße automatisch setzen (vereinfacht)
if hasattr(obj, "Shape") and obj.Shape is not None:
bb = obj.Shape.BoundBox
# Länge, Breite, Höhe als Text
text_length = doc.addObject("TechDraw::DrawViewAnnotation", "Laenge")
text_length.Text = f"L = {bb.XLength:.0f} mm"
page.addView(text_length)
text_width = doc.addObject("TechDraw::DrawViewAnnotation", "Breite")
text_width.Text = f"B = {bb.YLength:.0f} mm"
page.addView(text_width)
text_height = doc.addObject("TechDraw::DrawViewAnnotation", "Hoehe")
text_height.Text = f"H = {bb.ZLength:.0f} mm"
page.addView(text_height)
doc.recompute()
print("✅ Bemaßung erstellt!")
So nutzt du es: Wähle in FreeCAD ein Bauteil aus → Menü Macro → Ausführen. Fertig ist die Bemaßung.
Macro #2: Batch-Export (STEP → STL → PDF)
Problem: Du hast 15 Bauteile aus einer Baugruppe und brauchst sie in STEP (für Lieferanten), STL (für 3D-Druck) und PDF (für die Dokumentation). Jedes einzeln exportieren? Kein Macro?
# Batch-Export Macro
# Exportiert alle Körper eines Dokuments in STEP, STL und PDF
import FreeCAD
import FreeCADGui
import Mesh
import os
# Zielverzeichnis
export_dir = os.path.expanduser("~/export/")
if not os.path.exists(export_dir):
os.makedirs(export_dir)
doc = FreeCAD.ActiveDocument
if doc is None:
raise Exception("Kein Dokument geöffnet!")
# Alle Part-Objekte finden
objects = [o for o in doc.Objects if hasattr(o, "Shape") and o.Shape is not None]
for i, obj in enumerate(objects):
base_name = f"{i+1:02d}_{obj.Name}"
print(f"Exportiere: {obj.Label}")
# STEP Export
step_path = os.path.join(export_dir, f"{base_name}.step")
obj.Shape.exportStep(step_path)
print(f" ✅ STEP: {step_path}")
# STL Export
stl_path = os.path.join(export_dir, f"{base_name}.stl")
Mesh.export([obj], stl_path)
print(f" ✅ STL: {stl_path}")
# PDF Export (TechDraw-Seite)
try:
import TechDraw
page = doc.addObject("TechDraw::DrawPage", "ExportPage")
template = doc.addObject("TechDraw::DrawSVGTemplate", "Template")
template.Template = "/usr/share/freecad/Mod/TechDraw/Templates/A4_Landscape.svg"
page.Template = template
all_views = []
for obj in objects:
v = doc.addObject("TechDraw::DrawViewPart", f"View_{obj.Name}")
v.Source = obj
page.addView(v)
all_views.append(v)
doc.recompute()
pdf_path = os.path.join(export_dir, f"{doc.Name}.pdf")
# PDF-Export über Qt (FreeCADs PDF-Funktion)
from PySide import QtGui
page_view = FreeCADGui.ActiveDocument.getObject(page.Name)
# Hinweis: PDF-Export erfordert manuelle Anpassung
print(f" ⏳ PDF-Export manuell: Datei > Export > PDF")
except Exception as e:
print(f" ⚠️ PDF-Export übersprungen: {e}")
print(f"\n✅ Export abgeschlossen! → {export_dir}")
Zeitersparnis: Statt 15 Bauteile à 3 Minuten manuell zu exportieren (= 45 Minuten) → Ein Klick, 30 Sekunden.
Macro #3: Normteil-Bibliothek durchsuchen und einfügen
Problem: Du brauchst eine ISO 4017 M10x30 Schraube in deiner Baugruppe. Statt sie jedes Mal neu zu konstruieren, sucht dieses Macro in einer Normteil-Bibliothek.
# Normteil-Einfüger Macro
# Durchsucht die FreeCAD-Parts-Library nach Normteilen und fügt sie ein
import FreeCAD
import FreeCADGui
import os
import glob
# Pfad zur FreeCAD Parts Library (anpassen!)
library_path = os.path.expanduser("~/.local/share/FreeCAD/Mod/parts_library/")
if not os.path.exists(library_path):
# Alternative Pfade probieren
alt_paths = [
"/usr/share/freecad/Mod/parts_library/",
os.path.expanduser("~/FreeCAD/Mod/parts_library/"),
]
for p in alt_paths:
if os.path.exists(p):
library_path = p
break
def search_normteil(bezeichnung):
"""Durchsucht die Bibliothek nach Normteilen"""
results = []
pattern = f"**/*{bezeichnung}*.FCStd"
for file in glob.glob(os.path.join(library_path, pattern), recursive=True):
name = os.path.basename(file).replace(".FCStd", "")
rel_path = os.path.relpath(file, library_path)
results.append((name, file, rel_path))
return results
# Benutzereingabe (in FreeCAD über Dialog)
from PySide import QtGui, QtCore
text, ok = QtGui.QInputDialog.getText(
None, "Normteil suchen", "Norm-Bezeichnung (z.B. ISO 4017 M10):"
)
if ok and text:
results = search_normteil(text)
if not results:
QtGui.QMessageBox.information(None, "Keine Ergebnisse",
f"Kein Normteil '{text}' in der Bibliothek gefunden.")
else:
# Ergebnisse anzeigen
items = [f"{name} ({rel_path})" for name, path, rel_path in results]
choice, ok = QtGui.QInputDialog.getItem(
None, "Normteil auswählen", "Gefundene Teile:", items, 0, False
)
if ok and choice:
idx = items.index(choice)
name, file_path, _ = results[idx]
# Normteil öffnen und in aktuelles Dokument einfügen
norm_doc = FreeCAD.openDocument(file_path)
norm_objects = norm_doc.Objects
for obj in norm_objects:
if hasattr(obj, "Shape") and obj.Shape is not None:
FreeCAD.ActiveDocument.copyObject(obj, True)
norm_doc.save()
FreeCAD.closeDocument(norm_doc.Name)
FreeCAD.ActiveDocument.recompute()
print(f"✅ {name} eingefügt!")
Debugging-Tipps: Was tun, wenn das Macro nicht läuft
Fehler sind normal — hier die häufigsten Probleme und Lösungen:
| Fehler | Ursache | Lösung |
|---|---|---|
ModuleNotFoundError: No module named 'Part' | FreeCAD-Umgebung nicht geladen | Macro in FreeCAD ausführen, nicht in Python standalone |
'NoneType' object has no attribute 'Shape' | Kein Objekt ausgewählt | Vor Macro-Start Bauteil im Tree auswählen |
Cannot find file | Falscher Pfad zur Vorlage | Template-Pfad an dein System anpassen |
Part.makeBox() got unexpected keyword | Falsche API-Version | Sag der KI: „FreeCAD 0.21 API verwenden" |
| Deutsche Umlaute im Code | UTF-8 Problem | # -*- coding: utf-8 -*- an den Dateianfang |
Die 3-Schritte-Debugging-Methode
- Fehlermeldung kopieren und der KI geben: „Dieses FreeCAD-Macro gibt [FEHLER] — was ist falsch?"
- Prompt verfeinern: „Berücksichtige, dass ich FreeCAD 0.21 auf Ubuntu 24.04 nutze."
- Schrittweise testen: „Schreibe das Macro so um, dass es jeden Schritt einzeln ausführt und nach jedem Schritt '✅ Schritt X fertig' ausgibt."
Der Prompt aus diesem Artikel ist einer von vielen. Das Pack enthält 56 ausformulierte Prompts für den Konstruktionsalltag — Stücklisten, CAD-Modelle, technische Dokumentation. Hinweis: die Produktseite ist auf Englisch.
Fazit
FreeCAD-Macros sind der schnellste Weg, wiederkehrende CAD-Arbeit zu automatisieren — und KI macht die Hürde fast unsichtbar. Du musst kein Python-Profi sein. Du musst nur beschreiben können, was das Bauteil tun soll.
Die 3 Macros aus diesem Artikel decken 80% des täglichen Automatisierungsbedarfs ab:
- Bemaßung — Fertigungszeichnung in Sekunden
- Batch-Export — Mehrere Formate auf einmal
- Normteile — DIN/ISO-Teile per Knopfdruck einfügen
Nächste Woche: Teil 4 — „Perfekte 3D-Druck-Profile in 5 Minuten — mit KI-Analyse"
Teil 3 der Serie „KI für Ingenieure"
Hast du schon FreeCAD-Macros geschrieben? Welche Aufgabe würdest du als nächstes automatisieren? Schreib's in die Kommentare!
Die Serie „KI für Ingenieure“
- Teil 1: KI-Prompts für Ingenieure richtig schreiben
- Teil 2: Stückliste aus dem CAD-Export mit ChatGPT erstellen
- Teil 3: FreeCAD-Makro mit KI erstellen — du liest ihn gerade
- Teil 4: 3D-Druck-Profile mit KI optimieren
- Teil 5: CE-Dokumentation mit KI vorbereiten
- Teil 6: Angebotskalkulation mit KI
- Teil 7: Excel automatisieren mit KI
- Teil 8: Der komplette KI-Workflow — vom Auftrag zur Fertigung