Tabelas explodidas no AutoCAD
Autor: neyton luiz dalle molle | Publicado: 2016-08-24T20:20:00-03:00

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&nbsp;no&nbsp;google:(vl-load-com);Dwg2Html&nbsp;-&nbsp;plugin&nbsp;para&nbsp;exportar&nbsp;tabelas&nbsp;explodidas&nbsp;para&nbsp;html(defun&nbsp;c:Dwg2Html&nbsp;(/&nbsp;linhasVerticais&nbsp;linhasHoriz&nbsp;linhas&nbsp;ent&nbsp;p1&nbsp;p2&nbsp;counter&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nLin&nbsp;html&nbsp;nCol&nbsp;x1&nbsp;x2&nbsp;y1&nbsp;y2&nbsp;tmp&nbsp;ssTxt&nbsp;file&nbsp;opcao)&nbsp;&nbsp;&nbsp;&nbsp;;inicializa&nbsp;as&nbsp;listas&nbsp;de&nbsp;X&nbsp;e&nbsp;Y&nbsp;&nbsp;(setq&nbsp;linhasVerticais&nbsp;nil&nbsp;&nbsp;&nbsp;&nbsp;linhasHoriz&nbsp;nil)&nbsp;&nbsp;;pede&nbsp;a&nbsp;seleção&nbsp;das&nbsp;linhas&nbsp;que&nbsp;formam&nbsp;a&nbsp;tabela&nbsp;&nbsp;;precisa&nbsp;ser&nbsp;linha&nbsp;continua,&nbsp;para&nbsp;definir&nbsp;o&nbsp;espaço&nbsp;de&nbsp;cada&nbsp;célula&nbsp;&nbsp;(prompt&nbsp;"\nSelecione&nbsp;as&nbsp;linhas&nbsp;que&nbsp;desenham&nbsp;as&nbsp;tabelas")&nbsp;&nbsp;(setq&nbsp;&nbsp;&nbsp;&nbsp;linhas&nbsp;(ssget&nbsp;'((0&nbsp;.&nbsp;"*LINE"))))&nbsp;&nbsp;(if&nbsp;(not&nbsp;linhas)&nbsp;(exit))&nbsp;&nbsp;;pode&nbsp;ter&nbsp;mais&nbsp;de&nbsp;um&nbsp;texto&nbsp;na&nbsp;celula.&nbsp;Eles&nbsp;serão&nbsp;concatenados&nbsp;&nbsp;;com&nbsp;espaço&nbsp;ou&nbsp;quebras&nbsp;&nbsp;(initget&nbsp;"Q&nbsp;E"&nbsp;0)&nbsp;&nbsp;(setq&nbsp;opcao&nbsp;&nbsp;&nbsp;(getkword&nbsp;"\nSelecione&nbsp;o&nbsp;tipo&nbsp;de&nbsp;quebra&nbsp;manual&nbsp;[Quebra,&nbsp;Espaço]&nbsp;&lt;Quebra&gt;")&nbsp;&nbsp;&nbsp;&nbsp;opcao&nbsp;(if&nbsp;(=&nbsp;"E"&nbsp;opcao)&nbsp;"&nbsp;"&nbsp;"&lt;br&gt;"))&nbsp;&nbsp;;pede&nbsp;onde&nbsp;salvar&nbsp;o&nbsp;arquivo&nbsp;html&nbsp;&nbsp;(setq&nbsp;&nbsp;&nbsp;&nbsp;file&nbsp;&nbsp;&nbsp;(getfiled&nbsp;"Exportar&nbsp;tabela"&nbsp;""&nbsp;"html"&nbsp;1))&nbsp;&nbsp;(if&nbsp;(not&nbsp;file)&nbsp;(exit))&nbsp;&nbsp;&nbsp;&nbsp;;classifica&nbsp;as&nbsp;linhas&nbsp;em:&nbsp;horizontais&nbsp;e&nbsp;verticais&nbsp;&nbsp;(repeat&nbsp;(sslength&nbsp;linhas)&nbsp;&nbsp;&nbsp;&nbsp;(setq&nbsp;ent&nbsp;(ssname&nbsp;linhas&nbsp;0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1&nbsp;&nbsp;(vlax-curve-getstartpoint&nbsp;ent)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2&nbsp;&nbsp;(vlax-curve-getendpoint&nbsp;ent))&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;(equal&nbsp;(car&nbsp;p1)&nbsp;(car&nbsp;p2)&nbsp;0.0001)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;(not&nbsp;(member&nbsp;(car&nbsp;p1)&nbsp;linhasVerticais))&nbsp;&nbsp;&nbsp;&nbsp;(setq&nbsp;linhasVerticais&nbsp;(cons&nbsp;(car&nbsp;p1)&nbsp;linhasVerticais)))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;(not&nbsp;(member&nbsp;(cadr&nbsp;p1)&nbsp;linhasHoriz))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(setq&nbsp;linhasHoriz&nbsp;(cons&nbsp;(cadr&nbsp;p1)&nbsp;linhasHoriz))))&nbsp;&nbsp;&nbsp;&nbsp;(ssdel&nbsp;ent&nbsp;linhas))&nbsp;&nbsp;;ordena&nbsp;a&nbsp;lista&nbsp;das&nbsp;linhas&nbsp;verticais&nbsp;pelo&nbsp;X&nbsp;crescente&nbsp;e&nbsp;&nbsp;;as&nbsp;linhas&nbsp;horizontais&nbsp;pelo&nbsp;Y&nbsp;decrescente&nbsp;&nbsp;(setq&nbsp;linhasVerticais&nbsp;(vl-sort&nbsp;linhasVerticais&nbsp;'&lt;)&nbsp;&nbsp;&nbsp;&nbsp;linhasHoriz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(vl-sort&nbsp;linhasHoriz&nbsp;'&gt;))&nbsp;&nbsp;&nbsp;&nbsp;;calcula&nbsp;o&nbsp;canto&nbsp;superior&nbsp;esquerdo&nbsp;e&nbsp;inferior&nbsp;direito:&nbsp;&nbsp;(setq&nbsp;p1&nbsp;(list&nbsp;(car&nbsp;linhasVerticais)&nbsp;(car&nbsp;linhasHoriz))&nbsp;&nbsp;&nbsp;&nbsp;p2&nbsp;(list&nbsp;(last&nbsp;linhasVerticais)&nbsp;(last&nbsp;linhasHoriz)))&nbsp;&nbsp;;zoom&nbsp;window&nbsp;na&nbsp;tabela,&nbsp;para&nbsp;a&nbsp;seleção&nbsp;dos&nbsp;textos&nbsp;funcionar&nbsp;&nbsp;(vla-zoomwindow&nbsp;(vlax-get-acad-object)&nbsp;&nbsp;&nbsp;&nbsp;(vlax-3d-point&nbsp;p1)&nbsp;&nbsp;(vlax-3d-point&nbsp;p2))&nbsp;&nbsp;;inicia&nbsp;o&nbsp;cabeçalho&nbsp;do&nbsp;html&nbsp;&nbsp;(setq&nbsp;html&nbsp;(strcat&nbsp;"&lt;html&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;head&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;meta&nbsp;http-equiv='Content-Type;X-UA-Compatible'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;content='text/html;IE=9'&nbsp;charset='ISO-8859-1'&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;title&gt;Dwg2Html:&nbsp;"&nbsp;(vl-filename-base&nbsp;file)&nbsp;"&lt;/title&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;style&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;body&nbsp;&nbsp;{&nbsp;font-family:&nbsp;arial;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;font-weight:&nbsp;bold;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table&nbsp;{&nbsp;border-collapse:&nbsp;collapse;&nbsp;width:&nbsp;100%;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;td&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;border:&nbsp;1px&nbsp;solid&nbsp;black;&nbsp;text-align:center;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;text-decoration:&nbsp;none;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&lt;/style&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/head&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;body&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;p&gt;&nbsp;&nbsp;&nbsp;&nbsp;Visite:&nbsp;&lt;a&nbsp;href='http://tbn2net.appspot.com'&gt;TBN2NET,&nbsp;&nbsp;&nbsp;&nbsp;o&nbsp;melhor&nbsp;site&nbsp;de&nbsp;plug-ins&nbsp;para&nbsp;o&nbsp;AutoCAD!!!&lt;/a&gt;&lt;/p&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;p&gt;Arquivo:&nbsp;"&nbsp;(vl-string-translate&nbsp;"\\"&nbsp;"/"&nbsp;file)&nbsp;"&lt;/p&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;table&gt;&nbsp;&nbsp;&nbsp;&nbsp;"))&nbsp;&nbsp;;repita&nbsp;para&nbsp;todas&nbsp;as&nbsp;linhas&nbsp;horizontais&nbsp;&nbsp;(setq&nbsp;nLin&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;counter&nbsp;0)&nbsp;&nbsp;(repeat&nbsp;(1-&nbsp;(length&nbsp;linhasHoriz))&nbsp;&nbsp;&nbsp;&nbsp;;calcula&nbsp;os&nbsp;limites&nbsp;em&nbsp;Y&nbsp;da&nbsp;linha&nbsp;&nbsp;&nbsp;&nbsp;(setq&nbsp;y1&nbsp;&nbsp;&nbsp;(nth&nbsp;nLin&nbsp;linhasHoriz)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nLin&nbsp;(1+&nbsp;nLin)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y2&nbsp;&nbsp;&nbsp;(nth&nbsp;nLin&nbsp;linhasHoriz)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nCol&nbsp;0)&nbsp;&nbsp;&nbsp;&nbsp;;inicia&nbsp;o&nbsp;html&nbsp;da&nbsp;linha&nbsp;('tr')&nbsp;&nbsp;&nbsp;&nbsp;(setq&nbsp;html&nbsp;(strcat&nbsp;html&nbsp;"&lt;tr&gt;"))&nbsp;&nbsp;&nbsp;&nbsp;;repita&nbsp;para&nbsp;todas&nbsp;as&nbsp;colunas&nbsp;da&nbsp;linha&nbsp;&nbsp;&nbsp;&nbsp;(repeat&nbsp;(1-&nbsp;(length&nbsp;linhasVerticais))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;calcula&nbsp;os&nbsp;limites&nbsp;em&nbsp;X&nbsp;da&nbsp;coluna&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(setq&nbsp;x1&nbsp;&nbsp;&nbsp;&nbsp;(nth&nbsp;nCol&nbsp;linhasVerticais)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nCol&nbsp;&nbsp;(1+&nbsp;nCol)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x2&nbsp;&nbsp;&nbsp;&nbsp;(nth&nbsp;nCol&nbsp;linhasVerticais))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;tenta&nbsp;selecionar&nbsp;os&nbsp;textos&nbsp;dentro&nbsp;dos&nbsp;limites&nbsp;da&nbsp;célula&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(setq&nbsp;ssTxt&nbsp;(ssget&nbsp;"C"&nbsp;(list&nbsp;x1&nbsp;y1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(list&nbsp;x2&nbsp;y2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'((0&nbsp;.&nbsp;"*TEXT"))))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;se&nbsp;encontrou&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;ssTxt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(progn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;liste-os:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(setq&nbsp;tmp&nbsp;nil)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(repeat&nbsp;(sslength&nbsp;ssTxt)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(setq&nbsp;ent&nbsp;(ssname&nbsp;ssTxt&nbsp;0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;(cons&nbsp;(list&nbsp;(cdr&nbsp;(assoc&nbsp;10&nbsp;(entget&nbsp;ent)))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cdr&nbsp;(assoc&nbsp;1&nbsp;(entget&nbsp;ent))))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ssdel&nbsp;ent&nbsp;ssTxt))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;classifique&nbsp;pelo&nbsp;Y&nbsp;decrescente&nbsp;e&nbsp;concatende,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;colocando&nbsp;quebra&nbsp;de&nbsp;linha&nbsp;('br')&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(setq&nbsp;tmp&nbsp;(vl-sort&nbsp;tmp&nbsp;&nbsp;'(lambda&nbsp;(a&nbsp;b)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&gt;&nbsp;(cadar&nbsp;a)&nbsp;(cadar&nbsp;b))))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;(apply&nbsp;'strcat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(mapcar&nbsp;'(lambda&nbsp;(a)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(strcat&nbsp;(cadr&nbsp;a)&nbsp;opcao))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;(vl-string-trim&nbsp;opcao&nbsp;tmp)))&nbsp;&nbsp;&nbsp;&nbsp;(setq&nbsp;tmp&nbsp;&nbsp;&nbsp;"&nbsp;"))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;adiciona&nbsp;uma&nbsp;celula&nbsp;no&nbsp;html&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(setq&nbsp;html&nbsp;(strcat&nbsp;html&nbsp;"&lt;td&gt;"&nbsp;tmp&nbsp;"&lt;/td&gt;")))&nbsp;&nbsp;&nbsp;&nbsp;;finaliza&nbsp;o&nbsp;html&nbsp;da&nbsp;linha&nbsp;&nbsp;&nbsp;&nbsp;(Setq&nbsp;counter&nbsp;(1+&nbsp;counter)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;html&nbsp;(strcat&nbsp;html&nbsp;"&lt;/tr&gt;")))&nbsp;&nbsp;;finaliza&nbsp;o&nbsp;html&nbsp;da&nbsp;tabela&nbsp;&nbsp;(Setq&nbsp;html&nbsp;(strcat&nbsp;html&nbsp;"&lt;/table&gt;"))&nbsp;&nbsp;;finaliza&nbsp;o&nbsp;html&nbsp;&nbsp;(setq&nbsp;html&nbsp;(strcat&nbsp;html&nbsp;"&lt;/body&gt;&lt;/html&gt;"))&nbsp;&nbsp;;salva&nbsp;o&nbsp;arquivo&nbsp;&nbsp;(setq&nbsp;tmp&nbsp;(open&nbsp;file&nbsp;"w"))&nbsp;&nbsp;(write-line&nbsp;html&nbsp;tmp)&nbsp;&nbsp;(close&nbsp;tmp)&nbsp;&nbsp;;abre&nbsp;o&nbsp;arquivo&nbsp;com&nbsp;o&nbsp;navegador&nbsp;padrão&nbsp;&nbsp;(browser&nbsp;file)&nbsp;&nbsp;(princ)&nbsp;&nbsp;)(prompt&nbsp;"Dwg2Html&nbsp;carregado&nbsp;com&nbsp;sucesso!!Visite:&nbsp;http://tbn2net.appspot.com/showprog?progid=Dwg2HtmlAutor:&nbsp;Neyton&nbsp;Luiz&nbsp;Dalle&nbsp;MolleEngenheiro&nbsp;CivilWhatsApp:&nbsp;+55&nbsp;98&nbsp;99995&nbsp;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 ??