Commit Graph
612 Commits
Author SHA1 Message Date
Simon Hensch 38ddc5dd70 [ADD] ILS Blockattribute in als JSON vervollständigt 2026-09-21 07:37:21 +02:00
Michael StanglandClaude Opus 4.8 d0fe890d7c Start-Ausgabe entschlacken: per-Modul-Banner auf je eine Zeile kuerzen
Der SSG_LIB-Start gab ~50 Zeilen aus (mehrzeilige >>> ...geladen <<<-Banner mit
Befehlslisten/Block-Pfaden, ===-Trenner, Core-Modul-Auflistung, VarioFoerderer-
Typenliste). Fuer einen einfachen _QNEW-Start zu viel Rauschen.

Gekuerzt (nur die dicksten Bloecke, je Modul bleibt EINE knappe Zeile;
Fehler/Warnungen ALLE unveraendert erhalten):
- Kern-Module (ssg_core/dbg/dialog/layer/id): reine "X geladen"-Zeilen entfernt.
- Feature-Module: KreiselInsert/Gefaellestrecke/VarioFoerderer je auf eine
  ">>> X geladen"-Zeile; Befehlslisten, Modus-/Typen-Aufzaehlungen, Block-Pfade
  und ===-Trenner raus. VF-Submodule (vf_konstanten/standard/etage/linienzug/
  spec) Lade-Banner ganz entfernt (der Sammel-Header deckt sie ab).
- SSG_LIB_Commands "Dummy-Befehle registriert" entfernt.
- menu/SSG_LIB.mnl: ===-Trenner + Core-Auflistung raus; die doppelte
  "Einfuege-Modus 3D"-Zeile entfernt (S:STARTUP gibt sie ohnehin einmal aus).

Behalten (informativ / diagnostisch): [CFG] Config geladen: N Sektionen,
[LANG] N Texte geladen, alle FEHLER/WARNUNG-Zeilen, die Abschlusszeilen
"Alle Module geladen. Menue aktiv." + "Einfuege-Modus: 3D".

Reine Ausgabe-Reduktion, keine Logik geaendert. 243/243 LISP-Unit-Tests gruen;
alle Module laden fehlerfrei (Klammerbalance gegen HEAD unveraendert).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-09-18 22:13:33 +02:00
Michael StanglandClaude Opus 4.8 0babf78789 Tests + Bau-Pfad-Alert: 4 Baseline-Failures behoben
test_export_separatorliste.py (2 Failures, KeyError 'Separatorlist'): der Test
pruefte noch das alte Merkmal "Separatorlist" (nur SEP-Eintraege). write_
separatorliste_merkmale fuellt seit dem Umbau das Top-Level-Feld item["trackids"]
(CSV-Spalte "TrackIds") mit AS + Separatoren + ES in Baureihenfolge. Tests auf
die neue API/Semantik angepasst (empirisch verifiziert: "0054, 0052, 0053, 0055").

vf_linienzug.lsp - echter Fund des statischen Waechters: vfl-body-abschluss
setzte am "Kettenende nicht baubar"-Zweig ein (alert ...) im BAU-Pfad (blockiert
Batch/Headless). Auf vfl-meldung umgestellt (zeigt alert nur bei erlaubter GUI,
sonst princ) - genau die Regel, die der Waechter erzwingt.

test_vf_headless_statisch.py (2 Failures): Soll-Inventar an den aktuellen Code
angeglichen - 18 legitime neue Wizard-/Frage-Dialoge (vflw-gruppe-*-impl,
vflw-m2-*-impl, vfl-frage-ist-*) + vfl-ks-aus-hz-an-punkt (ssget, Zeichnung
durchsuchen) ergaenzt, vflw-gruppe-horizontal-impl entfernt (weg im Code),
vfl-edit-ent auf alert:2 (linienzug2-Abweisung, harter Schnitt).

Suite: 11 -> 7 failed. Verbleibend NICHT hier: test_hundm05.py (auf Wunsch
ausgenommen) + test_vf_geometrie.py (6x, gebautes HundM05-DXF weicht von der
Referenz ab - braucht fachliches Urteil ueber die neue Geometrie, nicht blind
die Referenz ueberschreiben). 243/243 LISP-Unit-Tests gruen.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-09-18 21:30:14 +02:00
Michael StanglandClaude Opus 4.8 8be256fb5a VF: gemeinsamen Wrapper-Rumpf vf-wrapper-bauen (Standard/Etage + Linienzug)
vf-block-erstellen (vf_core, Standard/Etage) und vfl-block-erstellen
(vf_linienzug) hatten denselben ~25-Zeilen-Rumpf wortgleich: ATTDEFs am
Startpunkt, Entity-Sweep seit lastEnt, Sepliste sichern, ssg-block-wrap-welt,
Layer setzen, Sepliste-XDATA, Attribute setzen, ID + Dim-XDATA. Jetzt in
vf-wrapper-bauen (vf_core) zusammengefasst; beide Aufrufer bauen nur noch ihre
FERTIGE Attributliste (Standard/Etage: feste Werte; Linienzug: *vfl-acc-*-
Komma-Listen) und uebergeben sie - der Rumpf kennt die Attribut-Semantik nicht.

ATTDEF-FORMAT VEREINHEITLICHT auf den kanonischen Stil: 3 von 4 Wrapper-Bauern
(vfl-block-erstellen, Gefaellestrecke, Vario_Kette_Merge) nutzten bereits
identisch (10/11=startpunkt, 40, 70/72/74, alle am selben Punkt). vf-block-
erstellen war der Ausreisser mit Layer-0/Model-Space-Zwang, y-Dekrementierung
je Zeile und fehlenden Ausrichtungscodes - historischer Drift OHNE Effekt bei
unsichtbaren ATTDEFs (Flag 70=1, reine Attribut-Container). Standard/Etage
bauen die ATTDEFs damit jetzt im kanonischen Format.

Toter Code entfernt: *vfk-attdef-zeilenabstand* (einzige Nutzung war die
entfernte y-Dekrementierung). *vfk-attdef-texthoehe* jetzt in vf-wrapper-bauen
zentral genutzt.

Die ATTRIBUTWERTE sind unveraendert (Diff-Review: Bezeichnung wertgleich,
Etage-Bogen-Extra nur von zweitem ssg-attrib-set-on in die Hauptliste gezogen).
Verhaltensneutral fuer den Linienzug (hatte schon das kanonische Format);
fuer Standard/Etage aendert sich nur das (unsichtbare) ATTDEF-Format.

