Loteamento Explodido? Lamentável, mas tem jeito!!!
Autor: neyton luiz dalle molle | Publicado: 2016-04-04T11:03:00-03:00


Hoje recebi um pedido de um cliente para testar o CADMEMO no projeto dele. Só que o desenho era CAD puro e os lotes não eram polilinhas fechadas, nem ao menos os nomes dos lotes eram blocos. Condições estas para o CADMEMO funcionar.

Bem, isso é problema? Sim, de certa forma. Se fosse converter tudo em PARCEL no Civil 3D, ainda teria de renomear os parcels gerados....

A maneira mais rápida que consegui pensar pra isso é escrever um pequeno lisp para interpretar o projeto e criar as polilinhas e os blocos.

O código fonte segue abaixo. Veja que usei o comando BPOLY para obter uma polilinha fechada e inseri o bloco necessário no centroide da polilinha.

Para obter este centroide, usei uma REGION temporária.




Para rodar é bem simples, tenha os blocos:
LOTE - bloco que informará o nome do lote, tem os atributos NOME, AREA, DESC
QUADRA - bloco que informará o nome da quadra, tem o atributo NOME

Agora, carregue com o APPLOAD.

Ao chamar o comando na linha de comando, serão pedidas as informações de nome do layer, bloco etc, caso você queira reconfigurar os parâmetros do lisp.

Bom, sem mais delongas, segue o código:

