Já conferiu a promoção da minha página?? Anida não? Então corre!!
Bom, mas este post não é pra falar disso. É para voltar um pouco às origens!!! Isso mesmo!!! Vamos falar de Visual Lisp galera!!!
O problema de hoje é o seguinte: Tabelas no CAD que estão explodidas e nós precisamos extrair os dados dali.
Já deu pra perceber que isso pode ser bem chato, não é?
Eu mesmo tive esse problema esta semana e, como eu amaldiçoei o
Aqui, um exemplo de tabela explodida, no AutoCAD.
Bem simples, só pra efeito de mostrar a "lispezinha" abaixo.
Veja como fica o resultado:
Da hora, né? Agora, dá pra copiar e colar no M$ Excel, ou até mesmo colar no CAD como uma tabela de verdade!!!
Bom, mas e a lisp? Veja:
;pesquisa no google:
(vl-load-com)
;Dwg2Html - plugin para exportar tabelas explodidas para html
(defun c:Dwg2Html (/ linhasVerticais linhasHoriz linhas ent p1 p2 counter
nLin html nCol x1 x2 y1 y2 tmp ssTxt file opcao)
;inicializa as listas de X e Y
(setq linhasVerticais nil
linhasHoriz nil)
;pede a seleção das linhas que formam a tabela
;precisa ser linha continua, para definir o espaço de cada célula
(prompt "\nSelecione as linhas que desenham as tabelas")
(setq linhas (ssget '((0 . "*LINE"))))
(if (not linhas) (exit))
;pode ter mais de um texto na celula. Eles serão concatenados
;com espaço ou quebras
(initget "Q E" 0)
(setq opcao
(getkword "\nSelecione o tipo de quebra manual [Quebra, Espaço] <Quebra>")
opcao (if (= "E" opcao) " " "<br>"))
;pede onde salvar o arquivo html
(setq file (getfiled "Exportar tabela" "" "html" 1))
(if (not file) (exit))
;classifica as linhas em: horizontais e verticais
(repeat (sslength linhas)
(setq ent (ssname linhas 0)
p1 (vlax-curve-getstartpoint ent)
p2 (vlax-curve-getendpoint ent))
(if (equal (car p1) (car p2) 0.0001)
(if (not (member (car p1) linhasVerticais))
(setq linhasVerticais (cons (car p1) linhasVerticais)))
(if (not (member (cadr p1) linhasHoriz))
(setq linhasHoriz (cons (cadr p1) linhasHoriz))))
(ssdel ent linhas))
;ordena a lista das linhas verticais pelo X crescente e
;as linhas horizontais pelo Y decrescente
(setq linhasVerticais (vl-sort linhasVerticais '<)
linhasHoriz (vl-sort linhasHoriz '>))
;calcula o canto superior esquerdo e inferior direito:
(setq p1 (list (car linhasVerticais) (car linhasHoriz))
p2 (list (last linhasVerticais) (last linhasHoriz)))
;zoom window na tabela, para a seleção dos textos funcionar
(vla-zoomwindow (vlax-get-acad-object)
(vlax-3d-point p1) (vlax-3d-point p2))
;inicia o cabeçalho do html
(setq html (strcat "<html>
<head>
<meta http-equiv='Content-Type;X-UA-Compatible'
content='text/html;IE=9' charset='ISO-8859-1'>
<title>Dwg2Html: " (vl-filename-base file) "</title>
<style>
body { font-family: arial; }
p { font-weight: bold; }
table { border-collapse: collapse; width: 100%;}
td { border: 1px solid black; text-align:center; }
a { text-decoration: none; }
</style>
</head>
<body>
<p>
Visite: <a href='https://tbn2net.com'>TBN2NET,
o melhor site de plug-ins para o AutoCAD!!!</a></p>
<p>Arquivo: " (vl-string-translate "\\" "/" file) "</p>
<br>
<table>
"))
;repita para todas as linhas horizontais
(setq nLin 0
counter 0)
(repeat (1- (length linhasHoriz))
;calcula os limites em Y da linha
(setq y1 (nth nLin linhasHoriz)
nLin (1+ nLin)
y2 (nth nLin linhasHoriz)
nCol 0)
;inicia o html da linha ('tr')
(setq html (strcat html "<tr>"))
;repita para todas as colunas da linha
(repeat (1- (length linhasVerticais))
;calcula os limites em X da coluna
(setq x1 (nth nCol linhasVerticais)
nCol (1+ nCol)
x2 (nth nCol linhasVerticais))
;tenta selecionar os textos dentro dos limites da célula
(setq ssTxt (ssget "C" (list x1 y1)
(list x2 y2)
'((0 . "*TEXT"))))
;se encontrou
(if ssTxt
(progn
;liste-os:
(setq tmp nil)
(repeat (sslength ssTxt)
(setq ent (ssname ssTxt 0)
tmp (cons (list (cdr (assoc 10 (entget ent)))
(cdr (assoc 1 (entget ent))))
tmp))
(ssdel ent ssTxt))
;classifique pelo Y decrescente e concatende,
;colocando quebra de linha ('br')
(setq tmp (vl-sort tmp '(lambda (a b)
(> (cadar a) (cadar b))))
tmp (apply 'strcat
(mapcar '(lambda (a)
(strcat (cadr a) opcao))
tmp))
tmp (vl-string-trim opcao tmp)))
(setq tmp " "))
;adiciona uma celula no html
(setq html (strcat html "<td>" tmp "</td>")))
;finaliza o html da linha
(Setq counter (1+ counter)
html (strcat html "</tr>")))
;finaliza o html da tabela
(Setq html (strcat html "</table>"))
;finaliza o html
(setq html (strcat html "</body></html>"))
;salva o arquivo
(setq tmp (open file "w"))
(write-line html tmp)
(close tmp)
;abre o arquivo com o navegador padrão
(browser file)
(princ)
)
(prompt "
Dwg2Html carregado com sucesso!!
Visite: https://tbn2net.com/DWG2HTML
Autor: Neyton Luiz Dalle Molle
Engenheiro Civil
WhatsApp: +55 98 99995 3538
")
(princ)
A ideia é simples, as linhas horizontais e verticais da tabela delimitam espaços para as células. Então basta iterar um looping que procura textos nestes espaços e monta uma tabela em HTML.
Note que o programa não "entende" células mescladas, mas isso não é o problema, ok?
Se gostou do programa, que tal baixar ele pronto pra usar ??
EU NÃO CONSEGUI ENTENDER COMO FAZ, ESTOU COM ESSE MESMO PROBLEMA... PODE ME AJUDAR?
ResponderExcluir