243/243 LISP-Unit-Tests gruen; Python-Suite unveraendert (11 Baseline);
Klammerbalance geprueft. Der Attribut-/Geometrie-Gleichstand von Standard/Etage
ist interaktiv in BricsCAD bzw. per SSG_RUN_ALL_TESTS gegenzupruefen.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-09-18 21:08:54 +02:00
Michael StanglandClaude Opus 4.8 cdb9183692 CLAUDE.md: Subagenten nur mit Rueckfrage + leichtere Modelle bevorzugen
Konvention ergaenzt: Subagenten sollen nur mit Rueckfrage an den Nutzer
gestartet werden; wenn moeglich die leichteren Modelle waehlen (i.d.R.
Code-Recherche).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-09-18 20:55:17 +02:00
Michael StanglandClaude Opus 4.8 bd33e277c5 VF-Linienzug/Edit: Praeambel, Debug-Session und Edit-Attributleser buendeln
Punkt 2 (vf_linienzug.lsp) - die drei Modi teilen jetzt zwei Praeambel-Helfer
statt sie wortgleich auszuschreiben:
- vfl-dbg-session-start (schalter datei funcname sessiontext): oeffnet die
  dbg-Datei + schreibt Kopf/Session-Start. M1 haengt seinen Replay-Queue-
  Diagnose-Zusatz danach an (M1-spezifisch).
- vfl-dbg-hook-installieren: der fruehe duenne dbg-*error*-Hook (M2/M3),
  Lambda mit dynamic-scope-Vertrag wie vfl-abbruch-handler-installieren.
- vfl-frage-punkt-hoehe (punkt-key hoehe-key abbruch-key wizard-prompt):
  Startpunkt/Hoehe-Praeambel (Wizard-Hook + vfl-in-point + vfl-in-real + Z
  uebernehmen, (exit) bei Abbruch). Genutzt fuer Startpunkt in M1/M2/M3 UND
  den Endpunkt in M2 (vier Aufrufstellen, vorher 4x strukturgleich).

Punkt 3 (vf_standard.lsp / vf_etage.lsp) - der wortgleiche Attribut-Lese- +
prefill-basis-Aufbau der beiden Edit-Bodies (c:VARIOFOERDERER_EDIT,
vfe-edit-ent) in vfs-edit-basis-lesen (ent xd default-deltah default-seite)
zusammengefasst; die zwei abweichenden Defaults sind Parameter. Gibt eine
Alist (prefill-basis + Rohwerte attribs/startpunkt/hz/z-start) zurueck.
vf-konvertiere-ent BEWUSST nicht mit zusammengelegt - andere Zielstruktur
(Einzelwerte + L_VF/L_GF fuer den Batch-Konverter), Zusammenfuehrung wuerde
beide verkomplizieren.

243/243 LISP-Unit-Tests gruen; Python-Suite unveraendert zur Baseline
(11 failed); Klammerbalance geprueft. Verhaltensneutrale Extraktionen.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-09-18 20:55:17 +02:00
Yuelin Wang 733946c368 Merge remote-tracking branch 'origin/master' 2026-09-18 17:47:53 +02:00
Yuelin WangandClaude Sonnet 5 797afe48b4 fix: VF-Linienzug Modus 1 Option 6 und Modus 2 - mehrere Solver- und Dialog-Bugs behoben
- Modus 2 Hauptbug: Motorstation+GF2 nutzen jetzt den bereits im Winkel-Solve
  geplanten Wert (br-gf2-exp) statt einer zweiten, unabhaengigen Loesung aus
  gemessener Resthoehe - behebt Laengs-/Querversatz am Kettenende.
- Modus 2 Bug C: Separator/ES-Hoehenreservierung (vfl3-dback/z-junction) auch
  bei "Motorstation ohne ES" korrigiert (vorher nur bei komplett offenem Ende).
- Modus 2 Bug D: fehlender Separator/ES-Laengsanteil im Solve-Budget bei
  Einzel-Kletterer ohne flache Zone (hor-pairs=0) ergaenzt, ausschliesslich
  ueber das Laengenbudget (nicht ueber feste-hz, sonst Hoehen-Doppelzaehlung).
- Modus 1 Option 6 ("Neue Linie BIS Kettenende"): Vorzeichenfehler bei der
  Separator/ES-Hoehenreservierung fuer Richtung "Auf" behoben (musste addiert
  statt subtrahiert werden).
- Vario_Kette_Merge: VF_WINKEL-Attribut liest den Winkel jetzt direkt aus dem
  Blockname statt aus einer ungenauen Chord-Messung ueber den ganzen
  S-Bogen-Tripel (verwaesserte den Winkel Richtung 3-Grad-Basis).
- ES-/AS-Element-Winkel-Dialog: neuer schlanker Dialog ohne die dort nie
  gueltige "60 Grad"-Option (statt nur ausgegraut).
- Modus 2 Lauf-Abschluss-Dialog: roher i18n-Key statt uebersetztem Text
  behoben; Option 3 ("Motorstation + ES-Element") ausgeblendet, wenn die
  Upfront-ES-Frage bereits mit "Nein" beantwortet wurde.

Alle Fixes einzeln in BricsCAD nachgestellt und bestaetigt (dX/dZ exakt).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-18 17:46:30 +02:00
Michael StanglandClaude Opus 4.8 350c294717 doc: Umbauplan Modus-2-Solver achsenweise Laengen-Bilanz
Diagnose + Umbauplan fuer die U-Form-Abweichung im Modus-2-Solver als
doc/TODO-modus2-achsenweise-bilanz.md festgehalten (mit dem Entwickler zu
besprechen, noch nicht umgesetzt). Enthaelt: Symptom (test_modus2.dxf),
praezise Ursache (skalare climber-span statt achsenweiser Bilanz, Fundstellen
9990/10070), Beleg als dokumentiertes v1-Limit, 5-Etappen-Umbauplan mit
Regressionsnetz zuerst, Risiko-Einschaetzung und Zwischenloesung (abweisen).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-09-18 17:35:45 +02:00
Michael StanglandClaude Opus 4.8 7dbf1248c9 VF-Linienzug Modus 2/3: Geister-Mini-Objekte aus Pfad-Auswahl filtern
Eine Rechteck-Auswahl kann winzige Geister-/Artefakt-Objekte miterfassen (real:
ein 14-mm-Mini-Bogen). gf-sortiere-objekte haengte sie per Nearest-Neighbor
stumm in die Kette -> ein Geister-Bauteil (im test_modus2.dxf: eine 90-Grad-
Kurve vor dem Motor, die der Nutzer nie gezeichnet hat; im SEGS-Journal als
7. Segment mit Sehne 14 mm sichtbar).

vfl-in-segmente wirft jetzt VOR der Sortierung alle Objekte unter
*vfk-pfad-min-segmentlaenge* (100 mm) aus und meldet Anzahl + Grund
(vfl-m3-mini-objekte-verworfen, de/en). Schwelle konservativ deutlich unter
jedem realen Bauteil (kleinstes: Separator 300 mm; kleinster echter Eck-Bogen
R500/30 Grad hat Sehne ~259 mm) und knapp ueber dem Restlaengen-Clamp (100 mm),
damit kein legitimes Segment faelschlich verworfen wird.

