Rotina que retorna os dados ou informações de Blocos Dinâmicos

Implementação de melhorias e aumento no nível de segurança.

Moderador: Moderadores

Responder
Indionei.matos
Madeira
Madeira
Mensagens: 13
Registrado em: Qua 16 Out 2019 9:54:56 am

Rotina que retorna os dados ou informações de Blocos Dinâmicos

Mensagem por Indionei.matos »

Boa Tarde, pessoal.

Procurei aqui no forum, mas não consegui encontrar alguma rotina ou alguém ensinando, dando alguma dica para retornar as informações de blocos dinâmicos.

Eu tenho aqui na empresa blocos dinâmicos de pilares, que eu troco as informações do tipo: Nasce, Continua e Morre, e uma outra informação que é a seção do pilar, tipo: 40x40, 40x60, e assim por diante.
O que eu quero é tirar essas informações com uma rotina no AutoLisp. Tentei usar "entnext como faço para acessar as informações de blocos composto, ex. blocos com atributos. Não deu certo.

Se alguém puder me dar uma dica agradeço.
Grande abraço!!!
Indionei C. de Matos
Avatar do usuário
Carlos Fernando
Concreto
Concreto
Mensagens: 26
Registrado em: Sex 29 Dez 2017 4:17:25 pm

Re: Rotina que retorna os dados ou informações de Blocos Dinâmicos

Mensagem por Carlos Fernando »

Boa tarde
Acho que vc consegue resolver isso usando as funções vla.
De uma olhada nesta pagina
http://www.lee-mac.com/dynamicblockfunctions.html

Acredito que a função LM:setdynpropvalue pode ser aplicada no seu caso.
Eu faria assim:
- criar uma seleção geral do bloco que vc deseja alterar com o uso do ssget;
- criar um looping dessa seleção e usar a função LM:setdynpropvalue;
- colocar como argumento (prp) a propriedade que vc quer alterar;
- colocar como argumento (val) o valor nil para "apagar" a propriedade.

Veja se vc consegue fazer assim. Poste aqui e eu e os outros o ajudaremos.
Se bem que o pessoal do forum anda bem sumido...
Indionei.matos
Madeira
Madeira
Mensagens: 13
Registrado em: Qua 16 Out 2019 9:54:56 am

Re: Rotina que retorna os dados ou informações de Blocos Dinâmicos

Mensagem por Indionei.matos »

Opa.
Obrigado Carlos Fernando, vou tentar e te aviso o que vai dar.
Valeu!!!
Indionei.matos
Madeira
Madeira
Mensagens: 13
Registrado em: Qua 16 Out 2019 9:54:56 am

Re: Rotina que retorna os dados ou informações de Blocos Dinâmicos

Mensagem por Indionei.matos »

Carlos Fernando escreveu: Ter 10 Mar 2020 1:28:02 pm Boa tarde
Acho que vc consegue resolver isso usando as funções vla.
De uma olhada nesta pagina
http://www.lee-mac.com/dynamicblockfunctions.html

Acredito que a função LM:setdynpropvalue pode ser aplicada no seu caso.
Eu faria assim:
- criar uma seleção geral do bloco que vc deseja alterar com o uso do ssget;
- criar um looping dessa seleção e usar a função LM:setdynpropvalue;
- colocar como argumento (prp) a propriedade que vc quer alterar;
- colocar como argumento (val) o valor nil para "apagar" a propriedade.

Veja se vc consegue fazer assim. Poste aqui e eu e os outros o ajudaremos.
Se bem que o pessoal do forum anda bem sumido...

Olá Carlos.

Não consegui avançar muito por conta desses argumentos que não entendo nada deles.
Se caso você tiver alguma apostila que explique mais sobre esse assunto e puder me enviar, eu agradeço.

Na minha dúvida inicial eu disse que queria tirar as informações, mas na verdade eu quero salvar as informações em uma variável para colocar em algum texto depois.

Sempre vejo aqui no forum algumas rotinas que usam argumentos e quase sempre quando é usado a função Lambda.

Agradeço pela atenção.
Indionei C de Matos
Avatar do usuário
Carlos Fernando
Concreto
Concreto
Mensagens: 26
Registrado em: Sex 29 Dez 2017 4:17:25 pm

