[REFACTOR] KS-Extraktion + Einfuegeprimitiven zentral in ssg_ks_insert.lsp

Neun Funktionen waren doppelt gepflegt in vf_core.lsp (unbedingt) UND
Gefaellestrecke.lsp (geguardet 'Fallback wenn vf_core nicht geladen'). Da
vf_core im MNL immer nach Gefaellestrecke laedt, gewann bisher stillschweigend
die vf_core-Version - die Gefaellestrecke-Kopien waren de facto tot und wichen
leicht ab. Jetzt EINE Quelle:

  ssg_ks_insert.lsp: vec-length, ks-line-axis, ks-normalize-name, ks-relativize,
  ks-absolutize, ensure-block-loaded, extract-ks-from-block[-raw],
  insert-block-by-ks, insert-inclined-scaled-block, insert-rotated-block-with-ks

- Kanonische vf_core-Variante uebernommen (inkl. Null-Check, ssg-ils-block-auf-ebene,
  hz-Guard, Statusmeldungen). Gefaellestrecke erhaelt dadurch dieselbe Behandlung
  wie im MNL-Fluss ohnehin schon aktiv.
- Cache vereinheitlicht auf *ks-cache* (guarded init im Shared-File);
  *gf-ks-cache* entfaellt.
- MNL laedt ssg_ks_insert als Core-Modul VOR Gefaellestrecke/VarioFoerderer.
- vf_core + Gefaellestrecke: guarded Nachlade-Load fuer isoliertes Test/Dev-Laden.