Neue Helfer: vfl-obj-2d-laenge (LINE-Laenge / ARC-Sehne), vfl-filter-mini-objekte
(-> (behalten . verworfen-anzahl)). Neue Konstante *vfk-pfad-min-segmentlaenge*.
Der Bug lag NICHT im SEGS-Umbau (gf-sortiere-objekte/-analysiere-kette
unveraendert) - der SEGS-Journal machte ihn nur erstmals sichtbar.

243/243 LISP-Unit-Tests gruen; JSON valide + de/en-Paritaet geprueft. Der
Geometrie-Effekt (Geister-Segment weg) ist interaktiv zu bestaetigen.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-09-18 17:17:15 +02:00
Michael StanglandClaude Opus 4.8 255707f136 VF-Linienzug: VF-Lauf-Grenze als Alert-Box + toten Etage-Code entfernen
Zwei kleine Aenderungen am VF-Linienzug-Cluster:

1. Modus-2-Abweisung "nur EIN VF-Lauf moeglich" jetzt als sichtbare Meldung.
   Bislang ging die Grenze (vf-count != 1 -> M3b spaeter) nur ueber drei
   princ-Zeilen in die Konsole und war dort leicht zu uebersehen. Neuer
   zweisprachiger Text vfl-m3-vf-lauf-alert, gezeigt ueber vfl-meldung (alert-
   Box bei erlaubter GUI, headless nur princ - blockiert also keinen Batch).
   Die [M3a]-Konsolendiagnose bleibt zusaetzlich fuer den Log.

2. insert-hz-incl-scaled-block (vf_etage.lsp) entfernt - toter Code, kein
   Aufrufer im gesamten Repo (byte-genaue Pruefung + grep). Der zugehoerige,
   nur dort genutzte i18n-Key vfe-hz-incl-status ebenfalls aus de/en entfernt.
   Die anderen drei insert-hz-*-Funktionen BLEIBEN bewusst: sie unterscheiden
   sich in Platzierungssemantik (KS_EIN vs. Block-Ursprung) bzw. der
   Skalierung+KS+Vertikale-Kombination von den ssg_ks_insert-Primitiven, ein
   Ersatz wuerde die Geometrie verschieben (Kommentar an der Fundstelle).

243/243 LISP-Unit-Tests gruen; JSON valide + de/en-Paritaet geprueft.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-09-18 17:08:25 +02:00
Michael StanglandClaude Opus 4.8 8ccec9dea7 VF-Linienzug Modus 2 auf SEGS umstellen (behebt Doppelklick-Desync)
Modus 2 journalisiert die Segment-Essenz (SEGS) statt der Objekt-Handles
(OBJS) - identische Umstellung wie Modus 3. Damit ist der Block selbst-
enthalten und der Doppelklick-Neubau unabhaengig von den Original-LINE/ARC.
Behebt den beobachteten Modus-2-Desync (Winkel wurde beim Neuaufbau interaktiv
nachgefragt + Abweichung, weil der OBJS-Replay an den - ggf. verschobenen -
Pfad-Objekten hing).

- vfl-in-selection + obj-liste im Modus-2-Ablauf durch vfl-in-segmente ersetzt
  (Live: ssget -> gf-sortiere-objekte -> gf-analysiere-kette -> Eck-Vorpruefung
  -> SEGS; Replay: fertige Essenz aus dem Journal). Objektauswahl steht jetzt
  NACH der Startpunkt-Praeambel (vfl-in-segmente braucht den startpunkt).
- segmente9 (9-Feld-Essenz) eingefuehrt, 5-Feld-segmente daraus abgeleitet;
  seg-ent -> nil (kein Live-Highlight mehr, wie Modus 3).
- Marker bleibt "linienzug2".

HARTER SCHNITT fuer Altbestand: alte OBJS-"linienzug2"-Bloecke (ohne SEGS)
werden beim Doppelklick klar abgewiesen (neuer Text vfl-edit-m2-obsolet, de/en)
statt mit falschen Daten in den Bau zu laufen; der Batch-Konverter ueberspringt
sie. Erkennung: vfl-journal-hat-segs-p.

Tests: 3 file-freie Unit-Tests fuer vfl-journal-hat-segs-p (SEGS erkannt,
OBJS/leer nicht). 243/243 LISP-Unit-Tests gruen in BricsCAD; test-neutral gegen
HEAD (11=11 Python-Failures); lang-Paritaet geprueft. End-to-end (Neubau +
deckungsgleicher Doppelklick) wie bei Modus 3 interaktiv zu bestaetigen.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-09-18 16:44:10 +02:00
Michael StanglandClaude Opus 4.8 008f497b5d VF-Linienzug: Abbruch-Wickel-Handler der 3 Modi zentralisieren
Der scharfe *error*-Abbruch-Handler (wickelt Teil-Geometrie bei ESC/(exit) zu
einem VF_n-Block mit vollem Journal) stand in Modus 1/2/3 dreimal WORTGLEICH,
nur der Marker-String unterschied sich. Jetzt eine gemeinsame Funktion
vfl-abbruch-handler-installieren (marker), die *error* als Lambda-Liste mit
eingebautem Marker-Literal setzt (list-Konstruktion, kein globaler Zwischen-
zustand). Der fragile Wickel-Rumpf existiert damit nur noch EINMAL - kuenftige
Fixes an einer Stelle statt drei.

Die je-Modus unterschiedliche old-error-Quelle bleibt an der Aufrufstelle
(M1: *error*, M2/M3: dbg-old-error via fruehem dbg-Hook) - nur der wortgleiche
Handler-Rumpf wird geteilt. Alle vom Handler zur Abbruchzeit dynamisch
aufgeloesten Locals (old-error/lastEnt/vfl-nummer/... /dbg-an) sind unveraendert
im Modus-Frame gebunden (VERTRAG in der Funktion dokumentiert).

Tests (tests/test_unit.lsp, tu-tests-vfl-abbruch): der Konstruktor erzeugt eine
gueltige (lambda (msg) ...)-Struktur und baut GENAU den uebergebenen Marker als
letztes Argument des vfl-modus-abbruch-sichern-Aufrufs ein (linienzug2 vs
linienzug3 geprueft). 240/240 LISP-Unit-Tests gruen in BricsCAD; keine neuen
Python-Failures (11 = HEAD-Baseline). Modus-1-ESC-Abbruch interaktiv bestaetigt
(Teilkette bleibt als editierbarer VF_n-Block stehen).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-09-18 16:36:11 +02:00
Samer Ayadi 40d79f4993 Adjust separator positions in hundm05 test data 2026-09-18 16:07:01 +02:00
Michael StanglandClaude Opus 4.8 74b767271b Fix: vfl-vwnb-eingefuegt sagt Modus 3 statt faelschlich Modus 2
Der Ergebnis-Banner des VF-Linienzug-Vorwaerts-Nachbaus (vfl-vwnb-*-Keys =
Modus 3) trug den falschen Text "Modus 2". Korrigiert in de_DE.json und
en_GB.json (Paritaet geprueft).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-09-18 15:58:21 +02:00
Michael StanglandClaude Opus 4.8 3cce1ec457 VF-Linienzug Modus 3 editierbar: Segment-Essenz statt Objekt-Handles
Modus 3 (Vorwaerts-Nachbau) hat jetzt dieselbe XDATA-Editierbarkeit +
Doppelklick-Neubau wie Modus 1/2. Statt der Pfad-Objekt-Handles wird die
abgeleitete Segment-ESSENZ journalisiert (neuer Journal-Typ SEGS): der VF_n-
Block ist damit selbst-enthalten, der Neubau unabhaengig davon, ob die
urspruenglichen LINE/ARC noch existieren - robuster als der OBJS-Weg von Modus 2.

