Newsgroup: it.comp.software.cad
Titolo: Gestione Errori con LISP

Su diversi disegni devo rinominare, congelare . . .
diversi layer (e/o blocchi). Ho pensato di fare il seguente lisp:
;;; Cambia nomi
(defun c:rin ( / ss)
(setvar "cmdecho" 0)
(command "_rename" "la" "1" "UNO" )
(command "_rename" "la" "2" "Due" )
(command "_rename" "la" "3" "Tre" )
(command "_rename" "bl" "3" "Tre" )
(command "_rename" "la" "4" "Quattro" )
(princ)
)
Il problema è che in alcuni disegno non sono presenti tutti i layer e quindi
quando cerco di rinominare un layer non esistente, invece di passare alla
riga successiva del programma, AutoCAD mi richiede il nome del vecchio
layer.
Come posso evitare questo inconveniente e rinominare i layer, solo se
esistono.
Grazie MILLE.

 esistono.
Prova ad usare la funzione 'IF', cosi':
(if (tblsearch "LAYER" "1")  (command "_rename" "_la" "1" "UNO" ))
...e via di seguito per ogni piano.

 ...e via di seguito per ogni piano.
Ottimo consiglio, mi e' stato ulile pure a me,
"tblsearch" mi e' nuovo, figurati io facevo (come vedrai sotto)
cose analoghe con "tblnext", e poi me li ripassavo tutti a suon di if.
grazie, allego un po di codice sulla gestione dei layer, ti/vi facesse
comodo...
---cut---cut---cut---cut---cut---cut---cut---cut---cut---cut---cut---cut---c
ut---cut---
;---
(defun LSEL (prefix / £nlay nlay lprefix)
  (setq lprefix (strlen prefix))
  (setq £nlay nil)
(setq nlay (cdr (assoc 2 (tblnext "LAYER" T))))
(while (setq nlay (cdr (assoc 2 (tblnext "LAYER"))))
       (if (= (substr nlay 1 lprefix) prefix)
       (setq £nlay (append £nlay (list nlay)))))
(setq £nlay £nlay))
;---
(defun LLIST (lay / llay)
(setq llay (tblnext "LAYER" T) nlay (cdr (assoc 2 llay)))
(if (= nlay lay) (setq llay (tblnext "LAYER" T))
                 (while (and (not (= nlay lay)) llay) (setq llay (tblnext
"LAYER") nlay (cdr (assoc 2 llay)))))
(setq llay llay))
;---
(defun LNEW    (lay col) (if (and lay col)(progn (Command "Layer" "n" lay
"c" col lay ""))))
(defun LSET    (lay)     (if lay          (progn (Command "Layer" "s" lay
""))))
(defun LOFF    (lay)     (if lay          (progn (if (= (getvar "clayer")
lay)  (Command "Layer" "off" lay "Y" "")
                                      (Command "Layer" "off" lay "")))))
(defun LON     (lay)     (if lay          (progn (Command "Layer" "on" lay
""))))
(defun LINV    (lay)     (if lay   (if (> (cdr (assoc 62 (LLIST lay))) 0)
(LOFF lay)(LON lay))))
(defun LFREEZE (lay)     (if lay          (progn (if (= (getvar "clayer")
lay)  (progn (LSET0)(Command "Layer" "freeze" lay ""))
                                        (progn        (Command "Layer"
"freeze" lay ""))))))
(defun LTHAW   (lay)     (if lay          (progn (Command "Layer" "thaw" lay
""))))
(defun LLOCK   (lay)     (if lay          (progn (Command "Layer" "lock" lay
""))))
(defun LUNLOCK (lay)     (if lay          (progn (Command "Layer" "unlock"
lay ""))))
(defun LAPRI   (lay)     (if lay          (progn (LTHAW lay) (LON lay))))
(defun LCHIUDI (lay)     (if lay          (progn (LOFF lay) (LFREEZE lay))))
(defun LSET0      ()         (Command "Layer" "s" "0" ""))
(defun LOFFALL    ()         (Command "Layer" "off" "*" "y" ""))
(defun LONALL     ()         (Command "Layer" "on" "*" ""))
(defun LFREEZEALL () (LSET0) (Command "Layer" "freeze" "*" ""))
(defun LTHAWALL   ()         (Command "Layer" "thaw" "*" ""))
(defun LLOCKALL   () (LSET0) (Command "Layer" "lock" "*" ""))
(defun LUNLOCKALL ()         (Command "Layer" "unlock" "*" ""))
(defun LAPRIALL   ()         (LTHAWALL) (LONALL))
(defun LCHIUDIALL ()         (LOFFALL)  (LFREEZEALL))
---cut---cut---cut---cut---cut---cut---cut---cut---cut---cut---cut---cut---c
ut---cut---
Ciao Giovanni

  (princ))
io avrei fatto (a parte integrare l'if suggeritoti):
;--------------------------------
(defun conv07 (#)
  (nth # '("Zero" "Uno" "Due" "Tre" "Quattro" "Cinque" "Sei" "Sette")))
;--------------------------------
(defun reno07 (tipo #)
  ;;QUA PUOI METTERE L'IF DI CONTROLLO
  (cond ((= tipo 1) (command "_rename" "la" (itoa #) (conv07 #)))
            ((= tipo 2) (command "_rename" "bl" (itoa #) (conv07 #)))
            ((= tipo 3) (command "_rename" "la" (itoa #) (conv07 #))
                             (command "_rename" "bl" (itoa #) (conv07 #)))))
;--------------------------------
(defun c:rin (/ ce ltmp)
 (setq ce (getvar "cmdecho" )) (setvar "cmdecho" 0)
 (foreach ltmp '((1 1)(1 2)(3 3)(2 4))
   (reno07 (nth 0 ltmp )(nth 1 ltmp)))
 (setvar "cmdecho" ce)
 (princ))
;--------------------------------
peccato non esista un convertitore da 0 a (ruota_90° 8) per i numeri;
il nome "conv07" "reno07" indica la limitatezza delle procedure fatte
spero di non averti/vi annoiato, mi adava di fare un po' di palestra. :-)
--
Ciao Giovanni

Grazie, funziona, ma il problema è più complesso del previsto:
su molti disegni posso avere il layer "uno" e/o il layer "primo" da
trasformare in layer "1".
Dopo aver rinominato il layer Uno in "1" non riesco più a rinominare il
layer "Primo", perchè mi dice che "1" esiste già. Dovrei quindi creare i
layer (se già non sono esistenti) all'inizio del lisp e poi spostare gli
oggetti dei vari layer nei nuovi. come si fa ?
Grazie e spero di essere stato chiaro.

Ho sistemato il problema dei layer. Ora ho un nuovo problema (e chissa
quanti ne avrò ancora .. . )
Ho iniziato a leggere un libro su lisp, ma intanto Vi chiedo di pazientare.
Devo eseguire la seguente procedura in lisp:
(command "_change" "TU" "" "P" "_LAYER" "PRIMO" "" ))
Cioè tutti gli oggetti che vedo a video (gli altri sono congelati) devono
andare nel layer PRIMO. Il problema sussiste quando non c'è nessun oggetto a
video e AutoCAD mi ritorna errore quando legge la "P" (proprieta'). Dovrei
utilizzare un if all'inizio che mi faccia eseguire il resto della stringa
solo se esisto gli oggetti. Non so come fare.
Non esiste qualcosa del tipo "Se esiste almeno un oggetto sui layer
scongelati allora --> . . . "
Ringrazio tutti quelli che mi hanno risposto fino ad adesso e quelli che
risponderano.
Ciao.
Cociredef.