Commit Graph

506 Commits

Author SHA1 Message Date
m.stangl c36d2774bf [CHANGE] VF-Linienzug: Winkel-Standardisierung + Glied-Schema + Vario-Kurve editierbar
Winkel im Linienzug durchgaengig als echter Wert (30/60/90) statt Auswahl-
Index (1/2/3) journalisiert - behebt den Bug, bei dem ein verrutschter
String-Wert zum falschen Bogen fuehrte (vfl-menu-winkel/-winkel-live/
-winkel-normieren, GF-Bogen und Vario-Kurve).

Zentrales Glied-Schema (*vfl-glied-schema*) als single source of truth fuer
AS/ES/GF-Bogen/Vario-Kurve: generisches bauen/lesen/validieren, benanntes
Debug-Log (GF-Bogen.winkel = 90 statt roher [INT]-Zeilen). VF-Einheit ueber
Sub-Step-Referenz (*vfl-vf-substeps*) benannt geloggt, ohne sie in ein starres
Feld-Schema zu zwingen.

Vario-Kurve als eigenes Sub-Glied editierbar (eigener STEP-Marker wie ES):
vfl-vario-slice-bauen/-werte/-splicen, vfl-glied-vario-dialog, Dispatcher-Zweig,
Label. Schwanz-erhaltender Splice (vfl-vario-slice-splicen), da die Vario-Kurve
mitten in der VF-Einheit steht und ihr Slice nachfolgende VF-Antworten enthaelt
- naiver Splice haette diese verworfen (adversarial verifiziert). Uebrige
VF-Sub-Segmente bleiben bewusst nur ueber Sektions-Ruecksprung editierbar.

Neuer Unittest tests/test_vfl_schema.lsp (TEST_VFL_SCHEMA, in alltests.json):
Roundtrip + Validierung + Vario-Schwanz-Splice ohne Geometrie.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-28 23:12:30 +02:00
s.hensch cd31380a91 [ADD] Trajektorie für Carrier in AS Elementen hinzugefügt 2026-08-28 13:47:33 +02:00
s.hensch dd5b7b0b3b [FIX] Korrektur der ES/AS Elemente, sodass die Position und Orientierung der KSysteme für 2d und 3d identisch sind 2026-08-28 13:28:59 +02:00
s.hensch df2b4f1709 [CHANGE] Attribute für ILS Blöcke korrigiert - Artikelnummern für 30 Grad ES AS Elemente hinzugefügt, ZUORDNUNG als Attribut nur bei Scanner und Separator, ID als Attribut für alle Blöcke hinzugefügt 2026-08-28 10:10:19 +02:00
m.stangl 43896a28f5 VF-Linienzug: Einzelsegment-Bearbeitung (GF-Bogen) + punktfreies Journal
Doppelklick auf einen Linienzug-VF_n-Block bietet jetzt zwei Modi
(neuer Dialog vfl_edit_modus.dcl / vfl-dlg-modus): auf eine Sektion
zuruecksetzen (bisheriges Verhalten) ODER die Eigenschaften EINES
einzelnen Glieds aendern (vfl-edit-glied). Fuer GF-Boegen laesst sich
Winkel (30/60/90) und Seite (links/rechts) direkt aendern; das Glied
wird per vfl-journal-splice im Ketten-Journal ersetzt und die komplette
Kette 1:1 neu aufgebaut.

Damit die nachfolgenden Glieder nach einer Bogen-Aenderung korrekt neu
verketten, speichert das Journal fuer Linien-Segmente jetzt nur noch die
relative Distanz (deltaL, neuer Journal-Kind "DL") statt eines absoluten
Punkts - nur der Kettenstartpunkt bleibt ein echter Punkt. Richtung wird
ohnehin vom Vorgaenger-Frame geerbt (nur das erste Segment journalisiert
zusaetzlich die gesnappte Richtung). vfl-in-abstand ersetzt die
punktbasierte Messung in vfl-neue-linie-messen; vfl-kettenanfang-baustein
rechnet die AS-Restlaenge rein skalar (kein pick-punkt mehr).

Wichtige Korrekturen:
- vfl-entry->string/-entry kannten den DL-Kind nicht (wurde als NIL
  serialisiert -> Distanzverlust beim erneuten Lesen)
- vfl-in-abstand journalisiert jetzt in BEIDEN Zweigen (Replay UND Live),
  wie die anderen vfl-in-*-Wrapper - sonst gingen die DL-Werte replizierter
  Glieder beim erneuten Speichern verloren (2. Edit stuerzte ab)

Diagnose: komplettes Journal wird beim Erzeugen (XDATA-JOURNAL-JSON) und
zu Beginn eines Replays (REPLAY-QUEUE-JSON) als JSON in die Debug-Datei
geschrieben (No-Op ohne aktiven Debug-Schalter).