Journal-Kern (vf_linienzug.lsp):
- Neuer Typ SEGS: Segmentliste (typ hz laenge bwinkel bseite spx spy epx epy)
  serialisiert als ";"-getrennte Segmente, Felder per "|". Eingebunden in
  vfl-entry->string / vfl-string->entry / vfl-entry->json.
- vfl-in-segmente: Live (ssget -> gf-sortiere-objekte -> gf-analysiere-kette ->
  Eck-Vorpruefung -> 9-Feld-Essenz) ODER Replay (Essenz direkt aus SEGS-Journal).
  Ersetzt vfl-in-selection im Modus-3-Ablauf.
- vfl-kette->segmente9 fuehrt Bau-Segmente + Start/Endpunkte zusammen; Soll-Ende
  kommt jetzt aus der Essenz statt aus den Original-Entities.

Modus-3-Umbau:
- Abbruch-Wickler + vfl-journal-xdata-schreiben mit Marker "linienzug3" (analog
  Modus 2). Kopf-Kommentar/Fehler-Handler-Variablen an Modus 2 angeglichen.
- Kein Live-Segment-Highlight mehr (Essenz-Bau reicht keine Entity mehr durch) -
  bewusst, im Code dokumentiert.

Doppelklick/Batch:
- vfl-edit-ent2 zu vfl-edit-ent-voll parametrisiert; vfl-edit-ent3 ruft
  vf-linienzug-modus3. vfl-edit-ent / vfl-konvertiere-ent / vfl-journal-xdata-
  lesen dispatchen "linienzug3".

Tests:
- 8 file-freie SEGS-Roundtrip-Unit-Tests (tests/test_unit.lsp, tu-tests-vfl-segs);
  234/234 LISP-Unit-Tests gruen in BricsCAD.
- vfl-in-segmente im statischen Headless-Waechter registriert.
- Verifiziert an einer echten linienzug3-Kette (results/test.dwg): SEGS-Journal
  korrekt geschrieben, Doppelklick-Neubau geometrisch deckungsgleich zum Original.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-09-18 15:55:47 +02:00
Michael StanglandClaude Opus 4.8 bc4b25d251 CLAUDE.md: LISP-Testsuite-Regeln + Headless-Lauf dokumentieren
Zwei Konventionen ergaenzt (Abschnitt Konventionen):
- Neue LISP-Routinen nach Moeglichkeit in die Testsuite aufnehmen; Vorrang fuer
  file-/zeichnungsfreie Routinen als tu-*-Block in tests/test_unit.lsp (TEST_UNIT).
- Headless-Testlauf ueber bin/run_tests.bat --lisp; BricsCAD steht dafuer ueber
  die Umgebungsvariable BRICSCAD (aus bin/setenv.bat) zur Verfuegung.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-09-18 15:55:24 +02:00
Michael Stangl 37fdedd996 VF-Linienzug AS/ES-Praeambel + csv:run-export entduplizieren
vf_linienzug.lsp: die 5-6x wortgleich ausgeschriebene AS-/ES-Winkel+Seite-
Praeambel (Winkel 30/90, Seite links/rechts, Masse setzen) in zwei
parametrische Helfer ausgelagert (vfl-frage-as-winkel-seite,
vfl-frage-es-winkel-seite - Seiten-Headerkey als Parameter, symmetrisch zum
bestehenden vfl-frage-es-seite). Ersetzt in modus1-AS, modus2-AS, modus2-ES.
modus3-AS und die QC-Nachfrage bleiben (kein echtes Duplikat, abweichende
Prompt-/Wizard-Semantik).

export.lsp: csv:run-export (181 Z.) in Phasen zerlegt - csv:export-vorbereiten
(Proxies/IDs/Zuordnung/Attribut-Update/Sep-Scan/REGENALL/bbox-Reset) und
csv:python-aufrufen (Python-Skript-Aufruf + Exitcode-Auswertung). Runner liest
sich jetzt als klare Sequenz.

Verhaltensneutrale Extraktionen; Klammerbalance unveraendert, Python-Testsuite
ohne neue Fehler (16 failed baseline vor/nach identisch).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@
2026-09-18 14:52:02 +02:00
Michael StanglandClaude Opus 4.8 ab7be54764 Test an neue csv:local-to-world-Signatur anpassen
Der Extrusions-Fix (d4260ac) hat csv:local-to-world von parent-rot-rad
(Winkel) auf parent-R (3x3-Rotationsmatrix) umgestellt. tu-tests-export
uebergab noch den Winkel und lief in "bad argument type <0.0>
expected <CONS>". Jetzt per (mat3-rz winkel) die Matrix bilden;
erwartete Ergebnisse unveraendert (Identitaet bzw. 90-Grad-Z-Drehung).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-09-18 14:33:03 +02:00
Michael StanglandClaude Opus 4.8 dbc6c585bf cs-zuordnung-lauf zerlegen + LISP-Testarchitektur vereinheitlichen
cs-zuordnung-lauf (~230 Zeilen, ~26 Locals) in sieben benannte
Routinen zerlegt (cs-sammle-bloecke, cs-scanner-zuordnen,
cs-separatoren-zuordnen, cs-korrektur-vermerken, cs-scanner-distanz-
melden, cs-anzahl-schreiben, cs-bericht-ausgeben); die Engine ist
jetzt ein schlanker Orchestrator. Verhalten unveraendert.

Dadurch ist die rein geometrische Zuordnungslogik von den Entity-
Zugriffen getrennt und unittest-faehig: neuer Block tu-tests-sepscan
mit 30 Tests fuer cs-in-box/cs-bump/cs-carrier-by-id/cs-assign/
cs-nearest-two/cs-resolve-sensor (Carrier-Records als plain Listen,
keine Zeichnung noetig).

Testarchitektur (Laden) vereinheitlicht: lazy Feature-Module
(GeruestInsert, count_sep_scan) werden AUSSCHLIESSLICH in test_unit.scr
auf .scr-Top-Level geladen. Grund: in BricsCAD werden per load
definierte Funktionen erst nach Rueckkehr zum Top-Level sichtbar - ein
load in c:TEST_UNIT oder einem gecatchten Testblock bindet sie im
selben Durchlauf nicht. Die Testbloecke laden nichts mehr, sie pruefen
nur per atoms-family. Runner gehaertet (tu-run-block faengt harte
Fehler je Block ab -> FAIL statt Suite-Abbruch, Report immer da).