Paren-Balance geprueft; jede der 9 Funktionen jetzt genau 1x definiert.
Beruehrt Block-Platzierung -> BricsCAD-Test Standard/Etage/Linienzug/Gefaelle
(2D+3D) noetig.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-29 08:37:35 +02:00
parent 6cf54f646b
commit 80804a321a
4 changed files with 408 additions and 632 deletions
+24 -298
View File
@@ -29,7 +29,8 @@
(if (null grad-zeichen) (setq grad-zeichen (chr 176)))
(if (null delta-sym) (setq delta-sym (chr 916)))
(if (null *gf-ks-cache*) (setq *gf-ks-cache* nil))
;; *gf-ks-cache* entfaellt - KS-Cache liegt zentral als *ks-cache* in
;; ssg_ks_insert.lsp (gemeinsame extract-ks-from-block).
(if (null *gf-lib-geladen*)(setq *gf-lib-geladen* nil))
;; COM-Objekte (Guard: nicht ueberschreiben wenn von vf_core gesetzt)
@@ -77,6 +78,28 @@
)
)
;; Gemeinsame KS-Extraktion + Einfuegeprimitiven (ssg_ks_insert.lsp)
;; sicherstellen. Im MNL-Fluss bereits vorgeladen; dieser Guard deckt das
;; isolierte Laden von Gefaellestrecke (Test/Dev) ab. ssg_ks_insert benoetigt
;; ssg_core-Funktionen (ssg-ils-block-laden etc.) - wie schon die frueheren
;; Gefaellestrecke-eigenen Kopien.
(if (not (car (atoms-family 1 '("INSERT-BLOCK-BY-KS"))))
(progn
(setq *gf-ksins-pfad*
(if (car (atoms-family 1 '("SSG-LISP-DATEI-PFAD")))
(ssg-lisp-datei-pfad "ssg_ks_insert.lsp")
(cond
((getenv "DXFM_LISP")
(strcat (vl-string-translate "\\" "/" (getenv "DXFM_LISP")) "/ssg_ks_insert.lsp"))
((and (boundp '*ssg-lisp-pfad*) *ssg-lisp-pfad*)
(strcat *ssg-lisp-pfad* "/ssg_ks_insert.lsp"))
(t nil))))
(if (and *gf-ksins-pfad* (findfile *gf-ksins-pfad*))
(load *gf-ksins-pfad*)
(princ "\n[Gefaellestrecke] WARNUNG: ssg_ks_insert.lsp nicht gefunden!"))
)
)
;; ============================================================
;; TEIL 2: KERN-FUNKTIONEN (Guard: nicht doppelt definieren)
;; ============================================================
@@ -86,25 +109,6 @@
(defun ssg-cfg-or (kategorie schluessel standard) standard)
)
;; --- Vektor-Laenge ---
(if (null (car (atoms-family 1 '("VEC-LENGTH"))))
(defun vec-length (v)
(sqrt (+ (* (car v) (car v))
(* (cadr v) (cadr v))
(* (caddr v) (caddr v)))))
)
;; --- Achsenkennung aus Linienlaenge fuer KS-Extraktion ---
(if (null (car (atoms-family 1 '("KS-LINE-AXIS"))))
(defun ks-line-axis (len)
(cond
((and (> len 0.5) (< len 1.5)) "X")
((and (> len 99) (< len 101)) "X")
((and (> len 1.5) (< len 2.5)) "Y")
((and (> len 2.5) (< len 3.5)) "Z")
(t nil)))
)
;; --- Punkt-Differenz ---
(if (null (car (atoms-family 1 '("PUNKT-DIFFERENZ"))))
(defun punkt-differenz (p1 p2)
@@ -113,284 +117,6 @@
(- (caddr p2) (caddr p1))))
)
;; --- Block als einzelne DWG-Datei aus block-pfad laden ---
(if (null (car (atoms-family 1 '("ENSURE-BLOCK-LOADED"))))
(defun ensure-block-loaded (blockname / )
;; Zentraler Loader (flache Ablage). Laedt den Block in der AKTUELLEN Dimension
;; (ssg-ils-dim-aktuell: *ssg-ils-dim*-Override -> DXFM_DIM) mit automatischem
;; 3D-Fallback, sodass 2D- und 3D-Aufbau gleichermassen funktionieren. Laedt
;; den Block unter seinem effektiven, dim-suffigierten Namen und GIBT DIESEN
;; ZURUECK, damit Aufrufer ihn zum Einfuegen verwenden. Meldung nur bei
;; Fehlschlag.
(if (not (ssg-ils-block-laden blockname))
(progn
(princ (ssg-textf "gf-fehler-blockdatei-fehlt" (list blockname)))
)
)
(ssg-ils-blockname blockname)
)
)
;; --- Rohe KS-Extraktion aus Block ---
(if (null (car (atoms-family 1 '("EXTRACT-KS-FROM-BLOCK-RAW"))))
(defun extract-ks-from-block-raw (block-obj /
sub-entities sub-obj ks-results ks-ref
inner-entities inner-obj
origin x-end y-end z-end
line-start line-end line-vec line-len axis)
(setq ks-results '())
(setq sub-entities (vlax-invoke block-obj 'Explode))
(foreach sub-obj sub-entities
;; KS-Blocknamen normalisieren: Standard KS_EIN/KS_AUS; historische
;; Bestandsbloecke koennen noch KSYS_EIN/KSYS_AUS fuehren (inline, damit
;; diese Fallback-Kopie unabhaengig von vf_core.lsp funktioniert).
(setq ks-ref
(if (and (not (vlax-erased-p sub-obj))
(= (vla-get-ObjectName sub-obj) "AcDbBlockReference"))
(cond
((or (= (vla-get-Name sub-obj) "KS_EIN") (= (vla-get-Name sub-obj) "KSYS_EIN")) "KS_EIN")
((or (= (vla-get-Name sub-obj) "KS_AUS") (= (vla-get-Name sub-obj) "KSYS_AUS")) "KS_AUS")
(t nil))
nil))
(if ks-ref
(progn
(setq inner-entities (vlax-invoke sub-obj 'Explode))
(setq origin nil x-end nil y-end nil z-end nil)
(foreach inner-obj inner-entities
(if (and (not (vlax-erased-p inner-obj))
(= (vla-get-ObjectName inner-obj) "AcDbLine"))
(progn
(setq line-start
(vlax-safearray->list
(vlax-variant-value (vla-get-StartPoint inner-obj))))
(setq line-end
(vlax-safearray->list
(vlax-variant-value (vla-get-EndPoint inner-obj))))
(setq line-vec
(list (- (car line-end) (car line-start))
(- (cadr line-end) (cadr line-start))
(- (caddr line-end) (caddr line-start))))
(setq line-len (vec-length line-vec))
(setq axis (ks-line-axis line-len))
(if (null origin) (setq origin line-start))
(cond
((= axis "X") (setq x-end line-end))
((= axis "Y") (setq y-end line-end))
((= axis "Z") (setq z-end line-end))
)
)
)
(if (not (vlax-erased-p inner-obj)) (vla-Delete inner-obj))
)
(if (and origin x-end y-end z-end)
(setq ks-results
(cons (list ks-ref (list origin x-end y-end z-end))
ks-results))
)
)
)
)
(foreach sub-obj sub-entities
(if (not (vlax-erased-p sub-obj)) (vla-Delete sub-obj))
)
ks-results
)
)
;; --- KS-Extraktion mit Cache ---
(if (null (car (atoms-family 1 '("EXTRACT-KS-FROM-BLOCK"))))
(defun extract-ks-from-block (block-obj / blockname insert-pt cached result ks-rel)
(setq blockname (vla-get-Name block-obj))
(setq insert-pt (vlax-safearray->list
(vlax-variant-value
(vla-get-InsertionPoint block-obj))))
(setq cached (assoc blockname *gf-ks-cache*))
(if cached
;; Aus Cache: relative Koordinaten + Einfuegepunkt
(mapcar '(lambda (item)
(list (car item)
(mapcar '(lambda (pt)
(list (+ (car pt) (car insert-pt))
(+ (cadr pt) (cadr insert-pt))
(+ (caddr pt) (caddr insert-pt))))
(cadr item))))
(cdr cached))
(progn
(setq result (extract-ks-from-block-raw block-obj))
(if result
(progn
(setq ks-rel
(mapcar '(lambda (item)
(list (car item)
(mapcar '(lambda (pt)
(list (- (car pt) (car insert-pt))
(- (cadr pt) (cadr insert-pt))
(- (caddr pt) (caddr insert-pt))))
(cadr item))))
result))
(setq *gf-ks-cache*
(cons (cons blockname ks-rel) *gf-ks-cache*))
)
)
result
)
)
)
)
;; --- Block per KS_EIN/KS_AUS einfuegen ---
(if (null (car (atoms-family 1 '("INSERT-BLOCK-BY-KS"))))
(defun insert-block-by-ks (blockname einfuegepunkt hz /
block-obj temp-obj ks-data ks-ein ks-aus
rad-h chv shv ein-x ein-y ein-z dx-loc dy-loc dz-loc
offset ausgang)
(setq blockname (ensure-block-loaded blockname))
(if (not (tblsearch "BLOCK" blockname))
(progn
(princ (ssg-textf "gf-fehler-block-fehlt" (list blockname)))
(exit)
)
)
(setq rad-h (* (float hz) (/ pi 180.0)))
(setq chv (cos rad-h) shv (sin rad-h))
;; KS_EIN/KS_AUS ueber eigenes Temp-Objekt am Ursprung ermitteln (nicht
;; am spaeter tatsaechlich platzierten block-obj), siehe vf_core.lsp.
(setq temp-obj
(vla-InsertBlock modelspace
(vlax-3D-point '(0 0 0))
blockname 1.0 1.0 1.0 0))
(setq ks-data (extract-ks-from-block temp-obj))
(if (not (vlax-erased-p temp-obj)) (vla-Delete temp-obj))
(setq ks-ein (cadr (assoc "KS_EIN" ks-data)))
(setq ks-aus (cadr (assoc "KS_AUS" ks-data)))
(setq block-obj
(vla-InsertBlock modelspace
(vlax-3D-point '(0 0 0))
blockname 1.0 1.0 1.0 0))
(vla-TransformBy block-obj (vlax-tmatrix
(list (list chv (- shv) 0 0)
(list shv chv 0 0)
(list 0 0 1 0)
(list 0 0 0 1))))
(if (and ks-ein ks-aus)
(progn
(setq ein-x (car (car ks-ein)) ein-y (cadr (car ks-ein)) ein-z (caddr (car ks-ein)))
(setq offset (list
(- (car einfuegepunkt) (- (* chv ein-x) (* shv ein-y)))
(- (cadr einfuegepunkt) (+ (* shv ein-x) (* chv ein-y)))
(- (caddr einfuegepunkt) ein-z)))
(vla-Move block-obj
(vlax-3D-point '(0 0 0))
(vlax-3D-point offset))
(setq dx-loc (- (car (car ks-aus)) ein-x))
(setq dy-loc (- (cadr (car ks-aus)) ein-y))
(setq dz-loc (- (caddr (car ks-aus)) ein-z))
(setq ausgang (list
(+ (car einfuegepunkt) (- (* chv dx-loc) (* shv dy-loc)))
(+ (cadr einfuegepunkt) (+ (* shv dx-loc) (* chv dy-loc)))
(+ (caddr einfuegepunkt) dz-loc)))
(princ (ssg-textf "gf-status-ks-aus-z" (list (rtos (caddr ausgang) 2 2))))
ausgang
)
(progn
(princ (ssg-text "gf-warnung-ks-fehlt"))
einfuegepunkt
)
)
)
)
;; --- Skalierter geneigter Block (Staustrecke, Richtung X) ---
(if (null (car (atoms-family 1 '("INSERT-INCLINED-SCALED-BLOCK"))))
(defun insert-inclined-scaled-block (blockname startpunkt laenge winkel hz /
rad-v rad-h chv shv cvv svv scale block-obj endpunkt)
(if (<= laenge 0.1)
(progn (princ (ssg-text "gf-laenge-null-uebersprungen")) startpunkt)
(progn
(setq blockname (ensure-block-loaded blockname))
(setq scale (/ (float laenge) 1000.0))
(setq rad-v (* (float winkel) (/ pi 180.0)))
(setq rad-h (* (float hz) (/ pi 180.0)))
(setq chv (cos rad-h) shv (sin rad-h) cvv (cos rad-v) svv (sin rad-v))
(setq block-obj
(vla-InsertBlock modelspace
(vlax-3D-point '(0 0 0))
blockname scale 1.0 1.0 0))
(vla-TransformBy block-obj (vlax-tmatrix (ssg-rot-matrix-zy chv shv cvv svv)))
(vla-Move block-obj
(vlax-3D-point '(0 0 0))
(vlax-3D-point startpunkt))
(setq endpunkt
(list (+ (car startpunkt) (* laenge chv cvv))
(+ (cadr startpunkt) (* laenge shv cvv))
(+ (caddr startpunkt) (* laenge (- svv)))))
(princ (ssg-textf "gf-status-block-l-z"
(list blockname (rtos laenge 2 1) (rtos (caddr endpunkt) 2 1))))
endpunkt
)
)
)
)
;; --- Rotierter Block mit manuellem dx/dz ---
;; KS_EIN (nicht der Block-Ursprung) wird auf startpunkt ausgerichtet, siehe
;; Kommentar an der kanonischen Definition in vf_core.lsp.
(if (null (car (atoms-family 1 '("INSERT-ROTATED-BLOCK-WITH-KS"))))
;; block-dx/block-dz: Fallback, nur falls KS_AUS nicht extrahierbar.
;; Ist KS_AUS vorhanden, wird der echte Versatz KS_AUS-KS_EIN verwendet
;; (schuetzt vor veralteten Config-Zahlen), siehe vf_core.lsp.
(defun insert-rotated-block-with-ks (blockname startpunkt winkel block-dx block-dz hz /
rad-v rad-h chv shv cvv svv block-obj temp-obj ks-data
ks-ein-raw ks-aus-raw
ein-x ein-y ein-z aus-x aus-y aus-z
dx dz ins-pt)
(setq blockname (ensure-block-loaded blockname))
(setq rad-v (* (float winkel) (/ pi 180.0)))
(setq rad-h (* (float hz) (/ pi 180.0)))
(setq chv (cos rad-h) shv (sin rad-h) cvv (cos rad-v) svv (sin rad-v))
;; Lokale KS_EIN/KS_AUS-Position ueber EIGENES Temp-Objekt ermitteln
;; (nicht am spaeter tatsaechlich platzierten block-obj), siehe vf_core.lsp.
(setq temp-obj
(vla-InsertBlock modelspace
(vlax-3D-point '(0 0 0))
blockname 1.0 1.0 1.0 0))
(setq ks-data (extract-ks-from-block temp-obj))
(if (not (vlax-erased-p temp-obj)) (vla-Delete temp-obj))
(setq ks-ein-raw (cadr (assoc "KS_EIN" ks-data)))
(setq ks-aus-raw (cadr (assoc "KS_AUS" ks-data)))
(setq ein-x 0.0 ein-y 0.0 ein-z 0.0)
(if ks-ein-raw
(setq ein-x (car (car ks-ein-raw))
ein-y (cadr (car ks-ein-raw))
ein-z (caddr (car ks-ein-raw)))
)
(setq dx block-dx dz block-dz)
(if ks-aus-raw
(progn
(setq aus-x (car (car ks-aus-raw))
aus-y (cadr (car ks-aus-raw))
aus-z (caddr (car ks-aus-raw)))
(setq dx (- aus-x ein-x) dz (- aus-z ein-z))
)
)
(setq block-obj
(vla-InsertBlock modelspace
(vlax-3D-point '(0 0 0))
blockname 1.0 1.0 1.0 0))
(vla-TransformBy block-obj (vlax-tmatrix (ssg-rot-matrix-zy chv shv cvv svv)))
(setq ins-pt (list
(- (car startpunkt) (+ (* ein-x chv cvv) (* ein-y (- shv)) (* ein-z chv svv)))
(- (cadr startpunkt) (+ (* ein-x shv cvv) (* ein-y chv) (* ein-z shv svv)))
(- (caddr startpunkt) (+ (* ein-x (- svv)) (* ein-z cvv)))))
(vla-Move block-obj
(vlax-3D-point '(0 0 0))
(vlax-3D-point ins-pt))
(list
(+ (car startpunkt) (+ (* dx chv cvv) (* dz chv svv)))
(+ (cadr startpunkt) (+ (* dx shv cvv) (* dz shv svv)))
(+ (caddr startpunkt) (+ (* dx (- svv)) (* dz cvv))))
)
)
;; --- KS-Rahmen aus Fahrtrichtungsvektor (Fallback wenn vf_core nicht geladen) ---
(if (null (car (atoms-family 1 '("MAKE-FRAME-FROM-DIR"))))