cg-Cad

Lisp »Tips 'n Tricks »Esempio in Lisp e DCL

Ecco un listato in Lisp e DCL per vedere come si scambiano i dati una finestra di dialogo con un programma LISP.

;numero.lsp (C) by Claudio Piccini
;scrive un numero nella riga di comando
:precedentemente digitato all'interno 
;di una finestra di dialogo

(defun defaults ()
 (setq nNum 1) ; imposta la variabile nNum = 1
 ;
 ; (set_tile chiave valore)
 ; imposta il valore della casella della finestra 
 ; di dialogo.
 ; L'argomento chiave è una stringa che 
 ; indica la casella, mentre valore è una 
 ; stringa che attribuisce un nome al 
 ; nuovo valore da assegnare.
 (set_tile "sN" "1") 
)

(defun do_sN()
 ; atof : restituisce la conversione di una stringa 
 ;        in un numero reale
 ; atoi : restituisce la conversione di una stringa 
 ;        in un numero intero
 ; 
 ; (get_tile chiave)
 ; indica il valore corrente della casella di 
 ; editazione nella finestra di dialogo
 ;
 ; (setq nNum valore)
 ; salva nella variabile nNum il numero digitato
 ;
 (setq nNum (atof (get_tile "sN")))
)

(defun C:NUMERO ( / ok_c dcl_id nNum)
 (setvar "cmdecho" 0)
 (setq ok_c 1)
 ;
 ; (load_dialog stringa) 
 ; carica il file DCL, contenuto nell'argomento 'stringa'
 ; la funzione restituisce un numero intero positivo 
 ; se trova e apre il file, intero negativo se non 
 ; riesce ad aprire il file.
 ; Il numero è salvato nella variabile dcl_id.
 ; Se (if) dcl_id è minore di 0 fine del programma!
 ;
 (if (< (setq dcl_id 
  (load_dialog "c:/pick/lisp/numero.dcl")) 0)
  (exit)
 )
 ;
 ; (new_dialog nome_dcl dcl_id)
 ; attiva la finestra di dialogo 'numero.dcl' 
 ; con il numero identificativo dcl_id 
 ; (ricavato dalla funzione load_dialog)
 ; Se l'esito è positivo new_dialog 
 ; restituisce T (vero),
 ; altrimenti restituisce nil (falso).
 ;
 ; (not elem)
 ; verifica se ad un elemento è stato assegnato 
 ; il valore nil
 ; Restituisce T se ad elem è stato assegnato nil, 
 ; altrimenti restituisce nil.
 ;
 (if (not (new_dialog "numero" dcl_id))
  (exit)
 )
 ;
 ; chiama la funzione defaults
 ;
 (defaults)
 ;
 ; (action_tile chiave espressione-azione)
 ; assegna un'azione da valutare quando l'utente seleziona 
 ; la casella specificata nella finestra di dialogo 
 ; o preme un tasto.
 ;
 ; (done_dialog) 
 ; chiude la finestra di dialogo
 ;
 (action_tile "sN"     "(do_sN)")
 (action_tile "accept" "(done_dialog)")
 (action_tile "cancel" "(setq ok_c 0)")
 ;
 ; (start_dialog)
 ; visualizza la finestra di dialogo.
 ;
 (start_dialog)
 ;
 ; (unload_dialog dcl_id)
 ; scarica il file DCL identificato dalla variabile dcl_id
 ;
 (unload_dialog dcl_id)
 (if (= 1 ok_c)
  (progn  ;tasto OK
   (princ "Numero ")
   (princ nNum)
   (princ)
  )
  (progn  ;tasto ANNULLA
   (alert "Il numero non e' stato digitato")
  )
 )
)

Riquadro di dialogo del comando LISP numero.lsp

/*
   dcl_setting Livelli di verifica semantica:
   0 Nessun controllo
   1 Errori. Individua gli errori DCL che possono
     causare l'interruzione di AutoCAD. Livello di default.
   2 Avvertimenti.
   3 Suggerimenti.
*/
dcl_settings : default_dcl_settings { audit_level = 1; }

numero
: dialog {
  label = "numero.lsp"; //etichetta
  : column { 
    : row {      
      : boxed_column {  //disegna una cornice
        : edit_box {    //casella di modifica
          //etichetta
          label = "Scrivi un numero: ";
          // specifica un nome ASCII utilizzato dal lisp
          // per far riferimento a questa casella.   
          key = "sN"; 
          // valore iniziale contenuto nella casella
          value = "1";
          //battendo n si attiva la casella
          mnemonic = "n";
          edit_width = 7;
        }
      }
    }
  }
  ok_cancel; //pulsanti OK e Annulla.
//ok_only; pulsante unico.
}

Lisp »Tips 'n Tricks