Newsgroup: it.comp.software.cad
Titolo: [LISP] - ciclo if in acad 14 e 2k

salve,
ho ripreso il lisp dopo un pò di pausa e, x realizzarne uno x la release 14
sto avendo difficoltà con un ciclo if, x controllare se l'entità selezionata
è una polilinea.
(defun c:p_panel ()
  (setq profilo (entsel "\nSeleziona il profilo:")
   type_p  (cdr (assoc 0 (entget (car profilo))))
 )
  (if (= type_p "LWPOLYLINE")
    ;;controllo polilinea
    "ok" "Il profilo selezionato non è una polilinea"
  )
  (princ)
)
in sostanza il ciclo if nn mi restituisce nessuna delle due stringhe, il
caso vero e falso. Copiando e incollando nelal finestra dei comandi
un'istruzione alla volta invece funziona.
Qualcuno cortesemente sa dirmi cosa mi sfugge qualcosa e dove è l'errore?
grazie
umberto

umbertoXnews ha scritto:

Non dovrebbe però è possibile che il commento venga considerato come una 
istruzione e saltato, quindi "OK" viene visualizzato solo quando è 
falso... in questi casi è meglio aggiungere l'istruzione "progn".
Un piccolo appunto riguarda anche il testo da cercare, dato che in 
alcuni casi, magari aprendo dei vecchi disegni, ci si può imbattere
nelle normali "POLYLINE"... quindi bisogna verificare entrambi i testi.
Un consiglio... alcune funzioni, come ad esempio l'estrazione di 
determinati dati degli oggetti è più utile metterli in una funzione.
Io uso questa:
	(dxf 0 nome_entità)
la funzione "dxf" è questa:
--- inizio codice ---
;* DXF accetta un codice intero dxf ed una lista di dati di
;* entita'. Restituisce i dati degli elementi della coppia di
;* associazioni
;*
(defun dxf(code elist)
   (cdr (assoc code elist));recupera la coppia di associazioni ed elimina
                           ;il primo elemento
);defun
--- fine codice ---
Ovviamente se scrivi:
	(dxf 10 nome_entità)
otterrai le coordinate X e così via... :-)
Se hai scaricato il DocfaCAD o altre utility lisp dal mio sito, troverai 
al loro interno, un file UT-LISP.LSP con moltissime di queste funzioni 
già pronte (alcune sono mie altre le ho trovare in un libro...)
-- 
Daniele Pinna  (leva oops. per rispondere) * ICQ "chiedilo"
* Vota il mio sito nella TOP TEN di Altervista.org *
Sito Web 
DAPINNA.COM
: 
www.dapinna.com
Il Docfa in PHP-NUKE: 
www.docfanuke.dapinna.com
Il Docfa in Pillole:  
www.docfa.dapinna.com
 (vecchio sito)

umbertoXnews ha scritto:

Il problema è il "princ" finale.
Una funzione defun (), dopo aver effettuato tutte le sue elaborazioni, 
restituisce il risultato dell'ultima elaborazione, che per l'appunto è 
un semplice "princ".
Se il tuo obiettivo è di vedere un commento a schermo hai due opzioni:
1. eliminare il princ finale
2. (secondo me decisamente meglio) impostare un princ esplicito per il 
risultato, per esempio così:
(defun c:p_panel ()
  (setq profilo (entsel "\nSeleziona il profilo:")
   type_p  (cdr (assoc 0 (entget (car profilo))))
  )
  (princ (if (= type_p "LWPOLYLINE")
         ;;controllo polilinea
         "ok" "Il profilo selezionato non è una polilinea"
         )
  )
  (princ)
)
Credo che il commento ;; sia ininfluente.
Ciao
Maci

La diagnosi è corretta ma c'è un'altro bug!
In caso di selezione nulla (pressione di INVIO o difetto di mira) il 
programma termina con un errore "nentsel type".
Si può rimediare includendo il ciclo di selezione e verifica in un ciclo 
while che ripete la richiesta finchè le condizioni non sono soddisfatte:
(while
  (not
   (and
      (setq profilo (car (entsel "\nSeleziona il profilo:")))
      (= "LWPOLYLINE" (cdr (assoc 0 (entget profilo))))
    )
  )
)
L'istruzione and verifica PRIMA  l'esistenza di una selezione e solo nel 
caso che questa condizione sia soddisfatta verifica il tipo di oggetto 
selezionato.
L'istruzione potrebbe essere semplificata e resa più flessibile utilizzando 
la funzione ssget filtrata per la selezione.
"Maci" <maci...@pippo.pip> ha scritto nel messaggio 
news:d03ss4$p3t$1...@news.flashnet.it...



Verissimo. 
Il problema posto però era un altro e cioè il mancato funzionamento 
della routine.
Più che un bug il tuo è un miglioramento perché interviene su un 
possibile errore.
E allora, come succede ogni volta, si può implementare ancora meglio la 
routine con ulteriori affinamenti, passando da  due righe  a qualche 
decina ;-))
Maci

beh, grazie
avevate tutti ragione
cmq è sorto un ulteriore problema che ho scoperto solo ora.
dalla rel 14 le lwpolyline sembrano nn contenere + le informazioni sulle
entità che le costituiscono - linee e archi.
oltre ai vertici ho bisogno di sapere se i vertici appartengono ad una linea
o ad un'arco. è ancora possibile? o è necessario utilizzare una vecchia
polilyne?
grazie
x d pinna
sul tuo sito nn trovo il file che dici
ciao
grazie
umberto
"umbertoXnews" <u_bar...@TOvirgilio.it> ha scritto nel messaggio
news:K44Vd.985471$35.36...@news4.tin.it...


 sul tuo sito nn trovo il file che dici
Lo trovi in all'interno di uno dei programmi che scarichi...
Cmq se vuoi te lo mando per email...
scrivimi togliendo "oops." dall'indirizzo
