Autore |
Discussione  |
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 07 novembre 2014 : 13:50:58
|
Bene, allora studiati questa funzione e comprendi perché è stata strutturata in questo modo. E' la funzione che traccia i rettangoli distanziati.
(defun rett (pezzi nome lunghezza larghezza / taglio P1 P2 P3)
(setq P1 (list 0 0) coox 0)
(repeat pezzi
(setvar "CMDECHO" 0)
(setvar "OSNAPCOORD" 1)
(setvar "BLIPMODE" 0)
(setvar "OSMODE" 63)
(setq taglio 20)
(setq P2 (polar P1 0 (+ taglio lunghezza)))
(setq P3 (polar P2 (* (/ pi 2) 3) (+ taglio larghezza)))
(vl-cmdf "_RECTANG" P1 P3)
(vl-cmdf "_TEXT" "_J" "M" (polar P1 (angle P1 P3)(/ (distance P1 P3) 2)) "" "" (strcat nome " " (rtos lunghezza 5) " " (rtos larghezza 5)))
(setq P1 (list (setq coox(+ coox (+ lunghezza taglio (/ lunghezza 10)))) 0))
)
(princ)
)
Per quanto riguarda la variabile del testo, aspettiamo l'intervento di arri, che molto probabilmente lo sa... |
 |
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 07 novembre 2014 : 13:54:31
|
Oops, battuto sul tempo, comunque, mi dispiace arri, anche se setto la variabile TEXTSIZE, se nello stile non ho l'altezza impostata, me la chiede. |
 |
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 07 novembre 2014 : 14:01:07
|
Messaggio inserito da Terminator
Oops, battuto sul tempo, comunque, mi dispiace arri, anche se setto la variabile TEXTSIZE, se nello stile non ho l'altezza impostata, me la chiede.
sono arruginito
  |
 |
