diff --git a/Lisp/Gefaellestrecke.lsp b/Lisp/Gefaellestrecke.lsp index 955c84d..641a91b 100644 --- a/Lisp/Gefaellestrecke.lsp +++ b/Lisp/Gefaellestrecke.lsp @@ -993,7 +993,7 @@ aktuell-frame nach-aus-pt gf-nummer last-ent L-gf-str delta-l-gf laengen-liste first-l l-item - bL90 bL60 bL30 bR90 bR60 bR30 n-bogen-gf + bL90 bL60 bL30 bR90 bR60 bR30 ein-hz-as rad-h-as rad-v-as xu-entry sep-endpunkt rad-h-es rad-v-es xu-exit sep-frame es-aus-frame @@ -1312,8 +1312,6 @@ ) ) ) - (setq n-bogen-gf (+ bL90 bL60 bL30 bR90 bR60 bR30)) - ;; delta-l-gf bereits vor der Zusammenfassung berechnet ;; Block mit allen Attributen erstellen. Geruest fuer Einzelmodul/ @@ -1327,7 +1325,9 @@ delta-l-gf L-gf-str grade - (1+ n-bogen-gf) + ;; n-separator/n-scanner = 0: interne Ketten-Separatoren zaehlen nicht; + ;; die echte Anzahl setzt der Export aus platzierten Symbolen. + 0 0 bL90 bL60 bL30 bR90 bR60 bR30 @@ -1386,7 +1386,7 @@ ;; L-first-seg: Laenge der ersten geraden Staustrecke in mm. ;; Beschriftung: Mitte der ersten Geraden, 400mm senkrecht rechts versetzt. (defun gf-make-label (gf-nummer hoehe-von hoehe-bis deltaH deltaL - L-gf-str winkel n-separator nach-aus-pt entry-hz L-first-seg / + L-gf-str winkel nach-aus-pt entry-hz L-first-seg / label-txt label-pt chz-l shz-l halb basis-winkel) (setq chz-l (cos (* entry-hz (/ pi 180.0)))) (setq shz-l (sin (* entry-hz (/ pi 180.0)))) @@ -1401,8 +1401,7 @@ " " delta-sym "H=" (itoa (fix (abs deltaH))) "mm" " " delta-sym "L=" (itoa (fix deltaL)) "mm" " L=[" L-gf-str "]m" - " W=" (rtos (float winkel) 2 2) grad-zeichen - " Sep=" (itoa n-separator))) + " W=" (rtos (float winkel) 2 2) grad-zeichen)) ;; Basiswinkel: Text immer lesbar auf 0 Grad (X-Achse, links->rechts) oder ;; 90 Grad (Y-Achse) einrasten - unabhaengig von der tatsaechlichen ;; Fahrtrichtung (nie 180/270, damit der Text nie auf dem Kopf steht). @@ -1439,7 +1438,7 @@ (if (null geruest-typ) (setq geruest-typ (ssg-geruest-idx-to-typ (ssg-geruest-typ-to-idx nil)))) ;; Beschriftung: Mitte der ersten Geraden, 400mm senkrecht versetzt (gf-make-label gf-nummer hoehe-von hoehe-bis deltaH deltaL - L-gf-str winkel n-separator nach-aus-pt entry-hz L-first-seg) + L-gf-str winkel nach-aus-pt entry-hz L-first-seg) ;; TYP: mit Bogen -> "Streckengruppe"; ohne Bogen (einsegmentig) -> ;; "Gefaellestrecke" (reduzierter Attributsatz, siehe ssg-strecke-attrib-defs). (setq typ-str @@ -1518,6 +1517,12 @@ (cons "GF_Bogen_R_90" (itoa bogen-R90)) (cons "GF_Bogen_R_60" (itoa bogen-R60)) (cons "GF_Bogen_R_30" (itoa bogen-R30)) + ;; ANZAHL_SEPARATOR/ANZAHL_SCANNER werden beim Bau mit 0 vorbelegt + ;; (n-separator/n-scanner werden von den Aufrufern als 0 uebergeben): + ;; der intern gezeichnete Ketten-Separator Staustrecke_Separator_SP zaehlt + ;; NICHT als Separator. Die tatsaechliche Anzahl ermittelt der Export aus + ;; den platzierten Separator_SP/S-LP-/Scanner-Symbolen und schreibt sie + ;; hier hinein (cs-zuordnung-lauf in count_sep_scan.lsp). (cons "ANZAHL_SEPARATOR" (itoa n-separator)) (cons "ANZAHL_SCANNER" (itoa n-scanner)) (cons "GERUEST_EINZELMODUL" geruest-einzelmodul) @@ -1637,7 +1642,9 @@ (float deltaL-total) L-gf-str winkel - 1 0 + ;; n-separator/n-scanner = 0: der interne Ketten-Separator zaehlt nicht; + ;; die echte Anzahl setzt der Export aus platzierten Symbolen (s.o.). + 0 0 0 0 0 0 0 0 startpunkt last-ent nach-aus-pt (float hz) (float L_stau) es-seite geruest-einzelmodul geruest-typ)) diff --git a/Lisp/count_sep_scan.lsp b/Lisp/count_sep_scan.lsp index ccecb71..b61cd7e 100644 --- a/Lisp/count_sep_scan.lsp +++ b/Lisp/count_sep_scan.lsp @@ -1,63 +1,90 @@ ;;; ============================================================ -;;; count_sep_scan.lsp - Eigenstaendiges Zaehl-Werkzeug +;;; count_sep_scan.lsp - Separator-/Scanner-Zuordnung ;;; ------------------------------------------------------------ ;;; Zaehlt die manuell platzierten Bloecke "Scanner" und -;;; "Separator_SP" je ILS-Block (Kreisel / VarioFoerderer / -;;; Gefaellestrecke) und schreibt die Anzahlen in die Attribute -;;; des jeweiligen ILS-Blocks. Anschliessend QSAVE. +;;; "Separator_SP" (Muster siehe cfg/export.cfg [blockpattern] +;;; pattern_scanner/pattern_separator) je Carrier (Kreisel/Eckrad, +;;; VarioFoerderer-Streckengruppe VF_*, Gefaellestrecke GF_* - +;;; Muster pattern_kreisel/pattern_variofoerderer/ +;;; pattern_gefaellestrecke) und schreibt die Anzahlen in die +;;; Attribute ANZAHL_SCANNER/ANZAHL_SEPARATOR des jeweiligen +;;; Carrier-Blocks. ;;; -;;; Zuordnung eines Sensors zu einem ILS-Block (Z wird ignoriert): -;;; - Scanner: der Einfuegepunkt (X/Y) muss in der Bounding-Box -;;; des ILS-Blocks liegen. Die 3D-Geometrie des Scanners kann -;;; weit vom Einfuegepunkt entfernt sein, daher zaehlt hier der -;;; Einfuegepunkt (dort klickt der Benutzer auf den Block). -;;; - Separator: der geometrische Mittelpunkt (Zentrum der eigenen -;;; Bounding-Box, unabhaengig vom $INSBASE) muss in der -;;; Bounding-Box des ILS-Blocks liegen. -;;; - Liegt der Punkt in mehreren Boxen (Ueberlappung), wird -;;; der ILS-Block mit dem naechstgelegenen Box-Zentrum gewaehlt. -;;; - Ein optionaler Toleranzrand (*senstol*) vergroessert die -;;; Box, damit Sensoren knapp am Rand noch erfasst werden. +;;; WICHTIG: Gezaehlt werden ausschliesslich die eigenstaendig +;;; platzierten Sensor-Symbole. Der intern in der GF/VF-Kette +;;; gezeichnete 300-mm-Block Staustrecke_Separator_SP ist nur ein +;;; Ketten-/Uebergabestueck (kein eigenstaendiger Separator) und wird +;;; NICHT mitgezaehlt - wer einen Separator gezaehlt haben will, setzt +;;; ein Separator_SP/S-LP-Symbol. ;;; -;;; Zusaetzlich: -;;; - Bei zugeordneten Sensoren wird die Bezeichnung des ILS-Blocks -;;; (Attribut "Bezeichnung", Fallback Blockname) in das Sensor- -;;; Attribut *zuordnung-tag* geschrieben. -;;; - Nicht zugeordnete Sensoren werden mit einem Kreis auf dem -;;; Layer *mark-layer* markiert (zentriert auf den Sensor). -;;; - Der Befehl ist wiederholbar: alte Markierungskreise werden -;;; zu Beginn entfernt. +;;; Zuordnung eines Sensors zu einem Carrier (Z wird ignoriert): +;;; 0. Traegt der Sensor bereits ein ZUORDNUNG-Attribut, wird das +;;; respektiert (nicht ueberschrieben) - er zaehlt mit, wenn die +;;; dort stehende ID zu einem bekannten Carrier passt. +;;; 1. Scanner: der Einfuegepunkt (X/Y) muss in der Bounding-Box +;;; des Carriers liegen. Die 3D-Geometrie des Scanners kann +;;; weit vom Einfuegepunkt entfernt sein, daher zaehlt hier der +;;; Einfuegepunkt (dort klickt der Benutzer auf den Block). +;;; 2. Separator: der geometrische Mittelpunkt (Zentrum der eigenen +;;; Bounding-Box, unabhaengig vom $INSBASE) muss in der +;;; Bounding-Box des Carriers liegen. +;;; 3. Liegt der Punkt in mehreren Boxen (Ueberlappung), wird der +;;; Carrier mit dem naechstgelegenen Box-Zentrum gewaehlt. +;;; 4. Liegt der Punkt in KEINER Carrier-Box (Scanner koennen +;;; durchaus ausserhalb der Kreisel-BBox montiert sein), wird der +;;; raeumlich naechstgelegene Carrier ueber alle Kreisel/Strecken +;;; hinweg gewaehlt (cs-nearest-two). Ist der Abstand zum +;;; zweitnaechsten Carrier fast gleich gross (Differenz <= +;;; cs-strittig-diff-mm, siehe cfg/export.cfg [Sensorzuordnung] +;;; strittig_diff_mm), gilt die Zuordnung als "strittig": sie +;;; wird trotzdem geschrieben, aber zusaetzlich in +;;; *cs-scanner-ergaenzt* (Report-Liste) und +;;; *cs-scanner-warnung-by-handle* (Key = Entity-Handle, Wert = +;;; Warnungstext) vermerkt. csv:block-to-json (export.lsp) liest +;;; *cs-scanner-warnung-by-handle* aus und haengt den Text als +;;; "warnung"-Feld an den JSON-Block des betroffenen Scanners an +;;; - export_csv.py gibt ihn in der CSV-Spalte "Warnungen" aus. +;;; *cs-scanner-ergaenzt* sammelt ALLE per Abstand (nicht per +;;; BBox) zugeordneten Scanner, nicht nur die strittigen - +;;; cs-zuordnung-lauf gibt diese Liste auf der Konsole aus. +;;; 5. Ein optionaler Toleranzrand (cs-senstol, siehe +;;; cfg/export.cfg [Sensorzuordnung] senstol_mm) vergroessert die +;;; Box, damit Sensoren knapp am Rand noch erfasst werden. +;;; 6. Bei zugeordneten Sensoren wird die ID des Carriers (Attribut +;;; "ID") in das Sensor-Attribut ZUORDNUNG geschrieben. +;;; 7. Sensoren, zu denen ueberhaupt kein Carrier existiert (leere +;;; Zeichnung), werden mit einem Kreis auf dem Layer *mark-layer* +;;; markiert (zentriert auf den Sensor). ;;; -;;; Aufruf: ZAEHLE_SEP_SCAN -;;; Laden: per APPLOAD oder (load "count_sep_scan") +;;; cs-zuordnung-lauf ist die wiederverwendbare Engine (siehe unten): +;;; sie wird sowohl vom interaktiven Befehl ZAEHLE_SEP_SCAN als auch +;;; automatisch vor jedem CSV-/Sivas-Export aufgerufen (Lisp/export.lsp, +;;; csv:run-export) - dort OHNE QSAVE und ohne die ausfuehrliche +;;; Detailzeile je Carrier (verbose=nil), damit die Konsolenausgabe +;;; beim normalen Export kompakt bleibt. +;;; +;;; Aufruf (interaktiv): ZAEHLE_SEP_SCAN +;;; Laden: per APPLOAD oder (ssg-ensure "count_sep_scan") ;;; ============================================================ (vl-load-com) ;;; ------------------------------------------------------------ -;;; KONFIGURATION (bei Bedarf anpassen) +;;; KONFIGURATION ;;; ------------------------------------------------------------ -;; Toleranzrand um die ILS-Block-Box in Zeichnungseinheiten (mm). -;; 0.0 = exakte Box. Groesserer Wert = Sensoren knapp ausserhalb -;; werden noch dem ILS-Block zugerechnet. +;; Toleranzrand um die Carrier-Box in Zeichnungseinheiten (mm), aus +;; cfg/export.cfg [Sensorzuordnung] senstol_mm (Default 0.0 = exakte +;; Box). Wird von cs-zuordnung-lauf bei jedem Lauf frisch gelesen und +;; hier nur mit einem Startwert vorbelegt, damit cs-in-box/cs-grid-add +;; auch ausserhalb eines Laufs referenzierbar bleiben. (if (null *senstol*) (setq *senstol* 0.0)) -;; Blockname-Muster (wcmatch, Grossschreibung) fuer die manuell -;; platzierten Sensoren. -(setq *scanner-pattern* "SCANNER,SCANNER_*") -(setq *separator-pattern* "SEPARATOR_SP,SEPARATOR_SP_*") +;; Attribut-Tag im Scanner-/Separator-Block, in das die ID des +;; zugeordneten Carriers geschrieben wird. +(setq *zuordnung-tag* "ZUORDNUNG") -;; Blockname-Muster fuer die INTERN im ILS-Block (in der Kette) -;; gezeichneten Separatoren. Diese bilden die Basis fuer -;; ANZAHL_SEPARATOR und werden bei jedem Lauf frisch gezaehlt. -(setq *intern-separator-pattern* "STAUSTRECKE_SEPARATOR_SP*") - -;; Attribut-Tag im Scanner-/Separator-Block, in das die Bezeichnung -;; des zugeordneten ILS-Blocks geschrieben wird (Gross/Klein egal). -(setq *zuordnung-tag* "zuordnung") - -;; Markierung nicht zugeordneter Sensoren: Kreis auf eigenem Layer. +;; Markierung von Sensoren ohne jeglichen Carrier: Kreis auf eigenem Layer. (setq *mark-layer* "S_SENSOR_UNZUGEORDNET") (setq *mark-color* 2) ;; 2 = Gelb ;; Kreisradius = Faktor * halbe XY-Diagonale der Sensor-Box, @@ -65,19 +92,32 @@ (if (null *mark-radius-factor*) (setq *mark-radius-factor* 1.5)) (if (null *mark-radius-min*) (setq *mark-radius-min* 500.0)) +;; --- Toleranzrand (mm) aus cfg/export.cfg [Sensorzuordnung] senstol_mm --- +(defun cs-senstol () + (atof (export:cfg "Sensorzuordnung" "senstol_mm" "0")) +) + +;; --- "Strittig"-Schwelle (mm) aus cfg/export.cfg [Sensorzuordnung] --- +;; Differenz zwischen dem Abstand zum naechsten und zweitnaechsten +;; Carrier, unterhalb derer eine Distanz-Zuordnung als unsicher gilt. +(defun cs-strittig-diff-mm () + (atof (export:cfg "Sensorzuordnung" "strittig_diff_mm" "500")) +) + ;;; ------------------------------------------------------------ -;;; ILS-Block-Erkennung und zugehoerige Attribut-Tags -;;; Alle ILS-Bloecke (Kreisel / VF / GF) verwenden einheitlich -;;; ANZAHL_SCANNER und ANZAHL_SEPARATOR. -;;; Rueckgabe: (scanner-tag separator-tag) oder nil +;;; Carrier-/Sensor-Erkennung ueber die gemeinsamen Muster aus +;;; cfg/export.cfg [blockpattern] (export:pattern, siehe export.lsp) - +;;; dieselben Muster wie csv:collect-export-blocks/export_csv.py. ;;; ------------------------------------------------------------ -(defun cs-carrier-tags (nm / up) + +;; --- Ist nm ein Kreisel/Eckrad-, VarioFoerderer- oder Gefaellestrecke- +;; Compound-Block? Alle drei fuehren einheitlich die Attribute +;; ANZAHL_SCANNER/ANZAHL_SEPARATOR. --- +(defun cs-carrier-p (nm / up) (setq up (strcase nm)) - (if (or (wcmatch up "KREISEL_*") - (wcmatch up "VF_*") - (wcmatch up "GF_*")) - (list "ANZAHL_SCANNER" "ANZAHL_SEPARATOR") - nil + (or (wcmatch up (export:pattern "pattern_kreisel" "KR_*,KREISEL_*,ECKRAD_*")) + (wcmatch up (export:pattern "pattern_variofoerderer" "VF_*")) + (wcmatch up (export:pattern "pattern_gefaellestrecke" "GF_*")) ) ) @@ -88,26 +128,12 @@ (defun cs-sensor-kind (nm / up) (setq up (strcase nm)) (cond - ((wcmatch up *scanner-pattern*) 'scanner) - ((wcmatch up *separator-pattern*) 'separator) + ((wcmatch up (strcase (export:pattern "pattern_scanner" "Scanner*"))) 'scanner) + ((wcmatch up (strcase (export:pattern "pattern_separator" "Separator_SP*,S-LP*"))) 'separator) (t nil) ) ) -;;; ------------------------------------------------------------ -;;; Punkt-Rueckgabe von vla-getboundingbox in eine Liste wandeln. -;;; BricsCAD liefert ein Safearray, AutoCAD ein Variant mit -;;; Safearray - beide Faelle werden hier abgedeckt. -;;; ------------------------------------------------------------ -(defun cs-pt->list (v) - (cond - ((= (type v) 'variant) (vlax-safearray->list (vlax-variant-value v))) - ((= (type v) 'safearray) (vlax-safearray->list v)) - ((listp v) v) - (t nil) - ) -) - ;;; ------------------------------------------------------------ ;;; Bounding-Box eines INSERT holen (WCS, achsparallel). ;;; Erzwingt vorher ein vla-update (Regen des Objekts), da @@ -116,6 +142,15 @@ ;;; Rueckgabe: (minx miny maxx maxy) oder nil bei Fehler. ;;; *cs-last-error* enthaelt bei Fehler den echten COM-Fehlertext. ;;; ------------------------------------------------------------ +(defun cs-pt->list (v) + (cond + ((= (type v) 'variant) (vlax-safearray->list (vlax-variant-value v))) + ((= (type v) 'safearray) (vlax-safearray->list v)) + ((listp v) v) + (t nil) + ) +) + (defun cs-bbox (ent / obj res) (setq *cs-last-error* nil) (setq obj (vlax-ename->vla-object ent)) @@ -157,8 +192,8 @@ ) ;;; ------------------------------------------------------------ -;;; Liegt Punkt pt (X/Y) in ILS-Block-Record rec (mit Toleranz)? -;;; rec = (ename tagScan tagSep minx miny maxx maxy cx cy) +;;; Liegt Punkt pt (X/Y) in Carrier-Record rec (mit Toleranz)? +;;; rec = (ename tagScan tagSep minx miny maxx maxy cx cy id) ;;; ------------------------------------------------------------ (defun cs-in-box (pt rec / x y) (setq x (car pt) y (cadr pt)) @@ -246,13 +281,13 @@ ) ;;; ------------------------------------------------------------ -;;; Sensor-Punkt einem ILS-Block zuordnen. -;;; Rueckgabe: ILS-Block-Record oder nil (keine Zuordnung). +;;; Sensor-Punkt einem Carrier per BBox zuordnen (Schritt 1-3 oben). +;;; Rueckgabe: Carrier-Record oder nil (kein BBox-Treffer). ;;; Bei mehreren Treffern: naechstes Box-Zentrum (X/Y). ;;; grid = Vorsortierung aus cs-grid-build (statt aller Carrier ;;; wird nur die Kandidatenliste der eigenen Zelle geprueft). ;;; ------------------------------------------------------------ -(defun cs-assign (pt grid / matches best bestd d) +(defun cs-assign (pt grid / matches best bestd d rec) (setq matches nil) (foreach rec (cs-grid-candidates grid pt) (if (cs-in-box pt rec) (setq matches (cons rec matches)))) @@ -270,6 +305,61 @@ ) ) +;;; ------------------------------------------------------------ +;;; Die beiden dem Punkt pt (X/Y) naechstgelegenen Carrier, sortiert +;;; nach Abstand zum Box-Mittelpunkt (gleicher Massstab wie der +;;; Ueberlappungs-Tiebreak in cs-assign). carriers darf nicht leer +;;; sein - siehe cs-resolve-sensor. +;;; Rueckgabe: (best-rec best-dist second-rec-oder-nil second-dist-oder-nil) +;;; ------------------------------------------------------------ +(defun cs-nearest-two (pt carriers / paare sortiert rec) + (setq paare nil) + (foreach rec carriers + (setq paare (cons (cons (distance (list (car pt) (cadr pt)) + (list (nth 7 rec) (nth 8 rec))) + rec) + paare)) + ) + (setq sortiert (vl-sort paare (function (lambda (a b) (< (car a) (car b)))))) + (list + (cdr (nth 0 sortiert)) + (car (nth 0 sortiert)) + (if (cdr sortiert) (cdr (nth 1 sortiert)) nil) + (if (cdr sortiert) (car (nth 1 sortiert)) nil) + ) +) + +;;; --- Carrier-Record mit gegebener ID aus carriers heraussuchen --- +(defun cs-find-carrier-by-id (carriers id / found rec) + (setq found nil) + (foreach rec carriers + (if (and (not found) (= (nth 9 rec) id)) (setq found rec)) + ) + found +) + +;;; ------------------------------------------------------------ +;;; Ordnet einen Sensor-Punkt (Scanner oder Separator) einem Carrier +;;; zu (Reihenfolge siehe Datei-Kopfkommentar Schritte 0/1-3/4). +;;; Rueckgabe: (modus rec best-d second-rec second-d) +;;; modus = 'manual | 'bbox | 'distance | 'none (keine Carrier vorhanden) +;;; best-d/second-rec/second-d sind nur bei modus='distance gesetzt. +;;; ------------------------------------------------------------ +(defun cs-resolve-sensor (sent spt carriers grid / existing rec nearest) + (setq existing (cs-get-att-str sent *zuordnung-tag*)) + (cond + ((and existing (/= existing "")) + (list 'manual (cs-find-carrier-by-id carriers existing) nil nil nil)) + ((setq rec (cs-assign spt grid)) + (list 'bbox rec nil nil nil)) + ((null carriers) + (list 'none nil nil nil nil)) + (t + (setq nearest (cs-nearest-two spt carriers)) + (list 'distance (nth 0 nearest) (nth 1 nearest) (nth 2 nearest) (nth 3 nearest))) + ) +) + ;;; ------------------------------------------------------------ ;;; Zaehler in einer Assoc-Liste (Schluessel = ename) erhoehen. ;;; ------------------------------------------------------------ @@ -309,35 +399,6 @@ ok ) -;;; ------------------------------------------------------------ -;;; Zaehlt rekursiv, wie oft ein Block (Muster pat) in der -;;; Definition des Blocks bname verwendet wird - inklusive -;;; verschachtelter Unterbloecke. Damit wird die interne Anzahl -;;; der Kette-Separatoren aus der Geometrie ermittelt. -;;; ------------------------------------------------------------ -(defun cs-count-nested (bname pat / e ed nm n stop) - (setq n 0 stop nil) - (setq e (tblobjname "BLOCK" bname)) - (if e - (progn - (setq e (entnext e)) - (while (and e (not stop)) - (setq ed (entget e)) - (cond - ((= (cdr (assoc 0 ed)) "ENDBLK") (setq stop t)) - ((= (cdr (assoc 0 ed)) "INSERT") - (setq nm (cdr (assoc 2 ed))) - (if (wcmatch (strcase nm) pat) - (setq n (1+ n)) - (setq n (+ n (cs-count-nested nm pat))))) - ) - (if (not stop) (setq e (entnext e))) - ) - ) - ) - n -) - ;;; ------------------------------------------------------------ ;;; Attributwert (String) an einem INSERT lesen. "" wenn nicht ;;; vorhanden. Tag ohne Gross/Klein-Unterscheidung. @@ -363,8 +424,9 @@ ) ;;; ------------------------------------------------------------ -;;; Bezeichnung eines ILS-Blocks ermitteln: Attribut "Bezeichnung", -;;; Fallback auf den Blocknamen. +;;; Bezeichnung eines Carriers ermitteln: Attribut "Bezeichnung", +;;; Fallback auf den Blocknamen. Nur fuer Konsolen-/Fehlermeldungen - +;;; die eigentliche Verknuepfung (ZUORDNUNG) laeuft ueber die ID. ;;; ------------------------------------------------------------ (defun cs-carrier-label (ent nm / bez) (setq bez (cs-get-att-str ent "Bezeichnung")) @@ -395,7 +457,7 @@ ) ;;; ------------------------------------------------------------ -;;; Nicht zugeordneten Sensor mit einem Kreis markieren, zentriert +;;; Sensor ohne jeglichen Carrier mit einem Kreis markieren, zentriert ;;; auf die Sensor-Geometrie. Radius aus der XY-Box des Sensors ;;; (Faktor), mindestens *mark-radius-min*. ;;; ------------------------------------------------------------ @@ -421,64 +483,166 @@ (cons 40 r))) ) -;;; ============================================================ -;;; HAUPTBEFEHL -;;; ============================================================ -(defun c:ZAEHLE_SEP_SCAN ( / ss i ent ed nm tags bb cx cy label - carriers grid scanlist seplist kind pt - scanCounts sepCounts - rec en nm2 ns nsep internSep newS newP - s sent spt - n-scan-unassigned n-sep-unassigned - n-zuordnung-fehlt mss - okS okP) - (setq carriers nil scanlist nil seplist nil n-zuordnung-fehlt 0) - - ;; Alte Markierungskreise entfernen (Idempotenz) - (setq mss (ssget "_X" (list (cons 0 "CIRCLE") (cons 8 *mark-layer*)))) - (if mss (command "_.ERASE" mss "")) - - ;; Vor der Extents-Berechnung einmal regenerieren, damit - ;; vla-getboundingbox verlaessliche Werte liefert. - (vl-catch-all-apply '(lambda () (command "_.REGEN"))) - - ;; --- 1. Alle INSERTs sammeln und klassifizieren --- +;;; ------------------------------------------------------------ +;;; Schnelltest: Ist ein vollstaendiger cs-zuordnung-lauf ueberhaupt +;;; noetig? Der eigentliche Lauf ist teuer (vla-getboundingbox + Regen +;;; je Carrier UND je Sensor). Diese Vorpruefung kommt ohne jede +;;; Bounding-Box aus - sie liest nur Attribute (entget). +;;; +;;; Rueckgabe T (Lauf noetig), wenn EINE der Bedingungen zutrifft: +;;; a) Ein Scanner-/Separator-Symbol hat ein leeres ZUORDNUNG-Attribut +;;; (noch nicht zugeordnet) oder ein ZUORDNUNG, das auf keinen +;;; (mehr) existierenden Carrier zeigt. +;;; b) An einem Carrier passt ANZAHL_SCANNER nicht zur Anzahl der ihm +;;; per ZUORDNUNG zugeschriebenen Scanner-Symbole. +;;; c) An einem Carrier passt ANZAHL_SEPARATOR nicht zur Anzahl der ihm +;;; per ZUORDNUNG zugeschriebenen Separator-Symbole (nur platzierte +;;; Symbole zaehlen - dieselbe Regel wie newP im eigentlichen Lauf; +;;; der interne Staustrecke_Separator_SP zaehlt nicht mit). +;;; Sonst nil - die gespeicherten Attribute sind konsistent, der teure +;;; Lauf wird uebersprungen. +;;; +;;; Die Zuordnung Symbol->Carrier wird hier billig ueber das bereits +;;; gesetzte ZUORDNUNG-Attribut rekonstruiert (Carrier-ID), OHNE die +;;; teure Boundingbox-/Distanz-Rechnung des eigentlichen Laufs. Dadurch +;;; erkennt der Test - anders als eine reine Gesamtsummen-Pruefung - auch +;;; das Verschieben eines Sensors von einem Carrier zu einem anderen +;;; (die Per-Carrier-Zahl kippt, ZUORDNUNG zeigt aber noch auf den alten). +;;; ------------------------------------------------------------ +(defun cs-zuordnung-noetig-p ( / ss i ent ed nm sk zuord id + carriers carrier-ids sensors s + sepByCarrier scanByCarrier + noetig expScan expSep rec) + (setq noetig nil carriers nil carrier-ids nil sensors nil + sepByCarrier nil scanByCarrier nil) (setq ss (ssget "_X" '((0 . "INSERT")))) (if (null ss) - (progn (princ "\n>>> Keine Bloecke in der Zeichnung gefunden.") (princ)) + nil ;; keine Bloecke -> nichts zu tun + (progn + ;; Pass 1: Carrier (ename . id) und Sensor-Symbole (kind . ZUORDNUNG) + ;; sammeln - die ssget-Reihenfolge ist beliebig, daher erst sammeln, + ;; dann auswerten. + (setq i 0) + (while (< i (sslength ss)) + (setq ent (ssname ss i) ed (entget ent) nm (cdr (assoc 2 ed))) + (cond + ((cs-carrier-p nm) + (setq id (cs-get-att-str ent "ID")) + (setq carriers (cons (cons ent id) carriers)) + (setq carrier-ids (cons id carrier-ids))) + (t + (setq sk (cs-sensor-kind nm)) + (if sk + (setq sensors + (cons (cons sk (cs-get-att-str ent *zuordnung-tag*)) sensors)))) + ) + (setq i (1+ i)) + ) + ;; Pass 2: Symbole ueber ZUORDNUNG je Carrier-ID zaehlen. Leeres + ;; ZUORDNUNG oder ZUORDNUNG auf einen nicht (mehr) existierenden + ;; Carrier -> Lauf noetig. + (foreach s sensors + (setq sk (car s) zuord (cdr s)) + (cond + ((or (null zuord) (= zuord "")) (setq noetig T)) + ((not (member zuord carrier-ids)) (setq noetig T)) + ((eq sk 'scanner) (setq scanByCarrier (cs-bump scanByCarrier zuord))) + (t (setq sepByCarrier (cs-bump sepByCarrier zuord))) + ) + ) + ;; Pass 3: je Carrier Soll (= zugeschriebene Symbole) gegen die + ;; gespeicherten Attribute pruefen. + (if (not noetig) + (foreach rec carriers + (setq id (cdr rec)) ;; rec = (ename . carrier-id) + (setq expScan (cond ((assoc id scanByCarrier) (cdr (assoc id scanByCarrier))) (t 0))) + (setq expSep (cond ((assoc id sepByCarrier) (cdr (assoc id sepByCarrier))) (t 0))) + (if (or (/= (atoi (cs-get-att-str (car rec) "ANZAHL_SCANNER")) expScan) + (/= (atoi (cs-get-att-str (car rec) "ANZAHL_SEPARATOR")) expSep)) + (setq noetig T)) + ) + ) + noetig + ) + ) +) + +;;; ============================================================ +;;; ENGINE - wird sowohl von ZAEHLE_SEP_SCAN als auch automatisch +;;; vor jedem CSV-/Sivas-Export aufgerufen (siehe export.lsp, +;;; csv:run-export). +;;; +;;; label = Anzeigepraefix fuer die Konsolenausgabe (z.B. "EXPORTCSV"). +;;; verbose = T -> zusaetzlich je Carrier eine Detailzeile ausgeben +;;; (nur fuer den interaktiven Befehl sinnvoll - der +;;; automatische Aufruf aus csv:run-export laesst dies aus, +;;; damit die Export-Konsole kompakt bleibt). +;;; +;;; Setzt als Nebenwirkung: +;;; *cs-scanner-ergaenzt* - Liste (scanner-id carrier-id +;;; distanz-mm strittig-p +;;; zweiter-carrier-id zweite-distanz-mm) +;;; je per Abstand (nicht per BBox) +;;; zugeordnetem Scanner. +;;; *cs-scanner-warnung-by-handle* - Assoc-Liste (handle . warnungstext) +;;; fuer strittige Scanner-Zuordnungen, +;;; von csv:block-to-json ausgelesen. +;;; ============================================================ +(defun cs-zuordnung-lauf (label verbose / + mss ss i ent ed nm bb cx cy lbl carrier-id + carriers grid scanlist seplist sk pt + scanCounts sepCounts n-scan-unassigned n-sep-unassigned + n-strittig n-zuordnung-fehlt + s sent spt res mode rec best-d second-rec second-d + scanner-id contested handle + en nm2 ns nsep newS newP okS okP eintrag) + (setq carriers nil scanlist nil seplist nil + n-zuordnung-fehlt 0 n-scan-unassigned 0 n-sep-unassigned 0 n-strittig 0) + (setq *cs-scanner-ergaenzt* nil) + (setq *cs-scanner-warnung-by-handle* nil) + (setq *senstol* (cs-senstol)) + + ;; Alte Markierungskreise entfernen (Idempotenz - Sensoren, die in + ;; einem frueheren Lauf unzuordenbar waren, koennen inzwischen einen + ;; Carrier bekommen haben oder umgekehrt). + (setq mss (ssget "_X" (list (cons 0 "CIRCLE") (cons 8 *mark-layer*)))) + (if mss (command "_.ERASE" mss "")) + (vl-catch-all-apply '(lambda () (command "_.REGEN"))) + + (princ (ssg-textf "sens-start" (list label))) + + (setq ss (ssget "_X" '((0 . "INSERT")))) + (if (null ss) + (princ (ssg-textf "sens-no-inserts" (list label))) (progn (setq i 0) (while (< i (sslength ss)) (setq ent (ssname ss i)) (setq ed (entget ent)) (setq nm (cdr (assoc 2 ed))) - (setq tags (cs-carrier-tags nm)) (cond - ;; --- ILS-Block --- - (tags + ((cs-carrier-p nm) (setq bb (cs-bbox ent)) (if bb (progn (setq cx (/ (+ (nth 0 bb) (nth 2 bb)) 2.0)) (setq cy (/ (+ (nth 1 bb) (nth 3 bb)) 2.0)) - (setq label (cs-carrier-label ent nm)) + (setq lbl (cs-carrier-label ent nm)) + (setq carrier-id (cs-get-att-str ent "ID")) (setq carriers - (cons (list ent (car tags) (cadr tags) + (cons (list ent "ANZAHL_SCANNER" "ANZAHL_SEPARATOR" (nth 0 bb) (nth 1 bb) (nth 2 bb) (nth 3 bb) - cx cy label) + cx cy carrier-id lbl) carriers))) - (princ (strcat "\n! Bounding-Box fehlgeschlagen fuer ILS-Block '" nm "'" - (if *cs-last-error* - (strcat " (" *cs-last-error* ")") ""))) + (princ (ssg-textf "sens-bbox-fehler" (list nm))) ) ) - ;; --- Sensor (Entity + Referenzpunkt merken) --- (t - (setq kind (cs-sensor-kind nm)) - (if kind + (setq sk (cs-sensor-kind nm)) + (if sk (progn - (setq pt (cs-sensor-point ent ed kind)) - (if (eq kind 'scanner) + (setq pt (cs-sensor-point ent ed sk)) + (if (eq sk 'scanner) (setq scanlist (cons (list ent pt) scanlist)) (setq seplist (cons (list ent pt) seplist))))) ) @@ -486,99 +650,145 @@ (setq i (1+ i)) ) - ;; --- 2. Sensoren zuordnen: zuordnung schreiben bzw. markieren --- - ;; Vorsortierung: Carrier einmalig in ein raeumliches Grid einsortieren, - ;; damit cs-assign je Sensor nur die Kandidaten der eigenen Zelle statt - ;; aller Carrier prueft (siehe cs-grid-build). (setq grid (cs-grid-build carriers)) - (setq scanCounts nil sepCounts nil - n-scan-unassigned 0 n-sep-unassigned 0) + (setq scanCounts nil sepCounts nil) + ;; --- Scanner zuordnen (inkl. Distanz-Fallback + Strittig-Erkennung) --- (foreach s scanlist (setq sent (car s) spt (cadr s)) - (setq rec (cs-assign spt grid)) - (if rec - (progn - (setq scanCounts (cs-bump scanCounts (car rec))) - (if (not (cs-set-att sent *zuordnung-tag* (nth 9 rec))) - (setq n-zuordnung-fehlt (1+ n-zuordnung-fehlt)))) - (progn - (setq n-scan-unassigned (1+ n-scan-unassigned)) - (cs-set-att sent *zuordnung-tag* "") - (cs-mark-unassigned sent)))) - - (foreach s seplist - (setq sent (car s) spt (cadr s)) - (setq rec (cs-assign spt grid)) - (if rec - (progn - (setq sepCounts (cs-bump sepCounts (car rec))) - (if (not (cs-set-att sent *zuordnung-tag* (nth 9 rec))) - (setq n-zuordnung-fehlt (1+ n-zuordnung-fehlt)))) - (progn - (setq n-sep-unassigned (1+ n-sep-unassigned)) - (cs-set-att sent *zuordnung-tag* "") - (cs-mark-unassigned sent)))) - - ;; --- 3. ANZAHL-Attribute setzen und Bericht ausgeben --- - (princ "\n============================================") - (princ "\n Sensor-Zaehlung je ILS-Block") - (princ "\n============================================") - (if (null carriers) - (princ "\n (Keine ILS-Bloecke KREISEL_/VF_/GF_ gefunden)") - (foreach rec carriers - (setq en (car rec)) - (setq nm2 (cdr (assoc 2 (entget en)))) - (setq ns (cond ((assoc en scanCounts) (cdr (assoc en scanCounts))) (t 0))) - (setq nsep (cond ((assoc en sepCounts) (cdr (assoc en sepCounts))) (t 0))) - ;; interne Kette-Separatoren frisch aus der Blockdefinition zaehlen - (setq internSep (cs-count-nested nm2 *intern-separator-pattern*)) - ;; Scanner = nur neu zugeordnete - ;; Separator = interne Kette-Separatoren + neu zugeordnete - (setq newS ns) - (setq newP (+ internSep nsep)) - ;; gefundene Anzahlen melden (mit Bezeichnung/Label) - (princ (strcat "\n " nm2 " [" (nth 9 rec) "]" - ": Scanner(neu)=" (itoa ns) - ", Separator intern=" (itoa internSep) - " + manuell=" (itoa nsep))) - ;; Werte schreiben und Ergebnis bestaetigen - (setq okS (cs-set-att en (nth 1 rec) (itoa newS))) - (setq okP (cs-set-att en (nth 2 rec) (itoa newP))) - (if (and okS okP) - (princ (strcat "\n -> geschrieben: " - "ANZAHL_SCANNER=" (itoa newS) - ", ANZAHL_SEPARATOR=" (itoa newP))) - (princ (strcat "\n -> FEHLER beim Schreiben: " - (if okS "" "ANZAHL_SCANNER fehlt ") - (if okP "" "ANZAHL_SEPARATOR fehlt")))) + (setq res (cs-resolve-sensor sent spt carriers grid)) + (setq mode (nth 0 res) rec (nth 1 res) + best-d (nth 2 res) second-rec (nth 3 res) second-d (nth 4 res)) + (cond + ((eq mode 'none) + (setq n-scan-unassigned (1+ n-scan-unassigned)) + (cs-mark-unassigned sent)) + ((null rec) nil) ;; manuell zugeordnet, ID unbekannt -> unangetastet + (t + (setq scanCounts (cs-bump scanCounts (car rec))) + (if (member mode '(bbox distance)) + (if (not (cs-set-att sent *zuordnung-tag* (nth 9 rec))) + (setq n-zuordnung-fehlt (1+ n-zuordnung-fehlt)))) + (if (eq mode 'distance) + (progn + (setq scanner-id (cs-get-att-str sent "ID")) + (setq contested (and second-rec + (<= (- second-d best-d) (cs-strittig-diff-mm)))) + (setq *cs-scanner-ergaenzt* + (cons (list scanner-id (nth 9 rec) (fix (+ best-d 0.5)) + contested + (if contested (nth 9 second-rec) nil) + (if contested (fix (+ second-d 0.5)) nil)) + *cs-scanner-ergaenzt*)) + (if contested + (progn + (setq n-strittig (1+ n-strittig)) + (setq handle (cdr (assoc 5 (entget sent)))) + (setq *cs-scanner-warnung-by-handle* + (cons (cons handle + (strcat "Distanz-Zuordnung unsicher: " + (nth 9 rec) " (" (itoa (fix (+ best-d 0.5))) "mm) vs. " + (nth 9 second-rec) " (" (itoa (fix (+ second-d 0.5))) "mm)")) + *cs-scanner-warnung-by-handle*)) + ) + ) + ) + ) + ) ) ) - (princ (strcat "\n--------------------------------------------" - "\n ILS-Bloecke gesamt: " (itoa (length carriers)) - "\n Scanner gesamt: " (itoa (length scanlist)) - " (nicht zugeordnet: " (itoa n-scan-unassigned) ")" - "\n Separator gesamt: " (itoa (length seplist)) - " (nicht zugeordnet: " (itoa n-sep-unassigned) ")")) - (if (> (+ n-scan-unassigned n-sep-unassigned) 0) - (princ (strcat "\n " (itoa (+ n-scan-unassigned n-sep-unassigned)) - " nicht zugeordnete(r) Sensor(en) mit Kreis markiert" - " (Layer '" *mark-layer* "')."))) - (if (> n-zuordnung-fehlt 0) - (princ (strcat "\n WARNUNG: " (itoa n-zuordnung-fehlt) - " zugeordnete(r) Sensor(en) ohne Attribut '" - *zuordnung-tag* "' - Bezeichnung nicht schreibbar."))) + (setq *cs-scanner-ergaenzt* (reverse *cs-scanner-ergaenzt*)) - ;; --- 4. Zeichnung speichern --- - (princ "\n--------------------------------------------") - (princ "\n Speichere Zeichnung (QSAVE) ...") - (command "_.QSAVE") - (princ "\n>>> Fertig.") - (princ) + ;; --- Separatoren zuordnen (gleiche Logik, ohne Strittig-Report - + ;; der Distanz-Fallback stellt hier nur sicher, dass die + ;; ANZAHL_SEPARATOR-Summe auch bei Sonderfaellen stimmt). --- + (foreach s seplist + (setq sent (car s) spt (cadr s)) + (setq res (cs-resolve-sensor sent spt carriers grid)) + (setq mode (nth 0 res) rec (nth 1 res)) + (cond + ((eq mode 'none) + (setq n-sep-unassigned (1+ n-sep-unassigned)) + (cs-mark-unassigned sent)) + ((null rec) nil) + (t + (setq sepCounts (cs-bump sepCounts (car rec))) + (if (member mode '(bbox distance)) + (if (not (cs-set-att sent *zuordnung-tag* (nth 9 rec))) + (setq n-zuordnung-fehlt (1+ n-zuordnung-fehlt)))) + ) + ) + ) + + ;; --- ANZAHL_SCANNER/ANZAHL_SEPARATOR je Carrier schreiben --- + (foreach rec carriers + (setq en (car rec)) + (setq nm2 (cdr (assoc 2 (entget en)))) + (setq ns (cond ((assoc en scanCounts) (cdr (assoc en scanCounts))) (t 0))) + (setq nsep (cond ((assoc en sepCounts) (cdr (assoc en sepCounts))) (t 0))) + (setq newS ns) + ;; ANZAHL_SEPARATOR = nur die tatsaechlich platzierten Separator- + ;; Symbole (Separator_SP/S-LP), die diesem Carrier zugeordnet sind. + ;; Der intern in der GF/VF-Kette gezeichnete 300-mm-Block + ;; Staustrecke_Separator_SP ist nur ein Kettenglied (Foerder-/ + ;; Uebergabestueck), KEIN eigenstaendiger Separator - er wird bewusst + ;; NICHT mitgezaehlt (Entscheidung: nur platzierte Symbole zaehlen). + (setq newP nsep) + (setq okS (cs-set-att en (nth 1 rec) (itoa newS))) + (setq okP (cs-set-att en (nth 2 rec) (itoa newP))) + (if verbose + (princ (ssg-textf "sens-carrier-zeile" + (list nm2 (nth 9 rec) (itoa newS) (itoa newP))))) + (if (not (and okS okP)) + (princ (ssg-textf "sens-carrier-fehler" (list nm2)))) + ) + + ;; --- Zusammenfassung --- + (princ (ssg-textf "sens-summary" + (list label (itoa (length carriers)) + (itoa (length scanlist)) (itoa n-scan-unassigned) + (itoa (length seplist)) (itoa n-sep-unassigned)))) + + (if *cs-scanner-ergaenzt* + (progn + (princ (ssg-textf "sens-ergaenzt-header" + (list label (itoa (length *cs-scanner-ergaenzt*))))) + (foreach eintrag *cs-scanner-ergaenzt* + (princ (ssg-textf "sens-ergaenzt-zeile" + (list (nth 0 eintrag) (nth 1 eintrag) (itoa (nth 2 eintrag))))) + (if (nth 3 eintrag) + (princ (ssg-textf "sens-strittig-suffix" + (list (nth 4 eintrag) (itoa (nth 5 eintrag)))))) + ) + ) + ) + (if (> n-strittig 0) + (princ (ssg-textf "sens-strittig-summary" (list label (itoa n-strittig))))) + + (if (> (+ n-scan-unassigned n-sep-unassigned) 0) + (princ (ssg-textf "sens-unassigned-marked" + (list label (itoa (+ n-scan-unassigned n-sep-unassigned)) *mark-layer*)))) + (if (> n-zuordnung-fehlt 0) + (princ (ssg-textf "sens-zuordnung-fehlt" (list label (itoa n-zuordnung-fehlt))))) ) ) (princ) ) +;;; ============================================================ +;;; BEFEHL: ZAEHLE_SEP_SCAN - interaktiver Aufruf mit vollem Bericht +;;; (verbose) und abschliessendem QSAVE. Der automatische Aufruf vor +;;; jedem CSV-/Sivas-Export (csv:run-export in export.lsp) nutzt +;;; dieselbe Engine (cs-zuordnung-lauf) direkt, ohne QSAVE. +;;; ============================================================ +(defun c:ZAEHLE_SEP_SCAN () + (cs-zuordnung-lauf "ZAEHLE_SEP_SCAN" T) + (princ "\n--------------------------------------------") + (princ "\n Speichere Zeichnung (QSAVE) ...") + (command "_.QSAVE") + (princ "\n>>> Fertig.") + (princ) +) + (princ "\n>>> count_sep_scan.lsp geladen. Befehl: ZAEHLE_SEP_SCAN") (princ) diff --git a/Lisp/export.lsp b/Lisp/export.lsp index c3b0d9b..6ec8403 100644 --- a/Lisp/export.lsp +++ b/Lisp/export.lsp @@ -463,7 +463,7 @@ ;; csv:get-k-kos-strings) werden immer geschrieben, unabhaengig von ;; include-bbox -- Kodierung ueber csv:kos-encode (siehe dort). (defun csv:block-to-json (ename include-bbox / ed blk-name layer pt rotation handle attribs bbox bbox-json - insert-quat insert-kos k-list) + insert-quat insert-kos k-list warnung-json warnung-eintrag) (setq ed (entget ename)) (setq blk-name (cdr (assoc 2 ed))) (setq layer (cdr (assoc 8 ed))) @@ -506,6 +506,17 @@ ) ) ) + ;; Warnung fuer strittige Scanner-Zuordnungen anhaengen (siehe + ;; cs-zuordnung-lauf in count_sep_scan.lsp, das *cs-scanner-warnung- + ;; by-handle* vor csv:collect-export-blocks befuellt). Referenziert + ;; die Variable direkt statt ueber atoms-family: ein in AutoLISP noch + ;; nie gesetztes globales Symbol wertet beim Lesen zu nil aus (kein + ;; Fehler), genau wie *export-test-override* in diesem Modul. + (setq warnung-json "") + (setq warnung-eintrag (assoc handle *cs-scanner-warnung-by-handle*)) + (if warnung-eintrag + (setq warnung-json (strcat ",\"warnung\":\"" (csv:json-escape (cdr warnung-eintrag)) "\"")) + ) (strcat " {\"block_name\":\"" (csv:json-escape blk-name) "\"" ",\"layer\":\"" (csv:json-escape layer) "\"" @@ -521,6 +532,7 @@ ",\"k3\":\"" (csv:k-kos k-list "K3") "\"" ",\"k4\":\"" (csv:k-kos k-list "K4") "\"" bbox-json + warnung-json "}" ) ) @@ -615,6 +627,29 @@ ;; Vor dem Export HOEHE/DREHUNG aller Omniflo-Elemente aktualisieren (princ (ssg-textf "exp-update-hoehe-drehung" (list label))) (omni:update-all-attribs) + ;; Vor dem Export: Separator-/Scanner-Zuordnung pruefen und + ;; ANZAHL_SEPARATOR/ANZAHL_SCANNER an Kreisel/Streckengruppe/ + ;; Gefaellestrecke aktualisieren (siehe count_sep_scan.lsp, + ;; cs-zuordnung-lauf). Scanner ausserhalb jeder Carrier-Boundingbox + ;; werden dabei per Abstand zugeordnet (ZUORDNUNG-Attribut = Carrier- + ;; ID) und - bei mehrdeutigem Abstand - als "strittig" markiert; + ;; *cs-scanner-warnung-by-handle* wird von csv:block-to-json unten + ;; ausgelesen und haengt den Warnungstext an den betroffenen Scanner- + ;; Block im JSON an. verbose=nil haelt die Export-Konsole kompakt + ;; (die ausfuehrliche Detailzeile je Carrier gibt es nur beim + ;; interaktiven Befehl ZAEHLE_SEP_SCAN). + ;; + ;; Der Lauf ist teuer (Boundingbox+Regen je Carrier und Sensor), + ;; darum vorher der billige Schnelltest cs-zuordnung-noetig-p (nur + ;; Attribute lesen, keine Boundingboxen): nur bei leeren ZUORDNUNG- + ;; Eintraegen oder abweichenden Summen wird tatsaechlich neu gerechnet. + (ssg-ensure "count_sep_scan") + (if (atoms-family 1 '("cs-zuordnung-lauf")) + (if (cs-zuordnung-noetig-p) + (cs-zuordnung-lauf label nil) + (princ (ssg-textf "sens-skip" (list label))) + ) + ) (princ (ssg-textf "exp-collect-blocks" (list label))) (setq ss (csv:collect-export-blocks)) diff --git a/cfg/export.cfg b/cfg/export.cfg index 0731a07..99f3737 100644 --- a/cfg/export.cfg +++ b/cfg/export.cfg @@ -157,3 +157,24 @@ bb_minimum_height_mm=1 # Linie durch beide Stationsmitten) - genau diese Linie trennt links/rechts. durchmesser_mm=800 +[Sensorzuordnung] +# Zuordnung von manuell platzierten Separator_SP/Scanner-Bloecken zu einem +# Kreisel/Eckrad, einer VarioFoerderer-Streckengruppe (VF_*) oder einer +# Gefaellestrecke (GF_*) - siehe Lisp/count_sep_scan.lsp (cs-zuordnung-lauf). +# Laeuft automatisch vor jedem CSV-/Sivas-Export (Lisp/export.lsp, +# csv:run-export) und schreibt ANZAHL_SEPARATOR/ANZAHL_SCANNER am +# Kreisel/VF/GF sowie ZUORDNUNG (= ID des zugeordneten Elements) am Sensor. + +# Toleranzrand (mm) um die Carrier-Boundingbox: Sensoren knapp ausserhalb +# gelten noch als "innerhalb". 0 = exakte Box. +senstol_mm=0 + +# Scanner (und Separatoren) ausserhalb JEDER Carrier-Boundingbox ohne +# vorhandenes ZUORDNUNG-Attribut werden per Abstand dem naechstgelegenen +# Kreisel/VF/GF zugeschlagen. Liegt der Abstand zum zweitnaechsten +# Kandidaten hoechstens strittig_diff_mm ueber dem des naechsten, gilt die +# Zuordnung als unsicher ("strittig"): sie wird trotzdem geschrieben, aber +# als Warnung im CSV-Export (Spalte "Warnungen") und in der BricsCAD-Konsole +# ausgegeben. Wert in mm. +strittig_diff_mm=500 + diff --git a/lang/de_DE.json b/lang/de_DE.json index da75fdd..16966e4 100644 --- a/lang/de_DE.json +++ b/lang/de_DE.json @@ -1,688 +1,701 @@ { - "texts": { - "omni-alle-winkel": "alle Winkel", - "omni-grad": " Grad", - "omni-bogen-keine-gefunden": "Keine Boegen fuer %1%2 gefunden.", - "omni-weiche-keine-gefunden": "Keine Weichen fuer %1%2 gefunden.", - "vfc-ursprung": "Ursprung", - "vfc-block-eingefuegt-xyzref-ksaus": "\n '%1' eingefuegt (XY:%2 Z:%3)\n KS_AUS: X=%4 Y=%5 Z=%6", - "vfl-ja": "\n 1 - Ja", - "vfl-nein": "\n 2 - Nein", - "vfl-sep-vor-frage": "\n\nZusaetzlichen Separator VOR dem horizontalen Stueck?", - "vfl-sep-nach-frage": "\n\nZusaetzlichen Separator NACH dem horizontalen Stueck?", - "vfl-sep-an-stelle-frage": "\n\nZusaetzlichen Separator an dieser Stelle einfuegen?", - "vf-winkel-aus-header": "\n\nAUS-Element (AS_Element) - Winkel waehlen:", - "vf-winkel-ein-header": "\n\nEIN-Element (ES_Element) - Winkel waehlen:", - "vf-winkel-90": "\n 1 - 90 Grad", - "vf-winkel-30": "\n 2 - 30 Grad", - "vfl-gf-bogen-winkel-header": "\n\nGF-Bogen - Winkel waehlen:", - "vfl-gf-bogen-seite-header": "\nGF-Bogen - Seite waehlen:", - "vfl-winkel-30": "\n 1 - 30 Grad", - "vfl-winkel-60": "\n 2 - 60 Grad", - "vfl-winkel-90": "\n 3 - 90 Grad", - "vfl-variokurve-winkel-header": "\n\nVario-Kurve - Winkel waehlen:", - "vfl-opt1-90grad": "\n 1 - 90 Grad", - "vfl-opt2-60grad": "\n 2 - 60 Grad", - "vfl-opt3-30grad": "\n 3 - 30 Grad", - "vfl-prompt-wahl-1-3-def1": "\nIhre Wahl (1/2/3) [1]: ", - "vfl-variokurve-seite-header": "\nVario-Kurve - Seite waehlen:", - "vfl-variokurve-variante-header": "\nVario-Kurve - Variante waehlen:", - "vfl-variante-aussen": "\n 1 - Aussen", - "vfl-variante-innen": "\n 2 - Innen", - "vfl-ist-ziel-vergleich-header": "\n\n>>> IST-ZIEL-VERGLEICH (ES-Element):", - "vfl-soll-xyz": "\n Soll: X=%1 Y=%2 Z=%3", - "vfl-ist-xyz": "\n Ist : X=%1 Y=%2 Z=%3", - "vfl-abweichung-xyz": "\n Abweichung: dX=%1 dY=%2 dZ=%3 mm", - "vfl-m3-titel": "\n VF-LINIENZUG - Modus 2: Pfad + Ziel-Hoehe (fertig; Anker + Solver + Bau)", - "vfl-m3-alert-gf-modul": "Gefaellestrecke-Modul nicht geladen!", - "vfl-m3-pfad-waehlen": "\n\nPfad-Objekte waehlen (Linien/Boegen):", - "vfl-m3-keine-objekte": "\nKeine Objekte gewaehlt - Abbruch.", - "vfl-m3-prompt-startpunkt": "\n\nStartpunkt der Kette (hoehere Seite) waehlen: ", - "vfl-prompt-hoehe-startpunkt": "\nHoehe (Z) des Startpunkts [%1]: ", - "vfl-m3-prompt-endpunkt": "\n\nEndpunkt der Kette (Ziel) waehlen: ", - "vfl-m3-prompt-zielhoehe": "\nZiel-Hoehe (Z) des Endpunkts [%1]: ", - "vfl-m3-fehler-nicht-sortierbar": "\nFEHLER: Pfad nicht sortierbar (haengt er lueckenlos zusammen?).", - "vfl-m3-alert-eckwinkel": "Kein passender Bogen: Eck-Winkel %1 Grad ist nicht ~30/60/90.\nBitte die Winkel anpassen.", - "vfl-m3-seg-gerade": "\n\nSegment %1/%2: Gerade L=%3 mm hz=%4", - "vfl-m3-auto-vf": "\n (automatisch VF - Segment folgt direkt auf eine Vario-Kurve)", - "vfl-m3-typ-gerade": "\n Typ? 1 = GF (Eingabe-Winkel) 2 = VF (Bruecke)", - "vfl-m3-prompt-gf-neigung": "\n GF-Neigung in Grad [3]: ", - "vfl-m3-hinweis-gf-max": "\n Hinweis: GF max. 3 Grad - auf 3 begrenzt.", - "vfl-m3-seg-bogen": "\n\nSegment %1/%2: Eck/Bogen %3 Grad %4", - "vfl-m3-typ-bogen": "\n Typ? 1 = GF-Bogen 2 = Vario-Kurve", - "vfl-m3-variante-frage": "\n Vario-Kurve - Variante? 1 = Aussen 2 = Innen", - "vfl-m3-vf-laeufe": "\n\n[M3a] Gefundene VF-Laeufe: %1", - "vfl-m3-vf-lauf-noetig": "\n[M3a] Genau EIN VF-Lauf noetig (GF...VF...GF; Vario-Kurven duerfen im Lauf liegen).", - "vfl-m3-vf-lauf-m3b": "\n[M3a] Mehrere/keine VF-Laeufe -> M3b spaeter.", - "vfl-m3-vf-lauf-ohne-gerade": "\n[M3a] VF-Lauf ohne VF-Gerade - Abbruch.", - "vfl-m3-anker-vorschau-header": "\n M3a ANKER-VORSCHAU (grob geschaetzt; exakte Werte beim Bau)", - "vfl-m3-start-hoehe": "\n Start-Hoehe Z: %1 mm", - "vfl-m3-ziel-hoehe": "\n Ziel-Hoehe Z: %1 mm", - "vfl-m3-delta-h-gesamt": "\n delta-H gesamt: %1 mm (positiv = Abfall)", - "vfl-m3-vf-lauf-segmente": "\n VF-Lauf: Segment %1..%2", - "vfl-m3-front-anker-vorschau": "\n Front-Anker Z: %1 mm (vorwaerts von AS)", - "vfl-m3-junction-anker-vorschau": "\n Junction-Anker Z: %1 mm (rueckwaerts von ES)", - "vfl-m3-richtung-auf": "Auf (steigt)", - "vfl-m3-richtung-ab": "Ab (faellt)", - "vfl-m3-richtung-horizontal": "horizontal", - "vfl-m3-richtung-auf-kurz": "Auf", - "vfl-m3-richtung-ab-kurz": "Ab", - "vfl-m3-bruecke-dh": "\n --> Bruecke: delta-H = %1 mm ueber Spannweite %2 mm", - "vfl-m3-bruecke-richtung": "\n Richtung: VF-%1", - "vfl-m3-vf-angetrieben": "\n (VF ist angetrieben - kann STEIGEN und FALLEN; Vorzeichen = nur Auf/Ab)", - "vfl-m3-mittlere-neigung": "\n grobe mittlere Neigung ueber Spannweite: ~%1 Grad", - "vfl-m3-warnung-zu-steil": "\n WARNUNG: ~Neigung > 51 Grad -> zu steil fuer Vario (Magnitude infeasibel).", - "vfl-m3-vario-bereich-ok": "\n -> innerhalb Vario-Bereich (3..51 Grad), grobe Orientierung.", - "vfl-m3-anker-hinweis": "\n (Anker oben = grobe Vorschau; exakte Werte werden beim Bau GEMESSEN)", - "vfl-m3-phase-b1": "\n\n>>> Phase B1: Front-Lauf (AS + GF) bauen ...", - "vfl-m3-alert-beginnt-bogen": "Kette beginnt mit einem Bogen - bitte erst eine Gerade.", - "vfl-m3-kurve-front-uebersprungen": "\n >>> [M3a] Vario-Kurve im Front-Lauf - uebersprungen.", - "vfl-m3-standard-vario-header": "\n\n --- STANDARD-VARIO (Kletter-Segment) + flache Zone ---", - "vfl-m3-front-anker-gemessen": "\n Front-Anker (gemessen): %1 mm", - "vfl-m3-junction-exakt": "\n Junction (exakt): %1 mm", - "vfl-m3-kletter-info": "\n Kletterhoehe %1 mm | Kletterer %2 | Kurven %3 | kurze VF %4", - "vfl-m3-kein-winkel": "\n KEIN passender Vario-Winkel -> infeasibel (Front bereits gebaut).", - "vfl-m3-gf-verteilung": "\n\n GF-Verteilung: 1 - alles am Einlauf (GF1) 2 - 1/2 GF1 + 1/2 GF2", - "vfl-m3-vert-halb": "1/2 GF1 + 1/2 GF2", - "vfl-m3-vert-ganz": "alles GF1", - "vfl-m3-vario-ergebnis": "\n -> Vario %1 (%2), L_VF %3 mm, GF gesamt %4 mm, Verteilung %5 (GF2-Rest = Mess-Feinkorrektur)", - "vfl-m3-warnung-gf2-negativ": "\n WARNUNG: Koerper klettert zu wenig - GF2<0 (fehlen %1 mm). Winkel zu flach; dZ nicht exakt.", - "vfl-m3-gf2-ausgleich": "\n GF2 (gemessener Ausgleich): L=%1 mm", - "vfl-m3-kurve-back-uebersprungen": "\n >>> [M3a] Vario-Kurve im Back-Lauf - uebersprungen.", - "vfl-m3-nichts-gebaut": "\nNichts gebaut - Abbruch.", - "vfl-m3-fertig-header": "\n>>> VF-Linienzug (Modus 2) gebaut! <<<", - "vfl-m3-ziel-soll": "\n Ziel (Soll): X=%1 Y=%2 Z=%3", - "vfl-m3-es-ist": "\n ES (Ist): X=%1 Y=%2 Z=%3", - "vfl-m3-abweichung": "\n Abweichung: dX=%1 dY=%2 dZ=%3 mm", - "vfl-m3-laengs-quer": "\n Laengs KS_AUS-Achse: %1 mm | Quer zur Achse (soll ~0): %2 mm", - "vfl-m3-achse-hinweis": "\n (dZ=Ziel-Hoehe; Quer zur KS_AUS-Achse ~0 => Endpunkt liegt auf der Achse)", - "gf-fehler-block-fehlt": "\n FEHLER: Block '%1' fehlt", - "gf-fehler-block-fehlt-ausruf": "\n FEHLER: Block '%1' fehlt!", - "gf-fehler-blockdatei-fehlt": "\n FEHLER: Block-Datei nicht gefunden: %1", - "gf-fehler-keine-linie": "\n Fehler: keine Linie!", - "gf-laenge-null-uebersprungen": "\n (Laenge 0 - uebersprungen)", - "gf-prompt-linie-waehlen": "\n >> Linie waehlen: ", - "gf-status-3dlinie-z": "\n 3D-Linie: Z_start=%1 Z_end=%2", - "gf-status-block-l-z": "\n %1 L=%2 -> Z=%3", - "gf-status-bogen-masse": "\n %1: dx=%2 dz=%3", - "gf-status-gefaellebogen": "\n Gefaellebogen %1 hz=%2%3 -> Z=%4", - "gf-status-hzincl": "\n HzIncl %1 L=%2 hz=%3%4 v=%5%6 -> Z=%7", - "gf-status-hzks": "\n HzKS %1 hz=%2%3 v=%4%5 -> Z=%6", - "gf-status-ks-aus-z": "\n KS_AUS Z=%1", - "gf-warnung-block-fehlt-nullwerte": "\n WARNUNG: %1 fehlt - Nullwerte", - "gf-warnung-ks-fehlt": "\n WARNUNG: KS_EIN/KS_AUS fehlt!", - "gf-warnung-ks-fehlt-in": "\n WARNUNG: KS fehlt in '%1'", - "gf-warnung-ks-fehlt-in2": "\n WARNUNG: KS fehlt in %1", - "kreisel-abstand-ausgabe": "\n-> Abstand: %1 mm", - "kreisel-beschriftung-erzeugt": "\n-> Beschriftung: %1 (Höhe=%2mm, Arial, zentriert)", - "kreisel-bestehende-blockdef": "\n-> Verwende bestehende Blockdefinition: %1", - "kreisel-connect-zusammenfassung": "\n-> Abstand: %1 mm Rotation: %2 Grad Hoehe: %3 Kreiselart: %4", - "kreisel-eckrad-eingefuegt": "\n-> Eckrad #%1 eingefuegt: %2 bei %3,%4 Rotation=%5 Hoehe=%6", - "kreisel-edit-aktualisiert": "\nKreisel aktualisiert: Name=%1 Abstand=%2 Hoehe=%3 Rotation=%4", - "kreisel-edit-bestehend": "\n-> Bestehend: Abstand=%1 Drehung=%2 Art=%3", - "kreisel-edit-dialog-fehlt": "Dialog nicht verfuegbar: %1", - "kreisel-eingefuegt": "\n-> Kreisel #%1 eingefügt: %2 (Höhe=%3)", - "kreisel-emsg-distanz-klein": "Distanz zu klein! (%1 < %2)", - "kreisel-hoehe-aus-3dpunkt": "\n-> Hoehe aus 3D-Punkt uebernommen: %1", - "kreisel-hoehe-aus-basispunkt": "\n-> Höhe aus Basispunkt übernommen: %1", - "kreisel-hoehe-aus-startpunkt": "\n-> Hoehe aus Startpunkt uebernommen: %1", - "kreisel-hoehe-von-bestehendem": "\n-> Höhe von bestehendem Kreisel übernommen: %1", - "kreisel-insert-zusammenfassung": "\n-> Rotation: %1 Höhe: %2 Kreiselart: %3", - "kreisel-labelsetup-fertig": "\nNeue Einstellungen: Höhe=%1, Farbe=%2, Y-Versatz=%3, Schriftart=Arial", - "kreisel-neue-beschriftungsposition": "\nNeue Beschriftungsposition: X=%1 Y=%2", - "kreisel-neue-blockdef": "\n-> Neue Blockdefinition: %1", - "kreisel-neue-texthoehe": "\nNeue Texthöhe: %1", - "kreisel-params-default-hoehe": "\nDefault-Höhe: %1", - "kreisel-params-default-laenge": "\nDefault-Laenge: %1", - "kreisel-params-durchmesser": "\nDurchmesser: %1", - "kreisel-params-typ": "\nKreiselart: %1", - "kreisel-prompt-abstand": "\nAbstand (Tangentenlaenge) <%1>: ", - "kreisel-prompt-abstand-oben": "\nAbstand über Kreisel-Mitte <%1>: ", - "kreisel-prompt-hoehe-z": "\nHoehe (Z-Koordinate) <%1>: ", - "kreisel-prompt-neue-hoehe": "\nNeue Höhe <%1>: ", - "kreisel-prompt-neuer-abstand": "\nNeuer Abstand <%1>: ", - "kreisel-prompt-schriftfarbe": "\nSchriftfarbe (1=Rot,2=Gelb,3=Grün,4=Cyan,5=Blau,6=Magenta,7=Weiß) <%1>: ", - "kreisel-prompt-schrifthoehe": "\nSchrifthöhe <%1>: ", - "kreisel-prompt-texthoehe": "\nTexthöhe <%1>: ", - "kreisel-prompt-x-abstand": "\nX-Abstand von AN8-Mitte <%1>: ", - "kreisel-prompt-y-abstand": "\nY-Abstand von AN8-Mitte <%1>: ", - "kreisel-redraw-bestehend": "\n-> Bestehend: Abstand=%1 Drehung=%2 Hoehe=%3 Art=%4", - "kreisel-redraw-fertig": "\nKreisel neu gezeichnet. Abstand=%1", - "kreisel-script-distanz-klein": "\n[Connect] Distanz zu klein: %1", - "kreisel-textstil-erstellt": "\n-> Textstil '%1' mit Arial erstellt", - "kreisel-typ-prompt": "\nBitte waehlen <%1>: ", - "omni-bogen-info-antriebsart": "\n Antriebsart: %1", - "omni-bogen-info-breite": "\n Breite: %1", - "omni-bogen-info-kurvenwinkel": "\n KurvenWinkel: %1", - "omni-bogen-info-laenge": "\n Laenge: %1", - "omni-bogen-info-profiltyp": "\n ProfilTyp: %1", - "omni-bogen-info-radius": "\n Radius: %1", - "omni-bogen-nicht-gefunden": "\nKein Bogen mit SivasId '%1' gefunden.", - "omni-dxf-eingefuegt": "\n[OMNI] %1 eingefuegt. Hoehe=%2 Drehung=%3%4", - "omni-edit-aktualisiert": "\n[OMNI] Element aktualisiert: %1 Hoehe=%2 Drehung=%3", - "omni-edit-dxf-nicht-gefunden": "DXF nicht gefunden: %1", - "omni-einfuegen-info": "\n[OMNI] Einfuegen: %1 (%2)", - "omni-fehler-dxf-nicht-gefunden": "\n[OMNI] FEHLER: DXF nicht gefunden: %1", - "omni-insert-block-eingefuegt": "\n[OMNI] %1 eingefuegt. Laenge=%2 mm", - "omni-laenge-ueberschritten": "Die gewuenschte Fahrstreckenlaenge von %1 mm ueberschreitet die Maximallaenge von %2 mm des Fahrstreckenprofils.\nBitte neu definieren!", - "omni-weiche-info-breite": "\n Breite: %1", - "omni-weiche-info-kurvenrichtung": "\n KurvenRichtung: %1", - "omni-weiche-info-kurvenwinkel": "\n KurvenWinkel: %1", - "omni-weiche-info-laenge": "\n Laenge: %1", - "omni-weiche-info-profiltyp": "\n ProfilTyp: %1", - "omni-weiche-info-schaltungstyp": "\n Schaltungstyp: %1", - "omni-weiche-info-weichentyp": "\n WeichenTyp: %1", - "omni-weiche-info-wklaenge": "\n WK-Laenge: %1", - "omni-weiche-nicht-gefunden": "\nKeine Weiche mit SivasId '%1' gefunden.", - "vfc-3dlinie-start-ende": "\n 3D-Linie:\n Start: X=%1 Y=%2 Z=%3\n Ende: X=%4 Y=%5 Z=%6", - "vfc-3dpolylinie-start-ende": "\n 3D-Polylinie:\n Start Z=%1 Ende Z=%2", - "vfc-block-einfuegepunkt": "\n Block-Einfuegepunkt: X=%1 Y=%2 Z=%3", - "vfc-block-eingefuegt-ksaus": "\n '%1' eingefuegt\n KS_AUS: X=%2 Y=%3 Z=%4", - "vfc-delta-l-h-richtung": "\n %1L=%2 mm %1H=%3 mm Fahrtrichtung=%4%5", - "vfc-endpunkt-xyz": "\n Endpunkt: X=%1 Y=%2 Z=%3", - "vfc-endpunkt-xyz-dxdz": "\n Endpunkt: X=%1 Y=%2 Z=%3 (dx=%4 dz=%5)", - "vfc-fahrtrichtung-ergebnis": "\n>>> Fahrtrichtung: %1%2", - "vfc-fehler-block-datei-fehlt": "\n FEHLER: Block-Datei nicht gefunden: %1", - "vfc-fehler-block-nicht-in-bibliothek": "\n FEHLER: Block '%1' nicht in Bibliothek", - "vfc-fehler-block-nicht-in-bibliothek-abgebrochen": "\n FEHLER: Block '%1' nicht in Bibliothek - abgebrochen", - "vfc-fehler-ks-fehlen": "\n FEHLER: KS_EIN/KS_AUS fehlen in '%1'", - "vfc-fehler-ungueltiger-einfuegepunkt": "\n FEHLER: Ungueltiger Einfuegepunkt fuer '%1'", - "vfc-fuege-block-ein-hz": "\n Fuege Block '%1' ein... (hz=%2%3)", - "vfc-fuege-block-ein-rotation-hz": "\n Fuege Block '%1' ein (Rotation %2%3 hz=%4%5)", - "vfc-fuege-ein-lwhz": "\n Fuege '%1' ein (L=%2 mm, W=%3%4 hz=%5%6)", - "vfc-ks-aus-xyz": "\n KS_AUS: X=%1 Y=%2 Z=%3", - "vfc-lade-block": "\n Lade Block: %1 ...", - "vfc-laenge-uebersprungen": "\n Laenge=%1 mm -> uebersprungen", - "vfc-punkt-auf-objekt": "\n Punkt auf Objekt: Z=%1 mm", - "vfe-as30-mass": "\n AS_30_rechts: dx=%1 mm, dz=%2 mm", - "vfe-block-fehlt-abbruch": "\n FEHLER: Block '%1' nicht in Bibliothek - abgebrochen", - "vfe-bogen-nicht-vorhanden": "\n %1 -> Bogen nicht vorhanden", - "vfe-delta-info": "\n△L=%1 mm △H=%2 mm Richtung=%3", - "vfe-empfohlener-winkel": "\n>>> Empfohlener Winkel: %1", - "vfe-es30-mass": "\n ES_30_rechts: dx=%1 mm, dz=%2 mm", - "vfe-extrahiere-block-mass": "\n Extrahiere %1 Masse...", - "vfe-gefaellebogen-links-mass": "\n Gefaellebogen links: dx=%1 dz=%2 mm", - "vfe-gefaellebogen-rechts-mass": "\n Gefaellebogen rechts: dx=%1 dz=%2 mm", - "vfe-gefaellebogen-seite-dx": "\n Gefaellebogen %1: dx=%2 mm", - "vfe-hz-incl-status": "\n HzIncl %1 L=%2 hz=%3 v=%4 -> Z=%5", - "vfe-hz-rot-status": "\n HzRot %1 hz=%2 v=%3 -> Z=%4", - "vfe-hz-rotks-status": "\n HzRotKS %1 hz=%2 -> Z=%3", - "vfe-hz-scaleks-status": "\n HzScaleKS %1 %2mm hz=%3 -> Z=%4", - "vfe-ks-fehlt-startpunkt": "\n WARNUNG: KS fehlt in '%1' - verwende Startpunkt", - "vfe-step1-as30": "\n\n1/15: %1 (0 Grad)", - "vfe-step2": "\n\n2/15: Staustrecke 400mm (%1 Grad hz, 3 Grad vert, KS_EIN)", - "vfe-step3": "\n\n3/15: Separator (300mm, %1 Grad hz, 3 Grad vert)", - "vfe-step4": "\n\n4/15: %1 (Anfang, %2 Grad hz, 0 Grad vert, KS_EIN)", - "vfe-step5-strecke": "\n\n5/15: Gefaellestrecke (3 Grad, L=%1 mm)", - "vfe-step7": "\n\n7/15: %1 (3 Grad geneigt)", - "vfe-step8-ab": "\n\n8/15: Gefaellestrecke (%1 Grad, L=%2 mm)", - "vfe-step8-auf": "\n\n8/15: Steigungsstrecke (%1 Grad, L=%2 mm)", - "vfe-tabelle-zeile": "\n %1 %2 mm %3 mm ", - "vfe-tabelle-zeile-fehler": "\n %1 --- --- FEHLER", - "vfl-20m-hinweis": "\n >>> HINWEIS: Foerderer laenger als 20 m (%1 m) - Motorstation empfohlen!", - "vfl-block-erstellt": "\n>>> Block '%1' (%2) erstellt und eingefuegt.", - "vfl-fehler-rest-nicht-baubar": "\n FEHLER: Rest nicht baubar (zu steil/zu kurz fuer Schwanz Motor+GF2+Separator+ES). Bitte weiter zeichnen oder flacher planen.", - "vfl-fuege-block-ein": "\n Fuege %1 ein ...", - "vfl-hinweis-gf2-minimum": "\n HINWEIS: berechnetes GF2=%1 mm < Minimum %2 mm -> auf Minimum angehoben (ES endet dadurch etwas weiter; siehe Ist-Ziel-Report).", - "vfl-horizontale-zwischenstrecke": "\n\nHorizontale Zwischenstrecke (0 Grad, L=%1 mm)", - "vfl-kettenende-modus-ziel": "\n>>> Kettenende-Modus: Ziel dL=%1 mm, dH=%2 mm (%3). GF2 variiert mit dem Winkel.", - "vfl-prompt-hoehe-endpunkt": "\nHoehe (Z) des Endpunkts [%1]: ", - "vfl-prompt-hoehe-kettenende": "\nHoehe (Z) des Kettenendes (ES-Element) [%1]: ", - "vfl-prompt-wahl-bis-n": "\nIhre Wahl (1-%1) [1]: ", - "vfl-segment-gf-nicht-erlaubt": "\n Segment waere GF (zu steil) oder nicht baubar - innerhalb einer VF-Einheit nicht erlaubt.\n Bitte flacher/steigend zeichnen oder Foerderer beenden.", - "vfl-winkel-option": "\n %1 - %2 Grad (L_GF=%3 mm L_VF=%4 mm)", - "vfs-as90-mass": "\n AS_90: dx=%1 dz=%2", - "vfs-berechnung-parameter": "\n△L=%1 mm △H=%2 mm Richtung=%3", - "vfs-block-fehlende-item": "\n - %1", - "vfs-block-fehler-pfad": "\n FEHLER: DXFM_BLOCKS = %1", - "vfs-bogen-ab-block-fehlt": "\n FEHLER ab_%1: Block nicht geladen!", - "vfs-bogen-ab-ks-fehlt": "\n FEHLER ab_%1: KS fehlt!", - "vfs-bogen-ab-ok": "\n OK ab_%1: dx=%2 dz=%3", - "vfs-bogen-auf-block-fehlt": "\n FEHLER auf_%1: Block nicht geladen!", - "vfs-bogen-auf-ks-fehlt": "\n FEHLER auf_%1: KS fehlt!", - "vfs-bogen-auf-ok": "\n OK auf_%1: dx=%2 dz=%3", - "vfs-empfohlener-winkel": "\n>>> Empfohlener Winkel: %1%2", - "vfs-es90-mass": "\n ES_90: dx=%1 dz=%2", - "vfs-fehler-winkel-tabelle": "\n FEHLER: Winkel %1 nicht in Bogen-Tabelle!", - "vfs-schritt-as": "\n\n1/11: %1 (hz=%2%3)", - "vfs-schritt5-bogen1": "\n\n5/11: %1 (3 Grad geneigt)", - "vfs-tabelle-zeile": "\n %1%2 %3 mm %4 mm ", - "vfs-tabelle-zeile-fehler": "\n %1%2 --- --- FEHLER", - "vfs-vf-eingang-gf1": "\n\n[VF-Eingang] Gefaellestrecke GF1 (3 Grad, L=%1 mm)", - "kreisel-abbruch-befehl": "\nBefehl abgebrochen.", - "kreisel-abgebrochen": "\nAbgebrochen.", - "kreisel-connect-erfolgreich": "\nKreisel Connect erfolgreich!", - "kreisel-connect-header": "\n--- Kreisel durch Linie definieren (AN -> SP) ---", - "kreisel-eckrad-beruehrpunkt": "\nBeruehrpunkt Eckrad (Tangente): ", - "kreisel-eckrad-fehler-identisch": "\nFehler: Beruehr- und Richtungspunkt sind identisch!", - "kreisel-eckrad-richtung": "\nRichtung zum Kreismittelpunkt: ", - "kreisel-emsg-kein-block": "Kein Block ausgewaehlt!", - "kreisel-emsg-kein-kreisel-block": "Kein Kreisel-Block! (Attribut ABSTAND fehlt)", - "kreisel-fehler-keine-entities": "\nFehler: Keine Entities zum Block erstellen!", - "kreisel-insert-fertig": "\nKreisel Modul eingefuegt.", - "kreisel-params-attribute-header": "\nAttribute im Block:", - "kreisel-params-header": "\n=== Kreisel Parameter ===", - "kreisel-prompt-basispunkt": "\nBasispunkt (AN-Seite): ", - "kreisel-prompt-block-auswaehlen": "\nKreisel-Block auswaehlen: ", - "kreisel-prompt-endpunkt": "\nEndpunkt (SP-Seite aussen): ", - "kreisel-prompt-rotation": "\nRotation in Grad <0>: ", - "kreisel-prompt-startpunkt": "\nStartpunkt (AN-Seite aussen): ", - "kreisel-quick-fertig": "\nSchnell Einfuegen fertig.", - "kreisel-start-connect": "Kreisel Smart Connect", - "kreisel-start-eckrad": "Eckrad einfuegen", - "kreisel-start-edit": "Kreisel bearbeiten", - "kreisel-start-insert": "Kreisel Modul einfuegen", - "kreisel-start-quick": "Kreisel Schnell Einfuegen", - "kreisel-start-redraw": "Kreisel Neu Zeichnen", - "kreisel-start-script-connect": "Kreisel Script Connect", - "kreisel-start-script-insert": "Kreisel Script Insert", - "kreisel-typ-opt-pin": "\n[2] PIN", - "kreisel-typ-opt-standard": "\n[1] STANDARD (ohne PIN)", - "kreisel-warn-blockpfad": "\n[KreiselInsert] WARNUNG: Block-Pfad nicht ermittelbar!", - "kreisel-warn-core-fehlt": "\n[KreiselInsert] WARNUNG: ssg_core.lsp nicht gefunden - Standardwerte.", - "omni-abbruch": "\nAbgebrochen.", - "omni-abbruch-bogen": "\n[BOGEN] Abgebrochen.", - "omni-abbruch-omni": "\n[OMNI] Abgebrochen.", - "omni-abbruch-weiche": "\n[WEICHE] Abgebrochen.", - "omni-bogen-dialog-ladefehler": "Bogen-Dialog konnte nicht geladen werden.", - "omni-edit-kein-block": "Kein Block ausgewaehlt!", - "omni-edit-kein-element": "Kein Omniflo-Element erkannt! (ARTINR/Blockname nicht im Katalog)", - "omni-edit-prompt-auswahl": "\nOmniflo-Element auswaehlen: ", - "omni-fehler-dxfm-data": "\n[OMNI] FEHLER: DXFM_DATA nicht gesetzt!", - "omni-fehler-dxfm-omniflo": "\n[OMNI] FEHLER: DXFM_OMNIFLO nicht gesetzt!", - "omni-info-bogen-prompt": "\nSivasId des Bogens eingeben: ", - "omni-info-weiche-prompt": "\nSivasId der Weiche eingeben: ", - "omni-insert-keine-attribute": "\n[OMNI] Keine Attribute im Quell-Block gefunden.", - "omni-prompt-drehwinkel": "\nDrehwinkel angeben: ", - "omni-prompt-einfuegepunkt": "\nEinfuegepunkt waehlen: ", - "omni-prompt-endpunkt-fahrstrecke": "\nEndpunkt der Fahrstrecke waehlen: ", - "omni-weiche-dialog-ladefehler": "Weichen-Dialog konnte nicht geladen werden.", - "prompt-wahl-1-2-3-4": "\nIhre Wahl (1/2/3/4) [1]: ", - "vfc-alert-keine-gueltige-linie": "Keine gueltige Linie ausgewaehlt!", - "vfc-bitte-3dlinie-foerderstrecke": "\nBitte 3D-Linie fuer die Foerderstrecke auswaehlen:", - "vfc-bks-weltkoordinaten": "\n BKS auf Weltkoordinaten gesetzt.", - "vfc-eingabemodus-3dlinie": "\n 1 - 3D-Linie auswaehlen (Start- und Endpunkt mit Hoehe)", - "vfc-eingabemodus-header": "\n\nEingabemodus waehlen:", - "vfc-eingabemodus-werte": "\n 2 - Werte manuell eingeben", - "vfc-fahrtrichtung-0": "\n 1 - 0%1 (X-Achse +, Ost)", - "vfc-fahrtrichtung-180": "\n 3 - 180%1 (X-Achse -, West)", - "vfc-fahrtrichtung-270": "\n 4 - 270%1 (Y-Achse -, Sued)", - "vfc-fahrtrichtung-90": "\n 2 - 90%1 (Y-Achse +, Nord)", - "vfc-fahrtrichtung-header": "\n\nFahrtrichtung waehlen:", - "vfc-fehler-keine-linie": "\n FEHLER: Keine Linie oder Polylinie ausgewaehlt!", - "vfc-foerderrichtung-ab": "\n Foerderrichtung: AB", - "vfc-foerderrichtung-auf": "Auf", - "vfc-foerderrichtung-menu": "\nFoerderrichtung:\n 1 - AUF\n 2 - AB", - "vfc-gf-verteilung-header": "\n\nVerteilung der Gefaellestrecken (vorne/hinten):", - "vfc-gf-verteilung-1": "\n 1 - Gleichmaessig (L_GF1 = L_GF2 = L_GF/2)", - "vfc-gf-verteilung-2": "\n 2 - Vorne Minimum, hinten Rest", - "vfc-gf-verteilung-3": "\n 3 - Hinten Minimum, vorne Rest", - "vfc-gf-verteilung-4": "\n 4 - Eigene Werte eingeben", - "vfc-kein-objekt-gewaehlt": "\n Kein Objekt gewaehlt.", - "vfc-label-von-bis": ": von %1mm bis %2mm, ", - "vfc-linie-polylinie-waehlen": "\n >> 3D-Linie oder Polylinie waehlen: ", - "vfc-modus-3dlinie-fallback": "Linie", - "vfc-modus-3dlinie-header": "\n\n>>> MODUS: 3D-Linie auswaehlen <<<", - "vfc-modus-werteingabe-header": "\n\n>>> MODUS: Manuelle Werteingabe <<<", - "vfc-objekt-block-waehlen": "\n >> Objekt (Block) waehlen: ", - "vfc-prompt-delta-h": "\n%1H - Hoehenunterschied (mm): ", - "vfc-prompt-delta-l": "\n%1L - Horizontale Distanz (mm): ", - "vfc-prompt-startpunkt-aus": "\nStartpunkt fuer AUS_Element waehlen: ", - "vfc-prompt-wahl-1-2-ohne-default": "\nIhre Wahl (1/2): ", - "vfc-status-ok": " OK", - "vfc-warnung-ks-nicht-gefunden": "\n WARNUNG: KS_EIN/KS_AUS nicht gefunden!", - "vfc-block-erstellt-eingefuegt": "\n>>> Block '%1' erstellt und eingefuegt.", - "vfc-fehler-keine-entities": "\n>>> FEHLER: Keine Entities fuer Block gefunden!", - "vfc-banner-titel": "\n VARIOFOERDERER GENERATOR v26.0", - "vfc-alert-keine-typen": "Keine Typen registriert!\nvf_standard.lsp und vf_etage.lsp pruefen.", - "vfc-typ-vorgewaehlt": "\n>>> Typ vorgewaehlt: %1", - "vfc-anlagen-typ-header": "\n\nAnlagen-Typ waehlen:", - "vfc-typ-option": "\n %1 - %2", - "vfc-prompt-wahl-1-n": "\nIhre Wahl (1-%1) [1]: ", - "vfc-typ-gewaehlt": "\n>>> Typ: %1", - "vfc-naechste-vf-nummer": "\n>>> Naechste VF-Nummer: VF%1", - "vfc-seite-header": "\n\nSeite waehlen:", - "vfc-seite-rechts": "\n 1 - Rechts", - "vfc-seite-links": "\n 2 - Links", - "vfc-seite-gewaehlt": "\n>>> Seite: %1", - "vfc-hinweis-horizontal-moeglich": "\n\n>>> Hinweis: Ein horizontale Variofoerderer ( 0%1) ist bei diesem %2L/%2H zusaetzlich moeglich!", - "vfc-alert-kein-winkel": "Kein passender Winkel gefunden!\n%1L=%2 mm, %1H=%3 mm, Richtung=%4", - "vfc-einzige-variante-horizontal": "\n\n>>> Einzige gueltige Variante: Horizontale Variofoerderer", - "vfc-einziger-winkel": "\n\n>>> Einziger gueltiger Winkel: %1%2", - "vfc-mehrere-winkel-header": "\n\nMehrere gueltige Winkel verfuegbar. Bitte waehlen:", - "vfc-winkel-option-horizontal": "\n %1 - Horizontale Variofoerderer (0%2) (L_GF=%3 mm, L_VF=%4 mm)", - "vfc-winkel-option": "\n %1 - %2%3 (L_GF=%4 mm, L_VF=%5 mm)", - "vfc-prompt-winkel-waehlen": "Winkel waehlen (1-%1) [1]: ", - "vfc-zus-horizontal": "\n>>> Horizontale Variofoerderer L_GF: %1 mm L_VF: %2 mm", - "vfc-zus-winkel": "\n>>> Winkel: %1%2 L_GF: %3 mm L_VF: %4 mm", - "vfc-prompt-lgf1-vorne": "\nL_GF1 vorne (mm) [%1]: ", - "vfc-lgf2-hinten": "\n L_GF2 hinten: %1 mm", - "vfc-zus-lgf": "\n>>> L_GF1=%1 mm L_GF2=%2 mm", - "vfc-einfuegen-frage": "\n\nMoechten Sie die Foerderanlage einfuegen?", - "vfc-einfuegen-optionen": "\n 1 - Ja, Module einfuegen\n 2 - Nein, abbrechen", - "vfc-vorgang-abgebrochen": "\nVorgang abgebrochen.", - "vfs-dlg-richtung-auf": "Auf", - "vfs-dlg-richtung-ab": "Ab", - "vfs-dlg-winkel-horizontal": "Horizontal (GF=%1 mm, VF=%2 mm)", - "vfs-dlg-winkel-option": "%1%2 (GF=%3 mm, VF=%4 mm)", - "vfs-dlg-verteilung-1": "Gleichmaessig (L_GF1 = L_GF2 = L_GF/2)", - "vfs-dlg-verteilung-2": "Vorne Minimum, hinten Rest", - "vfs-dlg-verteilung-3": "Hinten Minimum, vorne Rest", - "vfs-dlg-verteilung-4": "Eigene Werte eingeben", - "vfs-edit-kein-vf": "Block %1 ist keine VarioFoerderer-Strecke.", - "vfs-edit-keine-xdata": "VarioFoerderer %1 wurde nicht mit diesem Dialog erstellt (Etage/Linienzug/Altbestand) und kann hier nicht bearbeitet werden.", - "vfs-edit-neu-aufgebaut": "\nVarioFoerderer %1 neu aufgebaut.", - "vfe-alert-bib-nicht-init": "Etage-Bibliothek nicht initialisiert!", - "vfe-berechnung-header": "\n ETAGE-BERECHNUNG FUER ALLE WINKEL", - "vfe-bib-bereits-init": "\n Etage-Bibliothek bereits initialisiert.", - "vfe-bib-init-erfolg": "\n Etage-Bibliothek erfolgreich initialisiert.", - "vfe-bib-initialisiere": "\n Initialisiere Etage-Bibliothek...", - "vfe-ergebnistabelle-header": "\n ERGEBNISTABELLE (L_GF = gesamt beider GF-Strecken)", - "vfe-extrahiere-as30": "\n Extrahiere AS_30_rechts Masse...", - "vfe-extrahiere-es30": "\n Extrahiere ES_30_rechts Masse...", - "vfe-kein-winkel-gefunden": "\n>>> KEIN passender Winkel gefunden!", - "vfe-status-gueltig": "GUELTIG", - "vfe-status-ungueltig": "UNGUELTIG (negative Laenge)", - "vfe-step5-skip": "\n\n5/15: L_GF1 (uebersprungen)", - "vfe-step6": "\n\n6/15: Umlenkstation (500mm, 3 Grad geneigt)", - "vfe-step8-skip": "\n\n8/15: L_VF (uebersprungen)", - "vfe-tabelle-spalten": "\n Winkel L_GF (mm) L_VF (mm) Status", - "vfe-warn-block-as30-fehlt": "\n WARNUNG: Block AS_Element_30_rechts fehlt - Standardwerte", - "vfe-warn-block-es30-fehlt": "\n WARNUNG: Block ES_Element_30_rechts fehlt - Standardwerte", - "vfe-warn-block-fehlt-links": "\n WARNUNG: Block fehlt - Standardwerte (links)", - "vfe-warn-block-fehlt-rechts": "\n WARNUNG: Block fehlt - Standardwerte (rechts)", - "vfe-warn-kein-ks-links": "\n WARNUNG: kein KS - Standardwerte (links)", - "vfe-warn-kein-ks-rechts": "\n WARNUNG: kein KS - Standardwerte (rechts)", - "vfe-warn-ks-fehlt-standard": "\n WARNUNG: KS fehlt - Standardwerte", - "vfe-warn-lisp-pfad": "\n[vf_etage] WARNUNG: Lisp-Pfad nicht ermittelbar - vf_core.lsp nicht ladbar!", - "vfl-abgebrochen-kein-ziel": "\n Abgebrochen - kein Zielpunkt gewaehlt.", - "vfl-bogen-ab3-uebergang": "\n\nVario_Bogen_ab_3 (Uebergang horizontal -> 3 Grad)", - "vfl-bogen-auf3-uebergang": "\n\nVario_Bogen_auf_3 (Uebergang 3 Grad -> horizontal)", - "vfl-gf-verteilung-ganz-einlauf": "\n 2 - Gesamte Staustrecke am Einlauf (GF1), kein GF2", - "vfl-gf-verteilung-haelfte": "\n 1 - 1/2GF am Ausgang (GF2), 1/2GF am Einlauf (GF1)", - "vfl-gf-verteilung-header": "\n\nStaustrecke (GF) - Verteilung waehlen:", - "vfl-ist-endpunkt-frage": "\n\nIst der Endpunkt der Foerderer?", - "vfl-ist-kettenende-frage": "\n\nIst das das Kettenende (ES-Element)?", - "vfl-ja-motorstation-kettenende": "\n 3 - Ja (Motorstation setzen, Kettenende definieren)", - "vfl-ja-nur-motorstation": "\n 1 - Ja (nur Motorstation setzen)", - "vfl-ja-separator-es": "\n 1 - Ja (Separator + ES-Element setzen)", - "vfl-linie-zu-kurz-simple": "\n Linie zu kurz - uebersprungen.", - "vfl-linie-zu-kurz-uebersprungen": "\n Linie zu kurz (oder entgegen der Fahrtrichtung) - uebersprungen.", - "vfl-mehrere-winkel-header": "\n\nMehrere gueltige Winkel - bitte gewuenschten Winkel waehlen:", - "vfl-modus1-beschreibung": "\nGemischte Gefaellestrecke/VarioFoerderer-Kette entlang eines frei", - "vfl-modus1-header": "\n VF-LINIENZUG - Modus 1: Manuelle Eingabe", - "vfl-naechstes-element-vf": "\n\nNaechstes Element im VarioFoerderer:", - "vfl-nein-weiterbauen": "\n 2 - Nein (weiterbauen)", - "vfl-opt-auf-ab-foerderer": "\n 3 - Auf/Ab-Foerderer (Linie mit Hoehendifferenz)", - "vfl-opt-horizontaler-foerderer": "\n 1 - Horizontaler Foerderer (Linie ohne Hoehendifferenz)", - "vfl-opt-vario-kurve": "\n 2 - Vario-Kurve (30/60/90 Grad)", - "vfl-prompt-wahl-1-2-def2": "\nIhre Wahl (1/2) [2]: ", - "vfl-prompt-wahl-1-3-def2": "\nIhre Wahl (1/2/3) [2]: ", - "vfl-prompt-wahl-1-3-def3": "\nIhre Wahl (1/2/3) [3]: ", - "vfl-sep-horizontal-info": "\n [horizontal] Separator (300 mm, 0 Grad)", - "vfs-berechnung-header": "\n BERECHNUNG FUER ALLE WINKEL (Standard)", - "vfs-block-fehlende-header": "\n Folgende Block-Dateien fehlen:", - "vfs-ergebnistabelle-header": "\n ERGEBNISTABELLE", - "vfs-extrahiere-aus": "\n Extrahiere AUS_Element Masse...", - "vfs-extrahiere-bogen": "\n Extrahiere Bogen-Masse...", - "vfs-extrahiere-ein": "\n Extrahiere EIN_Element Masse...", - "vfs-fehler-block-as90": "\n FEHLER: Block AS_Element_90_links nicht geladen!", - "vfs-fehler-block-es90": "\n FEHLER: Block ES_Element_90_links nicht geladen!", - "vfs-fehler-ks-as90": "\n FEHLER: KS_EIN/KS_AUS fehlt im AS_90!", - "vfs-fehler-ks-es90": "\n FEHLER: KS_EIN/KS_AUS fehlt im ES_90!", - "vfs-fehler-lib-nicht-init": "\n FEHLER: Bibliothek nicht korrekt initialisiert (AUS/EIN-Masse fehlen)!", - "vfs-kein-winkel-gefunden": "\n>>> KEIN passender Winkel gefunden!", - "vfs-lib-bereits-init": "\n Standard-Bibliothek bereits initialisiert.", - "vfs-lib-init-erfolg": "\n Standard-Bibliothek erfolgreich initialisiert.", - "vfs-lib-init-start": "\n Initialisiere Standard-Bibliothek...", - "vfs-status-gueltig": "GUELTIG", - "vfs-status-ungueltig": "UNGUELTIG (negative Laenge)", - "vfs-tabelle-spalten": "\n Winkel L_GF (mm) L_VF (mm) Status", - "vfs-vf-eingang-gf1-skip": "\n\n[VF-Eingang] Gefaellestrecke GF1 (uebersprungen)", - "vfs-vf-eingang-separator": "\n[VF-Eingang] Separator (300 mm, 3 Grad geneigt)", - "vfs-vf-eingang-umlenk": "\n[VF-Eingang] Umlenkstation (500 mm, 3 Grad geneigt)", - "vfs-warn-lisppfad": "\n[vf_standard] WARNUNG: Lisp-Pfad nicht ermittelbar - vf_core.lsp nicht ladbar!", - "dim-switch-modus": "\nModus umgeschaltet auf: %1", - "dim-switch-blocks": "\n DXFM_BLOCKS = %1", - "dim-switch-omniflo": "\n DXFM_OMNIFLO = %1", - "dim-batch-fertig": "\nUmwandlung auf %1 abgeschlossen: %2 GF, %3 VF neu aufgebaut (%4 bereits in Zieldimension).", - "sprache-gewechselt": "\nSprache umgeschaltet auf: %1", - "cmd-block-auswaehlen": "\nBlock auswaehlen: ", - "cmd-kein-block-ausgewaehlt": "\nKein Block ausgewaehlt.", - "cmd-kreisel-bearbeiten": "\nKreisel bearbeiten: %1", - "cmd-eckrad-bearbeiten": "\nEckrad bearbeiten: %1", - "cmd-gefaelle-bearbeiten": "\nGefaellestrecke bearbeiten: %1", - "cmd-variofoerderer-bearbeiten": "\nVarioFoerderer bearbeiten: %1", - "gf-edit-kein-gf": "Block %1 ist keine Gefaellestrecke.", - "gf-edit-nur-einfach": "Nur einfache Gefaellestrecken (ohne Bogen) koennen ueber den Dialog bearbeitet werden.\nTYP: %1", - "gf-edit-neu-aufgebaut": "\nGefaellestrecke %1 neu aufgebaut.", - "gf-vf-modul-fehlt": "VarioFoerderer-Modul nicht geladen!", - "gf-vf-gebaut": "\n-> Paralleler VarioFoerderer gebaut (2000 mm neben der Gefaellestrecke, gegenlaeufig, steigend).", - "cmd-omniflo-bearbeiten": "\nOmniflo Element bearbeiten: %1", - "cmd-attribute-bearbeiten": "\nAttribute bearbeiten: %1", - "ils-station-prompt-punkt": "\nEinfuegepunkt fuer %1 [ENTER=Ende]: ", - "ils-station-fehler-blockdatei": "\n>>> FEHLER: Blockdatei '%1.dwg' nicht gefunden (data/ils pruefen).", - "ils-station-fertig": "\n>>> %1 x %2 eingefuegt.", - "layer-prompt-ziel-layer": "\nObjekt auf dem Ziel-Layer waehlen: ", - "layer-prompt-objekt": "\nObjekt waehlen: ", - "layer-prompt-referenz-objekt": "\nReferenz-Objekt waehlen (bestimmt Typ und Layer): ", - "layer-prompt-typ-ermittlung": "\nNochmals fuer Typ-Ermittlung anklicken: ", - "layer-prompt-ausblenden": "\nLayer zum Ausblenden anklicken (Enter=Ende): ", - "layer-prompt-einfrieren": "\nLayer zum Einfrieren anklicken (Enter=Ende): ", - "layer-prompt-aktiv-bleibt": "\nObjekt auf dem Layer waehlen, der AKTIV bleibt: ", - "layer-prompt-name-loeschen": "\nLayername zum Loeschen: ", - "layer-err-kein-objekt": "Kein Objekt gewaehlt.", - "layer-err-kein-ziel-layer": "Kein Ziel-Layer gewaehlt.", - "layer-err-kein-ziel-layer-kurz": "Kein Ziel-Layer.", - "layer-err-keine-passenden-objekte": "Keine passenden Objekte gefunden.", - "layer-abgebrochen": "Abgebrochen.", - "layer-err-kein-referenz-objekt": "Kein Referenz-Objekt gewaehlt.", - "layer-err-aktiv-nicht-ausschalten": "Aktiven Layer nicht ausschalten!", - "layer-err-aktiv-nicht-einfrieren": "Aktiven Layer nicht einfrieren!", - "layer-aktiver-layer": "\nAktiver Layer: %1", - "layer-objekt-auf-layer": "\nObjekt liegt auf Layer: %1", - "layer-nur-layer-sichtbar": "\nNur Layer '%1' ist sichtbar.", - "layer-geloescht": "\nLayer '%1' geloescht.", - "layer-leerer-geloescht": "\nLeerer Layer '%1' geloescht.", - "layer-existiert-nicht": "Layer '%1' existiert nicht.", - "layer-ques-typ-wechseln": "Layer dieser %1-Objekte wechseln?", - "layer-ques-alle-loeschen": "Alle Objekte auf Layer '%1' loeschen?", - "core-start-titel": "\n***** %1 *****\n", - "core-errhan-fehler": "\nFehler: ", - "core-blockname-exists": "Blockname '%1' existiert bereits - wird uebersprungen.", - "core-dwg-not-found": "\nFEHLER: Block nicht gefunden: %1", - "exp-cfg-not-found": "\n[export] WARNUNG: %1 nicht gefunden/leer, verwende Vorgaben.", - "exp-check-ids": "\n[%1] Pruefe und vergebe IDs...", - "exp-update-hoehe-drehung": "\n[%1] Aktualisiere Hoehe/Drehung...", - "exp-collect-blocks": "\n[%1] Sammle relevante Bloecke...", - "exp-no-blocks-found": "\n[%1] Keine relevanten Bloecke gefunden.", - "exp-blocks-found": "\n[%1] %2 Bloecke gefunden.", - "exp-output-dir": "\n[%1] Ausgabeordner: %2", - "exp-file-open-error": "\n[%1] FEHLER: Kann Datei nicht oeffnen: %2", - "exp-json-written": "\n[%1] JSON geschrieben: %2", - "exp-calling-python": "\n[%1] Rufe Python auf...", - "exp-export-started": "\n[%1] Export gestartet: %2", - "exp-dxfm-lib-missing": "\n[%1] FEHLER: Umgebungsvariable DXFM_LIB ist nicht gesetzt - BricsCAD wurde vermutlich nicht ueber bin/start_briscad.bat gestartet. CSV/JSON wurden geschrieben, der Python-Aufruf entfaellt.", - "exp-python-not-found": "\n[%1] FEHLER: Python-Skript nicht gefunden: %2", - "exp-python-exe": "\n[%1] Interpreter: %2", - "exp-export-done": "\n[%1] Export fertig: %2", - "exp-python-call-failed": "\n[%1] FEHLER: Python konnte nicht gestartet werden (WScript.Shell nicht verfuegbar).", - "exp-python-error": "\n[%1] FEHLER: Python endete mit Exitcode %2. Log: %3", - "exp-python-store-hint": "\n HINWEIS: Es wurde kein echter Python-Interpreter gefunden ('python' zeigt\n unter Windows 11 auf den WindowsApps-Platzhalter). Loesung: bin/install_py.bat\n ausfuehren (legt .venv an) und BricsCAD ueber bin/start_briscad.bat neu\n starten, oder in cfg/export.cfg unter [python] interpreter= den vollen Pfad\n zur python.exe setzen.", - "exp-csv-missing": "\n[%1] FEHLER: Python meldete Erfolg, aber die CSV fehlt: %2. Log: %3", - "exp-omni-no-inserts": "\n[OMNI_UPDATE] Keine INSERT-Bloecke in der Zeichnung.", - "exp-omni-updated": "\n[OMNI_UPDATE] %1 Elemente aktualisiert (HOEHE, DREHUNG).", - "id-new-assigned": "\n[ID] Neue ID zugewiesen: %1", - "id-invalid-block": "\n[ID] FEHLER: Kein gueltiger INSERT-Block!", - "id-check-no-blocks": "\n[IDSCHECK] Keine relevanten Bloecke gefunden.", - "id-check-missing-set": "\n[IDSCHECK] Fehlende ID gesetzt: %1 (Block %2)", - "id-check-duplicate": "\n[IDSCHECK] Duplikat ID %1 -> neue ID %2 (Block %3)", - "id-check-done": "\n[IDSCHECK] Fertig. %1 Duplikate korrigiert.", - "id-check-corrected": "\n[IDSCHECK] %1 IDs korrigiert.", - "id-select-block-prompt": "\nBlock waehlen: ", - "id-generate-invalid": "\n[IDGENERATE] Kein gueltiger Block gewaehlt.", - "dialog-nicht-verfuegbar": "Dialog nicht verfuegbar.", - "dialog-einfuegepunkt-waehlen": "\nEinfuegepunkt waehlen: ", - "extcall-python-rueckgabe": "\n[SSG_LIB] Python Rueckgabe: %1", - "extcall-keine-rueckgabe": "\n[SSG_LIB] WARNUNG: Keine Rueckgabe von Python erhalten.", - "extcall-skript-nicht-gefunden": "\n[SSG_LIB] FEHLER: %1 nicht gefunden!", - "vfstart-core-nicht-gefunden": "\n[VarioFoerderer] WARNUNG: vf_core.lsp nicht gefunden - Befehle nicht verfuegbar.", - "vfstart-etage-core-nicht-gefunden": "\n[EtageVarioFoerderer] WARNUNG: vf_core.lsp nicht gefunden - Befehle nicht verfuegbar.", - "gf-seite-aus-header": "\n\nAUS-Element (AS_Element_*) - Seite waehlen:", - "gf-seite-ein-header": "\n\nEIN-Element (ES_Element_*) - Seite waehlen:", - "gf-seite-links": "\n 1 - Links", - "gf-seite-rechts": "\n 2 - Rechts", - "prompt-wahl-1-2": "\nIhre Wahl (1/2) [1]: ", - "prompt-wahl-1-2-3": "\nIhre Wahl (1/2/3) [1]: ", - "geruest-typ-header": "\n\nGeruestoption waehlen:", - "geruest-typ-opt": "\n %1 - %2", - "geruest-typ-prompt": "\nGeruestoption (1-4) [%1]: ", - "kreisel-eckrad-geruest-frage": "Geruest fuer Einzelmodul?", - "gf-lade-block": "\n Lade Block: %1 ...", - "gf-status-ok": " OK", - "gf-warnung-kette-unterbrochen": "\n WARNUNG: Kette unterbrochen!", - "gf-status-nennlaenge": "\n Gesamte Nennlaenge (inkl. Bogen-dx): %1 mm", - "gf-status-feste-hoehenanteile": "\n Feste Hoehenanteile (AS/ES-dz + Bogen-dz): %1 mm", - "gf-status-dz-detail": "\n aus-dz=%1 ein-dz=%2 Bogen-dz=%3", - "gf-status-resthoehe": "\n Effektive Resthoehe fuer Grade: %1 mm", - "gf-warnung-keine-geraden": "\n WARNUNG: keine geraden Strecken -> Fallback 3 Grad", - "gf-warnung-feste-anteile": "\n WARNUNG: feste Anteile > deltaH -> Fallback 1 Grad", - "gf-status-naeherungswinkel": "\n>>> Naeherungswinkel: %1%2", - "gf-status-linie-staustrecke": "\n\n%1/%2: Staustrecke L=%3 mm hz=%4%5 v=%6%7", - "gf-status-separator-vor-bogen": "\n\n%1S/%2: Separator 300mm (vor Bogen) hz=%3%4 v=%5%6", - "gf-status-bogen-einfuegen": "\n\n%1/%2: %3 hz=%4%5", - "gf-status-linienzug-eingefuegt": "\n>>> Linienzug-Gefaellestrecke eingefuegt! <<<", - "gf-modus3-header": "\n\n>>> MODUS 3: Linienzug auswaehlen <<<", - "gf-modus3-hinweis1": "\nBitte alle Linien (LINE) und Boegen (ARC) des Pfades auswaehlen,", - "gf-modus3-hinweis2": "\ndann ENTER druecken:", - "gf-fehler-keine-objekte": "\nKeine Objekte ausgewaehlt!", - "gf-status-objekte-ausgewaehlt": "\n %1 Objekte ausgewaehlt.", - "gf-prompt-startpunkt-kette": "\nStartpunkt (3D) waehlen - KS_EIN AUS-Element / Kettenanfang: ", - "gf-fehler-kein-startpunkt": "\nKein Startpunkt!", - "gf-prompt-endpunkt-kette": "\nEndpunkt (3D) waehlen - KS_AUS EIN-Element / Kettenende: ", - "gf-fehler-kein-endpunkt": "\nKein Endpunkt!", - "gf-status-deltah-3dpunkte": "\n %1H aus 3D-Punkten: %2 mm", - "gf-status-sortiere-segmente": "\n Sortiere Segmente ...", - "gf-alert-keine-kette": "Keine verbundene Kette gefunden!", - "gf-status-segmente-gefunden": " %1 Segmente gefunden.", - "gf-status-segment-analyse-header": "\n\n--- Segment-Analyse (Laengen nach Kuerzung) ---", - "gf-status-segment-linie": "\n %1. Linie L=%2 mm hz=%3%4", - "gf-status-segment-bogen": "\n %1. Bogen %2%3 %4 hz-Eingang=%5%6", - "gf-status-seg-erste-linie": "\n Seg %1 (1. Linie): -%2 mm (AUS-Element)", - "gf-status-linie-vor-bogen": "\n Jede Linie vor Bogen: -300 mm (Bogen-Separator)", - "gf-status-seg-letzte-linie": "\n Seg %1 (letzte Linie): -300 mm (EIN-Sep) -%2 mm (EIN-Element)", - "gf-status-eintrittsrichtung": "\n Eintrittsrichtung: %1%2", - "gf-status-austrittsrichtung": "\n Austrittsrichtung: %1%2", - "gf-status-berechne-winkel": "\n\n Berechne Gefaellewinkel aus Geometrie ...", - "gf-prompt-winkel-verwenden": "\nBerechneten Winkel %1%2 verwenden? (j/n) [j]: ", - "gf-prompt-gefaellewinkel": "\nGefaellewinkel (Grad): ", - "gf-status-messe-absenkung": "\n Messe tatsaechliche AS/ES-Absenkung (iterativ) ...", - "gf-warnung-korrektur-bereich": "\n WARNUNG: Korrektur ausserhalb Bereich, Winkel unveraendert", - "gf-status-as-es-mm": "\n AS: %1 mm ES: %2 mm", - "gf-status-korrigierter-winkel": "\n>>> Korrigierter Gefaellewinkel: %1%2 (nach %3 Iter.)", - "gf-status-zus-segmente": "\n>>> Segmente: %1", - "gf-status-zus-deltah": "\n>>> %1H: %2 mm", - "gf-status-zus-deltal": "\n>>> %1L: %2 mm", - "gf-status-zus-winkel": "\n>>> Gefaellewinkel: %1%2", - "gf-status-zus-eintrittswinkel": "\n>>> Eintrittswinkel: %1%2", - "gf-status-zus-austrittswinkel": "\n>>> Austrittswinkel: %1%2", - "gf-status-zus-aus-element": "\n>>> AUS-Element: %1", - "gf-status-zus-ein-element": "\n>>> EIN-Element: %1", - "gf-prompt-einfuegen": "\nEinfuegen? (1=Ja / 2=Nein) [1]: ", - "gf-status-aus-element-detail": "\n\n>>> AUS-Element: %1 Fahrtrichtung=%2%3 KS_EIN-hz=%4%5 Z=%6", - "gf-status-separator-vor-ein": "\n>>> Separator vor EIN-Element", - "gf-status-ein-element-detail": "\n>>> EIN-Element: %1 Ziel-Z=%2", - "gf-status-z-hoehe-ks-aus": "\n Z-Hoehe KS_AUS: %1 mm", - "gf-status-fertig": "\n>>> Fertig! <<<", - "gf-status-abgebrochen": "\nAbgebrochen.", - "gf-alert-dialog-fehlt": "Dialog-Datei nicht gefunden:\n%1", - "gf-dlg-richtung-0": "0%1 (X+, Ost)", - "gf-dlg-richtung-90": "90%1 (Y+, Nord)", - "gf-dlg-richtung-180": "180%1 (X-, West)", - "gf-dlg-richtung-270": "270%1 (Y-, Sued)", - "gf-dlg-links": "Links", - "gf-dlg-rechts": "Rechts", - "gf-status-gf-block-erstellt": "\n>>> GF-Block erstellt: %1 (%2)", - "gf-status-schritt1-aus": "\n\n1/4: %1 Fahrtrichtung=%2%3 KS_EIN-hz=%4%5 v=%6%7", - "gf-status-schritt2-staustrecke": "\n\n2/4: Staustrecke L=%1 mm hz=%2%3 v=%4%5", - "gf-status-schritt3-separator": "\n\n3/4: Separator 300mm hz=%1%2 v=%3%4", - "gf-status-schritt4-ein": "\n\n4/4: %1", - "gf-status-erfolgreich-eingefuegt": "\n>>> Gefaellestrecke erfolgreich eingefuegt! <<<", - "gf-banner-titel": "\n GEFAELLESTRECKE GENERATOR v2.0", - "gf-banner-richtung": "\n Richtung: immer AB (nach unten)", - "gf-alert-init-fehler": "Fehler beim Initialisieren der Bibliothek!\nBitte DXFM_DATA pruefen.", - "gf-eingabemodus-header": "\n\nEingabemodus waehlen:", - "gf-eingabemodus-1": "\n 1 - Werte manuell eingeben (einfache Strecke)", - "gf-eingabemodus-2": "\n 2 - 3D-Linie auswaehlen (einfache Strecke)", - "gf-eingabemodus-3": "\n 3 - Linienzug (LINE + ARC) auswaehlen mit Gefaellebogen", - "gf-modus1-header": "\n\n>>> MODUS 1: Manuelle Werteingabe <<<", - "gf-prompt-startpunkt-aus": "\nStartpunkt fuer AUS-Element waehlen: ", - "gf-prompt-deltal-abstand": "\n%1L - Abstand (mm): ", - "gf-modus2-header": "\n\n>>> MODUS 2: 3D-Linie auswaehlen <<<", - "gf-status-bks-welt": "\n BKS auf Weltkoordinaten gesetzt.", - "gf-prompt-3dlinie-richtung": "\nBitte 3D-Linie fuer Richtung und Laenge auswaehlen:", - "gf-alert-keine-linie": "Keine gueltige Linie ausgewaehlt!", - "gf-status-fahrtrichtung-linie": "\n Fahrtrichtung: %1%2 (aus Linie)", - "gf-status-deltal-mm": "\n %1L = %2 mm", - "gf-prompt-gefaellewinkel-def3": "\n\nGefaellewinkel (Grad) [3]: ", - "gf-status-winkel": "\n>>> Winkel: %1%2", - "gf-status-fahrtrichtung": "\n>>> Fahrtrichtung: %1%2", - "gf-alert-staustrecke-ungueltig": "Berechnete Staustreckenlaenge ungueltig: %1 mm\nBitte groesseres deltaL oder kleineren Winkel waehlen.", - "gf-status-zus2-winkel": "\n>>> Winkel: %1%2", - "gf-status-zus2-aus-seite": "\n>>> AUS-Seite: %1", - "gf-status-zus2-ein-seite": "\n>>> EIN-Seite: %1", - "gf-status-zus2-lstau": "\n>>> L_stau: %1 mm", - "ques-yn-default-yes": " Y/N : ", - "ques-yn-default-no": " Y/N : ", - "tefl-fehler-dxfm-omniflo": "\n[TEF] FEHLER: DXFM_OMNIFLO nicht gesetzt (bin/setenv.bat ausfuehren).", - "tefl-fehler-dxf-nicht-gefunden": "\n[TEF] FEHLER: Element-DXF nicht gefunden: %1", - "tefl-prompt-startpunkt": "\nStartpunkt der Foerderstrecke waehlen: ", - "tefl-prompt-endpunkt": "\nEndpunkt der Foerderstrecke waehlen: ", - "tefl-abgebrochen": "\n[TEF] Abgebrochen.", - "tefl-fehler-laenge-null": "\n[TEF] FEHLER: Start- und Endpunkt liegen zu nah beieinander.", - "tefl-fertig": "\n[TEF] %1 Element(e) eingefuegt, Streckenlaenge=%2 mm.", - "vfl-kette-titel": "\n Vario_Kette_Merge - mehrere Vario-Foerderer-Bausteine (einzeln oder bereits gewickelt) zu einem Gesamt-Block verschmelzen", - "vfl-kette-start-waehlen": "\n\nStart-Baustein der Kette waehlen (erstes Element - AS-Element oder VF_n): ", - "vfl-kette-kein-objekt": "\nKein Objekt gewaehlt - Abbruch.", - "vfl-kette-kein-vf-block": "\nGewaehltes Objekt ('%1') ist kein bekannter Vario-Kette-Baustein (AS-/ES-Element, GF-Bogen, Vario-Kurve, Umlenk-/Motorstation, Vertikalbogen, Staustrecke/Separator oder VF_n).", - "vfl-kette-start-nicht-gefunden": "\nFEHLER: Start-Baustein nicht in der Ketten-Erfassung gefunden (interner Fehler).", - "vfl-kette-start-nicht-gefunden-diag": "\nFEHLER: Start-Baustein nicht in der Ketten-Erfassung gefunden (interner Fehler).\n Diagnose: %1 Bausteine insgesamt erfasst, gewaehlter Blockname='%2', davon %3 mit gleichem Blocknamen erfasst.", - "vfl-kette-start-ohne-ks-ein": "\nFEHLER: Am gewaehlten Baustein konnte kein KS_EIN gefunden werden - Kette kann nicht verfolgt werden.", - "vfl-kette-nur-ein-baustein": "\nAb dem gewaehlten Baustein wurde kein weiterer angeschlossener VF_n-Baustein gefunden - nichts zum Zusammenfuehren.", - "vfl-kette-gefunden": "\n\nKette erkannt: %1 Baustein(e) werden zusammengefuehrt:", - "vfl-kette-luecke-warnung": "\n\n WARNUNG: Nach '%1' wurde ein visuell nahes, aber nicht sauber verbundenes VF_n ('%2') gefunden (KS-Abstand %3 mm) - Kette wurde dort beendet, dieser und alle weiteren Bausteine bleiben unangetastet.", - "vfl-kette-fertig": "\n\n>>> Fertig: neuer Gesamt-Block '%1' aus %2 Baustein(en) erstellt.", - "cmd-tro-bearbeiten": "\nTRO-Marker bearbeiten: %1", - "cmd-connection-bearbeiten": "\nVerbindung bearbeiten: %1", - "con-keine-verbindung": "Block %1 ist keine Verbindung (erwartet CONNECTION_*).", - "con-kein-tro": "Block %1 ist kein TRO-Marker - Verbindungen gehen nur zwischen TROs.", - "con-block-fehlt": "Blockdefinition %1 fehlt in dieser Zeichnung.\nZuerst tro_annotate.py mit --flow laufen lassen.", - "con-quelle-waehlen": "\nQuell-TRO waehlen: ", - "con-ziel-waehlen": "\nZiel-TRO waehlen: ", - "con-gleicher-block": "Quelle und Ziel sind derselbe Block.", - "con-gleicher-punkt": "Quelle und Ziel liegen an derselben Stelle.", - "con-dialog-fehlt": "Dialogdatei nicht gefunden:\n%1\nDXFM_DCL pruefen (setenv.bat).", - "con-block": "Block: %1 (UID %2)", - "con-richtung": "Richtung: %1 ----> %2", - "con-hinweis": "Die UID ist dauerhaft, die TRO-Kennung darf sich aendern.", - "con-id-leer": "Quell- und Ziel-UID duerfen nicht leer sein - nichts geaendert.", - "con-gleiche-id": "Quelle und Ziel duerfen nicht dieselbe UID haben.", - "con-eingefuegt": "\nVerbindung %1 ----> %2 eingefuegt (UID %3).", - "con-gespeichert": "\nVerbindung gespeichert: %1 ----> %2", - "tro-edit-kein-tro": "Block %1 ist kein TRO-Marker (erwartet TRO_*).", - "tro-edit-kein-id-attribut": "Block %1 hat kein Attribut ID - bitte neu beschriften lassen (tro_annotate.py).", - "tro-edit-dialog-fehlt": "Dialogdatei nicht gefunden:\n%1\nDXFM_DCL pruefen (setenv.bat).", - "tro-edit-modul-fehlt": "%1 nicht geladen - Attribute werden mit EATTEDIT bearbeitet.", - "tro-edit-block": "Block: %1", - "tro-edit-fb": "Funktionsbaustein: %1 UID: %2", - "tro-edit-hinweis": "Symbol und FB folgen erst beim naechsten Lauf von tro_annotate.py.", - "tro-edit-id-leer": "Die TRO-Kennung darf nicht leer sein - nichts geaendert.", - "tro-edit-gespeichert": "\nTRO gespeichert: ID = %1, TYP = %2", - "tro-edit-typ-geaendert": "\nTyp geaendert - tro_annotate.py neu laufen lassen, damit Symbol und FB passen.", - "tro-insert-kein-typ": "Keine TRO-Typen verfuegbar (tro_types.lsp fehlt) - bitte lib/tro_annotate.py --emit-lisp ausfuehren.", - "tro-insert-hinweis": "Die Blockform muss bereits in der Zeichnung vorhanden sein (aus einem frueheren Lauf von tro_annotate.py).", - "tro-insert-kein-block": "Kein Symbol fuer diesen Typ in der Zeichnung (%1) - bitte tro_annotate.py mit diesem Typ laufen lassen.", - "tro-insert-prompt-punkt": "\nEinfuegepunkt: ", - "tro-insert-eingefuegt": "\nTRO eingefuegt: ID = %1, TYP = %2" - } + "texts": { + "omni-alle-winkel": "alle Winkel", + "omni-grad": " Grad", + "omni-bogen-keine-gefunden": "Keine Boegen fuer %1%2 gefunden.", + "omni-weiche-keine-gefunden": "Keine Weichen fuer %1%2 gefunden.", + "vfc-ursprung": "Ursprung", + "vfc-block-eingefuegt-xyzref-ksaus": "\n '%1' eingefuegt (XY:%2 Z:%3)\n KS_AUS: X=%4 Y=%5 Z=%6", + "vfl-ja": "\n 1 - Ja", + "vfl-nein": "\n 2 - Nein", + "vfl-sep-vor-frage": "\n\nZusaetzlichen Separator VOR dem horizontalen Stueck?", + "vfl-sep-nach-frage": "\n\nZusaetzlichen Separator NACH dem horizontalen Stueck?", + "vfl-sep-an-stelle-frage": "\n\nZusaetzlichen Separator an dieser Stelle einfuegen?", + "vf-winkel-aus-header": "\n\nAUS-Element (AS_Element) - Winkel waehlen:", + "vf-winkel-ein-header": "\n\nEIN-Element (ES_Element) - Winkel waehlen:", + "vf-winkel-90": "\n 1 - 90 Grad", + "vf-winkel-30": "\n 2 - 30 Grad", + "vfl-gf-bogen-winkel-header": "\n\nGF-Bogen - Winkel waehlen:", + "vfl-gf-bogen-seite-header": "\nGF-Bogen - Seite waehlen:", + "vfl-winkel-30": "\n 1 - 30 Grad", + "vfl-winkel-60": "\n 2 - 60 Grad", + "vfl-winkel-90": "\n 3 - 90 Grad", + "vfl-variokurve-winkel-header": "\n\nVario-Kurve - Winkel waehlen:", + "vfl-opt1-90grad": "\n 1 - 90 Grad", + "vfl-opt2-60grad": "\n 2 - 60 Grad", + "vfl-opt3-30grad": "\n 3 - 30 Grad", + "vfl-prompt-wahl-1-3-def1": "\nIhre Wahl (1/2/3) [1]: ", + "vfl-variokurve-seite-header": "\nVario-Kurve - Seite waehlen:", + "vfl-variokurve-variante-header": "\nVario-Kurve - Variante waehlen:", + "vfl-variante-aussen": "\n 1 - Aussen", + "vfl-variante-innen": "\n 2 - Innen", + "vfl-ist-ziel-vergleich-header": "\n\n>>> IST-ZIEL-VERGLEICH (ES-Element):", + "vfl-soll-xyz": "\n Soll: X=%1 Y=%2 Z=%3", + "vfl-ist-xyz": "\n Ist : X=%1 Y=%2 Z=%3", + "vfl-abweichung-xyz": "\n Abweichung: dX=%1 dY=%2 dZ=%3 mm", + "vfl-m3-titel": "\n VF-LINIENZUG - Modus 2: Pfad + Ziel-Hoehe (fertig; Anker + Solver + Bau)", + "vfl-m3-alert-gf-modul": "Gefaellestrecke-Modul nicht geladen!", + "vfl-m3-pfad-waehlen": "\n\nPfad-Objekte waehlen (Linien/Boegen):", + "vfl-m3-keine-objekte": "\nKeine Objekte gewaehlt - Abbruch.", + "vfl-m3-prompt-startpunkt": "\n\nStartpunkt der Kette (hoehere Seite) waehlen: ", + "vfl-prompt-hoehe-startpunkt": "\nHoehe (Z) des Startpunkts [%1]: ", + "vfl-m3-prompt-endpunkt": "\n\nEndpunkt der Kette (Ziel) waehlen: ", + "vfl-m3-prompt-zielhoehe": "\nZiel-Hoehe (Z) des Endpunkts [%1]: ", + "vfl-m3-fehler-nicht-sortierbar": "\nFEHLER: Pfad nicht sortierbar (haengt er lueckenlos zusammen?).", + "vfl-m3-alert-eckwinkel": "Kein passender Bogen: Eck-Winkel %1 Grad ist nicht ~30/60/90.\nBitte die Winkel anpassen.", + "vfl-m3-seg-gerade": "\n\nSegment %1/%2: Gerade L=%3 mm hz=%4", + "vfl-m3-auto-vf": "\n (automatisch VF - Segment folgt direkt auf eine Vario-Kurve)", + "vfl-m3-typ-gerade": "\n Typ? 1 = GF (Eingabe-Winkel) 2 = VF (Bruecke)", + "vfl-m3-prompt-gf-neigung": "\n GF-Neigung in Grad [3]: ", + "vfl-m3-hinweis-gf-max": "\n Hinweis: GF max. 3 Grad - auf 3 begrenzt.", + "vfl-m3-seg-bogen": "\n\nSegment %1/%2: Eck/Bogen %3 Grad %4", + "vfl-m3-typ-bogen": "\n Typ? 1 = GF-Bogen 2 = Vario-Kurve", + "vfl-m3-variante-frage": "\n Vario-Kurve - Variante? 1 = Aussen 2 = Innen", + "vfl-m3-vf-laeufe": "\n\n[M3a] Gefundene VF-Laeufe: %1", + "vfl-m3-vf-lauf-noetig": "\n[M3a] Genau EIN VF-Lauf noetig (GF...VF...GF; Vario-Kurven duerfen im Lauf liegen).", + "vfl-m3-vf-lauf-m3b": "\n[M3a] Mehrere/keine VF-Laeufe -> M3b spaeter.", + "vfl-m3-vf-lauf-ohne-gerade": "\n[M3a] VF-Lauf ohne VF-Gerade - Abbruch.", + "vfl-m3-anker-vorschau-header": "\n M3a ANKER-VORSCHAU (grob geschaetzt; exakte Werte beim Bau)", + "vfl-m3-start-hoehe": "\n Start-Hoehe Z: %1 mm", + "vfl-m3-ziel-hoehe": "\n Ziel-Hoehe Z: %1 mm", + "vfl-m3-delta-h-gesamt": "\n delta-H gesamt: %1 mm (positiv = Abfall)", + "vfl-m3-vf-lauf-segmente": "\n VF-Lauf: Segment %1..%2", + "vfl-m3-front-anker-vorschau": "\n Front-Anker Z: %1 mm (vorwaerts von AS)", + "vfl-m3-junction-anker-vorschau": "\n Junction-Anker Z: %1 mm (rueckwaerts von ES)", + "vfl-m3-richtung-auf": "Auf (steigt)", + "vfl-m3-richtung-ab": "Ab (faellt)", + "vfl-m3-richtung-horizontal": "horizontal", + "vfl-m3-richtung-auf-kurz": "Auf", + "vfl-m3-richtung-ab-kurz": "Ab", + "vfl-m3-bruecke-dh": "\n --> Bruecke: delta-H = %1 mm ueber Spannweite %2 mm", + "vfl-m3-bruecke-richtung": "\n Richtung: VF-%1", + "vfl-m3-vf-angetrieben": "\n (VF ist angetrieben - kann STEIGEN und FALLEN; Vorzeichen = nur Auf/Ab)", + "vfl-m3-mittlere-neigung": "\n grobe mittlere Neigung ueber Spannweite: ~%1 Grad", + "vfl-m3-warnung-zu-steil": "\n WARNUNG: ~Neigung > 51 Grad -> zu steil fuer Vario (Magnitude infeasibel).", + "vfl-m3-vario-bereich-ok": "\n -> innerhalb Vario-Bereich (3..51 Grad), grobe Orientierung.", + "vfl-m3-anker-hinweis": "\n (Anker oben = grobe Vorschau; exakte Werte werden beim Bau GEMESSEN)", + "vfl-m3-phase-b1": "\n\n>>> Phase B1: Front-Lauf (AS + GF) bauen ...", + "vfl-m3-alert-beginnt-bogen": "Kette beginnt mit einem Bogen - bitte erst eine Gerade.", + "vfl-m3-kurve-front-uebersprungen": "\n >>> [M3a] Vario-Kurve im Front-Lauf - uebersprungen.", + "vfl-m3-standard-vario-header": "\n\n --- STANDARD-VARIO (Kletter-Segment) + flache Zone ---", + "vfl-m3-front-anker-gemessen": "\n Front-Anker (gemessen): %1 mm", + "vfl-m3-junction-exakt": "\n Junction (exakt): %1 mm", + "vfl-m3-kletter-info": "\n Kletterhoehe %1 mm | Kletterer %2 | Kurven %3 | kurze VF %4", + "vfl-m3-kein-winkel": "\n KEIN passender Vario-Winkel -> infeasibel (Front bereits gebaut).", + "vfl-m3-gf-verteilung": "\n\n GF-Verteilung: 1 - alles am Einlauf (GF1) 2 - 1/2 GF1 + 1/2 GF2", + "vfl-m3-vert-halb": "1/2 GF1 + 1/2 GF2", + "vfl-m3-vert-ganz": "alles GF1", + "vfl-m3-vario-ergebnis": "\n -> Vario %1 (%2), L_VF %3 mm, GF gesamt %4 mm, Verteilung %5 (GF2-Rest = Mess-Feinkorrektur)", + "vfl-m3-warnung-gf2-negativ": "\n WARNUNG: Koerper klettert zu wenig - GF2<0 (fehlen %1 mm). Winkel zu flach; dZ nicht exakt.", + "vfl-m3-gf2-ausgleich": "\n GF2 (gemessener Ausgleich): L=%1 mm", + "vfl-m3-kurve-back-uebersprungen": "\n >>> [M3a] Vario-Kurve im Back-Lauf - uebersprungen.", + "vfl-m3-nichts-gebaut": "\nNichts gebaut - Abbruch.", + "vfl-m3-fertig-header": "\n>>> VF-Linienzug (Modus 2) gebaut! <<<", + "vfl-m3-ziel-soll": "\n Ziel (Soll): X=%1 Y=%2 Z=%3", + "vfl-m3-es-ist": "\n ES (Ist): X=%1 Y=%2 Z=%3", + "vfl-m3-abweichung": "\n Abweichung: dX=%1 dY=%2 dZ=%3 mm", + "vfl-m3-laengs-quer": "\n Laengs KS_AUS-Achse: %1 mm | Quer zur Achse (soll ~0): %2 mm", + "vfl-m3-achse-hinweis": "\n (dZ=Ziel-Hoehe; Quer zur KS_AUS-Achse ~0 => Endpunkt liegt auf der Achse)", + "gf-fehler-block-fehlt": "\n FEHLER: Block '%1' fehlt", + "gf-fehler-block-fehlt-ausruf": "\n FEHLER: Block '%1' fehlt!", + "gf-fehler-blockdatei-fehlt": "\n FEHLER: Block-Datei nicht gefunden: %1", + "gf-fehler-keine-linie": "\n Fehler: keine Linie!", + "gf-laenge-null-uebersprungen": "\n (Laenge 0 - uebersprungen)", + "gf-prompt-linie-waehlen": "\n >> Linie waehlen: ", + "gf-status-3dlinie-z": "\n 3D-Linie: Z_start=%1 Z_end=%2", + "gf-status-block-l-z": "\n %1 L=%2 -> Z=%3", + "gf-status-bogen-masse": "\n %1: dx=%2 dz=%3", + "gf-status-gefaellebogen": "\n Gefaellebogen %1 hz=%2%3 -> Z=%4", + "gf-status-hzincl": "\n HzIncl %1 L=%2 hz=%3%4 v=%5%6 -> Z=%7", + "gf-status-hzks": "\n HzKS %1 hz=%2%3 v=%4%5 -> Z=%6", + "gf-status-ks-aus-z": "\n KS_AUS Z=%1", + "gf-warnung-block-fehlt-nullwerte": "\n WARNUNG: %1 fehlt - Nullwerte", + "gf-warnung-ks-fehlt": "\n WARNUNG: KS_EIN/KS_AUS fehlt!", + "gf-warnung-ks-fehlt-in": "\n WARNUNG: KS fehlt in '%1'", + "gf-warnung-ks-fehlt-in2": "\n WARNUNG: KS fehlt in %1", + "kreisel-abstand-ausgabe": "\n-> Abstand: %1 mm", + "kreisel-beschriftung-erzeugt": "\n-> Beschriftung: %1 (Höhe=%2mm, Arial, zentriert)", + "kreisel-bestehende-blockdef": "\n-> Verwende bestehende Blockdefinition: %1", + "kreisel-connect-zusammenfassung": "\n-> Abstand: %1 mm Rotation: %2 Grad Hoehe: %3 Kreiselart: %4", + "kreisel-eckrad-eingefuegt": "\n-> Eckrad #%1 eingefuegt: %2 bei %3,%4 Rotation=%5 Hoehe=%6", + "kreisel-edit-aktualisiert": "\nKreisel aktualisiert: Name=%1 Abstand=%2 Hoehe=%3 Rotation=%4", + "kreisel-edit-bestehend": "\n-> Bestehend: Abstand=%1 Drehung=%2 Art=%3", + "kreisel-edit-dialog-fehlt": "Dialog nicht verfuegbar: %1", + "kreisel-eingefuegt": "\n-> Kreisel #%1 eingefügt: %2 (Höhe=%3)", + "kreisel-emsg-distanz-klein": "Distanz zu klein! (%1 < %2)", + "kreisel-hoehe-aus-3dpunkt": "\n-> Hoehe aus 3D-Punkt uebernommen: %1", + "kreisel-hoehe-aus-basispunkt": "\n-> Höhe aus Basispunkt übernommen: %1", + "kreisel-hoehe-aus-startpunkt": "\n-> Hoehe aus Startpunkt uebernommen: %1", + "kreisel-hoehe-von-bestehendem": "\n-> Höhe von bestehendem Kreisel übernommen: %1", + "kreisel-insert-zusammenfassung": "\n-> Rotation: %1 Höhe: %2 Kreiselart: %3", + "kreisel-labelsetup-fertig": "\nNeue Einstellungen: Höhe=%1, Farbe=%2, Y-Versatz=%3, Schriftart=Arial", + "kreisel-neue-beschriftungsposition": "\nNeue Beschriftungsposition: X=%1 Y=%2", + "kreisel-neue-blockdef": "\n-> Neue Blockdefinition: %1", + "kreisel-neue-texthoehe": "\nNeue Texthöhe: %1", + "kreisel-params-default-hoehe": "\nDefault-Höhe: %1", + "kreisel-params-default-laenge": "\nDefault-Laenge: %1", + "kreisel-params-durchmesser": "\nDurchmesser: %1", + "kreisel-params-typ": "\nKreiselart: %1", + "kreisel-prompt-abstand": "\nAbstand (Tangentenlaenge) <%1>: ", + "kreisel-prompt-abstand-oben": "\nAbstand über Kreisel-Mitte <%1>: ", + "kreisel-prompt-hoehe-z": "\nHoehe (Z-Koordinate) <%1>: ", + "kreisel-prompt-neue-hoehe": "\nNeue Höhe <%1>: ", + "kreisel-prompt-neuer-abstand": "\nNeuer Abstand <%1>: ", + "kreisel-prompt-schriftfarbe": "\nSchriftfarbe (1=Rot,2=Gelb,3=Grün,4=Cyan,5=Blau,6=Magenta,7=Weiß) <%1>: ", + "kreisel-prompt-schrifthoehe": "\nSchrifthöhe <%1>: ", + "kreisel-prompt-texthoehe": "\nTexthöhe <%1>: ", + "kreisel-prompt-x-abstand": "\nX-Abstand von AN8-Mitte <%1>: ", + "kreisel-prompt-y-abstand": "\nY-Abstand von AN8-Mitte <%1>: ", + "kreisel-redraw-bestehend": "\n-> Bestehend: Abstand=%1 Drehung=%2 Hoehe=%3 Art=%4", + "kreisel-redraw-fertig": "\nKreisel neu gezeichnet. Abstand=%1", + "kreisel-script-distanz-klein": "\n[Connect] Distanz zu klein: %1", + "kreisel-textstil-erstellt": "\n-> Textstil '%1' mit Arial erstellt", + "kreisel-typ-prompt": "\nBitte waehlen <%1>: ", + "omni-bogen-info-antriebsart": "\n Antriebsart: %1", + "omni-bogen-info-breite": "\n Breite: %1", + "omni-bogen-info-kurvenwinkel": "\n KurvenWinkel: %1", + "omni-bogen-info-laenge": "\n Laenge: %1", + "omni-bogen-info-profiltyp": "\n ProfilTyp: %1", + "omni-bogen-info-radius": "\n Radius: %1", + "omni-bogen-nicht-gefunden": "\nKein Bogen mit SivasId '%1' gefunden.", + "omni-dxf-eingefuegt": "\n[OMNI] %1 eingefuegt. Hoehe=%2 Drehung=%3%4", + "omni-edit-aktualisiert": "\n[OMNI] Element aktualisiert: %1 Hoehe=%2 Drehung=%3", + "omni-edit-dxf-nicht-gefunden": "DXF nicht gefunden: %1", + "omni-einfuegen-info": "\n[OMNI] Einfuegen: %1 (%2)", + "omni-fehler-dxf-nicht-gefunden": "\n[OMNI] FEHLER: DXF nicht gefunden: %1", + "omni-insert-block-eingefuegt": "\n[OMNI] %1 eingefuegt. Laenge=%2 mm", + "omni-laenge-ueberschritten": "Die gewuenschte Fahrstreckenlaenge von %1 mm ueberschreitet die Maximallaenge von %2 mm des Fahrstreckenprofils.\nBitte neu definieren!", + "omni-weiche-info-breite": "\n Breite: %1", + "omni-weiche-info-kurvenrichtung": "\n KurvenRichtung: %1", + "omni-weiche-info-kurvenwinkel": "\n KurvenWinkel: %1", + "omni-weiche-info-laenge": "\n Laenge: %1", + "omni-weiche-info-profiltyp": "\n ProfilTyp: %1", + "omni-weiche-info-schaltungstyp": "\n Schaltungstyp: %1", + "omni-weiche-info-weichentyp": "\n WeichenTyp: %1", + "omni-weiche-info-wklaenge": "\n WK-Laenge: %1", + "omni-weiche-nicht-gefunden": "\nKeine Weiche mit SivasId '%1' gefunden.", + "vfc-3dlinie-start-ende": "\n 3D-Linie:\n Start: X=%1 Y=%2 Z=%3\n Ende: X=%4 Y=%5 Z=%6", + "vfc-3dpolylinie-start-ende": "\n 3D-Polylinie:\n Start Z=%1 Ende Z=%2", + "vfc-block-einfuegepunkt": "\n Block-Einfuegepunkt: X=%1 Y=%2 Z=%3", + "vfc-block-eingefuegt-ksaus": "\n '%1' eingefuegt\n KS_AUS: X=%2 Y=%3 Z=%4", + "vfc-delta-l-h-richtung": "\n %1L=%2 mm %1H=%3 mm Fahrtrichtung=%4%5", + "vfc-endpunkt-xyz": "\n Endpunkt: X=%1 Y=%2 Z=%3", + "vfc-endpunkt-xyz-dxdz": "\n Endpunkt: X=%1 Y=%2 Z=%3 (dx=%4 dz=%5)", + "vfc-fahrtrichtung-ergebnis": "\n>>> Fahrtrichtung: %1%2", + "vfc-fehler-block-datei-fehlt": "\n FEHLER: Block-Datei nicht gefunden: %1", + "vfc-fehler-block-nicht-in-bibliothek": "\n FEHLER: Block '%1' nicht in Bibliothek", + "vfc-fehler-block-nicht-in-bibliothek-abgebrochen": "\n FEHLER: Block '%1' nicht in Bibliothek - abgebrochen", + "vfc-fehler-ks-fehlen": "\n FEHLER: KS_EIN/KS_AUS fehlen in '%1'", + "vfc-fehler-ungueltiger-einfuegepunkt": "\n FEHLER: Ungueltiger Einfuegepunkt fuer '%1'", + "vfc-fuege-block-ein-hz": "\n Fuege Block '%1' ein... (hz=%2%3)", + "vfc-fuege-block-ein-rotation-hz": "\n Fuege Block '%1' ein (Rotation %2%3 hz=%4%5)", + "vfc-fuege-ein-lwhz": "\n Fuege '%1' ein (L=%2 mm, W=%3%4 hz=%5%6)", + "vfc-ks-aus-xyz": "\n KS_AUS: X=%1 Y=%2 Z=%3", + "vfc-lade-block": "\n Lade Block: %1 ...", + "vfc-laenge-uebersprungen": "\n Laenge=%1 mm -> uebersprungen", + "vfc-punkt-auf-objekt": "\n Punkt auf Objekt: Z=%1 mm", + "vfe-as30-mass": "\n AS_30_rechts: dx=%1 mm, dz=%2 mm", + "vfe-block-fehlt-abbruch": "\n FEHLER: Block '%1' nicht in Bibliothek - abgebrochen", + "vfe-bogen-nicht-vorhanden": "\n %1 -> Bogen nicht vorhanden", + "vfe-delta-info": "\n△L=%1 mm △H=%2 mm Richtung=%3", + "vfe-empfohlener-winkel": "\n>>> Empfohlener Winkel: %1", + "vfe-es30-mass": "\n ES_30_rechts: dx=%1 mm, dz=%2 mm", + "vfe-extrahiere-block-mass": "\n Extrahiere %1 Masse...", + "vfe-gefaellebogen-links-mass": "\n Gefaellebogen links: dx=%1 dz=%2 mm", + "vfe-gefaellebogen-rechts-mass": "\n Gefaellebogen rechts: dx=%1 dz=%2 mm", + "vfe-gefaellebogen-seite-dx": "\n Gefaellebogen %1: dx=%2 mm", + "vfe-hz-incl-status": "\n HzIncl %1 L=%2 hz=%3 v=%4 -> Z=%5", + "vfe-hz-rot-status": "\n HzRot %1 hz=%2 v=%3 -> Z=%4", + "vfe-hz-rotks-status": "\n HzRotKS %1 hz=%2 -> Z=%3", + "vfe-hz-scaleks-status": "\n HzScaleKS %1 %2mm hz=%3 -> Z=%4", + "vfe-ks-fehlt-startpunkt": "\n WARNUNG: KS fehlt in '%1' - verwende Startpunkt", + "vfe-step1-as30": "\n\n1/15: %1 (0 Grad)", + "vfe-step2": "\n\n2/15: Staustrecke 400mm (%1 Grad hz, 3 Grad vert, KS_EIN)", + "vfe-step3": "\n\n3/15: Separator (300mm, %1 Grad hz, 3 Grad vert)", + "vfe-step4": "\n\n4/15: %1 (Anfang, %2 Grad hz, 0 Grad vert, KS_EIN)", + "vfe-step5-strecke": "\n\n5/15: Gefaellestrecke (3 Grad, L=%1 mm)", + "vfe-step7": "\n\n7/15: %1 (3 Grad geneigt)", + "vfe-step8-ab": "\n\n8/15: Gefaellestrecke (%1 Grad, L=%2 mm)", + "vfe-step8-auf": "\n\n8/15: Steigungsstrecke (%1 Grad, L=%2 mm)", + "vfe-tabelle-zeile": "\n %1 %2 mm %3 mm ", + "vfe-tabelle-zeile-fehler": "\n %1 --- --- FEHLER", + "vfl-20m-hinweis": "\n >>> HINWEIS: Foerderer laenger als 20 m (%1 m) - Motorstation empfohlen!", + "vfl-block-erstellt": "\n>>> Block '%1' (%2) erstellt und eingefuegt.", + "vfl-fehler-rest-nicht-baubar": "\n FEHLER: Rest nicht baubar (zu steil/zu kurz fuer Schwanz Motor+GF2+Separator+ES). Bitte weiter zeichnen oder flacher planen.", + "vfl-fuege-block-ein": "\n Fuege %1 ein ...", + "vfl-hinweis-gf2-minimum": "\n HINWEIS: berechnetes GF2=%1 mm < Minimum %2 mm -> auf Minimum angehoben (ES endet dadurch etwas weiter; siehe Ist-Ziel-Report).", + "vfl-horizontale-zwischenstrecke": "\n\nHorizontale Zwischenstrecke (0 Grad, L=%1 mm)", + "vfl-kettenende-modus-ziel": "\n>>> Kettenende-Modus: Ziel dL=%1 mm, dH=%2 mm (%3). GF2 variiert mit dem Winkel.", + "vfl-prompt-hoehe-endpunkt": "\nHoehe (Z) des Endpunkts [%1]: ", + "vfl-prompt-hoehe-kettenende": "\nHoehe (Z) des Kettenendes (ES-Element) [%1]: ", + "vfl-prompt-wahl-bis-n": "\nIhre Wahl (1-%1) [1]: ", + "vfl-segment-gf-nicht-erlaubt": "\n Segment waere GF (zu steil) oder nicht baubar - innerhalb einer VF-Einheit nicht erlaubt.\n Bitte flacher/steigend zeichnen oder Foerderer beenden.", + "vfl-winkel-option": "\n %1 - %2 Grad (L_GF=%3 mm L_VF=%4 mm)", + "vfs-as90-mass": "\n AS_90: dx=%1 dz=%2", + "vfs-berechnung-parameter": "\n△L=%1 mm △H=%2 mm Richtung=%3", + "vfs-block-fehlende-item": "\n - %1", + "vfs-block-fehler-pfad": "\n FEHLER: DXFM_BLOCKS = %1", + "vfs-bogen-ab-block-fehlt": "\n FEHLER ab_%1: Block nicht geladen!", + "vfs-bogen-ab-ks-fehlt": "\n FEHLER ab_%1: KS fehlt!", + "vfs-bogen-ab-ok": "\n OK ab_%1: dx=%2 dz=%3", + "vfs-bogen-auf-block-fehlt": "\n FEHLER auf_%1: Block nicht geladen!", + "vfs-bogen-auf-ks-fehlt": "\n FEHLER auf_%1: KS fehlt!", + "vfs-bogen-auf-ok": "\n OK auf_%1: dx=%2 dz=%3", + "vfs-empfohlener-winkel": "\n>>> Empfohlener Winkel: %1%2", + "vfs-es90-mass": "\n ES_90: dx=%1 dz=%2", + "vfs-fehler-winkel-tabelle": "\n FEHLER: Winkel %1 nicht in Bogen-Tabelle!", + "vfs-schritt-as": "\n\n1/11: %1 (hz=%2%3)", + "vfs-schritt5-bogen1": "\n\n5/11: %1 (3 Grad geneigt)", + "vfs-tabelle-zeile": "\n %1%2 %3 mm %4 mm ", + "vfs-tabelle-zeile-fehler": "\n %1%2 --- --- FEHLER", + "vfs-vf-eingang-gf1": "\n\n[VF-Eingang] Gefaellestrecke GF1 (3 Grad, L=%1 mm)", + "kreisel-abbruch-befehl": "\nBefehl abgebrochen.", + "kreisel-abgebrochen": "\nAbgebrochen.", + "kreisel-connect-erfolgreich": "\nKreisel Connect erfolgreich!", + "kreisel-connect-header": "\n--- Kreisel durch Linie definieren (AN -> SP) ---", + "kreisel-eckrad-beruehrpunkt": "\nBeruehrpunkt Eckrad (Tangente): ", + "kreisel-eckrad-fehler-identisch": "\nFehler: Beruehr- und Richtungspunkt sind identisch!", + "kreisel-eckrad-richtung": "\nRichtung zum Kreismittelpunkt: ", + "kreisel-emsg-kein-block": "Kein Block ausgewaehlt!", + "kreisel-emsg-kein-kreisel-block": "Kein Kreisel-Block! (Attribut ABSTAND fehlt)", + "kreisel-fehler-keine-entities": "\nFehler: Keine Entities zum Block erstellen!", + "kreisel-insert-fertig": "\nKreisel Modul eingefuegt.", + "kreisel-params-attribute-header": "\nAttribute im Block:", + "kreisel-params-header": "\n=== Kreisel Parameter ===", + "kreisel-prompt-basispunkt": "\nBasispunkt (AN-Seite): ", + "kreisel-prompt-block-auswaehlen": "\nKreisel-Block auswaehlen: ", + "kreisel-prompt-endpunkt": "\nEndpunkt (SP-Seite aussen): ", + "kreisel-prompt-rotation": "\nRotation in Grad <0>: ", + "kreisel-prompt-startpunkt": "\nStartpunkt (AN-Seite aussen): ", + "kreisel-quick-fertig": "\nSchnell Einfuegen fertig.", + "kreisel-start-connect": "Kreisel Smart Connect", + "kreisel-start-eckrad": "Eckrad einfuegen", + "kreisel-start-edit": "Kreisel bearbeiten", + "kreisel-start-insert": "Kreisel Modul einfuegen", + "kreisel-start-quick": "Kreisel Schnell Einfuegen", + "kreisel-start-redraw": "Kreisel Neu Zeichnen", + "kreisel-start-script-connect": "Kreisel Script Connect", + "kreisel-start-script-insert": "Kreisel Script Insert", + "kreisel-typ-opt-pin": "\n[2] PIN", + "kreisel-typ-opt-standard": "\n[1] STANDARD (ohne PIN)", + "kreisel-warn-blockpfad": "\n[KreiselInsert] WARNUNG: Block-Pfad nicht ermittelbar!", + "kreisel-warn-core-fehlt": "\n[KreiselInsert] WARNUNG: ssg_core.lsp nicht gefunden - Standardwerte.", + "omni-abbruch": "\nAbgebrochen.", + "omni-abbruch-bogen": "\n[BOGEN] Abgebrochen.", + "omni-abbruch-omni": "\n[OMNI] Abgebrochen.", + "omni-abbruch-weiche": "\n[WEICHE] Abgebrochen.", + "omni-bogen-dialog-ladefehler": "Bogen-Dialog konnte nicht geladen werden.", + "omni-edit-kein-block": "Kein Block ausgewaehlt!", + "omni-edit-kein-element": "Kein Omniflo-Element erkannt! (ARTINR/Blockname nicht im Katalog)", + "omni-edit-prompt-auswahl": "\nOmniflo-Element auswaehlen: ", + "omni-fehler-dxfm-data": "\n[OMNI] FEHLER: DXFM_DATA nicht gesetzt!", + "omni-fehler-dxfm-omniflo": "\n[OMNI] FEHLER: DXFM_OMNIFLO nicht gesetzt!", + "omni-info-bogen-prompt": "\nSivasId des Bogens eingeben: ", + "omni-info-weiche-prompt": "\nSivasId der Weiche eingeben: ", + "omni-insert-keine-attribute": "\n[OMNI] Keine Attribute im Quell-Block gefunden.", + "omni-prompt-drehwinkel": "\nDrehwinkel angeben: ", + "omni-prompt-einfuegepunkt": "\nEinfuegepunkt waehlen: ", + "omni-prompt-endpunkt-fahrstrecke": "\nEndpunkt der Fahrstrecke waehlen: ", + "omni-weiche-dialog-ladefehler": "Weichen-Dialog konnte nicht geladen werden.", + "prompt-wahl-1-2-3-4": "\nIhre Wahl (1/2/3/4) [1]: ", + "vfc-alert-keine-gueltige-linie": "Keine gueltige Linie ausgewaehlt!", + "vfc-bitte-3dlinie-foerderstrecke": "\nBitte 3D-Linie fuer die Foerderstrecke auswaehlen:", + "vfc-bks-weltkoordinaten": "\n BKS auf Weltkoordinaten gesetzt.", + "vfc-eingabemodus-3dlinie": "\n 1 - 3D-Linie auswaehlen (Start- und Endpunkt mit Hoehe)", + "vfc-eingabemodus-header": "\n\nEingabemodus waehlen:", + "vfc-eingabemodus-werte": "\n 2 - Werte manuell eingeben", + "vfc-fahrtrichtung-0": "\n 1 - 0%1 (X-Achse +, Ost)", + "vfc-fahrtrichtung-180": "\n 3 - 180%1 (X-Achse -, West)", + "vfc-fahrtrichtung-270": "\n 4 - 270%1 (Y-Achse -, Sued)", + "vfc-fahrtrichtung-90": "\n 2 - 90%1 (Y-Achse +, Nord)", + "vfc-fahrtrichtung-header": "\n\nFahrtrichtung waehlen:", + "vfc-fehler-keine-linie": "\n FEHLER: Keine Linie oder Polylinie ausgewaehlt!", + "vfc-foerderrichtung-ab": "\n Foerderrichtung: AB", + "vfc-foerderrichtung-auf": "Auf", + "vfc-foerderrichtung-menu": "\nFoerderrichtung:\n 1 - AUF\n 2 - AB", + "vfc-gf-verteilung-header": "\n\nVerteilung der Gefaellestrecken (vorne/hinten):", + "vfc-gf-verteilung-1": "\n 1 - Gleichmaessig (L_GF1 = L_GF2 = L_GF/2)", + "vfc-gf-verteilung-2": "\n 2 - Vorne Minimum, hinten Rest", + "vfc-gf-verteilung-3": "\n 3 - Hinten Minimum, vorne Rest", + "vfc-gf-verteilung-4": "\n 4 - Eigene Werte eingeben", + "vfc-kein-objekt-gewaehlt": "\n Kein Objekt gewaehlt.", + "vfc-label-von-bis": ": von %1mm bis %2mm, ", + "vfc-linie-polylinie-waehlen": "\n >> 3D-Linie oder Polylinie waehlen: ", + "vfc-modus-3dlinie-fallback": "Linie", + "vfc-modus-3dlinie-header": "\n\n>>> MODUS: 3D-Linie auswaehlen <<<", + "vfc-modus-werteingabe-header": "\n\n>>> MODUS: Manuelle Werteingabe <<<", + "vfc-objekt-block-waehlen": "\n >> Objekt (Block) waehlen: ", + "vfc-prompt-delta-h": "\n%1H - Hoehenunterschied (mm): ", + "vfc-prompt-delta-l": "\n%1L - Horizontale Distanz (mm): ", + "vfc-prompt-startpunkt-aus": "\nStartpunkt fuer AUS_Element waehlen: ", + "vfc-prompt-wahl-1-2-ohne-default": "\nIhre Wahl (1/2): ", + "vfc-status-ok": " OK", + "vfc-warnung-ks-nicht-gefunden": "\n WARNUNG: KS_EIN/KS_AUS nicht gefunden!", + "vfc-block-erstellt-eingefuegt": "\n>>> Block '%1' erstellt und eingefuegt.", + "vfc-fehler-keine-entities": "\n>>> FEHLER: Keine Entities fuer Block gefunden!", + "vfc-banner-titel": "\n VARIOFOERDERER GENERATOR v26.0", + "vfc-alert-keine-typen": "Keine Typen registriert!\nvf_standard.lsp und vf_etage.lsp pruefen.", + "vfc-typ-vorgewaehlt": "\n>>> Typ vorgewaehlt: %1", + "vfc-anlagen-typ-header": "\n\nAnlagen-Typ waehlen:", + "vfc-typ-option": "\n %1 - %2", + "vfc-prompt-wahl-1-n": "\nIhre Wahl (1-%1) [1]: ", + "vfc-typ-gewaehlt": "\n>>> Typ: %1", + "vfc-naechste-vf-nummer": "\n>>> Naechste VF-Nummer: VF%1", + "vfc-seite-header": "\n\nSeite waehlen:", + "vfc-seite-rechts": "\n 1 - Rechts", + "vfc-seite-links": "\n 2 - Links", + "vfc-seite-gewaehlt": "\n>>> Seite: %1", + "vfc-hinweis-horizontal-moeglich": "\n\n>>> Hinweis: Ein horizontale Variofoerderer ( 0%1) ist bei diesem %2L/%2H zusaetzlich moeglich!", + "vfc-alert-kein-winkel": "Kein passender Winkel gefunden!\n%1L=%2 mm, %1H=%3 mm, Richtung=%4", + "vfc-einzige-variante-horizontal": "\n\n>>> Einzige gueltige Variante: Horizontale Variofoerderer", + "vfc-einziger-winkel": "\n\n>>> Einziger gueltiger Winkel: %1%2", + "vfc-mehrere-winkel-header": "\n\nMehrere gueltige Winkel verfuegbar. Bitte waehlen:", + "vfc-winkel-option-horizontal": "\n %1 - Horizontale Variofoerderer (0%2) (L_GF=%3 mm, L_VF=%4 mm)", + "vfc-winkel-option": "\n %1 - %2%3 (L_GF=%4 mm, L_VF=%5 mm)", + "vfc-prompt-winkel-waehlen": "Winkel waehlen (1-%1) [1]: ", + "vfc-zus-horizontal": "\n>>> Horizontale Variofoerderer L_GF: %1 mm L_VF: %2 mm", + "vfc-zus-winkel": "\n>>> Winkel: %1%2 L_GF: %3 mm L_VF: %4 mm", + "vfc-prompt-lgf1-vorne": "\nL_GF1 vorne (mm) [%1]: ", + "vfc-lgf2-hinten": "\n L_GF2 hinten: %1 mm", + "vfc-zus-lgf": "\n>>> L_GF1=%1 mm L_GF2=%2 mm", + "vfc-einfuegen-frage": "\n\nMoechten Sie die Foerderanlage einfuegen?", + "vfc-einfuegen-optionen": "\n 1 - Ja, Module einfuegen\n 2 - Nein, abbrechen", + "vfc-vorgang-abgebrochen": "\nVorgang abgebrochen.", + "vfs-dlg-richtung-auf": "Auf", + "vfs-dlg-richtung-ab": "Ab", + "vfs-dlg-winkel-horizontal": "Horizontal (GF=%1 mm, VF=%2 mm)", + "vfs-dlg-winkel-option": "%1%2 (GF=%3 mm, VF=%4 mm)", + "vfs-dlg-verteilung-1": "Gleichmaessig (L_GF1 = L_GF2 = L_GF/2)", + "vfs-dlg-verteilung-2": "Vorne Minimum, hinten Rest", + "vfs-dlg-verteilung-3": "Hinten Minimum, vorne Rest", + "vfs-dlg-verteilung-4": "Eigene Werte eingeben", + "vfs-edit-kein-vf": "Block %1 ist keine VarioFoerderer-Strecke.", + "vfs-edit-keine-xdata": "VarioFoerderer %1 wurde nicht mit diesem Dialog erstellt (Etage/Linienzug/Altbestand) und kann hier nicht bearbeitet werden.", + "vfs-edit-neu-aufgebaut": "\nVarioFoerderer %1 neu aufgebaut.", + "vfe-alert-bib-nicht-init": "Etage-Bibliothek nicht initialisiert!", + "vfe-berechnung-header": "\n ETAGE-BERECHNUNG FUER ALLE WINKEL", + "vfe-bib-bereits-init": "\n Etage-Bibliothek bereits initialisiert.", + "vfe-bib-init-erfolg": "\n Etage-Bibliothek erfolgreich initialisiert.", + "vfe-bib-initialisiere": "\n Initialisiere Etage-Bibliothek...", + "vfe-ergebnistabelle-header": "\n ERGEBNISTABELLE (L_GF = gesamt beider GF-Strecken)", + "vfe-extrahiere-as30": "\n Extrahiere AS_30_rechts Masse...", + "vfe-extrahiere-es30": "\n Extrahiere ES_30_rechts Masse...", + "vfe-kein-winkel-gefunden": "\n>>> KEIN passender Winkel gefunden!", + "vfe-status-gueltig": "GUELTIG", + "vfe-status-ungueltig": "UNGUELTIG (negative Laenge)", + "vfe-step5-skip": "\n\n5/15: L_GF1 (uebersprungen)", + "vfe-step6": "\n\n6/15: Umlenkstation (500mm, 3 Grad geneigt)", + "vfe-step8-skip": "\n\n8/15: L_VF (uebersprungen)", + "vfe-tabelle-spalten": "\n Winkel L_GF (mm) L_VF (mm) Status", + "vfe-warn-block-as30-fehlt": "\n WARNUNG: Block AS_Element_30_rechts fehlt - Standardwerte", + "vfe-warn-block-es30-fehlt": "\n WARNUNG: Block ES_Element_30_rechts fehlt - Standardwerte", + "vfe-warn-block-fehlt-links": "\n WARNUNG: Block fehlt - Standardwerte (links)", + "vfe-warn-block-fehlt-rechts": "\n WARNUNG: Block fehlt - Standardwerte (rechts)", + "vfe-warn-kein-ks-links": "\n WARNUNG: kein KS - Standardwerte (links)", + "vfe-warn-kein-ks-rechts": "\n WARNUNG: kein KS - Standardwerte (rechts)", + "vfe-warn-ks-fehlt-standard": "\n WARNUNG: KS fehlt - Standardwerte", + "vfe-warn-lisp-pfad": "\n[vf_etage] WARNUNG: Lisp-Pfad nicht ermittelbar - vf_core.lsp nicht ladbar!", + "vfl-abgebrochen-kein-ziel": "\n Abgebrochen - kein Zielpunkt gewaehlt.", + "vfl-bogen-ab3-uebergang": "\n\nVario_Bogen_ab_3 (Uebergang horizontal -> 3 Grad)", + "vfl-bogen-auf3-uebergang": "\n\nVario_Bogen_auf_3 (Uebergang 3 Grad -> horizontal)", + "vfl-gf-verteilung-ganz-einlauf": "\n 2 - Gesamte Staustrecke am Einlauf (GF1), kein GF2", + "vfl-gf-verteilung-haelfte": "\n 1 - 1/2GF am Ausgang (GF2), 1/2GF am Einlauf (GF1)", + "vfl-gf-verteilung-header": "\n\nStaustrecke (GF) - Verteilung waehlen:", + "vfl-ist-endpunkt-frage": "\n\nIst der Endpunkt der Foerderer?", + "vfl-ist-kettenende-frage": "\n\nIst das das Kettenende (ES-Element)?", + "vfl-ja-motorstation-kettenende": "\n 3 - Ja (Motorstation setzen, Kettenende definieren)", + "vfl-ja-nur-motorstation": "\n 1 - Ja (nur Motorstation setzen)", + "vfl-ja-separator-es": "\n 1 - Ja (Separator + ES-Element setzen)", + "vfl-linie-zu-kurz-simple": "\n Linie zu kurz - uebersprungen.", + "vfl-linie-zu-kurz-uebersprungen": "\n Linie zu kurz (oder entgegen der Fahrtrichtung) - uebersprungen.", + "vfl-mehrere-winkel-header": "\n\nMehrere gueltige Winkel - bitte gewuenschten Winkel waehlen:", + "vfl-modus1-beschreibung": "\nGemischte Gefaellestrecke/VarioFoerderer-Kette entlang eines frei", + "vfl-modus1-header": "\n VF-LINIENZUG - Modus 1: Manuelle Eingabe", + "vfl-naechstes-element-vf": "\n\nNaechstes Element im VarioFoerderer:", + "vfl-nein-weiterbauen": "\n 2 - Nein (weiterbauen)", + "vfl-opt-auf-ab-foerderer": "\n 3 - Auf/Ab-Foerderer (Linie mit Hoehendifferenz)", + "vfl-opt-horizontaler-foerderer": "\n 1 - Horizontaler Foerderer (Linie ohne Hoehendifferenz)", + "vfl-opt-vario-kurve": "\n 2 - Vario-Kurve (30/60/90 Grad)", + "vfl-prompt-wahl-1-2-def2": "\nIhre Wahl (1/2) [2]: ", + "vfl-prompt-wahl-1-3-def2": "\nIhre Wahl (1/2/3) [2]: ", + "vfl-prompt-wahl-1-3-def3": "\nIhre Wahl (1/2/3) [3]: ", + "vfl-sep-horizontal-info": "\n [horizontal] Separator (300 mm, 0 Grad)", + "vfs-berechnung-header": "\n BERECHNUNG FUER ALLE WINKEL (Standard)", + "vfs-block-fehlende-header": "\n Folgende Block-Dateien fehlen:", + "vfs-ergebnistabelle-header": "\n ERGEBNISTABELLE", + "vfs-extrahiere-aus": "\n Extrahiere AUS_Element Masse...", + "vfs-extrahiere-bogen": "\n Extrahiere Bogen-Masse...", + "vfs-extrahiere-ein": "\n Extrahiere EIN_Element Masse...", + "vfs-fehler-block-as90": "\n FEHLER: Block AS_Element_90_links nicht geladen!", + "vfs-fehler-block-es90": "\n FEHLER: Block ES_Element_90_links nicht geladen!", + "vfs-fehler-ks-as90": "\n FEHLER: KS_EIN/KS_AUS fehlt im AS_90!", + "vfs-fehler-ks-es90": "\n FEHLER: KS_EIN/KS_AUS fehlt im ES_90!", + "vfs-fehler-lib-nicht-init": "\n FEHLER: Bibliothek nicht korrekt initialisiert (AUS/EIN-Masse fehlen)!", + "vfs-kein-winkel-gefunden": "\n>>> KEIN passender Winkel gefunden!", + "vfs-lib-bereits-init": "\n Standard-Bibliothek bereits initialisiert.", + "vfs-lib-init-erfolg": "\n Standard-Bibliothek erfolgreich initialisiert.", + "vfs-lib-init-start": "\n Initialisiere Standard-Bibliothek...", + "vfs-status-gueltig": "GUELTIG", + "vfs-status-ungueltig": "UNGUELTIG (negative Laenge)", + "vfs-tabelle-spalten": "\n Winkel L_GF (mm) L_VF (mm) Status", + "vfs-vf-eingang-gf1-skip": "\n\n[VF-Eingang] Gefaellestrecke GF1 (uebersprungen)", + "vfs-vf-eingang-separator": "\n[VF-Eingang] Separator (300 mm, 3 Grad geneigt)", + "vfs-vf-eingang-umlenk": "\n[VF-Eingang] Umlenkstation (500 mm, 3 Grad geneigt)", + "vfs-warn-lisppfad": "\n[vf_standard] WARNUNG: Lisp-Pfad nicht ermittelbar - vf_core.lsp nicht ladbar!", + "dim-switch-modus": "\nModus umgeschaltet auf: %1", + "dim-switch-blocks": "\n DXFM_BLOCKS = %1", + "dim-switch-omniflo": "\n DXFM_OMNIFLO = %1", + "dim-batch-fertig": "\nUmwandlung auf %1 abgeschlossen: %2 GF, %3 VF neu aufgebaut (%4 bereits in Zieldimension).", + "sprache-gewechselt": "\nSprache umgeschaltet auf: %1", + "cmd-block-auswaehlen": "\nBlock auswaehlen: ", + "cmd-kein-block-ausgewaehlt": "\nKein Block ausgewaehlt.", + "cmd-kreisel-bearbeiten": "\nKreisel bearbeiten: %1", + "cmd-eckrad-bearbeiten": "\nEckrad bearbeiten: %1", + "cmd-gefaelle-bearbeiten": "\nGefaellestrecke bearbeiten: %1", + "cmd-variofoerderer-bearbeiten": "\nVarioFoerderer bearbeiten: %1", + "gf-edit-kein-gf": "Block %1 ist keine Gefaellestrecke.", + "gf-edit-nur-einfach": "Nur einfache Gefaellestrecken (ohne Bogen) koennen ueber den Dialog bearbeitet werden.\nTYP: %1", + "gf-edit-neu-aufgebaut": "\nGefaellestrecke %1 neu aufgebaut.", + "gf-vf-modul-fehlt": "VarioFoerderer-Modul nicht geladen!", + "gf-vf-gebaut": "\n-> Paralleler VarioFoerderer gebaut (2000 mm neben der Gefaellestrecke, gegenlaeufig, steigend).", + "cmd-omniflo-bearbeiten": "\nOmniflo Element bearbeiten: %1", + "cmd-attribute-bearbeiten": "\nAttribute bearbeiten: %1", + "ils-station-prompt-punkt": "\nEinfuegepunkt fuer %1 [ENTER=Ende]: ", + "ils-station-fehler-blockdatei": "\n>>> FEHLER: Blockdatei '%1.dwg' nicht gefunden (data/ils pruefen).", + "ils-station-fertig": "\n>>> %1 x %2 eingefuegt.", + "layer-prompt-ziel-layer": "\nObjekt auf dem Ziel-Layer waehlen: ", + "layer-prompt-objekt": "\nObjekt waehlen: ", + "layer-prompt-referenz-objekt": "\nReferenz-Objekt waehlen (bestimmt Typ und Layer): ", + "layer-prompt-typ-ermittlung": "\nNochmals fuer Typ-Ermittlung anklicken: ", + "layer-prompt-ausblenden": "\nLayer zum Ausblenden anklicken (Enter=Ende): ", + "layer-prompt-einfrieren": "\nLayer zum Einfrieren anklicken (Enter=Ende): ", + "layer-prompt-aktiv-bleibt": "\nObjekt auf dem Layer waehlen, der AKTIV bleibt: ", + "layer-prompt-name-loeschen": "\nLayername zum Loeschen: ", + "layer-err-kein-objekt": "Kein Objekt gewaehlt.", + "layer-err-kein-ziel-layer": "Kein Ziel-Layer gewaehlt.", + "layer-err-kein-ziel-layer-kurz": "Kein Ziel-Layer.", + "layer-err-keine-passenden-objekte": "Keine passenden Objekte gefunden.", + "layer-abgebrochen": "Abgebrochen.", + "layer-err-kein-referenz-objekt": "Kein Referenz-Objekt gewaehlt.", + "layer-err-aktiv-nicht-ausschalten": "Aktiven Layer nicht ausschalten!", + "layer-err-aktiv-nicht-einfrieren": "Aktiven Layer nicht einfrieren!", + "layer-aktiver-layer": "\nAktiver Layer: %1", + "layer-objekt-auf-layer": "\nObjekt liegt auf Layer: %1", + "layer-nur-layer-sichtbar": "\nNur Layer '%1' ist sichtbar.", + "layer-geloescht": "\nLayer '%1' geloescht.", + "layer-leerer-geloescht": "\nLeerer Layer '%1' geloescht.", + "layer-existiert-nicht": "Layer '%1' existiert nicht.", + "layer-ques-typ-wechseln": "Layer dieser %1-Objekte wechseln?", + "layer-ques-alle-loeschen": "Alle Objekte auf Layer '%1' loeschen?", + "core-start-titel": "\n***** %1 *****\n", + "core-errhan-fehler": "\nFehler: ", + "core-blockname-exists": "Blockname '%1' existiert bereits - wird uebersprungen.", + "core-dwg-not-found": "\nFEHLER: Block nicht gefunden: %1", + "exp-cfg-not-found": "\n[export] WARNUNG: %1 nicht gefunden/leer, verwende Vorgaben.", + "exp-check-ids": "\n[%1] Pruefe und vergebe IDs...", + "exp-update-hoehe-drehung": "\n[%1] Aktualisiere Hoehe/Drehung...", + "exp-collect-blocks": "\n[%1] Sammle relevante Bloecke...", + "exp-no-blocks-found": "\n[%1] Keine relevanten Bloecke gefunden.", + "exp-blocks-found": "\n[%1] %2 Bloecke gefunden.", + "exp-output-dir": "\n[%1] Ausgabeordner: %2", + "exp-file-open-error": "\n[%1] FEHLER: Kann Datei nicht oeffnen: %2", + "exp-json-written": "\n[%1] JSON geschrieben: %2", + "exp-calling-python": "\n[%1] Rufe Python auf...", + "exp-export-started": "\n[%1] Export gestartet: %2", + "exp-dxfm-lib-missing": "\n[%1] FEHLER: Umgebungsvariable DXFM_LIB ist nicht gesetzt - BricsCAD wurde vermutlich nicht ueber bin/start_briscad.bat gestartet. CSV/JSON wurden geschrieben, der Python-Aufruf entfaellt.", + "exp-python-not-found": "\n[%1] FEHLER: Python-Skript nicht gefunden: %2", + "exp-python-exe": "\n[%1] Interpreter: %2", + "exp-export-done": "\n[%1] Export fertig: %2", + "exp-python-call-failed": "\n[%1] FEHLER: Python konnte nicht gestartet werden (WScript.Shell nicht verfuegbar).", + "exp-python-error": "\n[%1] FEHLER: Python endete mit Exitcode %2. Log: %3", + "exp-python-store-hint": "\n HINWEIS: Es wurde kein echter Python-Interpreter gefunden ('python' zeigt\n unter Windows 11 auf den WindowsApps-Platzhalter). Loesung: bin/install_py.bat\n ausfuehren (legt .venv an) und BricsCAD ueber bin/start_briscad.bat neu\n starten, oder in cfg/export.cfg unter [python] interpreter= den vollen Pfad\n zur python.exe setzen.", + "exp-csv-missing": "\n[%1] FEHLER: Python meldete Erfolg, aber die CSV fehlt: %2. Log: %3", + "exp-omni-no-inserts": "\n[OMNI_UPDATE] Keine INSERT-Bloecke in der Zeichnung.", + "exp-omni-updated": "\n[OMNI_UPDATE] %1 Elemente aktualisiert (HOEHE, DREHUNG).", + "sens-skip": "\n[%1] Separator-/Scanner-Zuordnung aktuell (ZUORDNUNG gesetzt, Summen stimmen) - Neuberechnung uebersprungen.", + "sens-start": "\n[%1] Pruefe Separator-/Scanner-Zuordnung (ANZAHL_SEPARATOR/ANZAHL_SCANNER)...", + "sens-no-inserts": "\n[%1] Keine Bloecke in der Zeichnung gefunden - Sensor-Zuordnung uebersprungen.", + "sens-bbox-fehler": "\n ! Bounding-Box fehlgeschlagen fuer ILS-Block '%1'", + "sens-carrier-zeile": "\n %1 [%2]: ANZAHL_SCANNER=%3, ANZAHL_SEPARATOR=%4 (nur platzierte Symbole)", + "sens-carrier-fehler": "\n FEHLER beim Schreiben der Anzahl-Attribute an %1", + "sens-summary": "\n[%1] %2 Kreisel/Streckengruppen/Gefaellestrecken aktualisiert, %3 Scanner gesamt (%4 nicht zuordenbar), %5 Separator gesamt (%6 nicht zuordenbar).", + "sens-ergaenzt-header": "\n[%1] %2 Scanner ausserhalb jeder Kreisel-/Strecken-Boundingbox per Abstand automatisch zugeordnet:", + "sens-ergaenzt-zeile": "\n Scanner %1 -> %2 (%3mm)", + "sens-strittig-suffix": " STRITTIG: auch nah an %1 (%2mm)", + "sens-strittig-summary": "\n[%1] WARNUNG: %2 der obigen Zuordnungen sind strittig (Abstand zu zwei Kandidaten fast gleich) - siehe Spalte 'Warnungen' im CSV-Export.", + "sens-unassigned-marked": "\n[%1] %2 Sensor(en) ohne jeglichen Kreisel/Strecke markiert (Layer '%3').", + "sens-zuordnung-fehlt": "\n[%1] WARNUNG: %2 zugeordnete(r) Sensor(en) ohne Attribut 'ZUORDNUNG' - Wert nicht schreibbar.", + "id-new-assigned": "\n[ID] Neue ID zugewiesen: %1", + "id-invalid-block": "\n[ID] FEHLER: Kein gueltiger INSERT-Block!", + "id-check-no-blocks": "\n[IDSCHECK] Keine relevanten Bloecke gefunden.", + "id-check-missing-set": "\n[IDSCHECK] Fehlende ID gesetzt: %1 (Block %2)", + "id-check-duplicate": "\n[IDSCHECK] Duplikat ID %1 -> neue ID %2 (Block %3)", + "id-check-done": "\n[IDSCHECK] Fertig. %1 Duplikate korrigiert.", + "id-check-corrected": "\n[IDSCHECK] %1 IDs korrigiert.", + "id-select-block-prompt": "\nBlock waehlen: ", + "id-generate-invalid": "\n[IDGENERATE] Kein gueltiger Block gewaehlt.", + "dialog-nicht-verfuegbar": "Dialog nicht verfuegbar.", + "dialog-einfuegepunkt-waehlen": "\nEinfuegepunkt waehlen: ", + "extcall-python-rueckgabe": "\n[SSG_LIB] Python Rueckgabe: %1", + "extcall-keine-rueckgabe": "\n[SSG_LIB] WARNUNG: Keine Rueckgabe von Python erhalten.", + "extcall-skript-nicht-gefunden": "\n[SSG_LIB] FEHLER: %1 nicht gefunden!", + "vfstart-core-nicht-gefunden": "\n[VarioFoerderer] WARNUNG: vf_core.lsp nicht gefunden - Befehle nicht verfuegbar.", + "vfstart-etage-core-nicht-gefunden": "\n[EtageVarioFoerderer] WARNUNG: vf_core.lsp nicht gefunden - Befehle nicht verfuegbar.", + "gf-seite-aus-header": "\n\nAUS-Element (AS_Element_*) - Seite waehlen:", + "gf-seite-ein-header": "\n\nEIN-Element (ES_Element_*) - Seite waehlen:", + "gf-seite-links": "\n 1 - Links", + "gf-seite-rechts": "\n 2 - Rechts", + "prompt-wahl-1-2": "\nIhre Wahl (1/2) [1]: ", + "prompt-wahl-1-2-3": "\nIhre Wahl (1/2/3) [1]: ", + "geruest-typ-header": "\n\nGeruestoption waehlen:", + "geruest-typ-opt": "\n %1 - %2", + "geruest-typ-prompt": "\nGeruestoption (1-4) [%1]: ", + "kreisel-eckrad-geruest-frage": "Geruest fuer Einzelmodul?", + "gf-lade-block": "\n Lade Block: %1 ...", + "gf-status-ok": " OK", + "gf-warnung-kette-unterbrochen": "\n WARNUNG: Kette unterbrochen!", + "gf-status-nennlaenge": "\n Gesamte Nennlaenge (inkl. Bogen-dx): %1 mm", + "gf-status-feste-hoehenanteile": "\n Feste Hoehenanteile (AS/ES-dz + Bogen-dz): %1 mm", + "gf-status-dz-detail": "\n aus-dz=%1 ein-dz=%2 Bogen-dz=%3", + "gf-status-resthoehe": "\n Effektive Resthoehe fuer Grade: %1 mm", + "gf-warnung-keine-geraden": "\n WARNUNG: keine geraden Strecken -> Fallback 3 Grad", + "gf-warnung-feste-anteile": "\n WARNUNG: feste Anteile > deltaH -> Fallback 1 Grad", + "gf-status-naeherungswinkel": "\n>>> Naeherungswinkel: %1%2", + "gf-status-linie-staustrecke": "\n\n%1/%2: Staustrecke L=%3 mm hz=%4%5 v=%6%7", + "gf-status-separator-vor-bogen": "\n\n%1S/%2: Separator 300mm (vor Bogen) hz=%3%4 v=%5%6", + "gf-status-bogen-einfuegen": "\n\n%1/%2: %3 hz=%4%5", + "gf-status-linienzug-eingefuegt": "\n>>> Linienzug-Gefaellestrecke eingefuegt! <<<", + "gf-modus3-header": "\n\n>>> MODUS 3: Linienzug auswaehlen <<<", + "gf-modus3-hinweis1": "\nBitte alle Linien (LINE) und Boegen (ARC) des Pfades auswaehlen,", + "gf-modus3-hinweis2": "\ndann ENTER druecken:", + "gf-fehler-keine-objekte": "\nKeine Objekte ausgewaehlt!", + "gf-status-objekte-ausgewaehlt": "\n %1 Objekte ausgewaehlt.", + "gf-prompt-startpunkt-kette": "\nStartpunkt (3D) waehlen - KS_EIN AUS-Element / Kettenanfang: ", + "gf-fehler-kein-startpunkt": "\nKein Startpunkt!", + "gf-prompt-endpunkt-kette": "\nEndpunkt (3D) waehlen - KS_AUS EIN-Element / Kettenende: ", + "gf-fehler-kein-endpunkt": "\nKein Endpunkt!", + "gf-status-deltah-3dpunkte": "\n %1H aus 3D-Punkten: %2 mm", + "gf-status-sortiere-segmente": "\n Sortiere Segmente ...", + "gf-alert-keine-kette": "Keine verbundene Kette gefunden!", + "gf-status-segmente-gefunden": " %1 Segmente gefunden.", + "gf-status-segment-analyse-header": "\n\n--- Segment-Analyse (Laengen nach Kuerzung) ---", + "gf-status-segment-linie": "\n %1. Linie L=%2 mm hz=%3%4", + "gf-status-segment-bogen": "\n %1. Bogen %2%3 %4 hz-Eingang=%5%6", + "gf-status-seg-erste-linie": "\n Seg %1 (1. Linie): -%2 mm (AUS-Element)", + "gf-status-linie-vor-bogen": "\n Jede Linie vor Bogen: -300 mm (Bogen-Separator)", + "gf-status-seg-letzte-linie": "\n Seg %1 (letzte Linie): -300 mm (EIN-Sep) -%2 mm (EIN-Element)", + "gf-status-eintrittsrichtung": "\n Eintrittsrichtung: %1%2", + "gf-status-austrittsrichtung": "\n Austrittsrichtung: %1%2", + "gf-status-berechne-winkel": "\n\n Berechne Gefaellewinkel aus Geometrie ...", + "gf-prompt-winkel-verwenden": "\nBerechneten Winkel %1%2 verwenden? (j/n) [j]: ", + "gf-prompt-gefaellewinkel": "\nGefaellewinkel (Grad): ", + "gf-status-messe-absenkung": "\n Messe tatsaechliche AS/ES-Absenkung (iterativ) ...", + "gf-warnung-korrektur-bereich": "\n WARNUNG: Korrektur ausserhalb Bereich, Winkel unveraendert", + "gf-status-as-es-mm": "\n AS: %1 mm ES: %2 mm", + "gf-status-korrigierter-winkel": "\n>>> Korrigierter Gefaellewinkel: %1%2 (nach %3 Iter.)", + "gf-status-zus-segmente": "\n>>> Segmente: %1", + "gf-status-zus-deltah": "\n>>> %1H: %2 mm", + "gf-status-zus-deltal": "\n>>> %1L: %2 mm", + "gf-status-zus-winkel": "\n>>> Gefaellewinkel: %1%2", + "gf-status-zus-eintrittswinkel": "\n>>> Eintrittswinkel: %1%2", + "gf-status-zus-austrittswinkel": "\n>>> Austrittswinkel: %1%2", + "gf-status-zus-aus-element": "\n>>> AUS-Element: %1", + "gf-status-zus-ein-element": "\n>>> EIN-Element: %1", + "gf-prompt-einfuegen": "\nEinfuegen? (1=Ja / 2=Nein) [1]: ", + "gf-status-aus-element-detail": "\n\n>>> AUS-Element: %1 Fahrtrichtung=%2%3 KS_EIN-hz=%4%5 Z=%6", + "gf-status-separator-vor-ein": "\n>>> Separator vor EIN-Element", + "gf-status-ein-element-detail": "\n>>> EIN-Element: %1 Ziel-Z=%2", + "gf-status-z-hoehe-ks-aus": "\n Z-Hoehe KS_AUS: %1 mm", + "gf-status-fertig": "\n>>> Fertig! <<<", + "gf-status-abgebrochen": "\nAbgebrochen.", + "gf-alert-dialog-fehlt": "Dialog-Datei nicht gefunden:\n%1", + "gf-dlg-richtung-0": "0%1 (X+, Ost)", + "gf-dlg-richtung-90": "90%1 (Y+, Nord)", + "gf-dlg-richtung-180": "180%1 (X-, West)", + "gf-dlg-richtung-270": "270%1 (Y-, Sued)", + "gf-dlg-links": "Links", + "gf-dlg-rechts": "Rechts", + "gf-status-gf-block-erstellt": "\n>>> GF-Block erstellt: %1 (%2)", + "gf-status-schritt1-aus": "\n\n1/4: %1 Fahrtrichtung=%2%3 KS_EIN-hz=%4%5 v=%6%7", + "gf-status-schritt2-staustrecke": "\n\n2/4: Staustrecke L=%1 mm hz=%2%3 v=%4%5", + "gf-status-schritt3-separator": "\n\n3/4: Separator 300mm hz=%1%2 v=%3%4", + "gf-status-schritt4-ein": "\n\n4/4: %1", + "gf-status-erfolgreich-eingefuegt": "\n>>> Gefaellestrecke erfolgreich eingefuegt! <<<", + "gf-banner-titel": "\n GEFAELLESTRECKE GENERATOR v2.0", + "gf-banner-richtung": "\n Richtung: immer AB (nach unten)", + "gf-alert-init-fehler": "Fehler beim Initialisieren der Bibliothek!\nBitte DXFM_DATA pruefen.", + "gf-eingabemodus-header": "\n\nEingabemodus waehlen:", + "gf-eingabemodus-1": "\n 1 - Werte manuell eingeben (einfache Strecke)", + "gf-eingabemodus-2": "\n 2 - 3D-Linie auswaehlen (einfache Strecke)", + "gf-eingabemodus-3": "\n 3 - Linienzug (LINE + ARC) auswaehlen mit Gefaellebogen", + "gf-modus1-header": "\n\n>>> MODUS 1: Manuelle Werteingabe <<<", + "gf-prompt-startpunkt-aus": "\nStartpunkt fuer AUS-Element waehlen: ", + "gf-prompt-deltal-abstand": "\n%1L - Abstand (mm): ", + "gf-modus2-header": "\n\n>>> MODUS 2: 3D-Linie auswaehlen <<<", + "gf-status-bks-welt": "\n BKS auf Weltkoordinaten gesetzt.", + "gf-prompt-3dlinie-richtung": "\nBitte 3D-Linie fuer Richtung und Laenge auswaehlen:", + "gf-alert-keine-linie": "Keine gueltige Linie ausgewaehlt!", + "gf-status-fahrtrichtung-linie": "\n Fahrtrichtung: %1%2 (aus Linie)", + "gf-status-deltal-mm": "\n %1L = %2 mm", + "gf-prompt-gefaellewinkel-def3": "\n\nGefaellewinkel (Grad) [3]: ", + "gf-status-winkel": "\n>>> Winkel: %1%2", + "gf-status-fahrtrichtung": "\n>>> Fahrtrichtung: %1%2", + "gf-alert-staustrecke-ungueltig": "Berechnete Staustreckenlaenge ungueltig: %1 mm\nBitte groesseres deltaL oder kleineren Winkel waehlen.", + "gf-status-zus2-winkel": "\n>>> Winkel: %1%2", + "gf-status-zus2-aus-seite": "\n>>> AUS-Seite: %1", + "gf-status-zus2-ein-seite": "\n>>> EIN-Seite: %1", + "gf-status-zus2-lstau": "\n>>> L_stau: %1 mm", + "ques-yn-default-yes": " Y/N : ", + "ques-yn-default-no": " Y/N : ", + "tefl-fehler-dxfm-omniflo": "\n[TEF] FEHLER: DXFM_OMNIFLO nicht gesetzt (bin/setenv.bat ausfuehren).", + "tefl-fehler-dxf-nicht-gefunden": "\n[TEF] FEHLER: Element-DXF nicht gefunden: %1", + "tefl-prompt-startpunkt": "\nStartpunkt der Foerderstrecke waehlen: ", + "tefl-prompt-endpunkt": "\nEndpunkt der Foerderstrecke waehlen: ", + "tefl-abgebrochen": "\n[TEF] Abgebrochen.", + "tefl-fehler-laenge-null": "\n[TEF] FEHLER: Start- und Endpunkt liegen zu nah beieinander.", + "tefl-fertig": "\n[TEF] %1 Element(e) eingefuegt, Streckenlaenge=%2 mm.", + "vfl-kette-titel": "\n Vario_Kette_Merge - mehrere Vario-Foerderer-Bausteine (einzeln oder bereits gewickelt) zu einem Gesamt-Block verschmelzen", + "vfl-kette-start-waehlen": "\n\nStart-Baustein der Kette waehlen (erstes Element - AS-Element oder VF_n): ", + "vfl-kette-kein-objekt": "\nKein Objekt gewaehlt - Abbruch.", + "vfl-kette-kein-vf-block": "\nGewaehltes Objekt ('%1') ist kein bekannter Vario-Kette-Baustein (AS-/ES-Element, GF-Bogen, Vario-Kurve, Umlenk-/Motorstation, Vertikalbogen, Staustrecke/Separator oder VF_n).", + "vfl-kette-start-nicht-gefunden": "\nFEHLER: Start-Baustein nicht in der Ketten-Erfassung gefunden (interner Fehler).", + "vfl-kette-start-nicht-gefunden-diag": "\nFEHLER: Start-Baustein nicht in der Ketten-Erfassung gefunden (interner Fehler).\n Diagnose: %1 Bausteine insgesamt erfasst, gewaehlter Blockname='%2', davon %3 mit gleichem Blocknamen erfasst.", + "vfl-kette-start-ohne-ks-ein": "\nFEHLER: Am gewaehlten Baustein konnte kein KS_EIN gefunden werden - Kette kann nicht verfolgt werden.", + "vfl-kette-nur-ein-baustein": "\nAb dem gewaehlten Baustein wurde kein weiterer angeschlossener VF_n-Baustein gefunden - nichts zum Zusammenfuehren.", + "vfl-kette-gefunden": "\n\nKette erkannt: %1 Baustein(e) werden zusammengefuehrt:", + "vfl-kette-luecke-warnung": "\n\n WARNUNG: Nach '%1' wurde ein visuell nahes, aber nicht sauber verbundenes VF_n ('%2') gefunden (KS-Abstand %3 mm) - Kette wurde dort beendet, dieser und alle weiteren Bausteine bleiben unangetastet.", + "vfl-kette-fertig": "\n\n>>> Fertig: neuer Gesamt-Block '%1' aus %2 Baustein(en) erstellt.", + "cmd-tro-bearbeiten": "\nTRO-Marker bearbeiten: %1", + "cmd-connection-bearbeiten": "\nVerbindung bearbeiten: %1", + "con-keine-verbindung": "Block %1 ist keine Verbindung (erwartet CONNECTION_*).", + "con-kein-tro": "Block %1 ist kein TRO-Marker - Verbindungen gehen nur zwischen TROs.", + "con-block-fehlt": "Blockdefinition %1 fehlt in dieser Zeichnung.\nZuerst tro_annotate.py mit --flow laufen lassen.", + "con-quelle-waehlen": "\nQuell-TRO waehlen: ", + "con-ziel-waehlen": "\nZiel-TRO waehlen: ", + "con-gleicher-block": "Quelle und Ziel sind derselbe Block.", + "con-gleicher-punkt": "Quelle und Ziel liegen an derselben Stelle.", + "con-dialog-fehlt": "Dialogdatei nicht gefunden:\n%1\nDXFM_DCL pruefen (setenv.bat).", + "con-block": "Block: %1 (UID %2)", + "con-richtung": "Richtung: %1 ----> %2", + "con-hinweis": "Die UID ist dauerhaft, die TRO-Kennung darf sich aendern.", + "con-id-leer": "Quell- und Ziel-UID duerfen nicht leer sein - nichts geaendert.", + "con-gleiche-id": "Quelle und Ziel duerfen nicht dieselbe UID haben.", + "con-eingefuegt": "\nVerbindung %1 ----> %2 eingefuegt (UID %3).", + "con-gespeichert": "\nVerbindung gespeichert: %1 ----> %2", + "tro-edit-kein-tro": "Block %1 ist kein TRO-Marker (erwartet TRO_*).", + "tro-edit-kein-id-attribut": "Block %1 hat kein Attribut ID - bitte neu beschriften lassen (tro_annotate.py).", + "tro-edit-dialog-fehlt": "Dialogdatei nicht gefunden:\n%1\nDXFM_DCL pruefen (setenv.bat).", + "tro-edit-modul-fehlt": "%1 nicht geladen - Attribute werden mit EATTEDIT bearbeitet.", + "tro-edit-block": "Block: %1", + "tro-edit-fb": "Funktionsbaustein: %1 UID: %2", + "tro-edit-hinweis": "Symbol und FB folgen erst beim naechsten Lauf von tro_annotate.py.", + "tro-edit-id-leer": "Die TRO-Kennung darf nicht leer sein - nichts geaendert.", + "tro-edit-gespeichert": "\nTRO gespeichert: ID = %1, TYP = %2", + "tro-edit-typ-geaendert": "\nTyp geaendert - tro_annotate.py neu laufen lassen, damit Symbol und FB passen.", + "tro-insert-kein-typ": "Keine TRO-Typen verfuegbar (tro_types.lsp fehlt) - bitte lib/tro_annotate.py --emit-lisp ausfuehren.", + "tro-insert-hinweis": "Die Blockform muss bereits in der Zeichnung vorhanden sein (aus einem frueheren Lauf von tro_annotate.py).", + "tro-insert-kein-block": "Kein Symbol fuer diesen Typ in der Zeichnung (%1) - bitte tro_annotate.py mit diesem Typ laufen lassen.", + "tro-insert-prompt-punkt": "\nEinfuegepunkt: ", + "tro-insert-eingefuegt": "\nTRO eingefuegt: ID = %1, TYP = %2" + } } diff --git a/lang/en_GB.json b/lang/en_GB.json index 2ce45ec..acf0a13 100644 --- a/lang/en_GB.json +++ b/lang/en_GB.json @@ -1,688 +1,701 @@ { - "texts": { - "omni-alle-winkel": "all angles", - "omni-grad": " deg", - "omni-bogen-keine-gefunden": "No arcs found for %1%2.", - "omni-weiche-keine-gefunden": "No switches found for %1%2.", - "vfc-ursprung": "Origin", - "vfc-block-eingefuegt-xyzref-ksaus": "\n '%1' inserted (XY:%2 Z:%3)\n KS_AUS: X=%4 Y=%5 Z=%6", - "vfl-ja": "\n 1 - Yes", - "vfl-nein": "\n 2 - No", - "vfl-sep-vor-frage": "\n\nInsert additional separator BEFORE the horizontal section?", - "vfl-sep-nach-frage": "\n\nInsert additional separator AFTER the horizontal section?", - "vfl-sep-an-stelle-frage": "\n\nInsert additional separator at this point?", - "vf-winkel-aus-header": "\n\nOutput element (AS_Element) - choose angle:", - "vf-winkel-ein-header": "\n\nInput element (ES_Element) - choose angle:", - "vf-winkel-90": "\n 1 - 90 deg", - "vf-winkel-30": "\n 2 - 30 deg", - "vfl-gf-bogen-winkel-header": "\n\nGF arc - choose angle:", - "vfl-gf-bogen-seite-header": "\nGF arc - choose side:", - "vfl-winkel-30": "\n 1 - 30 deg", - "vfl-winkel-60": "\n 2 - 60 deg", - "vfl-winkel-90": "\n 3 - 90 deg", - "vfl-variokurve-winkel-header": "\n\nVario curve - choose angle:", - "vfl-opt1-90grad": "\n 1 - 90 deg", - "vfl-opt2-60grad": "\n 2 - 60 deg", - "vfl-opt3-30grad": "\n 3 - 30 deg", - "vfl-prompt-wahl-1-3-def1": "\nYour choice (1/2/3) [1]: ", - "vfl-variokurve-seite-header": "\nVario curve - choose side:", - "vfl-variokurve-variante-header": "\nVario curve - choose variant:", - "vfl-variante-aussen": "\n 1 - Outer", - "vfl-variante-innen": "\n 2 - Inner", - "vfl-ist-ziel-vergleich-header": "\n\n>>> ACTUAL-TARGET COMPARISON (ES element):", - "vfl-soll-xyz": "\n Target: X=%1 Y=%2 Z=%3", - "vfl-ist-xyz": "\n Actual: X=%1 Y=%2 Z=%3", - "vfl-abweichung-xyz": "\n Deviation: dX=%1 dY=%2 dZ=%3 mm", - "vfl-m3-titel": "\n VF LINE PATH - Mode 2: path + target height (finished; anchors + solver + build)", - "vfl-m3-alert-gf-modul": "Gefaellestrecke module not loaded!", - "vfl-m3-pfad-waehlen": "\n\nSelect path objects (lines/arcs):", - "vfl-m3-keine-objekte": "\nNo objects selected - aborting.", - "vfl-m3-prompt-startpunkt": "\n\nSelect chain start point (higher side): ", - "vfl-prompt-hoehe-startpunkt": "\nHeight (Z) of the start point [%1]: ", - "vfl-m3-prompt-endpunkt": "\n\nSelect chain end point (target): ", - "vfl-m3-prompt-zielhoehe": "\nTarget height (Z) of the end point [%1]: ", - "vfl-m3-fehler-nicht-sortierbar": "\nERROR: path cannot be sorted (is it connected without gaps?).", - "vfl-m3-alert-eckwinkel": "No matching arc: corner angle %1 deg is not ~30/60/90.\nPlease adjust the angles.", - "vfl-m3-seg-gerade": "\n\nSegment %1/%2: straight L=%3 mm hz=%4", - "vfl-m3-auto-vf": "\n (automatic VF - segment follows directly after a Vario curve)", - "vfl-m3-typ-gerade": "\n Type? 1 = GF (input angle) 2 = VF (bridge)", - "vfl-m3-prompt-gf-neigung": "\n GF slope in degrees [3]: ", - "vfl-m3-hinweis-gf-max": "\n Note: GF max. 3 deg - limited to 3.", - "vfl-m3-seg-bogen": "\n\nSegment %1/%2: corner/arc %3 deg %4", - "vfl-m3-typ-bogen": "\n Type? 1 = GF arc 2 = Vario curve", - "vfl-m3-variante-frage": "\n Vario curve - variant? 1 = Outer 2 = Inner", - "vfl-m3-vf-laeufe": "\n\n[M3a] VF runs found: %1", - "vfl-m3-vf-lauf-noetig": "\n[M3a] Exactly ONE VF run required (GF...VF...GF; Vario curves may lie within the run).", - "vfl-m3-vf-lauf-m3b": "\n[M3a] Several/no VF runs -> M3b later.", - "vfl-m3-vf-lauf-ohne-gerade": "\n[M3a] VF run without a VF straight - aborting.", - "vfl-m3-anker-vorschau-header": "\n M3a ANCHOR PREVIEW (rough estimate; exact values during build)", - "vfl-m3-start-hoehe": "\n Start height Z: %1 mm", - "vfl-m3-ziel-hoehe": "\n Target height Z: %1 mm", - "vfl-m3-delta-h-gesamt": "\n delta-H total: %1 mm (positive = descent)", - "vfl-m3-vf-lauf-segmente": "\n VF run: segment %1..%2", - "vfl-m3-front-anker-vorschau": "\n Front anchor Z: %1 mm (forward from AS)", - "vfl-m3-junction-anker-vorschau": "\n Junction anchor Z: %1 mm (backward from ES)", - "vfl-m3-richtung-auf": "up (rising)", - "vfl-m3-richtung-ab": "down (falling)", - "vfl-m3-richtung-horizontal": "horizontal", - "vfl-m3-richtung-auf-kurz": "Up", - "vfl-m3-richtung-ab-kurz": "Down", - "vfl-m3-bruecke-dh": "\n --> Bridge: delta-H = %1 mm over span %2 mm", - "vfl-m3-bruecke-richtung": "\n Direction: VF-%1", - "vfl-m3-vf-angetrieben": "\n (VF is powered - can RISE and FALL; sign = up/down only)", - "vfl-m3-mittlere-neigung": "\n rough mean slope over span: ~%1 deg", - "vfl-m3-warnung-zu-steil": "\n WARNING: ~slope > 51 deg -> too steep for Vario (magnitude infeasible).", - "vfl-m3-vario-bereich-ok": "\n -> within Vario range (3..51 deg), rough orientation.", - "vfl-m3-anker-hinweis": "\n (anchors above = rough preview; exact values are MEASURED during build)", - "vfl-m3-phase-b1": "\n\n>>> Phase B1: building front run (AS + GF) ...", - "vfl-m3-alert-beginnt-bogen": "Chain starts with an arc - please begin with a straight.", - "vfl-m3-kurve-front-uebersprungen": "\n >>> [M3a] Vario curve in front run - skipped.", - "vfl-m3-standard-vario-header": "\n\n --- STANDARD VARIO (climbing segment) + flat zone ---", - "vfl-m3-front-anker-gemessen": "\n Front anchor (measured): %1 mm", - "vfl-m3-junction-exakt": "\n Junction (exact): %1 mm", - "vfl-m3-kletter-info": "\n Climb height %1 mm | climbers %2 | curves %3 | short VF %4", - "vfl-m3-kein-winkel": "\n NO matching Vario angle -> infeasible (front already built).", - "vfl-m3-gf-verteilung": "\n\n GF distribution: 1 - all at inlet (GF1) 2 - 1/2 GF1 + 1/2 GF2", - "vfl-m3-vert-halb": "1/2 GF1 + 1/2 GF2", - "vfl-m3-vert-ganz": "all GF1", - "vfl-m3-vario-ergebnis": "\n -> Vario %1 (%2), L_VF %3 mm, GF total %4 mm, distribution %5 (GF2 remainder = measured fine correction)", - "vfl-m3-warnung-gf2-negativ": "\n WARNING: body climbs too little - GF2<0 (missing %1 mm). Angle too shallow; dZ not exact.", - "vfl-m3-gf2-ausgleich": "\n GF2 (measured compensation): L=%1 mm", - "vfl-m3-kurve-back-uebersprungen": "\n >>> [M3a] Vario curve in back run - skipped.", - "vfl-m3-nichts-gebaut": "\nNothing built - aborting.", - "vfl-m3-fertig-header": "\n>>> VF line path (mode 2) built! <<<", - "vfl-m3-ziel-soll": "\n Target (nominal): X=%1 Y=%2 Z=%3", - "vfl-m3-es-ist": "\n ES (actual): X=%1 Y=%2 Z=%3", - "vfl-m3-abweichung": "\n Deviation: dX=%1 dY=%2 dZ=%3 mm", - "vfl-m3-laengs-quer": "\n Along KS_AUS axis: %1 mm | across axis (should be ~0): %2 mm", - "vfl-m3-achse-hinweis": "\n (dZ=target height; across KS_AUS axis ~0 => end point lies on the axis)", - "gf-fehler-block-fehlt": "\n ERROR: block '%1' missing", - "gf-fehler-block-fehlt-ausruf": "\n ERROR: block '%1' missing!", - "gf-fehler-blockdatei-fehlt": "\n ERROR: block file not found: %1", - "gf-fehler-keine-linie": "\n Error: no line!", - "gf-laenge-null-uebersprungen": "\n (length 0 - skipped)", - "gf-prompt-linie-waehlen": "\n >> Select line: ", - "gf-status-3dlinie-z": "\n 3D line: Z_start=%1 Z_end=%2", - "gf-status-block-l-z": "\n %1 L=%2 -> Z=%3", - "gf-status-bogen-masse": "\n %1: dx=%2 dz=%3", - "gf-status-gefaellebogen": "\n Slope arc %1 hz=%2%3 -> Z=%4", - "gf-status-hzincl": "\n HzIncl %1 L=%2 hz=%3%4 v=%5%6 -> Z=%7", - "gf-status-hzks": "\n HzKS %1 hz=%2%3 v=%4%5 -> Z=%6", - "gf-status-ks-aus-z": "\n KS_AUS Z=%1", - "gf-warnung-block-fehlt-nullwerte": "\n WARNING: %1 missing - using zero values", - "gf-warnung-ks-fehlt": "\n WARNING: KS_EIN/KS_AUS missing!", - "gf-warnung-ks-fehlt-in": "\n WARNING: KS missing in '%1'", - "gf-warnung-ks-fehlt-in2": "\n WARNING: KS missing in %1", - "kreisel-abstand-ausgabe": "\n-> Distance: %1 mm", - "kreisel-beschriftung-erzeugt": "\n-> Label: %1 (height=%2mm, Arial, centered)", - "kreisel-bestehende-blockdef": "\n-> Using existing block definition: %1", - "kreisel-connect-zusammenfassung": "\n-> Distance: %1 mm Rotation: %2 deg Height: %3 Kreisel type: %4", - "kreisel-eckrad-eingefuegt": "\n-> Eckrad #%1 inserted: %2 at %3,%4 rotation=%5 height=%6", - "kreisel-edit-aktualisiert": "\nKreisel updated: Name=%1 Distance=%2 Height=%3 Rotation=%4", - "kreisel-edit-bestehend": "\n-> Existing: Distance=%1 Rotation=%2 Type=%3", - "kreisel-edit-dialog-fehlt": "Dialog not available: %1", - "kreisel-eingefuegt": "\n-> Kreisel #%1 inserted: %2 (height=%3)", - "kreisel-emsg-distanz-klein": "Distance too small! (%1 < %2)", - "kreisel-hoehe-aus-3dpunkt": "\n-> Height taken from 3D point: %1", - "kreisel-hoehe-aus-basispunkt": "\n-> Height taken from base point: %1", - "kreisel-hoehe-aus-startpunkt": "\n-> Height taken from start point: %1", - "kreisel-hoehe-von-bestehendem": "\n-> Height taken from existing Kreisel: %1", - "kreisel-insert-zusammenfassung": "\n-> Rotation: %1 Height: %2 Kreisel type: %3", - "kreisel-labelsetup-fertig": "\nNew settings: Height=%1, Colour=%2, Y offset=%3, Font=Arial", - "kreisel-neue-beschriftungsposition": "\nNew label position: X=%1 Y=%2", - "kreisel-neue-blockdef": "\n-> New block definition: %1", - "kreisel-neue-texthoehe": "\nNew text height: %1", - "kreisel-params-default-hoehe": "\nDefault height: %1", - "kreisel-params-default-laenge": "\nDefault length: %1", - "kreisel-params-durchmesser": "\nDiameter: %1", - "kreisel-params-typ": "\nKreisel type: %1", - "kreisel-prompt-abstand": "\nDistance (tangent length) <%1>: ", - "kreisel-prompt-abstand-oben": "\nDistance above Kreisel centre <%1>: ", - "kreisel-prompt-hoehe-z": "\nHeight (Z coordinate) <%1>: ", - "kreisel-prompt-neue-hoehe": "\nNew height <%1>: ", - "kreisel-prompt-neuer-abstand": "\nNew distance <%1>: ", - "kreisel-prompt-schriftfarbe": "\nFont colour (1=Red,2=Yellow,3=Green,4=Cyan,5=Blue,6=Magenta,7=White) <%1>: ", - "kreisel-prompt-schrifthoehe": "\nFont height <%1>: ", - "kreisel-prompt-texthoehe": "\nText height <%1>: ", - "kreisel-prompt-x-abstand": "\nX distance from AN8 centre <%1>: ", - "kreisel-prompt-y-abstand": "\nY distance from AN8 centre <%1>: ", - "kreisel-redraw-bestehend": "\n-> Existing: Distance=%1 Rotation=%2 Height=%3 Type=%4", - "kreisel-redraw-fertig": "\nKreisel redrawn. Distance=%1", - "kreisel-script-distanz-klein": "\n[Connect] Distance too small: %1", - "kreisel-textstil-erstellt": "\n-> Text style '%1' created with Arial", - "kreisel-typ-prompt": "\nPlease choose <%1>: ", - "omni-bogen-info-antriebsart": "\n Drive type: %1", - "omni-bogen-info-breite": "\n Width: %1", - "omni-bogen-info-kurvenwinkel": "\n Curve angle: %1", - "omni-bogen-info-laenge": "\n Length: %1", - "omni-bogen-info-profiltyp": "\n Profile type: %1", - "omni-bogen-info-radius": "\n Radius: %1", - "omni-bogen-nicht-gefunden": "\nNo arc with Sivas ID '%1' found.", - "omni-dxf-eingefuegt": "\n[OMNI] %1 inserted. Height=%2 Rotation=%3%4", - "omni-edit-aktualisiert": "\n[OMNI] Element updated: %1 Height=%2 Rotation=%3", - "omni-edit-dxf-nicht-gefunden": "DXF not found: %1", - "omni-einfuegen-info": "\n[OMNI] Inserting: %1 (%2)", - "omni-fehler-dxf-nicht-gefunden": "\n[OMNI] ERROR: DXF not found: %1", - "omni-insert-block-eingefuegt": "\n[OMNI] %1 inserted. Length=%2 mm", - "omni-laenge-ueberschritten": "The requested travel path length of %1 mm exceeds the maximum length of %2 mm of the travel path profile.\nPlease redefine!", - "omni-weiche-info-breite": "\n Width: %1", - "omni-weiche-info-kurvenrichtung": "\n Curve direction:%1", - "omni-weiche-info-kurvenwinkel": "\n Curve angle: %1", - "omni-weiche-info-laenge": "\n Length: %1", - "omni-weiche-info-profiltyp": "\n Profile type: %1", - "omni-weiche-info-schaltungstyp": "\n Switch type: %1", - "omni-weiche-info-weichentyp": "\n Type of switch: %1", - "omni-weiche-info-wklaenge": "\n WK length: %1", - "omni-weiche-nicht-gefunden": "\nNo switch with Sivas ID '%1' found.", - "vfc-3dlinie-start-ende": "\n 3D line:\n Start: X=%1 Y=%2 Z=%3\n End: X=%4 Y=%5 Z=%6", - "vfc-3dpolylinie-start-ende": "\n 3D polyline:\n Start Z=%1 End Z=%2", - "vfc-block-einfuegepunkt": "\n Block insertion point: X=%1 Y=%2 Z=%3", - "vfc-block-eingefuegt-ksaus": "\n '%1' inserted\n KS_AUS: X=%2 Y=%3 Z=%4", - "vfc-delta-l-h-richtung": "\n %1L=%2 mm %1H=%3 mm Travel direction=%4%5", - "vfc-endpunkt-xyz": "\n End point: X=%1 Y=%2 Z=%3", - "vfc-endpunkt-xyz-dxdz": "\n End point: X=%1 Y=%2 Z=%3 (dx=%4 dz=%5)", - "vfc-fahrtrichtung-ergebnis": "\n>>> Travel direction: %1%2", - "vfc-fehler-block-datei-fehlt": "\n ERROR: block file not found: %1", - "vfc-fehler-block-nicht-in-bibliothek": "\n ERROR: block '%1' not in library", - "vfc-fehler-block-nicht-in-bibliothek-abgebrochen": "\n ERROR: block '%1' not in library - cancelled", - "vfc-fehler-ks-fehlen": "\n ERROR: KS_EIN/KS_AUS missing in '%1'", - "vfc-fehler-ungueltiger-einfuegepunkt": "\n ERROR: invalid insertion point for '%1'", - "vfc-fuege-block-ein-hz": "\n Inserting block '%1'... (hz=%2%3)", - "vfc-fuege-block-ein-rotation-hz": "\n Inserting block '%1' (rotation %2%3 hz=%4%5)", - "vfc-fuege-ein-lwhz": "\n Inserting '%1' (L=%2 mm, W=%3%4 hz=%5%6)", - "vfc-ks-aus-xyz": "\n KS_AUS: X=%1 Y=%2 Z=%3", - "vfc-lade-block": "\n Loading block: %1 ...", - "vfc-laenge-uebersprungen": "\n Length=%1 mm -> skipped", - "vfc-punkt-auf-objekt": "\n Point on object: Z=%1 mm", - "vfe-as30-mass": "\n AS_30_rechts: dx=%1 mm, dz=%2 mm", - "vfe-block-fehlt-abbruch": "\n ERROR: block '%1' not in library - cancelled", - "vfe-bogen-nicht-vorhanden": "\n %1 -> arc not available", - "vfe-delta-info": "\nΔL=%1 mm ΔH=%2 mm Direction=%3", - "vfe-empfohlener-winkel": "\n>>> Recommended angle: %1", - "vfe-es30-mass": "\n ES_30_rechts: dx=%1 mm, dz=%2 mm", - "vfe-extrahiere-block-mass": "\n Extracting %1 dimensions...", - "vfe-gefaellebogen-links-mass": "\n Slope arc left: dx=%1 dz=%2 mm", - "vfe-gefaellebogen-rechts-mass": "\n Slope arc right: dx=%1 dz=%2 mm", - "vfe-gefaellebogen-seite-dx": "\n Slope arc %1: dx=%2 mm", - "vfe-hz-incl-status": "\n HzIncl %1 L=%2 hz=%3 v=%4 -> Z=%5", - "vfe-hz-rot-status": "\n HzRot %1 hz=%2 v=%3 -> Z=%4", - "vfe-hz-rotks-status": "\n HzRotKS %1 hz=%2 -> Z=%3", - "vfe-hz-scaleks-status": "\n HzScaleKS %1 %2mm hz=%3 -> Z=%4", - "vfe-ks-fehlt-startpunkt": "\n WARNING: KS missing in '%1' - using start point", - "vfe-step1-as30": "\n\n1/15: %1 (0 deg)", - "vfe-step2": "\n\n2/15: Buffer section 400mm (%1 deg hz, 3 deg vert, KS_EIN)", - "vfe-step3": "\n\n3/15: Separator (300mm, %1 deg hz, 3 deg vert)", - "vfe-step4": "\n\n4/15: %1 (start, %2 deg hz, 0 deg vert, KS_EIN)", - "vfe-step5-strecke": "\n\n5/15: Slope section (3 deg, L=%1 mm)", - "vfe-step7": "\n\n7/15: %1 (3 deg inclined)", - "vfe-step8-ab": "\n\n8/15: Slope section (%1 deg, L=%2 mm)", - "vfe-step8-auf": "\n\n8/15: Incline section (%1 deg, L=%2 mm)", - "vfe-tabelle-zeile": "\n %1 %2 mm %3 mm ", - "vfe-tabelle-zeile-fehler": "\n %1 --- --- ERROR", - "vfl-20m-hinweis": "\n >>> NOTE: conveyor longer than 20 m (%1 m) - motor station recommended!", - "vfl-block-erstellt": "\n>>> Block '%1' (%2) created and inserted.", - "vfl-fehler-rest-nicht-baubar": "\n ERROR: remainder cannot be built (too steep/too short for tail motor+GF2+separator+ES). Please continue drawing or plan flatter.", - "vfl-fuege-block-ein": "\n Inserting %1 ...", - "vfl-hinweis-gf2-minimum": "\n NOTE: calculated GF2=%1 mm < minimum %2 mm -> raised to minimum (ES therefore ends a bit further on; see actual-vs-target report).", - "vfl-horizontale-zwischenstrecke": "\n\nHorizontal intermediate section (0 deg, L=%1 mm)", - "vfl-kettenende-modus-ziel": "\n>>> Chain-end mode: target dL=%1 mm, dH=%2 mm (%3). GF2 varies with the angle.", - "vfl-prompt-hoehe-endpunkt": "\nHeight (Z) of the end point [%1]: ", - "vfl-prompt-hoehe-kettenende": "\nHeight (Z) of the chain end (ES element) [%1]: ", - "vfl-prompt-wahl-bis-n": "\nYour choice (1-%1) [1]: ", - "vfl-segment-gf-nicht-erlaubt": "\n Segment would be GF (too steep) or not buildable - not allowed within a VF unit.\n Please draw flatter/rising or end the conveyor.", - "vfl-winkel-option": "\n %1 - %2 deg (L_GF=%3 mm L_VF=%4 mm)", - "vfs-as90-mass": "\n AS_90: dx=%1 dz=%2", - "vfs-berechnung-parameter": "\nΔL=%1 mm ΔH=%2 mm Direction=%3", - "vfs-block-fehlende-item": "\n - %1", - "vfs-block-fehler-pfad": "\n ERROR: DXFM_BLOCKS = %1", - "vfs-bogen-ab-block-fehlt": "\n ERROR ab_%1: block not loaded!", - "vfs-bogen-ab-ks-fehlt": "\n ERROR ab_%1: KS missing!", - "vfs-bogen-ab-ok": "\n OK ab_%1: dx=%2 dz=%3", - "vfs-bogen-auf-block-fehlt": "\n ERROR auf_%1: block not loaded!", - "vfs-bogen-auf-ks-fehlt": "\n ERROR auf_%1: KS missing!", - "vfs-bogen-auf-ok": "\n OK auf_%1: dx=%2 dz=%3", - "vfs-empfohlener-winkel": "\n>>> Recommended angle: %1%2", - "vfs-es90-mass": "\n ES_90: dx=%1 dz=%2", - "vfs-fehler-winkel-tabelle": "\n ERROR: angle %1 not in arc table!", - "vfs-schritt-as": "\n\n1/11: %1 (hz=%2%3)", - "vfs-schritt5-bogen1": "\n\n5/11: %1 (3 deg inclined)", - "vfs-tabelle-zeile": "\n %1%2 %3 mm %4 mm ", - "vfs-tabelle-zeile-fehler": "\n %1%2 --- --- ERROR", - "vfs-vf-eingang-gf1": "\n\n[VF-Eingang] Slope section GF1 (3 deg, L=%1 mm)", - "kreisel-abbruch-befehl": "\nCommand cancelled.", - "kreisel-abgebrochen": "\nCancelled.", - "kreisel-connect-erfolgreich": "\nKreisel Connect successful!", - "kreisel-connect-header": "\n--- Define Kreisel by line (AN -> SP) ---", - "kreisel-eckrad-beruehrpunkt": "\nTangent point Eckrad (tangent): ", - "kreisel-eckrad-fehler-identisch": "\nError: tangent point and direction point are identical!", - "kreisel-eckrad-richtung": "\nDirection to circle centre: ", - "kreisel-emsg-kein-block": "No block selected!", - "kreisel-emsg-kein-kreisel-block": "Not a Kreisel block! (attribute ABSTAND missing)", - "kreisel-fehler-keine-entities": "\nError: no entities to create block!", - "kreisel-insert-fertig": "\nKreisel module inserted.", - "kreisel-params-attribute-header": "\nAttributes in block:", - "kreisel-params-header": "\n=== Kreisel parameters ===", - "kreisel-prompt-basispunkt": "\nBase point (AN side): ", - "kreisel-prompt-block-auswaehlen": "\nSelect Kreisel block: ", - "kreisel-prompt-endpunkt": "\nEnd point (SP side, outer): ", - "kreisel-prompt-rotation": "\nRotation in degrees <0>: ", - "kreisel-prompt-startpunkt": "\nStart point (AN side, outer): ", - "kreisel-quick-fertig": "\nQuick insert done.", - "kreisel-start-connect": "Kreisel Smart Connect", - "kreisel-start-eckrad": "Insert Eckrad", - "kreisel-start-edit": "Edit Kreisel", - "kreisel-start-insert": "Insert Kreisel module", - "kreisel-start-quick": "Kreisel quick insert", - "kreisel-start-redraw": "Redraw Kreisel", - "kreisel-start-script-connect": "Kreisel script connect", - "kreisel-start-script-insert": "Kreisel script insert", - "kreisel-typ-opt-pin": "\n[2] PIN", - "kreisel-typ-opt-standard": "\n[1] STANDARD (without PIN)", - "kreisel-warn-blockpfad": "\n[KreiselInsert] WARNING: block path not determinable!", - "kreisel-warn-core-fehlt": "\n[KreiselInsert] WARNING: ssg_core.lsp not found - using defaults.", - "omni-abbruch": "\nCancelled.", - "omni-abbruch-bogen": "\n[ARC] Cancelled.", - "omni-abbruch-omni": "\n[OMNI] Cancelled.", - "omni-abbruch-weiche": "\n[SWITCH] Cancelled.", - "omni-bogen-dialog-ladefehler": "Arc dialog could not be loaded.", - "omni-edit-kein-block": "No block selected!", - "omni-edit-kein-element": "No Omniflo element recognised! (ARTINR/block name not in catalog)", - "omni-edit-prompt-auswahl": "\nSelect Omniflo element: ", - "omni-fehler-dxfm-data": "\n[OMNI] ERROR: DXFM_DATA not set!", - "omni-fehler-dxfm-omniflo": "\n[OMNI] ERROR: DXFM_OMNIFLO not set!", - "omni-info-bogen-prompt": "\nEnter Sivas ID of the arc: ", - "omni-info-weiche-prompt": "\nEnter Sivas ID of the switch: ", - "omni-insert-keine-attribute": "\n[OMNI] No attributes found on source block.", - "omni-prompt-drehwinkel": "\nSpecify rotation angle: ", - "omni-prompt-einfuegepunkt": "\nSelect insertion point: ", - "omni-prompt-endpunkt-fahrstrecke": "\nSelect end point of the travel path: ", - "omni-weiche-dialog-ladefehler": "Switch dialog could not be loaded.", - "prompt-wahl-1-2-3-4": "\nYour choice (1/2/3/4) [1]: ", - "vfc-alert-keine-gueltige-linie": "No valid line selected!", - "vfc-bitte-3dlinie-foerderstrecke": "\nPlease select a 3D line for the conveyor section:", - "vfc-bks-weltkoordinaten": "\n UCS set to world coordinates.", - "vfc-eingabemodus-3dlinie": "\n 1 - Select 3D line (start and end point with height)", - "vfc-eingabemodus-header": "\n\nSelect input mode:", - "vfc-eingabemodus-werte": "\n 2 - Enter values manually", - "vfc-fahrtrichtung-0": "\n 1 - 0%1 (X axis +, East)", - "vfc-fahrtrichtung-180": "\n 3 - 180%1 (X axis -, West)", - "vfc-fahrtrichtung-270": "\n 4 - 270%1 (Y axis -, South)", - "vfc-fahrtrichtung-90": "\n 2 - 90%1 (Y axis +, North)", - "vfc-fahrtrichtung-header": "\n\nSelect travel direction:", - "vfc-fehler-keine-linie": "\n ERROR: No line or polyline selected!", - "vfc-foerderrichtung-ab": "\n Conveying direction: DOWN", - "vfc-foerderrichtung-auf": "Up", - "vfc-foerderrichtung-menu": "\nConveying direction:\n 1 - UP\n 2 - DOWN", - "vfc-gf-verteilung-header": "\n\nDistribution of slope sections (front/rear):", - "vfc-gf-verteilung-1": "\n 1 - Even (L_GF1 = L_GF2 = L_GF/2)", - "vfc-gf-verteilung-2": "\n 2 - Front minimum, rear remainder", - "vfc-gf-verteilung-3": "\n 3 - Rear minimum, front remainder", - "vfc-gf-verteilung-4": "\n 4 - Enter custom values", - "vfc-kein-objekt-gewaehlt": "\n No object selected.", - "vfc-label-von-bis": ": from %1mm to %2mm, ", - "vfc-linie-polylinie-waehlen": "\n >> Select 3D line or polyline: ", - "vfc-modus-3dlinie-fallback": "Line", - "vfc-modus-3dlinie-header": "\n\n>>> MODE: Select 3D line <<<", - "vfc-modus-werteingabe-header": "\n\n>>> MODE: Manual value entry <<<", - "vfc-objekt-block-waehlen": "\n >> Select object (block): ", - "vfc-prompt-delta-h": "\n%1H - height difference (mm): ", - "vfc-prompt-delta-l": "\n%1L - horizontal distance (mm): ", - "vfc-prompt-startpunkt-aus": "\nSelect start point for AUS_Element: ", - "vfc-prompt-wahl-1-2-ohne-default": "\nYour choice (1/2): ", - "vfc-status-ok": " OK", - "vfc-warnung-ks-nicht-gefunden": "\n WARNING: KS_EIN/KS_AUS not found!", - "vfc-block-erstellt-eingefuegt": "\n>>> Block '%1' created and inserted.", - "vfc-fehler-keine-entities": "\n>>> ERROR: No entities found for block!", - "vfc-banner-titel": "\n VARIOFOERDERER GENERATOR v26.0", - "vfc-alert-keine-typen": "No types registered!\nCheck vf_standard.lsp and vf_etage.lsp.", - "vfc-typ-vorgewaehlt": "\n>>> Type preselected: %1", - "vfc-anlagen-typ-header": "\n\nSelect system type:", - "vfc-typ-option": "\n %1 - %2", - "vfc-prompt-wahl-1-n": "\nYour choice (1-%1) [1]: ", - "vfc-typ-gewaehlt": "\n>>> Type: %1", - "vfc-naechste-vf-nummer": "\n>>> Next VF number: VF%1", - "vfc-seite-header": "\n\nSelect side:", - "vfc-seite-rechts": "\n 1 - Right", - "vfc-seite-links": "\n 2 - Left", - "vfc-seite-gewaehlt": "\n>>> Side: %1", - "vfc-hinweis-horizontal-moeglich": "\n\n>>> Note: a horizontal VarioFoerderer ( 0%1) is additionally possible for this %2L/%2H!", - "vfc-alert-kein-winkel": "No suitable angle found!\n%1L=%2 mm, %1H=%3 mm, direction=%4", - "vfc-einzige-variante-horizontal": "\n\n>>> Only valid variant: horizontal VarioFoerderer", - "vfc-einziger-winkel": "\n\n>>> Only valid angle: %1%2", - "vfc-mehrere-winkel-header": "\n\nSeveral valid angles available. Please choose:", - "vfc-winkel-option-horizontal": "\n %1 - Horizontal VarioFoerderer (0%2) (L_GF=%3 mm, L_VF=%4 mm)", - "vfc-winkel-option": "\n %1 - %2%3 (L_GF=%4 mm, L_VF=%5 mm)", - "vfc-prompt-winkel-waehlen": "Select angle (1-%1) [1]: ", - "vfc-zus-horizontal": "\n>>> Horizontal VarioFoerderer L_GF: %1 mm L_VF: %2 mm", - "vfc-zus-winkel": "\n>>> Angle: %1%2 L_GF: %3 mm L_VF: %4 mm", - "vfc-prompt-lgf1-vorne": "\nL_GF1 front (mm) [%1]: ", - "vfc-lgf2-hinten": "\n L_GF2 rear: %1 mm", - "vfc-zus-lgf": "\n>>> L_GF1=%1 mm L_GF2=%2 mm", - "vfc-einfuegen-frage": "\n\nDo you want to insert the conveyor system?", - "vfc-einfuegen-optionen": "\n 1 - Yes, insert modules\n 2 - No, cancel", - "vfc-vorgang-abgebrochen": "\nProcess cancelled.", - "vfs-dlg-richtung-auf": "Up", - "vfs-dlg-richtung-ab": "Down", - "vfs-dlg-winkel-horizontal": "Horizontal (GF=%1 mm, VF=%2 mm)", - "vfs-dlg-winkel-option": "%1%2 (GF=%3 mm, VF=%4 mm)", - "vfs-dlg-verteilung-1": "Even (L_GF1 = L_GF2 = L_GF/2)", - "vfs-dlg-verteilung-2": "Front minimum, rear remainder", - "vfs-dlg-verteilung-3": "Rear minimum, front remainder", - "vfs-dlg-verteilung-4": "Enter custom values", - "vfs-edit-kein-vf": "Block %1 is not a VarioFoerderer conveyor.", - "vfs-edit-keine-xdata": "VarioFoerderer %1 was not created with this dialog (Etage/Linienzug/legacy) and cannot be edited here.", - "vfs-edit-neu-aufgebaut": "\nVarioFoerderer %1 rebuilt.", - "vfe-alert-bib-nicht-init": "Etage library not initialised!", - "vfe-berechnung-header": "\n ETAGE CALCULATION FOR ALL ANGLES", - "vfe-bib-bereits-init": "\n Etage library already initialised.", - "vfe-bib-init-erfolg": "\n Etage library successfully initialised.", - "vfe-bib-initialisiere": "\n Initialising Etage library...", - "vfe-ergebnistabelle-header": "\n RESULT TABLE (L_GF = total of both GF sections)", - "vfe-extrahiere-as30": "\n Extracting AS_30_rechts dimensions...", - "vfe-extrahiere-es30": "\n Extracting ES_30_rechts dimensions...", - "vfe-kein-winkel-gefunden": "\n>>> NO matching angle found!", - "vfe-status-gueltig": "VALID", - "vfe-status-ungueltig": "INVALID (negative length)", - "vfe-step5-skip": "\n\n5/15: L_GF1 (skipped)", - "vfe-step6": "\n\n6/15: deflection station (500mm, 3 degrees inclined)", - "vfe-step8-skip": "\n\n8/15: L_VF (skipped)", - "vfe-tabelle-spalten": "\n Angle L_GF (mm) L_VF (mm) Status", - "vfe-warn-block-as30-fehlt": "\n WARNING: block AS_Element_30_rechts missing - using defaults", - "vfe-warn-block-es30-fehlt": "\n WARNING: block ES_Element_30_rechts missing - using defaults", - "vfe-warn-block-fehlt-links": "\n WARNING: block missing - using defaults (left)", - "vfe-warn-block-fehlt-rechts": "\n WARNING: block missing - using defaults (right)", - "vfe-warn-kein-ks-links": "\n WARNING: no KS - using defaults (left)", - "vfe-warn-kein-ks-rechts": "\n WARNING: no KS - using defaults (right)", - "vfe-warn-ks-fehlt-standard": "\n WARNING: KS missing - using defaults", - "vfe-warn-lisp-pfad": "\n[vf_etage] WARNING: Lisp path not determinable - cannot load vf_core.lsp!", - "vfl-abgebrochen-kein-ziel": "\n Cancelled - no target point selected.", - "vfl-bogen-ab3-uebergang": "\n\nVario_Bogen_ab_3 (transition horizontal -> 3 degrees)", - "vfl-bogen-auf3-uebergang": "\n\nVario_Bogen_auf_3 (transition 3 degrees -> horizontal)", - "vfl-gf-verteilung-ganz-einlauf": "\n 2 - Entire buffer section at inlet (GF1), no GF2", - "vfl-gf-verteilung-haelfte": "\n 1 - 1/2 GF at outlet (GF2), 1/2 GF at inlet (GF1)", - "vfl-gf-verteilung-header": "\n\nBuffer section (GF) - choose distribution:", - "vfl-ist-endpunkt-frage": "\n\nIs this the end point of the conveyor?", - "vfl-ist-kettenende-frage": "\n\nIs this the chain end (ES element)?", - "vfl-ja-motorstation-kettenende": "\n 3 - Yes (set motor station, define chain end)", - "vfl-ja-nur-motorstation": "\n 1 - Yes (set motor station only)", - "vfl-ja-separator-es": "\n 1 - Yes (set separator + ES element)", - "vfl-linie-zu-kurz-simple": "\n Line too short - skipped.", - "vfl-linie-zu-kurz-uebersprungen": "\n Line too short (or against travel direction) - skipped.", - "vfl-mehrere-winkel-header": "\n\nSeveral valid angles - please choose the desired angle:", - "vfl-modus1-beschreibung": "\nMixed slope-section/VarioFoerderer chain along a freely", - "vfl-modus1-header": "\n VF-LINIENZUG - Mode 1: Manual entry", - "vfl-naechstes-element-vf": "\n\nNext element in the VarioFoerderer:", - "vfl-nein-weiterbauen": "\n 2 - No (continue building)", - "vfl-opt-auf-ab-foerderer": "\n 3 - Up/down conveyor (line with height difference)", - "vfl-opt-horizontaler-foerderer": "\n 1 - Horizontal conveyor (line without height difference)", - "vfl-opt-vario-kurve": "\n 2 - Vario curve (30/60/90 degrees)", - "vfl-prompt-wahl-1-2-def2": "\nYour choice (1/2) [2]: ", - "vfl-prompt-wahl-1-3-def2": "\nYour choice (1/2/3) [2]: ", - "vfl-prompt-wahl-1-3-def3": "\nYour choice (1/2/3) [3]: ", - "vfl-sep-horizontal-info": "\n [horizontal] Separator (300 mm, 0 degrees)", - "vfs-berechnung-header": "\n CALCULATION FOR ALL ANGLES (Standard)", - "vfs-block-fehlende-header": "\n The following block files are missing:", - "vfs-ergebnistabelle-header": "\n RESULT TABLE", - "vfs-extrahiere-aus": "\n Extracting AUS_Element dimensions...", - "vfs-extrahiere-bogen": "\n Extracting arc dimensions...", - "vfs-extrahiere-ein": "\n Extracting EIN_Element dimensions...", - "vfs-fehler-block-as90": "\n ERROR: block AS_Element_90_links not loaded!", - "vfs-fehler-block-es90": "\n ERROR: block ES_Element_90_links not loaded!", - "vfs-fehler-ks-as90": "\n ERROR: KS_EIN/KS_AUS missing in AS_90!", - "vfs-fehler-ks-es90": "\n ERROR: KS_EIN/KS_AUS missing in ES_90!", - "vfs-fehler-lib-nicht-init": "\n ERROR: library not correctly initialised (AUS/EIN dimensions missing)!", - "vfs-kein-winkel-gefunden": "\n>>> NO matching angle found!", - "vfs-lib-bereits-init": "\n Standard library already initialised.", - "vfs-lib-init-erfolg": "\n Standard library successfully initialised.", - "vfs-lib-init-start": "\n Initialising standard library...", - "vfs-status-gueltig": "VALID", - "vfs-status-ungueltig": "INVALID (negative length)", - "vfs-tabelle-spalten": "\n Angle L_GF (mm) L_VF (mm) Status", - "vfs-vf-eingang-gf1-skip": "\n\n[VF-Eingang] Slope section GF1 (skipped)", - "vfs-vf-eingang-separator": "\n[VF-Eingang] Separator (300 mm, 3 degrees inclined)", - "vfs-vf-eingang-umlenk": "\n[VF-Eingang] Deflection station (500 mm, 3 degrees inclined)", - "vfs-warn-lisppfad": "\n[vf_standard] WARNING: Lisp path not determinable - cannot load vf_core.lsp!", - "dim-switch-modus": "\nMode switched to: %1", - "dim-switch-blocks": "\n DXFM_BLOCKS = %1", - "dim-switch-omniflo": "\n DXFM_OMNIFLO = %1", - "dim-batch-fertig": "\nConversion to %1 complete: %2 GF, %3 VF rebuilt (%4 already in target dimension).", - "sprache-gewechselt": "\nLanguage switched to: %1", - "cmd-block-auswaehlen": "\nSelect block: ", - "cmd-kein-block-ausgewaehlt": "\nNo block selected.", - "cmd-kreisel-bearbeiten": "\nEdit Kreisel: %1", - "cmd-eckrad-bearbeiten": "\nEdit Eckrad: %1", - "cmd-gefaelle-bearbeiten": "\nEdit Gefaellestrecke: %1", - "cmd-variofoerderer-bearbeiten": "\nEdit VarioFoerderer: %1", - "gf-edit-kein-gf": "Block %1 is not a Gefaellestrecke.", - "gf-edit-nur-einfach": "Only simple Gefaellestrecken (without arcs) can be edited via the dialog.\nTYP: %1", - "gf-edit-neu-aufgebaut": "\nGefaellestrecke %1 rebuilt.", - "gf-vf-modul-fehlt": "VarioFoerderer module not loaded!", - "gf-vf-gebaut": "\n-> Parallel VarioFoerderer built (2000 mm beside the Gefaellestrecke, opposite direction, rising).", - "cmd-omniflo-bearbeiten": "\nEdit Omniflo element: %1", - "cmd-attribute-bearbeiten": "\nEdit attributes: %1", - "ils-station-prompt-punkt": "\nInsertion point for %1 [ENTER=End]: ", - "ils-station-fehler-blockdatei": "\n>>> ERROR: block file '%1.dwg' not found (check data/ils).", - "ils-station-fertig": "\n>>> %1 x %2 inserted.", - "layer-prompt-ziel-layer": "\nSelect object on the target layer: ", - "layer-prompt-objekt": "\nSelect object: ", - "layer-prompt-referenz-objekt": "\nSelect reference object (determines type and layer): ", - "layer-prompt-typ-ermittlung": "\nClick again to determine the type: ", - "layer-prompt-ausblenden": "\nClick layer to hide (Enter=End): ", - "layer-prompt-einfrieren": "\nClick layer to freeze (Enter=End): ", - "layer-prompt-aktiv-bleibt": "\nSelect object on the layer that stays ACTIVE: ", - "layer-prompt-name-loeschen": "\nLayer name to delete: ", - "layer-err-kein-objekt": "No object selected.", - "layer-err-kein-ziel-layer": "No target layer selected.", - "layer-err-kein-ziel-layer-kurz": "No target layer.", - "layer-err-keine-passenden-objekte": "No matching objects found.", - "layer-abgebrochen": "Cancelled.", - "layer-err-kein-referenz-objekt": "No reference object selected.", - "layer-err-aktiv-nicht-ausschalten": "Cannot turn off the active layer!", - "layer-err-aktiv-nicht-einfrieren": "Cannot freeze the active layer!", - "layer-aktiver-layer": "\nActive layer: %1", - "layer-objekt-auf-layer": "\nObject is on layer: %1", - "layer-nur-layer-sichtbar": "\nOnly layer '%1' is visible.", - "layer-geloescht": "\nLayer '%1' deleted.", - "layer-leerer-geloescht": "\nEmpty layer '%1' deleted.", - "layer-existiert-nicht": "Layer '%1' does not exist.", - "layer-ques-typ-wechseln": "Change layer of these %1 objects?", - "layer-ques-alle-loeschen": "Delete all objects on layer '%1'?", - "core-start-titel": "\n***** %1 *****\n", - "core-errhan-fehler": "\nError: ", - "core-blockname-exists": "Block name '%1' already exists - skipping.", - "core-dwg-not-found": "\nERROR: Block not found: %1", - "exp-cfg-not-found": "\n[export] WARNING: %1 not found/empty, using defaults.", - "exp-check-ids": "\n[%1] Checking and assigning IDs...", - "exp-update-hoehe-drehung": "\n[%1] Updating height/rotation...", - "exp-collect-blocks": "\n[%1] Collecting relevant blocks...", - "exp-no-blocks-found": "\n[%1] No relevant blocks found.", - "exp-blocks-found": "\n[%1] %2 blocks found.", - "exp-output-dir": "\n[%1] Output folder: %2", - "exp-file-open-error": "\n[%1] ERROR: Cannot open file: %2", - "exp-json-written": "\n[%1] JSON written: %2", - "exp-calling-python": "\n[%1] Calling Python...", - "exp-export-started": "\n[%1] Export started: %2", - "exp-dxfm-lib-missing": "\n[%1] ERROR: Environment variable DXFM_LIB is not set - BricsCAD was probably not started via bin/start_briscad.bat. CSV/JSON were written, the Python call is skipped.", - "exp-python-not-found": "\n[%1] ERROR: Python script not found: %2", - "exp-python-exe": "\n[%1] Interpreter: %2", - "exp-export-done": "\n[%1] Export finished: %2", - "exp-python-call-failed": "\n[%1] ERROR: Could not start Python (WScript.Shell unavailable).", - "exp-python-error": "\n[%1] ERROR: Python exited with code %2. Log: %3", - "exp-python-store-hint": "\n NOTE: No real Python interpreter was found (on Windows 11 'python' points\n to the WindowsApps placeholder). Fix: run bin/install_py.bat (creates .venv)\n and restart BricsCAD via bin/start_briscad.bat, or set the full path to\n python.exe in cfg/export.cfg under [python] interpreter=.", - "exp-csv-missing": "\n[%1] ERROR: Python reported success but the CSV is missing: %2. Log: %3", - "exp-omni-no-inserts": "\n[OMNI_UPDATE] No INSERT blocks in the drawing.", - "exp-omni-updated": "\n[OMNI_UPDATE] %1 elements updated (HEIGHT, ROTATION).", - "id-new-assigned": "\n[ID] New ID assigned: %1", - "id-invalid-block": "\n[ID] ERROR: Not a valid INSERT block!", - "id-check-no-blocks": "\n[IDSCHECK] No relevant blocks found.", - "id-check-missing-set": "\n[IDSCHECK] Missing ID set: %1 (block %2)", - "id-check-duplicate": "\n[IDSCHECK] Duplicate ID %1 -> new ID %2 (block %3)", - "id-check-done": "\n[IDSCHECK] Done. %1 duplicates corrected.", - "id-check-corrected": "\n[IDSCHECK] %1 IDs corrected.", - "id-select-block-prompt": "\nSelect block: ", - "id-generate-invalid": "\n[IDGENERATE] No valid block selected.", - "dialog-nicht-verfuegbar": "Dialog not available.", - "dialog-einfuegepunkt-waehlen": "\nSelect insertion point: ", - "extcall-python-rueckgabe": "\n[SSG_LIB] Python return value: %1", - "extcall-keine-rueckgabe": "\n[SSG_LIB] WARNING: No return value received from Python.", - "extcall-skript-nicht-gefunden": "\n[SSG_LIB] ERROR: %1 not found!", - "vfstart-core-nicht-gefunden": "\n[VarioFoerderer] WARNING: vf_core.lsp not found - commands not available.", - "vfstart-etage-core-nicht-gefunden": "\n[EtageVarioFoerderer] WARNING: vf_core.lsp not found - commands not available.", - "gf-seite-aus-header": "\n\nOutput element (AS_Element_*) - choose side:", - "gf-seite-ein-header": "\n\nInput element (ES_Element_*) - choose side:", - "gf-seite-links": "\n 1 - Left", - "gf-seite-rechts": "\n 2 - Right", - "prompt-wahl-1-2": "\nYour choice (1/2) [1]: ", - "prompt-wahl-1-2-3": "\nYour choice (1/2/3) [1]: ", - "geruest-typ-header": "\n\nSelect scaffold option:", - "geruest-typ-opt": "\n %1 - %2", - "geruest-typ-prompt": "\nScaffold option (1-4) [%1]: ", - "kreisel-eckrad-geruest-frage": "Scaffold for single module?", - "gf-lade-block": "\n Loading block: %1 ...", - "gf-status-ok": " OK", - "gf-warnung-kette-unterbrochen": "\n WARNING: chain interrupted!", - "gf-status-nennlaenge": "\n Total nominal length (incl. arc dx): %1 mm", - "gf-status-feste-hoehenanteile": "\n Fixed height components (AS/ES dz + arc dz): %1 mm", - "gf-status-dz-detail": "\n aus-dz=%1 ein-dz=%2 arc-dz=%3", - "gf-status-resthoehe": "\n Effective remaining height for straights: %1 mm", - "gf-warnung-keine-geraden": "\n WARNING: no straight sections -> fallback 3 deg", - "gf-warnung-feste-anteile": "\n WARNING: fixed components > deltaH -> fallback 1 deg", - "gf-status-naeherungswinkel": "\n>>> Approximate angle: %1%2", - "gf-status-linie-staustrecke": "\n\n%1/%2: Buffer section L=%3 mm hz=%4%5 v=%6%7", - "gf-status-separator-vor-bogen": "\n\n%1S/%2: Separator 300mm (before arc) hz=%3%4 v=%5%6", - "gf-status-bogen-einfuegen": "\n\n%1/%2: %3 hz=%4%5", - "gf-status-linienzug-eingefuegt": "\n>>> Polyline slope section inserted! <<<", - "gf-modus3-header": "\n\n>>> MODE 3: Select polyline <<<", - "gf-modus3-hinweis1": "\nPlease select all lines (LINE) and arcs (ARC) of the path,", - "gf-modus3-hinweis2": "\nthen press ENTER:", - "gf-fehler-keine-objekte": "\nNo objects selected!", - "gf-status-objekte-ausgewaehlt": "\n %1 objects selected.", - "gf-prompt-startpunkt-kette": "\nSelect start point (3D) - KS_EIN output element / chain start: ", - "gf-fehler-kein-startpunkt": "\nNo start point!", - "gf-prompt-endpunkt-kette": "\nSelect end point (3D) - KS_AUS input element / chain end: ", - "gf-fehler-kein-endpunkt": "\nNo end point!", - "gf-status-deltah-3dpunkte": "\n %1H from 3D points: %2 mm", - "gf-status-sortiere-segmente": "\n Sorting segments ...", - "gf-alert-keine-kette": "No connected chain found!", - "gf-status-segmente-gefunden": " %1 segments found.", - "gf-status-segment-analyse-header": "\n\n--- Segment analysis (lengths after trimming) ---", - "gf-status-segment-linie": "\n %1. Line L=%2 mm hz=%3%4", - "gf-status-segment-bogen": "\n %1. Arc %2%3 %4 hz-input=%5%6", - "gf-status-seg-erste-linie": "\n Seg %1 (1st line): -%2 mm (output element)", - "gf-status-linie-vor-bogen": "\n Each line before arc: -300 mm (arc separator)", - "gf-status-seg-letzte-linie": "\n Seg %1 (last line): -300 mm (input sep) -%2 mm (input element)", - "gf-status-eintrittsrichtung": "\n Entry direction: %1%2", - "gf-status-austrittsrichtung": "\n Exit direction: %1%2", - "gf-status-berechne-winkel": "\n\n Calculating slope angle from geometry ...", - "gf-prompt-winkel-verwenden": "\nUse calculated angle %1%2? (y/n) [y]: ", - "gf-prompt-gefaellewinkel": "\nSlope angle (degrees): ", - "gf-status-messe-absenkung": "\n Measuring actual AS/ES drop (iterative) ...", - "gf-warnung-korrektur-bereich": "\n WARNING: correction out of range, angle unchanged", - "gf-status-as-es-mm": "\n AS: %1 mm ES: %2 mm", - "gf-status-korrigierter-winkel": "\n>>> Corrected slope angle: %1%2 (after %3 iter.)", - "gf-status-zus-segmente": "\n>>> Segments: %1", - "gf-status-zus-deltah": "\n>>> %1H: %2 mm", - "gf-status-zus-deltal": "\n>>> %1L: %2 mm", - "gf-status-zus-winkel": "\n>>> Slope angle: %1%2", - "gf-status-zus-eintrittswinkel": "\n>>> Entry angle: %1%2", - "gf-status-zus-austrittswinkel": "\n>>> Exit angle: %1%2", - "gf-status-zus-aus-element": "\n>>> Output element: %1", - "gf-status-zus-ein-element": "\n>>> Input element: %1", - "gf-prompt-einfuegen": "\nInsert? (1=Yes / 2=No) [1]: ", - "gf-status-aus-element-detail": "\n\n>>> Output element: %1 travel dir=%2%3 KS_EIN-hz=%4%5 Z=%6", - "gf-status-separator-vor-ein": "\n>>> Separator before input element", - "gf-status-ein-element-detail": "\n>>> Input element: %1 target Z=%2", - "gf-status-z-hoehe-ks-aus": "\n Z height KS_AUS: %1 mm", - "gf-status-fertig": "\n>>> Done! <<<", - "gf-status-abgebrochen": "\nCancelled.", - "gf-alert-dialog-fehlt": "Dialog file not found:\n%1", - "gf-dlg-richtung-0": "0%1 (X+, East)", - "gf-dlg-richtung-90": "90%1 (Y+, North)", - "gf-dlg-richtung-180": "180%1 (X-, West)", - "gf-dlg-richtung-270": "270%1 (Y-, South)", - "gf-dlg-links": "Left", - "gf-dlg-rechts": "Right", - "gf-status-gf-block-erstellt": "\n>>> GF block created: %1 (%2)", - "gf-status-schritt1-aus": "\n\n1/4: %1 travel dir=%2%3 KS_EIN-hz=%4%5 v=%6%7", - "gf-status-schritt2-staustrecke": "\n\n2/4: Buffer section L=%1 mm hz=%2%3 v=%4%5", - "gf-status-schritt3-separator": "\n\n3/4: Separator 300mm hz=%1%2 v=%3%4", - "gf-status-schritt4-ein": "\n\n4/4: %1", - "gf-status-erfolgreich-eingefuegt": "\n>>> Slope section inserted successfully! <<<", - "gf-banner-titel": "\n SLOPE SECTION GENERATOR v2.0", - "gf-banner-richtung": "\n Direction: always DOWN", - "gf-alert-init-fehler": "Error initialising the library!\nPlease check DXFM_DATA.", - "gf-eingabemodus-header": "\n\nSelect input mode:", - "gf-eingabemodus-1": "\n 1 - Enter values manually (simple section)", - "gf-eingabemodus-2": "\n 2 - Select 3D line (simple section)", - "gf-eingabemodus-3": "\n 3 - Select polyline (LINE + ARC) with slope arc", - "gf-modus1-header": "\n\n>>> MODE 1: Manual value entry <<<", - "gf-prompt-startpunkt-aus": "\nSelect start point for output element: ", - "gf-prompt-deltal-abstand": "\n%1L - distance (mm): ", - "gf-modus2-header": "\n\n>>> MODE 2: Select 3D line <<<", - "gf-status-bks-welt": "\n UCS set to world coordinates.", - "gf-prompt-3dlinie-richtung": "\nPlease select 3D line for direction and length:", - "gf-alert-keine-linie": "No valid line selected!", - "gf-status-fahrtrichtung-linie": "\n Travel direction: %1%2 (from line)", - "gf-status-deltal-mm": "\n %1L = %2 mm", - "gf-prompt-gefaellewinkel-def3": "\n\nSlope angle (degrees) [3]: ", - "gf-status-winkel": "\n>>> Angle: %1%2", - "gf-status-fahrtrichtung": "\n>>> Travel direction: %1%2", - "gf-alert-staustrecke-ungueltig": "Calculated buffer section length invalid: %1 mm\nPlease choose larger deltaL or smaller angle.", - "gf-status-zus2-winkel": "\n>>> Angle: %1%2", - "gf-status-zus2-aus-seite": "\n>>> Output side: %1", - "gf-status-zus2-ein-seite": "\n>>> Input side: %1", - "gf-status-zus2-lstau": "\n>>> L_stau: %1 mm", - "ques-yn-default-yes": " Y/N : ", - "ques-yn-default-no": " Y/N : ", - "tefl-fehler-dxfm-omniflo": "\n[TEF] ERROR: DXFM_OMNIFLO not set (run bin/setenv.bat).", - "tefl-fehler-dxf-nicht-gefunden": "\n[TEF] ERROR: Element DXF not found: %1", - "tefl-prompt-startpunkt": "\nSelect start point of the conveyor path: ", - "tefl-prompt-endpunkt": "\nSelect end point of the conveyor path: ", - "tefl-abgebrochen": "\n[TEF] Cancelled.", - "tefl-fehler-laenge-null": "\n[TEF] ERROR: Start and end point are too close together.", - "tefl-fertig": "\n[TEF] %1 element(s) inserted, path length=%2 mm.", - "vfl-kette-titel": "\n Vario_Kette_Merge - merge several Vario conveyor blocks (loose or already wrapped) into one combined block", - "vfl-kette-start-waehlen": "\n\nSelect the starting block of the chain (first element - AS element or VF_n): ", - "vfl-kette-kein-objekt": "\nNo object selected - cancelled.", - "vfl-kette-kein-vf-block": "\nSelected object ('%1') is not a known Vario chain block (AS/ES element, GF bend, Vario curve, deflection/motor station, vertical bend, buffer/separator or VF_n).", - "vfl-kette-start-nicht-gefunden": "\nERROR: Starting block not found in the chain collection (internal error).", - "vfl-kette-start-nicht-gefunden-diag": "\nERROR: Starting block not found in the chain collection (internal error).\n Diagnostic: %1 blocks collected in total, selected block name='%2', %3 of those with the same block name.", - "vfl-kette-start-ohne-ks-ein": "\nERROR: No KS_EIN found on the selected block - chain cannot be followed.", - "vfl-kette-nur-ein-baustein": "\nNo further connected VF_n block was found from the selected block onward - nothing to merge.", - "vfl-kette-gefunden": "\n\nChain detected: %1 block(s) will be merged:", - "vfl-kette-luecke-warnung": "\n\n WARNING: after '%1' a visually close but not properly connected VF_n ('%2') was found (KS distance %3 mm) - the chain was ended there; this and all further blocks are left untouched.", - "vfl-kette-fertig": "\n\n>>> Done: new combined block '%1' created from %2 block(s).", - "cmd-tro-bearbeiten": "\nEdit TRO marker: %1", - "cmd-connection-bearbeiten": "\nEdit connection: %1", - "con-keine-verbindung": "Block %1 is not a connection (expected CONNECTION_*).", - "con-kein-tro": "Block %1 is not a TRO marker - connections only run between TROs.", - "con-block-fehlt": "Block definition %1 is missing in this drawing.\nRun tro_annotate.py with --flow first.", - "con-quelle-waehlen": "\nSelect source TRO: ", - "con-ziel-waehlen": "\nSelect target TRO: ", - "con-gleicher-block": "Source and target are the same block.", - "con-gleicher-punkt": "Source and target are at the same position.", - "con-dialog-fehlt": "Dialog file not found:\n%1\nCheck DXFM_DCL (setenv.bat).", - "con-block": "Block: %1 (UID %2)", - "con-richtung": "Direction: %1 ----> %2", - "con-hinweis": "The UID is permanent, the TRO id may change.", - "con-id-leer": "Source and target UID must not be empty - nothing changed.", - "con-gleiche-id": "Source and target must not share the same UID.", - "con-eingefuegt": "\nConnection %1 ----> %2 inserted (UID %3).", - "con-gespeichert": "\nConnection saved: %1 ----> %2", - "tro-edit-kein-tro": "Block %1 is not a TRO marker (expected TRO_*).", - "tro-edit-kein-id-attribut": "Block %1 has no ID attribute - please re-annotate (tro_annotate.py).", - "tro-edit-dialog-fehlt": "Dialog file not found:\n%1\nCheck DXFM_DCL (setenv.bat).", - "tro-edit-modul-fehlt": "%1 not loaded - editing attributes with EATTEDIT instead.", - "tro-edit-block": "Block: %1", - "tro-edit-fb": "Function block: %1 UID: %2", - "tro-edit-hinweis": "Symbol and FB follow on the next tro_annotate.py run.", - "tro-edit-id-leer": "The TRO id must not be empty - nothing changed.", - "tro-edit-gespeichert": "\nTRO saved: ID = %1, TYPE = %2", - "tro-edit-typ-geaendert": "\nType changed - re-run tro_annotate.py so symbol and FB match.", - "tro-insert-kein-typ": "No TRO types available (tro_types.lsp missing) - run lib/tro_annotate.py --emit-lisp.", - "tro-insert-hinweis": "The block shape must already exist in the drawing (from an earlier tro_annotate.py run).", - "tro-insert-kein-block": "No symbol for this type in the drawing (%1) - run tro_annotate.py with this type first.", - "tro-insert-prompt-punkt": "\nInsertion point: ", - "tro-insert-eingefuegt": "\nTRO inserted: ID = %1, TYPE = %2" - } + "texts": { + "omni-alle-winkel": "all angles", + "omni-grad": " deg", + "omni-bogen-keine-gefunden": "No arcs found for %1%2.", + "omni-weiche-keine-gefunden": "No switches found for %1%2.", + "vfc-ursprung": "Origin", + "vfc-block-eingefuegt-xyzref-ksaus": "\n '%1' inserted (XY:%2 Z:%3)\n KS_AUS: X=%4 Y=%5 Z=%6", + "vfl-ja": "\n 1 - Yes", + "vfl-nein": "\n 2 - No", + "vfl-sep-vor-frage": "\n\nInsert additional separator BEFORE the horizontal section?", + "vfl-sep-nach-frage": "\n\nInsert additional separator AFTER the horizontal section?", + "vfl-sep-an-stelle-frage": "\n\nInsert additional separator at this point?", + "vf-winkel-aus-header": "\n\nOutput element (AS_Element) - choose angle:", + "vf-winkel-ein-header": "\n\nInput element (ES_Element) - choose angle:", + "vf-winkel-90": "\n 1 - 90 deg", + "vf-winkel-30": "\n 2 - 30 deg", + "vfl-gf-bogen-winkel-header": "\n\nGF arc - choose angle:", + "vfl-gf-bogen-seite-header": "\nGF arc - choose side:", + "vfl-winkel-30": "\n 1 - 30 deg", + "vfl-winkel-60": "\n 2 - 60 deg", + "vfl-winkel-90": "\n 3 - 90 deg", + "vfl-variokurve-winkel-header": "\n\nVario curve - choose angle:", + "vfl-opt1-90grad": "\n 1 - 90 deg", + "vfl-opt2-60grad": "\n 2 - 60 deg", + "vfl-opt3-30grad": "\n 3 - 30 deg", + "vfl-prompt-wahl-1-3-def1": "\nYour choice (1/2/3) [1]: ", + "vfl-variokurve-seite-header": "\nVario curve - choose side:", + "vfl-variokurve-variante-header": "\nVario curve - choose variant:", + "vfl-variante-aussen": "\n 1 - Outer", + "vfl-variante-innen": "\n 2 - Inner", + "vfl-ist-ziel-vergleich-header": "\n\n>>> ACTUAL-TARGET COMPARISON (ES element):", + "vfl-soll-xyz": "\n Target: X=%1 Y=%2 Z=%3", + "vfl-ist-xyz": "\n Actual: X=%1 Y=%2 Z=%3", + "vfl-abweichung-xyz": "\n Deviation: dX=%1 dY=%2 dZ=%3 mm", + "vfl-m3-titel": "\n VF LINE PATH - Mode 2: path + target height (finished; anchors + solver + build)", + "vfl-m3-alert-gf-modul": "Gefaellestrecke module not loaded!", + "vfl-m3-pfad-waehlen": "\n\nSelect path objects (lines/arcs):", + "vfl-m3-keine-objekte": "\nNo objects selected - aborting.", + "vfl-m3-prompt-startpunkt": "\n\nSelect chain start point (higher side): ", + "vfl-prompt-hoehe-startpunkt": "\nHeight (Z) of the start point [%1]: ", + "vfl-m3-prompt-endpunkt": "\n\nSelect chain end point (target): ", + "vfl-m3-prompt-zielhoehe": "\nTarget height (Z) of the end point [%1]: ", + "vfl-m3-fehler-nicht-sortierbar": "\nERROR: path cannot be sorted (is it connected without gaps?).", + "vfl-m3-alert-eckwinkel": "No matching arc: corner angle %1 deg is not ~30/60/90.\nPlease adjust the angles.", + "vfl-m3-seg-gerade": "\n\nSegment %1/%2: straight L=%3 mm hz=%4", + "vfl-m3-auto-vf": "\n (automatic VF - segment follows directly after a Vario curve)", + "vfl-m3-typ-gerade": "\n Type? 1 = GF (input angle) 2 = VF (bridge)", + "vfl-m3-prompt-gf-neigung": "\n GF slope in degrees [3]: ", + "vfl-m3-hinweis-gf-max": "\n Note: GF max. 3 deg - limited to 3.", + "vfl-m3-seg-bogen": "\n\nSegment %1/%2: corner/arc %3 deg %4", + "vfl-m3-typ-bogen": "\n Type? 1 = GF arc 2 = Vario curve", + "vfl-m3-variante-frage": "\n Vario curve - variant? 1 = Outer 2 = Inner", + "vfl-m3-vf-laeufe": "\n\n[M3a] VF runs found: %1", + "vfl-m3-vf-lauf-noetig": "\n[M3a] Exactly ONE VF run required (GF...VF...GF; Vario curves may lie within the run).", + "vfl-m3-vf-lauf-m3b": "\n[M3a] Several/no VF runs -> M3b later.", + "vfl-m3-vf-lauf-ohne-gerade": "\n[M3a] VF run without a VF straight - aborting.", + "vfl-m3-anker-vorschau-header": "\n M3a ANCHOR PREVIEW (rough estimate; exact values during build)", + "vfl-m3-start-hoehe": "\n Start height Z: %1 mm", + "vfl-m3-ziel-hoehe": "\n Target height Z: %1 mm", + "vfl-m3-delta-h-gesamt": "\n delta-H total: %1 mm (positive = descent)", + "vfl-m3-vf-lauf-segmente": "\n VF run: segment %1..%2", + "vfl-m3-front-anker-vorschau": "\n Front anchor Z: %1 mm (forward from AS)", + "vfl-m3-junction-anker-vorschau": "\n Junction anchor Z: %1 mm (backward from ES)", + "vfl-m3-richtung-auf": "up (rising)", + "vfl-m3-richtung-ab": "down (falling)", + "vfl-m3-richtung-horizontal": "horizontal", + "vfl-m3-richtung-auf-kurz": "Up", + "vfl-m3-richtung-ab-kurz": "Down", + "vfl-m3-bruecke-dh": "\n --> Bridge: delta-H = %1 mm over span %2 mm", + "vfl-m3-bruecke-richtung": "\n Direction: VF-%1", + "vfl-m3-vf-angetrieben": "\n (VF is powered - can RISE and FALL; sign = up/down only)", + "vfl-m3-mittlere-neigung": "\n rough mean slope over span: ~%1 deg", + "vfl-m3-warnung-zu-steil": "\n WARNING: ~slope > 51 deg -> too steep for Vario (magnitude infeasible).", + "vfl-m3-vario-bereich-ok": "\n -> within Vario range (3..51 deg), rough orientation.", + "vfl-m3-anker-hinweis": "\n (anchors above = rough preview; exact values are MEASURED during build)", + "vfl-m3-phase-b1": "\n\n>>> Phase B1: building front run (AS + GF) ...", + "vfl-m3-alert-beginnt-bogen": "Chain starts with an arc - please begin with a straight.", + "vfl-m3-kurve-front-uebersprungen": "\n >>> [M3a] Vario curve in front run - skipped.", + "vfl-m3-standard-vario-header": "\n\n --- STANDARD VARIO (climbing segment) + flat zone ---", + "vfl-m3-front-anker-gemessen": "\n Front anchor (measured): %1 mm", + "vfl-m3-junction-exakt": "\n Junction (exact): %1 mm", + "vfl-m3-kletter-info": "\n Climb height %1 mm | climbers %2 | curves %3 | short VF %4", + "vfl-m3-kein-winkel": "\n NO matching Vario angle -> infeasible (front already built).", + "vfl-m3-gf-verteilung": "\n\n GF distribution: 1 - all at inlet (GF1) 2 - 1/2 GF1 + 1/2 GF2", + "vfl-m3-vert-halb": "1/2 GF1 + 1/2 GF2", + "vfl-m3-vert-ganz": "all GF1", + "vfl-m3-vario-ergebnis": "\n -> Vario %1 (%2), L_VF %3 mm, GF total %4 mm, distribution %5 (GF2 remainder = measured fine correction)", + "vfl-m3-warnung-gf2-negativ": "\n WARNING: body climbs too little - GF2<0 (missing %1 mm). Angle too shallow; dZ not exact.", + "vfl-m3-gf2-ausgleich": "\n GF2 (measured compensation): L=%1 mm", + "vfl-m3-kurve-back-uebersprungen": "\n >>> [M3a] Vario curve in back run - skipped.", + "vfl-m3-nichts-gebaut": "\nNothing built - aborting.", + "vfl-m3-fertig-header": "\n>>> VF line path (mode 2) built! <<<", + "vfl-m3-ziel-soll": "\n Target (nominal): X=%1 Y=%2 Z=%3", + "vfl-m3-es-ist": "\n ES (actual): X=%1 Y=%2 Z=%3", + "vfl-m3-abweichung": "\n Deviation: dX=%1 dY=%2 dZ=%3 mm", + "vfl-m3-laengs-quer": "\n Along KS_AUS axis: %1 mm | across axis (should be ~0): %2 mm", + "vfl-m3-achse-hinweis": "\n (dZ=target height; across KS_AUS axis ~0 => end point lies on the axis)", + "gf-fehler-block-fehlt": "\n ERROR: block '%1' missing", + "gf-fehler-block-fehlt-ausruf": "\n ERROR: block '%1' missing!", + "gf-fehler-blockdatei-fehlt": "\n ERROR: block file not found: %1", + "gf-fehler-keine-linie": "\n Error: no line!", + "gf-laenge-null-uebersprungen": "\n (length 0 - skipped)", + "gf-prompt-linie-waehlen": "\n >> Select line: ", + "gf-status-3dlinie-z": "\n 3D line: Z_start=%1 Z_end=%2", + "gf-status-block-l-z": "\n %1 L=%2 -> Z=%3", + "gf-status-bogen-masse": "\n %1: dx=%2 dz=%3", + "gf-status-gefaellebogen": "\n Slope arc %1 hz=%2%3 -> Z=%4", + "gf-status-hzincl": "\n HzIncl %1 L=%2 hz=%3%4 v=%5%6 -> Z=%7", + "gf-status-hzks": "\n HzKS %1 hz=%2%3 v=%4%5 -> Z=%6", + "gf-status-ks-aus-z": "\n KS_AUS Z=%1", + "gf-warnung-block-fehlt-nullwerte": "\n WARNING: %1 missing - using zero values", + "gf-warnung-ks-fehlt": "\n WARNING: KS_EIN/KS_AUS missing!", + "gf-warnung-ks-fehlt-in": "\n WARNING: KS missing in '%1'", + "gf-warnung-ks-fehlt-in2": "\n WARNING: KS missing in %1", + "kreisel-abstand-ausgabe": "\n-> Distance: %1 mm", + "kreisel-beschriftung-erzeugt": "\n-> Label: %1 (height=%2mm, Arial, centered)", + "kreisel-bestehende-blockdef": "\n-> Using existing block definition: %1", + "kreisel-connect-zusammenfassung": "\n-> Distance: %1 mm Rotation: %2 deg Height: %3 Kreisel type: %4", + "kreisel-eckrad-eingefuegt": "\n-> Eckrad #%1 inserted: %2 at %3,%4 rotation=%5 height=%6", + "kreisel-edit-aktualisiert": "\nKreisel updated: Name=%1 Distance=%2 Height=%3 Rotation=%4", + "kreisel-edit-bestehend": "\n-> Existing: Distance=%1 Rotation=%2 Type=%3", + "kreisel-edit-dialog-fehlt": "Dialog not available: %1", + "kreisel-eingefuegt": "\n-> Kreisel #%1 inserted: %2 (height=%3)", + "kreisel-emsg-distanz-klein": "Distance too small! (%1 < %2)", + "kreisel-hoehe-aus-3dpunkt": "\n-> Height taken from 3D point: %1", + "kreisel-hoehe-aus-basispunkt": "\n-> Height taken from base point: %1", + "kreisel-hoehe-aus-startpunkt": "\n-> Height taken from start point: %1", + "kreisel-hoehe-von-bestehendem": "\n-> Height taken from existing Kreisel: %1", + "kreisel-insert-zusammenfassung": "\n-> Rotation: %1 Height: %2 Kreisel type: %3", + "kreisel-labelsetup-fertig": "\nNew settings: Height=%1, Colour=%2, Y offset=%3, Font=Arial", + "kreisel-neue-beschriftungsposition": "\nNew label position: X=%1 Y=%2", + "kreisel-neue-blockdef": "\n-> New block definition: %1", + "kreisel-neue-texthoehe": "\nNew text height: %1", + "kreisel-params-default-hoehe": "\nDefault height: %1", + "kreisel-params-default-laenge": "\nDefault length: %1", + "kreisel-params-durchmesser": "\nDiameter: %1", + "kreisel-params-typ": "\nKreisel type: %1", + "kreisel-prompt-abstand": "\nDistance (tangent length) <%1>: ", + "kreisel-prompt-abstand-oben": "\nDistance above Kreisel centre <%1>: ", + "kreisel-prompt-hoehe-z": "\nHeight (Z coordinate) <%1>: ", + "kreisel-prompt-neue-hoehe": "\nNew height <%1>: ", + "kreisel-prompt-neuer-abstand": "\nNew distance <%1>: ", + "kreisel-prompt-schriftfarbe": "\nFont colour (1=Red,2=Yellow,3=Green,4=Cyan,5=Blue,6=Magenta,7=White) <%1>: ", + "kreisel-prompt-schrifthoehe": "\nFont height <%1>: ", + "kreisel-prompt-texthoehe": "\nText height <%1>: ", + "kreisel-prompt-x-abstand": "\nX distance from AN8 centre <%1>: ", + "kreisel-prompt-y-abstand": "\nY distance from AN8 centre <%1>: ", + "kreisel-redraw-bestehend": "\n-> Existing: Distance=%1 Rotation=%2 Height=%3 Type=%4", + "kreisel-redraw-fertig": "\nKreisel redrawn. Distance=%1", + "kreisel-script-distanz-klein": "\n[Connect] Distance too small: %1", + "kreisel-textstil-erstellt": "\n-> Text style '%1' created with Arial", + "kreisel-typ-prompt": "\nPlease choose <%1>: ", + "omni-bogen-info-antriebsart": "\n Drive type: %1", + "omni-bogen-info-breite": "\n Width: %1", + "omni-bogen-info-kurvenwinkel": "\n Curve angle: %1", + "omni-bogen-info-laenge": "\n Length: %1", + "omni-bogen-info-profiltyp": "\n Profile type: %1", + "omni-bogen-info-radius": "\n Radius: %1", + "omni-bogen-nicht-gefunden": "\nNo arc with Sivas ID '%1' found.", + "omni-dxf-eingefuegt": "\n[OMNI] %1 inserted. Height=%2 Rotation=%3%4", + "omni-edit-aktualisiert": "\n[OMNI] Element updated: %1 Height=%2 Rotation=%3", + "omni-edit-dxf-nicht-gefunden": "DXF not found: %1", + "omni-einfuegen-info": "\n[OMNI] Inserting: %1 (%2)", + "omni-fehler-dxf-nicht-gefunden": "\n[OMNI] ERROR: DXF not found: %1", + "omni-insert-block-eingefuegt": "\n[OMNI] %1 inserted. Length=%2 mm", + "omni-laenge-ueberschritten": "The requested travel path length of %1 mm exceeds the maximum length of %2 mm of the travel path profile.\nPlease redefine!", + "omni-weiche-info-breite": "\n Width: %1", + "omni-weiche-info-kurvenrichtung": "\n Curve direction:%1", + "omni-weiche-info-kurvenwinkel": "\n Curve angle: %1", + "omni-weiche-info-laenge": "\n Length: %1", + "omni-weiche-info-profiltyp": "\n Profile type: %1", + "omni-weiche-info-schaltungstyp": "\n Switch type: %1", + "omni-weiche-info-weichentyp": "\n Type of switch: %1", + "omni-weiche-info-wklaenge": "\n WK length: %1", + "omni-weiche-nicht-gefunden": "\nNo switch with Sivas ID '%1' found.", + "vfc-3dlinie-start-ende": "\n 3D line:\n Start: X=%1 Y=%2 Z=%3\n End: X=%4 Y=%5 Z=%6", + "vfc-3dpolylinie-start-ende": "\n 3D polyline:\n Start Z=%1 End Z=%2", + "vfc-block-einfuegepunkt": "\n Block insertion point: X=%1 Y=%2 Z=%3", + "vfc-block-eingefuegt-ksaus": "\n '%1' inserted\n KS_AUS: X=%2 Y=%3 Z=%4", + "vfc-delta-l-h-richtung": "\n %1L=%2 mm %1H=%3 mm Travel direction=%4%5", + "vfc-endpunkt-xyz": "\n End point: X=%1 Y=%2 Z=%3", + "vfc-endpunkt-xyz-dxdz": "\n End point: X=%1 Y=%2 Z=%3 (dx=%4 dz=%5)", + "vfc-fahrtrichtung-ergebnis": "\n>>> Travel direction: %1%2", + "vfc-fehler-block-datei-fehlt": "\n ERROR: block file not found: %1", + "vfc-fehler-block-nicht-in-bibliothek": "\n ERROR: block '%1' not in library", + "vfc-fehler-block-nicht-in-bibliothek-abgebrochen": "\n ERROR: block '%1' not in library - cancelled", + "vfc-fehler-ks-fehlen": "\n ERROR: KS_EIN/KS_AUS missing in '%1'", + "vfc-fehler-ungueltiger-einfuegepunkt": "\n ERROR: invalid insertion point for '%1'", + "vfc-fuege-block-ein-hz": "\n Inserting block '%1'... (hz=%2%3)", + "vfc-fuege-block-ein-rotation-hz": "\n Inserting block '%1' (rotation %2%3 hz=%4%5)", + "vfc-fuege-ein-lwhz": "\n Inserting '%1' (L=%2 mm, W=%3%4 hz=%5%6)", + "vfc-ks-aus-xyz": "\n KS_AUS: X=%1 Y=%2 Z=%3", + "vfc-lade-block": "\n Loading block: %1 ...", + "vfc-laenge-uebersprungen": "\n Length=%1 mm -> skipped", + "vfc-punkt-auf-objekt": "\n Point on object: Z=%1 mm", + "vfe-as30-mass": "\n AS_30_rechts: dx=%1 mm, dz=%2 mm", + "vfe-block-fehlt-abbruch": "\n ERROR: block '%1' not in library - cancelled", + "vfe-bogen-nicht-vorhanden": "\n %1 -> arc not available", + "vfe-delta-info": "\nΔL=%1 mm ΔH=%2 mm Direction=%3", + "vfe-empfohlener-winkel": "\n>>> Recommended angle: %1", + "vfe-es30-mass": "\n ES_30_rechts: dx=%1 mm, dz=%2 mm", + "vfe-extrahiere-block-mass": "\n Extracting %1 dimensions...", + "vfe-gefaellebogen-links-mass": "\n Slope arc left: dx=%1 dz=%2 mm", + "vfe-gefaellebogen-rechts-mass": "\n Slope arc right: dx=%1 dz=%2 mm", + "vfe-gefaellebogen-seite-dx": "\n Slope arc %1: dx=%2 mm", + "vfe-hz-incl-status": "\n HzIncl %1 L=%2 hz=%3 v=%4 -> Z=%5", + "vfe-hz-rot-status": "\n HzRot %1 hz=%2 v=%3 -> Z=%4", + "vfe-hz-rotks-status": "\n HzRotKS %1 hz=%2 -> Z=%3", + "vfe-hz-scaleks-status": "\n HzScaleKS %1 %2mm hz=%3 -> Z=%4", + "vfe-ks-fehlt-startpunkt": "\n WARNING: KS missing in '%1' - using start point", + "vfe-step1-as30": "\n\n1/15: %1 (0 deg)", + "vfe-step2": "\n\n2/15: Buffer section 400mm (%1 deg hz, 3 deg vert, KS_EIN)", + "vfe-step3": "\n\n3/15: Separator (300mm, %1 deg hz, 3 deg vert)", + "vfe-step4": "\n\n4/15: %1 (start, %2 deg hz, 0 deg vert, KS_EIN)", + "vfe-step5-strecke": "\n\n5/15: Slope section (3 deg, L=%1 mm)", + "vfe-step7": "\n\n7/15: %1 (3 deg inclined)", + "vfe-step8-ab": "\n\n8/15: Slope section (%1 deg, L=%2 mm)", + "vfe-step8-auf": "\n\n8/15: Incline section (%1 deg, L=%2 mm)", + "vfe-tabelle-zeile": "\n %1 %2 mm %3 mm ", + "vfe-tabelle-zeile-fehler": "\n %1 --- --- ERROR", + "vfl-20m-hinweis": "\n >>> NOTE: conveyor longer than 20 m (%1 m) - motor station recommended!", + "vfl-block-erstellt": "\n>>> Block '%1' (%2) created and inserted.", + "vfl-fehler-rest-nicht-baubar": "\n ERROR: remainder cannot be built (too steep/too short for tail motor+GF2+separator+ES). Please continue drawing or plan flatter.", + "vfl-fuege-block-ein": "\n Inserting %1 ...", + "vfl-hinweis-gf2-minimum": "\n NOTE: calculated GF2=%1 mm < minimum %2 mm -> raised to minimum (ES therefore ends a bit further on; see actual-vs-target report).", + "vfl-horizontale-zwischenstrecke": "\n\nHorizontal intermediate section (0 deg, L=%1 mm)", + "vfl-kettenende-modus-ziel": "\n>>> Chain-end mode: target dL=%1 mm, dH=%2 mm (%3). GF2 varies with the angle.", + "vfl-prompt-hoehe-endpunkt": "\nHeight (Z) of the end point [%1]: ", + "vfl-prompt-hoehe-kettenende": "\nHeight (Z) of the chain end (ES element) [%1]: ", + "vfl-prompt-wahl-bis-n": "\nYour choice (1-%1) [1]: ", + "vfl-segment-gf-nicht-erlaubt": "\n Segment would be GF (too steep) or not buildable - not allowed within a VF unit.\n Please draw flatter/rising or end the conveyor.", + "vfl-winkel-option": "\n %1 - %2 deg (L_GF=%3 mm L_VF=%4 mm)", + "vfs-as90-mass": "\n AS_90: dx=%1 dz=%2", + "vfs-berechnung-parameter": "\nΔL=%1 mm ΔH=%2 mm Direction=%3", + "vfs-block-fehlende-item": "\n - %1", + "vfs-block-fehler-pfad": "\n ERROR: DXFM_BLOCKS = %1", + "vfs-bogen-ab-block-fehlt": "\n ERROR ab_%1: block not loaded!", + "vfs-bogen-ab-ks-fehlt": "\n ERROR ab_%1: KS missing!", + "vfs-bogen-ab-ok": "\n OK ab_%1: dx=%2 dz=%3", + "vfs-bogen-auf-block-fehlt": "\n ERROR auf_%1: block not loaded!", + "vfs-bogen-auf-ks-fehlt": "\n ERROR auf_%1: KS missing!", + "vfs-bogen-auf-ok": "\n OK auf_%1: dx=%2 dz=%3", + "vfs-empfohlener-winkel": "\n>>> Recommended angle: %1%2", + "vfs-es90-mass": "\n ES_90: dx=%1 dz=%2", + "vfs-fehler-winkel-tabelle": "\n ERROR: angle %1 not in arc table!", + "vfs-schritt-as": "\n\n1/11: %1 (hz=%2%3)", + "vfs-schritt5-bogen1": "\n\n5/11: %1 (3 deg inclined)", + "vfs-tabelle-zeile": "\n %1%2 %3 mm %4 mm ", + "vfs-tabelle-zeile-fehler": "\n %1%2 --- --- ERROR", + "vfs-vf-eingang-gf1": "\n\n[VF-Eingang] Slope section GF1 (3 deg, L=%1 mm)", + "kreisel-abbruch-befehl": "\nCommand cancelled.", + "kreisel-abgebrochen": "\nCancelled.", + "kreisel-connect-erfolgreich": "\nKreisel Connect successful!", + "kreisel-connect-header": "\n--- Define Kreisel by line (AN -> SP) ---", + "kreisel-eckrad-beruehrpunkt": "\nTangent point Eckrad (tangent): ", + "kreisel-eckrad-fehler-identisch": "\nError: tangent point and direction point are identical!", + "kreisel-eckrad-richtung": "\nDirection to circle centre: ", + "kreisel-emsg-kein-block": "No block selected!", + "kreisel-emsg-kein-kreisel-block": "Not a Kreisel block! (attribute ABSTAND missing)", + "kreisel-fehler-keine-entities": "\nError: no entities to create block!", + "kreisel-insert-fertig": "\nKreisel module inserted.", + "kreisel-params-attribute-header": "\nAttributes in block:", + "kreisel-params-header": "\n=== Kreisel parameters ===", + "kreisel-prompt-basispunkt": "\nBase point (AN side): ", + "kreisel-prompt-block-auswaehlen": "\nSelect Kreisel block: ", + "kreisel-prompt-endpunkt": "\nEnd point (SP side, outer): ", + "kreisel-prompt-rotation": "\nRotation in degrees <0>: ", + "kreisel-prompt-startpunkt": "\nStart point (AN side, outer): ", + "kreisel-quick-fertig": "\nQuick insert done.", + "kreisel-start-connect": "Kreisel Smart Connect", + "kreisel-start-eckrad": "Insert Eckrad", + "kreisel-start-edit": "Edit Kreisel", + "kreisel-start-insert": "Insert Kreisel module", + "kreisel-start-quick": "Kreisel quick insert", + "kreisel-start-redraw": "Redraw Kreisel", + "kreisel-start-script-connect": "Kreisel script connect", + "kreisel-start-script-insert": "Kreisel script insert", + "kreisel-typ-opt-pin": "\n[2] PIN", + "kreisel-typ-opt-standard": "\n[1] STANDARD (without PIN)", + "kreisel-warn-blockpfad": "\n[KreiselInsert] WARNING: block path not determinable!", + "kreisel-warn-core-fehlt": "\n[KreiselInsert] WARNING: ssg_core.lsp not found - using defaults.", + "omni-abbruch": "\nCancelled.", + "omni-abbruch-bogen": "\n[ARC] Cancelled.", + "omni-abbruch-omni": "\n[OMNI] Cancelled.", + "omni-abbruch-weiche": "\n[SWITCH] Cancelled.", + "omni-bogen-dialog-ladefehler": "Arc dialog could not be loaded.", + "omni-edit-kein-block": "No block selected!", + "omni-edit-kein-element": "No Omniflo element recognised! (ARTINR/block name not in catalog)", + "omni-edit-prompt-auswahl": "\nSelect Omniflo element: ", + "omni-fehler-dxfm-data": "\n[OMNI] ERROR: DXFM_DATA not set!", + "omni-fehler-dxfm-omniflo": "\n[OMNI] ERROR: DXFM_OMNIFLO not set!", + "omni-info-bogen-prompt": "\nEnter Sivas ID of the arc: ", + "omni-info-weiche-prompt": "\nEnter Sivas ID of the switch: ", + "omni-insert-keine-attribute": "\n[OMNI] No attributes found on source block.", + "omni-prompt-drehwinkel": "\nSpecify rotation angle: ", + "omni-prompt-einfuegepunkt": "\nSelect insertion point: ", + "omni-prompt-endpunkt-fahrstrecke": "\nSelect end point of the travel path: ", + "omni-weiche-dialog-ladefehler": "Switch dialog could not be loaded.", + "prompt-wahl-1-2-3-4": "\nYour choice (1/2/3/4) [1]: ", + "vfc-alert-keine-gueltige-linie": "No valid line selected!", + "vfc-bitte-3dlinie-foerderstrecke": "\nPlease select a 3D line for the conveyor section:", + "vfc-bks-weltkoordinaten": "\n UCS set to world coordinates.", + "vfc-eingabemodus-3dlinie": "\n 1 - Select 3D line (start and end point with height)", + "vfc-eingabemodus-header": "\n\nSelect input mode:", + "vfc-eingabemodus-werte": "\n 2 - Enter values manually", + "vfc-fahrtrichtung-0": "\n 1 - 0%1 (X axis +, East)", + "vfc-fahrtrichtung-180": "\n 3 - 180%1 (X axis -, West)", + "vfc-fahrtrichtung-270": "\n 4 - 270%1 (Y axis -, South)", + "vfc-fahrtrichtung-90": "\n 2 - 90%1 (Y axis +, North)", + "vfc-fahrtrichtung-header": "\n\nSelect travel direction:", + "vfc-fehler-keine-linie": "\n ERROR: No line or polyline selected!", + "vfc-foerderrichtung-ab": "\n Conveying direction: DOWN", + "vfc-foerderrichtung-auf": "Up", + "vfc-foerderrichtung-menu": "\nConveying direction:\n 1 - UP\n 2 - DOWN", + "vfc-gf-verteilung-header": "\n\nDistribution of slope sections (front/rear):", + "vfc-gf-verteilung-1": "\n 1 - Even (L_GF1 = L_GF2 = L_GF/2)", + "vfc-gf-verteilung-2": "\n 2 - Front minimum, rear remainder", + "vfc-gf-verteilung-3": "\n 3 - Rear minimum, front remainder", + "vfc-gf-verteilung-4": "\n 4 - Enter custom values", + "vfc-kein-objekt-gewaehlt": "\n No object selected.", + "vfc-label-von-bis": ": from %1mm to %2mm, ", + "vfc-linie-polylinie-waehlen": "\n >> Select 3D line or polyline: ", + "vfc-modus-3dlinie-fallback": "Line", + "vfc-modus-3dlinie-header": "\n\n>>> MODE: Select 3D line <<<", + "vfc-modus-werteingabe-header": "\n\n>>> MODE: Manual value entry <<<", + "vfc-objekt-block-waehlen": "\n >> Select object (block): ", + "vfc-prompt-delta-h": "\n%1H - height difference (mm): ", + "vfc-prompt-delta-l": "\n%1L - horizontal distance (mm): ", + "vfc-prompt-startpunkt-aus": "\nSelect start point for AUS_Element: ", + "vfc-prompt-wahl-1-2-ohne-default": "\nYour choice (1/2): ", + "vfc-status-ok": " OK", + "vfc-warnung-ks-nicht-gefunden": "\n WARNING: KS_EIN/KS_AUS not found!", + "vfc-block-erstellt-eingefuegt": "\n>>> Block '%1' created and inserted.", + "vfc-fehler-keine-entities": "\n>>> ERROR: No entities found for block!", + "vfc-banner-titel": "\n VARIOFOERDERER GENERATOR v26.0", + "vfc-alert-keine-typen": "No types registered!\nCheck vf_standard.lsp and vf_etage.lsp.", + "vfc-typ-vorgewaehlt": "\n>>> Type preselected: %1", + "vfc-anlagen-typ-header": "\n\nSelect system type:", + "vfc-typ-option": "\n %1 - %2", + "vfc-prompt-wahl-1-n": "\nYour choice (1-%1) [1]: ", + "vfc-typ-gewaehlt": "\n>>> Type: %1", + "vfc-naechste-vf-nummer": "\n>>> Next VF number: VF%1", + "vfc-seite-header": "\n\nSelect side:", + "vfc-seite-rechts": "\n 1 - Right", + "vfc-seite-links": "\n 2 - Left", + "vfc-seite-gewaehlt": "\n>>> Side: %1", + "vfc-hinweis-horizontal-moeglich": "\n\n>>> Note: a horizontal VarioFoerderer ( 0%1) is additionally possible for this %2L/%2H!", + "vfc-alert-kein-winkel": "No suitable angle found!\n%1L=%2 mm, %1H=%3 mm, direction=%4", + "vfc-einzige-variante-horizontal": "\n\n>>> Only valid variant: horizontal VarioFoerderer", + "vfc-einziger-winkel": "\n\n>>> Only valid angle: %1%2", + "vfc-mehrere-winkel-header": "\n\nSeveral valid angles available. Please choose:", + "vfc-winkel-option-horizontal": "\n %1 - Horizontal VarioFoerderer (0%2) (L_GF=%3 mm, L_VF=%4 mm)", + "vfc-winkel-option": "\n %1 - %2%3 (L_GF=%4 mm, L_VF=%5 mm)", + "vfc-prompt-winkel-waehlen": "Select angle (1-%1) [1]: ", + "vfc-zus-horizontal": "\n>>> Horizontal VarioFoerderer L_GF: %1 mm L_VF: %2 mm", + "vfc-zus-winkel": "\n>>> Angle: %1%2 L_GF: %3 mm L_VF: %4 mm", + "vfc-prompt-lgf1-vorne": "\nL_GF1 front (mm) [%1]: ", + "vfc-lgf2-hinten": "\n L_GF2 rear: %1 mm", + "vfc-zus-lgf": "\n>>> L_GF1=%1 mm L_GF2=%2 mm", + "vfc-einfuegen-frage": "\n\nDo you want to insert the conveyor system?", + "vfc-einfuegen-optionen": "\n 1 - Yes, insert modules\n 2 - No, cancel", + "vfc-vorgang-abgebrochen": "\nProcess cancelled.", + "vfs-dlg-richtung-auf": "Up", + "vfs-dlg-richtung-ab": "Down", + "vfs-dlg-winkel-horizontal": "Horizontal (GF=%1 mm, VF=%2 mm)", + "vfs-dlg-winkel-option": "%1%2 (GF=%3 mm, VF=%4 mm)", + "vfs-dlg-verteilung-1": "Even (L_GF1 = L_GF2 = L_GF/2)", + "vfs-dlg-verteilung-2": "Front minimum, rear remainder", + "vfs-dlg-verteilung-3": "Rear minimum, front remainder", + "vfs-dlg-verteilung-4": "Enter custom values", + "vfs-edit-kein-vf": "Block %1 is not a VarioFoerderer conveyor.", + "vfs-edit-keine-xdata": "VarioFoerderer %1 was not created with this dialog (Etage/Linienzug/legacy) and cannot be edited here.", + "vfs-edit-neu-aufgebaut": "\nVarioFoerderer %1 rebuilt.", + "vfe-alert-bib-nicht-init": "Etage library not initialised!", + "vfe-berechnung-header": "\n ETAGE CALCULATION FOR ALL ANGLES", + "vfe-bib-bereits-init": "\n Etage library already initialised.", + "vfe-bib-init-erfolg": "\n Etage library successfully initialised.", + "vfe-bib-initialisiere": "\n Initialising Etage library...", + "vfe-ergebnistabelle-header": "\n RESULT TABLE (L_GF = total of both GF sections)", + "vfe-extrahiere-as30": "\n Extracting AS_30_rechts dimensions...", + "vfe-extrahiere-es30": "\n Extracting ES_30_rechts dimensions...", + "vfe-kein-winkel-gefunden": "\n>>> NO matching angle found!", + "vfe-status-gueltig": "VALID", + "vfe-status-ungueltig": "INVALID (negative length)", + "vfe-step5-skip": "\n\n5/15: L_GF1 (skipped)", + "vfe-step6": "\n\n6/15: deflection station (500mm, 3 degrees inclined)", + "vfe-step8-skip": "\n\n8/15: L_VF (skipped)", + "vfe-tabelle-spalten": "\n Angle L_GF (mm) L_VF (mm) Status", + "vfe-warn-block-as30-fehlt": "\n WARNING: block AS_Element_30_rechts missing - using defaults", + "vfe-warn-block-es30-fehlt": "\n WARNING: block ES_Element_30_rechts missing - using defaults", + "vfe-warn-block-fehlt-links": "\n WARNING: block missing - using defaults (left)", + "vfe-warn-block-fehlt-rechts": "\n WARNING: block missing - using defaults (right)", + "vfe-warn-kein-ks-links": "\n WARNING: no KS - using defaults (left)", + "vfe-warn-kein-ks-rechts": "\n WARNING: no KS - using defaults (right)", + "vfe-warn-ks-fehlt-standard": "\n WARNING: KS missing - using defaults", + "vfe-warn-lisp-pfad": "\n[vf_etage] WARNING: Lisp path not determinable - cannot load vf_core.lsp!", + "vfl-abgebrochen-kein-ziel": "\n Cancelled - no target point selected.", + "vfl-bogen-ab3-uebergang": "\n\nVario_Bogen_ab_3 (transition horizontal -> 3 degrees)", + "vfl-bogen-auf3-uebergang": "\n\nVario_Bogen_auf_3 (transition 3 degrees -> horizontal)", + "vfl-gf-verteilung-ganz-einlauf": "\n 2 - Entire buffer section at inlet (GF1), no GF2", + "vfl-gf-verteilung-haelfte": "\n 1 - 1/2 GF at outlet (GF2), 1/2 GF at inlet (GF1)", + "vfl-gf-verteilung-header": "\n\nBuffer section (GF) - choose distribution:", + "vfl-ist-endpunkt-frage": "\n\nIs this the end point of the conveyor?", + "vfl-ist-kettenende-frage": "\n\nIs this the chain end (ES element)?", + "vfl-ja-motorstation-kettenende": "\n 3 - Yes (set motor station, define chain end)", + "vfl-ja-nur-motorstation": "\n 1 - Yes (set motor station only)", + "vfl-ja-separator-es": "\n 1 - Yes (set separator + ES element)", + "vfl-linie-zu-kurz-simple": "\n Line too short - skipped.", + "vfl-linie-zu-kurz-uebersprungen": "\n Line too short (or against travel direction) - skipped.", + "vfl-mehrere-winkel-header": "\n\nSeveral valid angles - please choose the desired angle:", + "vfl-modus1-beschreibung": "\nMixed slope-section/VarioFoerderer chain along a freely", + "vfl-modus1-header": "\n VF-LINIENZUG - Mode 1: Manual entry", + "vfl-naechstes-element-vf": "\n\nNext element in the VarioFoerderer:", + "vfl-nein-weiterbauen": "\n 2 - No (continue building)", + "vfl-opt-auf-ab-foerderer": "\n 3 - Up/down conveyor (line with height difference)", + "vfl-opt-horizontaler-foerderer": "\n 1 - Horizontal conveyor (line without height difference)", + "vfl-opt-vario-kurve": "\n 2 - Vario curve (30/60/90 degrees)", + "vfl-prompt-wahl-1-2-def2": "\nYour choice (1/2) [2]: ", + "vfl-prompt-wahl-1-3-def2": "\nYour choice (1/2/3) [2]: ", + "vfl-prompt-wahl-1-3-def3": "\nYour choice (1/2/3) [3]: ", + "vfl-sep-horizontal-info": "\n [horizontal] Separator (300 mm, 0 degrees)", + "vfs-berechnung-header": "\n CALCULATION FOR ALL ANGLES (Standard)", + "vfs-block-fehlende-header": "\n The following block files are missing:", + "vfs-ergebnistabelle-header": "\n RESULT TABLE", + "vfs-extrahiere-aus": "\n Extracting AUS_Element dimensions...", + "vfs-extrahiere-bogen": "\n Extracting arc dimensions...", + "vfs-extrahiere-ein": "\n Extracting EIN_Element dimensions...", + "vfs-fehler-block-as90": "\n ERROR: block AS_Element_90_links not loaded!", + "vfs-fehler-block-es90": "\n ERROR: block ES_Element_90_links not loaded!", + "vfs-fehler-ks-as90": "\n ERROR: KS_EIN/KS_AUS missing in AS_90!", + "vfs-fehler-ks-es90": "\n ERROR: KS_EIN/KS_AUS missing in ES_90!", + "vfs-fehler-lib-nicht-init": "\n ERROR: library not correctly initialised (AUS/EIN dimensions missing)!", + "vfs-kein-winkel-gefunden": "\n>>> NO matching angle found!", + "vfs-lib-bereits-init": "\n Standard library already initialised.", + "vfs-lib-init-erfolg": "\n Standard library successfully initialised.", + "vfs-lib-init-start": "\n Initialising standard library...", + "vfs-status-gueltig": "VALID", + "vfs-status-ungueltig": "INVALID (negative length)", + "vfs-tabelle-spalten": "\n Angle L_GF (mm) L_VF (mm) Status", + "vfs-vf-eingang-gf1-skip": "\n\n[VF-Eingang] Slope section GF1 (skipped)", + "vfs-vf-eingang-separator": "\n[VF-Eingang] Separator (300 mm, 3 degrees inclined)", + "vfs-vf-eingang-umlenk": "\n[VF-Eingang] Deflection station (500 mm, 3 degrees inclined)", + "vfs-warn-lisppfad": "\n[vf_standard] WARNING: Lisp path not determinable - cannot load vf_core.lsp!", + "dim-switch-modus": "\nMode switched to: %1", + "dim-switch-blocks": "\n DXFM_BLOCKS = %1", + "dim-switch-omniflo": "\n DXFM_OMNIFLO = %1", + "dim-batch-fertig": "\nConversion to %1 complete: %2 GF, %3 VF rebuilt (%4 already in target dimension).", + "sprache-gewechselt": "\nLanguage switched to: %1", + "cmd-block-auswaehlen": "\nSelect block: ", + "cmd-kein-block-ausgewaehlt": "\nNo block selected.", + "cmd-kreisel-bearbeiten": "\nEdit Kreisel: %1", + "cmd-eckrad-bearbeiten": "\nEdit Eckrad: %1", + "cmd-gefaelle-bearbeiten": "\nEdit Gefaellestrecke: %1", + "cmd-variofoerderer-bearbeiten": "\nEdit VarioFoerderer: %1", + "gf-edit-kein-gf": "Block %1 is not a Gefaellestrecke.", + "gf-edit-nur-einfach": "Only simple Gefaellestrecken (without arcs) can be edited via the dialog.\nTYP: %1", + "gf-edit-neu-aufgebaut": "\nGefaellestrecke %1 rebuilt.", + "gf-vf-modul-fehlt": "VarioFoerderer module not loaded!", + "gf-vf-gebaut": "\n-> Parallel VarioFoerderer built (2000 mm beside the Gefaellestrecke, opposite direction, rising).", + "cmd-omniflo-bearbeiten": "\nEdit Omniflo element: %1", + "cmd-attribute-bearbeiten": "\nEdit attributes: %1", + "ils-station-prompt-punkt": "\nInsertion point for %1 [ENTER=End]: ", + "ils-station-fehler-blockdatei": "\n>>> ERROR: block file '%1.dwg' not found (check data/ils).", + "ils-station-fertig": "\n>>> %1 x %2 inserted.", + "layer-prompt-ziel-layer": "\nSelect object on the target layer: ", + "layer-prompt-objekt": "\nSelect object: ", + "layer-prompt-referenz-objekt": "\nSelect reference object (determines type and layer): ", + "layer-prompt-typ-ermittlung": "\nClick again to determine the type: ", + "layer-prompt-ausblenden": "\nClick layer to hide (Enter=End): ", + "layer-prompt-einfrieren": "\nClick layer to freeze (Enter=End): ", + "layer-prompt-aktiv-bleibt": "\nSelect object on the layer that stays ACTIVE: ", + "layer-prompt-name-loeschen": "\nLayer name to delete: ", + "layer-err-kein-objekt": "No object selected.", + "layer-err-kein-ziel-layer": "No target layer selected.", + "layer-err-kein-ziel-layer-kurz": "No target layer.", + "layer-err-keine-passenden-objekte": "No matching objects found.", + "layer-abgebrochen": "Cancelled.", + "layer-err-kein-referenz-objekt": "No reference object selected.", + "layer-err-aktiv-nicht-ausschalten": "Cannot turn off the active layer!", + "layer-err-aktiv-nicht-einfrieren": "Cannot freeze the active layer!", + "layer-aktiver-layer": "\nActive layer: %1", + "layer-objekt-auf-layer": "\nObject is on layer: %1", + "layer-nur-layer-sichtbar": "\nOnly layer '%1' is visible.", + "layer-geloescht": "\nLayer '%1' deleted.", + "layer-leerer-geloescht": "\nEmpty layer '%1' deleted.", + "layer-existiert-nicht": "Layer '%1' does not exist.", + "layer-ques-typ-wechseln": "Change layer of these %1 objects?", + "layer-ques-alle-loeschen": "Delete all objects on layer '%1'?", + "core-start-titel": "\n***** %1 *****\n", + "core-errhan-fehler": "\nError: ", + "core-blockname-exists": "Block name '%1' already exists - skipping.", + "core-dwg-not-found": "\nERROR: Block not found: %1", + "exp-cfg-not-found": "\n[export] WARNING: %1 not found/empty, using defaults.", + "exp-check-ids": "\n[%1] Checking and assigning IDs...", + "exp-update-hoehe-drehung": "\n[%1] Updating height/rotation...", + "exp-collect-blocks": "\n[%1] Collecting relevant blocks...", + "exp-no-blocks-found": "\n[%1] No relevant blocks found.", + "exp-blocks-found": "\n[%1] %2 blocks found.", + "exp-output-dir": "\n[%1] Output folder: %2", + "exp-file-open-error": "\n[%1] ERROR: Cannot open file: %2", + "exp-json-written": "\n[%1] JSON written: %2", + "exp-calling-python": "\n[%1] Calling Python...", + "exp-export-started": "\n[%1] Export started: %2", + "exp-dxfm-lib-missing": "\n[%1] ERROR: Environment variable DXFM_LIB is not set - BricsCAD was probably not started via bin/start_briscad.bat. CSV/JSON were written, the Python call is skipped.", + "exp-python-not-found": "\n[%1] ERROR: Python script not found: %2", + "exp-python-exe": "\n[%1] Interpreter: %2", + "exp-export-done": "\n[%1] Export finished: %2", + "exp-python-call-failed": "\n[%1] ERROR: Could not start Python (WScript.Shell unavailable).", + "exp-python-error": "\n[%1] ERROR: Python exited with code %2. Log: %3", + "exp-python-store-hint": "\n NOTE: No real Python interpreter was found (on Windows 11 'python' points\n to the WindowsApps placeholder). Fix: run bin/install_py.bat (creates .venv)\n and restart BricsCAD via bin/start_briscad.bat, or set the full path to\n python.exe in cfg/export.cfg under [python] interpreter=.", + "exp-csv-missing": "\n[%1] ERROR: Python reported success but the CSV is missing: %2. Log: %3", + "exp-omni-no-inserts": "\n[OMNI_UPDATE] No INSERT blocks in the drawing.", + "exp-omni-updated": "\n[OMNI_UPDATE] %1 elements updated (HEIGHT, ROTATION).", + "sens-skip": "\n[%1] Separator/scanner assignment up to date (ZUORDNUNG set, sums match) - recomputation skipped.", + "sens-start": "\n[%1] Checking separator/scanner assignment (ANZAHL_SEPARATOR/ANZAHL_SCANNER)...", + "sens-no-inserts": "\n[%1] No blocks found in the drawing - sensor assignment skipped.", + "sens-bbox-fehler": "\n ! Bounding box failed for ILS block '%1'", + "sens-carrier-zeile": "\n %1 [%2]: ANZAHL_SCANNER=%3, ANZAHL_SEPARATOR=%4 (placed symbols only)", + "sens-carrier-fehler": "\n ERROR writing the count attributes on %1", + "sens-summary": "\n[%1] %2 Kreisel/Streckengruppen/Gefaellestrecken updated, %3 scanners total (%4 unassignable), %5 separators total (%6 unassignable).", + "sens-ergaenzt-header": "\n[%1] %2 scanners outside every Kreisel/track bounding box auto-assigned by distance:", + "sens-ergaenzt-zeile": "\n Scanner %1 -> %2 (%3mm)", + "sens-strittig-suffix": " CONTESTED: also close to %1 (%2mm)", + "sens-strittig-summary": "\n[%1] WARNING: %2 of the above assignments are contested (distance to two candidates nearly equal) - see column 'Warnungen' in the CSV export.", + "sens-unassigned-marked": "\n[%1] %2 sensor(s) without any Kreisel/track marked (layer '%3').", + "sens-zuordnung-fehlt": "\n[%1] WARNING: %2 assigned sensor(s) without a 'ZUORDNUNG' attribute - value not writable.", + "id-new-assigned": "\n[ID] New ID assigned: %1", + "id-invalid-block": "\n[ID] ERROR: Not a valid INSERT block!", + "id-check-no-blocks": "\n[IDSCHECK] No relevant blocks found.", + "id-check-missing-set": "\n[IDSCHECK] Missing ID set: %1 (block %2)", + "id-check-duplicate": "\n[IDSCHECK] Duplicate ID %1 -> new ID %2 (block %3)", + "id-check-done": "\n[IDSCHECK] Done. %1 duplicates corrected.", + "id-check-corrected": "\n[IDSCHECK] %1 IDs corrected.", + "id-select-block-prompt": "\nSelect block: ", + "id-generate-invalid": "\n[IDGENERATE] No valid block selected.", + "dialog-nicht-verfuegbar": "Dialog not available.", + "dialog-einfuegepunkt-waehlen": "\nSelect insertion point: ", + "extcall-python-rueckgabe": "\n[SSG_LIB] Python return value: %1", + "extcall-keine-rueckgabe": "\n[SSG_LIB] WARNING: No return value received from Python.", + "extcall-skript-nicht-gefunden": "\n[SSG_LIB] ERROR: %1 not found!", + "vfstart-core-nicht-gefunden": "\n[VarioFoerderer] WARNING: vf_core.lsp not found - commands not available.", + "vfstart-etage-core-nicht-gefunden": "\n[EtageVarioFoerderer] WARNING: vf_core.lsp not found - commands not available.", + "gf-seite-aus-header": "\n\nOutput element (AS_Element_*) - choose side:", + "gf-seite-ein-header": "\n\nInput element (ES_Element_*) - choose side:", + "gf-seite-links": "\n 1 - Left", + "gf-seite-rechts": "\n 2 - Right", + "prompt-wahl-1-2": "\nYour choice (1/2) [1]: ", + "prompt-wahl-1-2-3": "\nYour choice (1/2/3) [1]: ", + "geruest-typ-header": "\n\nSelect scaffold option:", + "geruest-typ-opt": "\n %1 - %2", + "geruest-typ-prompt": "\nScaffold option (1-4) [%1]: ", + "kreisel-eckrad-geruest-frage": "Scaffold for single module?", + "gf-lade-block": "\n Loading block: %1 ...", + "gf-status-ok": " OK", + "gf-warnung-kette-unterbrochen": "\n WARNING: chain interrupted!", + "gf-status-nennlaenge": "\n Total nominal length (incl. arc dx): %1 mm", + "gf-status-feste-hoehenanteile": "\n Fixed height components (AS/ES dz + arc dz): %1 mm", + "gf-status-dz-detail": "\n aus-dz=%1 ein-dz=%2 arc-dz=%3", + "gf-status-resthoehe": "\n Effective remaining height for straights: %1 mm", + "gf-warnung-keine-geraden": "\n WARNING: no straight sections -> fallback 3 deg", + "gf-warnung-feste-anteile": "\n WARNING: fixed components > deltaH -> fallback 1 deg", + "gf-status-naeherungswinkel": "\n>>> Approximate angle: %1%2", + "gf-status-linie-staustrecke": "\n\n%1/%2: Buffer section L=%3 mm hz=%4%5 v=%6%7", + "gf-status-separator-vor-bogen": "\n\n%1S/%2: Separator 300mm (before arc) hz=%3%4 v=%5%6", + "gf-status-bogen-einfuegen": "\n\n%1/%2: %3 hz=%4%5", + "gf-status-linienzug-eingefuegt": "\n>>> Polyline slope section inserted! <<<", + "gf-modus3-header": "\n\n>>> MODE 3: Select polyline <<<", + "gf-modus3-hinweis1": "\nPlease select all lines (LINE) and arcs (ARC) of the path,", + "gf-modus3-hinweis2": "\nthen press ENTER:", + "gf-fehler-keine-objekte": "\nNo objects selected!", + "gf-status-objekte-ausgewaehlt": "\n %1 objects selected.", + "gf-prompt-startpunkt-kette": "\nSelect start point (3D) - KS_EIN output element / chain start: ", + "gf-fehler-kein-startpunkt": "\nNo start point!", + "gf-prompt-endpunkt-kette": "\nSelect end point (3D) - KS_AUS input element / chain end: ", + "gf-fehler-kein-endpunkt": "\nNo end point!", + "gf-status-deltah-3dpunkte": "\n %1H from 3D points: %2 mm", + "gf-status-sortiere-segmente": "\n Sorting segments ...", + "gf-alert-keine-kette": "No connected chain found!", + "gf-status-segmente-gefunden": " %1 segments found.", + "gf-status-segment-analyse-header": "\n\n--- Segment analysis (lengths after trimming) ---", + "gf-status-segment-linie": "\n %1. Line L=%2 mm hz=%3%4", + "gf-status-segment-bogen": "\n %1. Arc %2%3 %4 hz-input=%5%6", + "gf-status-seg-erste-linie": "\n Seg %1 (1st line): -%2 mm (output element)", + "gf-status-linie-vor-bogen": "\n Each line before arc: -300 mm (arc separator)", + "gf-status-seg-letzte-linie": "\n Seg %1 (last line): -300 mm (input sep) -%2 mm (input element)", + "gf-status-eintrittsrichtung": "\n Entry direction: %1%2", + "gf-status-austrittsrichtung": "\n Exit direction: %1%2", + "gf-status-berechne-winkel": "\n\n Calculating slope angle from geometry ...", + "gf-prompt-winkel-verwenden": "\nUse calculated angle %1%2? (y/n) [y]: ", + "gf-prompt-gefaellewinkel": "\nSlope angle (degrees): ", + "gf-status-messe-absenkung": "\n Measuring actual AS/ES drop (iterative) ...", + "gf-warnung-korrektur-bereich": "\n WARNING: correction out of range, angle unchanged", + "gf-status-as-es-mm": "\n AS: %1 mm ES: %2 mm", + "gf-status-korrigierter-winkel": "\n>>> Corrected slope angle: %1%2 (after %3 iter.)", + "gf-status-zus-segmente": "\n>>> Segments: %1", + "gf-status-zus-deltah": "\n>>> %1H: %2 mm", + "gf-status-zus-deltal": "\n>>> %1L: %2 mm", + "gf-status-zus-winkel": "\n>>> Slope angle: %1%2", + "gf-status-zus-eintrittswinkel": "\n>>> Entry angle: %1%2", + "gf-status-zus-austrittswinkel": "\n>>> Exit angle: %1%2", + "gf-status-zus-aus-element": "\n>>> Output element: %1", + "gf-status-zus-ein-element": "\n>>> Input element: %1", + "gf-prompt-einfuegen": "\nInsert? (1=Yes / 2=No) [1]: ", + "gf-status-aus-element-detail": "\n\n>>> Output element: %1 travel dir=%2%3 KS_EIN-hz=%4%5 Z=%6", + "gf-status-separator-vor-ein": "\n>>> Separator before input element", + "gf-status-ein-element-detail": "\n>>> Input element: %1 target Z=%2", + "gf-status-z-hoehe-ks-aus": "\n Z height KS_AUS: %1 mm", + "gf-status-fertig": "\n>>> Done! <<<", + "gf-status-abgebrochen": "\nCancelled.", + "gf-alert-dialog-fehlt": "Dialog file not found:\n%1", + "gf-dlg-richtung-0": "0%1 (X+, East)", + "gf-dlg-richtung-90": "90%1 (Y+, North)", + "gf-dlg-richtung-180": "180%1 (X-, West)", + "gf-dlg-richtung-270": "270%1 (Y-, South)", + "gf-dlg-links": "Left", + "gf-dlg-rechts": "Right", + "gf-status-gf-block-erstellt": "\n>>> GF block created: %1 (%2)", + "gf-status-schritt1-aus": "\n\n1/4: %1 travel dir=%2%3 KS_EIN-hz=%4%5 v=%6%7", + "gf-status-schritt2-staustrecke": "\n\n2/4: Buffer section L=%1 mm hz=%2%3 v=%4%5", + "gf-status-schritt3-separator": "\n\n3/4: Separator 300mm hz=%1%2 v=%3%4", + "gf-status-schritt4-ein": "\n\n4/4: %1", + "gf-status-erfolgreich-eingefuegt": "\n>>> Slope section inserted successfully! <<<", + "gf-banner-titel": "\n SLOPE SECTION GENERATOR v2.0", + "gf-banner-richtung": "\n Direction: always DOWN", + "gf-alert-init-fehler": "Error initialising the library!\nPlease check DXFM_DATA.", + "gf-eingabemodus-header": "\n\nSelect input mode:", + "gf-eingabemodus-1": "\n 1 - Enter values manually (simple section)", + "gf-eingabemodus-2": "\n 2 - Select 3D line (simple section)", + "gf-eingabemodus-3": "\n 3 - Select polyline (LINE + ARC) with slope arc", + "gf-modus1-header": "\n\n>>> MODE 1: Manual value entry <<<", + "gf-prompt-startpunkt-aus": "\nSelect start point for output element: ", + "gf-prompt-deltal-abstand": "\n%1L - distance (mm): ", + "gf-modus2-header": "\n\n>>> MODE 2: Select 3D line <<<", + "gf-status-bks-welt": "\n UCS set to world coordinates.", + "gf-prompt-3dlinie-richtung": "\nPlease select 3D line for direction and length:", + "gf-alert-keine-linie": "No valid line selected!", + "gf-status-fahrtrichtung-linie": "\n Travel direction: %1%2 (from line)", + "gf-status-deltal-mm": "\n %1L = %2 mm", + "gf-prompt-gefaellewinkel-def3": "\n\nSlope angle (degrees) [3]: ", + "gf-status-winkel": "\n>>> Angle: %1%2", + "gf-status-fahrtrichtung": "\n>>> Travel direction: %1%2", + "gf-alert-staustrecke-ungueltig": "Calculated buffer section length invalid: %1 mm\nPlease choose larger deltaL or smaller angle.", + "gf-status-zus2-winkel": "\n>>> Angle: %1%2", + "gf-status-zus2-aus-seite": "\n>>> Output side: %1", + "gf-status-zus2-ein-seite": "\n>>> Input side: %1", + "gf-status-zus2-lstau": "\n>>> L_stau: %1 mm", + "ques-yn-default-yes": " Y/N : ", + "ques-yn-default-no": " Y/N : ", + "tefl-fehler-dxfm-omniflo": "\n[TEF] ERROR: DXFM_OMNIFLO not set (run bin/setenv.bat).", + "tefl-fehler-dxf-nicht-gefunden": "\n[TEF] ERROR: Element DXF not found: %1", + "tefl-prompt-startpunkt": "\nSelect start point of the conveyor path: ", + "tefl-prompt-endpunkt": "\nSelect end point of the conveyor path: ", + "tefl-abgebrochen": "\n[TEF] Cancelled.", + "tefl-fehler-laenge-null": "\n[TEF] ERROR: Start and end point are too close together.", + "tefl-fertig": "\n[TEF] %1 element(s) inserted, path length=%2 mm.", + "vfl-kette-titel": "\n Vario_Kette_Merge - merge several Vario conveyor blocks (loose or already wrapped) into one combined block", + "vfl-kette-start-waehlen": "\n\nSelect the starting block of the chain (first element - AS element or VF_n): ", + "vfl-kette-kein-objekt": "\nNo object selected - cancelled.", + "vfl-kette-kein-vf-block": "\nSelected object ('%1') is not a known Vario chain block (AS/ES element, GF bend, Vario curve, deflection/motor station, vertical bend, buffer/separator or VF_n).", + "vfl-kette-start-nicht-gefunden": "\nERROR: Starting block not found in the chain collection (internal error).", + "vfl-kette-start-nicht-gefunden-diag": "\nERROR: Starting block not found in the chain collection (internal error).\n Diagnostic: %1 blocks collected in total, selected block name='%2', %3 of those with the same block name.", + "vfl-kette-start-ohne-ks-ein": "\nERROR: No KS_EIN found on the selected block - chain cannot be followed.", + "vfl-kette-nur-ein-baustein": "\nNo further connected VF_n block was found from the selected block onward - nothing to merge.", + "vfl-kette-gefunden": "\n\nChain detected: %1 block(s) will be merged:", + "vfl-kette-luecke-warnung": "\n\n WARNING: after '%1' a visually close but not properly connected VF_n ('%2') was found (KS distance %3 mm) - the chain was ended there; this and all further blocks are left untouched.", + "vfl-kette-fertig": "\n\n>>> Done: new combined block '%1' created from %2 block(s).", + "cmd-tro-bearbeiten": "\nEdit TRO marker: %1", + "cmd-connection-bearbeiten": "\nEdit connection: %1", + "con-keine-verbindung": "Block %1 is not a connection (expected CONNECTION_*).", + "con-kein-tro": "Block %1 is not a TRO marker - connections only run between TROs.", + "con-block-fehlt": "Block definition %1 is missing in this drawing.\nRun tro_annotate.py with --flow first.", + "con-quelle-waehlen": "\nSelect source TRO: ", + "con-ziel-waehlen": "\nSelect target TRO: ", + "con-gleicher-block": "Source and target are the same block.", + "con-gleicher-punkt": "Source and target are at the same position.", + "con-dialog-fehlt": "Dialog file not found:\n%1\nCheck DXFM_DCL (setenv.bat).", + "con-block": "Block: %1 (UID %2)", + "con-richtung": "Direction: %1 ----> %2", + "con-hinweis": "The UID is permanent, the TRO id may change.", + "con-id-leer": "Source and target UID must not be empty - nothing changed.", + "con-gleiche-id": "Source and target must not share the same UID.", + "con-eingefuegt": "\nConnection %1 ----> %2 inserted (UID %3).", + "con-gespeichert": "\nConnection saved: %1 ----> %2", + "tro-edit-kein-tro": "Block %1 is not a TRO marker (expected TRO_*).", + "tro-edit-kein-id-attribut": "Block %1 has no ID attribute - please re-annotate (tro_annotate.py).", + "tro-edit-dialog-fehlt": "Dialog file not found:\n%1\nCheck DXFM_DCL (setenv.bat).", + "tro-edit-modul-fehlt": "%1 not loaded - editing attributes with EATTEDIT instead.", + "tro-edit-block": "Block: %1", + "tro-edit-fb": "Function block: %1 UID: %2", + "tro-edit-hinweis": "Symbol and FB follow on the next tro_annotate.py run.", + "tro-edit-id-leer": "The TRO id must not be empty - nothing changed.", + "tro-edit-gespeichert": "\nTRO saved: ID = %1, TYPE = %2", + "tro-edit-typ-geaendert": "\nType changed - re-run tro_annotate.py so symbol and FB match.", + "tro-insert-kein-typ": "No TRO types available (tro_types.lsp missing) - run lib/tro_annotate.py --emit-lisp.", + "tro-insert-hinweis": "The block shape must already exist in the drawing (from an earlier tro_annotate.py run).", + "tro-insert-kein-block": "No symbol for this type in the drawing (%1) - run tro_annotate.py with this type first.", + "tro-insert-prompt-punkt": "\nInsertion point: ", + "tro-insert-eingefuegt": "\nTRO inserted: ID = %1, TYPE = %2" + } } diff --git a/lib/export_csv.py b/lib/export_csv.py index 35319fa..4a98247 100644 --- a/lib/export_csv.py +++ b/lib/export_csv.py @@ -27,6 +27,13 @@ Warnungen = Spalte fuer Auffaelligkeiten. Aktuell: eine Strecke sollte genau zwei Kreisel (Anfang + Ende) beruehren - beruehrt ihre (in x/y gepruefte) Bounding-Box mehr, steht hier ein Hinweis und es wird zusaetzlich eine Konsolen-WARNUNG ausgegeben (mit exakten 3D-BBoxen sollte das nicht auftreten). +Scanner-Zeilen bekommen dieselbe Spalte fuer strittige Distanz-Zuordnungen: +liegt ein Scanner ausserhalb jeder Kreisel-/Streckengruppen-/Gefaellestrecke- +Boundingbox und ist der Abstand zum naechsten und zweitnaechsten Carrier fast +gleich gross, schreibt Lisp/count_sep_scan.lsp (cs-zuordnung-lauf, vor dem +Export automatisch aufgerufen) einen Warnungstext mit den IDs beider +Kandidaten in das "warnung"-Feld des Scanner-Blocks im Roh-JSON (siehe +csv:block-to-json in export.lsp) - hier unveraendert uebernommen. Aufruf: python export_csv.py @@ -84,6 +91,15 @@ EXPORTCSV vorhanden (nicht EXPORTSIVAS) - siehe csv:run-export. Insertpoint/ K1-K4 stehen zwar in export_raw.json fuer jeden Export zur Verfuegung (siehe csv:block-to-json), werden aber ebenfalls nur von diesem Skript (EXPORTCSV) als CSV-Spalten ausgegeben. + +Reihenfolge/Elementnummer: die Zeilen werden am Ende aufsteigend nach +TeileId sortiert (numerische IDs) und die Elementnummer (erste Spalte) +danach neu von 1 an vergeben (siehe teileid_sort_key in process_blocks) - +wurde kein Element geloescht, stimmen Elementnummer und TeileId dadurch +ueberein, geloeschte Elemente hinterlassen Luecken in der TeileId-Folge. +Zeilen ohne numerische TeileId (Omniflo-Sum-Zeile, SEP-/SCN-Fallback-IDs +ohne ID-Attribut) behalten stabil ihre bisherige Reihenfolge und stehen +danach. """ import json @@ -756,6 +772,13 @@ def process_blocks(blocks, lookup, dbg=None): "bezeichnung": f"Scanner :{scanner_count}", "planquadrat": planquadrat_column(block, planquadrat_cfg), "merkmale": build_sensor_merkmale(block), + # "warnung" kommt von cs-zuordnung-lauf (Lisp/count_sep_scan.lsp), + # das vor dem Export strittige Distanz-Zuordnungen (Scanner + # ausserhalb jeder Kreisel-/Strecken-Boundingbox, Abstand zu zwei + # Kandidaten fast gleich) in *cs-scanner-warnung-by-handle* + # sammelt - csv:block-to-json (export.lsp) haengt den Text als + # "warnung"-Feld an den betroffenen Scanner-Block im JSON an. + "warnung": block.get("warnung", ""), **bbox_columns(block), }) continue @@ -816,6 +839,22 @@ def process_blocks(blocks, lookup, dbg=None): elem_nr = build_kreisel_weiche_items(items, planquadrat_cfg, elem_nr, dbg=dbg) build_strecke_schleus_items(items, planquadrat_cfg, elem_nr, dbg=dbg) + # Nach dem Sammelheimen aller Zeilen: sortiert nach TeileId ausgeben, damit + # Elementnummer (erste Spalte) und TeileId nach Moeglichkeit uebereinstimmen + # (siehe format_csv_line/Elementnummer-Neuvergabe unten). Numerische IDs + # zuerst aufsteigend; nicht-numerische IDs (z.B. "autogenerated_of_json" + # der Omniflo-Sum-Zeile oder SEP-/SCN-Fallback-IDs ohne ID-Attribut) + # behalten stabil ihre bisherige Reihenfolge und stehen danach. Wurde kein + # Element geloescht, ergibt sich dadurch Elementnummer == TeileId. + def teileid_sort_key(indexed_item): + index, item = indexed_item + tid = str(item.get("teileid", "")).strip() + return (0, int(tid)) if tid.isdigit() else (1, index) + + items = [item for _, item in sorted(enumerate(items), key=teileid_sort_key)] + for i, item in enumerate(items, start=1): + item["nr"] = i + return items diff --git a/menu/SSG_LIB.mnu b/menu/SSG_LIB.mnu index c43d379..f5acc9f 100644 --- a/menu/SSG_LIB.mnu +++ b/menu/SSG_LIB.mnu @@ -135,7 +135,7 @@ [Verbindung bearbeiten]^C^C(ssg-ensure "Connection_Edit") CONNECTION_EDIT [<-Bearbeiten (Auto)]^C^C(ssg-ensure "SSG_LIB_Commands") SSG_BLOCKEDIT [->Export] -[Export Sivas]^C^C(ssg-ensure "count_sep_scan") ZAEHLE_SEP_SCAN (ssg-ensure "export") EXPORTSIVAS +[Export Sivas]^C^C(ssg-ensure "export") EXPORTSIVAS [<-Export CSV]^C^C(ssg-ensure "export") EXPORTCSV [->Konfiguration] [Umschalten 2D und 3D]^C^C(ssg-ensure "SSG_LIB_Commands") SSG_DIM_SWITCH