Routine lisp non funzionante

Angelo2449

Utente Junior
Professione: Pensionato
Software: Autocad
Regione: Lombardia
#1
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
#2
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: AutoCad, GstarCAD, CadWorx, Excel, Lisp, VBA
Regione: Sicilia
#3
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
#4
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
#5
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
#7
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
#8
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
#9
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
#10
Una routine ha un inizio e una fine, quando questa si interrompe AutoLISP valuta sempre se esiste una funzione *error*
 
Ultima modifica: