GstarCAD - Plugins

Olá pessoal!!!

O post é para levantar uma questão:  Você usa o GstarCAD?

Bem, eu não uso... mas a questão não é essa. De uns tempos pra cá, alguns usuários me questionaram por que o EXPGE não funciona nele.

Bem, a princípio não fui muito atrás, porque se ele não roda VLX, nem ia adiantar muito eu tentar.

Então mais um apareceu perguntando e mais um, mais um...  Em fim, ME enviaram uns exemplos em DOT NET de programas para ele, daqueles que carregamos com o NETLOAD...

E não é que é idêntico a API do AutoCAD?

Isso significa que muitos dos meus programas podem rodar no GstarCAD sem muita dificuldade!!!

O caso é que, já compilei uma primeira versão do TBN2CAD para o GstarCAD 2015 64 bits e rodou quase 100%!! Ainda ficou faltando uns ajustes, mas os programas principais (EXPGE2, READKML2, IMPORTGMMAP, IMPORTGMPTS e DTAL2) já funcionam!!!

Então, eu pergunto novamente, você usa o GstarCAD? Tem interesse em testar meus programas? Entre em contato!!

C3DRENESG - Briefing

Uns tempos atrás, escrevi um pequeno texto sobre o C3DRENESG, o meu programa para dimensionamento de redes de drenagem e esgoto urbanos. 

Por algum motivo acabei esquecendo dele e ficou quase um ano parado aqui no meu computador....

Em fim, é um texto que explica em linhas gerais o que o programa faz.


Com certeza te ajudará a decidir se testa ou não o programa!!!

C3DMEMO - Tutorial para criar tabelas

Vou fazer um pequeno post hoje para mostrar como fazer tabela de locação usando o C3DMEMO.

Primeiro, baixe o programa e instale.

Depois, tenha um projeto qualquer, onde seu lote ou subdivisão tenha ao menos uma polilinha fechada.

Serve parcel no Civil 3D?
R: Claro!!!

Vamos usar o comando TABLECREATOR

A princípio vai parecer meio estranho no início, mas é bemmmmm simples, você vai ver, hehehehe

Para a coisa toda funcionar no AutoCAD puro, você precisará de uma polilinha fechada e dentro dela, insira um bloco com os atributos:  NOME, NUMERO e DESCRICAO:




Coloque o polígono no layer LOTE por exemplo.


Seria interessante que, se os vértices precisarem ter nomes, coloque blocos com atributos PONTO e DESC por exemplo:




Ao chamar o programa, a primeira coisa que ele pergunta, é se será uma tabela no excel ou é pra desenhar no cad. Aqui escolha um, tanto faz!!!

Aí, vai aparecer uma tela para configurar algumas coisas:

Confuso?
Aí o programa está te perguntando:
Quais blocos eu uso para ler os nomes dos lotes, vértices e ruas?
Quais os layers das polilinhas dos lotes, quadras e ruas?

Simples, né?

Dica: pra primeira tentativa use o DWG de exemplo do programa chamado "/dwg/CADMEMO.DWG".


Aí vai aparecer a tela abaixo:






Preste bem atenção.

No quadro da esquerda, você escolhe os lotes ou quadras inteiras. No caso selecionei apenas um lote.

No quadro da direita, vamos formatar a tabela.

Primeiro, faça um duplo-clique na palavra "Loteamento", a célula que esta selecionada na imagem.

Depois, faça duplo clique na palavra "Polígono". Vai aparecer assim:


Perceba que, ao fazer o duplo clique, o nó se expande. Estamos interessados no nó "Loteamento  / Polígonos / Segmentos", ok?



Esta coluna não aparecerá na tabela, ela só serve para dar "layout" à tabela.

Agora, vamos incluir 3 colunas: SEGMENTO, DISTANCIA, AZIMUTE

Para isso, clique o ícone indicado:


Ele insere colunas na nossa tabela.


Agora, faz duplo clique nos ícones com 3 pontinhos (...).

Abrirá uma caixa. Nela escreva o nome da coluna:




Simples, não?

