Mostrando postagens classificadas por relevância para a consulta expge. Ordenar por data Mostrar todas as postagens
Mostrando postagens classificadas por relevância para a consulta expge. Ordenar por data Mostrar todas as postagens

Erros na instalação do EXPGE


Olá, já atualizou o EXPGE?

Ainda não? Então atualiza neste link: http://tbn2net.com/showprog.php?id=EXPGE

Pode ser que você tenha um problema ao carregar o EXPGE com o comando APPLOAD, aparecendo um erro parecido com esse:

Ou ainda, algo assim:


Isso indica que você deve ter mais de uma pasta com arquivos do EXPGE. Isso faz o programa se confundir.

Verifique no appload, onde ele está carregado:


Note que se este caminho não corresponde ao caminho onde você acabou de descompactar, então você tem mais de uma instalação do programa. E vai dar conflito.

Feche o cad e apaga a pasta que aparece ali no "Loaded Applications" do comando APPLOAD.

Procure em sua máquina qualquer outra "aparição" do programa e apaga.

Onde você descompactou a nova versão, clique o botão direito do mouse sobre as DLLS: TBN2NET_LISP_2007.dll  e TBN2NET_LISP_2013.dll e clique propriedades.

Se aparecer o botão desbloquear na aba geral:


Clique-o. Se não aparecer, significa que já está desbloqueado.

Agora, abra o AutoCAD e faz o APPLOAD e selecione o EXPGE.VLX

deverá aparecer algo assim na linha de comando:

Se não aparecer e continuar aparecendo erro, significa que você ainda está tendo conflito com versões antigas.

Se ao usar o plugin aparecer algo assim:


Ou você não descompactou TODOS os arquivos do pacote, ou novamente está com conflito de versões.

Olhe na pasta onde descompactou. Ela deve conter pelo menos 20 arquivos no caso do EXPGE.

Olhe se o caminho para os arquivos apontados na tela acima, corresponde a pasta onde descompactou.

Outro problema que pode acontecer, já discuti noutra postagem. Tem a ver com as configurações da internet. você deve ver uma tela como esta:


Neste caso, siga o link para corrigir


Expge - Porque Usar?

Olá pessoal, bom, pra variar hoje vou puxar um pouco a brasa pras minhas sardinhas hehehe

Tenho visto por aí muitas perguntas de como exportar o desenho para o google earth. Bem, é simples se você tem o Civil 3D e sabe usar o sistema de referenciais, basta localizar o "Output" e depois o "Publish to Google Earth":


E claro, seguir preenchendo as perguntas que aparecem na tela. Siga o tutorial daqui (põe um backlink pra mim também, valeu?)

O desenho vai pro google. Mas e se você quiser exportar os objetos separados por layers? Bom, aí só fazendo um layer de cada vez..., ou usa o expge ou o expge2

E se eu quiser adicionar alguma propriedade ao objeto, por exemplo, nome, descrição... bom aí depois de exportar, você pode editar o kml com o próprio google earth, ou pode usar o comando GEPROPS do expge...

E se eu quiser fazer o caminho inverso, isto é, eu desenhei umas linhas no google earth com meu gps e quero ver estas linhas no AutoCAD, como eu faço? Bom, você pode usar o trackmaker se não me engano (nem me pergunte, nunca usei), ou o... ops, o "Publish to Google Earth" só exporta!!!, ou... adivinhe!!! use o expge ou o expge2!!!

Mas... e se eu não tiver o Civil 3D, o autocad normal tem essa ferramenta? Hum... boa pergunta... acho que não, mas na página da Autodesk tem um plugin pra baixar, isso eu sei, dá uma olhada lá.

E se eu usar um AutoCAD mais antigo? aí meu, só atualizando... ou use o.... sim, você entendeu, é ele mesmo!!!, roda do AutoCAD 2000 ao 2012!!

O expge não vem para substituir a ferramenta do civil 3d, na verdade eu o fiz por necessidade pessoal e acabou que ajudou um monte de gente. Teste ele!! vai que tu gosta!!!

E é caro esse tal de expge? Bom... defina caro primeiro, compare o valor dele com o custo de ficar editando coisas depois de usar o publish do civil 3d e a gente negocia

Download: expge

ExpGE Exportar para o Google Earth

Experimente agora mesmo a nova versão deste que é o plugin mais popular da minha página!!!

Ele está no pacote TBN2CAD

Neste pacote tem vários programas bem úteis, veja:

EXPGE2, nova versão do EXPGE, que consegue exportar mais coisas e mais rápido
READKML2, nova versão do READKML, para importar para o AutoCAD os arquivos KML gerados no Google
IMPORTGMMAP, que tal importar imagens do Google Maps ou mesmo do Bing Maps para o AutoCAD?
IMPORTGMPTS, então você quer importar pontos com elevação para modelar o terreno? Sim!!!
STREETVIEW, não seria legal ter uma janela do Google Street View no AutoCAD, que mostrasse a posição do seu desenho? Seria? Teste agora!!!

Isso tudo e mais, baixe o TBN2CAD agora!!!






Alguém já quis ver seu desenho/levantamento topográfico desenhado sobre uma foto aérea da área em questão? Putz que pergunta, se você chegou a este blog, provavelmente faz isso o tempo todo...

Mas e quando você não tem a foto aérea, o que fazer? use o Google Earth, claro, é grátis.

Você tem o desenho tem o google earth, mas como colocar o seu desenho nele?

