Somar comprimento de várias linhas - Autocad 2015

Somar comprimento de várias linhas - Autocad 2015

Anonymous
Não aplicável
86.526Exibições
43Respostas
Mensagem 1 de 44

Somar comprimento de várias linhas - Autocad 2015

Anonymous
Não aplicável

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

Soluções aceitas (1)
86.527Exibições
43Respostas
Respostas (43)
Mensagem 2 de 44

hmsilva
Mentor
Mentor
Solução aceita

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

Anonymous
Não aplicável

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

 

Cumps

Mensagem 4 de 44

hmsilva
Mentor
Mentor
É um prazer poder ajudar!

Henrique

EESignature

Mensagem 5 de 44

Anonymous
Não aplicável

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?

0 Curtidas
Mensagem 6 de 44

hmsilva
Mentor
Mentor

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

0 Curtidas
Mensagem 7 de 44

hmsilva
Mentor
Mentor

 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

0 Curtidas
Mensagem 8 de 44

Anonymous
Não aplicável

Bom dia.

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

0 Curtidas
Mensagem 9 de 44

hmsilva
Mentor
Mentor

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

0 Curtidas
Mensagem 10 de 44

Anonymous
Não aplicável

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?

0 Curtidas
Mensagem 11 de 44

hmsilva
Mentor
Mentor

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

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

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

0 Curtidas
Mensagem 14 de 44

Anonymous
Não aplicável

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?

0 Curtidas
Mensagem 15 de 44

hmsilva
Mentor
Mentor

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

0 Curtidas
Mensagem 16 de 44

Anonymous
Não aplicável

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

0 Curtidas
Mensagem 17 de 44

hmsilva
Mentor
Mentor

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

0 Curtidas
Mensagem 18 de 44

Anonymous
Não aplicável

Henrique boa tarde

 

Vc é monstro, resolveu meu problemas aqui.

 

Obrigado

 

Mensagem 19 de 44

hmsilva
Mentor
Mentor

asunao escreveu:

Henrique boa tarde

 

Vc é monstro, resolveu meu problemas aqui.

 

Obrigado

 


Sunao, fico feliz por ter podido ajudar!

Henrique

EESignature

0 Curtidas
Mensagem 20 de 44

Anonymous
Não aplicável

Muito obrigado também.

 

Parabéns.

0 Curtidas