Das Repository ist öffentlich: https://github.com/Alex1977-code/Statikprogramm.
Lesen, herunterladen und die fertige Statik3D.exe benutzen kann darum jeder,
auch ohne GitHub-Konto. Nur zum Schreiben braucht es eine Freigabe.
| Er will … | Was er braucht |
|---|---|
| nur das Programm benutzen | nichts – Statik3D.exe aus dem Release latest herunterladen: https://github.com/Alex1977-code/Statikprogramm/releases/tag/latest |
| Fehler melden, Wünsche äußern | ein GitHub-Konto – dann Issues im Repository |
| am Code mitarbeiten | ein GitHub-Konto und Schreibrecht (unten) – oder er arbeitet über einen Fork |
Auf github.com im Repository:
Settings → Collaborators and teams → Add people → GitHub-Benutzernamen des Kollegen eintragen → Rolle Write.
Er bekommt eine Einladung per Mail und kann danach klonen, Zweige anlegen und Pull Requests stellen. Admin braucht er nicht; Write genügt für alles, was zum Entwickeln gehört.
Ohne Schreibrecht geht es auch: er drückt oben rechts auf Fork, arbeitet in seiner Kopie und stellt von dort einen Pull Request. Das ist der übliche Weg, wenn man erst einmal sehen will, ob die Zusammenarbeit passt.
Auf
mainwird nicht unmittelbar gepusht.
Jeder Push auf main baut über GitHub Actions eine neue Statik3D.exe und
veröffentlicht sie als Release latest – und jede laufende Installation holt
sich diese Datei beim nächsten Start. Was auf main liegt, ist also nicht
„der Stand der Arbeit”, sondern das, was beim Kollegen und beim Kunden startet.
Darum:
git switch -c thema/kurzer-namemain stellen.python tests/run_all.py # alle Rechen- und Importprüfungen
python tests/run_all.py --gui # zusätzlich die Oberfläche (braucht einen Bildschirm)
Unter Windows laufen die Prüfungen in UTF-8: tests/__init__.py stellt die
Ausgabe des Prozesses um und gibt PYTHONUTF8=1 an Kindprozesse weiter. Ohne
das kodiert Python 3.11 eine in eine Datei oder Pipe umgeleitete Ausgabe mit
cp1252, und jede Prüfung, deren Text ein „−“, „≤“ oder eine Hochzahl enthält,
reißt mit UnicodeEncodeError – 26 von 53 Suiten. Nachweis:
python -m tests.test_ausgabe.
Menüdurchgang am echten Modell. python -m tests.menudurchgang MODELL.json
löst jeden Befehl des Menübands an einem geladenen Modell aus, mit allen
Dialogen auf „Abbrechen“ und einem Wächter je Befehl, und schreibt je Befehl
Dauer, Meldungen und Tracebacks nach MODELL_menudurchgang.jsonl. Das ist
kein Teil von run_all, sondern das Werkzeug für die Prüfsitzung: am
Drehlager fand der erste Durchgang (11.09.2026, 203 Befehle) zwei Hänger und
drei 113-s-Befehle, die keine Prüfung abdeckte. Rechnende, ersetzende und
löschende Befehle stehen in der Ausnahmeliste des Skripts.
Keine Prüfung öffnet einen Browser: Oberflächenprüfung und Menüdurchgang
setzen STATIK3D_KEIN_BROWSER, und das Programm schreibt dann nur „(Browser
nicht geöffnet: …)“ ins Protokoll. Am 11.09.2026 stand beim Anwender nach
jedem Lauf ein Browserfenster mit tests/_lastenheft_smoke.html, die der
Lauf gleich wieder gelöscht hatte („Zugriff auf die Datei nicht möglich“).
Beides muss vollständig durchlaufen (ALLE TESTS BESTANDEN). Die Prüfungen
sind der eigentliche Schutz: Sie rechnen gegen geschlossene Lösungen
(Balkenformeln, Gleichgewichtssätze, Volumen aus dem Gaußschen Satz), nicht
gegen frühere Ergebnisse. Wer etwas ändert, das eine Prüfung reißt, hat
entweder einen Fehler gemacht oder muss begründen, warum die Prüfung falsch
war – beides gehört in den Pull Request.
Neue Rechenwege bekommen eine neue Prüfung mit einem Sollwert, den man in einer Zeile nachrechnen kann. Kein „sieht plausibel aus”.
Der Code ist so geschnitten, dass zwei Leute sich nicht ins Gehege kommen:
| Verzeichnis / Datei | Thema |
|---|---|
statik3d/model.py |
Datenmodell (Knoten, Linien, Flächen, Körper, Lasten) – hier abstimmen, alles hängt daran |
statik3d/mesher.py, mesher3d.py |
Vernetzung, freier 3D-Vernetzer; koerper_vernetzen verteilt die Volumen auf Arbeitsprozesse (koerper_vorbereiten rechnet ohne Modelländerung, koerper_einbauen schreibt im Hauptprozess), fortschritt(anteil, text) meldet aus den Schleifen und bricht mit False ab (Abgebrochen) |
statik3d/assemble.py, solver.py, elements/ |
Steifigkeiten, Gleichungslöser, Elemente |
statik3d/ec3/, joints/, bridges/ |
Nachweise |
statik3d/importers/ |
Schnittstellen (RFEM, IFC, DXF, SAF, …) |
statik3d/gui/ |
Oberfläche |
statik3d/einheiten.py |
Einheiten und Nachkommastellen der Anzeige (Tabellen, Lastwerte, Kennwerte); gerechnet wird in SI |
statik3d/stroemung.py |
Strömungsnumerik im Schnitt: Rasterung, Potentialströmung (Wasser), Gitter-Boltzmann (Wind), Abtastung, Feldbilder |
statik3d/report/ |
Bericht |
docs/ |
Handbücher |
Faustregel: Ein Pull Request fasst ein Thema an. Zwei Leute an derselben
Datei gleichzeitig geht gut, solange es verschiedene Funktionen sind; zwei
Leute an model.py sollten kurz miteinander reden.
git clone https://github.com/Alex1977-code/Statikprogramm.git
cd Statikprogramm
python -m pip install -r requirements.txt # numpy, scipy, PySide6, pyvista …
python -m statik3d # startet die Oberfläche
Python 3.11 oder neuer. Für den Bericht als PDF zusätzlich reportlab, für den
CAD-Import ezdxf beziehungsweise ifcopenshell – beides ist freiwillig, das
Programm sagt selbst, wenn etwas fehlt.
Der Kollege kann genauso mit Claude Code an dem Repository arbeiten:
https://claude.ai/code → GitHub verbinden → Alex1977-code/Statikprogramm
auswählen. Er braucht dafür ein eigenes Anthropic-Konto und (für das Schreiben)
das Schreibrecht aus Abschnitt 2.
Damit sich nichts überschreibt: jeder lässt Claude auf einem eigenen Zweig arbeiten und merged über Pull Requests. Zwei Sitzungen auf demselben Zweig gehen schief.
Steht im Bericht der letzten Sitzung und in den Handbüchern; die größeren Punkte:
EINFUEGEN_BIS (15 000) ein und zerlegt darüber je Durchgang von vorn -
Qhulls Einfügemodus brauchte für einen Lagerbock mit 50 000 Punkten 90 s,
die Zerlegung von vorn 10 s bei gleichem Netz. Das Netz eines Körpers hängt
nicht davon ab, ob er seriell oder in einem Arbeitsprozess gerechnet wurde;
gemeinsame Randflächen teilen ihre Knoten über das Wörterbuch cache beim
Einbau. Innerhalb eines Körpers wird nicht parallelisiert.Stellung.anwenden Ausgangsstellung, Verschiebung, Verdrehung, Lager und
Gelenke legt; die abgeschalteten Stäbe, Flächen und Volumen der Stellung
gehen als Aktivmaske in das System. Der Antrieb (Stellung.antrieb) und
die Lastfallauswahl der Stellung (faelle) gelten nur in der
Stellungsreihe (bridges.positions), nicht in der Situation; die Situation
ordnet ihre Lastfälle und Kombinationen selbst zu.sections.polygon) ist eine
Näherung nach Saint-Venant (A⁴/(4π²·Ip)); exakt wäre die Lösung der
Prandtlschen Spannungsfunktion auf dem Polygon (kleines FE-Problem). Der
Wert lässt sich in der Tabelle „Querschnitte“ von Hand überschreiben.C:\Program Files\Dlubal) – die Dateien liegen nur lokal vor.Splash in packaging/Statik3D.spec) braucht
Tcl/Tk des Build-Python; auf dem GitHub-Windows-Läufer ist es dabei. Fehlt
es einmal, bricht PyInstaller mit einer klaren Meldung ab — dann die
Splash-Zeilen aus dem Rezept nehmen, das Qt-Startbild
(statik3d/gui/start.py) läuft unabhängig davon.LineLoadImpl* und SolidLoadImpl* gelesen;
eine Datei mit solchen Lasten lag noch nicht vor, die Namen folgen dem
Muster der anderen Lasttabellen (magnitude/magnitudeFirst/Second,
distanceA/B, loadDirection). Beim ersten echten Fall prüfen.ModelData.globalAxesOrientation der Datei wird noch nicht
ausgewertet (0 im Drehlager, vermutlich „Z nach unten“).