Existem algumas soluções, até mesmo da própria autodesk, mas que sinceramente... bem, use-o.

O plugin para o Civil 3d é muito bom, apesar de você ter de editar os parâmetros do SAD69...

A maioria dos casos você tem o autocad apenas, e quer visualizar seu levantamento sobre a imagem... Para isso, fiz o EXPGE.
É uma ferramenta para auxiliar na decisão do plano de vôo para aerolevantamentos por exemplo, dadas as coordenadas inicial e final você consegue desenhar um retângulo que cubra a faixa de interesse, e verificar se esta atenderá seu projeto.

Sim, porque um plano de vôo mal feito pode causar atrazos e custos desnecessários.

Vamos experimetar com o mapa do Brasil, por exemplo:




Chame o EXPGE na linha de comando, vai aparecer esta tela:




Nela, ajuste o referencial, o fuso (ou meridiano central) e o hemisfério, caso você não saiba calcular, ou não saiba o que é fuso, clique o botão grando com uma interrogação, aparecerá esta tela:




Nela, clique o mouse sobre o local aproximado do seu levantamento, no caso, cliquei sobre a área do estado do Paraná e o EXPGE me informou fuso=22, hemisfério Sul.

Clique "Beleza" (hehehehe), voltará para a tela do EXPGE, veja que o fuso é o 22, caso você saiba o meridiano central, informe-o, o programa calculará o fuso, se souber o fuso ele calcula o meridiano central.

Clique "Beleza" (espaço pra mais uma risadinha, hehehe) novamente. O programa irá coletar os dados de geometria de linhas, círculos, arcos, polilinhas, splines, hachuras e elipses, e escreverá o conteúdo num arquivo de extensão KML, que é reconhecido pelo Google Earth. Se você deixar a caixinha "Abrir o Google Earth ao terminar" marcada, o autocad irá abrí-lo.

Já no Google Earth, os layers das linhas se transformarão nas pastinhas dos "Lugares temporários" possibilitando que você desligue os layers para facilitar o entedimento:

Observe as pastinhas, observe o desenho sobreposto, é ou não é interessante? Muito bom pra impressionar chefes/clientes também, heheheh

Agora, digamos que você quer fazer uma demarcação no Google Earth duma área, "no grito" mesmo, e quer levar esse desenho para o autocad, é possível?

sim!!! Use a ferramente de desenhar polígonos do google earth, depois clique sobre ela e escolha "salvar como", use a extensão KML, ok?

Grave o arquivo em algum lugar, em seguida, no autocad digite READKML, aparecerá a tela abaixo:




Clique o botão ">" escolha o arquivo KML que você salvou, ajuste o seu referencial (normalmente o sad69) e clique o botão "Beleza", e veja a linha desenhada no cad:




A mesma filosofia do EXPGE em relação aos layers é usada: se você criar pastinhas no google earth, as linhas desenhadas irão parar em layers com o mesmo nome da pastinha!!!

Isso facilita "pseudo-digitalizações", que servirão de croquis para trabalhos mais elaborados!!!

OBS: De maneira alguma este programa fornecerá um levantamento acabado, pelamordedeus não me use isso pra dizer que "fez" o levantamento!!! até porque o google earth não é absolutamente preciso, hein!!! Use por sua própria conta, não me responsabilizo pelo seu mau uso!!


No mais é isso, Download aqui!!

Qualquer dúvida ou sugestão, entre em contato!!!

atualmente, disponho de uma versão que exporta blocos como eles são e hachuras com textura, se estiver interessado, veja aqui

Também disponível na Autodesk Exchange Store
Veja a lista de programas que desenvolvo aqui: https://tbn2net.com/programas.php

Exploração, licenças caras e outros bichos

Hoje eu vi um comentário  numa postagem minha.

A minha posição é:

Tem?
Bom, vamos lá

Manter atualizações numa mesma versão tem custo.

criar ferramentas novas no mesmo produto também.
 
Acredito que algunas "novas" ferramentas não passam de atualizações das existentes, portanto vender como uma nova ferramente é exploração (seria este o nome?)

A contradição some quando separamos os conceitos de ATUALIZAÇÃO e NOVO, não acha?

Eu tenho este pensamento e sim, meus aplicativos baseados nos produtos da Autodesk tem custo para atualização da LICENÇA para NOVAS VERSÕES, explico:

Portar um programa escrito para uma versão do cad para outra nem sempre é facil e coisas que antes funcionavam, simplesmente páram e você tem que reescrever partes do código.

Exemplo: o EXPGE. Ele é basicamente o mesmo programa a uns 5 anos já. Houveram várias atualizações, você pode ver todas elas no arquivo expge.txt que está no pacote algumas atualizações eu nem marquei lá, então, teria muito mais.... Agora, são atualizações e correções de bugs. Se você adquiriu a licença dele em 2006, ela ainda funciona no AutoCAD 2012, assim como no 2000!!!

Não cobrei nada de nenhum dos assinantes do programa por qualquer uma das atualizações por não considerar nada como "novo" e sim como "atualização"

Mas, então quem paga essa atualização? As novas licenças, claro. Felizmente é um programa com excelente saída!!!