Nebenbei aufgeraeumt: tote tests.lsp-Referenz in ssg_load.lsp entfernt
(Datei laengst geloescht, blockierte headless den kompletten Testlauf).

Voller LISP-Unit-Lauf jetzt 226/226 gruen.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-09-18 14:31:35 +02:00
Michael StanglandClaude Opus 4.8 52d92f0da6 Sepliste-Serialisierung DIMZIN-unabhaengig machen
ssg-sepliste->string formatierte die Separator-Koordinaten mit
(rtos x 2 2). rtos respektiert die Zeichnungs-Systemvariable DIMZIN
(Nullunterdrueckung): bei dem verbreiteten DIMZIN=8 wird 10.00 zu 10
gekuerzt, das Praezisions-Argument hilft nicht. Dieselben Koordinaten
serialisierten damit je nach Zeichnungsprofil unterschiedlich - fatal
fuer die PERSISTENTE XDATA/Journal-Ablage am Block (verlustfrei im
Roundtrip, aber umgebungsabhaengig).

Neue Helferfunktion ssg-sepliste-fmt-koord (fix-basiert, kaufmaennische
Rundung mit Uebertrag und Vorzeichen) ersetzt rtos - reproduzierbar,
unabhaengig von DIMZIN/LUPREC/LUNITS. Plus 7 Kantenfall-Tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-09-18 14:31:35 +02:00
Samer Ayadi d4260acb45 Fix Weltposition/K1-K4 fuer top-level Bloecke mit gekippter Extrusion
csv:block-to-json las Gruppe-10/-50 eines exportierten Blocks direkt als
flache Welt-x/y + Z-Drehwinkel. Ein top-level Separator-Proxy, der ueber
ssg-collect-nested-inserts aus dem geneigten ("Auf") Abschnitt einer
VF-/GF-Kette neu zusammengesetzt wird (csv:sep-proxies-erzeugen), kann
dabei selbst eine echt gekippte Extrusion (Gruppe 210) tragen - Gruppe-10
ist dann OCS-lokal, nicht Welt. Dadurch landeten "x"/"y"/"z" und darueber
K1/K2 (csv:get-k-kos-strings) an einem falschen, am Vorzeichen gespiegelten
Weltpunkt (beobachtet: Separator :4/6/8/10/12 in HundM05, K1 exakt am
Vorzeichen von X/Y gespiegelt weit ausserhalb der eigenen Boundingbox -
deshalb kein K-Kreuz in sps_skel/HundM05_bbs.svg trotz gefuelltem K1 in
der CSV).

csv:block-to-json wandelt pt jetzt erst per Arbitrary Axis Algorithm
(mat3-ocs-matrix) in echte Weltkoordinaten um und reicht die volle
3x3-Orientierung (mat3-from-normal-rotation) statt eines Z-Drehwinkels an
csv:get-k-kos-strings/csv:local-to-world weiter. csv:local-to-world nimmt
entsprechend eine Matrix statt eines Winkels; csv:vfgf-k-kos-strings ruft
es weiterhin mit reiner Rz-Matrix (VF_n/GF_n-Wrapper stehen an ihrem
top-level INSERT dokumentiert immer flach). Fuer Extrusion=(0 0 1) (der
Normalfall) reduziert sich alles exakt auf das bisherige Verhalten.
2026-09-18 10:25:19 +02:00
Samer Ayadi 923af4335a Fix K1/K2-Weltposition fuer gekippte Sub-INSERTs im CSV-Export
csv:get-k-kos-strings rechnete die Gruppe-10-Position eines K1-K4/
KS_EIN/KS_AUS-Sub-INSERTs ueber eine reine Z-Drehung des Elternblocks
um, ohne die EIGENE Extrusion (Gruppe 210) des Sub-INSERTs zu
beruecksichtigen. Bei schraeg sitzenden Anschlusspunkten wie KS_AUS
von SC_Entladung (BTMT-Entladung) landete K2 dadurch weit ausserhalb
der Bounding Box statt am tatsaechlichen Punkt - sichtbar als K2
unterhalb statt oberhalb des Elements in der Materialfluss-Draufsicht
(sps_skel HundM05_bbs.svg). Behoben ueber mat3-ocs-matrix/mat3-mul-
vec3 (Arbitrary Axis Algorithm, bereits in ssg_core.lsp vorhanden),
analog zum frueheren Fix in ssg-collect-nested-inserts-rel. Zusaetzlich
einen fuehrenden entnext entfernt, der aus demselben Grund ein K1/
KS_EIN als erstes Entity der Blockdefinition uebersprungen haette.
2026-09-17 15:01:11 +02:00
Samer AyadiandClaude Sonnet 5 0e4ea7e148 Kreisel-Umlauf: Abfolge ueber BB-Halbachsen statt Winkel um Mittelpunkt
compute_kreisel_umlauf sortierte Punkte bisher per atan2 um den
Kapsel-Mittelpunkt. Auf der langen Geraden (dx >> dy) liegen alle
echten Winkel in einem winzigen Band nahe 0 Grad - ein grosser,
asymmetrischer Block wie BTMT-Beladung/-Entladung hat einen Bbox-
Mittelpunkt, der deutlich weiter quer zur Achse absteht als der
Belt-Radius, was seinen Winkel unverhaeltnismaessig aufblies und ihn
mehrere eng benachbarte Punkte ueberholen liess, obwohl er entlang der
Achse klar der letzte ist (realer Fall: HundM05, BTMT-Entladung
"0023", landete zwischen 0039/0016 statt hinter 0018/0020).

Neu: Punkt in lokale Achsrichtung drehen und auf die BB-Halbachsen
(halbe Achslaenge, Radius) normieren; welche der beiden Komponenten
ueberwiegt, legt nur noch die Seite fest (Stirnseite/Langseite) - auf
den Langseiten bestimmt ausschliesslich die Achsrichtung die Position,
der quer abstehende Anteil kippt bestenfalls die Seiten-Zuordnung,
verzerrt aber nicht mehr die Reihenfolge selbst. Mit den realen
HundM05-Koordinaten verifiziert; test_export_kreisel_umlauf.py und
test_export_graph.py weiterhin gruen (20/20), keine neuen Regressionen
in der breiteren Suite.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 14:26:11 +02:00
Samer AyadiandClaude Sonnet 5 d0d112e740 Robuste Blockeinfuegung: kaputte Bloecke bei Testlaeufen verhindern
Der Redefine-Flush in ssg-ils-block-laden-dim brach nach genau zwei
(command)-Aufrufen ab; blieb ein Befehl trotzdem aktiv (z.B. bei
abweichenden INSUNITS), verschluckte der naechste (command ...)-Aufruf
des Aufrufers dessen Argumente als Antwort auf den offenen Prompt -
Ursache eines real beobachteten kaputten SC_Entladung-Blocks (keine
Attribute) beim letzten Element eines HundM05-Testlaufs. Flush jetzt als
bounded loop mit Warnung statt fixer 2 Versuche.

