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:
co-authored by
Claude Sonnet 5
parent
ab2816e9ee
commit
d0d112e740
+41
-9
@@ -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 -
|
||||
|
||||
Reference in New Issue
Block a user