Routine lisp non funzionante

Angelo2449

Utente Junior
professione: Pensionato
software: Autocad
regione: Lombardia
Salve a tutti,
sto impazzendo per questa piccola routine che non funziona :
Codice:
   (defun C:PROVA (/ PuntoCliccato Cx Cy Cxx Cyy XYZ)

       (setq PuntoCliccato (getpoint "\nClicca il Punto"))
       (command "_circle" PuntoCliccato 0.15)

       (setq Cx (car PuntoCliccato))
       (setq Cy (cadr PuntoCliccato))

       (setq Cxx (+ Cx 0.20))
       (setq Cyy (+ Cy 0.25))

       (setq XYZ (list Cxx Cyy 0.00))

       (command "_circle" XYZ 0.40)
       (command "_change" "_last" "" "_p" "_c" "_red" "")

   )
aiuto, grazie.
 

Cristallo

Utente Standard
professione: Leggo e confronto
software: Lettura critica
regione: Fuori dalla cerchia
a me riga per riga funziona.
prova a togliere le variabili locali
(defun C: PROVA (/ PuntoCliccato Cx Cy Cxx Cyy XYZ) -> (defun C: PROVA ()
 

rpor66

Utente Standard
professione: Programmatore
software: Lisp, Vba per Autocad, BricsCad e GstarCAD, CadWorx
regione: Sicilia
Codice:
(defun C:PROVA (/ PuntoCliccato Cx Cy Cxx Cyy XYZ)

    (setq PuntoCliccato (getpoint "\nClicca il Punto"))

    (SetOsnapOnOFF "OFF")
    
    (command "_circle" PuntoCliccato 0.15)

    (setq Cx (car PuntoCliccato))
    (setq Cy (cadr PuntoCliccato))

    (setq Cxx (+ Cx 0.20))
    (setq Cyy (+ Cy 0.25))

    (setq XYZ (list Cxx Cyy 0.00))

    (command "_circle" XYZ 0.40)
    
    (command "_change" "_last" "" "_p" "_c" "_red" "")

    (SetOsnapOnOFF "ON")

)

; accende o spegne gli osnap, equivalente al tasto F3
(defun SetOsnapOnOFF(mode / osmode)       
    (setq osmode (getvar "osmode"))
    (if (= mode "ON")
        (if (> osmode 16384)
            (setvar "osmode" (- osmode 16384))
        )
        (if (< osmode 16384)
            (setvar "osmode" (+ osmode 16384))
        )       
    )
)

Devi fare attenzione agli osnap, se no ti fregano.
 

Cristallo

Utente Standard
professione: Leggo e confronto
software: Lettura critica
regione: Fuori dalla cerchia
Non avevo pensato all'osnap perchè in genere prima di ogni procedura inserisco
(setq OldOsMode (getvar "Osmode"))
(setvar "osmode" 0)

ed alla fine
(setvar "Osmode" OldOsmode)

in maniera che la procedura risulti assolutamente trasparente all'operatore e non influenzata dagli osnap.
 

GP.

Utente Senior
professione: Nientologo
software: uozapp
regione: Vercelli
Apportando modifiche alle variabili di sistema sarebbe buona norma predisporre una gestione errori per il ripristino in caso di uscita forzata.
Per evitare... c'è sempre il buon "_non"
(command "_circle" "_non" XYZ 0.40)
 

Angelo2449

Utente Junior
professione: Pensionato
software: Autocad
regione: Lombardia
Certe volte il LISP mi lascia sconcertato, una routine funziona, un'altra simile non funziona!
Sono certo che sbaglio io ma la sinteticità del linguaggio, induce ad errori frequenti ma, che non sono così rilevabili in sede di programmazione.
Devo abituarmi.
A proposito, la routine funziona benissimo, improvvisamente, senza cambiare codice, funziona!
 

GP.

Utente Senior
professione: Nientologo
software: uozapp
regione: Vercelli

Codice:
(defun c:nomefunzione ( / *error* )

    (defun *error* ( msg )
        (if os (setvar 'osmode os))
        (if msg (prompt msg))
        (princ)
    )

    (setq os (getvar 'osmode))
    (setvar 'osmode 33)
    .............
    .............
    .............    
    (setvar 'osmode os)
    (princ
)
 

Cristallo

Utente Standard
professione: Leggo e confronto
software: Lettura critica
regione: Fuori dalla cerchia
vediamo se ho capito:
- definisci una funzione *error*
- prima del listato prelevi il valore di OSMODE
- in caso di errore di routine il lisp intercetta l'errore (come?), va in moto la funzione *error* che ripristina l'osmode e ti visulizza il messaggio di errore.

Quello che non comprendo è come il lisp intercetti l'errore, lanciando quindi la routine *error* in automatico.
 

GP.

Utente Senior
professione: Nientologo
software: uozapp
regione: Vercelli
Una routine ha un inizio e una fine, quando questa si interrompe AutoLISP valuta sempre se esiste una funzione *error*
 
Ultima modifica:

Statistiche forum

Discussioni
59,410
Messaggi
507,373
Utenti registrati
111,941
Ultimo utente registrato
micvrmic

Utenti online

Nessun utente è online al momento.
Top