y.wang 4a19ac0ae0 refactor: Segment-Antworten als Werte, Modus-Dispatch im Spec-Pfad, Python liest Modus 2/3
Drei herausgeloeste Teile aus doc/todo/spec-modus2-3.md. Der Rest (volle
Spec-Grammatik fuer Modus 2/3, Schritte 3-5 und 7) bleibt bewusst liegen:
Modus-2/3-Journale sind durch ihren SEGS-Eintrag bereits selbst-enthalten
und ohne Zeichnung abspielbar, der Mehrwert einer Spec ist dort also klein.

1. lib/vf_journal_export.py trennt nach Marker. Modus 1 laeuft wie bisher
   durch die Grammatik; "linienzug2"/"linienzug3" werden als Rohtokens
   ausgegeben, im Format, das tests/test_linienzug.lsp einliest. Vorher lief
   die Modus-1-Grammatik auch ueber sie (der startswith-Filter laesst sie
   durch) und brach mit "Token 6: STEP erwartet" ab. Gegen die echte
   Zeichnung geprueft: die Ausgabe ist identisch mit der bisher von Hand
   erzeugten Testdatei.

2. vsp-bau-journal waehlt die Bau-Funktion jetzt anhand des Journals
   (vsp-bau-fn-fuer-journal): kein SEGS = Modus 1, SEGS + Formatmarke
   "m2v2" = Modus 2, SEGS ohne = Modus 3. Bewusst abgeleitet statt als
   zusaetzliches Argument - die Funktion hat zwei Aufrufer, und AutoLISP
   verlangt exakte Argumentzahl. Die Ableitung kann der Datenlage auch nicht
   widersprechen, weil sie genau das Journal liest, das abgespielt wird.

3. Die Segment-Klassifizierung in Modus 2 journalisiert WERTE statt
   Menue-Ziffern: Geradentyp "gf"/"vf", Bogentyp "gf-bogen"/"vario-kurve",
   Variante "aussen"/"innen". Konsole UND Wizard-Dialoge legen dieselben
   Werte ab. Damit deutet ein Umsortieren der Optionen keine gespeicherte
   Kette mehr um - dasselbe Risiko, das beim Lauf-Anfang (833a4b6) real
   wurde. Bestandsketten laufen ueber Alt-Tabellen weiter, ein unbekannter
   Wert bricht mit Segmentnummer ab statt zu raten.

   Statt dreier fast gleicher Normalisierer gibt es einen gemeinsamen
   vfl-wert-norm; vfl-m2-anfang-norm delegiert jetzt dorthin.

   Nebeneffekt: Bogentyp und Variante benutzten BEIDE "1"/"2" und waren im
   Journal nicht zu unterscheiden - deshalb brauchte es die Formatmarke zur
   Erkennung von Alt-Journalen. Mit eigenen Wertevorraeten ist das erledigt;
   ein Test prueft, dass die Mengen disjunkt bleiben.

Geprueft: TEST_UNIT 883/883 (17 neue Tests). TEST_LINIENZUG_MODUS2 beide
Varianten OK - und zwar mit den AUFGEZEICHNETEN Journalen, die bei den
Segment-Fragen noch die alten Ziffern tragen. Genau darum wurden sie nicht
auf die neuen Werte umgeschrieben: sie sind der Nachweis der
Abwaertskompatibilitaet.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-27 12:09:05 +01:00
2026-10-14 15:09:10 +02:00
2026-05-05 16:06:06 +02:00

dxfmakros

AutoLISP-Makros (SSG_LIB) fuer BricsCAD Pro zur automatisierten Erstellung von Foerderanlagen-Layouts (ILS Kreisel, Omniflo, VarioFoerderer, Gefaellestrecke, Geruest).

Einstieg:

Menustruktur (SSG_LIB)

