Evitare l'avanzamento del lisp

Professione: Pensionato
Software: Autocad
Regione: Lombardia
#1
Salve a tutti,
sto cercando di scrivere un codice che prevede l'uso di programmi esterni a lisp :
Codice:
    (defun C:RIFERIMENTO (/ Riferimento SecondaLinea risp FlagControllo txt1 txt2 LungNomeBase NomePuntoBase Lung CxBB CyBB CzBB Stringa1 ed1 Stazione NotaX)

    (if (= help 1)
	(progn
	    (startapp "C:\\AutocadSupporto\\Liberty\\Rif.exe " "C:\\AutocadSupporto\\Liberty\\Rif.tkn")
	    (exit)
	)
    )

    (setq FC1 (findfile "C:\\AutocadSupporto\\Dati\\DatiRilievo.dat"))

    (if FC1
        (vl-file-delete "C:\\AutocadSupporto\\Dati\\DatiRilievo.dat")
    )

    (setq FC2 (findfile "C:\\AutocadSupporto\\Dati\\Risposta.dat"))

    (if FC2
        (vl-file-delete "C:\\AutocadSupporto\\Dati\\Risposta.dat")
    )

    (setq FC3 (findfile "C:\\AutocadSupporto\\Note\\Nota.dat"))

    (if FC3
        (vl-file-delete "C:\\AutocadSupporto\\Note\\Nota.dat")
    )

    (if (= Primariga 1)
        (alert "La Riga di riferimento è già stata inserita")
    )

    (startapp "C:\\AutocadSupporto\\Liberty\\DatiGPS.exe " "C:\\AutoCadSupporto\\Liberty\\DatiGPS.tkn")

    (setq ed1 nil)
    (while
        (= ed1 nil)
        (setq ed1 (entsel "\nSeleziona la Linea di riferimento : "))
    )

    (setq flagDati nil)

    (while (= FlagDati nil)
        (setq FlagDati (findfile "C:\\AutocadSupporto\\Dati\\DatiRilievo.dat"))
    )

    (if FlagDati
        (progn
	    (setq fp3 (open "C:\\AutocadSupporto\\Dati\\DatiRilievo.dat" "r"))
                (setq DataOdierna (read-line fp3))
                (setq Ora (read-line fp3))
                (setq Pdop (read-line fp3))
            (close fp3)
        )
    ) 

    (setq ed1 (entget (car ed1)))
    (setq txt1 (cdr (assoc 1 ed1)))
    (setq txt2 (cdr (assoc 10 ed1)))

    (setq Lung (strlen txt1))
    (setq LungNomeBase (- Lung 77))
    (setq NomePuntoBase (substr txt1 1 LungNomeBase))

    (setq Stazione nil)
    (setq NotaX nil)

    (startapp "C:\\AutocadSupporto\\Liberty\\Stazione.exe " "C:\\AutoCadSupporto\\Liberty\\Stazione.tkn") 

    (setq FlagControllo nil)

    (while (= FlagControllo nil)
        (setq FlagControllo (findfile "C:\\AutocadSupporto\\Note\\Nota.dat"))
    )

    (if FlagControllo
        (progn
            (princ "\n")
            (setq fp2 (open "C:\\AutocadSupporto\\Note\\Nota.dat" "r"))
	         (setq Stazione (read-line fp2))
                 (setq NotaX (read-line fp2)) 
            (close fp2)
        )
    )

    (setq pos1 (- (strlen txt1) 58))
    (setq xyz (substr txt1 pos1 34))
    (setq CxB (substr xyz 1 11))
    (setq CyB (substr xyz 13 10))
    (setq CzB (substr xyz 24 11))
    (setq CxBB (atof CxB))
    (setq CyBB (atof CyB))
    (setq CzBB (atof CzB))

    (setq Nota2 (strcat NomePuntoBase " - " NotaX " - " Stazione))
    (setq Riferimento (strcat "1|" Stazione "|" xyz "|0.000| WGS84-RTF2000] " Nota2 "|"))
    (setq SecondaLinea (strcat "6|L1|" DataOdierna "-" Ora "|RTK|PDOP=" Pdop "|"))

    (while
	(and (/= risp "S") (/= risp "N"))
	(prompt "\nDevo salvare i dati ? (S/N) : ")
	(setq risp (getstring))
	(setq risp (strcase risp))
    ) 

    (if (= risp "S")
        (progn
            (setq fp1 (open "C:\\AutocadSupporto\\Libretto\\LibrettoPregeo.dat" "a"))
                (write-line Riferimento fp1)
                (write-line SecondaLinea fp1)     
            (close fp1)
            (startapp "C:\\AutocadSupporto\\Liberty\\OK.exe " "C:\\AutoCadSupporto\\Liberty\\OK.tkn")
            (setq Riferimento nil)
            (setq SecondaLinea nil)
        )
     )

    (if (= risp "N")
        (startapp "C:\\AutocadSupporto\\Liberty\\No.exe " "C:\\AutoCadSupporto\\Liberty\\No.tkn")
    )

    (setq Ind "")
    (setq Indice(strcat Ind NomePuntoBase))
    (setq Primariga 1)
    ) ; fine
