TuttoCAD Forum

TuttoCAD Forum
[ Home | Registrati | Discussioni Attive | Discussioni Recenti | Segnalibro | Msg privati | Sondaggi Attivi | Utenti | Album Fotografico | Download | | Cerca | FAQ ]
Nome Utente:
Password:
Salva Password
Password Dimenticata?

 Tutti i Forum
 1 - TuttoCAD Software
 AutoLISP
 grread
 Nuova Discussione  Rispondi
 Versione Stampabile Bookmark this Topic Aggiungi Segnalibro
I seguenti utenti stanno leggendo questo Forum Qui c'è:
Autore Discussione Precedente Discussione Discussione Successiva  

Marsetti Alex
Utente


Regione: Veneto
Prov.: Vicenza
Città: Malo


17 Messaggi

Inserito il - 14 ottobre 2014 : 22:32:54  Mostra Profilo Invia a Marsetti Alex un Messaggio Privato  Rispondi Quotando
Buonasera.
Scrivo sul forum per condividere una parte di codice sul'uso della funzione "grread" per leggere dati da un input (mouse, tastiera) e salvarne il valore nella variabile "input".

Questo codice non svolge alcuna funzione, ma il valore di "input" può essere utilizzato per realizzare svariati programmi "grafici", ad es. selezionare un testo e ruotarlo dinamicamente verso il punto in cui il puntatore è posizionato in ogni momento.
Si nota che in questo codice ho inserito una funzione di lettura dei messaggi d'errore, che consente di premere il tasto ESC senza interrompere l'esecuzione del programma, ma solo del ciclo while.