dcl/vfl_edit.dcl: Popup breiter (edit_width/list_width), damit lange
Sektionstexte nicht abgeschnitten werden.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-27 17:51:41 +02:00
s.hensch deffdca8a2 [ADD] BTMT Beladung als 2D Element 2026-08-27 15:49:48 +02:00
s.hensch a5350760e2 [FIX] Korrektur und Reduzierung der 2D und 3D DWGs für die Be- und Entladung ILS 2026-08-27 15:48:34 +02:00
m.stangl 308d49fc96 VF-Linienzug: baubare Hoehen-Vorschlaege (Ab/Auf) statt unveraenderter Ist-Hoehe, negative Restlaenge nach AS-Element abgefangen
- Hoehe-Prompt/Wizard-Dialog schlagen jetzt zwei tatsaechlich baubare
  Zielhoehen vor (Ab/Auf) statt der unveraenderten Kettenhoehe, die bei
  direkter Uebernahme immer als deltaH=0 abgelehnt wurde (Linie-GF,
  Linie-VF, automatische Linie, VF-Kette fortsetzen, Kettenende-Abschluss)
- Nach dem AS-Element-Einfuegen kann die real gemessene Restlaenge negativ
  werden (Klickpunkt zu nah); Linie-GF und automatische Linie pruefen das
  jetzt und brechen sauber ab statt eine entartete GF-Strecke zu bauen
- Debug-Log (Modus 1) protokolliert jetzt Erfolg/Misserfolg der
  Geometrieerzeugung inkl. der verwendeten Werte
- Neue Lisp/vf_konstanten.lsp: zentrale, dokumentierte Sammlung aller
  Laengen-/Winkel-Magic-Numbers aus dem VarioFoerderer-Cluster als
  Nachschlagewerk (Module selbst noch unveraendert)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-27 13:27:25 +02:00
m.stangl 9fdc1b8bdd VF-Linienzug: Wizard-Gruppendialoge waehrend Journal-Replay unterdrueckt
Beim Editieren einer bestehenden VF_n-Kette (VARIOFOERDERER_EDIT) feuerten
die Wizard-DCL-Gruppendialoge (vflw-gruppe-*-impl) weiterhin, obwohl der
Ablauf gerade aus dem gespeicherten Journal repliziert wurde - sie waren nur
an *vfl-wizard-mode* gebunden, nicht an den Replay-Status. Ihre Antworten
landeten in *vflw-pending*, wurden dort aber nie konsumiert (die vfl-in-*-
Wrapper pruefen die Replay-Queue zuerst) und blieben liegen. Sobald die
Replay-Queue leer war und auf Live-Eingabe umgeschaltet wurde, laseen die
Wrapper diese laengst veralteten, falsch typisierten Werte statt neu zu
fragen - z.B. landete eine Menue-Antwort ("1") in vfl-in-point und liess
vfl-neue-linie-messen mit "bad argument type <1> ; expected <CONS>" abstuerzen.

Neue Hilfsfunktion vfl-wizard-aktiv prueft zusaetzlich *vfl-replay-queue*
und ersetzt an allen 15 Aufrufstellen die reine *vfl-wizard-mode*-Abfrage.
Als Absicherung leeren vfl-journal-reset und vfl-journal-replay-start jetzt
zusaetzlich *vflw-pending*.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-27 12:12:58 +02:00
m.stangl f92c80d82a VF-Linienzug: Modus 2 loggen, Debug-Default auf AN, GF-Hoehenvorschlag-Bug behoben
Debug-Logging (Schalter vfl-modus1/2/3) ist jetzt standardmaessig AN statt
AUS, damit nicht vor jeder Session manuell eingeschaltet werden muss. Modus 2
(vf-linienzug-modus2) war bisher nicht instrumentiert - Session-Open/Close
und *error*-Handling analog Modus 1/3 ergaenzt; da Modus 2 durchgehend die
vfl-in-*-Wrapper nutzt, wird das Eingabe-Logging automatisch ueber den
vorhandenen vfl-journal-record-Hook mitgezogen.

Bugfix: Der Hoehen-Vorschlag im GF-Zielhoehe-Dialog (Wizard + Konsole) war
schlicht die unveraenderte Ist-Hoehe der Kette. Direkt uebernommen ergab das
deltaH=0, was als "Auf" statt "Ab" gewertet und immer mit "kann nicht
steigen" abgelehnt wurde - der Default war also nie baubar. Neue Hilfs-
funktion vfl-gf-hoehe-vorschlag rundet auf volle mm ab und zieht bei
bereits ganzzahligen Werten zusaetzlich 1mm ab, damit der Vorschlag
garantiert unterhalb der Ist-Hoehe liegt.

