Pesquisar este blog

terça-feira, 23 de outubro de 2012

convertendo coordenadas de notação científica para texto


Convertendo Coordenadas de lista "entity list" (notação científica) para texto (string)


Boa noite

     Hoje vou atender a duas solicitações de um leitor de uma vez só: 1°) ao captar a(s) coordenadas de um objeto, como faço para processá-las?; 2° como convertê-las de notação científica, que é a notação corrente das entity lists do Cad, para um formato manipulável (exemplo: formato texto). Para isso, vou lhes passar uma função que criei, bem útil, que se chama "converte_utm_list-string".    


;converte um valor de utm bruto (em formato lista entity list, notação científica, para texto string
(defun converte_utm_list-string (utmbruta) ;utmbruta deve ser um parâmetro coordenada extraída através de entity list (assoc dxf 10 ou 11)

   (setq coordenada_X (car utmbruta)) ;decomposição em "x" de utmbruta 
   (setq coordenada_X (rtos coordenada_X 2 4))  ;conversão para texto  
   (if (/= (strlen coordenada_X) 11) ;validação último caracter da coordenada   
      (setq  coordenada_X (strcat coordenada_X "0")) ;tratamento técnico do arredondamento
   )  
   (setq coordenada_Y (car (cdr utmbruta))) ;decomposição em "y" de utmbruta 
   (setq coordenada_Y (rtos coordenada_Y 2 4)) ;vale tudo o visto para "x"
   (if (/= (strlen coordenada_Y) 12)
      (setq  coordenada_Y (strcat coordenada_Y "0"))
   )  
   (setq utmstring (strcat coordenada_X ", " coordenada_Y)) ;formação de string para coordenada (lay-out flexível)
   utmstring   ;retorno da coordenada em formato texto.
)


Exemplo de uso: Supondo que "utmbruta" já tenha seu valor extraído de um objeto, e no mesmo já feito o "car" para exclusão do campo chave do par associado, e a variável já carregada:

      utmbruta = (10 222344.0   7.56463e+006    0.0)  

      utmlapidada = (converte_utm_list-string (utmbruta))

      utmlapidada = 222344.0236 7564632.0356
      
Valeu, abraço.

quarta-feira, 17 de outubro de 2012

Layers: ligando e desligando via código

Boa noite


     Irei falar sobre um assunto relativamente simples, mas que dá muito trabalho aos programadores iniciantes em Auto-Lisp: a manipulação da janela de layers (camadas). Especialmente, neste artigo, irei falar sobre as operações: "Criar um layer"; "Setar um layer"; "Ligar um (ou mais) layer"; e "Desligar um (ou mais) layer" usando a linguagem auto lisp. Ainda irei dar uma dica sobre o operador "*" junto a valores strings.
     Para início, é importante ter-se alguns entendimentos básicos de autocad sobre o assunto:
        > O layer padrão de todo arquivo é o "0". Para a construção de blocos, é útil que todo o traçado do elemento seja feito neste layer, pois ele sendo um bloco em outro arquivo, o mesmo automaticamente assumirá os valores do layer em que foi inserido;
        >  na definição de layers, pode-se setar propriedades como cor de visualização, tipo de traçado da linha, espessura padrão da linha, cor de plotagem, se ele é plotavel, se ele pode ser apenas um viewpoint, e ainda descrever para que o mesmo serve (description).
     Ao digitar o comando layer no prompt nas versões atuais do auto cad, é provável que se apresentará uma janela amigável para se configurar e editar os layers. Com tudo, a manipulação de layes via auto-lisp tem de ser estruturada como era nas versões mais antigas - ou seja - via linha de comando. Vamos então as operações propostas:


  • criar um layer:
(command "layer" "m" "O_NOME_DO_LAYER" "c" "blue" "" "")

 - sendo "m" de "Make"; "c" de "Color", e "" "" como confirmação de comando (duplo enter)

  • setar um layer:
(command "layer" "s" "O_NOME_DO_LAYER" "" "") 

- sendo "s" de "SET"; "c" de "Color", e "" "" como confirmação de comando (duplo enter)

  • ligar um layer (ou uma lista de layers):
(command "layer" "ON" "O_NOME_DO_LAYER" "" "") 

  • desligar um layer (ou uma lista de layers):
(command "layer" "OFF" "O_NOME_DO_LAYER" "" "") 

prezados, até mais...












    segunda-feira, 25 de julho de 2011

    Layers: manipulando via código (programação autolisp)

    Boa noite


         Irei falar nas próximas postagens sobre um assunto relativamente simples, mas que dá muito trabalho à compreensão aos programadores iniciantes em Auto-Lisp: a manipulação da janela de layers (camadas). Inicialmente neste artigo, irei falar sobre a operação "Criar um layer". Nas postagens seguintes irei abordar as ações: "Setar um layer"; "Ligar um (ou mais) layer"; e "Desligar um (ou mais) layer", "Congelar / Descongelar um layer" - usando a linguagem autolisp, é claro. Ainda irei dar uma dica sobre o operador "*" junto a valores strings.
         Para início, é importante ter-se alguns entendimentos básicos de autocad sobre o assunto:
            > O layer padrão de todo arquivo é o "0". Para a construção de blocos, é útil que todo o traçado do elemento seja feito neste layer, pois ele sendo um bloco em outro arquivo, o mesmo automaticamente assumirá os valores do layer em que foi inserido;
            > Por defalt, o autocad apresentará uma "janela" para gerenciamento de layers. No autolisp, será utilizado o modo texto (prompt).  
         Bom... chega de enrolação e vamos a luta: criando um layer:


         - O primeiro passo é entender o simulador de prompt "command". É bem simples: o command irá transformar sua linha de código numa operação no cad via teclado, como se fosse um "emulador". Vejam o Exemplo:

        ;...
         (setq POINT1 "0,0,0")             ; define o 1º ponto              
        (setq POINT2 "10,10,0")         ; define o 2º ponto  
        (command  "line" POINT1 POINT "")  


    ;    O comando "command" emula o "prompt" do autocad. A partir daí procedemos como se estivéssemos desenhando no autocad via teclado, só que com os passos encadeados entre os parenteses. Reparem que para fechar o comando  foi usado  "" (aspas dupla).  Na linha 'command', "" (aspas dupla) corresponde a tecla ENTER. 

          - Para criar um layer, então chamaremos o gerenciador de camadas do autocad pelo modo prompt (e não no modo window, como a versão de instalação default). Para isso, usaremos o comando "command", agora com o mesmo entendido. Para criarmos um layer, devemos ter em mente: o nome deste novo layer, a cor do mesmo "emulador". Vamos a um Exemplo:


    (command "layer" "m" "TESTE1" "c" "red" "" "")      


    ;   No exemplo, "m" é a chamada de prompt para Make, "TESTE1" é o nome do layer que está sendo criado, "c" é a chamada para Color, e "red" é a cor definida para o layer.


           - Podemos usar código para definir uma cor:


    (command "layer" "m" "TESTE2" "c" "10" "" "") 


    Na próxima postagem iremos ver como manipular mais propriedades dos layers (camadas).


    Até mais


    Lucas Cezar 

    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

    Blog Autolisp : programando com Auto-Lisp (apresentação)

    Olá.

          Estou iniciando este blog, sendo que espero que este texto de apresentação, seja o primeiro de muitos a ser postado. O intuito de manter este blog é o de compartilhar conhecimentos sobre "Auto-Lisp" - a linguagem de programação para automação de rotinas de ferramentas da Autodesk (ou Lisp como preferem alguns). A iniciativa de postar artigos foi tomada afim de popularizar a linguagem e seus recursos, ajudar novos programadores e curiosos, e sobretudo a evitar que estes últimos percam demasiado tempo para solucionar questões, em posterior análise relativamente simples, mas quando se está "cru", parecem irresolutas. Também pela falta de artigos em português ou em domínios "br", ou por ainda quase não existir bons livros técnicos à respeito (Cito como um excelente livro para iniciantes "Autolisp 2002 Linguagem de Programação do Autocad", de Elia Matsumoto, Editora Erica).
          Estarei sempre buscando postar artigos que realmente sirvam a sanar as dúvidas e resolver os problemas encontrados no dia a dia dos desenvolvedores e dos usuários das ferramentas autocad, desde as mais simples às mais complexas abordagens.
          Coloco ainda que este blog está aberto a toda colaboração - pois na medida que me ponho a compartilhar com meus conhecimentos, em dobro espero aprender com novos colaboradores.

    Obrigado

    Lucas Cezar
      email: lucascezarcps@gmail.com
       msn: lucascezarcps@hotmaisl.com
    skype: lucascezarcps