Cambiare lo stile di un testo

Angelo2449

Utente Junior
Professione: Pensionato
Software: Autocad
Regione: Lombardia
#1
Salve a tutti,
sto cercando di cambiare lo stile di un punto (testo) con un comando lisp ma ottengo sempre messaggi relativi a comandi sconosciuti e s errori ......
Questo è l'ultimo comando utilizzato (command "_change" Punto "" "" "_style" "Arial" "" "") ma non funziona.
Grazie.
 

Cristallo

Utente Standard
Professione: Leggo e confronto
Software: Lettura critica
Regione: Fuori dalla cerchia
#2
dipende Punto cosa è:
E' un testo? Sicuro?

Che messaggi d'errore restituisce?
Che tipo di testo è? Singola linea o multilinea?
 

Angelo2449

Utente Junior
Professione: Pensionato
Software: Autocad
Regione: Lombardia
#3
Si è un testo sicuro, questo è lo spezzone di codice interessato (dove Punto è rimpiazzato da PrimoDato)
Codice:
    (setq Lista nil)
    (while
        (= Lista nil)
        (setq Lista (entget (car (entsel)) '("Gruppo")))
    )

    (setq Xlist (assoc -3 Lista))
    (setq Txt1 (assoc 1 Lista))
    (setq PrimoDato (car Txt1))
    ........
    ........
    ........
    (command "_change" PrimoDato "" "" "" "" "" "" Stazione)
    (command "_change" PrimoDato "" "_p" "_c" "_blue" "")
Questo codice funziona, vorrei che PrimoDato, oltre a cambiare il colore in blue, cambiasse stile da Txt ad Arial, nel disegno, lo stile è già Arial.
Grazie.
 

rpor66

Utente Standard
Professione: Programmatore
Software: AutoCad, GstarCAD, CadWorx, Excel, Lisp, VBA
Regione: Sicilia
#4
(command "_change" PrimoDato "" "" "" "ARIAL" "" "" "")
 

Cristallo

Utente Standard
Professione: Leggo e confronto
Software: Lettura critica
Regione: Fuori dalla cerchia
#5
Se non riesci via change, allora la strada è quella di estrarre dall'entità il gruppo dello stile di testo
(setq oldstyle (assoc '7 (entget punto)))
(setq newstyle (cons '7 "Arial"))
(setq newpunto (cdr (subst newstyle oldstyle (entget punto))))
 

Angelo2449

Utente Junior
Professione: Pensionato
Software: Autocad
Regione: Lombardia
#6
Grazie,
secondo te a quale tipo di dato estratto dalla Lista dovrei applicare il codice (per te > punto <)..
Li ho provati quasi tutti ma non funziona.
 

Angelo2449

Utente Junior
Professione: Pensionato
Software: Autocad
Regione: Lombardia
#8
Ciao rpor66,
ho cambiato la logica della routine, ora non uso più il comando "change" per sostituire il testo esistente ma scrivo un nuovo testo esattamente nella posizione dove si trova l'esistente.
Dato che nel disegno è impostato lo stile "Arial", un nuovo testo dovrebbe essere scritto in questo stile.
Invece il testo è ancora nello stile "txt"!
Se invece scrivo un testo con il comando "TESTO normalmente, ottengo una stringa in stile "arial".
Un grosso problema invece, è quello rappresentato dal comportamento scostante della routine sicuramente in dipendenza dal modo in cui viene intercettato il testo selezionato.
Se lo Zoom è ad un certo valore, tutto funziona bene altrimenti il novo testo non viene scritto oppure non viene tracciato un cerchio insomma non è affidabile.
Posto qui l'intera routine, sono sicuro che troverai la soluzione ai problemi.
Codice:
(defun C:RIFERIMENTO (/ FC1 FC2 FC3 Controllo1 DataOdierna OraInizio OraFine Pdop fp3 Lista Txt1 NomeEntita Xlist PrimoDato TxtData NomePunto Ecef GaussBoaga Controllo1 fp2 NotaX Riferimento SecondaLinea risp Controllo3 fpr NewText fp1 fp5 Ind CNT Sistema NomeX NomeIntero TestoStazione)

    (setq osmode (getvar "osmode"))
    (if (= mode "ON")
       (if (> osmode 16384)
           (setvar "osmode" (- osmode 16384))
       )
    )

    (setq Riferimento nil)
    (setq Stazione nil)

    (if (= StatoRilievo 0)
        (progn
            (alert "Devi prima eseguire > IMPOSTARILIEVO <")
            (exit)
        )
    )

    (setq Baseline nil)
    (setq Incremento nil)
    (setq Sistema "")

    ;; ----------------------------------------------------------------

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

    (if FC3
        (progn
        (setq fp1 (open "C:\\AutocadSupporto\\Config\\Config.dat" "r"))
                (setq BaseLine (read-line fp1))
                (setq Incremento (read-line fp1))
                (setq Sistema (read-line fp1))
            (close fp1)
        )
    )

    (if (= Baseline nil)
    (progn
        (alert "Nome del Riferimento (Base Line) mancante!")
            (exit)
    )
    )

    (if (= Incremento nil)
    (progn
        (alert "Valore dell'Incremento mancante!")
            (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")
    )

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

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

    (setq Stazione "")
    (setq NotaX "")

    (setq Controllo1 nil)

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

    (if (/= Controllo1 nil)
        (progn
           (setq fp3 (open "C:\\AutocadSupporto\\Dati\\DatiRilievo.dat" "r"))
               (setq DataOdierna (read-line fp3))
               (setq OraInizio (read-line fp3))
               (setq OraFine (read-line fp3))
               (setq Pdop (read-line fp3))
               (setq Stazione (read-line fp3))
               (setq NotaX (read-line fp3))
           (close fp3)
        ); progn
    )

    (setq Lista nil)
    (while
        (= Lista nil)
        (setq Lista (entget (car (entsel)) '("Gruppo")))
    )

    (setq Xlist (assoc -3 Lista))
    (setq Punto1 (cdr (assoc 10 Lista)))
    (setq xd_ent (cdr (assoc -3 Lista)))
    (setq TxtData (car (cdr Xlist)))
    (setq Stringa (cdr TxtData))

    (setq Txt1 (assoc 1 Lista))
    (setq PrimoDato (car Txt1))

    (princ "\n")
    (princ "Lista   >>>>>> ")
    (princ Lista)

    (princ "\n")
    (princ "Stringa   >>>>>> ")
    (princ Stringa)

    (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 CxB (substr Ecef 1 11))
    (setq CyB (substr Ecef 13 11))
    (setq CzB (substr Ecef 25 11))
    (setq CxBB (atof CxB))
    (setq CyBB (atof CyB))
    (setq CzBB (atof CzB))

    (setq Nota2 (strcat NomeX NotaX " - " Stazione))
    (setq Riferimento (strcat "1|" Stazione "|" Ecef "|0.000|[WGS84-RTF2000] " Nota2 "|"))
    (setq SecondaLinea (strcat "6|L1|" DataOdierna "-" OraInizio "|" DataOdierna "-" OraFine "|RTK|PDOP=" Pdop "|"))

    (setq NomeIntero (strcat Nomex " - " Stazione))
    (setq TestoStazione (strcat Stazione " - (se stesso)"))

    (command "_circle" GaussBoaga "0.15" "")

    (setq Stazione Baseline)
    (command "_text" Punto1 0.40 0 Stazione)
    (command "_change" "_last" "" "_p" "_c" "_blue" "")
    ;(command "_change" "_last" "" "" "" "ARIAL" "" "" "")

    ;; ------------------------------------------------------------------------------

       (setq NomeEntita (entlast))

       (setq Oggetto "Gruppo")
    
       (if (not (tblsearch "APPID" Oggetto))
           (regapp Oggetto)
       )
 
       (setq OldList (entget NomeEntita))

       (setq NP (assoc 1 OldList))
       (setq NomePunto (cdr NP))
       (setq XYZ (cdr (assoc 10 OldList)))
       (setq GaussBoaga (strcat (rtos (car XYZ)) "," (rtos (cadr XYZ))))

       (setq TheData (list -3 (list Oggetto (cons 1000 NomePunto) (cons 1000 "Punto celerimetrico 2d") (cons 1000 Quota)(cons 1000 "---------------") (cons 1000 GaussBoaga) (cons 1000 Stazione) (cons 1000 "Non definito"))))

       (setq NewList (append OldList (list TheData)))
       (entmod NewList)

    ;; ------------------------------------------------------------------------------

    (setq fp1 (open "C:\\AutocadSupporto\\Libretto\\LibrettoPregeo.dat" "a"))
    (write-line Riferimento fp1)
        (write-line SecondaLinea fp1)     
    (close fp1)

    (setq fp5 (open "C:\\AutocadSupporto\\Contatori\\Counter.dat" "w"))
    (write-line Baseline fp5)
        (write-line Incremento fp5)
    (close fp5)

    (setq Ind "x")
    (setq Indice (strcat Ind NomeX))
    (setq Primariga 1)
    (command "_circle" Punto1 "1.00")

    (alert "Dati Base Line memorizzati - Pronto per inserimento Punti")
) ;; defun
Grazie
 

Angelo2449

Utente Junior
Professione: Pensionato
Software: Autocad
Regione: Lombardia
#9
Tutto superato,
avevo dimenticato la piccola routine all'inizio

Codice:
(setq osmode (getvar "osmode"))
    (if (= mode "ON")
       (if (> osmode 16384)
           (setvar "osmode" (- osmode 16384))
       )
    )
L'ho sostituita con (setvar "osmode" 16384) e tutto è ritornato normale.
Grazie.
 

Angelo2449

Utente Junior
Professione: Pensionato
Software: Autocad
Regione: Lombardia
#10
Ciao rpor66,
ora che la routine funziona, mi trovo le due stringhe sovrapposte ovvero,
Codice:
(defun C:RIFERIMENTO (/ FC1 FC2 FC3 Controllo1 DataOdierna OraInizio OraFine Pdop fp3 Lista Txt1 NomeEntita Xlist PrimoDato TxtData NomePunto Ecef GaussBoaga Controllo1 fp2 NotaX Riferimento SecondaLinea risp Controllo3 fpr NewText fp1 fp5 Ind CNT Sistema NomeX NomeIntero TestoStazione)

    (setvar "osmode" 16384)

    (setq Riferimento nil)
    (setq Stazione nil)

    (if (= StatoRilievo 0)
        (progn
            (alert "Devi prima eseguire > IMPOSTARILIEVO <")
            (exit)
        )
    )

    ;; ----------------------------------------------------------------

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

    (if FC3
    (progn
            (setq fp5 (open "C:\\AutocadSupporto\\Config\\Config.dat" "r"))
            (setq ValoreBaseline (read-line fp5))
            (setq ValoreIncremento (read-line fp5))
            (setq TipoAngolo (read-line fp5))
            (setq AltezzaScritte (read-line fp5))
            (setq ValoreRaggio (read-line fp5))
            (close fp5)
    )
    )

    (if (= ValoreBaseline nil)
    (progn
        (alert "Nome del Riferimento (Base Line) mancante!")
            (exit)
    )
    )

    (if (= ValoreIncremento nil)
    (progn
        (alert "Valore dell'Incremento mancante!")
            (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")
    )

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

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

    (setq Stazione "")
    (setq NotaX "")

    (setq Controllo1 nil)

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

    (if (/= Controllo1 nil)
        (progn
           (setq fp3 (open "C:\\AutocadSupporto\\Dati\\DatiRilievo.dat" "r"))
               (setq DataOdierna (read-line fp3))
               (setq OraInizio (read-line fp3))
               (setq OraFine (read-line fp3))
               (setq Pdop (read-line fp3))
               (setq Stazione (read-line fp3))
               (setq NotaX (read-line fp3))
           (close fp3)
        ); progn
    )

    (setq Lista nil)
    (while
        (= Lista nil)
        (setq Lista (entget (car (entsel)) '("Gruppo")))
    )

    (setq Xlist (assoc -3 Lista))
    (setq Punto1 (cdr (assoc 10 Lista)))
    (setq xd_ent (cdr (assoc -3 Lista)))
    (setq TxtData (car (cdr Xlist)))
    (setq Stringa (cdr TxtData))

    (setq Txt1 (assoc 1 Lista))
    (setq PrimoDato (car Txt1))

    (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 CxB (substr Ecef 1 11))
    (setq CyB (substr Ecef 13 11))
    (setq CzB (substr Ecef 25 11))
    (setq CxBB (atof CxB))
    (setq CyBB (atof CyB))
    (setq CzBB (atof CzB))

    (setq Nota2 (strcat NomeX NotaX " - " Stazione))
    (setq Riferimento (strcat "1|" Stazione "|" Ecef "|0.000|[WGS84-RTF2000] " Nota2 "|"))
    (setq SecondaLinea (strcat "6|L1|" DataOdierna "-" OraInizio "|" DataOdierna "-" OraFine "|RTK|PDOP=" Pdop "|"))

    (setq NomeIntero (strcat Nomex " - " Stazione))
    (setq TestoStazione (strcat Stazione " - (se stesso)"))

    ;; ------------------------------------------------------------------------------

    (command "_circle" GaussBoaga "0.15" "")

    (setq Stazione ValoreBaseline)
    (command "_text" Punto1 0.40 0 Stazione)
    (command "_change" "_last" "" "_p" "_c" "_blue" "")

    ;; ------------------------------------------------------------------------------

       (setq NomeEntita (entlast))

       (setq Oggetto "Gruppo")
    
       (if (not (tblsearch "APPID" Oggetto))
           (regapp Oggetto)
       )
 
       (setq OldList (entget NomeEntita))

       (setq NP (assoc 1 OldList))
       (setq NomePunto (cdr NP))
       (setq XYZ (cdr (assoc 10 OldList)))
       (setq GaussBoaga (strcat (rtos (car XYZ)) "," (rtos (cadr XYZ))))

       (setq TheData (list -3 (list Oggetto (cons 1000 NomePunto) (cons 1000 "Vertice Iniziale Base Line") (cons 1000 Quota)(cons 1000 "---------------") (cons 1000 GaussBoaga) (cons 1000 Stazione) (cons 1000 "Non definito"))))

       (setq NewList (append OldList (list TheData)))
       (entmod NewList)

    ;; ------------------------------------------------------------------------------

    (setq fp1 (open "C:\\AutocadSupporto\\Libretto\\LibrettoPregeo.dat" "a"))
    (write-line Riferimento fp1)
        (write-line SecondaLinea fp1)     
    (close fp1)

    (setq fp5 (open "C:\\AutocadSupporto\\Contatori\\Counter.dat" "w"))
    (write-line ValoreBaseline fp5)
        (write-line ValoreIncremento fp5)
        (write-line TipoAngolo fp5)
        (write-line AltezzaScritte fp5)
        (write-line ValoreRaggio fp5)
    (close fp5)

    (setq Ind "x")
    (setq Indice (strcat Ind NomeX))
    (setq Primariga 1)
    (command "_circle" Punto1 "1.00")

    (alert "Dati Base Line memorizzati - Pronto per inserimento Punti")
) ;; defun

) ; fine funzione STAZIONECELERIMETRICA
Vorrei cancellare il Punto selezionato con > (setq Lista (entget (car (entsel)) '("Gruppo"))) <.
Ho provato in tutti i modi ma non riesco ad intercettarlo e quindi cancellalorlo.
Grazie.