;lembrar&nbsp;valores&nbsp;padrão:(setq&nbsp;txtl2pl:blocolote&nbsp;"LOTE"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txtl2pl:layernomelote&nbsp;"DIM"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txtl2pl:layerlote&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"LOTE"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txtl2pl:escala&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txtl2pl:areatpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"A={}m²"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txtl2pl:raioerro&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txtl2pl:layererro&nbsp;&nbsp;&nbsp;&nbsp;"_erro"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txtl2pl:filtro&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"L.*"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txtl2pl:attnome&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"NOME"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txtl2pl:attarea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"AREA"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txtl2pl:attdesc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"DESC"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txtl2pl:desc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"c3dmemo");programa&nbsp;que&nbsp;desenha&nbsp;polilinha&nbsp;e&nbsp;bloco&nbsp;com&nbsp;atributos(defun&nbsp;c:txtl2pl&nbsp;(/&nbsp;ss&nbsp;ent&nbsp;pl&nbsp;bloco&nbsp;vla&nbsp;thisdrawing&nbsp;rg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objArray&nbsp;rg&nbsp;Centroid&nbsp;att&nbsp;tag&nbsp;model&nbsp;tmp)&nbsp;&nbsp;;controle&nbsp;de&nbsp;erros:&nbsp;&nbsp;(tbn:error-init&nbsp;nil)&nbsp;&nbsp;&nbsp;&nbsp;;inicia&nbsp;ponteiros&nbsp;para&nbsp;o&nbsp;desenho&nbsp;atual&nbsp;e&nbsp;model&nbsp;space&nbsp;&nbsp;(setq&nbsp;thisdrawing&nbsp;(vla-get-activedocument&nbsp;(vlax-get-acad-object))&nbsp;&nbsp;&nbsp;&nbsp;model&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(vla-get-modelspace&nbsp;thisdrawing))&nbsp;&nbsp;;reconfigura&nbsp;os&nbsp;valores&nbsp;padrão:&nbsp;&nbsp;(setq&nbsp;tmp&nbsp;&nbsp;(car&nbsp;(entsel&nbsp;(strcat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\nClique&nbsp;um&nbsp;texto&nbsp;para&nbsp;obter&nbsp;o&nbsp;layer&nbsp;do&nbsp;nome&nbsp;do"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"&nbsp;lote&nbsp;ou&nbsp;clique&nbsp;enter&nbsp;para&nbsp;aceitar&nbsp;&lt;"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txtl2pl:layernomelote&nbsp;"&gt;"))))&nbsp;&nbsp;(if&nbsp;tmp&nbsp;(setq&nbsp;txtl2pl:layernomelote&nbsp;(cdr&nbsp;(assoc&nbsp;8&nbsp;(entget&nbsp;tmp)))))&nbsp;&nbsp;(setq&nbsp;tmp&nbsp;(getstring&nbsp;(strcat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\nInforme&nbsp;o&nbsp;nome&nbsp;do&nbsp;bloco"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"&nbsp;a&nbsp;inserir&nbsp;ou&nbsp;clique&nbsp;enter&nbsp;para&nbsp;aceitar&nbsp;&lt;"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txtl2pl:blocolote&nbsp;"&gt;")))&nbsp;&nbsp;(if&nbsp;(/=&nbsp;""&nbsp;tmp)&nbsp;(setq&nbsp;txtl2pl:blocolote&nbsp;tmp))&nbsp;&nbsp;(setq&nbsp;tmp&nbsp;(getstring&nbsp;&nbsp;(strcat&nbsp;&nbsp;"\nInforme&nbsp;o&nbsp;atributo&nbsp;do"&nbsp;&nbsp;&nbsp;&nbsp;"&nbsp;nome&nbsp;do&nbsp;lote,&nbsp;ou&nbsp;enter&nbsp;para&nbsp;aceitar&nbsp;&lt;"&nbsp;txtl2pl:attnome&nbsp;"&gt;")))&nbsp;&nbsp;(if&nbsp;(/=&nbsp;""&nbsp;tmp)&nbsp;(setq&nbsp;txtl2pl:attnome&nbsp;tmp))&nbsp;&nbsp;(setq&nbsp;tmp&nbsp;(getstring&nbsp;(strcat&nbsp;&nbsp;"\nInforme&nbsp;o&nbsp;atributo&nbsp;da"&nbsp;&nbsp;&nbsp;&nbsp;"&nbsp;area&nbsp;do&nbsp;lote,&nbsp;ou&nbsp;enter&nbsp;para&nbsp;aceitar&nbsp;&lt;"&nbsp;txtl2pl:attarea&nbsp;"&gt;")))&nbsp;&nbsp;(if&nbsp;(/=&nbsp;""&nbsp;tmp)&nbsp;(setq&nbsp;txtl2pl:attarea&nbsp;tmp))&nbsp;&nbsp;(setq&nbsp;tmp&nbsp;(getstring&nbsp;(strcat&nbsp;"\nInforme&nbsp;o&nbsp;atributo&nbsp;da&nbsp;descrição"&nbsp;&nbsp;&nbsp;&nbsp;"&nbsp;do&nbsp;lote,&nbsp;ou&nbsp;enter&nbsp;para&nbsp;aceitar&nbsp;&lt;"&nbsp;txtl2pl:attdesc&nbsp;"&gt;")))&nbsp;&nbsp;(if&nbsp;(/=&nbsp;""&nbsp;tmp)&nbsp;(setq&nbsp;txtl2pl:attdesc&nbsp;tmp))&nbsp;&nbsp;(setq&nbsp;tmp&nbsp;(getstring&nbsp;(strcat&nbsp;"\nInforme&nbsp;uma&nbsp;descrição&nbsp;a&nbsp;aplicar,"&nbsp;&nbsp;&nbsp;&nbsp;"&nbsp;ou&nbsp;enter&nbsp;para&nbsp;aceitar&nbsp;&lt;"&nbsp;txtl2pl:desc&nbsp;"&gt;")))&nbsp;&nbsp;(if&nbsp;(/=&nbsp;""&nbsp;tmp)&nbsp;(setq&nbsp;txtl2pl:desc&nbsp;tmp))&nbsp;&nbsp;(setq&nbsp;tmp&nbsp;(getstring&nbsp;(strcat&nbsp;"\nInforme&nbsp;o&nbsp;layer&nbsp;da&nbsp;polilinha&nbsp;de"&nbsp;&nbsp;&nbsp;&nbsp;"&nbsp;lote,&nbsp;ou&nbsp;enter&nbsp;para&nbsp;aceitar&nbsp;&lt;"&nbsp;txtl2pl:layerlote&nbsp;"&gt;")))&nbsp;&nbsp;(if&nbsp;(/=&nbsp;""&nbsp;tmp)&nbsp;(setq&nbsp;txtl2pl:layerlote&nbsp;tmp))&nbsp;&nbsp;(setq&nbsp;tmp&nbsp;(getstring&nbsp;(strcat&nbsp;"\nInforme&nbsp;o&nbsp;filtro&nbsp;de&nbsp;texto&nbsp;do"&nbsp;&nbsp;&nbsp;"&nbsp;nome&nbsp;do&nbsp;lote,&nbsp;ou&nbsp;enter&nbsp;para&nbsp;aceitar&nbsp;&lt;"&nbsp;txtl2pl:filtro&nbsp;"&gt;")))&nbsp;&nbsp;(if&nbsp;(/=&nbsp;""&nbsp;tmp)&nbsp;(setq&nbsp;txtl2pl:filtro&nbsp;tmp))&nbsp;&nbsp;&nbsp;;inicia&nbsp;a&nbsp;seleção&nbsp;dos&nbsp;textos&nbsp;a&nbsp;processar:&nbsp;&nbsp;(prompt&nbsp;(strcat&nbsp;&nbsp;&nbsp;&nbsp;"\nSelecione&nbsp;os&nbsp;textos&nbsp;do&nbsp;layer&nbsp;&lt;"&nbsp;txtl2pl:layernomelote&nbsp;"&gt;"))&nbsp;&nbsp;(setq&nbsp;ss&nbsp;&nbsp;(ssget&nbsp;(list&nbsp;'(0&nbsp;.&nbsp;"TEXT")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cons&nbsp;8&nbsp;txtl2pl:layernomelote)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cons&nbsp;1&nbsp;txtl2pl:filtro))))&nbsp;&nbsp;;garante&nbsp;que&nbsp;exista&nbsp;o&nbsp;layer&nbsp;da&nbsp;polilinha&nbsp;e&nbsp;dos&nbsp;&nbsp;;círculos&nbsp;de&nbsp;erro&nbsp;se&nbsp;ocorrerem:&nbsp;&nbsp;(vla-add&nbsp;(vla-get-layers&nbsp;thisdrawing)&nbsp;txtl2pl:layerlote)&nbsp;&nbsp;(vla-add&nbsp;(vla-get-layers&nbsp;thisdrawing)&nbsp;txtl2pl:layererro)&nbsp;&nbsp;;repita&nbsp;em&nbsp;todos&nbsp;os&nbsp;textos:&nbsp;&nbsp;(repeat&nbsp;(sslength&nbsp;ss)&nbsp;&nbsp;&nbsp;&nbsp;;pega&nbsp;o&nbsp;promeiro&nbsp;da&nbsp;lista&nbsp;&nbsp;&nbsp;&nbsp;(setq&nbsp;ent&nbsp;(ssname&nbsp;ss&nbsp;0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pt&nbsp;&nbsp;(cdr&nbsp;(assoc&nbsp;10&nbsp;(entget&nbsp;ent)))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vla&nbsp;(vlax-ename-&gt;vla-object&nbsp;ent))&nbsp;&nbsp;&nbsp;&nbsp;;remove&nbsp;ele&nbsp;da&nbsp;lista&nbsp;&nbsp;&nbsp;&nbsp;(ssdel&nbsp;ent&nbsp;ss)&nbsp;&nbsp;&nbsp;&nbsp;;zoom&nbsp;no&nbsp;texto,&nbsp;para&nbsp;o&nbsp;bpoly&nbsp;funcionar&nbsp;corretamente&nbsp;&nbsp;&nbsp;&nbsp;(vla-zoomcenter&nbsp;(vlax-get-acad-object)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(vlax-3d-point&nbsp;pt)&nbsp;(getvar&nbsp;"viewsize"))&nbsp;&nbsp;&nbsp;&nbsp;;tenta&nbsp;o&nbsp;bpoly&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;(vl-catch-all-error-p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(setq&nbsp;pl&nbsp;(vl-catch-all-apply&nbsp;'bpoly&nbsp;(list&nbsp;pt))))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;se&nbsp;falhar,&nbsp;marca&nbsp;com&nbsp;um&nbsp;círculo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(vla-put-layer&nbsp;(vla-addCircle&nbsp;model&nbsp;(vlax-3d-point&nbsp;pt)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txtl2pl:raioerro)&nbsp;txtl2pl:layererro)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;se&nbsp;funcionar,&nbsp;insere&nbsp;o&nbsp;bloco&nbsp;do&nbsp;nome&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;do&nbsp;lote&nbsp;no&nbsp;centroide&nbsp;da&nbsp;polilinha&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(progn&nbsp;&nbsp;&nbsp;&nbsp;;obtem&nbsp;a&nbsp;polilinha&nbsp;&nbsp;&nbsp;&nbsp;(setq&nbsp;pl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(vlax-ename-&gt;vla-object&nbsp;pl)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objArray&nbsp;(vlax-make-safearray&nbsp;vlax-vbObject&nbsp;'(0&nbsp;.&nbsp;0)))&nbsp;&nbsp;&nbsp;&nbsp;;seta&nbsp;o&nbsp;seu&nbsp;layer&nbsp;&nbsp;&nbsp;&nbsp;(vla-put-layer&nbsp;pl&nbsp;txtl2pl:layerlote)&nbsp;&nbsp;&nbsp;&nbsp;;cria&nbsp;uma&nbsp;region&nbsp;temporaria&nbsp;na&nbsp;polilinha,&nbsp;&nbsp;&nbsp;&nbsp;;para&nbsp;obter&nbsp;o&nbsp;centroide&nbsp;&nbsp;&nbsp;&nbsp;(vlax-safearray-fill&nbsp;objArray&nbsp;(list&nbsp;pl))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(setq&nbsp;rg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(car&nbsp;(vlax-safearray-&gt;list&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(vlax-variant-value&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(vla-addregion&nbsp;model&nbsp;objArray))))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Centroid&nbsp;(vlax-safearray-&gt;list&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(vlax-variant-value&nbsp;(vla-get-Centroid&nbsp;rg)))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Centroid&nbsp;(list&nbsp;(car&nbsp;Centroid)&nbsp;(cadr&nbsp;Centroid)&nbsp;0.0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;insere&nbsp;o&nbsp;bloco&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bloco&nbsp;&nbsp;&nbsp;&nbsp;(vla-insertblock&nbsp;(vla-get-modelspace&nbsp;thisdrawing)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(vlax-3d-point&nbsp;Centroid)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txtl2pl:blocolote&nbsp;txtl2pl:escala&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txtl2pl:escala&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txtl2pl:escala&nbsp;(vla-get-rotation&nbsp;vla)))&nbsp;&nbsp;&nbsp;&nbsp;(vla-put-layer&nbsp;bloco&nbsp;txtl2pl:layerlote)&nbsp;&nbsp;&nbsp;&nbsp;;apaga&nbsp;a&nbsp;region&nbsp;&nbsp;&nbsp;&nbsp;(vla-delete&nbsp;rg)&nbsp;&nbsp;&nbsp;&nbsp;;preenche&nbsp;os&nbsp;atributos&nbsp;do&nbsp;bloco&nbsp;&nbsp;&nbsp;&nbsp;(foreach&nbsp;att&nbsp;(vlax-safearray-&gt;list&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(vlax-variant-value&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(vla-GetAttributes&nbsp;bloco)))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(setq&nbsp;tag&nbsp;(vla-get-tagstring&nbsp;att))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cond&nbsp;((eq&nbsp;(strcase&nbsp;tag)&nbsp;(strcase&nbsp;txtl2pl:attnome))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(vla-put-textstring&nbsp;att&nbsp;(vla-get-textstring&nbsp;vla)))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((eq&nbsp;(strcase&nbsp;tag)&nbsp;(strcase&nbsp;txtl2pl:attdesc))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(vla-put-textstring&nbsp;att&nbsp;txtl2pl:desc))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((eq&nbsp;(strcase&nbsp;tag)&nbsp;(strcase&nbsp;txtl2pl:attarea))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(vla-put-textstring&nbsp;att&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(vl-string-subst&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(rtos&nbsp;(vla-get-area&nbsp;pl)&nbsp;2&nbsp;2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"{}"&nbsp;txtl2pl:areatpl&nbsp;)))))))&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;&nbsp;(tbn:error-restore)&nbsp;&nbsp;)(defun&nbsp;tbn:error-init&nbsp;(sys&nbsp;/&nbsp;tmp&nbsp;ss&nbsp;cmd)&nbsp;&nbsp;(setq&nbsp;tbn:olderr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*error*&nbsp;&nbsp;&nbsp;&nbsp;*error*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(lambda&nbsp;(s)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;(/=&nbsp;s&nbsp;"Function&nbsp;cancelled")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(prompt&nbsp;"\nBomb!!&nbsp;Error:&nbsp;"))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(eval&nbsp;tbn:error_exe)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(tbn:error-restore))&nbsp;&nbsp;&nbsp;&nbsp;tbn:error_exe&nbsp;&nbsp;(cadr&nbsp;sys)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(car&nbsp;sys)&nbsp;&nbsp;&nbsp;&nbsp;tbn:sysvars&nbsp;&nbsp;&nbsp;&nbsp;nil&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ss&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ssgetfirst))&nbsp;&nbsp;(vla-StartUndoMark&nbsp;&nbsp;&nbsp;&nbsp;(vla-get-ActiveDocument&nbsp;(vlax-get-acad-object)))&nbsp;&nbsp;(repeat&nbsp;(/&nbsp;(length&nbsp;sys)&nbsp;2)&nbsp;&nbsp;&nbsp;&nbsp;(setq&nbsp;tmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(car&nbsp;sys)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tbn:sysvars&nbsp;(cons&nbsp;(list&nbsp;tmp&nbsp;(getvar&nbsp;tmp))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tbn:sysvars)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(setvar&nbsp;tmp&nbsp;(cadr&nbsp;sys))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cddr&nbsp;sys)))&nbsp;&nbsp;(sssetfirst&nbsp;(car&nbsp;ss)&nbsp;(cadr&nbsp;ss)))(defun&nbsp;tbn:error-restore&nbsp;(/&nbsp;cmd&nbsp;x)&nbsp;&nbsp;(foreach&nbsp;x&nbsp;tbn:sysvars&nbsp;(setvar&nbsp;(car&nbsp;x)&nbsp;(cadr&nbsp;x)))&nbsp;&nbsp;(redraw)&nbsp;&nbsp;(setq&nbsp;*error*&nbsp;tbn:olderr)&nbsp;&nbsp;(vla-EndUndoMark&nbsp;&nbsp;&nbsp;&nbsp;(vla-get-ActiveDocument&nbsp;(vlax-get-acad-object)))&nbsp;&nbsp;(princ))



Veja o dwg de exemplo