Re: Rotina que retorna os dados ou informações de Blocos Dinâmicos

Mensagem por Carlos Fernando »

Indionei
Sem problemas.

Se vc quer apenas pegar as informações do bloco dinamico então
é só usar a função LM:getdynprops que está na mesma pagina que te passei.
Veja como fica:

Código: Selecionar todos

(defun c:infblc (/ bloco)
    (setq bloco (car (entsel "\Selecione o bloco: ")))
    (if (= "INSERT" (cdr (assoc 0 (entget bloco))))
        (setq l (LM:getdynprops (vlax-ename->vla-object bloco)))
        (exit)
    )
    (princ)
)

;; Get Dynamic Block Properties  -  Lee Mac
;; Returns an association list of Dynamic Block properties & values.
;; blk - [vla] VLA Dynamic Block Reference object
;; Returns: [lst] Association list of ((<prop> . <value>) ... )

(defun LM:getdynprops (blk)
    (mapcar '(lambda (x) (cons (vla-get-propertyname x) (vlax-get x 'value)))
            (vlax-invoke blk 'getdynamicblockproperties)
    )
)
Nesse caso a variavel l contem uma lista dos dados para um unico bloco daí
vc trabalha como quiser com essa lista ou faz o looping para outros blocos.



Vc quer saber como usar funções que exigem argumentos?
Nesse caso veja esses videos do Sergio do canal Manual de Cad
https://www.youtube.com/watch?v=o0GDNvfwiK4

Repare que a linguagem AutoLisp trabalha com entidades(entity names) já
as funções do VisualLisp (essas que começam com vl-) exigem objetos.
Veja que a função LM:getdynprops exige um argumento na forma de objeto, então
eu usei a função "vlax-ename->vla-object" para transformar o bloco em um objeto.

Vc quer saber como usar a função LAmbda?
Veja esses tutorias:
http://www.lee-mac.com/mapcarlambda.html
https://www.afralisp.net/autolisp/tutor ... lambda.php

Eu achei esses pdfs do afralisp no meu computador eu acho que nem cheguei a ler tudo
o unico problema é que é tudo em ingles
https://drive.google.com/open?id=1MNcDB ... uChyt2GXjg


Eu leio muito o Help do Autocad. Lá tem bastante informação e exemplos e
eu recomendo que vc navegue por lá também.

Eu tb tenho um pdf de um livro sobre autolisp é um pouco limitado e básico mas pelo menos é em portugues
eu vou dar um vasculhada no meu computdor e depois te passo.

No mais é muita tentativa e erro...

Flw
Indionei.matos
Madeira
Madeira
Mensagens: 13
Registrado em: Qua 16 Out 2019 9:54:56 am

Re: Rotina que retorna os dados ou informações de Blocos Dinâmicos

Mensagem por Indionei.matos »

Olá Carlos Fernando.... Queria pedir desculpa pela demora da resposta da sua resposta. hehehe.
O trabalho está bem corrido e a faculdade junto, aí fiquei na correria, mas vamos lá.

Eu testei o seu exemplo e foi o que eu queria realmente, a rotina me retorna uma lista que dali em diante eu consigo fazer o que quiser com os valores dentro dessa lista. Até dei uma entendida um pouquinho sobre o argumento de ( entity name para Objeto).

E no final do seu Post, vc menciona que é assim mesmo, tentando e errando, isso me conforta bastante, pois eu sempre vou tentando, errando e tentando novamente, aprendendo e assim vai.

Aproveitando, já vou fazer outra pergunta em cima do mesmo tema.

Se eu tiver um bloco dinâmico desse e um atributo junto em que eu altere os valores e depois eu atualizo o bloco dinâmico conforme o valor do atributo.
Vou ter as duas opções:
1ª - A seção do pilar conforme o desenho do bloco dinâmico e atualizo os atributos usando a rotina que vc passou;
2ª - Editando o atributo e depois atualizo a seção do pilar conforme os valores do Atributo.
Não sei se vc entendeu.

Um grande Abraço fera!!!!
Muito Obrigado pelas dicas.

Atenciosamente,
Indionei C. de Matos
Responder