Bem, faça isso para as três colunas. Vai se parecer com a imagem acima.

Agora, falta preencher a linha que escreve alguma coisa na tabela. Para isso, duplo clique no ícone marcado na célula:





Note que um segmento pode ser em arco ou pode ser uma reta e as propriedades podem variar conforme for um ou outro.

Então duplo clique no ícone da linha.


Este é o editor de macros. É nele que a coisa toda acontece.
a) clique na caixa marcada com (1)
b) escolha a propriedade "Vértice Inicial"
c) na caixa (2), no item "Mostrar",  escolha "Nome"
d) clique o botão em (3)
e) observe o resultado em (4)

Bom, agora insira em (4) um caractere traço ("-") e repita a operação anterior, escolhendo o vértice final.
Ficará algo assim:

"[VerticeInicial:(MostraVertice:Nome|Caps:Minusculo)] - [VerticeFinal:(MostraVertice:Nome|Caps:Minusculo)]"

Isso produzirá um texto parecido com "1-2", "2-3", entendeu?

Agora clique o botão "OK" para fechar o editor.

Abre o editor para coluna da distância. Nela escolha a propriedade "Comprimento". A macro vai aparecer assim no final:

[Comprimento:(CaracSepDecimal:Virgula|CasasDecimais:3|Unidade:m|MostraUnidade:SimComEspaco|CaracSepMilhar:Ponto|FNumero:Numeral)]

Note que é a propriedade "Comprimento" com uma série de configurações.

Para o azimute, as propriedades serão assim:

Ou seja, o texto:

[InfoAngulo:(MostreGrau:GrauMinSec|Unidade:grau|Angulo:Azimute|Espacado:False|CaracSepDecimal:Virgula|CasasDecimais:3|CaracSepMilhar:Ponto|FNumero:Numeral)]

Percebe a relação?

Bom.... quem usa o civil 3d já deve ter percebido a semelhança com o "Label Style Composer".

Note que as linhas que não estão "ticadas" não produzirão nenhum texto, então não aparecerão na tabela final.

Você pode ignorar elas ou clicar o botão para apagar linhas para remover elas.

No fim, deverá ser algo assim:


No total, preenchi apenas 3 células no título e 3 células com valores. Rápido, não?

Olhe no canto superior esquerdo. Clique o Botão SALVAR.

Isso mesmo!! Você vai salvar o template de tabela!!!

Agora, clique o botão "OK" e veja o resultado no Excel, se esta foi sua opção inicial:





Suponha que agora você que a planilha no cad.

Chame o comando TABLECREATOR novamente.

Escolha a opção desenhar no cad.

Informe o ponto de inserção.

No canto superior esquerdo, clique o botão "ABRIR" o template salvo.

Clique o botão "OK"

Simples né?


Sim, podem acontecer bugs. Se você achar algum, me avisa o quanto antes!!!
Aquele descontão pra ti comprar a licença!!!

C3DMEMO - Promoção ganhe uma licença

Gente, preciso de ajuda.

Para publicar o C3DMEMO na loja da Autodesk, é preciso um ícone e o atual não se enquadra.

Pra quem não sabe, o C3DMEMO é um plugin para criação de memoriais descritivos de lotes e parcelamentos, que roda dentro do AutoCAD ou do Civil 3D.

Por isso estou lançando a promoção: Uma licença do programa para o melhor ícone!!!

Pra concorrer é simples, crie uma imagem de 80x80 pixels (pode ser maior, mas deve ser quadrado, pois será redimensionado para este tamanho) que represente o programa, no formato PNG ou JPG.

Envie para o meu email (neyton@yahoo.com).

As imagens podem ser enviadas até 30-11-2014

Em seguida, ficarão expostas aqui no blog para votação até o dia 15-12-2014

O prêmio será uma licença do programa para a imagem com mais votos!!

Ele está disponível para download aqui

Autolisp - UTM para LatLon e viceversa

