Civil 3D - Parcels - Memoriais Descritivos

0 milhões de comentários
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

0 milhões de comentários
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

0 milhões de comentários
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!!!

LinkWithin

Related Posts Plugin for WordPress, Blogger...