|
GP
Utente Master
Regione: Piemonte
Prov.: Vercelli
2778 Messaggi |
Inserito il - 07 novembre 2014 : 16:16:07
|
Quella è un'impostazione dello STILE, non del testo, volendo si potrebbe verificare per lanciare la giusta sequenza del (command "text"...
(if (zerop (cdr (assoc 40 (tblsearch "STYLE" (getvar 'textstyle)))))..........
Comunque, parere mio, due righe di entmake tolgono la paura. |
 |
|
albertoromano
Utente Attivo
Prov.: Brescia
92 Messaggi |
Inserito il - 07 novembre 2014 : 16:30:24
|
Sono senza parole... Un team ai massimi livelli... Grazie ragazzi per i contributi, domattina si studia, molto bene. Un saluto a tutti. A. |
 |
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 07 novembre 2014 : 19:39:58
|
GP, parole sante, condivido in pieno! |
 |
|
albertoromano
Utente Attivo
Prov.: Brescia
92 Messaggi |
Inserito il - 10 novembre 2014 : 07:56:17
|
Buongiorno a tutti, ho tentato di completare il lisp prposto da Terminator, ma non riesco a caricarlo col cad che mi dà il messaggio : << errore: elenco errato nell'input. >>
;7 nov 2014 ; ;Bene, allora studiati questa funzione e comprendi perché è stata strutturata in questo modo. ;E' la funzione che traccia i rettangoli distanziati. ; ; ;(defun c:serie (pezzi nome lunghezza larghezza / taglio P1 P2 P3) (defun c:serie () (setvar "CMDECHO" 0) (setvar "OSNAPCOORD" 1) (setvar "BLIPMODE" 0) (setvar "OSMODE" 63) (setq taglio 20) (setq coox 100) (setq pezzi (getint "\nnumero dei pezzi: ")) (setq NOME (getstring "\nNOME: ")) (setq A (getdist "\nLUNGHEZZA: ")) (setq B (getdist "\nLARGHEZZA: ")) (setq P1 (getpoint "\nANGOLO ALTO SX DEL RETTANGOLO: ")) (repeat pezzi ;;(setq P1 (list 0 0) coox 0) (setq P2 (polar P1 0 (+ taglio lunghezza))) (setq P3 (polar P2 (* (/ pi 2) 3) (+ taglio larghezza))) (vl-cmdf "_RECTANG" P1 P3) (vl-cmdf "_TEXT" "_J" "M" (polar P1 (angle P1 P3)(/ (distance P1 P3) 2)) "" "" (strcat nome " " (rtos lunghezza 5) " " (rtos larghezza 5))) (setq P1 (polar p1 0 (+ taglio lunghezza 100 ) ;(setq P1 (list (setq coox(+ coox (+ lunghezza taglio 100))))) ) (princ) |
 |
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 10 novembre 2014 : 08:35:39
|
Alla quart'ultima riga manca una parentesi chiusa, ma non è questo il punto. La funzione che ti ho scritto era già funzionante così. Infatti basta scrivere, ad esempio: (rett 5 "PIPPO" 500 300)
Sintassi: (rett pezzi nome lung larg) Argomenti: pezzi - numero rettangoli da inserire nome - stringa indicante nome da assegnare lung - lunghezza rettangoli larg - larghezza rettangoli
Di default, onde evitare ulteriori input, il punto in alto a sx del primo rettangolo è 0,0. Poi, non puoi chiamare il comando serie perché è già un comando AutoCAD, anche se carichi il comando, continuerà a proporti il serie di default. Per usare il tuo nuovo comando dovresti disattivare il comando serie con il comando _UNDEFINE. Meglio che gli cambi il nome. Volendo, si può inserire pure il punto di origine che decidi tu, ma lascio a te l'onore di inserirlo nella funzione, hai tutti gli input.
(defun C:SERIER (/ pezzi nome A B)
(setq pezzi (getint "\nnumero dei pezzi: ")
NOME (getstring "\nNOME: ")
A (getdist "\nLUNGHEZZA: ")
B (getdist "\nLARGHEZZA: ")
)
(rett pezzi NOME A B)
)
(defun rett (pezzi nome lunghezza larghezza / taglio P1 P2 P3)
(setq P1 (list 0 0) coox 0)
(repeat pezzi
(setvar "CMDECHO" 0)
(setvar "OSNAPCOORD" 1)
(setvar "BLIPMODE" 0)
(setvar "OSMODE" 63)
(setq taglio 20)
(setq P2 (polar P1 0 (+ taglio lunghezza)))
(setq P3 (polar P2 (* (/ pi 2) 3) (+ taglio larghezza)))
(vl-cmdf "_RECTANG" P1 P3)
(vl-cmdf "_TEXT" "_J" "M" (polar P1 (angle P1 P3)(/ (distance P1 P3) 2)) "" "" (strcat nome " " (rtos lunghezza 5) " " (rtos larghezza 5)))
(setq P1 (list (setq coox(+ coox (+ lunghezza taglio (/ lunghezza 10)))) 0))
)
(princ)
) |
Modificato da - Terminator in data 10 novembre 2014 08:37:15 |
 |
|
albertoromano
Utente Attivo
Prov.: Brescia
92 Messaggi |
Inserito il - 10 novembre 2014 : 20:51:43
|
10 nov 2014 Un saluto a tutti, ho fatto il compitino e funziona quasi. Non sono riuscito a capire come funziona la variabile coox nel senso che la lista é chiara ma il programma va a mettere i rettangoli successivi in un punto che non capisco come calcola. Forse c'è qualche variabile da settare? Perché scrive il messaggio finale due volte?
(defun C:SERIER (/ pezzi nome A B) (setq pezzi (getint "\nnumero dei pezzi: ") NOME (getstring "\nNOME: ") A (getdist "\nLUNGHEZZA: ") B (getdist "\nLARGHEZZA: ") ) (rett pezzi NOME A B) )
(defun rett (pezzi nome lunghezza larghezza / taglio P1 P2 P3) ;(defun rett () ; (setq P1 (list 0 0 ) coox 0) (setq P1 (getpoint "\nPosizione: ") coox 0) (repeat pezzi (setvar "CMDECHO" 0) (setvar "OSNAPCOORD" 1) (setvar "BLIPMODE" 0) (setvar "OSMODE" 63) (setq taglio 20) (setq P2 (polar P1 0 (+ taglio A))) (setq P3 (polar P2 (* (/ pi 2) 3) (+ taglio B))) (vl-cmdf "_RECTANG" P1 P3) (vl-cmdf "_TEXT" "_J" "M" (polar P1 (angle P1 P3)(/ (distance P1 P3) 2)) "" "" (strcat nome " " (rtos A 5) " " (rtos B 5))) (setq P1 (list (setq coox (+ coox (+ lunghezza taglio 80))) 0 )) ) (print "messaggio") ) |
 |
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 10 novembre 2014 : 21:28:28
|
E' molto semplice: Il punto P1 si ottiene con (getpoint), coox è la coordinata x, che all'inizio è settata a zero. Il programma inserisce il primo rettangolo e prima di cominciare a disegnare il secondo viene ricalcolato il nuovo punto P1. Il punto P1 è formato dalla coordinata x e y unite in formato lista -> (list x y). La nostra coordinata y è sempre a zero perché i rettangoli si disegnano sull'asse x. Ottengo una nuova coordinata x sommando la vecchia con il nuovo spostamento e il tutto viene memorizzato sempre in coox. Alla fine avrò sempre la variabile coox aggiornata, prima di disegnare il rettangolo successivo. Spero che la mia spiegazione non sia stata troppo farraginosa:
(setq P1 (list (setq coox(+ coox (+ lunghezza taglio (/ lunghezza 10))))
0
)
)
|
 |
|
albertoromano
Utente Attivo
Prov.: Brescia
92 Messaggi |
Inserito il - 11 novembre 2014 : 12:07:49
|
La spiegazione è chiarissima e Ti ringrazio. Avendo dato da input P1 i p1 successivi devono essere progressivi rispetto a P1input e anche le y non devono essere assolute ma zero rispetto a P1 input, lasciando y a zero sarebbe inutile l'imput. Però non funziona perchè mette il secondo rettangolo in un punto lontanissimo. Buon pranzo A. |
 |
|
albertoromano
Utente Attivo
Prov.: Brescia
92 Messaggi |
Inserito il - 11 novembre 2014 : 16:10:24
|
i rettangoli a partire dal secondo sono riferiti all'origine e non al punto di inserimento input. |
 |
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 11 novembre 2014 : 16:19:22
|
Hai ragione, ho lasciato il punto P1 all'origine (list 0 0). In questo caso deve essere:
(setq P1 (getpoint "\nPosizione: ")
coox (car P1)
cooy (cadr P1)
)
Il nuovo P1 sarà:
(setq P1 (list (setq coox(+ coox (+ lunghezza taglio (/ lunghezza 10))))
cooy
)
)
|
Modificato da - Terminator in data 11 novembre 2014 16:21:01 |
 |
|
albertoromano
Utente Attivo
Prov.: Brescia
92 Messaggi |
Inserito il - 11 novembre 2014 : 17:42:51
|
Molto bene, funziona. Grazie Terminator per la preziosa assistenza. La fase successiva consiste nell'inserire anche il numero dei pezzi all'inizio del text per avere riscontro lungo la lavorazione. Stasera ci provo e vediamo.
|
 |
|
albertoromano
Utente Attivo
Prov.: Brescia
92 Messaggi |
Inserito il - 11 novembre 2014 : 19:36:21
|
Eccomi. Ho provato ad inserire il numero dei pezzi all'inizio del testo, acad carica il lisp senza segnalare errori ma poi al momento dell'esecuzione disegna un solo rettangolo senza testo e mi indica errore col numero dei pezzi. Vorrei capire la struttura dei comandi, fino alla definizione del comando ci arrivo ma la lista che segue non mi è chiara.
( defun c: serier (/ pezzi nome A B) ( defun rett ( pezzi nome lunghezza larghezza / taglio P1 P2 P3 )
(defun C:SERIER (/ pezzi nome A B) (setq pezzi (getint "\nnumero dei pezzi: ") NOME (getstring "\nNOME: ") A (getdist "\nLUNGHEZZA: ") B (getdist "\nLARGHEZZA: ") ) (rett pezzi NOME A B) )
(defun rett (pezzi nome lunghezza larghezza / taglio P1 P2 P3) (setq P1 (getpoint "\nPosizione: ") coox (car P1) cooy (cadr P1)) (repeat pezzi (setvar "CMDECHO" 0) (setvar "OSNAPCOORD" 1) (setvar "BLIPMODE" 0) (setvar "OSMODE" 63) (setq taglio 20) (setq P2 (polar P1 0 (+ taglio A))) (setq P3 (polar P2 (* (/ pi 2) 3) (+ taglio B))) (vl-cmdf "_RECTANG" P1 P3) (vl-cmdf "_TEXT" "_J" "M" (polar P1 (angle P1 P3)(/ ( pezzi distance P1 P3) 2)) "" "" ( (rtos pezzi 5) " " strcat nome " " (rtos A 5) " " (rtos B 5))) (setq P1 (list (setq coox (+ coox (+ lunghezza taglio 80))) cooy )) ) (print "messaggio") )
Un saluto a tutti. A. |
 |
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 11 novembre 2014 : 21:59:11
|
Guarda che hai fatto un minestrone, cosa c'entra la variabile pezzi ripetuta due volte nella quint'ultima riga? |
Modificato da - Terminator in data 11 novembre 2014 21:59:43 |
 |
|
albertoromano
Utente Attivo
Prov.: Brescia
92 Messaggi |
Inserito il - 12 novembre 2014 : 08:12:48
|
Ti ringrazio Terminator per la pazienza che hai, è venuto un minestrone perchè sono andato a tentativi non conoscendo la costruzione delle liste che accompagnano i comandi. Non lo so fare e sto cercando di capire come va fatto. Ho cercato anche in rete ma ho fatto solo confusione, ho trovato "il mio lisp" di Rossi e mi sembra che mi aiuti a qualcosa, hai forse da indicarmi una fonte da consultare? Buona giornata a tutti. A. |
 |
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 12 novembre 2014 : 08:53:35
|
Beh, "il mio lisp" di Rossi, secondo il mio parere, è uno delle migliori guide in italiano. Le migliori che ho incontrato, sempre secondo il mio parere, sono quelle del sito http://www.afralisp.net. Sono in inglese, ma direi comprensibili. Non so da dove ho scaricato i relativi pdf, ho cercato sul sito ma non le ho trovate. Al limite ti invio i pdf che ho io, se mi dai la tua mail. |
Modificato da - Terminator in data 12 novembre 2014 08:53:56 |
 |
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
|
Discussione  |
|