Comunidade
AutoCAD - Português
Bem vindo ao Forum de AutoCAD da Autodesk. Compartilhe seu conhecimento, faça perguntas e explore os tópicos mais populares de AutoCAD.
cancelar
Mostrando resultados para 
Mostrar  apenas  | Pesquisar então 
Você quer dizer: 

Somar comprimento de várias linhas - Autocad 2015

43 RESPOSTAS 43
SOLUCIONADO
Responder
Mensagem 1 de 44
FilRib
82397 Exibições, 43 Respostas

Somar comprimento de várias linhas - Autocad 2015

Bom dia,

 

Gostaria de saber se existe alguma maneira de somar automaticamente comprimentos de várias linhas.

Até ao AutoCad 2014, usava uma rotina LISP que fazia o pretendido (SOMAPER), mas no AutoCad 2015 não funciona.

 

O programa devolve-me a seguinte mensagem de erro: 

 

Requires numeric distance, two points, or option keyword.
; error: Function cancelled

 

Desde já agradeço a ajuda

43 RESPOSTAS 43
Mensagem 2 de 44
hmsilva
em resposta a: FilRib

Olá FilRib,

não conheço a SOMAPER, nem tenho o 2015 neste PC, mas tenta esta rotina (minimamente testada) e vê se funciona bem,

 

Se não der, anexa a outra rotina, que é mais fácil entender o erro.

 

