Evitare l'avanzamento del lisp

Angelo2449

Utente Junior
professione: Pensionato
software: Autocad
regione: Lombardia
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
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
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)))
 

Angelo2449

Utente Junior
professione: Pensionato
software: Autocad
regione: Lombardia
Perfetto,
il ritardo permette il corretto funzionamento, il sincronismo ora funziona, le variabili vengono regolarmente caricate.
La classe non è acqua!
 

Angelo2449

Utente Junior
professione: Pensionato
software: Autocad
regione: Lombardia
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
La funzione cond si ferma quando trova la prima espressione corretta, ne devi creare due, una per il colore e una per il tipolinea.
 

Angelo2449

Utente Junior
professione: Pensionato
software: Autocad
regione: Lombardia
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.
 

Angelo2449

Utente Junior
professione: Pensionato
software: Autocad
regione: Lombardia
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!
 

Statistiche forum

Discussioni
59,343
Messaggi
506,805
Utenti registrati
111,663
Ultimo utente registrato
GEOSCAN

Utenti online

Nessun utente è online al momento.
Top