Discussione:
[LISP] primi problemi con i primi semplici lisp.....
(troppo vecchio per rispondere)
MD
2004-06-05 14:15:51 UTC
Permalink
grazie a tutti voi e a manuali trovati sul sito di emicad e di roberto rossi
sto iniziando a scrivere i miei primissimi lisp...............
il problema è che al contrario di word ed excel mi sembra che in autocad non
sia possibile iniziare prendendo spunto dalla registrazione di macro,
vero???Tutto ciò rende i primi passi molti più duri...............


Io dovrei fare due cose:

- selezionare tutti gli oggetti di un determinato layer tranne le linee ed i
cerchi. Ho provato ad usare gli operatori di selezione and e not, ma credo
di fare errori di sintassi


- un lisp che capisce quanti layer ci sono in un disegno e mi stampa a video
quante entità ci sono su ogni layer, tipo "nel layer xxx ci sono yyy
oggetti, nel layer kkk ci sono zzz oggetti..........


mi potete aiutare?
Roberto
2004-06-06 06:11:51 UTC
Permalink
Post by MD
grazie a tutti voi e a manuali trovati sul sito di emicad e di roberto
rossi sto iniziando a scrivere i miei primissimi lisp...............
il problema è che al contrario di word ed excel mi sembra che in
autocad non sia possibile iniziare prendendo spunto dalla
registrazione di macro, vero???Tutto ciò rende i primi passi molti più
duri...............
- selezionare tutti gli oggetti di un determinato layer tranne le
linee ed i cerchi. Ho provato ad usare gli operatori di selezione and
e not, ma credo di fare errori di sintassi
- un lisp che capisce quanti layer ci sono in un disegno e mi stampa a
video quante entità ci sono su ogni layer, tipo "nel layer xxx ci sono
yyy oggetti, nel layer kkk ci sono zzz oggetti..........
mi potete aiutare?
Ciao.

Hai ragione. In AutoCAD non esiste il registratore di Macro! Questa
funzione la puoi invece trovare in IntelliCAD, che comunque produce
semplici script e non programmi lisp.


Per quanto riguarda il resto,ho buttato giù 4 righe che fanno ciò che
chiedi, prova a controllare, credo funzionino correttamente :

;questa funzione ritorna il gruppo di selezione contenente
;tutti gli oggetti del layer 'TEST' esclusi cerchi e linee
(defun get_TestNoCircleNoLine ( / )
(setq gruppo (ssget "X" '((8 . "TEST")
(-4 . "<NOT")
(-4 . "<OR")
(0 . "CIRCLE")
(0 . "LINE")
(-4 . "OR>")
(-4 . "NOT>")
)
)
)
);enddef


;questa funzione ritorna una lista contenente l'elenco dei layer
(defun get_layerList ( / elemento return flag)
(setq flag t)
(while (setq elemento (tblnext "LAYER" flag))
(setq return (cons (cdr (assoc 2 elemento)) return))
(setq flag nil)
)
return
);enddef

