Hoje vamos estudar um pouquinho de
visual lisp no Civil 3D.
O problema:
Você recebeu um desenho de um escritório qualquer, que é a topografia de uma área.
Um dia o desenho foi do Civil 3D e tinha lá seus milhares de pontos de levantamento.
Como o cliente final quer AutoCAD puro, estes pontos foram explodidos.
Agora você quer restituir a triangulação com estes pontos por um motivo qualquer.
Existem pontos que não devem entrar no modelo, tais como fundo de PV ou coisa assim.
Então não dá para simplesmente usar "Drawing Objects" na nossa superfície.
Filtrar manualmente é inviável, pois são muitos pontos.
Solução 1:
Data Extraction, simples assim. O comando é
DATAEXTRACTION
Considerações para esta solução:
Exploda mais uma vez os blocos e observe que os pontos se tornam, em geral, um MTEXT, que um dia foi a LABEL do COGOPOINT do Civil 3D e um POINT ou LINE, que representa a posição do ponto em si.
Note que o dataextraction será feito nestes MTEXT. A posição ficará levemente deslocada, pois o ponto de inserção do MTEXT não é necessariamente a coordenada do ponto. Bem, é só mover tudo depois.
Problema com esta solução:
Se algum ponto teve sua label "strechada" a posição ficará incorreta. O "Z" do MTEXT pode não ser o "Z" da coordenada do ponto, mas se estiver no conteúdo do MTEXT não é problema.
Solução 2:
Criar um "lispezinho", só de farra, hehehe
Analise um dos pontos. Qualquer um. Se explodimos ele, gera um POINT e um MTEXT, em geral. O bloco original está nas coordenadas exatas do cogopoint original. Só precisamos então obter o conteúdo do MTEXT e nele localizar a descrição e o nome do ponto. A cota pode ser descartada, uma vez que está na coordenada de inserção do bloco.
E como faríamos esta lisp?
Bem, primeiro, vamos pensar em como seria pra fazer "na raça", "na mão", "like a estagiário":
- Selecionar todos os pontos
- Obter a coordenada do ponto de inserção
- Em cada um deles, explodir
- Obter o MTEXT
- Ler o conteúdo do MTEXT
- Criar um cogo point do Civil 3D
- Definir seu nome e descrição com o valor que está no MTEXT
- Voltar em (2) até processar todos os pontos
- Fim
Simples, né?
Veja, e resumo é isso. Agora é só estudar "
comofas" cada um dos passos acima dentro de um ambiente qualquer de programação. Escolhemos o LISP (por que será hein???)
No mais, é só enfeitar o código depois de pronto, colocando umas mensagens para o usuário e fornecendo um comando que ele possa chamar na linha de comando do Civil 3D.
O resultado final será esta lisp:
;|
blkx2cogo
lisp para converter blocos que foram cogopoints e foram explodidos
em cogopoints novamente
requisito: civil 3d 2007 a 2015
Autor: Neyton Luiz Dalle Molle
Engenheiro Civil
http://tbn2.blogspot.com
licença de uso: free, mas mantenha os créditos.
|;
;habilita as funções vla*
(vl-load-com)
;define um novo comando: blkx2cogo
(defun c:blkx2cogo (/ acadver civilver civilapp civildoc
civilpts blks ss ent vla blkdef txt o lsttxt cogopoint)
;controle de erros e undo e redo
;veja http://tbn2.blogspot.com/2006/10/avaliao-de-erros.html
;para habilitar esta subrotina
;(tbn:error-init nil)
;obtem algumas variaveis
(setq
;qual a versão do autocad?
acadver (substr (vla-get-version (vlax-get-acad-object)) 1 4)
;qual a versão do civil 3d?
civilver (cadr (assoc acadver
'(("17.0" "4.0") ;2007
("17.1" "5.0") ;2008
("17.2" "6.0") ;2009
("18.0" "7.0") ;2010
("18.1" "8.0") ;2011
("18.2" "9.0") ;2012
("19.0" "10.0");2013
("19.1" "10.3");2014
("20.0" "11.0");2015, incluir outras
)))
;obtem o aplicativo Civil 3D
civilapp (vla-getinterfaceobject
(vlax-get-acad-object)
(strcat "AeccXUiLand.AeccApplication."
civilver))
;obtem o ducumento atual do Civil 3D
civildoc (vla-get-activedocument civilapp)
;obtem a coleção de pontos do documento atual do Civil 3D
civilpts (vlax-get-property civildoc "points")
;obtem a coleção de definições de blocos do autocad
blks (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
;pede a seleção de blocos inseridos no desenho
ss (ssget '((0 . "INSERT")))
)
;repita para cada bloco inserido que foi selecionado
(repeat (sslength ss)
;obtenha a definição do bloco inserido
(setq ent (ssname ss 0)
vla (vlax-ename->vla-object ent)
blkdef (vla-item blks (vla-get-name vla)))
;procura na definição, o MTEXT com o conteudo que queremos
(vlax-for o blkdef
(if (= "AcDbMText" (vla-get-ObjectName o))
(setq txt o)))
(setq
;desmonta o texto em uma lista
;"{\\C7;2137\\P7.45\\PP_A}" -> ("2137" 7.45 "P_A")
lsttxt (read (vl-string-subst " \"" "\\P"
(vl-string-subst "\" " "\\P"
(vl-string-subst "\")" "}"
(vl-string-subst "(\"" "{\\C7;"
(vla-get-TextString txt))))))
;cria um cogopoint na mesma posição do bloco original
cogopoint (vla-add civilpts (vla-get-insertionpoint vla)))
;redefine a descrição do cogopoint
(vlax-put-property cogopoint "rawdescription" (caddr lsttxt))
;redefine o nome do cogopoint
(vlax-put-property cogopoint "name" (car lsttxt))
;retira o bloco da seleção
(ssdel ent ss)
;apaga o bloco antigo
(entdel ent)
;mostra um contador decrescente no canto inferior esquerdo da tela
(grtext -2 (itoa (sslength ss)))
) ;fim do repeat
;reastaura o controle para o autocad
;(tbn:error-restore)
) ;fim do defun
;mensagem após o appload
(princ
"blkx2cogo carregado
Autor:neyton@yahoo.com
Use blkx2cogo para usar esta lisp")
;finaliza
(princ)
Abstraia o código e leia somente os
comentários
Você verá que é a receita do bolo que escrevemos acima. No mais,
procure na ajuda, como é a sintaxe das funções que usamos nesta lisp: defun, ssget, setq, repeat, grtext, funções que começam com VLA*,