hundm05:bau-sensor vertraut nach dem INSERT nicht mehr blind (entlast):
eine ungueltige/keine neue Blockreferenz wird erkannt, evtl. Rest-
geometrie geloescht und der Ergebnis-Record als "abbruch" markiert;
fehlt das ID-Attribut, gibt es "warnung" statt stillschweigend weiter-
zumachen. Testlaeufe hinterlassen damit keine unbemerkt kaputten
Bloecke mehr.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 12:03:39 +02:00
Samer Ayadi ab2816e9ee Höhe von Beladung und Entladung angpasst 2026-09-17 10:37:51 +02:00
Michael StanglandClaude Opus 4.8 1d082ccde7 feat: Eingang/Ausgang-Symbole als eigene CSV-Zeile + in TrackIds
Die Materialfluss-Ein-/Ausgangssymbole (Bloecke Eingang_<DIM>/Ausgang_<DIM>,
eingefuegt ueber ils-insert-station) erscheinen jetzt NUR im CSV-Export als
eigene TeileArt-Zeile ("Eingang"/"Ausgang", Merkmale wie BTMT). Wie
Separator/AS/ES nehmen sie als freie Umlauf-Punkte (KREISEL_UMLAUF_TEILEARTEN)
an der TrackIds-Spalte teil und tauchen so auch auf Kreiseln auf, auf deren
Bahn sie liegen. Der Sivas-Export schliesst sie bewusst aus.

- cfg/export.cfg: pattern_eingang/pattern_ausgang
- Lisp/export.lsp: csv:collect-export-blocks sammelt beide Muster
- Lisp/ssg_id.lsp: ssg-id-collect-blocks erfasst sie (ssg-id-check-all fuellt
  das nachgetragene ID-ATTDEF, dokumentiert in data/ils/allocations.json)
- lib/export_csv.py: Klassifikations-Zweige Eingang/Ausgang
- lib/export_neighbors.py: KREISEL_UMLAUF_TEILEARTEN um Eingang/Ausgang erweitert
- lib/export_sivas.py: Eingang/Ausgang uebersprungen (kein Sivas-Eintrag)
- Tests: test_export_eingang_ausgang.py + Kreisel-Umlauf-Test

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-09-16 11:55:57 +02:00
Simon Hensch 52b0699862 [ADD] Lisp Skripte zu Erzeugung einer JSON mit den jeweiligen Attributen von mehreren DWG Dateien und zur Überschreibung der Attribute aus einer JSON 2026-09-16 11:47:26 +02:00
Michael Stangl 3fdbfa4cb1 ID zu Ein und Ausgang hinzugefügt 2026-09-16 11:20:27 +02:00
Simon Hensch 3fdfb020a6 Merge branch 'master' of https://gitea.schoenenberger.de/Schoenenberger_Systeme_GmbH/dxfmakros 2026-09-16 09:54:16 +02:00
Simon Hensch 5193f4018c [ADD] Gerüstoptionen werden nun mit dem Befehl GERUEST in Bricscad aufgerufen; Über ein Dropdown in den Oberflächen kann zwischen verschiedenen Arten (Säulen, Abhänger,...) umgeschaltet werden, dann erscheint ein neues Menü; Zusammenstellung der Anbauteile über die Oberfläche mit Anzahl und Checkbox; Speichern von konfigurierten Zusammenstellungen noch fehlerhaft 2026-09-16 09:54:13 +02:00
Yuelin Wang d9eb41f4d1 Merge branch 'master' of https://gitea.schoenenberger.de/Schoenenberger_Systeme_GmbH/dxfmakros 2026-09-16 09:09:09 +02:00
Yuelin Wang 143a4e7999 fix: Ab/Auf VF Kettenende nutzt ersten Winkel-Solve statt fehleranfaelliger zweiter Loesung,fix: fehlende Separator-Reservierung vor ES-Element im Kettenende-Solve ergaenzt ,Stufe 3 (Winkel+Horizontal-Fuellstueck) fuer VF-Linienzug Modus 1 ergaenzt 2026-09-16 09:08:59 +02:00
Samer Ayadi 6d569072ec Merge branch 'master' of https://gitea.schoenenberger.de/Schoenenberger_Systeme_GmbH/dxfmakros 2026-09-15 15:15:07 +02:00
Samer AyadiandClaude Sonnet 5 4a057862a8 fix: VF-Linienzug Journal-Reset, Spec-Grammatik (auf-ab/Linie-GF) und hz-Bug in HundM05
- vfl-journal-reset-lauf ans Funktionsanfang verschoben (Modus 1/2/3,
  Lisp/vf_linienzug.lsp): stand bisher nach der Startpunkt/Hoehe/AS-
  Praeambel und loeschte diese beim Reset selbst wieder - Journal begann
  mit dem ersten STEP-Marker statt PT, betraf jede Kette.
- Spec-Grammatik erweitert (Lisp/vf_spec.lsp, lib/vf_linienzug_grammatik.py,
  lib/vf_spec_export.py): "auf-ab" bei bereits flach ankommender Kette
  (Richtungswahl statt Zielhoehe) und neue Linie-GF-Fragereihenfolge
  (Kettenende direkt nach laenge_modus, inkl. vorgezogenem ES). Tests in
  tests/test_vf_spec.lsp/.py angepasst.
- lib/vf_linienzug_grammatik.py: _linie("kettenende_ziel") erwartete
  faelschlich ein hz-REAL nach der Distanz - der reale Bauablauf
  (vfl-body-abschluss) leitet die Richtung dort aus dem Frame ab und
  fragt sie nie. Fuehrte zu einem Token-Desync beim Dekodieren echter
  Kettenende-Journale.
- tests/testdata/hundm05.json (VF_hundm05_LZ_01): 5 ueberfluessige
  hz-Felder entfernt. vsp-linie injiziert bei JEDEM vorhandenen hz-Feld
  einen Richtungs-Token, unabhaengig vom tatsaechlichen Bauablauf - die
  Felder desyncten den Replay und liessen die Kette stumm mit der
  falschen (verkuerzten) Geometrie fertig bauen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 15:13:07 +02:00