Ausserdem: unnoetige Anfuehrungszeichen aus den zugehoerigen Fehlermeldungen
(de/en) entfernt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-27 11:25:47 +02:00
m.stangl 4238509e7d Debug-Logging fuer VF-Linienzug Modus 1 und Modus 3
Zentrale Debug-Schalter-Sammlung (*dbg-schalter*, Default AUS) in
ssg_dbg.lsp: dbg-schalter-on/-off/-p/-open/-liste. dbg*-Aufrufe bleiben
dauerhaft im Code, ohne im Normalbetrieb .dbg-Dateien zu erzeugen.

Modus 1 (vf-linienzug-modus): Session-Logging ueber Schalter
"vfl-modus1" nach DXFM_LOG/vfl_modus1.dbg. Da alle interaktiven
Eingaben bereits ueber die gemeinsamen vfl-in-point/-string/-real/
-int/-value/-selection-Wrapper laufen, reicht eine einzige
Instrumentierung in vfl-journal-record/-mark/-steplabel, um jede
Frage/Antwort automatisch mitzuloggen.

Modus 3 (vf-linienzug-modus3): auf dieselben vfl-in-*-Wrapper
umgestellt (vorher rohe getstring/getreal/getint/ssget) - profitiert
dadurch vom selben automatischen Logging (Schalter "vfl-modus3",
DXFM_LOG/vfl_modus3.dbg). Kein Journal-Replay/XDATA wie bei Modus 1/2,
nur das Logging wurde uebernommen. Fix nebenbei: Dialog-Kopfzeile
"Hoehe (Z) des Endpunkts [%1]" zeigte den Platzhalter woertlich statt
des Vorschlagswerts (ssg-text statt ssg-textf).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-27 10:59:10 +02:00
m.stangl c9ce3bbe4a doc: Wizard-Dialog zeigt echte Frage statt generischem Menuetext
frage-key-Parameter (vfl-menu/vfl-menu-int -> *vflw-menu-frage* ->
vflw-wahl) dokumentiert, der die Dialog-Kopfzeile mit der eigentlichen
Frage statt "Ihre Wahl (1/2/3)..." befuellt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-27 10:58:15 +02:00
m.stangl e3dbaceb24 Wizard mit Oberflächenstückwerk für den Mode 3 für den VF gebaut 2026-08-26 11:33:19 +02:00
m.stangl 5cb0b00ce5 Artikelnummern der AS und ES Elemente für 30 Grad rechts und links eingetragen 2026-08-26 08:35:30 +02:00
m.stangl d7cb17f53f vf_*.lsp: verbleibende deutsche Meldungen auf ssg-text/ssg-textf umgestellt
Betrifft VarioFoerderer-Kern, Standard-/Etage-Aufbau und Linienzug (inkl.
altem Vorwaerts-Nachbau-Modus und Vario_Kette_Merge-Diagnose). Neue Keys in
lang/de_DE.json und lang/en_GB.json ergaenzt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-25 23:34:32 +02:00
m.stangl 82ce795b53 Linienzug: Abbruch wickelt Teil-Geometrie statt sie zu loeschen; Editieren per DCL-Dialog
Abbruch (ESC) im Linienzug-Baumodus loescht die bereits eingefuegte
Geometrie nicht mehr, sondern wickelt sie wie ein fertiger Bau zu einem
VF_n-Block und schreibt das volle Eingabe-Journal als XDATA drauf
(vfl-modus-abbruch-sichern, ersetzt das bisherige Loesch-Rollback). Die
Teil-Kette bleibt damit stehen und ist sofort per Doppelklick weiter
editierbar/fortsetzbar - unabhaengig davon, ob der Abbruch beim frischen
Bauen oder mitten in einem Editier-Neuaufbau passiert. Der bisherige
Menuepunkt "Letzten Abbruch fortsetzen" (Session-Variable) entfaellt
dadurch ersatzlos.

vfl-edit-ent (Doppelklick-Editieren) fragt die Sektion, auf die
zurueckgesetzt werden soll, jetzt per neuem DCL-Dialog ab
(dcl/vfl_edit.dcl, vfl-dlg-position: Combobox 1..N + OK/Abbrechen) statt
per Text-Prompt. Vorbelegung auf die letzte Sektion, damit Doppelklick +
sofort OK einen abgebrochenen Bau nahtlos fortsetzt.

