722 lines
31 KiB
Common Lisp
722 lines
31 KiB
Common Lisp
;; ============================================================
|
|
;; test_gefaellestrecke.lsp - Automatischer Integrationstest GEFAELLESTRECKE
|
|
;;
|
|
;; Modus 1: 4 Richtungen (hz=0/90/180/270 Grad)
|
|
;; deltaL=10000 mm, Winkel=3 Grad, Seite links/links
|
|
;;
|
|
;; Modus 2: Linie entlang X-Achse (hz=0 Grad, Y=-35000)
|
|
;; Startpunkt am Linienanfang, Winkel=3 Grad
|
|
;;
|
|
;; Modus 3: 3D-Linie entlang Y-Achse Richtung Sued (Y=-50000 bis Y=-60000)
|
|
;; DeltaH stammt aus Modus 2 Ergebnis
|
|
;; Naeherungswinkel + 2-Pass-Korrektur (wie gf-linienzug-modus)
|
|
;;
|
|
;; Speichert:
|
|
;; tests/output/gefaellestrecke_results.json
|
|
;;
|
|
;; Voraussetzungen:
|
|
;; - SSG_LIB geladen (Gefaellestrecke.lsp, ssg_core.lsp, vf_core.lsp)
|
|
;; - Umgebungsvariable DXFMAKRO gesetzt
|
|
;;
|
|
;; Aufruf in BricsCAD:
|
|
;; (load (strcat (getenv "DXFMAKRO") "/tests/test_gefaellestrecke.lsp"))
|
|
;; TEST_GEFAELLESTRECKE
|
|
;; ============================================================
|
|
|
|
|
|
;; --- Ergebnis eines Testfalls als JSON-String erzeugen ---
|
|
(defun gefaellestrecke:test-json (test-id modus hz deltaL winkel h-von h-bis d-h status /
|
|
json)
|
|
(setq json
|
|
(strcat " {\n"
|
|
" \"test_id\": \"" test-id "\",\n"
|
|
" \"modus\": " (itoa modus) ",\n"
|
|
" \"hz_grad\": " (rtos (float hz) 2 1) ",\n"
|
|
" \"deltaL_mm\": " (rtos (float deltaL) 2 0) ",\n"
|
|
" \"winkel_grad\": " (rtos (float winkel) 2 3) ",\n"
|
|
" \"hoehe_von_mm\": " (rtos (float h-von) 2 0) ",\n"
|
|
" \"hoehe_bis_mm\": " (rtos (float h-bis) 2 0) ",\n"
|
|
" \"delta_h_mm\": " (rtos (float d-h) 2 0) ",\n"
|
|
" \"status\": \"" status "\"\n"
|
|
" }"))
|
|
json
|
|
)
|
|
|
|
|
|
;; --- JSON-Export der Gefaellestrecke-Testergebnisse ---
|
|
(defun gefaellestrecke:export-results (tests-out-dir / out-json f first)
|
|
(if (null *gefaellestrecke-test-results*)
|
|
(princ "\n Keine Gefaellestrecke-Ergebnisse vorhanden.")
|
|
(progn
|
|
(vl-mkdir tests-out-dir)
|
|
(setq out-json (strcat tests-out-dir "/gefaellestrecke_results.json"))
|
|
(setq f (open out-json "w"))
|
|
(if f
|
|
(progn
|
|
(write-line "[" f)
|
|
(setq first T)
|
|
(foreach r *gefaellestrecke-test-results*
|
|
(if (not first) (write-line "," f))
|
|
(write-line r f)
|
|
(setq first nil))
|
|
(write-line "]" f)
|
|
(close f)
|
|
(princ (strcat "\n Ergebnisse: " out-json)))
|
|
(princ (strcat "\n FEHLER: " out-json " nicht schreibbar!"))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
|
|
;; --- Modus 3: Linienzug-basierte Einfuegung (nicht-interaktiv) ---
|
|
;; Repliziert gf-linienzug-modus ohne Benutzerabfragen.
|
|
;;
|
|
;; linie-vla : VLA-Objekt der Leitlinie (LINE oder ARC-Kette)
|
|
;; startpunkt : 3D-Punkt KS_EIN des AUS-Elements (hoeher liegende Seite)
|
|
;; endpunkt-ref: 3D-Zielhoehe fuer KS_AUS des EIN-Elements
|
|
;; as-seite : "links" oder "rechts" (AUS-Element)
|
|
;; es-seite : "links" oder "rechts" (EIN-Element)
|
|
;; Rueckgabe : GF_N INSERT ename oder nil bei Fehler
|
|
(defun gefaellestrecke:modus3-einfuegen (objekt-liste startpunkt endpunkt-ref as-seite es-seite /
|
|
as-block es-block deltaH
|
|
kette segmente seg
|
|
entry-hz exit-hz grade
|
|
first-idx last-idx i j neu-l
|
|
gf-nummer last-ent
|
|
aktuell-frame nach-aus-pt
|
|
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
|
|
delta-l-gf L-gf-str laengen-liste first-l l-item
|
|
bL90 bL60 bL30 bR90 bR60 bR30 n-bogen-gf
|
|
rad-v-korr ein-hz-as-k rad-h-as-k xu-as-meas
|
|
rad-h-es-k xu-es-meas dz-as-ist dz-es-ist
|
|
dH-korr grade-korr gf-ins)
|
|
|
|
(setq as-block (strcat "AS_Element_90_" as-seite))
|
|
(setq es-block (strcat "ES_Element_90_" es-seite))
|
|
(setq deltaH (abs (- (caddr startpunkt) (caddr endpunkt-ref))))
|
|
|
|
;; 1. Kette sortieren und analysieren (objekt-liste = 1..n LINE/ARC-Objekte)
|
|
(setq kette (gf-sortiere-objekte objekt-liste startpunkt))
|
|
(if (null kette)
|
|
;; Fehler: keine Kette -> nil zurueckgeben
|
|
(progn (princ "\n FEHLER: keine sortierte Kette!") nil)
|
|
|
|
;; Kette vorhanden: vollstaendige Verarbeitung
|
|
(progn
|
|
(setq segmente (gf-analysiere-kette kette))
|
|
|
|
;; 2. Eingangs-/Ausgangsrichtung
|
|
(setq entry-hz (cadr (car segmente)))
|
|
(setq exit-hz (gf-exit-hz segmente))
|
|
|
|
;; 3. Segmentlaengen anpassen (erste Linie -aus-dx, letzte -300-ein-dx)
|
|
(setq first-idx -1 j 0)
|
|
(while (and (< j (length segmente)) (< first-idx 0))
|
|
(if (= (car (nth j segmente)) "Linie") (setq first-idx j))
|
|
(setq j (1+ j)))
|
|
(setq last-idx -1 j (1- (length segmente)))
|
|
(while (and (>= j 0) (< last-idx 0))
|
|
(if (= (car (nth j segmente)) "Linie") (setq last-idx j))
|
|
(setq j (1- j)))
|
|
|
|
(if (>= first-idx 0)
|
|
(progn
|
|
(setq i 0)
|
|
(while (< i (length segmente))
|
|
(setq seg (nth i segmente))
|
|
(if (= (car seg) "Linie")
|
|
(progn
|
|
(setq neu-l (caddr seg))
|
|
(if (= i first-idx)
|
|
(setq neu-l (- neu-l aus-dx)))
|
|
(if (and (< (1+ i) (length segmente))
|
|
(= (car (nth (1+ i) segmente)) "Bogen"))
|
|
(setq neu-l (- neu-l 300.0)))
|
|
(if (= i last-idx)
|
|
(setq neu-l (- neu-l 300.0 ein-dx)))
|
|
(setq neu-l (max 100.0 neu-l))
|
|
(setq segmente
|
|
(gf-replace-nth segmente i
|
|
(list (car seg) (cadr seg) neu-l (nth 3 seg) (nth 4 seg))))))
|
|
(setq i (1+ i)))))
|
|
|
|
;; 4. Gefaellewinkel berechnen (Naeherung)
|
|
(princ (strcat "\n dH=" (rtos deltaH 2 2) " mm"
|
|
" entry-hz=" (rtos entry-hz 2 1) " Grad"
|
|
" exit-hz=" (rtos exit-hz 2 1) " Grad"))
|
|
(setq grade (gf-winkel-berechnen segmente deltaH 1))
|
|
|
|
;; 5. Winkelkorrektur: tatsaechliche AS/ES-Absenkung messen
|
|
(if (and *gf-L-ohne-as-es* (> *gf-L-ohne-as-es* 0.1))
|
|
(progn
|
|
(setq rad-v-korr (* grade (/ pi 180.0)))
|
|
(setq ein-hz-as-k
|
|
(if (= as-seite "rechts") (+ entry-hz 90.0) (- entry-hz 90.0)))
|
|
(setq rad-h-as-k (* (float ein-hz-as-k) (/ pi 180.0)))
|
|
(setq xu-as-meas
|
|
(list (* (cos rad-h-as-k)(cos rad-v-korr))
|
|
(* (sin rad-h-as-k)(cos rad-v-korr))
|
|
(- (sin rad-v-korr))))
|
|
(setq rad-h-es-k (* (float exit-hz) (/ pi 180.0)))
|
|
(setq xu-es-meas
|
|
(list (* (cos rad-h-es-k)(cos rad-v-korr))
|
|
(* (sin rad-h-es-k)(cos rad-v-korr))
|
|
(- (sin rad-v-korr))))
|
|
(setq dz-as-ist (gf-messe-dz-block as-block xu-as-meas))
|
|
(setq dz-es-ist (gf-messe-dz-block es-block xu-es-meas))
|
|
(princ (strcat "\n AS-dz=" (rtos dz-as-ist 2 2)
|
|
" ES-dz=" (rtos dz-es-ist 2 2) " mm"))
|
|
(setq dH-korr
|
|
(- (float deltaH) dz-as-ist dz-es-ist (float *gf-sum-dz-bogen*)))
|
|
(if (and (> dH-korr 0.0) (< (/ dH-korr *gf-L-ohne-as-es*) 1.0))
|
|
(progn
|
|
(setq grade-korr
|
|
(* (asin (/ dH-korr *gf-L-ohne-as-es*)) (/ 180.0 pi)))
|
|
(princ (strcat "\n>>> Korrigierter Winkel: "
|
|
(rtos grade-korr 2 3) " Grad"))
|
|
(setq grade grade-korr))
|
|
(princ "\n WARNUNG: Korrektur ausserhalb Bereich"))))
|
|
|
|
;; 6. Horizontaldistanz Start->Ende fuer DELTA_L-Attribut
|
|
(setq delta-l-gf
|
|
(sqrt (+ (expt (- (car endpunkt-ref) (car startpunkt)) 2)
|
|
(expt (- (cadr endpunkt-ref) (cadr startpunkt)) 2))))
|
|
|
|
;; 7. GF-Nummer und Entity-Grenze vor erster Einfuegung
|
|
(setq gf-nummer (gf-next-number))
|
|
(setq last-ent (vf-lastent-ohne-attribute))
|
|
|
|
;; 8. AUS-Element einfuegen
|
|
;; KS_EIN-Richtung so, dass KS_AUS in entry-hz zeigt:
|
|
;; links: KS_EIN = entry-hz - 90 Grad
|
|
;; rechts: KS_EIN = entry-hz + 90 Grad
|
|
(setq ein-hz-as
|
|
(if (= as-seite "rechts") (+ entry-hz 90.0) (- entry-hz 90.0)))
|
|
(setq rad-h-as (* (float ein-hz-as) (/ pi 180.0)))
|
|
(setq rad-v-as (* (float grade) (/ pi 180.0)))
|
|
(setq xu-entry
|
|
(list (* (cos rad-h-as)(cos rad-v-as))
|
|
(* (sin rad-h-as)(cos rad-v-as))
|
|
(- (sin rad-v-as))))
|
|
(princ (strcat "\n>>> AUS: " as-block
|
|
" KS_EIN-hz=" (rtos ein-hz-as 2 1) " Grad"))
|
|
;; Block-Ursprung (nicht KS_EIN) in X/Y auf startpunkt, damit die Mittelachse
|
|
;; durch startpunkt verlaeuft; Z-Hoehe weiterhin an KS_EIN gemessen
|
|
;; (siehe gf-linienzug-modus).
|
|
(setq aktuell-frame
|
|
(insert-block-mixed-to-ks as-block (make-frame-from-dir startpunkt xu-entry)
|
|
(caddr startpunkt) nil "KS_EIN"))
|
|
(setq nach-aus-pt (car aktuell-frame))
|
|
|
|
;; 9. Linienzug (Staustrecken + Gefaellebogen) einfuegen
|
|
(setq aktuell-frame (gf-linienzug-einfuegen segmente grade aktuell-frame))
|
|
|
|
;; 10. Separator vor EIN-Element
|
|
(setq sep-endpunkt
|
|
(gf-insert-hz-with-ks
|
|
"Staustrecke_Separator_SP_300_mm"
|
|
(car aktuell-frame) exit-hz grade 300 0))
|
|
(setq rad-h-es (* (float exit-hz) (/ pi 180.0)))
|
|
(setq rad-v-es (* (float grade) (/ pi 180.0)))
|
|
(setq xu-exit
|
|
(list (* (cos rad-h-es)(cos rad-v-es))
|
|
(* (sin rad-h-es)(cos rad-v-es))
|
|
(- (sin rad-v-es))))
|
|
(setq sep-frame (make-frame-from-dir sep-endpunkt xu-exit))
|
|
|
|
;; 11. EIN-Element einfuegen
|
|
;; KS_EIN bleibt in X/Y auf sep-frame (Ketten-Pfad); Z-Hoehe wird an
|
|
;; KS_AUS gemessen, damit KS_AUS.Z exakt auf endpunkt-ref.Z landet.
|
|
(princ (strcat "\n>>> ES: " es-block
|
|
" Ziel-Z=" (rtos (caddr endpunkt-ref) 2 1)))
|
|
(setq es-aus-frame
|
|
(insert-block-mixed-to-ks es-block sep-frame
|
|
(caddr endpunkt-ref) "KS_EIN" "KS_AUS"))
|
|
(princ (strcat "\n Z-Hoehe KS_AUS: " (rtos (caddr (car es-aus-frame)) 2 1) " mm"))
|
|
|
|
;; 12. L_GF_m-String: Segmentlaengen in Metern (kommagetrennt)
|
|
(setq laengen-liste '() first-l t)
|
|
(foreach seg segmente
|
|
(if (= (car seg) "Linie")
|
|
(setq laengen-liste
|
|
(append laengen-liste
|
|
(list (rtos (/ (caddr seg) 1000.0) 2 3))))))
|
|
(setq L-gf-str "")
|
|
(foreach l-item laengen-liste
|
|
(if first-l
|
|
(progn (setq L-gf-str l-item) (setq first-l nil))
|
|
(setq L-gf-str (strcat L-gf-str "," l-item))))
|
|
|
|
;; 13. Bogen-Typen zaehlen
|
|
(setq bL90 0 bL60 0 bL30 0 bR90 0 bR60 0 bR30 0)
|
|
(foreach seg segmente
|
|
(if (= (car seg) "Bogen")
|
|
(cond
|
|
((and (= (nth 4 seg) "links") (= (nth 3 seg) 90)) (setq bL90 (1+ bL90)))
|
|
((and (= (nth 4 seg) "links") (= (nth 3 seg) 60)) (setq bL60 (1+ bL60)))
|
|
((and (= (nth 4 seg) "links") (= (nth 3 seg) 30)) (setq bL30 (1+ bL30)))
|
|
((and (= (nth 4 seg) "rechts") (= (nth 3 seg) 90)) (setq bR90 (1+ bR90)))
|
|
((and (= (nth 4 seg) "rechts") (= (nth 3 seg) 60)) (setq bR60 (1+ bR60)))
|
|
((and (= (nth 4 seg) "rechts") (= (nth 3 seg) 30)) (setq bR30 (1+ bR30))))))
|
|
(setq n-bogen-gf (+ bL90 bL60 bL30 bR90 bR60 bR30))
|
|
|
|
;; 14. GF_N-Block mit Attributen erstellen und Ename zurueckgeben
|
|
(setq gf-ins
|
|
(gf-block-erstellen
|
|
"gruppe" as-seite gf-nummer
|
|
(caddr startpunkt)
|
|
(caddr endpunkt-ref)
|
|
deltaH
|
|
delta-l-gf
|
|
L-gf-str
|
|
grade
|
|
(1+ n-bogen-gf)
|
|
0
|
|
bL90 bL60 bL30
|
|
bR90 bR60 bR30
|
|
startpunkt last-ent nach-aus-pt entry-hz
|
|
(caddr (nth first-idx segmente))
|
|
es-seite))
|
|
gf-ins
|
|
)
|
|
)
|
|
)
|
|
|
|
|
|
;; ============================================================
|
|
;; C:TEST_GEFAELLESTRECKE - Hauptbefehl
|
|
;; ============================================================
|
|
(defun c:TEST_GEFAELLESTRECKE ( /
|
|
results-list tests-out-dir
|
|
test-deltaL test-winkel test-z-start test-rad sep-x test-L_stau
|
|
gf-ins ergebnis attribs h-von h-bis d-h w-str
|
|
m2-start m2-deltaH m2-deltaL
|
|
m3-start m3-end m3-line-vla
|
|
m3b-start m3b-end m3b-e1 m3b-e2 m3b-e3 m3b-objliste
|
|
lbl-layer lbl-h lbl-h2)
|
|
|
|
;; Block-Bibliothek initialisieren (setzt aus-dx, ein-dx, aus-dz, ein-dz usw.)
|
|
(if (not *lib-initialized*)
|
|
(gf-init-bibliothek))
|
|
(if (not *lib-initialized*)
|
|
(progn
|
|
(alert "gf-init-bibliothek fehlgeschlagen! Abbruch.")
|
|
(exit)))
|
|
|
|
(ssg-start "TEST_GEFAELLESTRECKE"
|
|
'(("OSMODE") ("ATTREQ") ("ATTDIA")))
|
|
(setvar "OSMODE" 0)
|
|
(setvar "ATTREQ" 0)
|
|
(setvar "ATTDIA" 0)
|
|
|
|
;; Test-Layer anlegen (gruen)
|
|
(setq lbl-layer "GF_Test")
|
|
(setq lbl-h 400.0) ; Einzeltest-Beschriftung
|
|
(setq lbl-h2 600.0) ; Abschnitts-Ueberschrift
|
|
(if (not (tblsearch "LAYER" lbl-layer))
|
|
(entmake
|
|
(list '(0 . "LAYER") (cons 2 lbl-layer) '(70 . 0) '(62 . 3))))
|
|
|
|
(setq results-list '())
|
|
|
|
;; --- Gemeinsame Testparameter ---
|
|
(setq test-deltaL 10000.0)
|
|
(setq test-winkel 3.0)
|
|
(setq test-z-start 5000.0)
|
|
(setq test-rad (* test-winkel (/ pi 180.0)))
|
|
;; L_stau = (deltaL - aus-dx - ein-dx - sep_x) / cos(v)
|
|
;; sep_x = horizontale Projektion des Separators (300 * cos(v))
|
|
(setq sep-x (* 300.0 (cos test-rad)))
|
|
(setq test-L_stau
|
|
(/ (- test-deltaL (float aus-dx) (float ein-dx) sep-x) (cos test-rad)))
|
|
|
|
(princ "\n")
|
|
(princ "\n================================================================")
|
|
(princ "\n TEST_GEFAELLESTRECKE - Integrationstest alle Modi")
|
|
(princ "\n================================================================")
|
|
(princ (strcat "\n deltaL=" (rtos test-deltaL 2 0) " mm"
|
|
" Winkel=" (rtos test-winkel 2 1) " Grad"
|
|
" Z_Start=" (rtos test-z-start 2 0) " mm"))
|
|
(princ (strcat "\n aus-dx=" (rtos (float aus-dx) 2 1) " mm"
|
|
" ein-dx=" (rtos (float ein-dx) 2 1) " mm"
|
|
" L_stau=" (rtos test-L_stau 2 1) " mm"))
|
|
(princ "\n================================================================")
|
|
|
|
;; ============================================================
|
|
;; MODUS 1 - 4 Richtungen
|
|
;; Layout:
|
|
;; hz= 0 (Ost) Start ( 0, 0, 5000), Kette nach +X
|
|
;; hz= 90 (Nord) Start (15000, 0, 5000), Kette nach +Y
|
|
;; hz=180 (West) Start ( 0, -15000, 5000), Kette nach -X
|
|
;; hz=270 (Sued) Start (15000,-15000, 5000), Kette nach -Y
|
|
;; ============================================================
|
|
(princ "\n\n================================================================")
|
|
(princ "\n MODUS 1 - 4 Richtungen")
|
|
(princ "\n================================================================")
|
|
|
|
;; Abschnitts-Ueberschrift in Zeichnung
|
|
(entmake (list '(0 . "TEXT")
|
|
(cons 10 (list -2000 2500.0 test-z-start))
|
|
(cons 11 (list -2000 2500.0 test-z-start))
|
|
(cons 40 lbl-h2)
|
|
(cons 1 (strcat "MODUS 1 - 4 Richtungen | " delta-sym "L=10000mm | W=3" grad-zeichen))
|
|
'(7 . "Standard") (cons 8 lbl-layer) '(72 . 0) '(73 . 2)))
|
|
|
|
;; --- M1: hz=0 Grad (Ost), Start (0, 0, 5000) ---
|
|
(princ "\n\n M1_hz000: hz=0, Start=(0,0,5000) ...")
|
|
(entmake (list '(0 . "TEXT")
|
|
(cons 10 (list 0 1200.0 test-z-start))
|
|
(cons 11 (list 0 1200.0 test-z-start))
|
|
(cons 40 lbl-h)
|
|
(cons 1 (strcat "M1 | hz=0" grad-zeichen " (Ost) | " delta-sym "L=10000 | W=3" grad-zeichen))
|
|
'(7 . "Standard") (cons 8 lbl-layer) '(72 . 1) '(73 . 2)))
|
|
(setq gf-ins
|
|
(car (gefaellestrecke-einfuegen
|
|
test-L_stau test-winkel (list 0 0 test-z-start)
|
|
"links" "links" 0.0 test-deltaL)))
|
|
(if gf-ins
|
|
(progn
|
|
(setq attribs (ssg-attrib-read gf-ins))
|
|
(setq h-von (atoi (cdr (assoc "HOEHE_VON_mm" attribs))))
|
|
(setq h-bis (atoi (cdr (assoc "HOEHE_BIS_mm" attribs))))
|
|
(setq d-h (abs (- h-von h-bis)))
|
|
(setq w-str (cdr (assoc "GF_WINKEL" attribs)))
|
|
(princ (strcat " von=" (itoa h-von) " bis=" (itoa h-bis)
|
|
" dH=" (itoa d-h) " mm W=" w-str " OK"))
|
|
(setq results-list
|
|
(cons (gefaellestrecke:test-json "M1_hz000" 1 0.0 test-deltaL
|
|
(atof w-str) h-von h-bis d-h "GEBAUT")
|
|
results-list)))
|
|
(progn
|
|
(princ " FEHLER")
|
|
(setq results-list
|
|
(cons (gefaellestrecke:test-json "M1_hz000" 1 0.0 test-deltaL
|
|
0.0 0 0 0 "FEHLER")
|
|
results-list))))
|
|
|
|
;; --- M1: hz=90 Grad (Nord), Start (15000, 0, 5000) ---
|
|
(princ "\n\n M1_hz090: hz=90, Start=(15000,0,5000) ...")
|
|
(entmake (list '(0 . "TEXT")
|
|
(cons 10 (list 15000 1200.0 test-z-start))
|
|
(cons 11 (list 15000 1200.0 test-z-start))
|
|
(cons 40 lbl-h)
|
|
(cons 1 (strcat "M1 | hz=90" grad-zeichen " (Nord) | " delta-sym "L=10000 | W=3" grad-zeichen))
|
|
'(7 . "Standard") (cons 8 lbl-layer) '(72 . 1) '(73 . 2)))
|
|
(setq gf-ins
|
|
(car (gefaellestrecke-einfuegen
|
|
test-L_stau test-winkel (list 15000 0 test-z-start)
|
|
"links" "links" 90.0 test-deltaL)))
|
|
(if gf-ins
|
|
(progn
|
|
(setq attribs (ssg-attrib-read gf-ins))
|
|
(setq h-von (atoi (cdr (assoc "HOEHE_VON_mm" attribs))))
|
|
(setq h-bis (atoi (cdr (assoc "HOEHE_BIS_mm" attribs))))
|
|
(setq d-h (abs (- h-von h-bis)))
|
|
(setq w-str (cdr (assoc "GF_WINKEL" attribs)))
|
|
(princ (strcat " von=" (itoa h-von) " bis=" (itoa h-bis)
|
|
" dH=" (itoa d-h) " mm W=" w-str " OK"))
|
|
(setq results-list
|
|
(cons (gefaellestrecke:test-json "M1_hz090" 1 90.0 test-deltaL
|
|
(atof w-str) h-von h-bis d-h "GEBAUT")
|
|
results-list)))
|
|
(progn
|
|
(princ " FEHLER")
|
|
(setq results-list
|
|
(cons (gefaellestrecke:test-json "M1_hz090" 1 90.0 test-deltaL
|
|
0.0 0 0 0 "FEHLER")
|
|
results-list))))
|
|
|
|
;; --- M1: hz=180 Grad (West), Start (0, -15000, 5000) ---
|
|
(princ "\n\n M1_hz180: hz=180, Start=(0,-15000,5000) ...")
|
|
(entmake (list '(0 . "TEXT")
|
|
(cons 10 (list 0 -13800.0 test-z-start))
|
|
(cons 11 (list 0 -13800.0 test-z-start))
|
|
(cons 40 lbl-h)
|
|
(cons 1 (strcat "M1 | hz=180" grad-zeichen " (West) | " delta-sym "L=10000 | W=3" grad-zeichen))
|
|
'(7 . "Standard") (cons 8 lbl-layer) '(72 . 1) '(73 . 2)))
|
|
(setq gf-ins
|
|
(car (gefaellestrecke-einfuegen
|
|
test-L_stau test-winkel (list 0 -15000 test-z-start)
|
|
"links" "links" 180.0 test-deltaL)))
|
|
(if gf-ins
|
|
(progn
|
|
(setq attribs (ssg-attrib-read gf-ins))
|
|
(setq h-von (atoi (cdr (assoc "HOEHE_VON_mm" attribs))))
|
|
(setq h-bis (atoi (cdr (assoc "HOEHE_BIS_mm" attribs))))
|
|
(setq d-h (abs (- h-von h-bis)))
|
|
(setq w-str (cdr (assoc "GF_WINKEL" attribs)))
|
|
(princ (strcat " von=" (itoa h-von) " bis=" (itoa h-bis)
|
|
" dH=" (itoa d-h) " mm W=" w-str " OK"))
|
|
(setq results-list
|
|
(cons (gefaellestrecke:test-json "M1_hz180" 1 180.0 test-deltaL
|
|
(atof w-str) h-von h-bis d-h "GEBAUT")
|
|
results-list)))
|
|
(progn
|
|
(princ " FEHLER")
|
|
(setq results-list
|
|
(cons (gefaellestrecke:test-json "M1_hz180" 1 180.0 test-deltaL
|
|
0.0 0 0 0 "FEHLER")
|
|
results-list))))
|
|
|
|
;; --- M1: hz=270 Grad (Sued), Start (15000, -15000, 5000) ---
|
|
(princ "\n\n M1_hz270: hz=270, Start=(15000,-15000,5000) ...")
|
|
(entmake (list '(0 . "TEXT")
|
|
(cons 10 (list 15000 -13800.0 test-z-start))
|
|
(cons 11 (list 15000 -13800.0 test-z-start))
|
|
(cons 40 lbl-h)
|
|
(cons 1 (strcat "M1 | hz=270" grad-zeichen " (Sued) | " delta-sym "L=10000 | W=3" grad-zeichen))
|
|
'(7 . "Standard") (cons 8 lbl-layer) '(72 . 1) '(73 . 2)))
|
|
(setq gf-ins
|
|
(car (gefaellestrecke-einfuegen
|
|
test-L_stau test-winkel (list 15000 -15000 test-z-start)
|
|
"links" "links" 270.0 test-deltaL)))
|
|
(if gf-ins
|
|
(progn
|
|
(setq attribs (ssg-attrib-read gf-ins))
|
|
(setq h-von (atoi (cdr (assoc "HOEHE_VON_mm" attribs))))
|
|
(setq h-bis (atoi (cdr (assoc "HOEHE_BIS_mm" attribs))))
|
|
(setq d-h (abs (- h-von h-bis)))
|
|
(setq w-str (cdr (assoc "GF_WINKEL" attribs)))
|
|
(princ (strcat " von=" (itoa h-von) " bis=" (itoa h-bis)
|
|
" dH=" (itoa d-h) " mm W=" w-str " OK"))
|
|
(setq results-list
|
|
(cons (gefaellestrecke:test-json "M1_hz270" 1 270.0 test-deltaL
|
|
(atof w-str) h-von h-bis d-h "GEBAUT")
|
|
results-list)))
|
|
(progn
|
|
(princ " FEHLER")
|
|
(setq results-list
|
|
(cons (gefaellestrecke:test-json "M1_hz270" 1 270.0 test-deltaL
|
|
0.0 0 0 0 "FEHLER")
|
|
results-list))))
|
|
|
|
;; ============================================================
|
|
;; MODUS 2 - Linie entlang X-Achse
|
|
;; Linie von (0,-35000,0) nach (10000,-35000,0)
|
|
;; Startpunkt Gefaellestrecke: (0,-35000,5000), hz=0 Grad
|
|
;; ============================================================
|
|
(princ "\n\n================================================================")
|
|
(princ "\n MODUS 2 - Linie entlang X-Achse (hz=0)")
|
|
(princ "\n================================================================")
|
|
|
|
;; Abschnitts-Ueberschrift und Richtungslinie in Zeichnung
|
|
(entmake (list '(0 . "TEXT")
|
|
(cons 10 (list -2000 -32500.0 test-z-start))
|
|
(cons 11 (list -2000 -32500.0 test-z-start))
|
|
(cons 40 lbl-h2)
|
|
(cons 1 (strcat "MODUS 2 - Linie X-Achse | hz=0 | W=3" grad-zeichen))
|
|
'(7 . "Standard") (cons 8 lbl-layer) '(72 . 0) '(73 . 2)))
|
|
(entmake (list '(0 . "LINE")
|
|
'(10 0 -35000 0) '(11 10000 -35000 0) (cons 8 lbl-layer)))
|
|
(entmake (list '(0 . "TEXT")
|
|
(cons 10 (list 5000 -33800.0 test-z-start))
|
|
(cons 11 (list 5000 -33800.0 test-z-start))
|
|
(cons 40 lbl-h)
|
|
(cons 1 (strcat "M2 | hz=0" grad-zeichen " | Linie X-Achse | W=3" grad-zeichen))
|
|
'(7 . "Standard") (cons 8 lbl-layer) '(72 . 1) '(73 . 2)))
|
|
|
|
(setq m2-start (list 0 -35000 test-z-start))
|
|
(princ (strcat "\n\n M2_hz000: Start=(0,-35000," (rtos test-z-start 2 0) ") ..."))
|
|
(setq ergebnis
|
|
(gefaellestrecke-einfuegen
|
|
test-L_stau test-winkel m2-start "links" "links" 0.0 test-deltaL))
|
|
(setq gf-ins (car ergebnis))
|
|
(if gf-ins
|
|
(progn
|
|
(setq attribs (ssg-attrib-read gf-ins))
|
|
(setq h-von (atoi (cdr (assoc "HOEHE_VON_mm" attribs))))
|
|
(setq h-bis (atoi (cdr (assoc "HOEHE_BIS_mm" attribs))))
|
|
;; Volle Fliesskomma-Genauigkeit direkt aus der Rueckgabe verwenden
|
|
;; (nicht aus den auf ganze mm gerundeten HOEHE_VON/HOEHE_BIS-Attributen),
|
|
;; damit Modus 3 exakt mit diesen Werten weiterrechnen kann.
|
|
(setq m2-deltaH (cadr ergebnis))
|
|
(setq m2-deltaL (caddr ergebnis))
|
|
(setq w-str (cdr (assoc "GF_WINKEL" attribs)))
|
|
(princ (strcat " von=" (itoa h-von) " bis=" (itoa h-bis)
|
|
" " delta-sym "H=" (rtos m2-deltaH 2 3)
|
|
" mm " delta-sym "L=" (rtos m2-deltaL 2 3)
|
|
" mm W=" w-str " OK"))
|
|
(setq results-list
|
|
(cons (gefaellestrecke:test-json "M2_hz000" 2 0.0 test-deltaL
|
|
(atof w-str) h-von h-bis m2-deltaH "GEBAUT")
|
|
results-list)))
|
|
(progn
|
|
;; Fallback: sin(3deg) * 10000 ≈ 523mm
|
|
(setq m2-deltaH 523.0)
|
|
(setq m2-deltaL test-deltaL)
|
|
(princ (strcat " FEHLER (Fallback " delta-sym "H=" (rtos m2-deltaH 2 3) ")"))
|
|
(setq results-list
|
|
(cons (gefaellestrecke:test-json "M2_hz000" 2 0.0 test-deltaL
|
|
0.0 0 0 0 "FEHLER")
|
|
results-list))))
|
|
|
|
;; ============================================================
|
|
;; MODUS 3 - 3D-Linie entlang Y-Achse (Sued) mit Delta aus M2
|
|
;; Z-Startpunkt, Z-Endpunkt und die horizontale Distanz werden 1:1 aus
|
|
;; dem M2-Ergebnis uebernommen (volle Fliesskomma-Genauigkeit, kein
|
|
;; Runden auf ganze mm) - nur die Fahrtrichtung ist bewusst anders
|
|
;; (Sued statt Ost), um die Richtungsunabhaengigkeit zu pruefen.
|
|
;; 3D-Linie: (0,-50000,Z_start) -> (0, -50000-m2-deltaL, Z_start-m2-deltaH)
|
|
;; Startpunkt: (0,-50000,Z_start) = hoehere Seite
|
|
;; ============================================================
|
|
(princ "\n\n================================================================")
|
|
(princ (strcat "\n MODUS 3 - 3D-Linie Y-Achse Sued, " delta-sym "H="
|
|
(rtos m2-deltaH 2 3) " mm " delta-sym "L=" (rtos m2-deltaL 2 3)
|
|
" mm (aus M2)"))
|
|
(princ "\n================================================================")
|
|
|
|
(setq m3-start (list 0.0 -50000.0 test-z-start))
|
|
(setq m3-end (list 0.0 (- -50000.0 m2-deltaL) (- test-z-start m2-deltaH)))
|
|
|
|
;; Abschnitts-Ueberschrift und 3D-Linie in Zeichnung
|
|
(entmake (list '(0 . "TEXT")
|
|
(cons 10 (list -2000 -47500.0 test-z-start))
|
|
(cons 11 (list -2000 -47500.0 test-z-start))
|
|
(cons 40 lbl-h2)
|
|
(cons 1 (strcat "MODUS 3 - 3D-Linie Y-Achse Sued | " delta-sym "H="
|
|
(rtos m2-deltaH 2 3) "mm aus M2"))
|
|
'(7 . "Standard") (cons 8 lbl-layer) '(72 . 0) '(73 . 2)))
|
|
(entmake (list '(0 . "TEXT")
|
|
(cons 10 (list 0 -48800.0 test-z-start))
|
|
(cons 11 (list 0 -48800.0 test-z-start))
|
|
(cons 40 lbl-h)
|
|
(cons 1 (strcat "M3 | 3D-Linie Sued | " delta-sym "H=" (rtos m2-deltaH 2 3) "mm"))
|
|
'(7 . "Standard") (cons 8 lbl-layer) '(72 . 1) '(73 . 2)))
|
|
|
|
(princ (strcat "\n\n 3D-Linie: (" (rtos (car m3-start) 2 3) ","
|
|
(rtos (cadr m3-start) 2 3) ","
|
|
(rtos (caddr m3-start) 2 3) ")"
|
|
" -> (" (rtos (car m3-end) 2 3) ","
|
|
(rtos (cadr m3-end) 2 3) ","
|
|
(rtos (caddr m3-end) 2 3) ")"))
|
|
|
|
(if (entmake
|
|
(list '(0 . "LINE")
|
|
(cons 10 m3-start)
|
|
(cons 11 m3-end)
|
|
(cons 8 lbl-layer)))
|
|
(progn
|
|
;; VLA-Objekt aus letztem entlast holen
|
|
(setq m3-line-vla (vlax-ename->vla-object (entlast)))
|
|
(setq gf-ins
|
|
(gefaellestrecke:modus3-einfuegen
|
|
(list m3-line-vla) m3-start m3-end "links" "links"))
|
|
(if gf-ins
|
|
(progn
|
|
(setq attribs (ssg-attrib-read gf-ins))
|
|
(setq h-von (atoi (cdr (assoc "HOEHE_VON_mm" attribs))))
|
|
(setq h-bis (atoi (cdr (assoc "HOEHE_BIS_mm" attribs))))
|
|
(setq d-h (abs (- h-von h-bis)))
|
|
(setq w-str (cdr (assoc "GF_WINKEL" attribs)))
|
|
(princ (strcat "\n -> von=" (itoa h-von) " bis=" (itoa h-bis)
|
|
" " delta-sym "H=" (itoa d-h) " mm"
|
|
" " delta-sym "H-Soll=" (rtos m2-deltaH 2 3) " mm"
|
|
" Abw=" (rtos (abs (- d-h m2-deltaH)) 2 3) " mm"
|
|
" W=" w-str " OK"))
|
|
(setq results-list
|
|
(cons (gefaellestrecke:test-json "M3_hz270" 3 270.0 test-deltaL
|
|
(atof w-str) h-von h-bis d-h "GEBAUT")
|
|
results-list)))
|
|
(progn
|
|
(princ "\n -> FEHLER (modus3-einfuegen)")
|
|
(setq results-list
|
|
(cons (gefaellestrecke:test-json "M3_hz270" 3 270.0 test-deltaL
|
|
0.0 0 0 0 "FEHLER")
|
|
results-list)))))
|
|
;; 3D-Linie konnte nicht erzeugt werden
|
|
(progn
|
|
(princ "\n FEHLER: 3D-Linie nicht erzeugbar!")
|
|
(setq results-list
|
|
(cons (gefaellestrecke:test-json "M3_hz270" 3 270.0 test-deltaL
|
|
0.0 0 0 0 "FEHLER_LINIE")
|
|
results-list))))
|
|
|
|
;; ============================================================
|
|
;; MODUS 3 - Linienzug MIT Bogen (Linie + 90-Grad-Bogen R500 + Linie)
|
|
;; Start Hoehe 2000, waagerecht +X 8000 mm (links->rechts), dann
|
|
;; 90-Grad-Bogen R500 (Auslauf Richtung +Y), dann +Y 6000 mm,
|
|
;; Endpunkt Hoehe 1800 (dH = 200 mm ueber den ganzen Weg).
|
|
;; ============================================================
|
|
(princ "\n\n================================================================")
|
|
(princ "\n MODUS 3 - Linienzug mit Bogen (8000 +X / 90 Grad R500 / 6000 +Y)")
|
|
(princ "\n================================================================")
|
|
(setq m3b-start (list 30000.0 -50000.0 2000.0)) ; Kettenanfang, Hoehe 2000
|
|
(setq m3b-end (list 38500.0 -43500.0 1800.0)) ; Kettenende, Hoehe 1800
|
|
|
|
;; Abschnitts-Ueberschrift in der Zeichnung
|
|
(entmake (list '(0 . "TEXT")
|
|
(cons 10 (list 30000 -52000.0 2000.0))
|
|
(cons 11 (list 30000 -52000.0 2000.0))
|
|
(cons 40 lbl-h2)
|
|
(cons 1 "MODUS 3 - Linienzug mit 90 Grad-Bogen R500")
|
|
'(7 . "Standard") (cons 8 lbl-layer) '(72 . 0) '(73 . 2)))
|
|
|
|
;; Geometrie: LINE (+X 8000) + ARC (90 Grad R500, links) + LINE (+Y 6000).
|
|
;; ARC: Mittelpunkt (38000,-49500), Start 270 Grad -> Ende 360 Grad = 90 Grad
|
|
;; gegen den Uhrzeigersinn (Linkskurve, +X -> +Y).
|
|
(entmake (list '(0 . "LINE")
|
|
(cons 10 (list 30000.0 -50000.0 2000.0))
|
|
(cons 11 (list 38000.0 -50000.0 2000.0)) (cons 8 lbl-layer)))
|
|
(setq m3b-e1 (entlast))
|
|
(entmake (list '(0 . "ARC")
|
|
(cons 10 (list 38000.0 -49500.0 2000.0))
|
|
(cons 40 500.0)
|
|
(cons 50 (* 1.5 pi))
|
|
(cons 51 (* 2.0 pi)) (cons 8 lbl-layer)))
|
|
(setq m3b-e2 (entlast))
|
|
(entmake (list '(0 . "LINE")
|
|
(cons 10 (list 38500.0 -49500.0 2000.0))
|
|
(cons 11 (list 38500.0 -43500.0 2000.0)) (cons 8 lbl-layer)))
|
|
(setq m3b-e3 (entlast))
|
|
(setq m3b-objliste (list (vlax-ename->vla-object m3b-e1)
|
|
(vlax-ename->vla-object m3b-e2)
|
|
(vlax-ename->vla-object m3b-e3)))
|
|
(setq gf-ins
|
|
(gefaellestrecke:modus3-einfuegen m3b-objliste m3b-start m3b-end "links" "links"))
|
|
(if gf-ins
|
|
(progn
|
|
(setq attribs (ssg-attrib-read gf-ins))
|
|
(setq h-von (atoi (cdr (assoc "HOEHE_VON_mm" attribs))))
|
|
(setq h-bis (atoi (cdr (assoc "HOEHE_BIS_mm" attribs))))
|
|
(setq d-h (abs (- h-von h-bis)))
|
|
(setq w-str (cdr (assoc "GF_WINKEL" attribs)))
|
|
(princ (strcat "\n -> von=" (itoa h-von) " bis=" (itoa h-bis)
|
|
" " delta-sym "H=" (itoa d-h) " mm"
|
|
" " delta-sym "H-Soll=200 mm W=" w-str " OK"))
|
|
(setq results-list
|
|
(cons (gefaellestrecke:test-json "M3_Bogen" 3 0.0 14785.0
|
|
(atof w-str) h-von h-bis d-h "GEBAUT")
|
|
results-list)))
|
|
(progn
|
|
(princ "\n -> FEHLER (modus3-einfuegen mit Bogen)")
|
|
(setq results-list
|
|
(cons (gefaellestrecke:test-json "M3_Bogen" 3 0.0 14785.0
|
|
0.0 0 0 0 "FEHLER")
|
|
results-list))))
|
|
|
|
;; ============================================================
|
|
;; Zusammenfassung und Export
|
|
;; ============================================================
|
|
(princ "\n\n================================================================")
|
|
(princ (strcat "\n " (itoa (length results-list)) " Tests durchgefuehrt"))
|
|
(princ "\n================================================================")
|
|
|
|
;; Ergebnisse in globaler Variable speichern (fuer SSG_RUN_ALL_TESTS)
|
|
(setq *gefaellestrecke-test-results* (reverse results-list))
|
|
|
|
;; Direkt exportieren
|
|
(setq tests-out-dir
|
|
(strcat (getenv "DXFMAKRO") "/tests/output"))
|
|
(vl-mkdir tests-out-dir)
|
|
(gefaellestrecke:export-results tests-out-dir)
|
|
|
|
(ssg-end)
|
|
(princ "\n================================================================")
|
|
(princ "\n TEST_GEFAELLESTRECKE abgeschlossen.")
|
|
(princ "\n================================================================")
|
|
(princ)
|
|
)
|