Lisp para automatizar camadas

Lisp para automatizar camadas

Anonymous
Não aplicável
3.063Exibições
23Respostas
Mensagem 1 de 24

Lisp para automatizar camadas

Anonymous
Não aplicável

Ola pessoal, eu trabalho com topsolid e autocad, gero os desenhos em 2d no topsolid e envio para dwg para finaliza-los no autocad.

Porem para passar todas as linhas para minhas layers padrao, preciso fazer manualmente selecionando as linhas por cores e passando para uma layer correspondente, por exemplo:

>seleciono todas as linhas que estao na cor cyan para minha layer nomeada de "contorno", com a cor, expessura e tipo correta. 

e faço  o mesmo processo com cada linha especifica do projeto, "linha de centro", "linha de corte" e etc.

todo projeto preciso fazer o mesmo trabalho, teria como automatizar esse processo?

Obrigado

0 Curtidas
Soluções aceitas (1)
3.064Exibições
23Respostas
Respostas (23)
Mensagem 2 de 24

MatiasWendt
Advisor
Advisor

Olá, seja bem vindo à comunidade Autodesk Brasil...

 

tente a solução proposta no link abaixo...

 

tem uma discussão muito semelhante...

 

https://forums.autodesk.com/t5/autocad-portugues/mudar-tudo-no-desenho-para-uma-nova-layer-automatic...

 

Se a resposta resolveu o seu problema clique em ACEITAR SOLUÇÃO, isso ajuda os outros usuários a encontrar rapidamente uma resposta, e se gostou, cliquem em CURTIR.


Matias I. Wendt


YouTube | Facebook | LinkedIn | Instagram

EESignature

             
Mensagem 3 de 24

Anonymous
Não aplicável

Olá @Anonymous selecionar similares e alterar a cor resolveria seu problema ?? se sim o screencast abaixo mostra como fazer. Se não, me avise aqui que eu escrevo um demo pra você. 

 

Mensagem 4 de 24

Anonymous
Não aplicável

É basicamente isso que faço meu amigo, porém invés de usar o comando "select similar" uso o "quick select" pelas cores, pelo seu metodo ja ajuda muito, sera que tem como automatizar isso?

Em meus projetos uso cerca de 12 camadas (layers) para cada tipo de linha, entao seria muito bom se eu conseguisse automatizar que cada cor de linha entrasse na camada correta. Não sei se estou conseguindo ser claro. 

0 Curtidas
Mensagem 5 de 24

f_santana
Mentor
Mentor

@Anonymous tenho duas perguntas para você.
o seu AutoCAD é Full (estou entendendo que sim, certo?)
estes arquivos que você recebe tem um padrão de nomenclatura de layers?

se tiver você pode criar um padrão de tradução com o LAYER TRANS


Você achou uma postagem útil? Então fique à vontade para curtir essas postagens!
Sua pergunta obteve uma resposta que resolveu a duvida? Então clique no botão Aceitar Solução.


Fábio Santana
Architect | CAD/BIM Manager

EESignature

0 Curtidas
Mensagem 6 de 24

hmsilva
Mentor
Mentor

@Anonymous wrote:

...

>seleciono todas as linhas que estao na cor cyan para minha layer nomeada de "contorno", com a cor, expessura e tipo correta. 

e faço  o mesmo processo com cada linha especifica do projeto, "linha de centro", "linha de corte" e etc.

todo projeto preciso fazer o mesmo trabalho, teria como automatizar esse processo?

...


Olá @Anonymous é possível automatizar.

Quando dizes  "seleciono todas as linhas que estao na cor cyan " são mesmo lines, ou podem ser outros objectos como círculos, arcos, etc?

Têm cor própria ou a cor é bylayer?

"para minha layer nomeada de "contorno", com a cor, expessura e tipo correta. " tipo correta é tipo de linha correta?

Uma "demo" que deve funcionar como esperado, a lista de layers tem que ser  escrita como descrito...