;questa funzione stampa a video il numero di entità per ogni layer
(defun print_nEntLay ( / quantita layer layers gruppo)
(setq layers (get_layerList))

(foreach layer layers
(setq gruppo (ssget "X" (list (cons 8 layer))))
(if gruppo
(setq quantita (sslength gruppo))
(setq quantita 0)
);endif
(princ (strcat "\nSul layer " layer " ci sono " (itoa quantita) "
oggetti."))
);endfor

);enddef


Ciao.

Roberto Rossi

Web : http://rsoftware.altervista.org
MD
2004-06-07 19:28:00 UTC
Permalink
Post by Roberto
Hai ragione. In AutoCAD non esiste il registratore di Macro! Questa
funzione la puoi invece trovare in IntelliCAD, che comunque produce
semplici script e non programmi lisp.
si, avevo notato il registra script di intellicad, molto semplice ma meglio
di niente, credo comunque che un registra macro come quello di excel sia una
grave mancanza di autocad, io ho imparato quel poco che so di vba grazie al
registra macro e ora un pò ne mastico...senza il registra macro credo ci
avrei messo molto di più ad imparare

veniamo agli scritpt, innanzitutto funzionano tutti, basta grazie?Mille
grazie va bene? :)
Post by Roberto
(setq gruppo (ssget "X" '((8 . "TEST")
(-4 . "<NOT")
(-4 . "<OR")
(0 . "CIRCLE")
(0 . "LINE")
(-4 . "OR>")
(-4 . "NOT>")
)
)
)
);enddef
perchè dopo l'otto c'è il punto?
se al posto che "test" avessi voluto scrivere nomelayer , dove nomelayer è
una variabile che passa il nome del layer, quale è la sintassi?Ho provato ma
son riuscito solo costruendo una lista con cons e poi cmq non riuscivo ad
aggiungerci in coda gli operatori logici
ho scritto una cosa del tipo (ssget "X" (list (cons 8 nomelayer ...ma poi?
Post by Roberto
(while (setq elemento (tblnext "LAYER" flag))
(setq return (cons (cdr (assoc 2 elemento)) return))
(setq flag nil)
)
return
tblnext legge le tabelle di simboli, vero?Così leggo nell'help. In pratica
con questo comando posso lavorare su nomi layer, tipolinea ecc, cioè su
quelle "cose" che non sono vere e proprie entita di disegno, giusto?Oltre
alle entità di disegno e alle entità di tabelle di simboli, quali altri
entità prevede il lisp?
Se volessi stampare la lista all'iterno di una finestra alert?Ho provato, ma
mi da errore, come se la lista non fosse considerata una "stringa"
Post by Roberto
;questa funzione stampa a video il numero di entità per ogni layer
(defun print_nEntLay ( / quantita layer layers gruppo)
(setq layers (get_layerList))
-----CUT----------
Post by Roberto
(princ (strcat "\nSul layer " layer " ci sono " (itoa quantita) "
oggetti."))
);endfor
);enddef
Questa funzione devo ancora studiarmela un pò, cmq funziona, alla fine però
mi stampa il contenuto della riga di princ, come si può eliminare tale
errore?

Ho notato che tu non usi mai defun nel modo defun c:nomecomando , come mai?
io ho cambiato invece in questo modo le tue funzioni, anche perchè se no non
riesco ad avviarle...........come si fa?


grazie mille ancora :)
Roberto
2004-06-11 16:54:05 UTC
Permalink
Post by MD
si, avevo notato il registra script di intellicad, molto semplice ma
meglio di niente, credo comunque che un registra macro come quello di
excel sia una grave mancanza di autocad, io ho imparato quel poco che
so di vba grazie al registra macro e ora un pò ne mastico...senza il
registra macro credo ci avrei messo molto di più ad imparare
veniamo agli scritpt, innanzitutto funzionano tutti, basta
grazie?Mille grazie va bene? :)
Post by Roberto
(setq gruppo (ssget "X" '((8 . "TEST")
(-4 . "<NOT")
(-4 . "<OR")
(0 . "CIRCLE")
(0 . "LINE")
(-4 . "OR>")
(-4 . "NOT>")
)
)
)
);enddef
perchè dopo l'otto c'è il punto?
La funzione 'ssget' permette di selezionare un determinato gruppo di
oggetti solamente attraverso l'utilizzo di liste chiamate 'coppie
puntate', il numero indica il tipo di campo su cui effettuare il filtro
(8 = layer), mentre il secondo dato indica il contenuto del campo.