Die *error*-Handler-Installation wandert vor den allerersten Prompt
(vorher: nach Startpunkt/AS-Frage), damit ein ESC in diesem Fenster nicht
mehr auf den ungeschuetzten vorherigen Handler faellt. Das Wickeln im
Abbruch-Pfad ist per vl-catch-all-apply abgesichert, da vfl-block-erstellen
intern einen BKS-Wechsel per (command "_.UCS" ...) macht.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-25 22:06:17 +02:00
m.stangl 236808f4dc Varioförderer Aufbau enthält jetzt einen Historien Stack. Beim Abbruch können alle Elemente wiederhergestellt werden und dann einfach weiter gebaut. 2026-08-25 16:09:22 +02:00
m.stangl f5d0e57132 Meldung der unkorrekten Zuordnungen von Separatoren 2026-08-25 11:31:51 +02:00
m.stangl c1802630c4 Eingang und Ausgangssymbol des Materialflusses hinzu 2026-08-25 11:01:50 +02:00
s.ayadi c3f0d2717d Merge origin/master: Sensor-Zuordnung + Connections zusammenfuehren
Konflikt in lang/de_DE.json und lang/en_GB.json aufgeloest: beide Seiten
haben nur Schluessel ergaenzt (con-*/cmd-connection-* hier, sens-* aus
origin). Beide Saetze uebernommen, Einrueckung von origin (2 Leerzeichen)
beibehalten, tro-edit-fb mit UID-Anzeige uebernommen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-24 12:13:09 +02:00
s.ayadi 7242e815f8 HundM05-Testfall und DXF-Analyse-Skripte
- lib/dxf_scan_components.py: erkennt ILS-/Omniflo-Komponenten in fremden
  Projektzeichnungen und schreibt sie im Testdaten-JSON-Schema aus
- lib/dxf_abbild.py: getreue Abbildung der Bauteile einer Fremdzeichnung
  (Attribute, Weltkoordinaten, Unterkomponenten) ohne Interpretation
- tests/test_hundm05.{lsp,py}, testdata/hundm05.json, conftest-Fixtures und
  alltests.json-Eintrag fuer den Kreisel-Abschnitt aus ST500592_05.dxf
- menu: TEST_HUNDM05 im Testmenue, Connection_Insert/Edit in SSG_LIB.cui
- Doku: hartkodierte Pfade durch (getenv "DXFMAKRO") ersetzt

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-24 12:10:58 +02:00
m.stangl fe3adc7e59 Separatoren zaehlen: nur platzierte Symbole, interne Kettenglieder nicht
Der intern in der GF/VF-Kette gezeichnete 300-mm-Block
Staustrecke_Separator_SP ist ein Foerder-/Uebergabestueck, kein
eigenstaendiger Separator. Er wurde bisher als Separator mitgezaehlt
(ANZAHL_SEPARATOR = intern + platzierte Symbole), wodurch eine GF mit
einem darauf gelegten S-LP-Symbol faelschlich 2 statt 1 ergab.

count_sep_scan.lsp: ANZAHL_SEPARATOR zaehlt jetzt nur noch die platzierten
Separator_SP/S-LP-Symbole (newP = nsep). Schnelltest cs-zuordnung-noetig-p
entsprechend auf reine Symbolzahl je Carrier umgestellt. Die interne
Zaehlung (cs-count-nested, *intern-separator-pattern*, internSep) entfaellt.

Gefaellestrecke.lsp: GF-Bau setzt ANZAHL_SEPARATOR beim Erstellen mit 0 vor
(interne Kettenseparatoren zaehlen nicht) - die echte Anzahl fuellt der
Export aus den platzierten Symbolen. Label "Sep=N" entfernt (waere sonst
immer 0 bzw. widerspraeche dem Export). n-bogen-gf/gf-make-label
entsprechend bereinigt.

Hinweis: tests/reference/gefaellestrecke_tests_export.csv (Anzahl_Separator=1
ohne platzierte Symbole) wird dadurch stale -> per TEST_EXPORT_ALL in
BricsCAD neu erzeugen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 17:02:10 +02:00
m.stangl 9341d4c5c2 Sensor-Zuordnung: billiger Schnelltest vor teurem Lauf
cs-zuordnung-noetig-p prueft ohne jede Boundingbox (nur Attribute lesen +
interne Ketten-Separatoren aus der Blockdefinition zaehlen), ob der teure
cs-zuordnung-lauf (Boundingbox+Regen je Carrier und Sensor) ueberhaupt
noetig ist. Voller Lauf nur bei leeren ZUORDNUNG-Eintraegen oder wenn die
Summe ANZAHL_SCANNER/ANZAHL_SEPARATOR ueber alle Carrier nicht zur Anzahl
der Scanner-/Separator-Symbole (+ interne Ketten-Separatoren) passt.
Sonst wird uebersprungen (neue Meldung sens-skip).