Continuo ad avere errori perché, penso, non riesco a fermare il programma lisp prima che il programma esterno faccia il suo compito.
Mi spiego meglio :
mi avvalgo di maschere scritte in una sorta di visual basic per l'input ed il salvataggio dei dati, i dati devono, poi essere letti dal lisp per proseguire.
Ho l'impressione che il lisp tenti di estrarre i dati presenti sul disco fisso prima che questi vengano salvati dl programma basic.
Tutti i tentativi fatti per evitare l'avanzamento del lisp se non dopo l'esecuzione del basic, sono stati inutili.
qualcuno ne sa qualcosa?
Grazie.
 

Cristallo

Utente Standard
Professione: Leggo e confronto
Software: Lettura critica
Regione: Fuori dalla cerchia
#2
Il lisp si ferma solo in caso di input da parte dell'utente.
Se chiedi di inserire un dato
(setq ed1 (entsel "\nSeleziona la Linea di riferimento : ")
il lisp si ferma in attesa dell'input utente, altrimenti il listato prosegue e ti va in errore se non trova i dati
 

GP.

Utente Senior
Professione: Nientologo
Software: uozapp
Regione: Vercelli
#3
Non si può fermare un lisp, ma si può dirgli di fare niente per un lasso di tempo.
Ad esempio questa sequenza lo fa "contare" per 2 secondi prima di proseguire...

(setq stop (+ 2000 (getvar 'millisecs)))
(while (> stop (getvar 'millisecs)))
 
Professione: Pensionato
Software: Autocad
Regione: Lombardia
#4
Perfetto,
il ritardo permette il corretto funzionamento, il sincronismo ora funziona, le variabili vengono regolarmente caricate.
La classe non è acqua!
 
Professione: Pensionato
Software: Autocad
Regione: Lombardia
#5
Ora ho riscontrato un'altro problema! (benedetto Autolisp)
Questo codice setta regolarmente i colori ma non i tipi linea che rimangono vincolati al layer corrente.
Codice:
    (cond

        ((= ColoreLinea "Rosso")
        (setvar "cecolor" "rosso"))

        ((= ColoreLinea "Nero")
        (setvar "cecolor" "bianco"))

        ((= ColoreLinea "Verde")
        (setvar "cecolor" "verde"))

        ((= TipoLinea "Continua")
        (setvar "celtype" "continua"))

        ((= TipoLinea "Tratteggiata")
        (setvar "celtype" "nascosta"))

        ((= TipoLinea "Punteggiata")
        (setvar "celtype" "puntox2"))

    )
Devo settare tutte le volte anche il piano o esiste un modo più semplice?.
Grazie.
 

GP.

Utente Senior
Professione: Nientologo
Software: uozapp
Regione: Vercelli
#6
La funzione cond si ferma quando trova la prima espressione corretta, ne devi creare due, una per il colore e una per il tipolinea.
 
Professione: Pensionato
Software: Autocad
Regione: Lombardia
#7
Grazie GP, avevo intuito il problema e lo messo già in atto.
C'è però ancora qualcosa che non funziona.
Le istruzioni :
(setvar "celtype" "continua")
(setvar "celtype" ".........")
vengono rifiutate da Autocad che segnala l'errore, non so come risolvere questo problema.
Grazie.
 
Professione: Pensionato
Software: Autocad
Regione: Lombardia
#9
Non capisco,
i colori si esprimono in italiano, i tipi di linea in inglese
comunque la linea "continuous" funziona quella "hidden" no"
Stramaledico il giorno in cui sono passato ad Autocad in italiano!