Robuste Blockeinfuegung: kaputte Bloecke bei Testlaeufen verhindern

Der Redefine-Flush in ssg-ils-block-laden-dim brach nach genau zwei
(command)-Aufrufen ab; blieb ein Befehl trotzdem aktiv (z.B. bei
abweichenden INSUNITS), verschluckte der naechste (command ...)-Aufruf
des Aufrufers dessen Argumente als Antwort auf den offenen Prompt -
Ursache eines real beobachteten kaputten SC_Entladung-Blocks (keine
Attribute) beim letzten Element eines HundM05-Testlaufs. Flush jetzt als
bounded loop mit Warnung statt fixer 2 Versuche.

hundm05:bau-sensor vertraut nach dem INSERT nicht mehr blind (entlast):
eine ungueltige/keine neue Blockreferenz wird erkannt, evtl. Rest-
geometrie geloescht und der Ergebnis-Record als "abbruch" markiert;
fehlt das ID-Attribut, gibt es "warnung" statt stillschweigend weiter-
zumachen. Testlaeufe hinterlassen damit keine unbemerkt kaputten
Bloecke mehr.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Samer Ayadi
2026-09-17 12:03:39 +02:00
co-authored by Claude Sonnet 5
parent ab2816e9ee
commit d0d112e740
2 changed files with 58 additions and 12 deletions
+41 -9
View File
@@ -135,7 +135,7 @@
;; jeder ueber ssg-ils-block-laden aufloesbare Blockname funktioniert. "sensor"
;; bleibt als Sammelbegriff fuer den "kind"-Wert (= "kein Kreisel"), auch wenn
;; inzwischen nicht mehr nur Separator/Scanner darueberlaufen.
(defun hundm05:bau-sensor (obj / id blockname x y z rotation pt eff n ent ed rec)
(defun hundm05:bau-sensor (obj / id blockname x y z rotation pt eff n vorher ent ed attribs rec)
(setq id (ssg-val obj "id"))
(setq blockname (ssg-val obj "block"))
(setq x (ssg-val obj "x")
@@ -172,6 +172,7 @@
(princ (strcat "\n [SENSOR] " id " '" blockname "' -> ("
(rtos x 2 0) ", " (rtos y 2 0) ", " (rtos z 2 0)
") R=" (rtos rotation 2 1)))
(setq vorher (entlast))
(command "_.INSERT" eff pt "" "" rotation)
;; Verbleibende Prompts mit Enter abfangen, aber GEZAEHLT - siehe
;; mubea:build-separator-one (ein Prompt, der Leer-Antworten
@@ -186,14 +187,45 @@
(princ (strcat "\n WARNUNG: INSERT von '" eff
"' nicht sauber beendet - abgebrochen."))))
(setq ent (entlast))
(if (atoms-family 1 '("ssg-id-generate")) (ssg-id-generate ent))
(setq ed (entget ent))
(princ (strcat " -> Block " (cdr (assoc 2 ed))))
(setq rec (vsp-set rec "block_name" (cdr (assoc 2 ed))))
(setq rec (vsp-set rec "block_handle" (cdr (assoc 5 ed))))
(setq rec (vsp-set rec "insert_point" (cdr (assoc 10 ed))))
(setq rec (vsp-set rec "attribs" (ssg-attrib-read ent)))
(vsp-set rec "status" "executed"))))))
;; Nicht blind (entlast) vertrauen: eine verschluckte Rueckfrage beim
;; Laden ODER Platzieren (siehe ssg-ils-block-laden-dim) kann eine
;; unvollstaendige/falsche Blockreferenz ohne jedes Attribut hinterlassen
;; (realer Fall: HundM05, letztes Zusatzobjekt = SC_Entladung, erste
;; Verwendung dieses Blocknamens im Testlauf). Nur eine ECHT NEUE
;; INSERT-Referenz gilt als Erfolg; alles andere wird als Fehler
;; gemeldet und die kaputte Restgeometrie sofort entfernt statt sie
;; unbemerkt in der Zeichnung zu belassen.
(cond
((or (null ent) (eq ent vorher)
(/= (cdr (assoc 0 (entget ent))) "INSERT"))
(princ (strcat "\n [SENSOR] " id " '" blockname
"' - FEHLER: INSERT hat keine gueltige neue Blockreferenz"
" erzeugt (verschluckte Rueckfrage?)."))
(if (and ent (not (eq ent vorher))) (entdel ent))
(setq rec (vsp-set (vsp-set rec "status" "abbruch") "fehler_text"
"INSERT lieferte keine gueltige neue Blockreferenz")))
(T
(setq attribs (ssg-attrib-read ent))
(setq ed (entget ent))
(princ (strcat " -> Block " (cdr (assoc 2 ed))))
(setq rec (vsp-set rec "block_name" (cdr (assoc 2 ed))))
(setq rec (vsp-set rec "block_handle" (cdr (assoc 5 ed))))
(setq rec (vsp-set rec "insert_point" (cdr (assoc 10 ed))))
(setq rec (vsp-set rec "attribs" attribs))
;; ID nur vergeben, wenn der Block ueberhaupt ein ID-Attribut fuehrt
;; (siehe ssg-id-set-and-verify in ssg_id.lsp) - sonst faellt hier
;; dieselbe "unsichtbare" Luecke auf, statt sie in der ID-Vergabe zu
;; verstecken.
(cond
((not (assoc "ID" attribs))
(princ (strcat "\n [SENSOR] " id " '" blockname
"' - WARNUNG: Block hat kein ID-Attribut (ATTDEF"
" fehlt/veraltet, ATTSYNC noetig) - keine ID vergeben."))
(setq rec (vsp-set (vsp-set rec "status" "warnung") "fehler_text"
"Block ohne ID-ATTDEF - ATTSYNC noetig")))
(T
(if (atoms-family 1 '("ssg-id-generate")) (ssg-id-generate ent))
(vsp-set rec "status" "executed"))))))))))
;; Alle Zusatzobjekte der Datei bauen. Eigener ssg-start-Rahmen, weil
;; vsp-bau-datei seinen schon geschlossen hat; ATTREQ/ATTDIA 0 ist Pflicht -