csv:run-export ruft die Zuordnung jetzt nur noch bei Bedarf auf. Der
interaktive Befehl ZAEHLE_SEP_SCAN rechnet weiterhin immer komplett neu
(deckt auch den Fall ab, dass ein Sensor ohne Summenaenderung von einem
Carrier zu einem anderen verschoben wurde).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 15:54:47 +02:00
m.stangl edfba75801 Sensor-Zuordnung: Separator/Scanner je Kreisel/Strecke zaehlen vor Export
count_sep_scan.lsp neu als wiederverwendbare Engine (cs-zuordnung-lauf),
die automatisch vor jedem CSV-/Sivas-Export laeuft (export.lsp,
csv:run-export). Zaehlt Separator_SP/Scanner je Carrier (Kreisel/Eckrad,
VF_*, GF_*) ueber die gemeinsamen cfg/export.cfg-Muster und schreibt
ANZAHL_SEPARATOR/ANZAHL_SCANNER, so dass die Summe zur Szene passt.

Scanner ausserhalb jeder Carrier-Boundingbox ohne ZUORDNUNG werden per
Abstand dem naechsten Kreisel/Strecke zugeschlagen (ZUORDNUNG = Carrier-ID).
Ist der Abstand zum zweitnaechsten Kandidaten fast gleich (<= strittig_diff_mm,
neu in cfg/export.cfg [Sensorzuordnung]), gilt die Zuordnung als strittig:
Konsolenausgabe der ergaenzten Scanner + JSON-"warnung"-Feld mit den IDs der
strittigen Kandidaten (csv:block-to-json), das export_csv.py in der Spalte
"Warnungen" ausgibt.

Menue: ZAEHLE_SEP_SCAN-Vorlauf vor EXPORTSIVAS entfernt (laeuft jetzt
automatisch im Export); interaktiver Befehl bleibt erhalten.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 15:37:50 +02:00
m.stangl 966bfa866d Export CSV: Zeilen nach TeileId sortieren, Elementnummer neu vergeben
Damit stimmen Elementnummer (erste Spalte) und TeileId ueberein, solange
kein Element geloescht wurde - geloeschte Elemente hinterlassen Luecken
in der TeileId-Folge statt in der Zeilennummerierung.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-21 11:46:36 +02:00
s.ayadi e91608d7cc Add Connections to SSG_LIB, reusing the TRO mechanisms
A connection is a CONNECTION_ARROW block sitting at the midpoint of an arrow
between two TRO markers. It stores the relationship as attributes rather than by
position:

    TRO11  ---------->  TRO14
    UID 0062            UID 0065

Same architecture as the TRO feature, nothing new introduced:

  Blockname CONNECTION_*  ->  c:CONNECTION_EDIT (Lisp/Connection_Edit.lsp)
                          ->  dcl/connection_edit.dcl

The double-click and EATTEDIT hooks already route every INSERT through
SSG_BLOCKEDIT, so this is one more branch in that dispatcher - placed before the
TRO branch since both come from the same annotation run and the patterns must not
overlap. DCL path from DXFM_DCL, ssg-start/ssg-end, ssg-attrib-read and
ssg-attrib-set-on, all text via ssg-text/ssg-textf with 16 new keys in both
language files. Loading is lazy: not preloaded in the MNL, pulled by the menu
macros and the dispatcher with (ssg-ensure "Connection_Edit"), with a fallback to
native EATTEDIT if the module is missing.

CONNECTION_INSERT picks two TRO markers and draws the connection; the new
internal number comes from ssg-id-max/ssg-id-format, so it stays inside the
SSG_LIB number space. It refuses when the block definition is absent - the shape
comes from tro_annotate.py, this command does not invent one.

Menu: SSG_LIB > Connections with Verbindung einfuegen, Verbindung bearbeiten and
Bearbeiten (Auto), plus an entry in the POP501 edit context menu.

On the internal id: the markers keep their visible ID (TRO11) untouched - the
existing TRO_INSERT/tro-naechste-id read it and the request was explicit about
not changing it. The permanent unique number therefore lives in a separate
attribute UID, in the same four-digit space as ssg_id and the CSV TeileId.
Putting it into ID was tried and reverted: IDSCHECK treats ID as numeric and
would have overwritten TRO11 with a number while correcting duplicates.
Connections reference the UIDs, so the relationship survives a renamed or moved
marker.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-19 15:09:10 +02:00
m.stangl dc2b0b8900 Export: ILS-Weiche an Kreisel-Beruehrpunkten + Ein-/Ausschleuselemente an Strecken
- compute_kreisel_touch_switches: erzeugt an jedem Beruehrpunkt zweier Kreisel
  eine "ILS Weiche" (Kapsel-Geometrie, Position=Beruehrpunkt, statische Box
  250x100x30 mit Laengsseite senkrecht zur Kreiselachse, Nachbarn=beide Kreisel)
- compute_strecke_kreisel_schleus: an Anfang/Ende jeder Gefaellestrecke bzw.
  jedes Foerderers (ILS 2.0 Strecke) ein Aus-/Einschleuselement an der
  Kollisionsposition zum naechsten BBox-Nachbar-Kreisel (Nachbarn=Kreisel+Strecke)