Yuelin WangandClaude Sonnet 5 551f2808d7 refactor: Lesehilfe-CSV nutzt verschachtelte {bezeichnung, wert}-Struktur
details_mit_bezeichnung() liefert fuer die "*_mit_bezeichnung.csv" jetzt
{"<Nummer>": {"bezeichnung": "...", "wert": "..."}} statt eines
zusammengesetzten Schluessels "<Nummer> | <Bezeichnung>" - Merkmalnummer
bleibt dadurch ein sauberer JSON-Key, Bezeichnung/Wert sind eigene,
eindeutig benannte Felder. Die eigentliche Sivas-Import-Datei
(*_sivas.csv) ist davon nicht betroffen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 12:21:32 +02:00
Yuelin WangandClaude Sonnet 5 6f12cab86f refactor: Sivas-CSV-Export auf Merkmalnummern umgestellt, lesbare Zweitdatei
- ILS 2.0 Kreisel/Strecke(VF_N)/Gefaellestrecke/Automation: details-JSON
  nutzt jetzt Sivas-Merkmalnummern (z.B. "2952") statt beschreibender
  Klartext-Keys, abgeglichen mit dem Merkmalstamm in
  cfg/Merkmalsstamm_in_Sivas.xlsx.
- ILS 2.0 Zusatzmodul: BT-Beladung und Abwurfstationen laufen jetzt in
  einer gemeinsamen Zeile (Merkmale 3501-3504) statt zwei separaten
  Zeilen ohne details.
- Gefaellestrecke-Gruppe: Anzahl-Spalte bleibt fest 1, die reale
  Stueckzahl der Gruppe steht im Merkmal 4311 (anders als bei Kreisel,
  wo die Anzahl-Spalte die Stueckzahl traegt und 3511 fix "1" ist).
- Automation-Summenzeile: 4407 zaehlt jetzt echte Streckengruppen
  (VF_N-Bloecke) statt eines 0/1-Flags, 4408 (Motoren Vario-Foerderer)
  wird erstmals tatsaechlich berechnet (vorher nie inkrementiert), 4426
  steht fest auf "0" (Konzept "einzelner Variofoerderer" entfaellt).
- Neues Modul lib/merkmalstamm.py: liest Merkmalnummer->Bezeichnung aus
  der xlsx rein per Standard-Library (zipfile/xml.etree, keine neue
  pip-Abhaengigkeit fuer den ueber export.lsp aufgeloesten Interpreter).
- export_sivas.py schreibt bei jedem Lauf zusaetzlich eine zweite Datei
  "<name>_mit_bezeichnung.csv" (gleicher Inhalt, aber jeder
  Merkmalnummer-Key um "<Nummer> | <Bezeichnung>" erweitert) - reine
  Lesehilfe zur Pruefung, wird von Sivas nicht eingelesen.
- cfg/sivas_merkmal_zuordnung.md: Nachschlagetabelle Block-Attribut <->
  Merkmalnummer je Teileart, inkl. offener Punkte (Separator-/
  Scanner-Aufteilung Gefaelle-/Vario-Anteil noch Platzhalter).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 10:33:20 +02:00
Samer Ayadi 18771d53ff Merge branch 'master' of https://gitea.schoenenberger.de/Schoenenberger_Systeme_GmbH/dxfmakros 2026-09-14 16:45:47 +02:00
Samer Ayadi ebb9082305 HundM05: Endhöhe des ES stimmt noch nicht zu AS des Beginns. 2026-09-14 16:45:39 +02:00
Michael Stangl 865225f6f6 fix: LAYER-Attribut nicht mehr in Geruest-Sivas-Export schreiben
LAYER ist reine BricsCAD-Zeichnungsinformation ohne Sivas-Bedeutung.
export_csv.py (bricscad.csv) behaelt es weiterhin fuer die Zuordnung in der
Zeichnung.
2026-09-14 14:59:02 +02:00
Michael Stangl c5ae0bd769 fix: Geruest-Sivas-Export erzeugt eine Zeile je Artikelnummer statt Sammelzeile
Sivas kennt nur eine Sivasnr je Zeile - ARTINR (kommagetrennte Liste) wird
daher aufgesplittet. Gleiche Artikelnummern innerhalb derselben Baugruppe
werden zu einer Zeile mit Anzahl>1 zusammengefasst (wie bei Boegen/Weichen).
Jede resultierende Zeile traegt die volle LAENGE der Baugruppe.
2026-09-14 14:55:30 +02:00
Michael Stangl 1590f8f7ed feat: GR_-Geruest-Baugruppen in EXPORTCSV/EXPORTSIVAS aufnehmen
GR_-Bloecke werden jetzt wie BTMT eigenstaendig gesammelt (LISP: neues
pattern_geruest in cfg/export.cfg, csv:collect-export-blocks,
ssg-id-collect-blocks + ID-ATTDEF in *geruest-attrib-defs*) und in beiden
Python-Exporten als eigene TeileArt-Zeile ausgegeben: ARTINR/BEZEICHNUNG/
TEILEART/LAENGE in festen Spalten, restliche Attribute (FARBE/LAYER) im
Merkmale-/details-JSON.

Dabei zwei Bugs behoben, die beim ersten echten GR_-Export sichtbar wurden:
- csv:json-escape nutzte vl-string-subst (ersetzt nur das erste Vorkommen)
  statt des global ersetzenden ssg-str-replace-all - bei Attributwerten mit
  mehreren Anfuehrungszeichen blieb ein Zeichen unescaped und brach die
  JSON-Struktur beim Python-Parsen.
- Gradzeichen (°) in data/json/geruest.json durch "Grad" ersetzt, um das
  Encoding-Risiko (cp1252 vs. UTF-8 beim LISP-Export) zu vermeiden.
2026-09-14 14:22:45 +02:00
Simon Hensch 9e3ac1f70a Merge branch 'master' of https://gitea.schoenenberger.de/Schoenenberger_Systeme_GmbH/dxfmakros 2026-09-14 13:30:53 +02:00
Michael StanglandClaude Sonnet 5 c171bc44d6 docs: CSV-Export-Doku in doc/csv-export.md ausgelagert und mit Beispiel ergaenzt
Der lange Docstring in lib/export_csv.py wandert nach doc/csv-export.md
(inkl. durchgerechnetem Beispiel Kreisel+VarioFoerderer), der Docstring
verweist nur noch darauf.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-14 12:59:44 +02:00
Samer AyadiandClaude Sonnet 5 23d79ec354 feat: eingang_hoehe="auto" auf Python-Seite nachgezogen, hundm05.json bereinigt
Lisp (vf_linienzug.lsp/vf_spec.lsp):
- vsp-eingang-hoehe unterstuetzt jetzt "auto" (NIL-Token statt REAL) -
  bewusst keine Zahl vorgeben, der Bauablauf berechnet seinen eigenen
  Vorschlag, wie bei leerer Konsoleneingabe
