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?
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
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? :)
> (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?
> (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"
> ;questa funzione stampa a video il numero di entità per ogni layer
> (defun print_nEntLay ( / quantita layer layers gruppo)
> (setq layers (get_layerList))
-----CUT----------
> (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 :)
> 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? :)
>
>> (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.
> 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.
>
>
>
>> (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.
> 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.
>> ;questa funzione stampa a video il numero di entità per ogni layer
>> (defun print_nEntLay ( / quantita layer layers gruppo)
>> (setq layers (get_layerList))
> -----CUT----------
>> (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.
> 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.
> grazie mille ancora :)
>
>
>
Prego.
>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
aniello.a...@cadlandia.com
Per rispondermi in privato, togli NOGARBAGE dall'indirizzo
> 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!