KiMatrix / Artikel / FreeCAD-Makro mit KI

FreeCAD-Makro mit KI erstellen — drei fertige Beispiele

21. August 2026 · Teil 3 der Serie „KI für Ingenieure“

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:

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:

  1. Part.makeBox(L, B, H) = Quader
  2. Part.makeCylinder(Radius, Höhe) = Zylinder
  3. Part.makeSphere(Radius) = Kugel
  4. obj.Shape = shape = Form dem Dokument hinzufügen
  5. shape1.cut(shape2) = Differenz (z.B. Bohrung)
  6. shape1.fuse(shape2) = Vereinigung
  7. doc.recompute() = Aktualisieren nach Änderungen
  8. 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:

FehlerUrsacheLösung
ModuleNotFoundError: No module named 'Part'FreeCAD-Umgebung nicht geladenMacro in FreeCAD ausführen, nicht in Python standalone
'NoneType' object has no attribute 'Shape'Kein Objekt ausgewähltVor Macro-Start Bauteil im Tree auswählen
Cannot find fileFalscher Pfad zur VorlageTemplate-Pfad an dein System anpassen
Part.makeBox() got unexpected keywordFalsche API-VersionSag der KI: „FreeCAD 0.21 API verwenden"
Deutsche Umlaute im CodeUTF-8 Problem# -*- coding: utf-8 -*- an den Dateianfang

Die 3-Schritte-Debugging-Methode

  1. Fehlermeldung kopieren und der KI geben: „Dieses FreeCAD-Macro gibt [FEHLER] — was ist falsch?"
  2. Prompt verfeinern: „Berücksichtige, dass ich FreeCAD 0.21 auf Ubuntu 24.04 nutze."
  3. Schrittweise testen: „Schreibe das Macro so um, dass es jeden Schritt einzeln ausführt und nach jedem Schritt '✅ Schritt X fertig' ausgibt."
Passend zu diesem Artikel
CAD Prompt Pack — 56 KI-Prompts für Konstrukteure

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.

Prompt-Pack ansehen (14,99 $) →

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:

  1. Bemaßung — Fertigungszeichnung in Sekunden
  2. Batch-Export — Mehrere Formate auf einmal
  3. 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“