Outros exemplos: TBN2NET e C3DRENESG. Tem versões especificas para cada versão do Civil 3D, desde o 2008 ao 2012. Coisas que funcionam no 2008 de uma forma, precisa ser refeito de outra no 2009 e refeito no 2010 e assim por diante.... Exemplo: no NOTASERV, Como obter a área da seção transversal do material de corte numa sampleline? NO 2011/2012 é simples, tem uma função pra isso na API de programação, mas no 2008, 2009, 2010, não tem e eu preciso escrever um código que beira a gambiarra para obter isso.... Outro exemplo, no C3DRENESG, como substituir um tubo? no 2009 em diante, tem uma função pra isso, mas no 2008 não, eu tenho de apagar o tubo, criar outro novo e refazer todas as conexões...

Então nestes casos, não considero ATUALIZAÇÃO, mas sim NOVO. Isso sem contar as NOVAS funções incluidas e não cobradas dentro da MESMA versão. Se você ler o log de atualizações de ambos, verá a palavra NOVO várias vezes.

Neste caso, quam paga essas atualizações?

Novas licenças e indiretamente os assinantes que atualizam a VERSÃO do Civil 3D. A Autodesk faz isso por meio do Subscription. O meu modelo de negócio é parecido, pois eu cobro uma fração da licença pela atualização.

É um modelo falho? Sim, é, mas e se fosse como o modelo da Microsoft? Cada versão nova do Office é uma licença que você compra certo (me corrija se estiver errado)? Eu uso o 2003 ainda é a melhor versão do Office a meu ver... A M$ ainda dá suporte a ela, ainda atualiza ela gratuitamente, mas se eu quiser o 2010, terei de pagar...

Ah, claro, o preço... Muitos me perguntam o preço dos meus programas e ao ouvirem, dizem: nooooooooooooooooooooosa  que caro!!!!

Tá, defina caro.

Para muitos daquels que disseram  isso eu ofereci trabalho e perguntei o preço.... Projetinho de drenagm, 2000 metros de rede. 5 mil? quanto tempo leva pra fazer com o C3DRENESG? 2 dias? SEM ELE? UMA SEMANA? é o dobro do preço do C3DRENESG.... 

Notas de serviço? modelo DER/DNIT? modelo prefeitura de QualQuerLugarlLopolis? no Acre, Faz? Faz... Este é o serviço do estagiário, uma semana pra fazer na mão usando os reports, pois é um tal de copy/paste em diversos reports diferentes e traduções de inglêspara português.... Com o Notaserv? meia duzia de cliques e pronto. Traduza o tempo economizado do estagiário, que ganha ai seus 10 pilas a hora... você vai achar barato....

Expge? use o trakmaker, nao use o expge.... antes ache alguem que saiba fazer isso direito, depois configure os layers como você quer.... e claro, converta com ele também os KMLs do google earth para o autocad, novamente compute o TEMPO gasto para fazer em outras soluções com o tempo gasto pra fazer com o expge.... É caro?

É... você concorda comigo? legal!! Não? Otimo!!! Quero suas idéias!!!! Comente!!

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

EXPGE - ZWCAD e GstarCAD

Fala gente, tudo bem?

Este post é pra falar que o EXPGE agora também roda no GstarCAD 2015 e ZWCAD+ 2015!!!

Além, claro do AutoCAD

Agora, você poderá fazer o CAR de uma maneira ainda mais fácil!!

Exporte o seu DWG para KML, para ser visualizado no Google Earth e também importe o KML para o AutoCAD, ZWCAD e GstarCAD com o plugin EXPGE!!

O que está esperando??

EXPGE - AutoCAD Civil 3D 2013

Olha só que beleza!!! a Autode$k tirou a função de exportar/importar do Google Earth do Civil 3D 2013...

Sabe-se lá por quais motivos, mas o fato é que não está mais disponível.

Mas você ainda pode usar o EXPGE para exportar seu desenho para o Google Earth, bem como importar o KML que você criar lá.


Ainda não pode importar a superfície, mas espero resolver isso nas próximas atualizações, até porque eu nem uso o 2013 ainda.

Então, não espere!! baixe já a versão em lisp aqui

Nos próximos dias atualizarei o NOTASERV e o C3DRENESG2

EXPGE

Olá, hoje vou puxar uma brasa pra minha sardinha, hehehee

Saiu uma matéria na revista "A Mira" sobre o EXPGE, explicando onde baixar, como instalar e usar, ficou muito bacana!!!

Meus sinceros agradecimentos à revista por fazer a publicação e aos autores da matéria: Leonardo Pinheiro e Murilo Steiner, academicos do curso de engenharia agrimenssura da UNESC - Criciuma-SC

Visual Lisp e DCL com a linha de comando

Bom dia!!

Ah, sim e feliz ano novo!!!

Prometo tentar retomar as postagens no blog, até porque, preciso levantar a audiência, já que meus parceiros resolveram me furar o olho. Sim estou falando com vocês.

Pra começar o ano, vamos retomar um pouco das raízes deste blog, falando um pouco de Visual Lisp.

Faço parte de um grupo de whatsapp que fala deste tema em particular - é existe um, vai entender - que outro dia estava uma discussão enorme sobre como fazer uma lisp mostrar um diálogo e neste ter um botão para clicar um ponto na tela do cad e tal.

Bem, apesar das explicações mais bem elaboradas que se podia dar, nada como um exemplo prático para mostrar uma das soluções encontradas!!!

Abaixo você verá isso, mas antes algumas considerações:

Depois que você abre um diálogo em visual lisp ( o dcl ), não pode acessar a linha de comando.

Mas por que?

Bem, digamos que o mecanismo que interpreta o Visual Lisp no AutoCAD não está preparado para isso, como acontece na API DOTNET e simplesmente dá erro fatal....