SSG_LIB
├── ILS
│   ├── Kreisel-Module
│   │   ├── Einfuegen / Verbinden / Bearbeiten    → KreiselInsert / KreiselConnect / KreiselEdit
│   │   ├── Eckrad / Eckrad bearbeiten            → ILS_Eckrad / EckradEdit
│   │   └── Weichenpunkte ermitteln               → KREISEL_WEICHEN
│   ├── Zusatzmodul
│   │   ├── BTMT-Beladung / -Entladung            → ILS_BTMT_Beladung / ILS_BTMT_Entladung
│   │   └── Scanner / Separator einfuegen         → ILS_SCANNER_INSERT / ILS_SEPARATOR_INSERT
│   ├── Foerderer
│   │   ├── Standard (Werte manuell / aus 3D-Linie) → StandardVarioFoerderer / StandardVarioFoerderer3D
│   │   ├── Etage (Werte manuell / aus 3D-Linie)    → EtageVarioFoerderer / EtageVarioFoerderer3D
│   │   ├── Streckengruppe (Linienzug)              → LinienzugVarioFoerdererManuell / -Zielhoehe / -Stueckweise
│   │   └── Vario_Kette_Merge / VarioFoerderer nachruesten → Vario_Kette_Merge / VARIOFOERDERER_NACHRUESTEN
│   └── Gefaellestrecke
│       ├── einfach / aus 3D-Linie / aus Linienzug  → GEFAELLESTRECKE_EINFACH / _3DLINIE / _LINIENZUG
│       └── QC Linie mit GF (auch U-Form)           → QcLinieMitGf / QcLinieMitGfUForm
├── Omniflo
│   ├── Fahrstrecke / Fahrstrecken beschriften      → OMNI_FAHRSTRECKE / OMNI_FAHRSTRECKE_BESCHRIFTEN
│   ├── Boegen APB110 / APB60, Aluprofil Gerade (AP60/AP110/APG110)
│   ├── Weichen (90/45/Parallel/22.5, Delta, Star)
│   ├── TEF Elemente (inkl. TEF Gerade auf Linie → TEF_FOERDERER_LINIE)
│   ├── Anbaugruppen (Stopper, Scanner, Buerstenbremse)
│   ├── Spez. Streckenelemente ▸ Tuerloesungen ▸ Schwenkschienen → OMNI_SCHW_400_*
│   ├── KettenFoerderer                             → KETTENFOERDERER
│   ├── Ladeschleifen                               → OMNI_LADESCHLEIFE_AP110
│   ├── Verbinder                                   → OMNI_TV_*
│   ├── Boegen fuer Weichen (ausgegraut, Dummy)     → OMNI_APBW_*
│   └── Element bearbeiten                          → OMNI_EDIT
├── Geruest
│   ├── Rohr-Geruest-Traeger                        → GERUEST_TRAEGER
│   ├── Saeulen / Rohrabhaenger / Wandbefestigung   → GERUEST_SAEULEN / GERUEST_ROHRABHAENGER / GERUEST_WANDBEFESTIGUNG
│   ├── Gattertraeger (Platzhalter)                 → GERUEST
│   └── Funktionen ▸ Traeger beschriften            → GERUEST_TRAEGER_BESCHRIFTEN
├── SPS
│   ├── TRO (Marker einfuegen/bearbeiten)           → TRO_INSERT / TRO_EDIT
│   ├── Connections (einfuegen/bearbeiten)          → CONNECTION_INSERT / CONNECTION_EDIT
│   └── Eingang / Ausgang                           → ILS_EINGANG_INSERT / ILS_AUSGANG_INSERT
├── Export
│   ├── Export Sivas                                → EXPORTSIVAS
│   └── Export CSV                                  → EXPORTCSV
├── Konfiguration
│   ├── Umschalten 2D und 3D                        → SSG_DIM_SWITCH
│   ├── Alle Bloecke auf 2D / 3D                    → SSG_DIM_ALL_2D / SSG_DIM_ALL_3D
│   ├── Sprache                                     → SSG_SPRACHE
│   ├── Planquadrate an/aus                         → PLANQUADRATE_TOGGLE
│   └── CSV-Export                                  → CSV_EXPORT_KONFIG
├── Werkzeuge
│   ├── Bloecke zaehlen / loeschen, Attribute ersetzen → SSG_BLOCK_COUNT / SSG_BLOCK_DELETE / SSG_ATTR_ERSETZEN
│   ├── Text ersetzen / parallel / Hoehe / Stil        → SSG_TEXT_ERSETZEN / _PARALLEL / _HOEHE / _STIL
│   ├── Faehnchen + Stueckliste aus Zeichnung          → SSG_FAEHNCHEN_STUECKLISTE
│   └── Din Formate                                    → DIN_FORMATE
└── Tests (alle Testsuiten, einzelne Szenarien, Export CSV/Sivas ALL, KS 2D/3D pruefen)

Doppelklick auf einen Block ruft SSG_BLOCKEDIT auf und verzweigt nach Blockname (Kreisel, Eckrad, VF_/GF_, KF_, Omniflo, GR_, TRO_, CONNECTION_, JAM_ → passender Edit-Befehl).

