Tenha uma nova experiência ao navegar no Fórum pelo computador de forma integrada ao portal principal. Acesse o seguinte link: https://www.autolisp.com.br/board/. Entretanto para dispositivos móveis recomendamos acessar este outro link: https://www.autolisp.com.br/forum/

Selecionar todos os blocos e explodir (em lisp)

Dúvidas sobre AutoLISP...

Moderador: Moderadores

Responder
Avatar do usuário
rapiai
Concreto
Concreto
Mensagens: 26
Registrado em: Qui 07 Jun 2007 12:00:00 am
Localização: Curitiba - PR

Selecionar todos os blocos e explodir (em lisp)

Mensagem por rapiai »

Oi...gostaria de saber como faço para criar uma lisp que selecione todos os blocos que estão no mesmo layer (Folha 0) e depois explodir...não estou conseguindo...Valeu!!!

Avatar do usuário
woodicko
Bronze 1/3
Bronze 1/3
Mensagens: 157
Registrado em: Qua 24 Mai 2006 12:00:00 am
Contato:

nem idéia ...

Mensagem por woodicko »

O problema aparenta ser simples, mas possui alguma "pegadinha" que eu não consegui resolver.

Observem as rotinas abaixo ...

[lsp](defun c:TESTE()
(setq sel1 (ssget "x" '( (0 . "INSERT") )))
(command "ERASE" sel1 "")
)[/lsp]

Esta primeira rotina seleciona todos os blocos e os apaga.

[lsp](defun c:TESTE()
(setq sel1 (ssget "x" '( (0 . "INSERT") )))
(command "EXPLODE" sel1 "")
)[/lsp]

Esta segunda rotina é semelhante a primeira, porém os blocos não explodem. Peguei um desenho simples, com blocos sem nenhuma proteção, e não explodem. Consigo explodi-los normalmente com o comando EXPLODE, pela linha de comando.

Alguém pode me dizer por que o ERASE funciona e o EXPLODE não?

Meu CAD é 2009.

Avatar do usuário
hugopaulo
Master
Master
Mensagens: 1873
Registrado em: Dom 29 Fev 2004 12:00:00 am

Re: nem idéia ...

Mensagem por hugopaulo »

woodicko escreveu:O problema aparenta ser simples, mas possui alguma "pegadinha" que eu não consegui resolver.
...
...
[lsp](defun c:TESTE() ; woodicko: sua 2ª rotina
(setq sel1 (ssget "x" '( (0 . "INSERT") )))
(command "EXPLODE" sel1 "")
)[/lsp]

Esta segunda rotina é semelhante a primeira, porém os blocos não explodem. Peguei um desenho simples, com blocos sem nenhuma proteção, e não explodem. Consigo explodi-los normalmente com o comando EXPLODE, pela linha de comando.

Alguém pode me dizer por que o ERASE funciona e o EXPLODE não?

Meu CAD é 2009.
Meu caros woodicko

Vc mesmo respondeu à sua pergunta que eu sublinhei. Realmente é uma "pegadinha" mais por causa da fraca didática da Autodesk do que pelo seu conhecimento. Vou dar uma pequena explanação e vcs vão ver porque eu digo isso.

Nem sempre o SSGET resolve seleções para alguns comandos e nesse caso não resolveu. Recomenda-se então usar um "handle" para manipular o objeto com alguns comandos como EXPLODE e outros.

Tente o seguinte:[lsp]
(defun c:TESTE ()
(setq e1 (entget (entlast))) ; após inserir um bloco qualquer
(setq e1 (cdr (assoc 5 e1)))
;; (setq sel1 (ssget "x" '((0 . "INSERT")))) ; eliminar
;;(command "EXPLODE" sel1 "") ;eliminar
(command "explode" (handent e2)) ; não precisa usar ENTER ("")[/lsp]

Testei com um bloco só. Faça uma pesquisa como criar "handles" para todos os blocos de uma vez só, talvez com uma lista e MAPCAR, talvez com REPEAT, ou outro modo bem prático, dentro de um desenho ou por camadas. Creio que vc vai encontrar uma solução geral para explodir todos os blocos de qualquer forma.

Observe que nesse caso não é preciso usar o ENTER ("").

Dever funcionar com Activex (vla) mais isso é com os "universitários" daqui. Eu não uso muito. Minha praia é AutoLISP "puro".

rapiai

Aguarde que a ajuda está chegando.

Estou usando o AC 2008 mas funciona do AutoCAD 2000 ao 2009. Caso não funcione, sinalize. T+
hugopaulo
AutoLISP Não É LISP ==> VISUAL LISP não é Linguagem

Avatar do usuário
woodicko
Bronze 1/3
Bronze 1/3
Mensagens: 157
Registrado em: Qua 24 Mai 2006 12:00:00 am
Contato:

Problema resolvido - mas parcialmente compreendido.

Mensagem por woodicko »

Segue abaixo uma rotina encontrada em outro fórum

http://www.cadtutor.net/forum/showthread.php?t=25303

[lsp]
(defun c:exall(/ bSet)
(setvar "qaflags" 1)
(while(setq bSet(ssget "_X" '((0 . "INSERT"))))
(command "_.explode" bSet "")
); end while
(setvar "qaflags" 0)
(princ)[/lsp]

A rotina explode todos os blocos, conforme solicitado.

Dois fatos que me chamaram a atenção:

1. Ela altera o valor da variável "qaflags", que não consta na ajuda do AutoCAD.
2. Ela seleciona todos os blocos e explode em um "while", como se o ssget selecionasse um bloco por vez e, caso nada fosse selecionado, sairia do loop.

é ... encontrar uma rotina que o faça é simples, mas o problema é compreender.

Eu dou o problema de explodir os blocos por resolvido, mas aceito explicações de como este loop insano opera.


Ah ... outro fato interessante ... vejam a rotina abaixo ... ela funciona 100%

[lsp](defun c:TESTE()
(setq sel1 (ssget "x" '( (0 . "INSERT") )))
(command "explode" sel1)
(command "")
) [/lsp]

Bastou separar o último ENTER do command que funcionou. Curioso, não?

--------------------------------------------------

PS: Para selecionar os blocos por layer, troque a linha

(setq sel1 (ssget "x" '( (0 . "INSERT") )))

por

(setq sel1 (ssget "x" '( (0 . "INSERT") (8 . "NOMEDOLAYER") )))

Onde "NOMEDOLAYER" deve ser substituído pelo layer em questão.
Editado pela última vez por woodicko em Seg 23 Fev 2009 10:12:59 am, em um total de 1 vez.

Avatar do usuário
hugopaulo
Master
Master
Mensagens: 1873
Registrado em: Dom 29 Fev 2004 12:00:00 am

Mensagem por hugopaulo »

woodicko

Espero que vc não tenha interpretado minha colocação como um desmerecimento à sua rotina.

Apenas quis dizer que o "handent" funciona sempre.

E como vc mesmo viu o "ssget" é cheio de manhas.

Quanto ao "loop" insano:
(while(setq bSet(ssget "_X" '((0 . "INSERT")))) - Enquanto houver a condição do sistema conseguir ajustar a variável bSet o While não termina. Quando a variável bSet é nil (deixa de ser INSERT) o While encerra.

O _X é todas as entidades inseridas (INSERT).

Nós devemos nos acostumar com diversas funções, comandos e variáveis não documentadas no AutoCAD. Isso vem desde o princípio do AutocAD. E parece que vai continuar.

Como já vi que vc é aplicado mesmo veja a seguir:

Código: Selecionar todos

    * What is QAFLAGS?

    QAFLAGS been used a long time (<r12) by developers and autodesk themself too.

    QAFLAGS acceps a value between 0 and 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.

Normally QAFLAGS should be set to 0. Because it might be set to other values it is a good idea to put (setvar "QAFLAGS" 0) in acaddoc.lsp or any other of your lisp files that you use for startup.
Algumas coisas que vc questiona tem a ver com "bugs" internos de sistema que todo compilador carrega em função do programa fonte.

Em versões posteriores existe a tendência de alguns desaparecerem mas em compensação aparecem outros. Sempre foi assim e creio que sempre será. Desejo que não. Tb considero o assunto EXPLODE com "sssget" e "handent" concluido.

Espero que tenha sido útil para todos. T+
hugopaulo
AutoLISP Não É LISP ==> VISUAL LISP não é Linguagem

Avatar do usuário
jc105
Bronze 1/3
Bronze 1/3
Mensagens: 155
Registrado em: Qua 07 Abr 2004 12:00:00 am

Mensagem por jc105 »

só um acréscimo...

Certa vez também precisei explodir os blocos de desenho via lisp,

no meu caso deu certo com
[lsp]
(defun c:ep(/ ss)
(repeat 2
(setq ss (SSGET "x" (LIST (CONS 0 "INSERT"))))
(command "explode" ss)
)
)
[/lsp]

Complentando a explicação do hugo a parte insana do codigo:

(while(setq bSet(ssget "_X" '((0 . "INSERT")))); enquanto conter blocos no desenho ele continua explodindo... pode ser que tenha blocos dentro de outros blocos.... que não participam da primeira seleção logo não explodem

já o codigo que o hugo paulo postou contem erros:
[lsp]
(defun c:TESTE () ; NÃO DECLAROU AS VARIAVEIS
(setq e1 (entget (entlast))) ; após inserir um bloco qualquer
(setq e1 (cdr (assoc 5 e1))) ;
;; (setq sel1 (ssget "x" '((0 . "INSERT")))) ; eliminar
;;(command "EXPLODE" sel1 "") ;eliminar
(command "explode" (handent e2)) ; e2 NÃO EXISTE NESTA ROTINA!!!! NÃO SERIA e1?????
[/lsp]
"Há duas formas para viver sua vida:
Uma é acreditar que não existe
milagre... a outra é acreditar que todas as
coisas são um milagre....."
Albert Einstein 1879 - 1955

Avatar do usuário
hugopaulo
Master
Master
Mensagens: 1873
Registrado em: Dom 29 Fev 2004 12:00:00 am

Mensagem por hugopaulo »

O erro maior foi minha falta em explicar como funciona. Esta parte de rotina é totalmente funcional dentro de Tubo 3D um programa em desenvolvimento ainda sobre detalhamento e roteamento de tubulações com todos os acessórios.

Outro erro é que esqueci de fechar os parentêses da função, o último ")". Deve dar erro de má-formação.

Realmente a variável e2 tem que ser e1. Correto o jc105. No exemplo de onde tirei tenho duas variáveis e1 e e2. É para extrudar um tubo dentro do outro: e1 = OD e e2 = ID. Depois de extrudados usa-se SUBTRACT para e1 retirando e2.

Quanto a indicar as variáveis é um erro relativo. Não há necessidade de variáveis nessa rotina exemplo. É uma parte muito pequena. Vejamos porque:

Carreguem um bloco. Carreguem a rotina. Chamem com TESTE ( não é sensitivo). Selecione o objeto. Pronto. É só isso.

Peço desculpas a todos pelos erros e pela falta de documentação do uso.
hugopaulo
AutoLISP Não É LISP ==> VISUAL LISP não é Linguagem

Responder