Bom, hoje vou voltar um pouco às origens do blog!!! Um pouco de autolisp pra relembrar os velhos tempos de programação em POG!!! A lisp abaixo na verdade são algumas subrotinas para conversão de coordenadas geográficas em UTM e viceversa. É bem fácil de usar se você souber o que é UTM e coordenada geográfica e está familiarizado com Georeferenciamento. Muitas pessoas me perguntam se eu tenho uma rotina pra converter e.... Bem, tenho!! Está aí!!
;| Conversão de UTM para GEOGRAFICA
baseado em http://recursos.gabrielortiz.com/index.asp?Info=058a
metodo: Coticchia-Surace
ay:     coorenada do semi eixo maior (m)
bx:     coorenada do semi eixo menor (m)
pt:     (cord_X coord_Y coord_Z)
fuso:   fuso, inteiro
hmsf:   hemisferio, "N" para norte e "S" para sul
se for conhecido f, temos: bx=(1-f)*ay
sad69 ->          ay = 6.378.160,000m e f = 1/298,25
corrego alegre -> ay = 6.378.388,000m e f = 1/297,00
(utm2geo (GETPOINT) 6378160.0  298.25 22 "S") => 25º25'51"15216  49º17'02"51881
|;

(defun utm2geo (pt ay f fuso hmsf / tmp e el el² c alpha lo phil nu A1 A2 J2 J4 re
                J6 beta gama Bo zeta xi eta sinhxi dl tau lat lon x y x1 y1 fe bx
)
  (
setq ay     (float ay)
        bx     (* ay (- 1 (/ 1.0 f)))
        x      (car pt)
        y      (cadr pt)
        re     6366197.724 ;raio da terra
        fe     0.9996      ;fator de escala
        tmp    (sqrt (- (expt ay 2) (expt bx 2)))
        e      (/ tmp ay) ;excentricidade
        el     (/ tmp bx) ;2ª excentricidade
        el²    (expt el 2)
        c      (/ (expt ay 2) bx);raio polar de curvatura
        x1     (- x 500000.0)
        y1     (if (or (= hmsf 'N) (= hmsf "N")) y (- y 10000000.0))
        phil   (/ y1 (* re fe))
        lo     (- (* 6 fuso) 183)
        nu     (/ (* c fe) (sqrt (1+ (* el² (expt (cos phil) 2)))))
        a      (/ x1 nu)
        A1     (sin (* 2 phil))
        A2     (* A1 (expt (cos phil) 2))
        J2     (+ phil (/ A1 2.0))
        J4     (/ (+ (* J2 3.0) A2) 4.0)
        J6     (/ (+ (* 5.0 J4) (* A2 (expt (cos phil) 2))) 3.0)
        alpha  (/ (* 3.0 el²) 4.0)
        beta   (* (/ 5.0 3.0) (expt alpha 2))
        gama   (* (/ 35.0 27.0) (expt alpha 3))
        Bo     (* fe c (+ phil (* (- alpha) J2) (* beta J4) (* (- gama) J6)))
        b      (/ (- y1 Bo) nu)
        zeta   (* (/ (* el² (expt a 2)) 2.0) (expt (cos phil) 2))
        xi     (* a (- 1.0 (/ zeta 3.0)))
        eta    (+ (* b (- 1.0 zeta)) phil)
        sinhxi (/ (- (exp xi) (exp (- xi))) 2.0)
        dl     (atan (/ sinhxi (cos eta)))
        tau    (atan (* (cos dl) (tan eta)))
        lon    (+ (* (/ 180.0 pi) dl) lo)
        lat    (* (/ 180.0 pi)
                  (
+ phil (* (+ 1.0
                                (* el² (expt (cos phil) 2.0))
                                (
* (/ -3.0 2.0) el² (sin phil) (cos phil) (- tau phil)))
                             (
- tau phil)))))
  (
if (caddr pt)
    (
list lon lat (caddr pt))
    (
list lon lat 0.0)))


;pt -> long lat
;a  -> semi eixo maior
;f  -> achatamento
(defun geo2utm (pt a f / b e el el² c lamb fi fuso lo deltal Am eps n v
                S A1 A2 J2 J4 J6 alfa beta gama bo
)
  (
setq a      (float a)
        b      (- a (/ a f))
        el     (/ (sqrt (- (expt a 2) (expt b 2))) b)
        el²    (expt el 2)
        c      (/ (expt a 2) b)
        fuso   (fix (+ (/ (car pt) 6.0) 31))
        lamb   (/ (* (car pt) pi) 180.0)
        fi     (/ (* (cadr pt) pi) 180.0)
        lo     (- (* fuso 6) 183) ;meridiano central
        deltal (- lamb (/ (* lo pi) 180.0))
        Am     (* (cos fi) (sin deltal))
        eps    (* 0.5 (log (/ (+ 1 Am) (- 1 Am))))
        n      (- (atan (/ (tan fi) (cos deltal))) fi)
        v      (/ (* c 0.9996) (sqrt (+ 1 (* el² (expt (cos fi) 2)))))
        S      (/ (expt (* el eps (cos fi)) 2) 2.0)
        A1     (sin (* 2.0 fi))
        A2     (* A1 (expt (cos fi) 2.0))
        J2     (+ fi (/ A1 2.0))
        J4     (/ (+ (* 3.0 J2) A2) 4.0)
        J6     (/ (+ (* 5 J4) (* A2 (expt (cos fi) 2))) 3.0)
        alfa   (/ (* 3.0 el²) 4.0)
        beta   (* (/ 5.0 3.0) (expt alfa 2))
        gama   (* (/ 35.0 27.0) (expt alfa 3))
        bo     (* 0.9996 c (+ fi (* (- alfa) J2) (* beta J4) (* (- gama) J6))))
  (
list  (+ 500000.0 (* eps v (1+ (/ S 3.0)))) ;x
         (+ bo (* n v (1+ S)) (if (< lat 0.0) 10000000.0 0.0));y
         (caddr pt)
         ))

(
defun LLA_wgs84->sad69 (pt)
   (
geo2geo pt 6378137.0 298.257223563 6378160.0 298.25 66.87 -4.37  38.52))

(
defun LLA_sad69->wgs84 (pt)
   (
geo2geo pt 6378160.0 298.25  6378137.0 298.257223563 -66.87  4.37 -38.52))


      
(
defun geo2geo (pt ;long_from lat_from h_from ;coordenadas geodesicas de origem
                a_from f_from             ;parametros geodesicos de origem
                a_to   f_to               ;parametros geodesicos de destino
                dx dy dz                  ;translação origem->destino
                / lat1 long1 f1 f2 a1 a2 e²1 e²2 N1 N2 Xw Yw Zw b2 p teta fi lamb hb ep²)
  (
setq lat1   (/ (* (cadr pt) pi) 180.0)
        long1  (/ (* (car pt) pi) 180.0)
        f1     (/ 1.0 f_from)        ;wgs
        a1     a_from                ;wgs
        e²1    (* f1 (- 2.0 f1))
        N1     (/ a1 (sqrt (- 1.0 (* e²1 (expt (sin lat1) 2.0)))))
        ;coord carteziana no sistema de origem:
        Xw     (* (+ N1 (caddr pt)) (cos lat1) (cos long1))
        Yw     (* (+ N1 (caddr pt)) (cos lat1) (sin long1))
        Zw     (* (+ (* N1 (- 1.0 e²1)) (caddr pt)) (sin lat1))
        ;coord carteziana do ponto no novo sistema:
        Xb     (+ Xw dx)
        Yb     (+ Yw dy)
        Zb     (+ Zw dz)
        ;converter carteziana para geodesica:
        f2     (/ 1.0 f_to)
        a2     a_to
        e²2
    (* f2 (- 2.0 f2))
        b2     (* a2 (- 1.0 f2))
        p      (sqrt (+ (expt Xb 2) (expt Yb 2)))
        teta   (atan (/ (* Zb a2) (* p b2)))
        ep²    (/ (- (expt a2 2.0) (expt b2 2.0)) (expt b2 2.0))
        fi     (atan (/ (+ Zb (* ep² b2 (expt (sin teta) 3.0))) (- p (* e²2 a2 (expt (cos teta) 3.0)))))
        lamb   (atan (/ Yb Xb))
        N2     (/ a2 (sqrt (- 1.0 (* e²2 (expt (sin fi) 2.0)))))
        hb     (- (/ p (cos fi)) N2))
  (
list (/ (* 180.0 lamb) pi);long
        (/ (* 180.0 fi) pi)  ;lat
        hb)                  ;altitude
  )



Link(s) da(s) subrotina(s) usada(s): tan
A dificuldade nem está nos cálculos em si, mas na sintaxe das fórmulas, não acham??

Civil 3D - Livro

Olá pessoal, este post é para agradecer ao Marcus Cardoso, por me enviar uma cópia do seu livro:
 

 Valeu Marcus, o livro é excelente!!! E já está ajudando!!


Arquivos dwg aumentando de tamanho

Fala pessoal, desta vez vou postar uma dicazinha básica para resolver um problema que tivemos aqui no escritório que possivelmente alguns de vocês também já tiveram ou ainda vão ter!!!

São aqueles arquivos que inexplicavelmente passam a ter dezenas de mega bytes sem razão aparente.

Desenhos que deveriam ter seus 500KB passam do 40MB!!! Aqui tivemos muito esse problema... 

Outro sintoma é o COPY / PASTE não funcionar. 

Pois bem, O problema:

Em algum momento, o desenho que você está trabalhando foi criado ou mesmo modificado pelo MicroStation, da Bentley.
E neste momento o desenho recebeu um estilo de linha qualquer o qual o AutoCAD não consegue gerenciar, então ocorrem estes problemas.

Consiste num programinha que após instalado, cria um comando no AutoCAD, o comando DGNPURGE

Para funcionar de acordo, baixe o programa e descompacte na pasta do AutoCAD conforme sua versão:


Veja também a explicação de instalação da própria Autodesk aqui

Note que existem no pacote duas pastas, uma com arquivos para a versão em 32 bits (px86) e para a versão 64 bits (px64) do AutoCAD.

Em cada pasta há dois arquivos (DGNLSPURGE.dll e ACDGNLS.dbx)

Ambos devem ser descompactados na pasta do AutoCAD.

Então carregue com o comando NETLOAD o DGNLSPURGE.dll
Agora, é só rodar o comando DGNPURGE no seu desenho e depois um PURGE e pronto!!!
Seu desenho de 134MB acabou de virar um arquivo normal, de 457 KB!!!
Mágico, não???

C3DMEMO - Programa para criar memoriais descritivos - Civil 3D e AutoCAD

E finalmente o link do programa de memoriais descritivos!!!

Roda em Civil 3D e AutoCAD puro!!!

Veja o programa agora mesmo:
https://tbn2net.com/C3DMEMO

Baixe ele para testar aqui: Download

veja algumas telas do programa:
Programa que gera o memorial em documento do M$ Word:

Programa que cria as folhas com o croqui do lote com seu descritivo:

Programa que cria tabelas para locação por exemplo:


Para a versão que roda no AutoCAD, tem ainda a tela para configurar o programa:



Aqui vemos o editor de macros:


Este sim evoluiu muito!!! Inicialmente ele iria funcionar com HTML, mas aí pensei, para muita gente HTML é ruim de trabalhar, pois é meio que voltar pra era do MS-DOS ou coisa assim, hehehe!!!

Agora o programa de Memorias pode formatar o texto quase como se fosse num editor de textos de verdade!!!

A simplicidade do programa vai tornar o processo muito mais produtivo e a forma como implementei, se parecendo com o "Label Style Composer" do Civil 3D ficou, modéstia à parte, show de bola!!!

Bom, esta é a primeira versão deste programa então, apesar de eu testar ele exaustivamente, pode ter bugs!!

Mas é isso, pode baixar ele aqui: Download

Civil 3D - Parcels - Memoriais Descritivos

Olá pessoal!!

Este post é para mostrar as novidades sobre o novo programa que estou escrevendo, sobre memoriais descritivos.

Bem, na verdade já havia falado sobre ele aqui, mas a verdade é que estava sem tempo de mexer nele e a demanda parecia ser baixa... Em fim, Consegui um tempo para voltar a este programa alem de ter mais motivação ($$$) para fazer ele.

No momento, o programa está rodando sobre o Civil 3D, usando os Parcels e os Alignments.

Por exemplo, considerem a plata abaixo:
 É o projeto de um pequeno loteamento numa certa cidade, que trabalhei uns tempos atrás.

O programa, agora pode interpretar os lotes, calculando onde está sua frente, fundo e lados direito e esquerdo. Também pode dizer se um lado está para o norte ou sul e também informar quais os confrontantes do mesmo.

Ele pode calcular sozinho onde é a frente, onde o polígono começa e essas coisas.

Ah, claro, serve para glebas rurais também. Ele pode mostrar: perímetro, área, azimute, ângulo interno, etc...

Veja algumas telas:
Nesta tela, escolhemos os Parcels que serão processados e também qual o template do memorial.
 
O template do memorial é feito usando HTML e cada informação que se quer mostrar por exemplo, o comprimento de um segmento, é dado com uma macro. 
 
Veja como se faz a edição:



Legal né? Fiz de maneira a parecer o "Label Style Composer" do Civil 3D, onde você escolhe a propriedade na caixainha da esquerda, marca as propriedades no quadro abaixo dela e clica a seta para incluir a macro no quadro da direita.
 
Para propriedades que são listas, é possível editar a macro para a lista. Então se na tela acima escolhemos o item [[Quadras:(ListaMostra:Items|Separador:Espaco|ID:1)]] e clicamos o botão Editar, vemos:
Note que um polígono, ou parcel tem várias propriedades, como Área, segmentos.
A área pode ser escrita como número, ou talvez queiramos o valor escrito por extenso. Sim, o programa faz isso!!!
 
No exemplo, preferi só montar tabelas, com o nome do segmento, comprimento, azimute, X e Y. Veja como seria uma tabela feita em HTML:







[[Segmentos:(ListaMostra:Items|Separador:Espaco|ID:4)]]
SegmentoComprimentoAzimuteXY
 
Parece dificil, mas não é tanto assim. Se você usou o ORKUT, em algum momento deve ter usado HTML para fazer alguma graça, hehehe!!!
 
Bem, veja o resultado:
 

 Aí ele pode ser salvo em HTML, DOC... 
 
É isso.
 
Os interessados, entrem em contato para solicitar um demonstrativo.
 
Quem quiser contribuir com o desenvolvimento, dando sugestões ou mesmo criando alguns algoritmos, fique a vontade!!
 
No momento, faltam:

  1. Botão para imprimir ou coisa assim
  2. Melhorar a detecção do Norte, Sul, Leste, Oeste
  3. Implementar transformação de coordenadas locais para UTM, usando a API do Civil 3D/Map.Geo. O programa já converte UTM para Lat/Lon usando esta API.
  4. Criar um "plan production" para os parcels, para que gerem uma folha, por exemplo, em A4, com o croqui do lote. 
  5. Identificar o artigo, para não escrever "o rua" ou "a lote"
  6. Traduzir o programa para inglês

 E claro, testar muuuuuiiiiitoooo o programa!!!

 


tbn2net.appspot.com

Olá, hoje quero compartilhar com vocês algumas estatísticas sobre o tbn2net, a minha página de programas.

Bem, criei este site inicialmente para gerenciar as licenças dos programas que desenvolvo, pois estava se tornando difícil manter eles atualizados e avisar os clientes sobre estas atualizaçãoes.

Alguns clientes inclusive devem me achar um chato, hehehe pois tem atualizações um tanto quanto frenquentes.

Bom, não sei quanto disso chega a ser inconveniente e a alguns dei razão e... atualizei os programas!!!

Hoje a maioria dos programas permanecem funcionando normalmente quando estão desatualizados e alguns poucos não, em fim, é um mal necessário....

Mas vamos, vamos ver estas estatísticas:


Esta é uma tela do APPENGINE do google, que é o "motor" da página. Ela mostra o número de chamadas nas últimas 24h. Então vejo que tem 2.1K, ou aproximadamente 2100 chamadas.

Pode parecer pouco, mas veja que isso acontece com uns programas prá lá de desconhecidos, que são usados por engenheiros, arquitetos, topógrafos e desenhistas. Não é uma "feice" da vida, hehehe

Houveram 82 downloads e e 116 visualizações das páginas dos programas.

O mais popular indiscutivelmente é o EXPGE, para exportar o desenho do AutoCAD para o Google Earth.

Engraçado é como as pessoas que me ligam pronunciam o nome do programa... hehehehe bem, quando criei ele, não pensei nisso.... Acabou ficando assim porque juntei as palavras: EXPortar  para o Google Earth. Ele tá a tanto tempo na net que alguns até duvidam que eu seja o autor.... vai entender...

Outra estatística:
Programa Downloads
EXPGE 14395
C3DRENESG4 2760
IMPORTGMMAP 2281
READKML2 1377
EXPGE2 1290
PLH 1172
C3DRENESG2 933
SUBASSEMBLIES 864
MLH2 826
NOTASERV 765
IMPORTGMPTS 732
C3DRENESG 643

A tabela acima mostra a quantidade de downloads desde outubro de 2013, para cada programa.
Não tenho estatísticas anteriores a isso, mas pra ter uma ideia, o EXPGE está no ar desde abril de 2008, e já achei ele no 4shared várias vezes, então....

Agora alguns programas estão disponíveis na loja da autodesk e estão ganhando o mundo... Então, quero agradecer a todos os meus clientes que adquiriram uma licença ou mesmo muitas delas!!! E obrigado pela paciência com as atualizações!! É como sempre digo: se você tiver uma ideia para melhorar o programa, entre em contato, se for possível, eu implemento sua ideia!!!

É isso

Reactor e Xdata; Coisas de doido

Por estes dias me perguntaram como usar reactors. Bem, não é complicado, mas o help não ajuda muito... enfim... Considere o exemplo abaixo:

;nome da xdata
(setq xdata:nome "TESTEXDATAREACTOR")

;carrega funções vl*
(vl-load-com)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;subrotina para adicionar xdata na entidade
;ent -> ename, por exemplo: <Entity name: 7ffff4104e0>
;xdappname -> string, nome da xdada
;xdata elista da xdata, formato:
;((ExtendDataDxfCode . Valor) ... (ExtendDataDxfCode . Valor))
(defun xdata->put  (ent xdappname xdata / elist)
  ;garanta que o nome da xdata esta no banco de dados do cad
  (regapp xdappname)
  

  ;adiciona a xdata no elist da entidade
  (setq elist (entget ent)
    elist (cons (list -3 (cons xdappname xdata)) elist))

  ;atualiza a entidade
  (entmod elist)
  (
entupd ent)
  )


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;reactor para ação da linha sendo modificada
;note que este reactor não causa modificações na LINHA, apenas no texto
;se fazemos um reactor causar modificações em algo que dispara reactors,
;temos de desabilitar eles antes de modificar
;parametros:
;linha, é o objeto que notificou o reactor, no caso a linha
;rea, é o ponteiro para o objeto do reactor
;par, são parâmetros adicionais que podem ser passados ao reactor
;na hora que o criamos, no caso, não passamos nenhum dado extra
;então não usamos o seu valor, que será nil
(defun reactor->modified (linha rea par / params texto)
  ;obter os dados do reactor. note que não seria necessario
  ;pois poderiamos encontrar o texto pelo xdata.
  ;no caso é só para mostrar o uso da função vlr-data
  ;para obter o texto pela xdata, veja a subrotina reactors->aciona
  (setq params (vlr-data rea)
    texto  (car params))

  ;atualizar o conteudo do texto:
  (vla-put-textstring
    texto
    (strcat "l=" (rtos (vla-get-length linha) 2 2)))

  (
vla-put-insertionpoint texto (vla-get-startpoint linha))
  )


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;subrotina para "ligar" os reators para as linhas já desenhadas
;em um desenho com o nosso novo comando "teste"
(defun reactors->aciona (/ ss ent linha xdata texto)
  ;seleção das linhas que tem a nossa xdata
  (setq ss (ssget "X" (list
            '(0 . "LINE")
            (
list -3 (list xdata:nome)))))

  ;se ela existir, processa as linhas
  (if ss
    (repeat (sslength ss)

      ;pega a primeira linha
      (setq ent   (ssname ss 0) ;ename
        linha (vlax-ename->vla-object ent) ;ename para vla
        xdata (assoc -3 (entget ent (list xdata:nome))) ;xdata da linha
        ;agora, pega o handle, que é string, acha o ename e obtem o vla
        texto (vlax-ename->vla-object (handent (cdr (cadadr xdata))))
        )



      ;cria o reactor para a linha
      (vlr-object-reactor
          (list linha) ;objeto modificado que notifica o reactor
          (list texto) ;parametros a serem passados
          '((:vlr-modified . reactor->modified)))

      ;tira a linha da seleção e reinicia o looping
      (ssdel ent ss)
      )
    )

  ;perfumaria:
  (princ "\nReactors criados")
  )




;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;função principal
(defun c:teste (/ linha texto pa pb thisdrawing model xdata)

  ;desenha uma lina e um texto no modelspace:
  (setq pa          (getpoint "\nPa")
    pb          (getpoint pa "\nPb")
    

    ;obtem o ponteiro para o modelspace
    thisdrawing (vla-get-activedocument(vlax-get-acad-object))
    model       (vla-get-modelspace thisdrawing)

    ;cria uma linha no model
    linha       (vla-addline model
              (vlax-3d-point pa)
              (
vlax-3d-point pb))

    ;cria um texto no model
    texto       (vla-addtext model
              (strcat "l=" (rtos (vla-get-length linha) 2 2))
              (
vlax-3d-point pa)
              4)
     )


  ;vincula a linha ao texto usando um xdata
  ;1005 é o dxfcode de xdata para "handle" da entidade
  (xdata->put
    (vlax-vla-object->ename linha) ;ename da linha
    xdata:nome ;nome da xdata
    (list (cons 1005 (vla-get-handle texto))) ;a xdata propriamente dita
    )
  


  ;cria um reactor para linha, associando ao evento de modificar a linha
  (vlr-object-reactor
          (list linha) ;objeto modificado que notifica o reactor
          (list texto) ;parametros a serem passados
          '((:vlr-modified . reactor->modified) ;evento a ser chamado ao disparar o reactor
        ))

  ;perfumaria
  (princ "\nFeito")
  )



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;sempre que a lisp for carregada com APPLOAD,
;será acionada a função 'reactors->aciona' para "ligar" os reactors nas linhas criadas
;com o comando que criamos
(reactors->aciona)


O exemplo pede dois pontos, por ele faz passar uma linha e cria um texto no inicio da linha.

Na linha, cria um vinculo com o texto atravez de xdata.

Por fim, cria um reactor, que é um evento. Este evento modifica o conteúdo e a posição do texto conforme modificamos a linha. Simples, não?

O evento que você informa no reactor é monitorado pelo cad e quando acontece o evento, o reactor dispara uma função que informamos.

Igual aos eventos do VBA ou VB. Claro que o exemplo é bem simples, ainda falta monitorar o que acontece se apagamos o texto por exemplo.

O reactor não teria o que atualizar e um erro seria mostrado.

Outro exemplo: Se copiássemos a linha, o texto também poderia ser copiado.....

Outro exemplo: Se editássemos o texto, o reactor não faria nada até modificar a linha.
Neste caso, poderíamos monitorar edições no texto.

Se o fizermos, temos de ter em mente que se precisar modificar o texto, o reactor que o monitora precisa ser desligado antes de editar ele....

Para esta situação, procure por reactor no meu blog. Tem algumas rotinas bem legais!!!