- TeileId zaehlt fortlaufend aus der hoechsten vorhandenen ID hoch (Weichen
  zuerst, dann Schleuselemente)
- Warnung (Konsole + neue CSV-Spalte "Warnungen"), wenn eine Strecke mehr als
  zwei Kreisel-BoundingBoxen beruehrt (erwartet: ein Anfang + ein Ende)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-04 15:18:59 +02:00
s.ayadi a664c938b7 update mubea test 2026-08-04 13:49:23 +02:00
m.stangl 6648156d12 Weichen werden bei der Kollisionspunkten zweier Kreisel erzeugt und im csv Export mit heraus geschrieben 2026-08-04 12:55:31 +02:00
s.hensch 49652b2744 [ADD] ILS Zusatzmodule Einfügefunktion und 3D Modelle implementiert 2026-08-04 11:23:40 +02:00
m.stangl fd29b8d9bf Mubea: Drehung der Qualitätssicherungsförderers 2026-08-03 18:29:23 +02:00
m.stangl ed2b4779bd Beschreibung jedes ILS Objektes als .json in die Testdaten eingecheckt 2026-08-03 18:28:27 +02:00
m.stangl 2ca2533b0a neue Menü Datei eingecheckt 2026-08-03 18:27:46 +02:00
m.stangl 829514b32a Fix: Etage-VF aus Mubea-Test per Doppelklick editierbar
mubea:build-vario-one schrieb den SSG_VF_EDIT-Marker nur fuer
typ="standard". Etage-Bloecke (z.B. VF_3 aus mubea.json) blieben ohne
XDATA und wurden von VARIOFOERDERER_EDIT abgewiesen. Jetzt wird der
Marker fuer standard UND etage geschrieben (analog vf_core.lsp), sodass
der Doppelklick in den Etage-Neuaufbau (vfe-edit-ent) dispatcht.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-03 16:59:05 +02:00
m.stangl 046d34c4aa Etage: Batch-2D/3D-Umschaltung + Nachruest-Befehl fuer Bestandsbloecke
vf-konvertiere-ent waehlt die Einfuege-Funktion jetzt per XDATA-Typ aus der Registry (standard/etage) statt fest variofoerderer-einfuegen -> SSG_DIM_SWITCH schaltet auch Etage-Bloecke um.

Neuer Befehl VARIOFOERDERER_NACHRUESTEN (Alias VF_NACHRUESTEN, + Menueeintrag): markiert bestehende, vor der Marker-Einfuehrung gebaute VF_n-Bloecke nachtraeglich mit SSG_VF_EDIT (Typ aus Attributen erkannt, Baurichtung hz abgefragt) - danach editier- und dim-umschaltbar. Schreibt nur XDATA, keine Geometrieaenderung.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-03 16:36:00 +02:00
m.stangl 7f42ac2701 Etagenförderer auch editierbar gemacht. 2026-08-03 16:25:44 +02:00
m.stangl 2e49d0b522 Omniflo Strecken Test geändert 2026-08-03 16:11:37 +02:00
m.stangl 6095c530f7 TRO Erzeugung als eigenes Menü dazu 2026-08-03 16:10:43 +02:00
s.ayadi 9c7dda8a37 Add TRO_INSERT command to hand-place new TRO markers
Lets the TRO menu insert a fresh TRO_SYM_<Typ> marker (point + type +
auto-suggested TROnn id) by reusing a block definition tro_annotate.py
already created, instead of only editing markers it placed.
2026-08-03 15:56:13 +02:00
s.ayadi 47d1e8d395 Fix: fehlende Linienzug-Testantwort "AS-Element setzen?" ergaenzt
Analog zur bereits in df96071 nachgetragenen "ES-Element setzen?"-Antwort:
die in Commit 3e23003 neu eingefuehrte Frage am Einlauf fehlte noch in
linienzug_tests.json und hat die restliche Eingabe-Queue verschoben.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-03 15:44:13 +02:00
s.ayadi b744c94819 Add Etage-Typ-Unterstuetzung zu test_mubea.lsp + Testfall fuer Objekt 0061
mubea:build-vario(-one) liest jetzt ein optionales "typ"-Feld ("standard"
Default, "etage") und dispatcht auf berechne-etage/etage-foerderanlage-
einfuegen bzw. vf-block-erstellen mit dem passenden Typ. Neuer Testfall
VF_Mubea_Etage_0061 bildet Objekt-ID 0061 aus Mubea_Quali.dxf nach
(deltaL=12790, deltaH=0, seite=links, Winkel=9, L_GF1=1602.4).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-03 15:41:06 +02:00
s.ayadi 45044cdcba Add TRO marker editing to SSG_LIB
The TRO markers written by sps_skel (lib/tro_annotate.py) are blocks
TRO_SYM_<type> carrying ID and TYPE as attributes. This wires them into the
existing SSG_LIB mechanisms rather than adding new ones.

