numeri crescenti nei blocchi con attributo

numeri crescenti nei blocchi con attributo

topico
Observer Observer
372 Views
4 Replies
Message 1 of 5

numeri crescenti nei blocchi con attributo

topico
Observer
Observer

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)
)

 

 

0 Likes
373 Views
4 Replies
Replies (4)
Message 2 of 5

vladimir_michl
Advisor
Advisor

Esistono molte applicazioni LISP per questo compito. Non affidatevi a ChatGPT per la programmazione LISP.
Vedere ad esempio BlockC:
https://www.cadforum.cz/en/autonumbering-of-autocad-blocks-incremental-counter-tip6678

 

Vladimir Michl, www.arkance.world  -  www.cadforum.cz

 

0 Likes
Message 3 of 5

topico
Observer
Observer

Grazie, avevo cercato in internet anch'io, ma non avendo trovato nulla, ho fatto una prova con chatGPT.

Il sito che mi hai dato è molto utile e penso che utilizzerò quello dato che ha anche delle opzioni interessanti.

Ora però l'altra domanda.... dopo aver selezionato il blocco è possibile avere una lista dei nomi degli attributi all'interno del blocco? e poi scegliere l'attributo da modificare?

Grazie

0 Likes
Message 4 of 5

vladimir_michl
Advisor
Advisor

Sì, è possibile scegliere l'attributo nelle opzioni del comando.

 

Vladimir Michl, www.arkance.world  -  www.cadforum.cz

 

0 Likes
Message 5 of 5

Sea-Haven
Mentor
Mentor


Try this, 

 

 

 

; https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/numeri-crescenti-nei-blocchi-con-attributo/td-p/13308410
; https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/lisp-change-lisp-to-accept-2-atts/td-p/13313319

(defun c:updateatt ( / ans att atts lst lst2 obj val x)

(if (not AH:getvalsm)(load "Multi Getvals.lsp"))

(setq obj (vlax-ename->vla-object (car (entsel "\nPick block object "))))
(setq bname (vlax-get obj 'name))
(setq atts (vlax-invoke obj 'Getattributes))

(setq lst '())
(foreach att atts
  (setq lst (cons (vlax-get att 'Tagstring) lst))
)

(setq lst2 '())
(foreach val lst
  (setq lst2 (cons "" lst2))
  (setq lst2 (cons 20 lst2))
  (setq lst2 (cons 21 lst2))
  (setq lst2 (cons val lst2))
)
(setq lst2 (cons "Please choose " lst2))

(setq ans (AH:getvalsm lst2))
(setq ss (ssget "X" (list (cons 0 "INSERT")(cons 2 bname))))

(repeat (setq K (sslength ss))
(setq blk (vlax-ename->vla-object  (ssname ss (setq k (1- k)))))
(setq attsblk (vlax-invoke blk 'Getattributes))
(setq x 0)
(foreach val ans
  (if (= val "")
   (princ)
   (vlax-put (nth x attsblk) 'textstring (nth x ans))
  )
  (setq x (1+ x))
)
)

(princ)

(c:updateatt)

 

 

0 Likes