Mas o que eu quero dizer com acessar a linha de comando?

Bem, usar qualquer função do Visual Lisp que interaja com a linha de comando, uai, por exemplo: getint, getreal. getpoint, ssget, command....

Mas se mesmo assim eu precisar disso, como no exemplo, que vamos estudar?

Então a solução é fechar o diálogo (DCL) antes de acessar a linha de comando e como precisaremos voltar para o DCL após ter interagido com a linha de comando, vamos incluir um looping que fique mostrando este DCL até que queiramos parar.

A ideia fica assim:

Inicializar as variáveis
iniciar o looping
   iniciar o DCL
   mostrar o DCL e monitorar as ações nele
   se clicou num botão, decida:
       clicou OK, sai do looping, com status de OK, pois o usuário aceita os valores dos campos
       clicou CANCELAR, sai do looping com o status CANCELAR
             então restaura os valores originais
       clicou um botão diferente, então faz o que tem de fazer e faz looping outra vez
volta para o looping até que tenha de sair dele

Como algorítimo, o exemplo se resume a isso.

Durante o tempo que as postagens no grupo do whatsapp, outros problemas foram adicionados e um deles era atualizar um SLIDE ao clicar uma opção num RADIO_BUTTON do DCL.

Outro, era validar os valores que eram digitados neste DCL, por exemplo, existem dois campos (X e Y) que esperam valores numéricos, pois representam uma coordenada, sendo assim, não pode conter um valor alfanumérico.

Já que ia mostrar um SLIDE neste DCL, resolvi incluir mais um item: clicar na imagem.
No exemplo, isso não tem uma utilidade, a não ser demonstrar o conceito. Eu uso este conceito no EXPGE, na hora que você clica o mapa para escolher o fuso:


Eu gosto de separar todas as ações de cliques do DCL numa subrotina que a processa, assim, evito de escrever as ações no DCL com o "action_tile", o que me parece bem mais racional, principalmente se você escrever um DCL para cada idioma que seu aplicativo puder mostrar. Por exemplo, o EXPGE e o MLH2 mostram o diálogo em português e inglês.

Esta subrotina também pode validar o valor que pretendo modificar na tela do DCL, assim, se tentar escrever um texto qualquer no campo que espera conter um número, este pode informar um erro, ou mesmo corrigir para o valor inicial.

Isto se faz assim no exemplo:

 ( subrotinaQueProcessaAcao key valor razao posx posy / ... )

Veja, asubrotina recebe 5 parâmetros, que são passados a ela sempre que algo é clicado, alterado ou escolhido no DCL. Convém ler a ajuda do AutoCAD. Por hora, aceite isso.

Os parâmetros são:
key - nome do campo que foi clicado/alterado
valor - valor digitado no campo, quando aplicável
razao - indica qual ação o usuário fez após digitar: clocou outro campo, clicou ENTER, etc...
posx - ordenada X da posição onde o mouse clicou uma imagem
posy - ordenada Y

Vamos melhorar o algorítimo para mostrar isso e vamos mostrar uma maneira de armazenar uma lista de valores padrão do ANTES de mostrar eles no DCL e decidir o que fazer com eles se clicar OK ou CANCEL:

Inicializar as variáveis com valores padrão
iniciar o DCL
iniciar o looping
   mostrar o DCL
   preencher os campos
   definir as ações de cada campo
   monitorar as ações nele
   se clicou num botão, decida:
       clicou OK, sai do looping, com status de OK, pois o usuário aceita os valores dos campos
       clicou CANCELAR, sai do looping com o status CANCELAR
             então restaura os valores originais
       clicou um botão diferente, então faz o que tem de fazer e faz looping outra vez
volta para o looping até que tenha de sair dele

Note que inclui duas linhas, marcadas em negrito.
Tente entender porque iniciar as variáveis com valores padrão pode ser útil. Imagine que você usou o programa, modificou valores. Clicou OK. Chamou o programa outra vez, o DCL pode mostrar as últimas escolhas que você fez.

Se este for o comportamento que você espera, terá de armazenar a lista de valores padrão numa variável global. Siga o link!!!

Bem, agora que o algorítimo básico foi mostrado, vamos ver o código. Comecemos com a "cara" que fica o DCL:


Note o "Radio" era uma das coisas que pediam: ter um RADIO_BUTTON que, ao ser clicado, trocasse a "imagem" do campo ao lado, então ao clicar outra opção, outra imagem é exibida.

No exemplo, X e Y começam com valor zero. A opção inicial é "C" no campo "radio" e a escala da imagem é 1. Então comece com isso:

;valores padrão das variáveis globais
;é uma lista com pares de ("nomeDaVariavel" "valorDaVariavel")
(setq exemplo:listaKeys
       '(("r1" "1")       ;radio button 1
     ("r2" "0")       ;radio button 2
     ("r3" "0")       ;radio button 3
     ("clicapt"  )    ;button "clicapt" precisa sair do diálogo
     ("x" "0.0")      ;ordenada x sendo armazenada
     ("y" "0.0")      ;ordenada y sendo armazenada
     ("escala" "1")   ;escala da imagem no dcl
     ("btcresce")
     (
"btdiminui")
     (
"imagem")
     (
"help")   ))


Uma dica: Observe como nomeio a variável global. Não é obrigatório fazer dessa maneira, mas ajuda a manter o código livre de sobreposições de outros programas. Falo disso depois, ok?