- vfl-journal-reset-lauf: internes Reset innerhalb von vf-linienzug-modus/
  -modus2 loescht *vfl-replay-queue*/*vflw-pending* nicht mehr mit (Bug:
  REPLAY-getriebener Bau (vsp-bau-aus-spec) brach mitten in der Kette ab,
  weil eine noch unverbrauchte Queue verworfen wurde)

Python-Gegenstueck nachgezogen (lib/vf_linienzug_grammatik.py,
lib/vf_spec_export.py, lib/vf_journal_export.py):
- NIL-Token-Unterstuetzung fuer eingang_hoehe="auto" im gemeinsamen
  Parser-Kern, im Schreiber (SpecSchreiber) und in der Protokoll-Annotation
- gf_verteilung ist im Schreiber jetzt an der Feldpraesenz in der Spec
  festgemacht statt an einem Grammatik-Flag (selbstbeschreibend, deckt
  Specs mit und ohne diese Frage ab, ohne dass der Aufrufer die Grammatik
  kennen muss)
- Rundlauf-Pruefung (main(), test_verlustfrei) toleriert jetzt die bekannte,
  schon dokumentierte Erweiterung um drei neue Linie-GF-Pflichtfragen
  (ist_teilfolge statt exakter Gleichheit)
- test_gleiche_journale_wie_protokoll: alle 5 Ketten in hundm05.json weichen
  inzwischen vom Rohprotokoll ab (Kette 1 bewusst wegen eingang_hoehe,
  Ketten 2-5 schon laenger wegen Handkorrektur gegen echte DXF-Positionen)
  - expliziter Skip mit Begruendung statt leerem Loop

tests/testdata/hundm05.json:
- mm-Werte (dl, Start-/Stuetzpunkte, Koordinaten der Nachtrag-Objekte) auf
  eine Nachkommastelle gerundet
- nicht abgefragte Kopf-Metadaten entfernt (beschreibung, sivas_id,
  sivas_bezeichnung, planquadrat, block, dxf_handle) - nur quelle bleibt

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-14 12:54:30 +02:00
Simon Hensch d19bac7a1f [ADD] Erste Einbindung eines Menüs zum Konfigurieren und Einfügen von Gerüstkomponenten; TODOs: Anzahl der Gerüstkompnenten Variabel machen und für den Benutzer die Anzahl der Baugruppe sichtbar machen; Vorkonfigurierte Baugruppen anbieten; Einfachere Auswahl mit Checkbox oder Input (Anzahl) 2026-09-14 12:43:17 +02:00
Samer AyadiandClaude Sonnet 5 6d15c6be13 refactor: VF-Linienzug-Journal-Grammatik in lib/vf_linienzug_grammatik.py gebuendelt
lib/vf_journal_export.py (Journal.dekodiere) und lib/vf_spec_export.py
(SpecLeser) implementierten denselben Tokenwalk (Praeambel, Sektions-
schleife, Glied-Dispatch, VF-Einheit-Unterschleife) sowie dieselben
Code-Tabellen (SEITE/VARIANTE/VERTEILUNG/IM_VF/ENDPUNKT/ENDE2/ENDE3/
GEFAELLE/GF_LAENGE_MODUS, MENU_START/MENU_START_AKTUELL/MENU_WEITER,
Grammatik) unabhaengig voneinander - Aenderungen an der Grammatik (wie
im vorigen Commit) mussten von Hand synchron gehalten werden und sind
bereits einmal auseinandergelaufen.

Neuer gemeinsamer Parser-Kern (Kern/lies_journal) plus Sink-Schnittstelle
(SpecSink in vf_spec_export.py, ProtokollSink in vf_journal_export.py)
ersetzt die doppelte Implementierung; Code-Tabellen/Grammatik-Objekte
leben jetzt nur noch in lib/vf_linienzug_grammatik.py. Journal behaelt
nur noch die reine XDATA/DXF-Zerlegung, SpecSchreiber (Spec -> Journal,
Gegenstueck zu Lisp/vf_spec.lsp) bleibt unveraendert in vf_spec_export.py.

Zusaetzlich: pruefe_flachen_freitext schlaegt jetzt hart fehl, wenn
generierter Freitext (quelle/beschreibung) ein rohes Anfuehrungszeichen
enthaelt - der Lisp-seitige Flach-JSON-Leser (ssg-cfg-parse-value) kennt
keine Escapes und wuerde daran die Zeichenkette (und damit die gesamte
restliche Datei) falsch zerlegen.

Byte-identischer Output gegen die Baseline geprueft (beide CLIs, echte
Eingaben); pytest tests/test_vf_spec.py + test_vf_journal_grammatik.py
unveraendert: 2 bekannte, vorbestehende Fehlschlaege, 38 bestanden.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-14 11:59:22 +02:00
Samer AyadiandClaude Sonnet 5 1bdecf0678 fix: Horizontal-VF-Kettenanfang (eingang_hoehe) in vsp-journal nachgezogen, hundm05.json erneuert
vf-linienzug-modus fragt bei einem mit "Horizontal-VF" eroeffneten
Kettenanfang eine Ziel-Hoehe fuer den GF1-Einlauf ab (vfl-prompt-hoehe-
eingang-gf1) und laesst dort die GF-Verteilungsfrage weg (fest "alles am
Einlauf") - vsp-journal/vsp-vf-einheit kannten das noch nicht. Ausserdem
werden ES-Winkel/-Seite beim kettenende-sub jetzt an der richtigen
Journal-Position (inkl. eigenem STEP-Marker) emittiert.

tests/testdata/hundm05.json: VF_hundm05_LZ_02..05 (die vier baugleichen
Schleifen, Block VF_1) aus tests/testdata/linienzug_tests.json neu
abgeleitet, mit den realen Startkoordinaten aus results/test_hundM05.dxf
statt der alten "sub":"auf-ab"-Behelfsloesung. VF_hundm05_LZ_01 und alle
Kreisel-/Separator-/Scanner-/BTMT-Objekte unveraendert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-14 11:59:07 +02:00
Yuelin WangandClaude Sonnet 5 41419763c0 feat: Option 4 - dynamische S-Winkelwahl (3/6/9...Grad) wie Option 5
vfl-gf-auf-ab-solve bekommt einen 3. Parameter s-winkel (S's Neigung -
F_total bleibt immer bei *vfk-gefaelle-winkel*=3 Grad). Neue reine
Massen-Helfer vfl-projiziere-neigung + vfl-gf-bogen-summe (Formel-basiertes
Pendant zu vfl-gf-bogen-erweitern aus Option 5, da Option 4's Solver ohne
Live-Probe rechnet). vfl-qc-linie-mit-gf probiert s-winkel=3,6,9,... in
einer Schleife (max. 10 Versuche), bis F_total/S beide baubar sind - der
flachste passende Winkel wird automatisch gewaehlt, damit auch kuerzere
Mittelteil-Gesamtlaengen baubar sind statt nur bei einem festen Winkel.

Bei s-winkel=3 (extra-grad=0) reduziert sich die neue Formel nachweislich
exakt auf die alte, bereits bestaetigte Formel (Term-fuer-Term verifiziert)
- kein Regressionsrisiko fuer den bisherigen Grundfall. Vom Nutzer in
BricsCAD erfolgreich getestet.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-14 09:07:04 +02:00
Yuelin WangandClaude Sonnet 5 ca5c21686f chore: Vario_Bogen_ab_3_TEF_rechts_2D.dwg aktualisiert
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-14 08:46:28 +02:00