Uso di Entmod e Entupd per "aggiornare" il valore di un attributo

x11start

Utente Standard
Professione: Disegnatore prefabbricati
Software: Autocad
Regione: Piemonte
Salve a tutti,
stò facendo un lisp che manipola degli attributi di testo all'interno di blocchi.
I blocchi rappresentano degli oggetti (pilastri o travi) ed hanno dimensione 1 x 1, in modo che opportunamente scalati, mi consentono di ottenere le dimensioni volute.
Purtroppo ho constatato che il fattore di scala si ripercuote anche sull'attributo interno al blocco.... così mi ritrovo un testo "allargato" all'inverosimile, quando dovrebbe sempre avere valore 1.
Il codice che riguarda la larghezza del testo di attributo è il 41... ma ho qualche problema nel riuscire a riportarlo ad 1!
Ecco lo spezzone di codice in cui:
ent è il set di selezione del blocco
attr1 è il suo attributo
larat è la larghezza del testo di attributo che se è maggiore di 1 mi va a sostituire la larghezza "assurda" (!) con il valore 1

tutto sembra funzionare
... ed entmod (o entupd) dovrebbe rendere operativa la modifica .... ma non funziona!

(setq attr1 (entget (entnext (cdr (assoc -1 ent)))))
(setq atpr (cdr (assoc 1 attr1))) ; Valore dell'attributo (per ora ne usa uno solo)
(setq larat (cdr (assoc 41 attr1))) ; Larghezza testo attributo (deve essere al massimo 1.0)
(if (> larat 1.0) ; Se la larghezza del testo dell'attributo è maggiore di 1
(progn ; .... lo pone uguale ad 1...
(setq attr1 (subst (cons 41 1.0)(cons 41 larat) attr1))
(entmod attr1) ; Rende operativa la modifica
)
)

Qualcuno saprebbe aiutarmi?
 

Cristallo

Utente Standard
Professione: Leggo e confronto
Software: Lettura critica
Regione: Fuori dalla cerchia
Scusa X11, ma perche lo vincoli ad una condizione if?
Stabilisci un valore fisso (1) e fai un subst sulla porzione

(setq larat (cdr (assoc 41 attr1)))
(setq LARAT2 (cons '41 1.0))
(setq attr1 (subst LARAT2 larat attr1))

Alcune volte cmq entmod/entupd sembra non facciano nulla, ma non so dirti il perchè.
A volte preferisco creare una nuova entita (setq attr2 crd attr1) (entmake attr2) (entedel attr1)

Tieni presente che sono fuori, per cui non ho testato la sintassi, non ho lisp sottomano vado a memoria.
 

x11start

Utente Standard
Professione: Disegnatore prefabbricati
Software: Autocad
Regione: Piemonte
Grazie Cristallo
domani provo a seguire i tuoi consigli.... e poi mi faccio risentire.
 

x11start

Utente Standard
Professione: Disegnatore prefabbricati
Software: Autocad
Regione: Piemonte
Ecco quà il risultato dei mie sforzi:
Nel file PROVA.DWG ci sono 2 pilastri ed 1 trave rappresentati sia in 2D che in 3D.

Si tratta sostanzialmente di blocchi di valore unitario, che per convenzione ho stabilito di differenziare con la prima lettera del nome: % per i blocchi 2D e & per quelli 3D.

Questi blocchi consentono di costruire la geometria di pilastri e travi prefabbricate, semplicemente inserendoli con un preciso valore sui vari assi + 1 attributo.

In questo modo è possibili creare un pilastro 50 x 60 alto 600 , mettendo questi valori in X Y e Z del blocco 2D. Ovviamente il blocco 2D essendo tale, rappresenterà solo il rettangolo 50 x 60, mentre l'altezza 600 non farà cambiare nulla. Il lisp 2D3D sostituisce i blocchi 2D con quelli 3D... e a questo punto il valore su asse Z consente di dare un'altezza al pilastro.

L'attributo è utilizzato, non per modificare la geometria dell'oggetto, ma per assegnare una quota e questo vale in modo particolare per le mensole e per i travi. Gli attributi in questi elementi sono perciò visibili... ed è questo che mi creava qualche problema nel lisp: inserendo il valore di 450 cm sull'asse X della trave .... mi si "Stirava" allo stesso modo l'attributo.

Sono riuscito a trovare il modo di "normalizzare" questo valore (grazie anche all'aiuto di Cristallo!) ed ora posso agevolmente trasformare il mio disegno 2D in 3D e viceversa.
Notare che se il comando trova oggetti un pò 2D e un pò 3D, chiede cosa fare... mentre i blocchi che non iniziano con % o con & vengono ignorati.

Mi rendo conto che questo sia un utilizzo molto "mirato" al mio settore, tuttavia credo che possa essere di aiuto a qualcuno per trarne qualche spunto.

Nel lisp viene anche caricato MESSAGGIO.LSP, che si occupa di visualizzare i messaggi di richiesta a pieno schermo .... per quelli "Cecati" come il sottoscritto.

Divertitevi a trasformare il 2D in 3D e viceversa... e ad inventare nuovi utilizzi!
 

Allegati

Cristallo

Utente Standard
Professione: Leggo e confronto
Software: Lettura critica
Regione: Fuori dalla cerchia
Peccato che non mi fa nulla..
sia con 2D3D Sia con scorre, sia con scelta
Però non riporta nessun messaggio d'errore, neanche il "funzione non definita".
Semplicemente e come se non digitassi nulla.
 

x11start

Utente Standard
Professione: Disegnatore prefabbricati
Software: Autocad
Regione: Piemonte
Forse ho capito: messaggio.lsp carica anch'esso un lisp e forse non trovandolo "si impalla!". Ultimamente stó cercando di suddividere i lisp a moduli.... ma poi ovviamente devo fornirli se li condivido sul forum!
Prova a disabilitare la sezione messaggi (comando x11:messaggio) ... e vedi se funziona. Poi quando torno a casa forniró il modulo mancante!