Você pode criar uma variável para cada campo do DCL, mas me parece mais simples assim. Quando você ler o código todo irá concordar. Veja que mesmo os campos numéricos mantive com strings. Isso facilita na hora de preencher o DCL, você vai ver....

Já que estou armazenando os valores dos campos desse DCL numa lista, precisamos de uma subrotina que insira um novo valor nela, pra não ficar repetindo várias linhas de código toda vez que precisamos mudar isso, então aqui está:

;subrotina que seta o valor de uma variavel global
;nomeVariavel => string com o nome da variavel global
;valor => string string com o valor a ser definido
;exemplo: (exemplo->put-valor "x" "0.3")
;saida: a lista de variaveis globais atualizada
(defun exemplo->put-valor (nomeVariavel valor / old new)
  (
setq old               (assoc nomeVariavel exemplo:listaKeys)
    new               (list nomeVariavel valor)
    exemplo:listaKeys (subst new old exemplo:listaKeys)))


Na verdade é bem simples, trata-se de manipular a lista, colocando outro valor num campo qualquer.

Já que criei uma função para modificar a lista, vamos criar uma para "tomar" um valor qualquer:

;subrotina que devolve o valor de uma variavel global
;nomeVariavel => nome da variavel a retornar o valor
;resposta: string, valor a ser devolvido ou NIL se a variavel nao exista
;exemplo: (exemplo->get-valor "x")
;saida: "0.3"
(defun exemplo->get-valor (nomeVariavel)
  (
cadr (assoc nomeVariavel exemplo:listaKeys)))


Bem simples também.

Acredito que será mais produtivo  ver agora o programa principal, para que você entenda o que quero mostrar.

Depois vemos as ações e subrotinas complementares.

Relembrando, o programa principal consiste em:

Inicializar as variáveis com valores padrão
iniciar o DCL
iniciar o looping
   mostrar o DCL
   preencher os campos
   definir as ações de cada campo
   monitorar as ações nele
   se clicou num botão, decida:
       clicou OK, sai do looping, com status de OK, pois o usuário aceita os valores dos campos
       clicou CANCELAR, sai do looping com o status CANCELAR
             então restaura os valores originais
       clicou um botão diferente, então faz o que tem de fazer e faz looping outra vez
volta para o looping até que tenha de sair dele

Agora veja o código:

(defun c:teste (/ dcl dlg faz pt lembrar)

  (
setq dcl  (load_dialog "c:/temp/teste.dcl") ;carrega o dcl e inicializa os valores das tiles
        faz t                                  ;controla o loopin WHILE
    lembrar exemplo:listaKeys)             ;para lembrar os valores se clicou cancel

    

  ;loopinq que mostra o dialogo até clicar OK ou CANCEL
  (while faz

    ;carrega o dialogo desejado
    (new_dialog "teste" dcl )

    ;inicializa as tiles com ação e valor inicial
    (foreach k exemplo:listaKeys
      (action_tile (car k) "(exemplo->acoes $key $value $reason $x $y)" )   ;define a acao
     

      (if (cadr k) (set_tile (car k) (cadr k))))  ;preenche o valor no dialogo

    ;prepara a imagem sem ter clicado um radiobuton
    (exemplo->seta-slide nil)
    

    ;mostra o dialogo na tela e espera clicar algo
    (setq dlg (start_dialog))

    ;clicou um botao qualquer, seja cancel ou OK ou um botão que tem acao que depende da linha de comando
    ;se deprende da linha de comando, precisa fechar o dialogo, senao dá erro fatal
    (cond ((= 0 dlg) ;cancel
       (setq faz nil)
       (
alert "Cancelou! vou restaurar a lista de variaveis globais!")
       (
setq exemplo:listaKeys lembrar))

      ((
= 1 dlg) ;ok
       (setq faz nil)
       (
alert "Clicou OK, vou fechar a tela mano!!"))

      ((
= 2 dlg) ;clicou o botao para capturar um ponto na tela
       (setq pt (getpoint
              (strcat "Informe um ponto <"
                  (exemplo->get-valor "x")
                  ","
                  (exemplo->get-valor "y")
                  ">")))
       (
if pt
         (progn
           (exemplo->put-valor "x" (rtos (car pt) 2 3))
           (
exemplo->put-valor "y" (rtos (cadr pt) 2 3)))))
    )
 ;cond
  );while

  (unload_dialog dcl)

  )


Considerações:
Vou supor que você já saiba ao menos carregar o DCL (load_dialog, start_dialog, new_dialog). Siga os links, não dói, hehehe

Veja a parte de "setar" os campos do DCL. um simples FOREACH resolve. Percebe porque escolhi as variáveis numa lista já como "string"? assim não preciso converter em string um valor que pode ser real, inteiro, string, etc....

Veja que este mesmo FOREACH também define a ação de cada campo com o action_tile bem simples ( "(exemplo->acoes $key $value $reason $x $y)" )

Perceba que o nome do campo é o primeiro elemento da lista de pares nome/valor

Ah, sim, a imagem não tem um valor propriamente dito, então basta deixar vazio na lista de variáveis. Mas precisamos inicializar ela, baseado escolha inicial do RADIO_BUTTON.

Fiz isso com este pedaço do código:
(exemplo->seta-slide nil)

Esta subrotina, espera que você informe qual é a escolha, para que ele mostre a imagem correta.
Ah, convém ver a ajuda de algumas funções (start_image, fill_image, slide_image, end_image) para entender que elas precisam estar em sequencia.

