Files
dxfmakros/tests/test_lastent.lsp
T
s.hensch ea0e46a441 feat: Omniflo-Fahrstrecke (OMNI_FAHRSTRECKE) + Geruest-Dialoge ueberarbeitet
Fahrstrecke:
- Neuer Befehl OMNI_FAHRSTRECKE (+ _BESCHRIFTEN) im Omniflo-Menue,
  Daten aus data/json/omniflo_fahrstrecke.json, Vorlage dcl/fahrstrecke.dcl
- Nutzt die Linien-Logik des Geruest-Traegers (geruest-linien-starten,
  Dialog/Einfuegen/Beschriftung je Baugruppe parametriert)
- Muffen-Dummy wie beim Traeger, farbig nur wo in der JSON gesetzt
- Stueckliste: eigene Klasse "Omniflo Fahrstrecke" (GR_Fahrstrecke_*)

Geruest-Dialoge:
- DCL als statische Vorlagen mit //@NAME@-Platzhaltern
  (ssg-dcl-vorlage-fuellen in ssg_core), dcl/geruest.dcl neu
- Ein Dialog je Bereich (keine Bereichsumschaltung mehr)
- Varianten als Radiobuttons mit Artikelnummern im Label,
  "disabled": true graut Varianten aus
- Eine Befestigungsspalte (Gesamtanzahl) + Zeile "Sonstiges",
  Art.-Nr. unter jedem Anbauteil
- Winkel Platte (0/90): Anbauteile gedreht eingefuegt
- Kennzeichnung geaenderter Konfiguration, Ueberspeichern per Enter
- Traeger: Querstreben nur bei "mit_querstrebe": true

Konfigurationen im alten Format (oben/unten) werden beim Laden
uebernommen. Unit-Tests ergaenzt (599 gruen).
2026-10-13 11:02:23 +02:00

130 lines
5.4 KiB
Common Lisp

