Tabelas explodidas no AutoCAD

Fala pessoal, como que está a expectativa para o Autodesk University 2016??

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 bocó desenhista que fez isso, hehehe:

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 ??


Um comentário:

  1. EU NÃO CONSEGUI ENTENDER COMO FAZ, ESTOU COM ESSE MESMO PROBLEMA... PODE ME AJUDAR?

    ResponderExcluir