; a lista é constituida por:
; cor a procurar - nome da nova layer - cor - espessura - tipo de linha
(defun c:demo ( / laylist ss)
  (setq  laylist '((1 "Contorno" 4 0.30 "Continuous")
		   (2 "Linha de centro" 1 0.25 "DASHDOT")
		   (3 "Linha de corte" 2 0.35 "HIDDEN")))
	 (foreach lay laylist
	   (if (setq ss (ssget "_X" (list (cons 62 (car lay)))))
	     (progn
	       (command "_.-layer" "_M" (cadr lay) "_C" (caddr lay) "" "_LW" (cadddr lay) "" "_L" (last lay) "" "")
	       (command "_.chprop" "_P" "" "_LA" (cadr lay) "_C" "_BYL" "_LT" "ByLayer" "" )
	       )
	     )
	   )
  (princ)
  )

 

Espero que ajude
Henrique

EESignature

0 Curtidas
Mensagem 7 de 24

Anonymous
Não aplicável

Ola @f_santana,

Sim meu autocad é o full.

Quando recebo os arquivos recebo desta forma 

 

thibrandaum_0-1638463606319.png

 

0 Curtidas
Mensagem 8 de 24

Anonymous
Não aplicável

Boa tarde @hmsilva

Quando dizes  "seleciono todas as linhas que estao na cor cyan " são mesmo lines, ou podem ser outros objectos como círculos, arcos, etc?

Sim, me refiro a todos os objetos daquela cor, arcos, circulos etc. 

 

Têm cor própria ou a cor é bylayer?

Costumo colocar bylayer, porém se colocando uma cor própria facilitar o processo de automatizar nao tem problema. 

 

"para minha layer nomeada de "contorno", com a cor, expessura e tipo correta. " tipo correta é tipo de linha correta?

Uma "demo" que deve funcionar como esperado, a lista de layers tem que ser  escrita como descrito...

É o tipo de linha, linha continua, tracejada, linha ponto... etc

 

O arquivo gerado em dwg aparece para mim desta forma 

thibrandaum_0-1638463898533.png

Entao meu processo em todos os projetos é fazer com que todos objetos de cor 0,255,255 passem para minha camada ja criada, da qual a nomeei de "contorno" 

Entao dou um "quick select"  e fica desta forma

thibrandaum_1-1638464067779.png

Com tudo selecionado eu jogo elas na camada "contorno" e "bylayer", "bylayer", "bylayer"

e assim faço com todas as linhas do projeto, jogando cada uma em uma layer.

 

thibrandaum_2-1638464200121.png

 

0 Curtidas
Mensagem 9 de 24

Anonymous
Não aplicável

Gerei um video, acho que fica mais simplificado para entender, agradeço demais a todos que estao se propondo a ajudar. 

 

https://youtu.be/HYDOnHYJehE

0 Curtidas
Mensagem 10 de 24

hmsilva
Mentor
Mentor

@Anonymous 

reparei no vídeo que utilizas true colors e que em pelo menos uma das seleções utilizas o tipo de linha.

Se partilhares um dwg com, por exemplo, uma linha antes e uma depois, para cada tipo de layer que vais criar, é mais fácil podermos ajudar.

 

Henrique

EESignature

Mensagem 11 de 24

Anonymous
Não aplicável

@hmsilva  escreveu:

@Anonymous 

reparei no vídeo que utilizas true colors e que em pelo menos uma das seleções utilizas o tipo de linha.

Se partilhares um dwg com, por exemplo, uma linha antes e uma depois, para cada tipo de layer que vais criar, é mais fácil podermos ajudar.

 

Henrique


Anexei um arquivo que contem como as linhas aparecem e como eu preciso que elas fiquem. 

0 Curtidas
Mensagem 12 de 24

hmsilva
Mentor
Mentor

@Anonymous 

as duas ultimas linhas existentes, são iguais?

LINE Layer: "0"
Space: Model space
Color: 128,128,255 Linetype: "_..__..__..__.._"
LineWeight: 0.09 mm

deve estar errado, porque não se conseguem diferenciar.

O tipo de linha "______....__...." existe sempre no desenho?

 

Henrique

EESignature

0 Curtidas
Mensagem 13 de 24

Anonymous
Não aplicável

Olá @Anonymous Tente isso, é apenas um teste, ainda não está aprova de balas, mas vai me da um norte para saber se é isso que precisa. (comando subcamadas)