Vollstaendige, laufend aktualisierte Befehls-/Modulzuordnung: siehe CLAUDE.md (Abschnitt "Modulzuordnung im Menue") und menu/SSG_LIB.mnu.

Lademechanismus

Die Module werden beim Laden des Menues ueber SSG_LIB.mnl initialisiert (ssg-ensure, ueberspringt bereits geladene Module; einzelne Module wie DrawPlanquadrate, DinFormate, Tro_Edit, Jam_Edit werden erst beim ersten Aufruf nachgeladen). Einmalige Einrichtung pro BricsCAD-Installation:

  1. bin/setenv.bat ausfuehren (setzt DXFM_LISP u.a.)
  2. BricsCAD starten
  3. In der Kommandozeile _MENULOAD eingeben, menu/SSG_LIB.mnu auswaehlen

Details und die Core-Ladereihenfolge: siehe CLAUDE.md Abschnitt "Lademechanismus (Lazy Loading via MNL)".

Projektstruktur

dxfmakros/
├── Lisp/                  # AutoLISP-Makros und Kernbibliotheken (Details: Lisp/README.md)
├── bin/                   # Hilfs-Skripte (setenv, start_briscad, run_tests, Python-Wrapper)
├── cfg/                   # Konfigurationsdateien
├── data/                  # JSON-Komponentendaten, DWG-/DXF-Bloecke, Block-Libraries
├── dcl/                   # DCL-Dialogdefinitionen
├── doc/                   # Dokumentation (doc/plan Architektur/Analysen, doc/todo offene Fahrplaene)
├── lang/                  # Benutzertexte de_DE.json / en_GB.json (ssg-text)
├── lib/                   # Python-Skripte (DXF-Bearbeitung, Export)
├── logs/                  # Logdateien und .dbg-Ausgaben (DXFM_LOG) - nicht im Git
├── menu/                  # BricsCAD-Menudefinition (SSG_LIB.mnu, SSG_LIB.mnl)
├── results/               # Ergebnisse / Exporte - nicht im Git
├── tests/                 # Testskripte und Referenzdaten
├── tools/                 # Einmal-Werkzeuge (z.B. Migration der Sprachtexte)
├── LICENSE
├── README.md
└── requirements.txt

Umgebungsvariablen

Werden via bin/setenv.bat gesetzt. Wichtigste:

Variable Beschreibung
DXFMAKRO Wurzelverzeichnis des Projekts
DXFM_LISP Pfad zu den LISP-Dateien (benoetigt fuer ssg-ensure)
DXFM_BLOCKS Pfad zu DWG-Bloecken
DXFM_DATA Datenverzeichnis (JSON, DXF)
DXFM_LOG Log-Verzeichnis
DXFM_DCL Pfad zu DCL-Dialogdateien
DXFM_CFG Konfigurationsverzeichnis
DXFM_LANG Aktive Sprache (de_DE/en_GB), persistiert von SSG_SPRACHE; Default de_DE
DXFM_VF_SPEC Spec-Datei fuer VF_SPEC_BAU (optional)
BRICSCAD Pfad zur BricsCAD-Executable (fuer headless Testlauf)

Tests

Headless-Unit-Tests (file- und zeichnungsfrei):

bin\run_tests.bat --lisp

Python-Tests (in der .venv):

pytest tests/
bin\run_tests.bat --check

Zeichnungs-/Szenario-Tests laufen interaktiv in BricsCAD ueber das Menue Tests bzw. SSG_RUN_ALL_TESTS. Details: doc/LispTests.md, tests/README.md.

Dokumentation

Ausfuehrliche Modul- und Befehlsdokumentation: CLAUDE.md (Projektanweisungen) und Lisp/README.md. Weitere Anwender-/Entwickler-Themen direkt in doc/ (u.a. kommandos.md - Uebersicht aller Befehle und Skripte, variofoerderer.md, vf_linienzug_modus1_anleitung.md, csv-export.md, json-input-lisp.md, faq.md). Architektur-Analysen und Planungsdokumente in doc/plan/ (u.a. translate.md, Entwicklungsplan.md), alle offenen TODOs gesammelt in doc/todo.md (Detail-Fahrplaene in doc/todo/).

Lizenz

MIT License — siehe LICENSE

Autor

Michael Stangl (GitHub: mistamichael)

S
Description
No description provided
Readme MIT 2.8 GiB
Languages
Common Lisp 70.5%
Python 25.7%
Clean 2.4%
Batchfile 0.7%
NewLisp 0.6%
Other 0.1%