Blocchi dinamici: selezione tramite ssget "_W"

Vincenzo_O

Utente registrato
Professione: Impiegato
Software: Autocad
Regione: Emilia Romagna
#1
Ciao a tutti,
sono un neofita del lisp quindi portate pazienza.
Sto cercando di far funzionare una routine che seleziona un blocco dinamico posizionato in un punto specifico dello spazio carta e immetta il valore corrente del blocco in una variabile.
Di seguito il codice che ho modificato partendo da quello di Lee Mac. Non funziona e non capisco perchè.
Ogni aiuto è bene accetto, grazie.


(defun LM:getdynpropvalue ( blk prp )
(setq prp (strcase prp))
(vl-some '(lambda ( x ) (if (= prp (strcase (vla-get-propertyname x))) (vlax-get x 'value)))
(vlax-invoke blk 'getdynamicblockproperties)
)
)

(defun c:02test ( / e x )

(setq ppp (getpoint "\n\t***\tPick higher left corner\t*** \n : "))

(setq x (nth 0 ppp))
(setq y (nth 1 ppp))

(setq x1 (+ x 20.72))
(setq y1 (- y 9.37))

(setq x2 (+ x 3.3))
(setq y2 (- y 7.85))

(if (and (setq e (ssget "_W" (list x1 y1) (list x2 y2)))
(= "INSERT" (cdr (assoc 0 (entget e))))
)
(print (setq x (LM:getdynpropvalue (vlax-ename->vla-object e) "Fornitore")))
)
(princ)
)
 

GP.

Utente Senior
Professione: Nientologo
Software: uozapp
Regione: Vercelli
#4
La sintassi per estrarre un oggetto da un gruppo di selezione è la seguente:
(ssname gs indice), dove indice è un numero intero che contraddistingue gli elementi, il primo elemento è zero.

Quindi (ssname gs 0) restituisce il primo elemento del gruppo, (ssname gs 3) restituisce il quarto.

Nel tuo caso questa modifica al codice
(setq e (ssname (ssget "_W" (list x1 y1) (list x2 y2)) 0))
restituisce il nome del primo oggetto del gruppo di selezione, ma potrebbe nascere un problema nel caso in cui gli oggetti "catturati" fossero più di uno.

Per verificare il numero di oggetti in un gruppo di selezione si usa (sslength gs)
 

Vincenzo_O

Utente registrato
Professione: Impiegato
Software: Autocad
Regione: Emilia Romagna
#5
grazie mille GP.

Ho modificato il codice tenendo conto delle tue indicazioni e chiarimenti. Tutto ok adesso.
Buone feste a tutti.

(defun LM:getdynpropvalue ( blk prp )
(setq prp (strcase prp))
(vl-some '(lambda ( x ) (if (= prp (strcase (vla-get-propertyname x))) (vlax-get x 'value)))
(vlax-invoke blk 'getdynamicblockproperties)
)
)

(defun c:02test ( / e x )
(vl-load-com)

(setq ppp (getpoint "\n\t***\tPick higher left corner\t*** \n : "))

(setq x (nth 0 ppp))
(setq y (nth 1 ppp))

(setq x1 (+ x 22.32))
(setq y1 (- y 9.6))

(setq x2 (+ x 3.3))
(setq y2 (- y 7.5))

(setq selection (ssget "_W" (list x1 y1) (list x2 y2)) )
(setq Ent(ssname selection 0))
(setq Vl-Obj Ent)
(setq valore (cdr (assoc 0 (entget vl-obj))))
(setq xx (LM:getdynpropvalue (vlax-ename->vla-object vl-obj) "Fornitore"))

(princ)
)