In pratica 'ssget' vuole una definizione parziale degli oggetti da
ricercare.
Post by MD
se al posto che "test" avessi voluto scrivere nomelayer , dove
nomelayer è una variabile che passa il nome del layer, quale è la
sintassi?Ho provato ma son riuscito solo costruendo una lista con cons
e poi cmq non riuscivo ad aggiungerci in coda gli operatori logici
ho scritto una cosa del tipo (ssget "X" (list (cons 8 nomelayer ...ma poi?
(setq gruppo (ssget "X" (list (cons 8 nomelayer)
(cons -4 "<NOT")
(cons -4 "<OR")
(cons 0 "CIRCLE")
(cons 0 "LINE")
(cons -4 "OR>")
(cons -4 . "NOT>")
)
)
)

ricorda che 'cons', utilizzato con due elementi base (interi,reali,
stringhe,ecc...) genera una coppia puntata, mentre 'list' crea una lista
comprensiva dei valori passati come parametri.
Post by MD
Post by Roberto
(while (setq elemento (tblnext "LAYER" flag))
(setq return (cons (cdr (assoc 2 elemento)) return))
(setq flag nil)
)
return
tblnext legge le tabelle di simboli, vero?Così leggo nell'help. In
pratica con questo comando posso lavorare su nomi layer, tipolinea
ecc, cioè su quelle "cose" che non sono vere e proprie entita di
disegno, giusto?Oltre alle entità di disegno e alle entità di tabelle
di simboli, quali altri entità prevede il lisp?
Tutte quelle gestite da AutoCAD. Puoi manipolare qualsiasi elemento
(tranne i solidi).

Se vuoi un'elenco preciso lo trovi nella sezione che parla dei DXF.

Inoltre il lisp gestisce file, database, ti permette di pilotare
applicazioni esterne (es. Excel) ecc... Insomma è un linguaggio di
programmazione 'quasi' completo.
Post by MD
Se volessi stampare la lista all'iterno di una finestra alert?Ho
provato, ma mi da errore, come se la lista non fosse considerata una
"stringa"
Infatti hai ragione, la lista non è una stringa, se vuoi inserirla in un
'alert' devi convertirla in una stringa.
Post by MD
Post by Roberto
;questa funzione stampa a video il numero di entità per ogni layer
(defun print_nEntLay ( / quantita layer layers gruppo)
(setq layers (get_layerList))
-----CUT----------
Post by Roberto
(princ (strcat "\nSul layer " layer " ci sono " (itoa quantita) "
oggetti."))
);endfor
);enddef
Questa funzione devo ancora studiarmela un pò, cmq funziona, alla fine
però mi stampa il contenuto della riga di princ, come si può eliminare
tale errore?
Questo non è un errore, semplicemente tutte le funzioni lisp (nel nostro
caso 'print_nEntLay') ritornano il valore dato dall'ultima espressione
presente, quindi il doppione che vedi è solamente il valore ritornato
dalla funzione stessa.

Se desideri che una funzione non ritorni alcun valore, inserisci

(prin1)

come ultima riga, prima dell'ultima parentesi chiusa.
Post by MD
Ho notato che tu non usi mai defun nel modo defun c:nomecomando , come
mai? io ho cambiato invece in questo modo le tue funzioni, anche
perchè se no non riesco ad avviarle...........come si fa?
Non esiste una ragione particolare, è solamente un'abitudine. Comunque,
se desideri eseguire delle funzioni lisp (non comandi), sulla riga ri
comando di AutoCAD/IntelliCAD puoi digitare :

(nomefunzione)

comprensivo di parentesi.
Post by MD
grazie mille ancora :)
Prego.


Ciao.

Roberto Rossi

Web : http://rsoftware.altervista.org
MD
2004-06-13 17:49:18 UTC
Permalink
grazie mille ancora, naturalmente funziona di nuovo tutto :9
Post by Roberto
Tutte quelle gestite da AutoCAD. Puoi manipolare qualsiasi elemento
(tranne i solidi).
rigurado a questa affermazione ho aperto un nuovo thread sul ng, per dei
chiarimenti, spero non ti dispiaccia, ma in questo modo magari intervengono
anche altri.

ho finito di leggere il tuo manuale di lisp....spero di ricordarmi almeno
qualcosa :)

Grazie ancora e buonlavoro!

Aniello Annunziata
2004-06-13 17:34:27 UTC
Permalink
Post by Roberto
Hai ragione. In AutoCAD non esiste il registratore di Macro!
E' in wishlist per AutoCAD 2006... su mia specifica richiesta c'è
stata una folta discussione tra tutti i beta tester e gli
sivluppatori.
Attendere, prego!
Saluti, Aniello
--
Aniello Annunziata
Content Director Manager
www.cadlandia.com
***@cadlandia.com

Per rispondermi in privato, togli NOGARBAGE dall'indirizzo
Loading...