Pesquisar este blog

terça-feira, 5 de julho de 2011

Auto-Lisp Função "retorna_attrib" ( retorno de atributos desejados ) LISP

Boa noite


     Sendo este o primeiro artigo técnico do blog autolisp, vou começar por resolver um problema bem comum para os desenvolvedores da linguagem: o acesso à informações de atributos de blocos em desenhos do Autocad. Vejam o Exemplo:   




      As informações doa atributos das tags "HI" e "LW" do bloco "nivel" são visíveis no desenho. Mas e para manipular as mesmas numa rotina autolisp? Primeiro vamos a explicação complicada... Todo bloco do autocad tem um entity-name, que por sua vez possue uma entity-list com todas as informações do bloco, como escala, layer, coordenada, etc. Os atributos estão definidos ainda em outra lista (entity-data). No exemplo ilustrado esta lista possuí 2 valores. 
      Então, o roteiro para acessar um atributo de um bloco é o seguinte: 1) selecionar o bloco; 2) descobrir o entity-name deste bloco; 3) Percorrer a lista de atributos um a um, até situar o ponteiro na posição da lista onde se encontra a informação desejada. Para isso, usa-se a função nativa entnext. Vejamos o exemplo para se carregar na variável "ATRIBUTO" a informação contida no "attribute LW" do bloco "nivel.dwg":
...

(setq BLOCO (ssget))     ;seleciona-se pelo mouse o bloco "nivel" na variável BLOCO
(setq ENT-NOME (ssname BLOCO 0))     ;descobre o entity-name
(setq ENT-ELE ENT-NOME)     ;passa-se o entity-name a uma variável de carga
(setq ENT-ELE (entnext ENT-ELE))     ;carrega-se o 1º atrib da lista ("HI")
(setq ENT-ELE (entnext ENT-ELE))     ;carrega-se o 2º atrib da lista ("LW")
(setq VALOR_ATTRIB (cdr (assoc 1 (entget ENT-ELE))))     ;extraí-se o valor do atributo do par associado da entyty-data
(princ VALOR_ATTRIB)     ;plotagem da variável carregada com o atributo
;>11     -> valor apresentado no prompt do autocad    

...

    Agora, imaginem um bloco com 100 atributos, como os de uma legenda de uma planta de obra civil? Para facilitar a vida de todos, disponibilizo aqui a função "retorna_attrib". Na mesma você passa o entity-name do bloco e a posição do atributo a ser consultado, e o valor deste será retornado. A chamada da função é assim:
(retorna_attrib [entity-name] [ posição do atributo desejado]), sendo:
           [entity-name]: do bloco desejado;
           [ posição do atributo desejado]: em que posição está o atributo desejado.

Abaixo o código da mesma para uso:


; RETORNA ATRIBUTO (função pré-elaborada)


(defun retorna_attrib (BLOCO_AUX NUM_ATTRIB)


  (setq VALOR_ATTRIB nil)
  (setq EL BLOCO_AUX)
  (setq CONTADOR 1)
  (while (<= CONTADOR NUM_ATTRIB)
    (setq EL (entnext EL))
    (setq CONTADOR (1+ CONTADOR))
  )
  (setq VALOR_ATTRIB (cdr (assoc 1 (entget EL))))
  VALOR_ATTRIB
)


   É só copiar acima da rotina principal, e chamá-la então. Nosso exemplo ficaria assim:

(defun c:principal ()
   (setq BLOCO (ssget))     ;seleciona-se pelo mouse o bloco "nivel" na variável BLOCO
   (setq VALOR_ATTRIB (retorna_attrib BLOCO 2)
   (princ VALOR_ATTRIB)     ;plotagem da variável carregada com o atributo
)
;>11     -> valor apresentado no prompt do autocad    


Boa Noite

e qualquer dúvida estou a disposição.

Lucas

9 comentários:

  1. Boa explicação, bem detalhado... efetuei alguns teste e funcionou perfeitamente!

    ResponderExcluir
  2. Lucas, parabéns pelo post.
    Tenho um block atributado BLOCOl com 3 TAGs sendo VALOR1, VALOR2 e VALOR3, onde VALOR1 e VALOR2 são digitados pelo usuário em números decimais (ex.: 670.90 e 670.10), como faço para percorrer todos os BLOCO1 inseridos no desenho e fazer a operação matemática em cada um deles de VALOR1 - VALOR1 e lançar em VALOR3?

    ResponderExcluir
    Respostas
    1. Sergio, boa tarde... desculpe a "pequena" demora na sua resposta. È que estou envolvido em vários projetos, e o tempo está curto. Seguinte: Eu te aconselho a ler os valores dos atributos do bloco, escala, rotação, cor, layer e coordenada de inserção e depois "deletá-lo" por (ssdel bloco) o truque é você re-inserí-lo novamente, com todos os atributos, e no VALOR3, no momento da inserção você faz a conta. Entendeu? qualquer coisa, é só escrever.

      Excluir
  3. Bom dia Lucas , como faço para inserir um texto no bloco com atributo, por exemplo, uma linha com L=100, uso o comando dist e em seguido ele insere esse valor automatico no bloco.Tem como ?

    ResponderExcluir
    Respostas
    1. Luiz, boa noite. Acho que sua pergunta se refere a criação de um bloco da linha, com o atributo "L". Na verdade você precisa criar um bloco da linha com atributo modo visível (ou o mode invisible desabilitado).
      Como fazer: 1°) trace a line desejada. 2°) digite o comando "attdef" e defina o atributo, lembrando que o mesmo deve ter o campo mode invisible desabilitado.


      3°)digite "wblock" e crie o bloco, observando o seguinte: a> você deve optar por "select objects" - e então selecionar a line e o atributo criado; b> você deve setar a opção "convert to block", e dar OK, e pronto sua linha com informação já é um bloco com atributo.

      (em seu e-mail estou mandando com mais detalhes, inclusive passo a passo ilustrado).

      Duvidas, estou a disposição: lucascezarcps@gmail.com

      Abraço

      Excluir
  4. como faço para copiar as informações dos att de um bloco (legenda) para o exel?

    ResponderExcluir
  5. Tenho um desafio para vocês !

    Criar uma auto lisp para TOPOGRAFIA que :

    Leia a DESCRIÇÃO dos pontos e atribua um bloco
    especifico para cada descrição !

    Ex:

    Ponto numero 1
    Cota 10
    Descrição Arv
    ( Colocar uma arvore )


    Ponto numero 22
    cota 222
    Descrição Eixo
    ( Colocar a linha de exio ligando todos os pontos que tem a mesma descrição como eixo. )

    Quero que a lisp leia APENAS a descrição e coloque o bloco que tem
    a mesma ( propriedade ) automaticamente sem precisar colocar 1 bloco por um ...

    A pessoa que conseguir desenvolver a lisp
    pode me mandar para o e-mail :
    assistcampogrande@gmail.com

    Ficaria GRATO DEMAIS POR ISSO !

    ResponderExcluir
  6. Harrah's Hotel And Casino - Mapyro
    Mapyro 제주 출장샵 provides information about 하남 출장마사지 Harrah's Hotel And Casino in Las Vegas and nearby. This map shows all 3415 광주광역 출장샵 rooms in the property and includes a 울산광역 출장샵 parking 포항 출장샵 garage and

    ResponderExcluir