The double-click hook and the EATTEDIT override already exist: ***DOUBLECLICK
routes [INSERT] to SSG_BLOCKEDIT, and c:EATTEDIT is undefined and forwarded to
the same dispatcher. So all that was missing was a branch:

  Blockname TRO_*  ->  c:TRO_EDIT (Lisp/Tro_Edit.lsp)  ->  dcl/tro_edit.dcl

Tro_Edit.lsp follows the conventions of the other edit commands: DCL path from
DXFM_DCL, ssg-start/ssg-end around the command, ssg-attrib-read and
ssg-attrib-set-on for the attributes, all user-visible text via ssg-text/
ssg-textf with keys in lang/de_DE.json and en_GB.json. Implied selection is read
before ssg-start, since ssg-start clears it - the same note Gefaellestrecke.lsp
carries.

TYPE is a picklist rather than free text so it cannot drift from the type
catalogue. The list comes from Lisp/tro_types.lsp, generated on the sps_skel side
by "tro_annotate.py --emit-lisp" into DXFM_LISP. If that file is absent the
dialog offers the block's current type and still works.

Loading is lazy: the module is not preloaded in the MNL. The menu macros and the
dispatcher pull it with (ssg-ensure "Tro_Edit") on first use, and the dispatcher
falls back to native EATTEDIT if the module cannot be found. ssg_load.lsp loads
it for the non-menu path.

Menu: SSG_LIB > TRO with "Marker bearbeiten" and "Bearbeiten (Auto)", plus an
entry in the POP501 edit context menu.

The dialog changes attributes only. The marker shape belongs to the block
definition of the type and FB_BLOCK is derived from it, so both follow on the next
tro_annotate.py run; the dialog states this and the command prints a reminder when
the type was changed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-03 15:41:06 +02:00
m.stangl 9c3391aaf6 Menü für Test einer einfachen Omniflo Strecke dazu. Für den Kollisionstest 2026-07-31 18:44:43 +02:00
m.stangl 9c8f84799c [CHANGE] Omniflo-Nachbarschaft: STRtree-Broad-Phase + KOS-Verfeinerung (10mm); Gerade-K1/K2 im CSV-Export
Die Omniflo-Nachbarschaftserkennung (export_neighbors.py, nur EXPORTCSV) wird
zweistufig:
- Broad-Phase ueber shapely-STRtree auf den Bounding-Boxen (Fallback: das
  bisherige Raster, falls shapely fehlt).
- Narrow-Phase (KOS-Verfeinerung): zwei moegliche Nachbarn gelten nur dann als
  benachbart, wenn ein Anschluss-Koordinatensystem K1-K4 des einen naeher als
  omniflo_ks_toleranz_mm (neu, Default 10mm) an einem K-Punkt des anderen
  liegt. Das verwirft bloss ueberlappende BBoxen ohne echten Anschluss.
  Elemente ohne K1-K4 fallen auf reine BBox-Ueberschneidung zurueck.

Geraden fuehren keine echten K-Bloecke in der Zeichnung; ihre K1 (Anfang) /
K2 (Ende) werden beim Export aus Einfuegepunkt + Laenge + Rotation
synthetisiert (csv:gerade-k-kos-strings in export.lsp) und stehen damit in den
CSV-Spalten K1/K2 - wie echte KOS - und nehmen an der Kollisionspruefung teil.

Verifiziert an results/test-omnicollision: gerichtete Nachbarschaften 20 -> 14.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-31 16:56:10 +02:00
m.stangl bd79e3d1b6 [FIX] export.lsp: klare Fehlermeldung statt Lisp-Crash bei fehlendem DXFM_LIB
Ist BricsCAD nicht ueber bin/start_briscad.bat gestartet worden, ist DXFM_LIB
in der Sitzung nicht gesetzt. Bisher liess das (strcat (getenv "DXFM_LIB") ...)
mit "bad argument type <NIL> ; expected <STRING>" abstuerzen. Jetzt wird das
vorher geprueft und ueber ssg-textf (exp-dxfm-lib-missing, de/en) gemeldet;
JSON/CSV-Sammlung laeuft weiter, nur der Python-Aufruf entfaellt.
2026-07-31 16:02:33 +02:00
m.stangl df96071f79 [FIX] Blockname-Kollision in omni:make-gerade + fehlende Linienzug-Testantwort
omni:make-gerade: itoa(fix(CDATE*1e6)) als Kollisions-Suffix sprengte den
32-Bit-INT-Bereich und liess den Lisp-Fehler mitten im BLOCK/INSERT-Kommando
laufen (BricsCAD blieb dann auf eine Eingabe wartend haengen) - trat bei der
Omniflo-Streckenzug-Testschleife auf, da ssg-timestamp nur Sekundenaufloesung
hat und mehrere Geraden pro Sekunde entstehen. Ersetzt durch einen laufenden
Zaehler.