;suprotina que preenche o slide correto na imagem
;exemplo:  (exemplo->seta-slide "r1")
(defun exemplo->seta-slide (radioButon / radioButons nomeSlide largura altura
                larguraReduzida alturaReduzida posX posY escala cor
)
  (
setq radioButons '(("r1" "c:\\temp\\teste(a)") ("r2" "c:\\temp\\teste(b)") ("r3" "c:\\temp\\teste(c)"))
    keyCampo    "imagem"

    ;obtem a escala, precisa estar antes de start_image
    escala      (atof (get_tile "escala")) 

    ;toma o tamanho do retangulo que mostra os slides
        largura (dimx_tile keyCampo)
        altura  (dimy_tile keyCampo)

    ;recalcula o tamanho da janela disposnivel
    larguraReduzida (fix (* largura escala))
    alturaReduzida  (fix (* altura escala))

    ;calcula o canto superior esquerdo onde inserir o slide
    posX    (fix (/ (- largura larguraReduzida)  2))
    posY    (fix (/ (- altura alturaReduzida)  2))

    ;cor da área util onde o slide ira aparecer
    cor      1 ;vermelho
    )
  

  ;encontra o slide apropriado:
  (if radioButon
    ;se informou a opção do radiobuton, pega ele
    (setq nomeSlide (cadr (assoc radioButon radioButons)))

    ;nao informou, significa que é pra procurar qual está setado  por padrao
    (foreach k radioButons
      (if (= "1" (get_tile (car k)))
    (
setq nomeSlide (cadr k)))))
    

  ;inicializa o retangulo que mostra a imagem
  (start_image keyCampo)

  

  ;pinta o background de preto:
  (fill_image 0 0 largura altura 0)

  ;pinta de vermelho a area onde o slide vai aparecer:
  (fill_image posX posY larguraReduzida alturaReduzida cor)
  

  ;desenha o slide na area reduzida
  (slide_image posX posY larguraReduzida alturaReduzida nomeSlide)

  ;finaliza
  (end_image)
  )


Veja que se não informo qual é a opção desejada, esta subrotina procura a escolha atual. Na variável global que armazena a lista de campos, tem três campos: "r1", "r2" e "r3" que são os radio_button. o escolhido é aquele que tem o valor "1"

Tá, eu enfeitei um pouco esta subrotina nesta parte de calcular uma escala, pintar de vermelho e tal. A ideia é mostrar que se pode colocar uma imagem em escala, centralizar etc...

A última parte do código é a subrotina que processa as ações dos campos do DCL. Note que como ela recebe o nome do campo, um COND é indicado para escolher qual ação tomar, em vez de colocar tudo dentro de strings emporcalhando o código do programa principal:

;acoes das tiles.
;key => string, nome do campo no DCL
;valor => string, valor passado pela ação
;razao => inteiro, razao do evento, ver a ajuda
;coordX => quando clica o image_button, informa a ordenada X em pixels
;coordY => quando clica o image_button, informa a ordenada Y em pixels

