# RFEM Universeller Strukturberechner - Dokumentation

## Übersicht

Der RFEM Universeller Strukturberechner ist eine Anwendung, die es ermöglicht, strukturelle Berechnungen basierend auf einfachen Textbeschreibungen durchzuführen. Die Anwendung nutzt die OpenAI-API, um Python-Code zu generieren, der dann mit RFEM Dlubal ausgeführt wird.

## Systemanforderungen

- RFEM 6 (muss installiert und geöffnet sein)
- Python 3.6 oder höher
- Streamlit (`pip install streamlit`)
- OpenAI Python-Bibliothek (`pip install openai`)
- OpenAI API-Schlüssel (als Umgebungsvariable `OPENAI_API_KEY` gesetzt)

## Installation und Einrichtung

1. **Ordnerstruktur einrichten:**
   ```
   /home/user/
   ├── RFEM_web.py
   ├── RFEM_prompts.py
   ├── RFEM_advanced.py
   ├── test_rfem.py
   ├── templates/
   │   ├── introduction.txt
   │   ├── Material.txt
   │   ├── Geometry.txt
   │   ├── crosssection.txt
   │   ├── load.txt
   │   ├── solver.txt
   │   └── results.txt
   └── examples/
       ├── bodenplatte_beispiel.md
       ├── einfeld_traeger_beispiel.md
       ├── zweifeld_traeger_beispiel.md
       ├── stuetze_beispiel.md
       ├── rahmen_beispiel.md
       └── fachwerk_beispiel.md
   ```

2. **OpenAI API-Schlüssel einrichten:**
   - Unter Linux/Mac:
     ```bash
     export OPENAI_API_KEY="Ihr-API-Schlüssel"
     ```
   - Unter Windows (PowerShell):
     ```powershell
     $env:OPENAI_API_KEY="Ihr-API-Schlüssel"
     ```

3. **RFEM 6 starten:**
   - Stellen Sie sicher, dass RFEM 6 auf Ihrem System installiert und geöffnet ist.

4. **Anwendung starten:**
   ```bash
   streamlit run RFEM_advanced.py
   ```

## Verwendung

### Hauptfunktionen

1. **Strukturtyp auswählen:**
   - Wählen Sie einen Strukturtyp aus der Seitenleiste (Freie Eingabe, Bodenplatte, Einfeld-Träger, etc.).
   - Bei Auswahl eines spezifischen Strukturtyps wird die Textbox automatisch mit einem Beispieltext gefüllt.

2. **Projektbeschreibung eingeben:**
   - Geben Sie eine detaillierte Beschreibung Ihres Projekts ein.
   - Beispiel: "Eine rechteckige Bodenplatte 4 m x 6 m, 20 cm dick, aus Stahlbeton C25/30, mit Randauflager. Belastung: Flächenlast 3 kN/m² nach unten."

3. **Erweiterte Optionen anpassen:**
   - OpenAI-Modell: Wählen Sie zwischen gpt-4o, gpt-4-turbo und gpt-3.5-turbo.
   - Kreativität (Temperature): Stellen Sie die Kreativität der KI ein (0.0 = deterministisch, 1.0 = kreativ).
   - Python-Code anzeigen: Aktivieren Sie diese Option, um den generierten Python-Code anzuzeigen.
   - Ergebnisse exportieren: Aktivieren Sie diese Option, um die Berechnungsergebnisse zu exportieren.

4. **Generieren und Berechnen:**
   - Klicken Sie auf "Generieren & Berechnen", um den RFEM-Code zu generieren und auszuführen.
   - Die Anwendung generiert Code für MATERIAL, GEOMETRY, CROSSSECTION, LOADS und SOLVER.
   - Der generierte Code wird in RFEM ausgeführt und die Ergebnisse werden berechnet.

### Unterstützte Strukturelemente

Die Anwendung unterstützt verschiedene Strukturelemente, darunter:

1. **Bodenplatte:**
   - Rechteckige Platten mit verschiedenen Abmessungen und Dicken
   - Verschiedene Materialien (z.B. Beton C25/30)
   - Verschiedene Auflagertypen (z.B. Randauflager)
   - Flächenlasten

2. **Einfeld-Träger:**
   - Träger mit einer Spannweite
   - Verschiedene Profile (z.B. IPE 200)
   - Verschiedene Materialien (z.B. Stahl S235)
   - Gleichlasten, Einzellasten, etc.

3. **Zweifeld-Träger:**
   - Träger mit zwei Spannweiten
   - Verschiedene Profile und Materialien
   - Verschiedene Lastarten

4. **Stütze:**
   - Stützen mit verschiedenen Höhen und Querschnitten
   - Verschiedene Materialien
   - Verschiedene Auflagertypen
   - Punktlasten

5. **Rahmen:**
   - Rahmen mit verschiedenen Abmessungen
   - Verschiedene Profile und Materialien
   - Horizontallasten, Vertikallasten, etc.

6. **Fachwerk:**
   - Fachwerke mit verschiedenen Spannweiten und Höhen
   - Verschiedene Profile und Materialien
   - Punktlasten in den Knotenpunkten