(defun c:subcamadas (/ sel ent obj lay cor lin new)
  (if (setq sel (ssget "_X" '((0 . "LINE"))))
   (foreach ent (vl-remove-if 'listp (mapcar 'cadr (ssnamex sel )))
     (setq  obj (vlax-ename->vla-object ent)
            lay (vla-get-layer obj) 
            cor (vla-get-color obj)
            lin (vla-get-linetype obj)
     )
     (setq new (jr:substituir cor (list lay lin cor )))
     (vla-put-layer obj (car new))
     (vla-put-linetype obj (cadr new)) 
     (vla-put-color obj (if (eq (caddr new) "ByLayer") "256" (itoa (caddr new))) )
   )
  );;if
)

(defun jr:substituir ( sel lst )
  (defun type! ( )
    (vl-some
      '(lambda (clr name) (if (= clr sel) name) )
      '( 11 4 1 7 251 171 );;aqui a cor atual.
      (list 
        (list "000 CENT1" "ByLayer" "ByLayer") ;layer/color/linetype
        (list "000 CONTORNO" "ByLayer" "ByLayer")
        (list "000 CORTE1" "ByLayer" "ByLayer")
        (list "000 CORTE2" "ByLayer" "ByLayer")
        (list "000 HACHURA" "ByLayer" "ByLayer")
        (list "000 ROSCA" "ByLayer" "ByLayer")
      );;aqui os novos tipos equivamentes
    )
  )
  (if (setq value (type!))
    value
    lst ;;pegar o layer
  )
)

 

Mensagem 14 de 24

Anonymous
Não aplicável

@hmsilva  escreveu:

@Anonymous 

as duas ultimas linhas existentes, são iguais?

LINE Layer: "0"
Space: Model space
Color: 128,128,255 Linetype: "_..__..__..__.._"
LineWeight: 0.09 mm

deve estar errado, porque não se conseguem diferenciar.

O tipo de linha "______....__...." existe sempre no desenho?

 

Henrique

 

Bom dia Henrique, 

Existe diferença apenas no tipo de linha

"TRACEJADA" > "_..__..__..__.._"

"ROSCA" > "_____.._____"


Enviei um desenho com um antes e depois, devia ter feito isso antes rs. 

0 Curtidas
Mensagem 15 de 24

hmsilva
Mentor
Mentor

@Anonymous 

estava a falar destas duas linhas do antes

hmsilva_0-1638533668974.png

 

Henrique

EESignature

0 Curtidas
Mensagem 16 de 24

Anonymous
Não aplicável

Tente assim, me diz os erros vi que está quase:

(defun c:subcamadas (/ sel ent obj lay cor lin new)
  (if (setq sel (ssget "_X")); '((0 . "LINE,ARC"))))
   (foreach ent (vl-remove-if 'listp (mapcar 'cadr (ssnamex sel )))
     (setq  obj (vlax-ename->vla-object ent) lay (vla-get-layer obj) cor (vla-get-color obj) lin (vla-get-linetype obj))
     (setq new (jr:substituir cor (list lay lin cor )))
     (vla-put-layer obj (car new))
     (vla-put-linetype obj (cadr new)) 
     (vla-put-color obj (if (eq (caddr new) "ByLayer") "256" (itoa (caddr new))) )
   )
  );;if
)

(defun jr:substituir ( sel lst )
  (defun type! ( )
    (vl-some
      '(lambda (clr name) (if (= clr sel) name) )
      '( 11 4 1 7 251 171 );;aqui a cor atual.
      (list 
        (list "000 CENT1" "ByLayer" "ByLayer") ;layer/color/linetype
        (list "000 CONTORNO" "ByLayer" "ByLayer")
        (list "000 CORTE1" "ByLayer" "ByLayer")
        (list "000 CORTE2" "ByLayer" "ByLayer")
        (list "000 HACHURA" "ByLayer" "ByLayer")
        (list "000 TRACEJADO" "ByLayer" "ByLayer")
      );;aqui os novos tipos equivamentes
    )
  )
  (if (setq value (type!))
    value
    lst ;;pegar o layer
  )
)

 

0 Curtidas
Mensagem 17 de 24

Anonymous
Não aplicável

 


@Anonymous  escreveu:

