Message 1 of 5
numeri crescenti nei blocchi con attributo
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
Buongiorno, io non ho mai programmato un lisp, quindi ho chiesto a chatGPT di farlo.
Mi serviva che in tanti blocchi uguali con attributo mi numerasse uno specifico attributo del blocco partendo da un numero, che si immette manualmente, e che gli altri blocchi fossero in ordine crescente dal basso verso l'alto, il risultato è stato ottimo, ve lo allego.
Dopo averlo caricato, per attivarlo digitare "numatt"
Però volevo che nella riga di comando mi visualizzasse tutti gli attributi del blocco per poi scegliere quale attributo andare a modificare, ma non ci è riuscito.
Vi allego lo script, magari voi riuscite a trovare un modo per farlo, oppure sapete già dirmi se invece è impossibile.
(defun c:NumAttr (/ ss firstBlock attrTagList tag startNum count
sortedList i ent pt vAtt)
(vl-load-com)
;; Seleziona i blocchi (oggetti INSERT) nel disegno
(setq ss (ssget '((0 . "INSERT"))))
(if (not ss)
(progn
(princ "\nNessun blocco selezionato.")
(exit)
)
)
;; Usa il PRIMO blocco selezionato per ottenere l'elenco dei tag degli attributi
(setq firstBlock (ssname ss 0))
(setq attrTagList '())
(vlax-for att (vlax-invoke (vlax-ename->vla-object firstBlock) 'GetAttributes)
(setq attrTagList (cons (vlax-get att 'TagString) attrTagList))
)
(if (null attrTagList)
(progn
(princ "\nIl blocco selezionato non contiene attributi.")
(exit)
)
)
;; Visualizza in comando l'elenco dei tag attributo disponibili
(princ "\nTag attributo disponibili nel blocco:")
(foreach t (reverse attrTagList)
(princ (strcat "\n - " t))
)
;; Chiede all'utente di specificare il tag da modificare e il numero iniziale
(setq tag (getstring "\nInserisci il tag dell'attributo da modificare: "))
(setq startNum (getint "\nInserisci il numero iniziale: "))
(setq count startNum)
;; Costruisce una lista dei blocchi ordinati per la coordinata Y
(setq sortedList '())
(setq i 0)
(while (< i (sslength ss))
(setq ent (ssname ss i))
(setq pt (assoc 10 (entget ent))) ;; Gruppo 10: punto di inserimento
(if pt
(setq sortedList (cons (list (cadr pt) ent) sortedList))
)
(setq i (1+ i))
)
(setq sortedList (vl-sort sortedList (function (lambda (a b)
(< (car a) (car b))))))
;; Per ogni blocco ordinato, aggiorna l'attributo il cui tag corrisponde
(foreach pair sortedList
(setq ent (cadr pair))
(vlax-for att (vlax-invoke (vlax-ename->vla-object ent) 'GetAttributes)
(if (equal (strcase (vlax-get att 'TagString))
(strcase tag))
(vlax-put att 'TextString (itoa count))
)
)
(setq count (1+ count))
)
(princ "\nAttributi aggiornati.")
(princ)
)