## Beispielcode

### Bodenplatte

```python
# MATERIAL
Material(1, 'C25/30')  # Beton C25/30

# GEOMETRY
# Knoten definieren (4m x 6m Platte)
Node(1, 0, 0, 0)  # Ecke unten links
Node(2, 4, 0, 0)  # Ecke unten rechts
Node(3, 4, 6, 0)  # Ecke oben rechts
Node(4, 0, 6, 0)  # Ecke oben links

# Linien definieren
Line(1, [1, 2])  # Untere Kante
Line(2, [2, 3])  # Rechte Kante
Line(3, [3, 4])  # Obere Kante
Line(4, [4, 1])  # Linke Kante

# Randauflager definieren
LineSupport(1, '1,2,3,4', LineSupportType.FIXED)

# CROSSSECTION
# Dicke für Platte definieren (20 cm)
Thickness(1, 'Platte 20cm', 1, 0.2)

# Fläche definieren
Surface.Standard(1, [1, 2, 3, 4], 1)

# LOADS
# Lastfall definieren
LoadCase(1, 'Nutzlast')

# Flächenlast definieren (3 kN/m² nach unten)
SurfaceLoad(1, 1, '1', 3000, SurfaceLoadDirection.LOAD_DIRECTION_GLOBAL_Z_OR_USER_DEFINED_W)

# SOLVER
# Statische Analyseeinstellungen definieren
StaticAnalysisSettings(1, 'Linear', 1)

# Berechnung durchführen
Calculate_all()
```

### Einfeld-Träger

```python
# MATERIAL
Material(1, 'S235')  # Baustahl S235

# GEOMETRY
# Knoten definieren (5m Spannweite)
Node(1, 0, 0, 0)  # Linkes Auflager
Node(2, 5, 0, 0)  # Rechtes Auflager

# Linie definieren
Line(1, [1, 2])  # Trägerachse

# Auflager definieren
NodalSupport(1, '1', NodalSupportType.HINGED)  # Gelenkiges Auflager links
NodalSupport(2, '2', NodalSupportType.HINGED_X)  # Verschiebliches Auflager rechts

# CROSSSECTION
# Querschnitt definieren
Section(1, 'IPE 200')

# Stabelement definieren
Member(1, 1, 2, 0, 1, MemberType.BEAM)

# LOADS
# Lastfall definieren
LoadCase(1, 'Gleichlast')

# Stablast definieren (10 kN/m nach unten)
MemberLoad(1, 1, '1', 10000, MemberLoadDirection.LOAD_DIRECTION_GLOBAL_Z_OR_USER_DEFINED_W, 
           MemberLoadDistribution.LOAD_DISTRIBUTION_UNIFORM)

# SOLVER
# Statische Analyseeinstellungen definieren
StaticAnalysisSettings(1, 'Linear', 1)

# Berechnung durchführen
Calculate_all()
```

## Fehlerbehebung

### Häufige Probleme und Lösungen

1. **RFEM ist nicht geöffnet:**
   - Fehlermeldung: "Fehler bei der Verarbeitung oder Ausführung: [Spezifischer Fehler]"
   - Lösung: Stellen Sie sicher, dass RFEM 6 geöffnet ist, bevor Sie die Anwendung starten.

2. **OpenAI API-Schlüssel ist nicht gesetzt:**
   - Fehlermeldung: "openai.error.AuthenticationError: No API key provided."
   - Lösung: Setzen Sie die Umgebungsvariable OPENAI_API_KEY mit Ihrem API-Schlüssel.

3. **Fehler im generierten Code:**
   - Fehlermeldung: "Fehler bei der Verarbeitung oder Ausführung: [Spezifischer Python-Fehler]"
   - Lösung: Überprüfen Sie die Projektbeschreibung und stellen Sie sicher, dass sie klar und präzise ist. Versuchen Sie es mit einem anderen OpenAI-Modell oder einer anderen Temperature-Einstellung.

4. **Templates werden nicht gefunden:**
   - Fehlermeldung: "FileNotFoundError: [Errno 2] No such file or directory: 'templates/...'"
   - Lösung: Stellen Sie sicher, dass alle Templates im Ordner "templates" vorhanden sind und dass der Pfad korrekt ist.

## Erweiterungen und Anpassungen

### Templates anpassen

Die Templates im Ordner "templates" enthalten Anweisungen für die KI, wie sie den Python-Code generieren soll. Sie können diese Templates anpassen, um die Generierung des Codes zu beeinflussen.

### Neue Strukturelemente hinzufügen

Um neue Strukturelemente hinzuzufügen:

1. Erstellen Sie ein neues Beispiel in der Datei RFEM_advanced.py.
2. Fügen Sie den neuen Strukturtyp zur Dropdown-Liste hinzu.
3. Erstellen Sie einen Beispieltext für den neuen Strukturtyp.
4. Erstellen Sie einen Beispielcode für den neuen Strukturtyp im Ordner "examples".

## Kontakt und Support

Bei Fragen oder Problemen wenden Sie sich bitte an den Entwickler.

---

© 2025 RFEM Universeller Strukturberechner