(defun exemplo->acoes (key valor razao coordX coordY / coleta tmp)
  ;para todas as acoes exceto as que tem done_dialog, coleta os valores
  (setq coleta t)
  

  ;testa qual campo disparou a acao:
  (cond (;algum dos radiobuton? muda de slide!!!!!!!!!!!!!!!!
     (member key '("r1" "r2" "r3")) (exemplo->seta-slide key))

    ;clicou o botao ajuda
    ((eq key "help") (startapp "explorer.exe" "https://tbn2net.com"))
    

    ;trocou a escala
    ((eq key "escala")
     (
set_tile "escala" (if (> (setq tmp (atof valor)) 0)
                  (
rtos tmp 2 3)
                  (
exemplo->get-valor "escala")))
     (
exemplo->seta-slide nil))

    ;apertou o botao de aumetar a escala
    ((eq key "btcresce")
     (
exemplo->acoes "escala" (rtos (* 2 (atof (get_tile "escala"))) 2 3) 1 nil nil))

    ;apertou o botao de diminuir
    ((eq key "btdiminui")
     (
exemplo->acoes "escala" (rtos (* 0.5 (atof (get_tile "escala"))) 2 3) 1 nil nil))

    ;escreveu um valor em X
    ((eq key "x")  (set_tile "x" (rtos (atof valor) 2 3)))

    ;escreveu um valor em Y
    ((eq key "y")  (set_tile "y" (rtos (atof valor) 2 3)))

    ;clicou o botao para acessar a linha de comando e pedir um ponto
    ((eq key "clicapt") (setq coleta nil) (done_dialog 2))

    ;clicou na imagem
    ((eq key "imagem")
     (
alert (strcat "Você clicou dentro da imagem, nas coordenadas "
            (itoa coordX) ","
            (itoa coordY)))))

  ;coleta os novos valores se nao foi um done_dialog:
  (if coleta
    (setq exemplo:listaKeys
       (mapcar '(lambda (k)
              (
list (car k) (get_tile (car k))))
           exemplo:listaKeys)))  )


Bem simples se você ler com calma, verá que pode incluir mais campos apenas acrescentando mais linhas ao COND.

Neste código o truque que quero mostrar é justamente aquele de clicar o botão de obter a coordenada na linha de comando, o botão com ">" no DCL.

Ele faz um DONE_DIALOG. para o botão em questão, usei o [status] igual a 2.
Lembre-se:
OK termina o diálogo com status 1
CANCEL, termina o diálogo com status 0

Então precisamos saber diferenciar quem está encerrando o DCL (diálogo)

Note que incluí uma ação para o HELP, abrindo o navegador e mostrando a minha página. Você pode fazer abrir um arquivo qualquer, com a ajuda do seu programa.

Note a ação que é executada para X e para Y. Ela converte qualquer entrada que você escreve nestes campos para um número real e depois reconverte para string e reescreve esse valor no campo. Isso faz com que o campo só tenha valor numérico.

Note que incluí um pequeno controle usando a variável "coleta". Tive de fazer isso pois preciso lembrar os valores que estão nos campos, reescrevendo a variável global. Mas isso não pode ocorrer ao clicar o botão ">" (key "clicapt") pois o done_dialog anula todos os campos e get_tile retorna nil em todos os campos, o que ia ferrar com DCL.

Bem, depois que você copiar todos os códigos, tente tirar essa verificação, só por farra!!!

Agora vamos ver o famigerado DCL:


teste: dialog {label="exemplo";
:
row {
 :column {
 :radio_column { label = "Radio";
   :
radio_button {label = "A"; key = "r1";}
   :radio_button {label = "B"; key = "r2";}
   :radio_button {label = "C"; key = "r3";}
 }


 :boxed_column {label = "Coordenadas";
   :
edit_box {label = "X" ; key="x";}
   :edit_box {label = "Y" ; key="y";}
   :button {label = ">" ; key = "clicapt";}}
}

:boxed_column {label = "Imagem";
  :
image_button {key = "imagem"; width=50; height =20;
                 fixed_width=true;fixed_height=true;}
  :row { :edit_box {label = "Escala" ; key="escala";}
         :button {label = "+" ; key = "btcresce";}
         :button {label = "-" ; key = "btdiminui";} }
    
  }}

:text {label = "Powered by Neyton";
ok_cancel_help;
   }


Note que para mostrar os botões OK, CANCEL e HELP usei a definição padrão deles. Sim é possível mudar isso, basta criar botões personalizados, mas isso fica pra outro post.

Vamos olhar o programa principal novamente. Olhe o que acontece depois que fazemos o START_DIALOG.

Temos um COND que escolhe uma ação, baseado no STATUS passado a ele:
status 1, OK, sai do looping e mantem as alterações da variável global
status 0, CANCEL, sai do looping e restaura os valores originais da variável global
status 2, mostra a linha de comando e pede que clique uma coordenada e depois volte a mostrar o DCL

Pronto. Estude o código. Dica: leia primeiro somente os cometários do código. Depois leia o código.

Veja, este exemplo mostra uma maneira de oferecer ao usuário uma forma mais amigável de modificar opções no programa que criamos. Isso é preferível quando temos uma grande quantidade de opções alteráveis.

Eu prefiro evitar DCL quando se trata de um ou dois campos. Prefiro dar as opções na linha de comando. Mas isso é questão de gosto....

Falta ainda:
Controle de erros
Compilar para FAS/VLX

Tá com preguiça de copiar e colar, então baixa aqui!!!

Note que salvei o exemplo em C:/temp/, então pra rodar, salve neste local ou edite os caminhos. Os slides, dcl e código estão no pacote zipado do link acima.

civil 3d 2010 e .NET

Manja de .NET? manja de civil 3d?

então dê uma olhada neste link

Aquele que conseguir uma resolver a charada, ganha uma lincença do EXPGE, pode ser da maneira que está lá ou outra, desde que o resultado seja o mesmo

lembrando que é preciso adicionar as referncias às dlls do civil: AeccDbMgd.dll e AecBaseMgd.dll, alem das dlls do autocad: acdbmgd.dll e acmgd.dll

o problema é que no 2008 e 2009 para alterar os "Part Data Value", bastava:
tubo.PartDataRecord.Find("parametro").Tag = valor

já no 2010 (ou ao menos deveria ser...):
tubo.PartData.GetDataField("parametro").Value = valor

mas isso não esta funcionando no 2010... então aí está: resolveu a charada, ganhou um EXPGE, hehehe

editado em 19 de setembro de 2009:
como ninguem consegiu, está encerrada a promoção, hehehe, veja aqui

Expge - nova versão


Olá gente!!!
Atualizei o EXPGE!!!
VEJA:
Atualização 29/01/2009
- Escrita de arquivo KML "endentado", isto é, mais "bonito",
- Correção de bug ao exportar polilinha com arco no ultimo segmento, e gerenciamento de número de vertices adicionados por arco
- Primeira versão do exportador de hachuras, ainda é limitado para hachuras muito
complexas, que tem muitos "vazados", mas já dá pra brincar bastante!!!
Veja uma demonstração:

Esta é o Município de Almirante Tamandaré - PR, onde foram demarcadas algumas áreas
(Putz eu fiz trocentos mapas lá a uns anos atraz e ninguem teve coragem de atualizar...)

Veja como ficam as hachuras no google earth: No mais é isso, Download aqui!!

Dimensões de slides

Alguém aí já inseriu um arquivo SLD num DCL?
Lá na tile "image" ou image_button?

O slide era retangular, ou quadrado? e como você sabe disso? e image_button tinha a mesma relação de aspecto que o seu slide? E como saber se está?
Mas... O que diabos é relação de aspecto????

Eu explico:
Relação de aspecto: é o valor que obtemos ao dividir a altura pela largura
Num quadrado, temos que esta divisão resulta um, num retângulo, um valor diferente de um.

O que acontece quando tentamos preencher a image_button do dcl com um slide? Mesmo que forcemos as dimensões do slide, assim:
[code](slide_image x1 y1 width height sldname)[/code]
O slide não se deforma, e poderá acontecer de "sobrar" espaço na image_button, certo?
Ai fica meio "feio"... Desproporcional...

Se soubermos qual a relação de aspecto do slide e do image_button poderemos dizer quem é "mais retangular" e assim, calcular x1,y1,width,height que deixem o slide mais bem posicionado, isto é, centralizado

Agora, o comando que cria o slide ( MSLIDE na linha de comando) não pergunta nem diz que tamanho irá ter o slide... Ai complica... Você tem de deixa a área visível do desenho na relação que você precisa...

Mas ainda assim, não saberá qual o tamanho do slide...
Na verdade, ele terá, em pixels, a mesma dimensão dessa área visível, a as propriedades width e height do objeto Window, levam em conta as "bordas" da janela, portanto não são utilizáveis, a não ser que você saiba quantos pixels ela usa...

Com o "print screen" e o paint dá pra contar quantos pixels deu... ( aff ... )

Uma boa dica é, na definição do image_button (ou image), usar o atributo width e o atributo aspect_ratio, ou o atriguto height com o atributo aspect_ratio, pois assim tem-se certeza do tamanho do slide... lembrando que width e height não são dados em pixels, mas em uma proporção do tamanho dos caractéres visualizados no dcl...


Bom, pra encurtar:
É possível "extrair" do slide qual suas dimensões em pixels, para isso temos de ler os BYTES corretos do arquivo e assim, proceder a inserção do slide da melhor maneira, veja a rotina
(defun get-sld-dim (file / tmp l)
  (
setq tmp (open file "r"))
  (
repeat 18 (read-char tmp))
  (
setq l  (list (read-char tmp) (read-char tmp)
                 (
read-char tmp) (read-char tmp)))
  (
close tmp)
  (
list (+ (* 256 (cadr l)) (car l))
        (
+ (* 256 (cadddr l)) (caddr l))))


Para usar, faça (por exemplo):
(get-sld-dim "d:/neyton/expge/expge.sld")

isso irá retornar uma lista, com as dimensões em pixels da largura e da altura do slide, no exemplo, me retornou (721 361), onde 721 é a largura e 361 a altura

Bucaneiros

Olha a pérola que eu recebi ontem:

Olá boa tarde...


Estou a procura de um Crack ou serial do seu progama EXPGE, trabalho em uma empresa de topografia, usamos constantemente o google, mas porém o que eu uso aqui é a versão demo amigo que so permite 10 "entidades". gostaria de informaçoes fazendo favor.

 
ATT.


Assim... o expge tá bom o suficiente pra ser pirateado!!!
Será? experimente você também!!!

Visitas

Olha só, quase 400 mil visitas!!

Legal, para comemorar, aquele que mandar um print da sua tela com a visita 400.000, ganha uma licença do EXPGE!!'
Participe!
obs:
O print será postado aqui na página. 
Chuk Norris approves!!

Update:
Recebi uma sugestão do prêmio poder ser trocado por descontos na compra de outro programa, em vez de só o expge.

Então lá vai:
50% na compra da licença do C3DRENESG ou do NOTASERV, ok?

Novos Programas


Se você pegou a idéia do post anterior, legal, aguardo a sua idéia!!

No pacote deste programa estará incluso um novo comando: MPROFVIEW

A idéia é que se voce tem lá seus 20 ou 30 alinhamentos e não quer ficar criando profileview como no tutorial 7 pra cada um deles manualmente, configurando os bandset, estilo e tudo mais, que tal dar uma agilizada nisso? você vai economizar um tempinho legal numa das coisas mais massantes, heheheh.

Funciona assim: chame o comando MPROFVIEW, selecione os alinhamentos, o ponto de inserção do primeiro profileview e aparecerá esta tela:
Aí você já pode selecionar o estilo, layer e o bandset a usar.

Note que para o bandset sair com os perfis configurados corretamente, você deve nomear os perfis de terreno e greides seguindo sempre o mesmo template, por exemplo:
Greide-<[Paren Alignment Name(CP)]>, assim todos os greides terão o prefixo "Greide". Na tela do MPROFVIEW você preencheria para as bandas que precisa do greide: "Greide-*", onde o "*" pode ser qualquer coisa, ou o nome do alinhaemento. Simples né? Aí é só ver o resultado:


Tá mas ainda preciso ficar criando os perfis de superfície na mão...

Calma!!!! eu não disse que tem o comando MPERFIL também incluido?

Aí é so chamar o comando, selecionar os alinhamentos e será mostrada a tela:

Veja, voce escolhe o layer, prefixo do nome, a superfície e offset. O offset é pra você poder fazer perfis do bordo esquerdo e direito do eixo, saca?
Bem melhor que fazer um a um, não?

ah, tem uma versão em lisp destes dois ultimos que estão neste blog, mas como faz tempo que não escrevo mais lisp, meio que abandonei eles... .NET é muuuuuuuuuiiiito melhor!!!

EM breve uma versão .NET do EXPGE, que exporta hachuras com a sua textura:

Qual a utilidade disso? se lá, mas tanta gente já me pediu isso no EXPGE, que resolvi implementar, hehehe

Imagino mapas temáticos com hachuras que tem essas texturas, por exemplo...

Deu um gostinho já?? quer testar? me mande um mail!!!