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
+10 -1
View File
@@ -2496,6 +2496,8 @@
es-winkel (nth 3 xd)
z-start (atof (nth 4 xd))
deltaL (atof (nth 5 xd)))
;; aktuelle Z statt XDATA (Block evtl. in Z verschoben)
(if (caddr startpunkt) (setq z-start (caddr startpunkt)))
(setq as-seite (cond ((cdr (assoc "SEITE_AS" attribs))) ("links")))
(setq es-seite (cond ((cdr (assoc "SEITE_ES" attribs))) ("links")))
;; bestehende Geruest-Einstellungen erhalten
@@ -2599,6 +2601,10 @@
z-start (atof (cond ((cdr (assoc "HOEHE_VON_mm" attribs))) ("0")))
deltaL (atof (cond ((cdr (assoc "DELTA_L_mm" attribs))) ("0"))))
)
;; Einfuegehoehe = aktuelle Z des Einfuegepunkts (= Kettenstart). XDATA und
;; HOEHE_VON_mm sind veraltet, wenn der Block in Z verschoben wurde - OK im
;; Dialog baut dann direkt auf der neuen Hoehe neu auf (wie Kreisel/Eckrad).
(if (caddr startpunkt) (setq z-start (caddr startpunkt)))
(setq prefill
(list (cons "deltaL" deltaL)
@@ -2616,7 +2622,10 @@
;; AS-Seite + untere Hoehe fuer den optionalen parallelen VF-Bau
(setq as-seite (cond ((cdr (assoc "SEITE_AS" attribs))) ("links")))
(setq hoehe-bis (atof (cond ((cdr (assoc "HOEHE_BIS_mm" attribs))) ("0"))))
;; um dieselbe Z-Verschiebung korrigiert: BIS = Z - (VON_alt - BIS_alt)
(setq hoehe-bis (- z-start
(- (atof (cond ((cdr (assoc "HOEHE_VON_mm" attribs))) ("0")))
(atof (cond ((cdr (assoc "HOEHE_BIS_mm" attribs))) ("0"))))))
;; 2. Argument (hoehe-vorbelegung) explizit nil: BricsCAD verlangt die exakte
;; Argumentzahl (setzt fehlende NICHT automatisch auf nil). Im Edit kommt die
+240 -25
View File
@@ -193,10 +193,35 @@
(dbgreturn result)
)
;; Beschriftungstext (reiner Kern, in tests/test_unit.lsp getestet):
;; "KREISEL 1: Pufferkreisel PIN_4000" - mit eigenem Namen
;; "KREISEL 1: PIN_4000" - Name leer oder Vorgabe "Kreisel1"
(defun kreisel-label-text (nummer name kreiselart abstand)
(strcat "KREISEL " (itoa nummer) ": "
(if (or (null name) (= name "") (= name (strcat "Kreisel" (itoa nummer))))
""
(strcat name " "))
kreiselart "_" (rtos abstand 2 0))
)
;; Beschriftung in einer BESTEHENDEN Blockdefinition auf textStr setzen.
;; draw-module verwendet eine vorhandene Definition KREISEL_n_TYP_ABSTAND
;; wieder (Edit/Redraw) - ein geaenderter Name kaeme sonst nie in die
;; Beschriftung. Wirkt auf alle Referenzen dieser Definition.
(defun kreisel-label-aktualisieren (bname textStr / e ed)
(setq e (tblobjname "BLOCK" bname))
(while (setq e (entnext e))
(setq ed (entget e))
(if (and (= (cdr (assoc 0 ed)) "TEXT")
(/= (cdr (assoc 1 ed)) textStr))
(entmod (subst (cons 1 textStr) (assoc 1 ed) ed))
)
)
)
;; Beschriftungstext erzeugen
(defun kreisel-make-label (nummer abstand kreiselart / textStr insertPoint radius mitteX mitteY textHoehe lay)
;; Text: "KREISEL 1: PIN_4000"
(setq textStr (strcat "KREISEL " (itoa nummer) ": " kreiselart "_" (rtos abstand 2 0)))
(defun kreisel-make-label (nummer abstand kreiselart name / textStr insertPoint radius mitteX mitteY textHoehe lay)
(setq textStr (kreisel-label-text nummer name kreiselart abstand))
;; Geometrie berechnen
(setq radius (/ *kreisel-durchmesser* 2.0))
@@ -344,9 +369,11 @@
)
)
;; Bezeichnung automatisch setzen: "KreiselN"
(setq attribs (subst (cons "Bezeichnung" (strcat "Kreisel" (itoa kreisel-nummer)))
(assoc "Bezeichnung" attribs) attribs))
;; Bezeichnung: eigener Name (KreiselEdit) bleibt erhalten, sonst Vorgabe "KreiselN"
(if (member (cdr (assoc "Bezeichnung" attribs)) '(nil ""))
(setq attribs (subst (cons "Bezeichnung" (strcat "Kreisel" (itoa kreisel-nummer)))
(assoc "Bezeichnung" attribs) attribs))
)
;; --- HÖHE BESTIMMEN ---
;; Priorität 1: Aus basePoint (wenn 3D Punkt mit Z > 0)
@@ -445,7 +472,8 @@
)
;; BESCHRIFTUNG einfügen (vor Block-Erzeugung, damit sie im Block ist)
(kreisel-make-label kreisel-nummer abstand (if is-pin "PIN" "STANDARD") )
(kreisel-make-label kreisel-nummer abstand (if is-pin "PIN" "STANDARD")
(cdr (assoc "Bezeichnung" attribs)))
;; Unsichtbare Attribut-Definitionen erzeugen
(ssg-attrib-make-defs *kreisel-attrib-defs* 50.0)
@@ -472,7 +500,13 @@
(princ (ssg-textf "kreisel-neue-blockdef" (list bname)))
)
(princ (ssg-textf "kreisel-bestehende-blockdef" (list bname)))
(progn
(princ (ssg-textf "kreisel-bestehende-blockdef" (list bname)))
;; Beschriftung der wiederverwendeten Definition an den Namen anpassen
(kreisel-label-aktualisieren bname
(kreisel-label-text kreisel-nummer (cdr (assoc "Bezeichnung" attribs))
(if is-pin "PIN" "STANDARD") abstand))
)
)
;; --- Block am Zielpunkt einfuegen (ohne Attribut-Dialog) ---
@@ -1071,7 +1105,7 @@
;; 4. Hoehe aus Z-Koordinate oder manuell
;; --------------------------------------------
(defun c:ILS_Eckrad ( / ptTangent ptDir dx dy dist ux uy radius
centerPt rotation hoehe
centerPt rotation hoehe hoehe-aus-z attribs ergebnis
geruest-einzelmodul geruest-typ)
(dbgf "c:ILS_Eckrad")
@@ -1114,30 +1148,205 @@
(setq rotation (* (/ 180.0 pi) (atan dy dx)))
(dbg 'rotation)
;; 4. Hoehe bestimmen
(if (and (> (length ptTangent) 2) (caddr ptTangent) (> (caddr ptTangent) 0))
;; 4. Hoehe vorbelegen: aus Z des Beruehrpunkts, sonst Default
(setq hoehe-aus-z (and (> (length ptTangent) 2) (caddr ptTangent) (> (caddr ptTangent) 0)))
(if hoehe-aus-z
(progn
(setq hoehe (caddr ptTangent))
(princ (ssg-textf "kreisel-hoehe-aus-3dpunkt" (list (rtos hoehe 2 0))))
)
(progn
(setq hoehe (getreal (ssg-textf "kreisel-prompt-hoehe-z" (list (rtos *eckrad-default-hoehe* 2 0)))))
(if (null hoehe) (setq hoehe *eckrad-default-hoehe*))
)
(setq hoehe *eckrad-default-hoehe*)
)
(dbg 'hoehe)
;; 5. Geruest fuer Einzelmodul + Geruestoption abfragen
(setq geruest-einzelmodul (if (ssg-ques (ssg-text "kreisel-eckrad-geruest-frage") T) "1" "0"))
(setq geruest-typ (ssg-ask-geruest-typ))
(if (ssg-gui-p)
;; 5a. Dialog: Bezeichnung, Hoehe, Drehung, Drehrichtung, Geruest
(progn
(setq attribs (ssg-attrib-merge (list (cons "HOEHE" (rtos hoehe 2 0)))
*eckrad-attrib-defs*))
(setq ergebnis (eckrad-dialog attribs rotation))
(if (null ergebnis)
(progn (princ (ssg-text "kreisel-abgebrochen")) (dbgreturn nil) (exit))
)
(setq attribs (car ergebnis)
rotation (cdr ergebnis)
hoehe (atof (cdr (assoc "HOEHE" attribs))))
)
;; 5b. Ohne GUI (Tests): Konsolenabfrage wie bisher
(progn
(if (not hoehe-aus-z)
(progn
(setq hoehe (getreal (ssg-textf "kreisel-prompt-hoehe-z" (list (rtos *eckrad-default-hoehe* 2 0)))))
(if (null hoehe) (setq hoehe *eckrad-default-hoehe*))
)
)
(setq geruest-einzelmodul (if (ssg-ques (ssg-text "kreisel-eckrad-geruest-frage") T) "1" "0"))
(setq geruest-typ (ssg-ask-geruest-typ))
(setq attribs (list (cons "GERUEST_EINZELMODUL" geruest-einzelmodul)
(cons "GERUEST_TYP" geruest-typ)))
)
)
;; 6. Einfuegen (centerPt ist der Kreismittelpunkt)
(ils-eckrad-insert (list (car centerPt) (cadr centerPt) hoehe) rotation
(list (cons "GERUEST_EINZELMODUL" geruest-einzelmodul)
(cons "GERUEST_TYP" geruest-typ)))
(ils-eckrad-insert (list (car centerPt) (cadr centerPt) hoehe) rotation attribs)
(dbgreturn nil)
)
;; --------------------------------------------
;; eckrad-dialog-werte: Dialogeingaben -> (attribs . rotation)
;; Reiner Kern (ohne DCL/Zeichnung, in tests/test_unit.lsp getestet).
;; Parameter:
;; attribs - bisherige Attribut-alist ((TAG . WERT) ...)
;; name - Bezeichnung (String)
;; hoehe-str - Hoehe in mm (String aus edit_box)
;; drehung-str - Drehung in Grad (String aus edit_box)
;; drehr-idx - popup_list-Index Drehrichtung ("0"=UZS, "1"=GUZ)
;; einzelmodul - toggle-Wert "0"/"1"
;; geruest-idx - popup_list-Index in *ssg-geruest-optionen* (String)
;; Rueckgabe: (attribs-neu . rotation) oder nil bei ungueltiger Zahl.
;; Drehung wird auf [0, 360) normiert.
;; --------------------------------------------
(defun eckrad-dialog-werte (attribs name hoehe-str drehung-str drehr-idx
einzelmodul geruest-idx / hoehe drehung neu)
(setq hoehe (distof hoehe-str 2)
drehung (distof drehung-str 2))
(if (and hoehe drehung)
(progn
(setq drehung (rem (+ (rem drehung 360.0) 360.0) 360.0))
(setq neu (list (cons "Bezeichnung" name)
(cons "HOEHE" (rtos hoehe 2 0))
(cons "DREHUNG" (rtos drehung 2 1))
(cons "DREHRICHTUNG" (if (= drehr-idx "1") "GUZ" "UZS"))
(cons "GERUEST_EINZELMODUL" (if (= einzelmodul "1") "1" "0"))
(cons "GERUEST_TYP" (ssg-geruest-idx-to-typ (atoi geruest-idx)))))
;; Neue Werte ueber die bestehenden legen (attribs als Default-Schema)
(cons (ssg-attrib-merge neu (mapcar '(lambda (p) (list (car p) (cdr p))) attribs))
drehung)
)
)
)
;; --------------------------------------------
;; eckrad-dialog: DCL-Dialog fuer Einfuegen und Bearbeiten
;; Parameter:
;; attribs - Attribut-alist zur Vorbelegung (mit *eckrad-attrib-defs* gemergt)
;; rotation - aktuelle Drehung in Grad
;; Rueckgabe: (attribs-neu . rotation-neu) oder nil (Abbruch/DCL fehlt)
;; --------------------------------------------
(defun eckrad-dialog (attribs rotation / dcl-pfad dat eckrad-dlg-ergebnis)
(setq attribs (ssg-attrib-merge attribs *eckrad-attrib-defs*))
(setq dcl-pfad (strcat (getenv "DXFM_DCL") "/eckrad_edit.dcl"))
(setq dat (load_dialog dcl-pfad))
(if (or (< dat 0) (not (new_dialog "eckrad_edit" dat)))
(progn
(if (>= dat 0) (unload_dialog dat))
(alert (ssg-textf "kreisel-edit-dialog-fehlt" (list dcl-pfad)))
nil
)
(progn
(set_tile "name" (cdr (assoc "Bezeichnung" attribs)))
(set_tile "hoehe" (cdr (assoc "HOEHE" attribs)))
(set_tile "drehung" (rtos rotation 2 1))
(start_list "drehrichtung")
(add_list "UZS")
(add_list "GUZ")
(end_list)
(set_tile "drehrichtung" (if (equal (cdr (assoc "DREHRICHTUNG" attribs)) "GUZ") "1" "0"))
(set_tile "geruest_einzelmodul"
(if (equal (cdr (assoc "GERUEST_EINZELMODUL" attribs)) "1") "1" "0"))
(start_list "geruest_typ")
(foreach opt *ssg-geruest-optionen* (add_list opt))
(end_list)
(set_tile "geruest_typ" (itoa (ssg-geruest-typ-to-idx (cdr (assoc "GERUEST_TYP" attribs)))))
;; OK nur bei gueltigen Zahlen, sonst Fehlerzeile und Dialog bleibt offen
(action_tile "accept"
(strcat
"(setq eckrad-dlg-ergebnis (eckrad-dialog-werte attribs"
" (get_tile \"name\") (get_tile \"hoehe\") (get_tile \"drehung\")"
" (get_tile \"drehrichtung\") (get_tile \"geruest_einzelmodul\")"
" (get_tile \"geruest_typ\")))"
"(if eckrad-dlg-ergebnis (done_dialog 1)"
" (set_tile \"error\" (ssg-text \"kreisel-eckrad-ungueltige-zahl\")))"
)
)
(action_tile "cancel" "(setq eckrad-dlg-ergebnis nil) (done_dialog 0)")
(start_dialog)
(unload_dialog dat)
eckrad-dlg-ergebnis
)
)
)
;; -----------------------------------------------
;; EckradEdit: Bestehendes Eckrad per Dialog bearbeiten
;; (Doppelklick auf ECKRAD_n ueber SSG_BLOCKEDIT)
;;
;; Ablauf:
;; 1. Eckrad-Block auswaehlen (oder vorselektiert)
;; 2. Dialog mit aktuellen Werten oeffnen
;; 3. Bei OK: Block loeschen und mit gleicher Nummer neu einfuegen
;; -----------------------------------------------
(defun c:EckradEdit ( / ss sel ent ed attribs basePoint rotation ergebnis)
;; Implied Selection VOR ssg-start pruefen (ssg-start hebt Selektion auf)
(setq ss (ssget "I"))
(if (and ss (= (sslength ss) 1)
(= (cdr (assoc 0 (entget (ssname ss 0)))) "INSERT"))
(setq ent (ssname ss 0))
)
(ssg-start (ssg-text "kreisel-start-eckrad-edit") '(("OSMODE") ("CECOLOR") ("ATTREQ") ("ATTDIA")))
(setvar "OSMODE" 0)
(if (null ent)
(progn
(setq sel (entsel (ssg-text "kreisel-prompt-eckrad-auswaehlen")))
(if sel (setq ent (car sel)))
)
)
(if (null ent) (progn (ssg-end) (exit)))
(setq ed (entget ent))
(if (or (/= (cdr (assoc 0 ed)) "INSERT")
(not (wcmatch (strcase (cdr (assoc 2 ed))) "ECKRAD_*")))
(progn (ssg-emsg (ssg-text "kreisel-emsg-kein-eckrad-block")) (ssg-end) (exit))
)
;; Bestehende Werte auslesen, fehlende mit Defaults auffuellen
(setq attribs (ssg-attrib-merge (ssg-attrib-read ent) *eckrad-attrib-defs*))
(setq basePoint (cdr (assoc 10 ed)))
(setq rotation (* (/ 180.0 pi) (cdr (assoc 50 ed))))
;; HOEHE immer aus Z-Koordinate des Einfuegepunkts
(setq attribs (subst (cons "HOEHE" (rtos (if (caddr basePoint) (caddr basePoint) 0.0) 2 0))
(assoc "HOEHE" attribs) attribs))
(setq ergebnis (eckrad-dialog attribs rotation))
(if ergebnis
(progn
(setq attribs (car ergebnis)
rotation (cdr ergebnis))
(command "_.ERASE" ent "")
(ils-eckrad-insert (list (car basePoint) (cadr basePoint)
(atof (cdr (assoc "HOEHE" attribs))))
rotation attribs)
(princ (ssg-textf "kreisel-eckrad-edit-aktualisiert"
(list (cdr (assoc "Bezeichnung" attribs))
(cdr (assoc "HOEHE" attribs))
(rtos rotation 2 1))))
)
(princ (ssg-text "kreisel-abgebrochen"))
)
(ssg-end)
)
;; --------------------------------------------
;; ils-eckrad-insert: Erzeugt Eckrad als Compound-Block mit Attributen
;; Parameter:
@@ -1182,10 +1391,16 @@
(dbg 'z-hoehe)
(dbg 'block-hoehe)
;; Automatische Nummer vergeben
(setq eckrad-nummer (eckrad-next-number))
(setq attribs (subst (cons "NUMMER" (itoa eckrad-nummer))
(assoc "NUMMER" attribs) attribs))
;; NUMMER: Bestehende beibehalten (EckradEdit), sonst neue vergeben -
;; so behaelt ein bearbeitetes Eckrad seinen Blocknamen ECKRAD_n
(setq eckrad-nummer (atoi (cdr (assoc "NUMMER" attribs))))
(if (<= eckrad-nummer 0)
(progn
(setq eckrad-nummer (eckrad-next-number))
(setq attribs (subst (cons "NUMMER" (itoa eckrad-nummer))
(assoc "NUMMER" attribs) attribs))
)
)
(dbg 'eckrad-nummer)
;; Blockname: ECKRAD_1, ECKRAD_2, ...
+3 -2
View File
@@ -684,7 +684,8 @@ AutoLISP-Implementierung fuer ILS Kreisel und Eckrad. Enthaelt alle Befehle fuer
| `c:KreiselLabelSetup` | Schriftart, Hoehe und Farbe fuer Kreisel-Beschriftung konfigurieren |
| `c:KreiselLabelPos` | Label-Offset (dx/dy) setzen |
| `c:KreiselLabelHoehe` | Label-Hoehe aendern |
| `c:ILS_Eckrad` | Eckrad an Tangentenpunkt einfuegen |
| `c:ILS_Eckrad` | Eckrad an Tangentenpunkt einfuegen, Parameter per DCL-Dialog (`eckrad_edit.dcl`; ohne GUI Konsolen-Rueckfall) |
| `c:EckradEdit` | Eckrad ueber DCL-Dialog bearbeiten (Bezeichnung, Hoehe, Drehung, Drehrichtung, Geruest; kein Abstand/Typ), Neuaufbau mit gleicher Nummer |
---
@@ -784,7 +785,7 @@ Erkennt den Blocktyp des selektierten INSERT-Blocks und ruft den passenden Bearb
| Blockmuster | Aktion |
| --- | --- |
| `KREISEL_*` | `KreiselEdit` |
| `ECKRAD_*` | `BEDIT` (Block-Editor) |
| `ECKRAD_*` | `EckradEdit` |
| `GF_*` | `GEFAELLESTRECKE_EDIT` |
| `VF_*` | `VARIOFOERDERER_EDIT` |
| `GR_*` | Geruest – `BEDIT` (kein eigener Edit-Pfad; siehe `GeruestInsert.lsp`) |
+2 -2
View File
@@ -345,10 +345,10 @@
(c:KreiselEdit)
)
;; Eckrad-Bloecke -> BEDIT (kein eigener Edit-Dialog in LISP)
;; Eckrad-Bloecke -> EckradEdit
((wcmatch bname "ECKRAD_*")
(princ (ssg-textf "cmd-eckrad-bearbeiten" (list bname)))
(command "_.BEDIT" bname)
(c:EckradEdit)
)
;; Gefaellestrecke-Bloecke (GF_n) -> GEFAELLESTRECKE_EDIT (DCL-Dialog)
+9 -6
View File
@@ -139,15 +139,18 @@
;;; dieselben Muster wie csv:collect-export-blocks/export_csv.py.
;;; ------------------------------------------------------------
;; --- Ist nm ein Kreisel/Eckrad-, VarioFoerderer- oder Gefaellestrecke-
;; --- Ist nm ein Kreisel-, VarioFoerderer- oder Gefaellestrecke-
;; Compound-Block? Alle drei fuehren einheitlich die Attribute
;; ANZAHL_SCANNER/ANZAHL_SEPARATOR. ---
;; ANZAHL_SCANNER/ANZAHL_SEPARATOR. Das Eckrad faellt zwar unter
;; pattern_kreisel, hat diese Attribute aber nicht und zaehlt bewusst
;; KEINE Sensoren (Entscheidung 2026-10) - darum ausgenommen; sonst
;; "FEHLER beim Schreiben der Anzahl-Attribute an ECKRAD_n". ---
(defun cs-carrier-p (nm / up)
(setq up (strcase nm))
(or (wcmatch up (export:pattern "pattern_kreisel" "KR_*,KREISEL_*,ECKRAD_*"))
(wcmatch up (export:pattern "pattern_variofoerderer" "VF_*"))
(wcmatch up (export:pattern "pattern_gefaellestrecke" "GF_*"))
)
(and (not (wcmatch up (export:pattern "pattern_eckrad" "ECKRAD_*")))
(or (wcmatch up (export:pattern "pattern_kreisel" "KR_*,KREISEL_*,ECKRAD_*"))
(wcmatch up (export:pattern "pattern_variofoerderer" "VF_*"))
(wcmatch up (export:pattern "pattern_gefaellestrecke" "GF_*"))))
)
;;; ------------------------------------------------------------
+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)))