(while ;() senza condizione
(progn
(setq input (vl-catch-all-apply 'grread (list T (+ 1 2 8) 0)))
(cond
;pressione esc (uscita)
(
(vl-catch-all-error-p input)
nil
)
;movimento cursore (rimane)
(
(= 5 (car input))
nil
)
;pressione tastiera (uscita)
(
(= 2 (car input))
nil
)
;click mouse (uscita)
(
(= 3 (car input))
nil
)
)
)
)

Il problema che pone questa funzione è l'impossibilità di poter selezionare uno snap sul disegno, ma solo un punto derivato dal click sinistro del mouse. Vorrei approfondire la questione e chiedervi se conoscete un metodo per "attivare" gli snap durante l'uso.

Vi allego anche una porzione di codice di questa medesima funzione utile per selezionare oggetti (ricavando gli estremi del riquadro di selezione) impedendo che l'utente possa premere ESC per interrompere tutto il vostro programma.

Grazie delle future risposte.

;primo punto selezione
(princ "\nSpecificare primo punto della finestra di selezione: ")
(while ;() senza condizione (accetta t / nil)
(progn
(setq input (vl-catch-all-apply 'grread (list T (+ 1 2 8) 0)))
(cond
;pressione esc (uscita)
(
(vl-catch-all-error-p input)
nil
)
;movimento cursore (rimane)
(
(= 5 (car input))
t
)
;pressione tastiera (rimane)
(
(= 2 (car input))
t
)
;click mouse (uscita)
(
(= 3 (car input))
(setq p1 (nth 0 (cdr input)))
nil
)
)
)
)

;secondo punto selezione
(if (AND (/= p1 nil) (listp input))
(progn
(princ "\nSpecificare secondo punto della finestra di selezione: ")
(while ;() senza condizione (accetta t / nil)
(progn
(setq input (vl-catch-all-apply 'grread (list T (+ 1 2 8) 0)))
(cond
;pressione esc (uscita)
(
(vl-catch-all-error-p input)
nil
)
;movimento cursore (rimane)
(
(= 5 (car input))
(redraw)
(grdraw p1 (list (car (nth 0 (cdr input))) (cadr p1)) 2 1)
(grdraw p1 (list (car p1) (cadr (nth 0 (cdr input)))) 2 1)
(grdraw (nth 0 (cdr input)) (list (car (nth 0 (cdr input))) (cadr p1)) 2 1)
(grdraw (nth 0 (cdr input)) (list (car p1) (cadr (nth 0 (cdr input)))) 2 1)
t
)
;pressione tastiera (rimane)
(
(= 2 (car input))
t
)
;click mouse (uscita)
(
(= 3 (car input))
(setq p2 (nth 0 (cdr input)))
nil
)
)
)
)
(redraw)
)
)

;l'utente può interrompere esclusivamente questa parte del codice.
;i punti p1 e p2 sono gli estremi della selezione
;es. (ssget "_C" p1 p2)

GP
Utente Master


Regione: Piemonte
Prov.: Vercelli


2776 Messaggi

Inserito il - 15 ottobre 2014 : 12:31:27  Mostra Profilo Invia a GP un Messaggio Privato  Rispondi Quotando
Alex, quando inserisci un listato sarebbe meglio utilizzare l'opzione codice (#)in maniera da preservare l'indentazione e rendere più leggibile le funzioni del programma.



Si utilizza la funzione (osnap) di AutoLISP

Nell'esempio sottostante il codice utilizza GRREAD per spostare un testo "dinamicamente" con OSNAP MED tramite la funzione MIDvectors
;--------------------------------------------------------------------
(defun c:test ( / testo DCA pt pt2)
    (setq testo (vlax-ename->vla-object
                    (car (entsel "\nScegliere testo: "))
                )
    )
    (setq DCA (* (atoi (getenv "AutoSnapSize")) 0.002))
    (while (= (car (setq pt (grread T 15 0))) 5)
        (redraw)
        (setq pt2 (osnap (cadr pt) "_mid"))
        (if pt2
            (progn
                (vla-put-InsertionPoint testo (vlax-3d-point pt2))
                (MIDvectors pt2 2)
            )
            (vla-put-InsertionPoint testo (vlax-3d-point (cadr pt)))
        )
    )
    (redraw)
)

;--------------------------------------------------------------------
;Disegno dei vettori del contrassegno di OSNAP MED
;Gian Paolo Cattaneo
(defun MIDvectors (pt: color /  L L- c1 c2 *1 *2 *3 *4 *5 *6 *7 *8 *9 *10 *11 *12)
    (setq L  (* DCA (getvar 'viewsize))
          L+ (* 1.2 L) 
          *1 (polar pt: (/ pi 2) L)
          *2 (polar pt: 3.665 L)
          *3 (polar pt: 5.759 L)
          *4 (polar pt: (/ pi 2) L+)
          *5 (polar pt: 3.665 L+)
          *6 (polar pt: 5.759 L+)
    )
    (grvecs (list color *1 *2 *2 *3 *3 *1))
    (grvecs (list color *4 *5 *5 *6 *6 *4))

    (princ)
)





Possono essere impostati tutti i tipi di OSNAP, anche prelevandoli da OSMODE corrente:





Questa discussione può aiutare:
http://www.cadtutor.net/forum/showthread.php?82662-Rectangle-lisp.Little-help-!&p=565520&viewfull=1#post565520

Modificato da - GP in data 15 ottobre 2014 14:41:35
Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 15 ottobre 2014 : 14:08:12  Mostra Profilo Invia a Terminator un Messaggio Privato  Rispondi Quotando
Cos' com'è non funziona, dovresti chiamare la funzione MIDvector allo stesso modo sia nel defun che nel richiamo all'interno del programma.
Torna all'inizio della Pagina

GP
Utente Master


Regione: Piemonte
Prov.: Vercelli


2776 Messaggi

Inserito il - 15 ottobre 2014 : 14:43:31  Mostra Profilo Invia a GP un Messaggio Privato  Rispondi Quotando
Ho modificato il lisp, prova ora, avevo cambiato il nome alla funzione da MIDerctor a MIDvectors

Sorry.
Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 15 ottobre 2014 : 15:13:50  Mostra Profilo Invia a Terminator un Messaggio Privato  Rispondi Quotando
No, no, avevo già provato a rinominare e funzionava. Era solo un'indicazione per l'autore del post, se non fosse riuscito a venire a capo del perché non funzionava...

PS: bellissimi i mini-video tutorial stile Lee Mac!
Torna all'inizio della Pagina

arri
Utente Master


Regione: Lombardia


14951 Messaggi

Inserito il - 27 ottobre 2014 : 10:28:48  Mostra Profilo Invia a arri un Messaggio Privato  Rispondi Quotando
Messaggio inserito da Terminator

PS: bellissimi i mini-video tutorial stile Lee Mac!

sarebbe bello (e molto utile per tutti) sapere quale programma usa per crearli

Torna all'inizio della Pagina

GP
Utente Master


Regione: Piemonte
Prov.: Vercelli


2776 Messaggi

Inserito il - 27 ottobre 2014 : 11:39:52  Mostra Profilo Invia a GP un Messaggio Privato  Rispondi Quotando
Il programma è Camtasia.

Visto l'interesse dell'autore del thread mi viene quasi voglia di cancellare tutto.
Torna all'inizio della Pagina

arri
Utente Master


Regione: Lombardia


14951 Messaggi

Inserito il - 27 ottobre 2014 : 11:49:04  Mostra Profilo Invia a arri un Messaggio Privato  Rispondi Quotando
Messaggio inserito da GP

Il programma è Camtasia.

Visto l'interesse dell'autore del thread mi viene quasi voglia di cancellare tutto.


grazie GP !



Ti comprendo, ma non cancellarlo,
può essere utile ad altri utenti

Torna all'inizio della Pagina

Marsetti Alex
Utente


Regione: Veneto
Prov.: Vicenza
Città: Malo


17 Messaggi

Inserito il - 03 novembre 2014 : 15:49:36  Mostra Profilo Invia a Marsetti Alex un Messaggio Privato  Rispondi Quotando
Il post voleva essere una semplice spiegazione di un listato, ho solo chiesto informazioni sull'uso degli snap e ho letto le risposte. Non capisco quale altro interesse avrei dovuto mostrare.
Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 03 novembre 2014 : 16:52:45  Mostra Profilo Invia a Terminator un Messaggio Privato  Rispondi Quotando
Messaggio inserito da Marsetti Alex

Il post voleva essere una semplice spiegazione di un listato, ho solo chiesto informazioni sull'uso degli snap e ho letto le risposte. Non capisco quale altro interesse avrei dovuto mostrare.



Forse un cenno di ringraziamento da parte tua nei confronti di GP, dal momento che la sua risposta sugli osnap è arrivata il giorno dopo e tu dopo due settimane ancora non ti eri fatto vivo. Vedi, caro Alex, qui la gente fa tutto gratis e il grazie è la moneta più economica. Se anche leviamo quella...
Torna all'inizio della Pagina

Marsetti Alex
Utente


Regione: Veneto
Prov.: Vicenza
Città: Malo


17 Messaggi

Inserito il - 03 novembre 2014 : 18:52:25  Mostra Profilo Invia a Marsetti Alex un Messaggio Privato  Rispondi Quotando
Il ringraziamento a tutte le risposte c'era già all'inizio del post, e come in tutti i miei post, ho sempre ringraziato in anticipo le persone che hanno risposto.
Non vedo quale sia il problema, ma se il fatto che non abbia ringraziato ancora è cosi importante, ringrazio ancora chi ha risposto alla mia domanda.
Torna all'inizio della Pagina

arri
Utente Master


Regione: Lombardia


14951 Messaggi

Inserito il - 04 novembre 2014 : 15:11:11  Mostra Profilo Invia a arri un Messaggio Privato  Rispondi Quotando
Messaggio inserito da Marsetti Alex

Il ringraziamento a tutte le risposte c'era già all'inizio del post, e come in tutti i miei post, ho sempre ringraziato in anticipo le persone che hanno risposto.
Non vedo quale sia il problema, ma se il fatto che non abbia ringraziato ancora è cosi importante, ringrazio ancora chi ha risposto alla mia domanda.


ringraziare in anticipo non ha senso,

chi ti risponde dedica del tempo e (come ha scritto Terminator),

si aspetta un cenno di ringraziamento dopo.

Torna all'inizio della Pagina
  Discussione Precedente Discussione Discussione Successiva  
 Nuova Discussione  Rispondi
 Versione Stampabile Bookmark this Topic Aggiungi Segnalibro
Vai a:
TuttoCAD Forum © 2001-2010 CADLandia Torna all'inizio della Pagina
Pagina generata in 0,73 secondi.