Sostituire valore default attributo con valore inserito nel blocco

77marco77

Utente poco attivo
Professione: ingegnere
Software: autocad2024
Regione: austria
Buongiorno,
in un disegno (che viene usato come sorgente dei blocchi per nuovi disegni) con oltre 6000 blocchi vorrei sostituire il valore di default del tag dell'Attributo con il valore giá inserito manualmente nel blocco.

ho trovato questo codice di Lee Mac:

Codice:
;; Lee-Mac - 2017
(defun c:defatt ( / bln def tag )
   (if (= "" (setq bln (strcase (getstring t "\nSpecify block name filter (Use * for all) <*>: "))))
       (setq bln "*")
   )
   (if (= "" (setq tag (strcase (getstring "\nSpecify tag name filter (Use * for all) <*>: "))))
       (setq tag "*")
   )
   (setq def (getstring t "\nSpecify new default value: "))
   (vlax-for blk (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
       (if (and (= :vlax-false (vla-get-islayout blk) (vla-get-isxref blk)) (wcmatch (strcase (vla-get-name blk)) bln))
           (vlax-for obj blk
               (if (and (= "AcDbAttributeDefinition" (vla-get-objectname obj))
                        (wcmatch (strcase (vla-get-tagstring obj)) tag)
                        (vlax-write-enabled-p obj)
                   )
                   (vla-put-textstring obj def)
               )
           )
       )
   )
   (princ)
)
(vl-load-com) (princ)

che fa quello che mi serve ma devo immettere il nome del blocco (non posso selezionare), il nome del TAG ed il nuovo valore di default del Tag, ma sono molti blocchi ed ognuno ha tra i 12 e i 20 attributi...
è possibile in maniera più veloce fare la selezione del blocco (o più blocchi), dell'attributo (o più attributi), che legga il valore già inserito e farglielo inserire come nuovo default?
 

confutatis

Utente poco attivo
Professione: Programmatore LISP e disegnatore
Software: AutoCAD 2022
Regione: Friuli-Venezia Giulia
Non è il massimo, devi selezionare un blocco alla volta, ma un po' velocizzi (spero che non siano 6000 blocchi tutti con nomi diversi!). Devi cliccare una volta sul blocco e una volta sull'attributo.

Codice:
(defun C:DEFATT2 ()
 (setq blk (vlax-ename->vla-object (car (entsel "\nSelezionare blocco: ")))
       tag (vlax-ename->vla-object (car (nentsel "\nSelezionare attributo: ")))
       blk (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) (vla-get-EffectiveName blk))
 )
 (vlax-for elem blk
  (if (and (= (vla-get-ObjectName elem) "AcDbAttributeDefinition")
         (= (vla-get-TagString elem) (vla-get-tagstring tag))
      )
   (vla-put-TextString elem (vla-get-Textstring tag))
  )
 )
)
 

77marco77

Utente poco attivo
Professione: ingegnere
Software: autocad2024
Regione: austria
Non è il massimo, devi selezionare un blocco alla volta, ma un po' velocizzi (spero che non siano 6000 blocchi tutti con nomi diversi!). Devi cliccare una volta sul blocco e una volta sull'attributo.

Codice:
(defun C:DEFATT2 ()
 (setq blk (vlax-ename->vla-object (car (entsel "\nSelezionare blocco: ")))
       tag (vlax-ename->vla-object (car (nentsel "\nSelezionare attributo: ")))
       blk (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) (vla-get-EffectiveName blk))
 )
 (vlax-for elem blk
  (if (and (= (vla-get-ObjectName elem) "AcDbAttributeDefinition")
         (= (vla-get-TagString elem) (vla-get-tagstring tag))
      )
   (vla-put-TextString elem (vla-get-Textstring tag))
  )
 )
)
Grazie mille adesso sarò sicuramente più veloce, purtroppo sono davvero 6358 Blocchi (tutti con nomi diversi...) e ognuno con 12 fino a 20 attributi (per fortuna devo aggiornarne solo 4 o 5) ma almeno ora me la cavo solo cliccando invece di dover pure scrivere :).
Grazie di nuovo!!
 

77marco77

Utente poco attivo
Professione: ingegnere
Software: autocad2024
Regione: austria
Non è il massimo, devi selezionare un blocco alla volta, ma un po' velocizzi (spero che non siano 6000 blocchi tutti con nomi diversi!). Devi cliccare una volta sul blocco e una volta sull'attributo.

Codice:
(defun C:DEFATT2 ()
 (setq blk (vlax-ename->vla-object (car (entsel "\nSelezionare blocco: ")))
       tag (vlax-ename->vla-object (car (nentsel "\nSelezionare attributo: ")))
       blk (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) (vla-get-EffectiveName blk))
 )
 (vlax-for elem blk
  (if (and (= (vla-get-ObjectName elem) "AcDbAttributeDefinition")
         (= (vla-get-TagString elem) (vla-get-tagstring tag))
      )
   (vla-put-TextString elem (vla-get-Textstring tag))
  )
 )
)
ho cominciato a fare i circa 56.000 click + enter, ma il dito ha già smesso di funzionare...
se non è troppo complicato credi che si possa aggiungere nel codice le istruzioni affinché il comando venga di nuovo lanciato e selezionato automaticamente il blocco precedentemente selezionato? questo mi permetterebbe scelto il blocco la prima volta di cliccare semplicemente in successione i soli attributi da aggiornare, quando finito premo esc e lo rilancio per il prossimo blocco (diventerebbero 28.000 click e senza usare la tastiera per reimmettere il comando per ogni attributo).
Grazie in ogni caso :)
 

confutatis

Utente poco attivo
Professione: Programmatore LISP e disegnatore
Software: AutoCAD 2022
Regione: Friuli-Venezia Giulia
Così dovrebbe andare. Il programma ti chiederà attributi fino a che non premi <enter>.

Codice:
(defun C:DEFATT3 ()
 (setq blk (vlax-ename->vla-object (car (entsel "\nSelezionare blocco: ")))
       blk (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) (vla-get-EffectiveName blk))
       listatt '()
 )
 (while (setq tag (nentsel "\nSelezionare attributo: "))
  (if tag
   (progn
    (setq tag (vlax-ename->vla-object (car tag)))
    (setq listatt (cons tag listatt))
   )
  )
 )
 (setq listatt (reverse listatt))
 (foreach elem1 listatt  
  (vlax-for elem blk
   (if (and (= (vla-get-ObjectName elem) "AcDbAttributeDefinition")
          (= (vla-get-TagString elem) (vla-get-tagstring elem1))
       )
    (vla-put-TextString elem (vla-get-Textstring elem1))
   )
  )
 )
)
 

Cristallo

Utente Standard
Professione: Leggo e confronto
Software: Lettura critica
Regione: Fuori dalla cerchia
Molto buoni. Ma la Sacker è la Sacker. Non quella che trovi in Italia nei supermercati. La devi mangiare li, è tutto un altro pianeta. E' come fare il raffronto Parmigiano-Parmesan
 

Statistiche forum

Discussioni
58,720
Messaggi
500,810
Utenti registrati
104,702
Ultimo utente registrato
Manuel93

Staff online

Top