Controllo Input

Angelo2449

Utente Junior
Professione: Pensionato
Software: Autocad
Regione: Lombardia
#1
Salve a tutti,
in questo codice :
Codice:
    (repeat 10

        (setq Cont (1+ Cont))

        (setq Titolo1 (strcat "Seleziona il Nome del Punto " (itoa Cont)))
        (setq ed1 (entsel (strcat "\n" Titolo1)))

        (setq Lista (entget (car ed1) '("Gruppo")))
        (setq Xlist (assoc -3 Lista))
        (setq TxtData (car (cdr Xlist)))

        (if (= Xlist nil)
            (alert "La stringa selezionata non è idonea, non sono associati dati estesi!")
        )

        (setq Stringa (cdr TxtData))
        (setq NomeX (cdr (nth 1 TxtData)))   
        (setq TipoPunto (cdr (nth 2 TxtData)))
        (setq Quota (cdr (nth 3 TxtData)))
        (setq Ecef (cdr (nth 4 TxtData)))
        (setq GaussBoaga (cdr (nth 5 TxtData)))
        (setq ControlloStz (cdr (nth 6 TxtData)))
        (setq ControlloPt (cdr (nth 7 TxtData)))
    );;repeat
vorrei che il messaggio di controllo dell'idoneità della stringa non interrompesse il loop (repeat) e mi permettesse di proseguire selezionando un punto idoneo.
Grazie moltissime.
 

meccanicamg

Utente Senior
Professione: ♔ Technical manager - Mechanical engineer ♚
Software: SolidWorks, DraftSight, Me10, Freecad, KissSoft, Excel
Regione: Lombardia
#2
Si potrebbe nella scelta "else" al posto di interrompere ricopiare il codice usato nell' "if" con un messaggio diverso.
Praticamente é il codice uguale dentro se stesso, gli cambierai messaggio con scritto "non hai un punto idoneo, riprova".....
 

meccanicamg

Utente Senior
Professione: ♔ Technical manager - Mechanical engineer ♚
Software: SolidWorks, DraftSight, Me10, Freecad, KissSoft, Excel
Regione: Lombardia
#4
Con il lisp non ho più a che fare da tempo....
Tu hai un ciclo "ripeti" che viene ripetuto affinché la condizione é vera, mentre se é falsa ecco che compare il messaggio e si blocca.
Se non vuoi farlo bloccare cambia condizione di fine ciclo.
 

rpor66

Utente Standard
Professione: Programmatore
Software: AutoCad, GstarCAD, CadWorx, Excel, Lisp, VBA
Regione: Sicilia
#5
Salve a tutti,
in questo codice :
Codice:
    (repeat 10

        (setq Cont (1+ Cont))

        (setq Titolo1 (strcat "Seleziona il Nome del Punto " (itoa Cont)))
        (setq ed1 (entsel (strcat "\n" Titolo1)))

        (setq Lista (entget (car ed1) '("Gruppo")))
        (setq Xlist (assoc -3 Lista))
        (setq TxtData (car (cdr Xlist)))

        (if (= Xlist nil)
           (alert "La stringa selezionata non è idonea, non sono associati dati estesi!")
           (progn
              (setq Stringa (cdr TxtData))
              (setq NomeX (cdr (nth 1 TxtData)))  
              (setq TipoPunto (cdr (nth 2 TxtData)))
              (setq Quota (cdr (nth 3 TxtData)))
              (setq Ecef (cdr (nth 4 TxtData)))
              (setq GaussBoaga (cdr (nth 5 TxtData)))
              (setq ControlloStz (cdr (nth 6 TxtData)))
              (setq ControlloPt (cdr (nth 7 TxtData)))
          ); else
       );if
    );;repeat
ok?
 

GP.

Utente Senior
Professione: Nientologo
Software: uozapp
Regione: Vercelli
#6
Credo invece voglia questo:
- nella scelta del punto ripropone il numero precedente se lo stesso è risultato inidoneo
- incrementa il contatore dei cicli (step) solo se il punto è idoneo

Codice:
    (setq step 10)  ;IMPOSTARE QUI IL NUMERO DI CICLI

    (while
        (progn
            (setq Cont (1+ Cont))
            (setq Titolo1 (strcat "Seleziona il Nome del Punto " (itoa Cont)))
            (setq ed1 (entsel (strcat "\n" Titolo1)))
            (setq Lista (entget (car ed1) '("Gruppo")))
            (setq Xlist (assoc -3 Lista))
            (setq TxtData (car (cdr Xlist)))
            (if (= Xlist nil)
                (progn
                    (alert "La stringa selezionata non è idonea, non sono associati dati estesi!")
                    (setq cont (1- cont))
                )
                (progn
                    (setq Stringa (cdr TxtData))
                    (setq NomeX (cdr (nth 1 TxtData))) 
                    (setq TipoPunto (cdr (nth 2 TxtData)))
                    (setq Quota (cdr (nth 3 TxtData)))
                    (setq Ecef (cdr (nth 4 TxtData)))
                    (setq GaussBoaga (cdr (nth 5 TxtData)))
                    (setq ControlloStz (cdr (nth 6 TxtData)))
                    (setq ControlloPt (cdr (nth 7 TxtData)))
                    (setq step (1- step))
                )
            )
            (not (zerop step))
        )
    )
 

rpor66

Utente Standard
Professione: Programmatore
Software: AutoCad, GstarCAD, CadWorx, Excel, Lisp, VBA
Regione: Sicilia
#7
Le soluzioni le ha tutte, ora tocca a Lui farci sapere. Bye
 

Angelo2449

Utente Junior
Professione: Pensionato
Software: Autocad
Regione: Lombardia
#8
Grazie rpor66,
ho riscritto il codice :
Codice:
    (setq Xlist nil)

    (repeat 1000

        (while (and (= ed3 nil) (= edx 0))
            (setq Cont (1+ Cont))
            (setq ContUno (1+ ContUno))
        (setq Titolo1 (strcat "Seleziona il Nome del Punto " (itoa Cont)))
        (setq ed3 (entsel (strcat "\n" Titolo1)))
        (setq ed1 ed3)

            (if (= ed3 nil)  ;; ---------------------------------------------
                (progn
                    (setq ContornoStr (vl-string-trim " " ContornoStr))
                    (setq fp1 (open "C:\\AutocadSupporto\\Contorni\\Stringa.dat" "a"))
                       (write-line ContornoStr fp1)
                    (close fp1)

                    (setq fp2 (open "C:\\AutocadSupporto\\Contorni\\ElencoPunti.dat" "w"))
                       (write-line SommaPunti fp2)
                    (close fp2)

                    (startapp "C:\\AutocadSupporto\\Liberty\\SiNo7.exe " "C:\\AutocadSupporto\\Liberty\\SiNo7.tkn")
            
                    (setq Controllo1 nil)
                    (while (= Controllo1 nil)
                        (setq Controllo1 (findfile "C:\\AutocadSupporto\\Dati\\Risposta.dat"))
                    );;while

                    (setq Risposta nil)
                    (while (= Risposta nil)
                        (setq fp1 (open "C:\\AutocadSupporto\\Dati\\Risposta.dat" "r"))
                            (setq CodColor (read-line fp1))
                            (setq CodLinea (read-line fp1))
                            (setq Risposta (read-line fp1))
                        (close fp1)
                    );;while

                    (princ "\n")
                    (princ "Risposta >>>>>>> ")
                    (princ Risposta)
                    (princ "\n")

                (if (= Risposta "SI")
                        (progn            ;; Si
                            (setq Salvato (strcat "Contorno salvato (" (itoa (- ContUno 1)) ") Punti"))
                            (alert Salvato)
                            (exit)
                );;progn
                );;if

                (if (= Risposta "NO")
                (setq Cont (1- Cont))
                (setq ContUno (1- ContUno))
                    );;if
                 );;progn

            );;if -----------------------

        );;while

        (princ "\n")
        (princ "ed1 >>>>> ")
        (princ ed1)
        (princ "\n")

        (setq Lista (entget (car ed1) '("Gruppo")))
        (setq Xlist (assoc -3 Lista))

        (if (= Xlist nil)
            (progn
                (alert "L'elemento selezionato non è idoneo, non sono associati dati estesi!")
                (setq Cont (1- Cont))
            );;progn

            (progn                    ;;else
               (setq TxtData (car (cdr Xlist)))
            (setq Stringa (cdr TxtData))
            (setq NomeX (cdr (nth 1 TxtData)))
            (setq TipoPunto (cdr (nth 2 TxtData)))
            (setq Quota (cdr (nth 3 TxtData)))
            (setq Ecef (cdr (nth 4 TxtData)))
            (setq GaussBoaga (cdr (nth 5 TxtData)))
            (setq ControlloStz (cdr (nth 6 TxtData)))
            (setq ControlloPt (cdr (nth 7 TxtData)))

            (setq Pos1 (vl-string-search "(" NomeX 1))
            (setq NomePunto (substr NomeX 1 (- Pos1 1)))

            (if (> (rem Cont 2) 0)                        ;; se dispari
                    (progn
                    (setq Caso 1)
                        (princ Caso)
                        (if (= Cont 1)                ;; se alla prima selezione
                            (progn
                                (setq Gb1 GaussBoaga)
                                (setq ContornoStr NomePunto)
                            );;progn
                            (progn                ;; selezioni oltre la prima
                                (setq Gb3 Gb2)            ;; copia Gb2 in Gb3
                                (setq Gb4 GaussBoaga)
                                (command "_line" Gb3 Gb4 "")
                                (command "_change" "_last" "" "_p" "_layer" "Rosso" "")
                                (setq Gb3 Gb4)
                                (setq ContornoStr (strcat ContornoStr "|" NomePunto))
                                (setq SommaPunti (strcat SommaPunti "-" GaussBoaga))
                            );;;progn
                        );;if
                    );progn
               );;if

               (if (= (rem Cont 2) 0)                  ;; se pari
                   (progn       
                    (setq Caso 2)
                    (princ Caso)
                    (if (= Cont 2)                ;; se alla seconda selezione
                            (progn
                                (setq Gb2 GaussBoaga)
                                (command "_line" Gb1 Gb2 "")
                                (command "_change" "_last" "" "_p" "_layer" "Rosso" "")
                                (setq ContornoStr (strcat ContornoStr "|" NomePunto))
                                (setq SommaPunti (strcat SommaPunti "-" GaussBoaga))
                            );;progn
                            (progn
                            (setq Gb2 GaussBoaga)
                            (command "_line" Gb2 Gb3 "")
                (command "_change" "_last" "" "_p" "_layer" "Rosso" "")
                            (setq ContornoStr (strcat ContornoStr "|" Nomepunto))
                            (setq SommaPunti (strcat SommaPunti "-" GaussBoaga))
                            );;progn
                    );;if
                    );progn
            );;if

            (princ "\n")
            (princ "ContornoStr >>>>>> ")
            (princ ContornoStr)
            (princ "\n")

            (if (= Cont 10)
                (progn
                    (setq fp1 (open "C:\\AutocadSupporto\\Contorni\\Stringa.dat" "a"))
                        (write-line ContornoStr fp1)
                    (close fp1)
                    (setq Cont 0)
                    (setq ContornoStr "")
                    );;progn
            );;if

            (setq ed1 nil)
            (setq ed3 nil)

            (setq IntLibretto 1)        ;; SiNo7.exe scrive in LibrettoPregeo
            (setq IntGrafica (* (- ContUno 1) 2))
            (setq IntEstesi 0)

            (princ "\n")
            (princ "IntGrafica >>>>> ")
            (princ IntGrafica)
            (princ "\n")
            );;progn
        );;if
    );;repeat
Ora l'input viene controllato da : (if (= Xlist nil)
ma il caso di Xlist = nil , inizia un loop che non riesco a terminare se non agendo tramite la Gestione Attività di Windows 10.
Viene sempre esposto : "L'elemento selezionato non è idoneo, non sono associati dati estesi!" e non c'è
modo di continuare.
Penso comunque che la soluzione non sia valida in quanto questo controllo viene esercitato nel caso si selezioni un elemento grafico come una linea ma non se la selezione riguarda un testo qualsiasi.
Riassumendo quindi :
- la selezione deve riguardare un elemento testo che abbia i dati estesi.
- deve essere rifiutata ogni altro tipo di selezione.
- in caso di selezione sbagliata, il loop di scelta, dopo il messaggio di errore, deve continuare.
- in caso di selezione nulla, il loop si interrompe e viene posta la domanda.
Penso che il controllo debba essere esercitato subito sull'elemento selezionato (ed3).
Come?
Grazie.