feat: Eckrad-Dialog, Kreiselname, Hoehen-Neuberechnung beim Export

- Eckrad: eigener DCL-Dialog (eckrad_edit.dcl) beim Einfuegen und per
  Doppelklick (EckradEdit); Sivas-Merkmale am Kreisel ausgerichtet
  (2950, 3381, 3992 Ja/Nein); bei Sep./Scanner-Zaehlung ausgenommen
- Kreisel: eigener Name bleibt in Bezeichnung + Beschriftung erhalten
- Sivas: Kreisel/Eckrad unterschiedlicher Hoehe nicht mehr zusammengefasst
- Export: Hoehen-Attribute in Z verschobener Kreisel/Eckrad/VF/GF neu
  berechnet
- GF-Edit: Einfuegehoehe aus aktueller Z-Koordinate
This commit is contained in:
2026-10-13 14:24:01 +02:00
parent ea0e46a441
commit 6044c35957
15 changed files with 453 additions and 68 deletions
+74
View File
@@ -2493,6 +2493,77 @@
;; Sammelt relevante Bloecke, schreibt JSON, ruft Python auf.
;; label = Anzeigename (z.B. "EXPORTCSV")
;; --- Export-Vorbereitung: Zeichnungszustand fuer den Export herrichten ---
;; --- Hoehen-Attribute aus der Z-Koordinate neu berechnen ---
;; Reiner Kern (in tests/test_unit.lsp getestet). Wird ein Kreisel/Eckrad/VF_n/
;; GF_n nachtraeglich in Z verschoben, sind seine Hoehen-Attribute veraltet.
;; Rechnet dieselben Formeln/Rundungen wie beim Bau:
;; KREISEL: HOEHE = (rtos z 2 0), MONTAGEHOEHE_m = (rtos z/1000 2 3) (draw-module)
;; ECKRAD : HOEHE = (rtos z 2 0) (ils-eckrad-insert)
;; GF : VON = (fix z), MONTAGEHOEHE_m = (rtos z/1000 2 3) (gf-block-erstellen)
;; VF : VON = (fix z), MONTAGEHOEHE_m = (rtos (VON+BIS)/2000 2 3) (vf_core/vf_linienzug)
;; GF/VF : BIS = VON - (VON_alt - BIS_alt). NICHT z - DELTA_H_mm: DELTA_H_mm
;; ist ohne Vorzeichen (steigende VF!) und separat abgeschnitten.
;; DELTA_H_mm nur als Rueckfall, wenn VON/BIS fehlen.
;; art = "KREISEL"/"ECKRAD"/"GF"/"VF", z = Einfuege-Z (VF/GF: Kettenstart),
;; attribs = bisherige Attribut-alist.
;; Rueckgabe: alist der neuen Werte, oder nil, wenn der Block nicht verschoben
;; wurde (Attribut passt noch zu z) - dann bleibt er bit-genau beim Bau-Wert.
(defun csv:hoehen-werte (art z attribs / alt von von-alt bis-alt diff bis)
(cond
((member art '("KREISEL" "ECKRAD"))
(setq alt (cdr (assoc "HOEHE" attribs)))
(if (not (and alt (/= alt "") (equal (atof alt) (atof (rtos z 2 0)) 1e-6)))
(if (= art "KREISEL")
(list (cons "HOEHE" (rtos z 2 0))
(cons "MONTAGEHOEHE_m" (rtos (/ z 1000.0) 2 3)))
(list (cons "HOEHE" (rtos z 2 0))))))
((member art '("GF" "VF"))
(setq von (fix z)
von-alt (cdr (assoc "HOEHE_VON_mm" attribs))
bis-alt (cdr (assoc "HOEHE_BIS_mm" attribs)))
(if (not (and von-alt (/= von-alt "") (= (atoi von-alt) von)))
(progn
(setq diff (if (and von-alt (/= von-alt "") bis-alt (/= bis-alt ""))
(- (atoi von-alt) (atoi bis-alt))
(atoi (cond ((cdr (assoc "DELTA_H_mm" attribs))) ("0")))))
(setq bis (- von diff))
(list (cons "HOEHE_VON_mm" (itoa von))
(cons "HOEHE_BIS_mm" (itoa bis))
(cons "MONTAGEHOEHE_m"
(if (= art "GF")
(rtos (/ z 1000.0) 2 3)
(rtos (/ (+ von bis) 2000.0) 2 3)))))))
)
)
;; Hoehen-Attribute aller Kreisel/Eckrad/VF_n/GF_n pruefen und bei in Z
;; verschobenen Bloecken neu setzen (csv:hoehen-werte). Laeuft als erster
;; Schritt von csv:export-vorbereiten, gilt also fuer EXPORTSIVAS und EXPORTCSV.
(defun csv:hoehen-aktualisieren ( / ss i ent ed bname art werte n)
(setq n 0)
(if (setq ss (ssget "_X" '((0 . "INSERT") (2 . "KREISEL_*,ECKRAD_*,VF_*,GF_*"))))
(progn
(setq i 0)
(while (setq ent (ssname ss i))
(setq ed (entget ent)
bname (strcase (cdr (assoc 2 ed))))
(setq art (cond ((wcmatch bname "KREISEL_*") "KREISEL")
((wcmatch bname "ECKRAD_*") "ECKRAD")
((wcmatch bname "GF_*") "GF")
((wcmatch bname "VF_*") "VF")))
(setq werte (csv:hoehen-werte art (cadddr (assoc 10 ed)) (ssg-attrib-read ent)))
(if werte
(progn
(ssg-attrib-set-on ent werte)
(setq n (1+ n))))
(setq i (1+ i))
)
)
)
(if (> n 0) (princ (ssg-textf "exp-hoehen-aktualisiert" (list n))))
n
)
;; Aus csv:run-export ausgelagert: alle Schritte, die VOR dem Sammeln/Schreiben
;; den Zeichnungszustand herrichten - IDs sicherstellen, Stellvertreter der
;; verpackten Kettenbausteine erzeugen und nummerieren, Omniflo-Attribute
@@ -2522,6 +2593,9 @@
(setq *csv-res-sammlung* nil)
(setq *csv-ketten* nil)
(setq *csv-sepliste-id-by-handle* nil)
;; 0. Hoehen-Attribute in Z verschobener Kreisel/Eckrad/VF/GF nachziehen,
;; damit Sivas- und Raw-Export die aktuelle Hoehe sehen.
(csv:hoehen-aktualisieren)
;; 1. IDs aller Bloecke sicherstellen und Duplikate korrigieren - hier nur
;; fuer die dauerhaften Bloecke, Stellvertreter gibt es noch keine.
(princ (ssg-textf "exp-check-ids" (list label)))