Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

LISP - Esplodere più blocchi contemporaneamente

47 views
Skip to first unread message

Emiliano - EmiCAD

unread,
Sep 28, 2005, 1:53:35 PM9/28/05
to
Ciao a tutti,
devo realizzare un LISP nel quale ho la necessità di esplodere tutti i
blocchi presenti in un disegno.
Purtroppo (anche leggendo la guida in linea) sembra che questa operazione
non sia fattibile, ma che occorra esplodere un blocco alla volta con la
conseguenza che il LISP gira lentissimo, impiega dei minuti se il disegno
contiene migliaia di blocchi...

Il codice che ho scritto e che non funziona è il seguente:

(setq selez (ssget "X" '((0 . "INSERT"))))
(command "_explode" selez "")


C'è qualcuno che è riuscito a raggirare questo problema?
Ringrazio tutti in anticipo.

Ciao


--
Emiliano - Webmaster di EmiCAD® - Tutto per AutoCAD e ProgeSOFT® IntelliCAD
e-mail: webm...@emicad.it
web: www.emicad.it


Francesco B.

unread,
Sep 28, 2005, 5:05:53 PM9/28/05
to
Emiliano - EmiCAD <webm...@emicad.it> wrote:

E' parecchio che non uso l'autolisp e non mi ricordo bene i nomi dei
comandi ma fammi provare.
Purtroppo autocad ce l'ho in ufficio e quindi non posso provare
direttamente quello che ti consiglio.

> (setq selez (ssget "X" '((0 . "INSERT"))))

Allora se non ricordo male con questo comando dovrebbe raggruppare in
una lista tutti gli elementi con l'attributo "INSERT".

> (command "_explode" selez "")

Con questo comando cerchi di eplodere la lista che contiene l'elenco dei
blocchi (perlomeno non so se autocad esplode in un colpo solo tutti gli
elementi di una lista, ammetto la mia ignoranza).
Dovresti in teoria iterare sugli elementi della lista e poi esploderli.
Cioe' una cosa del tipo:

(setq indice 0)
(repeat (sslength selez)
(setq ent1 (ssname selez indice))
(command "_explode" ent1 "")
(setq indice (1+ indice))
)

Ovviamente se Autocad fa in automatico l'esplosione su tutti gli
elementi contenuti nella lista allora il mio codice e' inutile.
Io ho semplicemente estratto ogni singolo blocco e poi ad ogni singolo
blocco ho applicato il comando _explode (non ho verificato la sintassi
ma presumo che sia corretta).
Se ti va, prova questa soluzione e se non funziona abbia pazienza e
scusami.

P.S.
verifica che il l'attributo del blocco sia proprio "INSERT", non si sa
mai.
Io per questo tipo di verifiche uso il seguente codice che restituisce
la lista associata all'oggetto (cosi' evito di spulciare il manuale):

-------------------------------------------------------
; Restituisce la lista associativa
; di ogni elemento nella selezione

(defun sel1(/ indice ss1 ent1)
(setq indice 0)
(setq ss1 (ssget))
(repeat (sslength ss1)
(setq ent1 (ssname ss1 indice))
(print (entget ent1))
(setq indice (1+ indice))
)
(princ)
)
-------------------------------------------------------

--
Ciao da Francesco B.

Marco

unread,
Sep 28, 2005, 10:07:05 PM9/28/05
to
(setvar "qaflags" 1)
(command ".explode" (ssget "_X" '((0 . "INSERT"))) "")
(setvar "qaflags" 0)


--

Marc'Antonio Alessi
http://xoomer.virgilio.it/alessi
(strcat "NOT a " (substr (ver) 8 4) " guru.")

--


Emiliano - EmiCAD

unread,
Sep 29, 2005, 1:48:27 AM9/29/05
to

> Dovresti in teoria iterare sugli elementi della lista e poi esploderli.
> Cioe' una cosa del tipo:


Ciao Francesco,
ti confermo che AutoCAD non esplode tutti i blocchi con la riga di codice
(command "_explode" selez "").
Avevo pertanto anch'io reiterato tutta la lista per esploderli.

Purtroppo questo procedimento è troppo lento (anche con pc recenti) ed i
file da elaborare contengono migliaia di blocchi... quindi minuti di
elaborazione solo per esplodere i blocchi.

La soluzione di Marco, invece, funzione perfettamente!

Ciao e grazie

Emiliano - EmiCAD

unread,
Sep 29, 2005, 1:48:27 AM9/29/05
to

"Marco" <nos...@nospam.com> ha scritto nel messaggio
news:d%H_e.32227$pJ6.2...@news4.tin.it...

> (setvar "qaflags" 1)
> (command ".explode" (ssget "_X" '((0 . "INSERT"))) "")
> (setvar "qaflags" 0)


Ciao Marco,
come già detto a Francesco la tua soluzione funziona perfettamente, tuttavia
non ho capito a cosa serve la variabile "qaflags"; l'ho cercata sulla guida
in linea ma sembra non esserci!

Funziona anche con AutoCAD 2002?

Ciao e grazie.

Marco

unread,
Sep 29, 2005, 9:26:55 AM9/29/05
to
E' una variabile non documentata, quello che so è:

QAFLAGS
Value between 0 - 32767
bit 0 (1) : ^C in menu macro cancels grips (acts like keyboard <Esc>).
bit 1 (2) : no pause during text screen listings.
bit 2 (4) : no "alert" dialogs (text display instead).
bit 7 (128) : accepts "screen picks" (point lists) via (command) function.

Ma evidentemente ci sono altri usi non contemplati.


Alcune domande:

1) IntelliCad è completamente compatibile con il Lisp di AutoCad?

2) in IntelliCad (ultime versioni) esiste il VisualLisp di AutoCad?

3) hai mai provato gli "abilitatori" Lisp per le versioni LT?
(tipo DrCauto o altri))


Ciao.

Marco

Francesco B.

unread,
Sep 29, 2005, 7:48:00 PM9/29/05
to
Emiliano - EmiCAD <webm...@emicad.it> wrote:

> La soluzione di Marco, invece, funzione perfettamente!

Mi fa piacere che hai risolto.

Emiliano - EmiCAD

unread,
Sep 30, 2005, 8:05:27 AM9/30/05
to
> Alcune domande:
>
> 1) IntelliCad è completamente compatibile con il Lisp di AutoCad?

Al 99%; spesso si tratta di fare solo qualche piccola correzione...


> 2) in IntelliCad (ultime versioni) esiste il VisualLisp di AutoCad?

No, però esistono vari programmi (anche free) molto simile a VisualLISP
senza necessità di appoggiarsi a quest'ultimo.
Per fare alcuni esempi: ObjectDCL, o Sharp Lisp.
Ma ce ne sono anche altri...

>
> 3) hai mai provato gli "abilitatori" Lisp per le versioni LT?
> (tipo DrCauto o altri))
>