(defun c:compt (/ comp compt ent i ss)
  (vl-load-com)
  (if (setq ss (ssget '((0 . "ELLIPSE,LWPOLYLINE,POLYLINE,SPLINE,LINE,ARC,CIRCLE"))))
    (progn
        (setq	compt 0.0)
    (repeat (setq i (sslength ss))
            (setq ent (ssname ss (setq i (1- i)))
		  comp (vlax-curve-getDistAtParam ent (vlax-curve-getEndParam ent))
		  compt (+ comp compt)
            )
      )
    (princ (strcat "\nComprimento total: " (rtos compt)))
    )
    )
  (princ)
  )

 

Espero que ajude

Henrique

EESignature

Mensagem 3 de 44
FilRib
em resposta a: hmsilva

Obrigado Henrique, funcionou na perfeição no Autocad 2015.

 

Cumps

Mensagem 4 de 44
hmsilva
em resposta a: FilRib

É um prazer poder ajudar!

Henrique

EESignature

Mensagem 5 de 44
Anonymous
em resposta a: hmsilva

Olá Henrique. Estou com o mesmo problema que FilRib. Acabei de baixar o Mac Yosemite e o AutoCad 2015 diz que não é possível carregar a rotina porque ele não é compatível com o Yosemite:

; error: vl-load-com not supported on "Mac OS X Version 10.10 (x86_64)"

Há alguma forma de modificar essa linha de comando por alguma que funcione no Yosemite?

Mensagem 6 de 44
hmsilva
em resposta a: Anonymous

Olá Cesar, bem vindo aos forums da Autodesk!

 

Infelizmente o 'AutoCAD for mac' não suporta Vlisp, portanto todos os códigos para 'mac' não podem recorrer a funções 'vl*'...

Para recorrer a AutoLISP e reescrever esta rotina, seria necessário muito mais código.

Não sei se ainda tenho algo parecido que tenha escrito em vanila autolisp, vou procurar nos meus ficheiros mais antigos e se encontrar posto.

Entretanto, tenta fazer um google que pode ser que encontres algo.

 

Henrique

EESignature

Mensagem 7 de 44
hmsilva
em resposta a: Anonymous

 Cezar,

tenta esta rotina, deve funcionar como esperado...

 

(Não testada, não tenho AutoCAD neste laptop)

(defun c:compt (/ comp compt ent enttp hnd i ss)
  (if (setq ss (ssget '((0 . "ELLIPSE,LWPOLYLINE,POLYLINE,SPLINE,LINE,ARC,CIRCLE"))))
    (progn
      (setq compt 0.0)
      (repeat (setq i (sslength ss))
        (setq hnd   (ssname ss (setq i (1- i)))
              ent   (entget hnd)
              enttp (cdr (assoc 0 ent))
        )
        (cond ((wcmatch enttp "LINE")
               (setq comp (distance (cdr (assoc 10 ent)) (cdr (assoc 11 ent))))
              )
              ((wcmatch enttp "ARC")
               (setq comp (* (cdr (assoc 40 ent))
                             (if (minusp (setq l (- (cdr (assoc 51 ent))
                                                    (cdr (assoc 50 ent))
                                                 )
                                         )
                                 )
                               (+ pi pi l)
                               l
                             )
                          )
               )
              )
              ((wcmatch enttp "ELLIPSE,LWPOLYLINE,POLYLINE,SPLINE,CIRCLE")
               (command "_.area" "_O" hnd)
               (setq comp (getvar 'PERIMETER))
              )
              (T
               (setq comp 0.0)
              )
        )
        (setq compt (+ comp compt))
      )
      (princ (strcat "\nComprimento total: " (rtos compt)))
    )
  )
  (princ)
)

 

Espero que ajude

Henrique

 

EESignature

Mensagem 8 de 44
rodrigo
em resposta a: hmsilva

Bom dia.

Depois de criar esta rotina como faço para usala? Qual comando?

Mensagem 9 de 44
hmsilva
em resposta a: rodrigo


rodrigo escreveu:

Bom dia.

Depois de criar esta rotina como faço para usala? Qual comando?


Olá Rodrigo e bem vindo à Comunidade Autodesk.

 

As rotinas de Auto/Visual LISP, são ficheiros ASCII, portanto seleciona-a toda, e cola-a num ficheiro de texto, por exemplo 'notepad', e salva-o como 'xxx.lsp' (eu normalmente salvo-o com o nome do comando) numa pasta nas 'trusted Locations'.

Para carregares um 'lisp' tens o comando '_appload' e selecionas o ficheiro que queres carregar.

Neste caso o nome do comando é compt

Numa rotina de 'lisp' o nome do comando está escrito na função 'defun'

(defun c:compt (.....

0 c: é apenas a definir uma função que o AutoCAD vai reconhecer como comando, o que vem depois dos dois pontos ":" é o nome do comando...

 

Espero que ajude
Henrique

 

 

EESignature

Mensagem 10 de 44
renanmgU2EXQ
em resposta a: hmsilva

Olá,

 

Abri um notepad e colei:

 

(defun c:compt (/ comp compt ent i ss)
(vl-load-com)
(if (setq ss (ssget '((0 . "ELLIPSE,LWPOLYLINE,POLYLINE,SPLINE,LINE,ARC,CIRCLE"))))
(progn
(setq compt 0.0)
(repeat (setq i (sslength ss))
(setq ent (ssname ss (setq i (1- i)))
comp (vlax-curve-getDistAtParam ent (vlax-curve-getEndParam ent))
compt (+ comp compt)
)
)
(princ (strcat "\nComprimento total: " (rtos compt)))
)
)
(princ)
)

 

 

 

 

após isso, salvei como compt.lsp na pasta: arquivos de programas/autodesk/autocad english 2016/support/compt.lsp.

 

Reiniciei o CAD e não apareceu o comando.

 

O que seria uma pasta trusted locations? Qual foi meu erro?

Mensagem 11 de 44
hmsilva
em resposta a: renanmgU2EXQ


renanmgU2EXQ escreveu:

...

 

 salvei como compt.lsp na pasta: arquivos de programas/autodesk/autocad english 2016/support/compt.lsp.

 

Reiniciei o CAD e não apareceu o comando.

 

O que seria uma pasta trusted locations? Qual foi meu erro?


Olá renanmgU2EXQ e bem vindo à Comunidade Autodesk.

 

Para carregar uma rotina no AutoCAD, tenta o comando AppLoad, procura o ficheiro compt.lsp, e arrasta-o para dentro da Startup Suite, assim o ficheiro será carregado em todos os dwg's.

 

Espero que ajude
Henrique

EESignature

Mensagem 12 de 44
vinopinheiro
em resposta a: hmsilva

Parabéns amigo, já faz mais de um ano que vc postou essa ajuda, testei e funcionou muito bem!!
trabalho projetando tesouras metálicas e esse teu comando vai me ajudar muito para quantificar o material a ser utilizado,
PARABÉNS E OBRIGADO!

Mensagem 13 de 44
hmsilva
em resposta a: vinopinheiro


vinopinheiro escreveu:

Parabéns amigo, já faz mais de um ano que vc postou essa ajuda, testei e funcionou muito bem!!
trabalho projetando tesouras metálicas e esse teu comando vai me ajudar muito para quantificar o material a ser utilizado,
PARABÉNS E OBRIGADO!


Olá vinopinheiro e bem vindo à Comunidade Autodesk!

 

Fico feliz por ter podido ajudar!

Henrique

EESignature

Marcas (1)
Mensagem 14 de 44
trevisan83
em resposta a: hmsilva

Boa tarde, 

 

Utilizo o CAD 2017 full, carreguei o comando conforme citado nas citações anteriores, porem ao chamar o comando compt ele solicita que selecione os itens, assim que clico uma a uma das polilineas que desejo medir, não tem nenhum resultado.

 

Alguém poderia ajudar?

Mensagem 15 de 44
hmsilva
em resposta a: trevisan83


trevisan83 escreveu:

Boa tarde, 

 

Utilizo o CAD 2017 full, carreguei o comando conforme citado nas citações anteriores, porem ao chamar o comando compt ele solicita que selecione os itens, assim que clico uma a uma das polilineas que desejo medir, não tem nenhum resultado.

 

Alguém poderia ajudar?


Olá trevisan83 e bem vindo à Comunidade Autodesk!

 

Não tenho AC2017 comigo, mas deveria funcionar como esperado...

 

Tenta carregar em F2 depois de correr o LISP.

Aparece o resultado?

 

Espero que ajude
Henrique

EESignature

Mensagem 16 de 44
asunao
em resposta a: FilRib

Bom dia Pessoal

 

Estou tentando pegar no setq o valor do length da lwp

 

Pelo list aparece

 Open
    Constant width    0.2000
              area   0.0000
            length   24.5582

 

 

Pelo entget aparece

((-1 . <Entity name: -26dd40>) (0 . "LWPOLYLINE") (330 . <Entity name:
-270308>) (5 . "850") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 .
"FIBRA_216") (100 . "AcDbPolyline") (90 . 2) (70 . 0) (43 . 0.2) (38 . 0.0) (39
. 0.0) (10 1865.69 214.407) (40 . 0.2) (41 . 0.2) (42 . 0.0) (10 1890.25
214.407) (40 . 0.2) (41 . 0.2) (42 . 0.0) (210 0.0 0.0 1.0))

 

Onde acho o valor de 24.5582 ??

 

Desde ja agradeco.

 

Sunao

Mensagem 17 de 44
hmsilva
em resposta a: asunao


asunao escreveu:

Bom dia Pessoal

 

Estou tentando pegar no setq o valor do length da lwp

 

Pelo list aparece

 Open
    Constant width    0.2000
              area   0.0000
            length   24.5582

 

 

Pelo entget aparece

((-1 . <Entity name: -26dd40>) (0 . "LWPOLYLINE") (330 . <Entity name:
-270308>) (5 . "850") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 .
"FIBRA_216") (100 . "AcDbPolyline") (90 . 2) (70 . 0) (43 . 0.2) (38 . 0.0) (39
. 0.0) (10 1865.69 214.407) (40 . 0.2) (41 . 0.2) (42 . 0.0) (10 1890.25
214.407) (40 . 0.2) (41 . 0.2) (42 . 0.0) (210 0.0 0.0 1.0))

 

Onde acho o valor de 24.5582 ??

 

Desde ja agradeco.

 

Sunao


Olá asunaoe bem vindo à Comunidade Autodesk!

 

Para sabermos o comprimento total de uma 'LWPOLYLINE' utilizando AUTOLISP, dá muito trabalho... :))

Teriamos que correr todos os DXF's 10 (os vertices) e encontrar a distancia entre os pontos e ter em atenção se são curvas e calcular o arco da curva.... e somar tudo...

 

Será mais fácil recorrer ao VisualLISP, transformando a entidade em VLA Object e vêr a Propriedade 'Length'...

Exemplo:

 

(vl-load-com)
(defun c:demo ( / sel vlaobj)
    (if (and (setq sel (car (entsel "\nSeleciona uma LwPolyline : ")))
             (setq VlaObj (vlax-ename->vla-object sel))
             (= (vla-get-ObjectName VlaObj) "AcDbPolyline")
        )
        (princ (strcat "\n O comprimento da LwPolyline é : " (rtos (vla-get-length VlaObj) 2 3)))
        (princ "\n A entidade selecionada não é uma LwPolyline ou nada foi celecionado.... ")
    )
    (princ)
)

 

Espero que ajude
Henrique

EESignature

Mensagem 18 de 44
asunao
em resposta a: hmsilva

Henrique boa tarde

 

Vc é monstro, resolveu meu problemas aqui.

 

Obrigado

 

Mensagem 19 de 44
hmsilva
em resposta a: asunao


asunao escreveu:

Henrique boa tarde

 

Vc é monstro, resolveu meu problemas aqui.

 

Obrigado

 


Sunao, fico feliz por ter podido ajudar!

Henrique

EESignature

Mensagem 20 de 44
2522746192
em resposta a: FilRib

Muito obrigado também.

 

Parabéns.

Não encontrou o que está procurando? Pergunte à comunidade ou compartilhe seu conhecimento.

Postar nos fóruns  

Autodesk Design & Make Report