fix: KF_EDIT loeste den Block auf - Blocknummer jetzt ueber die Blocktabelle
KF_EDIT loescht beim Neuaufbau den alten Foerderer. kf-naechste-nummer zaehlte
nur die Referenzen im Modell und vergab dadurch dieselbe Nummer erneut, obwohl
die Block-Definition KF_<n> weiter in der Blocktabelle steht. _.-BLOCK traf auf
den vorhandenen Namen, die "Neu definieren?"-Abfrage verschluckte die
Folge-Eingaben, der Block entstand nicht und die Einzelteile blieben lose im
Modell liegen. GF_n und VF_n pruefen aus demselben Grund die Blocktabelle.
- kf-freie-nummer ueberspringt jede Nummer mit vorhandener Block-Definition
- kf-nummer-aus-name liest nur rein numerische Namen (KF_2D, KF_UM_26 und
KF_LAENGE tragen dasselbe Praefix, atoi("2D") waere 2)
- KF_EDIT nutzt zuerst die vorgewaehlte Auswahl (Doppelklick), entsel nur als
Rueckfall, und akzeptiert nur echte KF_<n>
- Unit-Tests fuer Namens-Parser und Nummernvergabe
- KF_2D.dwg: ueberarbeitete Draufsicht
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -632,18 +632,51 @@
|
||||
kf-insert)
|
||||
|
||||
;; Naechste freie KF-Nummer in der Zeichnung.
|
||||
(defun kf-naechste-nummer ( / n ss i nm num)
|
||||
;; Nummer aus einem Blocknamen "KF_<n>" (rein numerisch), sonst nil. Die
|
||||
;; Bausteine der Kette heissen ebenfalls "KF_...": "KF_2D" (Draufsicht),
|
||||
;; "KF_UM_26", "KF_LAENGE" duerfen NICHT als Nummer gelesen werden - atoi
|
||||
;; liefert fuer "2D" naemlich 2 und fuer "UM_26" 0. Reiner Rechenkern.
|
||||
(defun kf-nummer-aus-name (nm / rest i ok)
|
||||
(setq nm (strcase nm))
|
||||
(if (and (> (strlen nm) 3) (= (substr nm 1 3) "KF_"))
|
||||
(progn
|
||||
(setq rest (substr nm 4) i 1 ok T)
|
||||
(while (and ok (<= i (strlen rest)))
|
||||
(if (not (wcmatch (substr rest i 1) "#")) (setq ok nil))
|
||||
(setq i (1+ i)))
|
||||
(if ok (atoi rest) nil))
|
||||
nil))
|
||||
|
||||
;; Erste freie Nummer ab start: ueberspringt jede Nummer, fuer die belegt-p
|
||||
;; (Symbol einer Ein-Argument-Funktion) T liefert. Reiner Rechenkern, das
|
||||
;; Praedikat macht die Zeichnungsabfrage austauschbar und damit testbar.
|
||||
(defun kf-freie-nummer (start belegt-p / n)
|
||||
(setq n start)
|
||||
(while (apply belegt-p (list n)) (setq n (1+ n)))
|
||||
n)
|
||||
|
||||
;; Ist die Block-DEFINITION KF_<n> in der Zeichnung vorhanden?
|
||||
(defun kf-nummer-belegt-p (n)
|
||||
(not (null (tblsearch "BLOCK" (strcat "KF_" (itoa n))))))
|
||||
|
||||
;; Naechste freie KF-Nummer. Bewusst NICHT nur ueber die Referenzen im Modell:
|
||||
;; loescht man einen Foerderer (oder baut KF_EDIT ihn neu auf), lebt seine
|
||||
;; Block-DEFINITION in der Blocktabelle weiter. Wird deren Nummer erneut
|
||||
;; vergeben, trifft das spaetere _.-BLOCK auf einen vorhandenen Namen - die
|
||||
;; "Neu definieren?"-Abfrage verschluckt die Folge-Eingaben, der Block entsteht
|
||||
;; nicht, und die Einzelteile bleiben LOSE im Modell liegen (Fehlerbild "Block
|
||||
;; aufgeloest"). GF_n und VF_n pruefen aus demselben Grund die Blocktabelle.
|
||||
(defun kf-naechste-nummer ( / n ss i num)
|
||||
(setq n 0)
|
||||
(setq ss (ssget "X" '((0 . "INSERT") (2 . "KF_*"))))
|
||||
(if ss
|
||||
(progn
|
||||
(setq i 0)
|
||||
(while (< i (sslength ss))
|
||||
(setq nm (cdr (assoc 2 (entget (ssname ss i)))))
|
||||
(setq num (atoi (substr nm 4)))
|
||||
(if (> num n) (setq n num))
|
||||
(setq num (kf-nummer-aus-name (cdr (assoc 2 (entget (ssname ss i))))))
|
||||
(if (and num (> num n)) (setq n num))
|
||||
(setq i (1+ i)))))
|
||||
(1+ n))
|
||||
(kf-freie-nummer (1+ n) 'kf-nummer-belegt-p))
|
||||
|
||||
;; ============================================================
|
||||
;; DIALOG
|
||||
@@ -1082,17 +1115,26 @@
|
||||
(setq i (1+ i)))
|
||||
(cond (treffer) (0)))
|
||||
|
||||
(defun c:KF_EDIT ( / ent ed bname attribs daten eingabe variante hoehe
|
||||
(defun c:KF_EDIT ( / ss ent ed bname attribs daten eingabe variante hoehe
|
||||
verbindung farbe antriebsmotor movimot steuerung
|
||||
geo erg laenge skala lmin lmax startpunkt drehung
|
||||
last-ent kf-nummer endpunkt)
|
||||
(setq ent (car (entsel (ssg-text "kf-edit-waehlen"))))
|
||||
;; Erst die VORGEWAEHLTE Auswahl (Doppelklick setzt sie), nur ohne sie per
|
||||
;; Klick nachfragen - wie GEFAELLESTRECKE_EDIT/KreiselEdit. Vorher fragte
|
||||
;; KF_EDIT auch nach einem Doppelklick noch einmal nach einer Auswahl.
|
||||
(setq ss (ssget "I"))
|
||||
(setq ent (if (and ss (= (sslength ss) 1))
|
||||
(ssname ss 0)
|
||||
(car (entsel (ssg-text "kf-edit-waehlen")))))
|
||||
(if (null ent)
|
||||
(princ (ssg-text "kf-abgebrochen"))
|
||||
(progn
|
||||
(setq ed (entget ent))
|
||||
(setq bname (cdr (assoc 2 ed)))
|
||||
(if (or (/= (cdr (assoc 0 ed)) "INSERT") (not (wcmatch bname "KF_*")))
|
||||
;; Nur echte Foerderer "KF_<n>": die Bausteine (KF_UM_26, KF_2D, ...)
|
||||
;; tragen ebenfalls das Praefix KF_, haben aber keine Attribute - ein
|
||||
;; Neuaufbau aus ihnen waere sinnlos und wuerde sie loeschen.
|
||||
(if (or (/= (cdr (assoc 0 ed)) "INSERT") (null (kf-nummer-aus-name bname)))
|
||||
(alert (ssg-text "kf-edit-kein-kf"))
|
||||
(progn
|
||||
(setq daten (kf-daten))
|
||||
|
||||
Reference in New Issue
Block a user