Li ho provati qualche anno fa, e funzionavano bene, poi ho rinunciato in
quanto questi software non sono italiani e pertanto difficili da acquistare.


Ciao

Marco

unread,
Sep 30, 2005, 12:58:16 PM9/30/05
to
> No, però esistono vari programmi (anche free) molto simile a VisualLISP
> senza necessità di appoggiarsi a quest'ultimo.
> Per fare alcuni esempi: ObjectDCL, o Sharp Lisp.
> Ma ce ne sono anche altri...


...ma se devi far funzionare un programma per AutoCAD, che usa delle
funzioni
VisualLisp, anche su IntelliCAD cosa usi?

Emiliano - EmiCAD

unread,
Oct 1, 2005, 3:48:20 AM10/1/05
to

"Marco" <nos...@nospam.com> ha scritto nel messaggio
news:433de280$0$6341$4faf...@reader2.news.tin.it...

>> No, però esistono vari programmi (anche free) molto simile a VisualLISP
>> senza necessità di appoggiarsi a quest'ultimo.
>> Per fare alcuni esempi: ObjectDCL, o Sharp Lisp.
>> Ma ce ne sono anche altri...
>
>
> ...ma se devi far funzionare un programma per AutoCAD, che usa delle
> funzioni
> VisualLisp, anche su IntelliCAD cosa usi?

Scusa ma non avevo capito, pensavo tu ti riferissi all'interfaccia
VisualLISP.
Le funzioni VisualLISP non sono ancora supportare da ProgeCAD, spero in una
delle prossime versioni...

In ogni caso fino adesso sono sempre riuscito a superare il problema con
qualche stratagemma...

0 new messages