Olá @Anonymous Tente isso, é apenas um teste, ainda não está aprova de balas, mas vai me da um norte para saber se é isso que precisa. (comando subcamadas)

 

(defun c:subcamadas (/ sel ent obj lay cor lin new)
  (if (setq sel (ssget "_X" '((0 . "LINE"))))
   (foreach ent (vl-remove-if 'listp (mapcar 'cadr (ssnamex sel )))
     (setq  obj (vlax-ename->vla-object ent)
            lay (vla-get-layer obj) 
            cor (vla-get-color obj)
            lin (vla-get-linetype obj)
     )
     (setq new (jr:substituir cor (list lay lin cor )))
     (vla-put-layer obj (car new))
     (vla-put-linetype obj (cadr new)) 
     (vla-put-color obj (if (eq (caddr new) "ByLayer") "256" (itoa (caddr new))) )
   )
  );;if
)

(defun jr:substituir ( sel lst )
  (defun type! ( )
    (vl-some
      '(lambda (clr name) (if (= clr sel) name) )
      '( 11 4 1 7 251 171 );;aqui a cor atual.
      (list 
        (list "000 CENT1" "ByLayer" "ByLayer") ;layer/color/linetype
        (list "000 CONTORNO" "ByLayer" "ByLayer")
        (list "000 CORTE1" "ByLayer" "ByLayer")
        (list "000 CORTE2" "ByLayer" "ByLayer")
        (list "000 HACHURA" "ByLayer" "ByLayer")
        (list "000 ROSCA" "ByLayer" "ByLayer")
      );;aqui os novos tipos equivamentes
    )
  )
  (if (setq value (type!))
    value
    lst ;;pegar o layer
  )
)

 

Uooooouuu!! É exatamente isso cara!!! Só de ver funcionando ja me deu muita alegria hahaha

Precisa ajustar algo, por que o contorno nao ficou em "bylayer" e os "arcos" e "circulos" nao mudaram para as camadas. 


 

Mensagem 18 de 24

Anonymous
Não aplicável

@hmsilva  escreveu:

@Anonymous 

estava a falar destas duas linhas do antes

hmsilva_0-1638533668974.png

 

Henrique


Isso mesmo, essa linha do "antes" da rosca, eu coloquei errada. o tipo dela é diferente, é assim "______.._____"

0 Curtidas
Mensagem 19 de 24

Anonymous
Não aplicável
0 Curtidas
Mensagem 20 de 24

Anonymous
Não aplicável

@Anonymous  escreveu:

Tente assim, me diz os erros vi que está quase:

 

(defun c:subcamadas (/ sel ent obj lay cor lin new)
  (if (setq sel (ssget "_X")); '((0 . "LINE,ARC"))))
   (foreach ent (vl-remove-if 'listp (mapcar 'cadr (ssnamex sel )))
     (setq  obj (vlax-ename->vla-object ent) lay (vla-get-layer obj) cor (vla-get-color obj) lin (vla-get-linetype obj))
     (setq new (jr:substituir cor (list lay lin cor )))
     (vla-put-layer obj (car new))
     (vla-put-linetype obj (cadr new)) 
     (vla-put-color obj (if (eq (caddr new) "ByLayer") "256" (itoa (caddr new))) )
   )
  );;if
)

(defun jr:substituir ( sel lst )
  (defun type! ( )
    (vl-some
      '(lambda (clr name) (if (= clr sel) name) )
      '( 11 4 1 7 251 171 );;aqui a cor atual.
      (list 
        (list "000 CENT1" "ByLayer" "ByLayer") ;layer/color/linetype
        (list "000 CONTORNO" "ByLayer" "ByLayer")
        (list "000 CORTE1" "ByLayer" "ByLayer")
        (list "000 CORTE2" "ByLayer" "ByLayer")
        (list "000 HACHURA" "ByLayer" "ByLayer")
        (list "000 TRACEJADO" "ByLayer" "ByLayer")
      );;aqui os novos tipos equivamentes
    )
  )
  (if (setq value (type!))
    value
    lst ;;pegar o layer
  )
)

 

 


O erro nesse foi somente que nao entrou a espessura nas linhas, e a camada "ROSCA" ficou como tracejada. Corrigindo isso estara perfeito, e nem saberei como agradecer. 

0 Curtidas