VF: gemeinsamen Wrapper-Rumpf vf-wrapper-bauen (Standard/Etage + Linienzug)
vf-block-erstellen (vf_core, Standard/Etage) und vfl-block-erstellen (vf_linienzug) hatten denselben ~25-Zeilen-Rumpf wortgleich: ATTDEFs am Startpunkt, Entity-Sweep seit lastEnt, Sepliste sichern, ssg-block-wrap-welt, Layer setzen, Sepliste-XDATA, Attribute setzen, ID + Dim-XDATA. Jetzt in vf-wrapper-bauen (vf_core) zusammengefasst; beide Aufrufer bauen nur noch ihre FERTIGE Attributliste (Standard/Etage: feste Werte; Linienzug: *vfl-acc-*- Komma-Listen) und uebergeben sie - der Rumpf kennt die Attribut-Semantik nicht. ATTDEF-FORMAT VEREINHEITLICHT auf den kanonischen Stil: 3 von 4 Wrapper-Bauern (vfl-block-erstellen, Gefaellestrecke, Vario_Kette_Merge) nutzten bereits identisch (10/11=startpunkt, 40, 70/72/74, alle am selben Punkt). vf-block- erstellen war der Ausreisser mit Layer-0/Model-Space-Zwang, y-Dekrementierung je Zeile und fehlenden Ausrichtungscodes - historischer Drift OHNE Effekt bei unsichtbaren ATTDEFs (Flag 70=1, reine Attribut-Container). Standard/Etage bauen die ATTDEFs damit jetzt im kanonischen Format. Toter Code entfernt: *vfk-attdef-zeilenabstand* (einzige Nutzung war die entfernte y-Dekrementierung). *vfk-attdef-texthoehe* jetzt in vf-wrapper-bauen zentral genutzt. Die ATTRIBUTWERTE sind unveraendert (Diff-Review: Bezeichnung wertgleich, Etage-Bogen-Extra nur von zweitem ssg-attrib-set-on in die Hauptliste gezogen). Verhaltensneutral fuer den Linienzug (hatte schon das kanonische Format); fuer Standard/Etage aendert sich nur das (unsichtbare) ATTDEF-Format. 243/243 LISP-Unit-Tests gruen; Python-Suite unveraendert (11 Baseline); Klammerbalance geprueft. Der Attribut-/Geometrie-Gleichstand von Standard/Etage ist interaktiv in BricsCAD bzw. per SSG_RUN_ALL_TESTS gegenzupruefen. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
cdb9183692
commit
8be256fb5a
+44
-85
@@ -6231,7 +6231,7 @@
|
||||
;; ============================================================
|
||||
(defun vfl-block-erstellen (vfl-nummer anzahl-gf anzahl-vf hoehe-von hoehe-bis
|
||||
delta-l-total as-seite es-seite startpunkt lastEnt /
|
||||
vfl-bname vfl-ss ent vfl-insert typ-str vfl-sepliste)
|
||||
vfl-bname vfl-insert typ-str)
|
||||
;; TYP: einsegmentige Gefaellestrecke ohne Bogen -> "Gefaellestrecke";
|
||||
;; mit VF, Bogen oder mehreren GF-Segmenten -> "Streckengruppe".
|
||||
(setq typ-str
|
||||
@@ -6242,90 +6242,49 @@
|
||||
"Streckengruppe"
|
||||
"Gefaellestrecke"))
|
||||
(setq vfl-bname (strcat "VF_" (itoa vfl-nummer)))
|
||||
;; ATTDEFs nach gemeinsamem Strecken-Schema (Reihenfolge!)
|
||||
(foreach def (ssg-strecke-attrib-defs typ-str)
|
||||
(entmake
|
||||
(list '(0 . "ATTDEF")
|
||||
(cons 10 startpunkt)
|
||||
(cons 11 startpunkt)
|
||||
'(40 . 50.0)
|
||||
(cons 1 (cadr def))
|
||||
(cons 2 (car def))
|
||||
(cons 3 (car def))
|
||||
'(70 . 1)
|
||||
'(72 . 0)
|
||||
'(74 . 0)))
|
||||
)
|
||||
(setq vfl-ss (ssadd))
|
||||
(setq ent (if lastEnt (entnext lastEnt) (entnext)))
|
||||
(while ent
|
||||
(ssadd ent vfl-ss)
|
||||
(setq ent (entnext ent))
|
||||
)
|
||||
;; Sepliste (Separator/AS/ES-Reihenfolge, siehe ssg_ks_insert.lsp) VOR dem
|
||||
;; Sweep sammeln - danach existieren die Sub-Entities nicht mehr einzeln.
|
||||
(setq vfl-sepliste (ssg-sepliste-sammeln lastEnt))
|
||||
;; Block definieren und einfuegen mit garantiert weltparallelem BKS.
|
||||
;; startpunkt ist ein Welt-Punkt; ssg-block-wrap-welt setzt das BKS
|
||||
;; temporaer auf Welt (verhindert den 31.95mm-Z-Versatz bei abweichendem
|
||||
;; BKS, siehe Kommentar dort) und stellt es danach wieder her.
|
||||
(setq vfl-insert (ssg-block-wrap-welt vfl-bname startpunkt vfl-ss))
|
||||
;; Ziel-Layer der Baugruppe aus cfg/layer.cfg (ohne Eintrag bleibt die
|
||||
;; Referenz auf dem aktuellen Layer, wie vor der Umstellung).
|
||||
(ssg-layer-setzen vfl-insert "variofoerderer")
|
||||
(ssg-sepliste-xdata-schreiben vfl-insert "SSG_VF_SEP" vfl-sepliste)
|
||||
;; Werte (volle Liste; nicht vorhandene Tags ignoriert ssg-attrib-set-on)
|
||||
(ssg-attrib-set-on vfl-insert
|
||||
(list
|
||||
(cons "Bezeichnung" vfl-bname)
|
||||
(cons "MONTAGEHOEHE_m" (rtos (/ (+ hoehe-von hoehe-bis) 2000.0) 2 3))
|
||||
(cons "HOEHE_VON_mm" (itoa (fix hoehe-von)))
|
||||
(cons "HOEHE_BIS_mm" (itoa (fix hoehe-bis)))
|
||||
(cons "DELTA_H_mm" (itoa (fix (abs (- hoehe-bis hoehe-von)))))
|
||||
(cons "DELTA_L_mm" (itoa (fix delta-l-total)))
|
||||
(cons "TYP" typ-str)
|
||||
(cons "SEITE_AS" as-seite)
|
||||
(cons "WINKEL_AS" (if (boundp '*vfl-as-winkel*) *vfl-as-winkel* ""))
|
||||
(cons "SEITE_ES" es-seite)
|
||||
(cons "WINKEL_ES" (if (boundp '*vfl-es-winkel*) *vfl-es-winkel* ""))
|
||||
;; ANZAHL_GF = alle GF-Stuecke: eigenstaendige GF-Segmente UND die GF1/GF2
|
||||
;; jeder VF-Einheit (alle ueber vfl-acc-gf-seg in *vfl-acc-lgf* gesammelt).
|
||||
(cons "ANZAHL_GF" (itoa (length *vfl-acc-lgf*)))
|
||||
(cons "L_GF_m" (vfl-join-komma *vfl-acc-lgf*))
|
||||
(cons "GF_WINKEL" (vfl-join-komma *vfl-acc-gfwinkel*))
|
||||
;; GF-Boegen (Richtungswechsel im GF-Teil), gezaehlt nach Seite+Winkel
|
||||
(cons "GF_Bogen_L_90" (itoa (vfl-get-count *vfl-acc-gfbogen* "L_90")))
|
||||
(cons "GF_Bogen_L_60" (itoa (vfl-get-count *vfl-acc-gfbogen* "L_60")))
|
||||
(cons "GF_Bogen_L_30" (itoa (vfl-get-count *vfl-acc-gfbogen* "L_30")))
|
||||
(cons "GF_Bogen_R_90" (itoa (vfl-get-count *vfl-acc-gfbogen* "R_90")))
|
||||
(cons "GF_Bogen_R_60" (itoa (vfl-get-count *vfl-acc-gfbogen* "R_60")))
|
||||
(cons "GF_Bogen_R_30" (itoa (vfl-get-count *vfl-acc-gfbogen* "R_30")))
|
||||
(cons "ANZAHL_VF" (itoa anzahl-vf))
|
||||
(cons "MOTORSEITE" (vfl-join-komma *vfl-acc-motorseite*))
|
||||
(cons "L_VF_m" (vfl-join-komma *vfl-acc-lvf*))
|
||||
(cons "ANTRIEBFAHRTRICHTUNG" (vfl-join-komma *vfl-acc-richtung*))
|
||||
(cons "VF_WINKEL" (vfl-join-komma *vfl-acc-winkel*))
|
||||
;; Vario-Kurven (Richtungswechsel im VF-Teil), A=aussen / I=innen
|
||||
(cons "VF_Bogen_A_90" (itoa (vfl-get-count *vfl-acc-variokurve* "A_90")))
|
||||
(cons "VF_Bogen_A_60" (itoa (vfl-get-count *vfl-acc-variokurve* "A_60")))
|
||||
(cons "VF_Bogen_A_30" (itoa (vfl-get-count *vfl-acc-variokurve* "A_30")))
|
||||
(cons "VF_Bogen_I_90" (itoa (vfl-get-count *vfl-acc-variokurve* "I_90")))
|
||||
(cons "VF_Bogen_I_60" (itoa (vfl-get-count *vfl-acc-variokurve* "I_60")))
|
||||
(cons "VF_Bogen_I_30" (itoa (vfl-get-count *vfl-acc-variokurve* "I_30")))
|
||||
(cons "ANZAHL_SEPARATOR" (itoa *vfl-acc-separator*))
|
||||
)
|
||||
)
|
||||
;; Aufsteigende, eindeutige ID vergeben (wie beim Kreisel), falls verfuegbar.
|
||||
(if (car (atoms-family 1 '("SSG-ID-GENERATE")))
|
||||
(ssg-id-generate vfl-insert))
|
||||
;; Dimension (2D/3D), in der gebaut wurde, als eigenes SSG_DIM-XDATA merken
|
||||
;; (analog vf-block-erstellen). Deckt alle Bau-Pfade ab, da Modus 1/2/3 UND
|
||||
;; die Abbruch-Sicherung ueber vfl-block-erstellen laufen. Erst dadurch kann
|
||||
;; die Batch-Umschaltung (ssg-dim-alle-umwandeln) Linienzug-Bloecke korrekt
|
||||
;; als 2D bzw. 3D erkennen statt sie pauschal als "3D" zu behandeln.
|
||||
(if (and vfl-insert (car (atoms-family 1 '("SSG-DIM-XDATA-SCHREIBEN"))))
|
||||
(ssg-dim-xdata-schreiben vfl-insert (ssg-ils-dim-aktuell)))
|
||||
(princ (ssg-textf "vfl-block-erstellt" (list vfl-bname typ-str)))
|
||||
;; Gemeinsamer Wrapper-Rumpf (ATTDEF/Sweep/Sepliste/Wrap/Layer/ID/Dim, siehe
|
||||
;; vf-wrapper-bauen in vf_core). Die *vfl-acc-*-Attributliste baut hier der
|
||||
;; Aufrufer (linienzug-spezifische Komma-Listen), der Rumpf kennt sie nicht.
|
||||
(setq vfl-insert
|
||||
(vf-wrapper-bauen vfl-nummer typ-str startpunkt lastEnt
|
||||
(list
|
||||
(cons "Bezeichnung" vfl-bname)
|
||||
(cons "MONTAGEHOEHE_m" (rtos (/ (+ hoehe-von hoehe-bis) 2000.0) 2 3))
|
||||
(cons "HOEHE_VON_mm" (itoa (fix hoehe-von)))
|
||||
(cons "HOEHE_BIS_mm" (itoa (fix hoehe-bis)))
|
||||
(cons "DELTA_H_mm" (itoa (fix (abs (- hoehe-bis hoehe-von)))))
|
||||
(cons "DELTA_L_mm" (itoa (fix delta-l-total)))
|
||||
(cons "TYP" typ-str)
|
||||
(cons "SEITE_AS" as-seite)
|
||||
(cons "WINKEL_AS" (if (boundp '*vfl-as-winkel*) *vfl-as-winkel* ""))
|
||||
(cons "SEITE_ES" es-seite)
|
||||
(cons "WINKEL_ES" (if (boundp '*vfl-es-winkel*) *vfl-es-winkel* ""))
|
||||
;; ANZAHL_GF = alle GF-Stuecke: eigenstaendige GF-Segmente UND die GF1/GF2
|
||||
;; jeder VF-Einheit (alle ueber vfl-acc-gf-seg in *vfl-acc-lgf* gesammelt).
|
||||
(cons "ANZAHL_GF" (itoa (length *vfl-acc-lgf*)))
|
||||
(cons "L_GF_m" (vfl-join-komma *vfl-acc-lgf*))
|
||||
(cons "GF_WINKEL" (vfl-join-komma *vfl-acc-gfwinkel*))
|
||||
;; GF-Boegen (Richtungswechsel im GF-Teil), gezaehlt nach Seite+Winkel
|
||||
(cons "GF_Bogen_L_90" (itoa (vfl-get-count *vfl-acc-gfbogen* "L_90")))
|
||||
(cons "GF_Bogen_L_60" (itoa (vfl-get-count *vfl-acc-gfbogen* "L_60")))
|
||||
(cons "GF_Bogen_L_30" (itoa (vfl-get-count *vfl-acc-gfbogen* "L_30")))
|
||||
(cons "GF_Bogen_R_90" (itoa (vfl-get-count *vfl-acc-gfbogen* "R_90")))
|
||||
(cons "GF_Bogen_R_60" (itoa (vfl-get-count *vfl-acc-gfbogen* "R_60")))
|
||||
(cons "GF_Bogen_R_30" (itoa (vfl-get-count *vfl-acc-gfbogen* "R_30")))
|
||||
(cons "ANZAHL_VF" (itoa anzahl-vf))
|
||||
(cons "MOTORSEITE" (vfl-join-komma *vfl-acc-motorseite*))
|
||||
(cons "L_VF_m" (vfl-join-komma *vfl-acc-lvf*))
|
||||
(cons "ANTRIEBFAHRTRICHTUNG" (vfl-join-komma *vfl-acc-richtung*))
|
||||
(cons "VF_WINKEL" (vfl-join-komma *vfl-acc-winkel*))
|
||||
;; Vario-Kurven (Richtungswechsel im VF-Teil), A=aussen / I=innen
|
||||
(cons "VF_Bogen_A_90" (itoa (vfl-get-count *vfl-acc-variokurve* "A_90")))
|
||||
(cons "VF_Bogen_A_60" (itoa (vfl-get-count *vfl-acc-variokurve* "A_60")))
|
||||
(cons "VF_Bogen_A_30" (itoa (vfl-get-count *vfl-acc-variokurve* "A_30")))
|
||||
(cons "VF_Bogen_I_90" (itoa (vfl-get-count *vfl-acc-variokurve* "I_90")))
|
||||
(cons "VF_Bogen_I_60" (itoa (vfl-get-count *vfl-acc-variokurve* "I_60")))
|
||||
(cons "VF_Bogen_I_30" (itoa (vfl-get-count *vfl-acc-variokurve* "I_30")))
|
||||
(cons "ANZAHL_SEPARATOR" (itoa *vfl-acc-separator*)))))
|
||||
(if vfl-insert (princ (ssg-textf "vfl-block-erstellt" (list vfl-bname typ-str))))
|
||||
vfl-insert
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user