;; ============================================================
;; test_lastent.lsp - Szenario-Test fuer ssg-lastent-ohne-attribute (ssg_core)
;;
;; Stellt den realen Bug nach: ein Block MIT Attributen (z.B. eine per
;; Strg+C/V eingefuegte GR_-Kopie) ist das letzte Objekt der Zeichnung.
;; Ein Makro merkt sich die Startmarke, zeichnet neue Objekte, sammelt
;; "alles ab (entnext marke)" ein und wickelt es per _.-BLOCK zu einem Block.
;; Mit nacktem (entlast) als Marke landeten dabei die ATTRIBs des alten
;; Blocks im Auswahlsatz und wurden entfernt.
;;
;; Aufruf in BricsCAD:
;; (load (strcat (getenv "DXFMAKRO") "/tests/test_lastent.lsp"))
;; TEST_LASTENT
;;
;; Speichert tests/output/lastent_results.json (Konvention test_run_all).
;; ============================================================
(setq *tle-pass* 0 *tle-fail* 0 *tle-fails* '())
;; Ein Assert: erwartet-Wert gleich ist-Wert (equal). Loggt Pass/Fail.
(defun tle-eq (name erwartet ist)
(if (equal erwartet ist)
(progn (setq *tle-pass* (1+ *tle-pass*))
(princ (strcat "\n [PASS] " name)))
(progn (setq *tle-fail* (1+ *tle-fail*))
(setq *tle-fails* (cons name *tle-fails*))
(princ (strcat "\n [FAIL] " name
"\n erwartet: " (vl-princ-to-string erwartet)
"\n ist: " (vl-princ-to-string ist))))))
;; Blockdefinition mit zwei ATTDEFs anlegen (falls noch nicht vorhanden).
(defun tle-blockdef (name)
(if (not (tblsearch "BLOCK" name))
(progn
(entmake (list '(0 . "BLOCK") (cons 2 name) '(70 . 2) '(10 0.0 0.0 0.0)))
(entmake '((0 . "LINE") (8 . "0") (10 0.0 0.0 0.0) (11 100.0 0.0 0.0)))
(foreach tag '("ID" "ARTINR")
(entmake (list '(0 . "ATTDEF") '(8 . "0") '(10 0.0 0.0 0.0)
'(40 . 10.0) '(1 . "") (cons 2 tag) (cons 3 tag)
'(70 . 0))))
(entmake '((0 . "ENDBLK")))))
name)
;; INSERT mit Attributen per entmake (INSERT 66=1, ATTRIBs, SEQEND).
;; Rueckgabe: ename des INSERT.
(defun tle-insert-mit-attributen (name pt werte / ins)
(entmake (list '(0 . "INSERT") (cons 2 name) (cons 10 pt) '(66 . 1)))
(setq ins (entlast))
(foreach paar werte
(entmake (list '(0 . "ATTRIB") '(8 . "0") (cons 10 pt) '(40 . 10.0)
(cons 1 (cdr paar)) (cons 2 (car paar)) '(70 . 0))))
(entmake '((0 . "SEQEND")))
ins)
(defun lastent:tests ( / bname werte ins marke line ss e neu anz)
(setvar "CMDECHO" 0)
(setq bname (tle-blockdef "TLE_ATT_BLOCK"))
(setq werte (list (cons "ID" "4711") (cons "ARTINR" "A1,A2")))
(setq ins (tle-insert-mit-attributen bname '(0.0 0.0 0.0) werte))
;; --- Vorbedingung: Attribute lesbar, INSERT ist (entlast) ---
(tle-eq "vorher: attribute lesbar" werte (ssg-attrib-read ins))
(tle-eq "vorher: entlast = insert" ins (entlast))
;; --- Marke steht auf dem SEQEND des Attribut-Blocks ---
(setq marke (ssg-lastent-ohne-attribute))
(tle-eq "marke ist SEQEND" "SEQEND" (cdr (assoc 0 (entget marke))))
;; --- Neues Objekt zeichnen: entnext der Marke ist genau dieses Objekt ---
(entmake '((0 . "LINE") (8 . "0") (10 0.0 50.0 0.0) (11 100.0 50.0 0.0)))
(setq line (entlast))
(tle-eq "entnext marke = neues objekt" line (entnext marke))
;; --- Einsammeln + _.-BLOCK wie geruest-block-bauen ---
(setq ss (ssadd) anz 0 e (entnext marke))
(while e (ssadd e ss) (setq anz (1+ anz)) (setq e (entnext e)))
(tle-eq "genau 1 objekt eingesammelt" 1 anz)
(setq neu (strcat "TLE_NEU_" (ssg-timestamp)))
(command "_.-BLOCK" neu '(0.0 0.0 0.0) ss "")
;; --- Kern des Bugs: der alte Block behaelt seine Attribute ---
(tle-eq "nachher: attribute erhalten" werte (ssg-attrib-read ins))
(tle-eq "nachher: neuer block existiert" T (if (tblsearch "BLOCK" neu) T nil))
;; --- Leere Zeichnung wird hier nicht getestet (Testzeichnung ist nie leer);
;; ohne Attribute liefert der Helfer (entlast) unveraendert ---
(entmake '((0 . "LINE") (8 . "0") (10 0.0 90.0 0.0) (11 10.0 90.0 0.0)))
(tle-eq "ohne attribute: marke = entlast" (entlast) (ssg-lastent-ohne-attribute))
;; Aufraeumen
(entdel ins)
(entdel (entlast))
(princ))
(defun lastent:export-results (out-dir / f pfad)
(setq pfad (strcat out-dir "/lastent_results.json"))
(setq f (open pfad "w"))
(if f
(progn
(write-line "{" f)
(write-line (strcat " \"pass\": " (itoa *tle-pass*) ",") f)
(write-line (strcat " \"fail\": " (itoa *tle-fail*) ",") f)
(write-line (strcat " \"status\": \""
(if (= *tle-fail* 0) "OK" "FEHLER") "\"") f)
(write-line "}" f)
(close f)
(princ (strcat "\n Ergebnis: " pfad))))
(princ))
(defun c:TEST_LASTENT ( / )
(setq *tle-pass* 0 *tle-fail* 0 *tle-fails* '())
(princ "\n================================================================")
(princ "\n TEST_LASTENT - ssg-lastent-ohne-attribute (ssg_core.lsp)")
(princ "\n================================================================")
(lastent:tests)
(princ "\n\n----------------------------------------------------------------")
(princ (strcat "\n Ergebnis: " (itoa *tle-pass*) " PASS, "
(itoa *tle-fail*) " FAIL"))
(if (> *tle-fail* 0)
(progn
(princ "\n Fehlgeschlagen:")
(foreach n (reverse *tle-fails*) (princ (strcat "\n - " n)))))
(princ "\n================================================================")
(princ))
(princ "\nTEST_LASTENT geladen. Aufruf: TEST_LASTENT")
(princ)