linienzug_tests.json: die in 3e23003 neu eingefuehrte "ES-Element setzen?"-
Frage fehlte im Testskript und hat die restliche Eingabe-Queue um einen
Eintrag verschoben.
2026-07-30 15:46:00 +02:00
m.stangl 7f5a8036c0 [CHANGE] count_sep_scan: raeumliches Grid zur Vorsortierung der Carrier bei ZAEHLE_SEP_SCAN
cs-assign prueft je Sensor nicht mehr linear alle ILS-Carrier, sondern
nur noch die Kandidaten der eigenen Grid-Zelle (Aufloesung sqrt(Anzahl
Carrier)). Aufwand sinkt von O(Sensoren x Carrier) auf ~O(Sensoren +
Carrier), Zuordnungslogik bleibt unveraendert.
2026-07-30 15:30:38 +02:00
m.stangl 71f52ca3d6 [FIX] export_sivas: TEF-Platzhalter (0_BG*) ueber SivasnrTEF in echte Einzelteile aufloesen
0_BG* im Sivasnr-Rohwert ist kein echter Sivas-Code, sondern ein Blockname-
Platzhalter fuer mehrere reale TEF-Teile (z.B. 0_BG071090 = 0_B10071 +
0_B10090 + 0_B10090, siehe SivasnrTEF im Katalog). Bisher wurde der
Platzhalter selbst als Sivasnummer gezaehlt, wodurch u.a. 0_B10071 in der
Summierung fehlte.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-30 14:29:00 +02:00
s.ayadi 85438a9ee8 [ADD] export_graph.py: Materialfluss-Graph aus dem CSV-Export
Baut aus export.csv ein gerichtetes Graph-Modell der Anlage und schreibt
es als .json (vollstaendig), .dot (GraphViz) und .mmd (Mermaid).

Statt der CSV-Spalte "Nachbarn" (ungerichtet, Strecken werden dort
absichtlich nicht gegeneinander getestet, und ein langer Kreisel
ueberdeckt flaechig die halbe Anlage) arbeitet das Modul mit
Anschlusspunkten: eine Kante entsteht nur, wenn ein Elementende im
Grundriss auf der Flaeche eines anderen Elements liegt.

Richtung exakt aus K1/K2 (KS_EIN/KS_AUS), sobald der Export diese
Spalten fuellt; solange sie leer sind heuristisch aus Schwerkraft
(Gefaellestrecke) bzw. dem Merkmal Antriebfahrtrichtung (Foerderer).
Jede Kante traegt die verwendete Quelle in "richtung_quelle".

Warnt zudem, wenn Insertpoint-Werte an der 24-Bit-Fixed-Point-Grenze
von csv:kos-encode (+-8388.607 Einheiten) abgeschnitten sind.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-30 13:58:02 +02:00
s.ayadi 6c5aaab723 [FIX] export_csv: Strecken-Attributnamen auf aktuelles Schema nachgezogen
build_variofoerderer_merkmale las noch die alten Attributnamen ohne
_mm-Suffix (HOEHE_VON, HOEHE_BIS, DELTA_H, DELTA_L) sowie SEITE/WINKEL.
Umbenannt wurden diese in *strecke-attr-front* (ssg_core.lsp) zu
HOEHE_VON_mm/HOEHE_BIS_mm/DELTA_H_mm/DELTA_L_mm bzw. aufgeteilt in
SEITE_AS/SEITE_ES und GF_WINKEL/VF_WINKEL. Da attribs.get() still den
Default "" liefert, blieben die Felder in der Merkmale-Spalte leer statt
einen Fehler zu melden - betroffen waren alle VF_n- UND GF_n-Zeilen
(beide nutzen denselben Builder). export_sivas.py war bereits nachge-
zogen, export_csv.py nicht; aufgefallen ist es nicht, weil
tests/reference/export_raw.json noch die alten Namen enthaelt.

- Attributnamen korrigiert, Alt-Namen per att()-Helper als Fallback,
  damit aeltere export_raw.json-Dateien und noch nicht neu aufgebaute
  Bloecke weiter Werte liefern
- Seite_AS/Seite_ES ersetzen das immer leere Seite
- VF_Winkel neu neben Winkel (= GF_WINKEL)

Geprueft gegen results/export_raw.json (neue Namen) und
tests/reference/export_raw.json (Alt-Namen); Pflichtfelder aus
tests/test_foerderer.py bleiben vorhanden.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-30 13:54:28 +02:00