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: 

Lisp de subtração

15 RESPOSTAS 15
SOLUCIONADO
Responder
Mensagem 1 de 16
gesieloliveira
2277 Exibições, 15 Respostas

Lisp de subtração

Alguém tem alguma lisp de subtração de textos? Ou seja, eu tenho um certo valor numérico em um texto e quero subtrair o valor numérico de outro e depois imprimir o resultado num 3º texto. Já tenho um que soma, porém não consegui alterá-lo para subtrair. Obrigado
Marcas (1)
15 RESPOSTAS 15
Mensagem 2 de 16
hmsilva
em resposta a: gesieloliveira

Olá gesiel,

 

se postares o código que tens é mais fácil alterar...

Não sei se queres colocar o resultado num texto novo, ou editar um existente.

 

Henrique

EESignature

Mensagem 3 de 16
hmsilva
em resposta a: gesieloliveira

Gesiel,

 

um código rápido, sem grandes testes, se otexto selecionado não for um texto válido para uma operação de subtração, vai errar...

 

(defun c:- ( / PT TXT1 TXT2 TXTVAL1 TXTVAL2 TXTVAL3)
  (if (and (setq txt1 (car (entsel "\nSelecione o primeiro texto: ")))
	   (setq txt2 (car (entsel "\nSelecione o segundo texto: ")))
	   (setq pt (getpoint "\nPique o ponto a colocar o texto con o resultado: "))
	   );; and
    (progn
      (setq txtval1 (atof (cdr (assoc 1 (entget txt1)))))
      (setq txtval2 (atof (cdr (assoc 1 (entget txt2)))))
      (setq txtval3 (- txtval1 txtval2))
      (entmake
	(list
	  (cons 0 "TEXT")
	  (cons 100 "AcDbText")
	  (cons 10 (trans pt 1 0))
	  (cons 40 (getvar 'TEXTSIZE))
	  (cons 1 (rtos txtval3 2 2))
	  (cons 50 (angle (list 0 0)(getvar "ucsxdir")))
	  (cons 100 "AcDbText")
	)
      );; entmake
      );; progn
    );; if
  (princ)
  )

 

Espero que ajude

Henrique

EESignature

Mensagem 4 de 16
gesieloliveira
em resposta a: hmsilva

Olá hmsilva, antes de tudo obrigado pelo post! Na realidade eu preciso que o resultado seja colocado em um texto existente e com a mesma quantidade de casas decimais do texto a qual estamos subtraindo. EX: 5.813 - 2.813 = 3.000 Também estou enviando a lisp a qual eu uso para somar: (defun c:QST ( / AR_TOTAL OBJS GR QUANT TEXTO VALOR a ht n i b1 b c d b2 ) (setvar "luprec" 2) (setq AR_TOTAL 0) (princ "\nSelecione os textos com os valores a serem somados...") (setq OBJS (ssget '((0 . "TEXT")))) (if (/= OBJS nil) (progn (princ "\nAguarde...") (setq gr (ssadd)) (setq QUANT (sslength OBJS)) (setq POSICAO 0 valor 0.0) (repeat QUANT (setq TEXTO (cdr (assoc 1 (entget (ssname OBJS POSICAO))))) (setq VALOR (+ VALOR (atof TEXTO))) (setq POSICAO (+ POSICAO 1)) );fecha progn (princ (strcat "\nSoma dos valores : " (rtos VALOR 2))) (prompt "\nA SELECCIONE O VALOR DE SOMA A SER ACTUALIZADO") (setvar "cmdecho" 0) (setq a (ssget)) (setq ht (rtos VALOR 2)) (setq n (sslength a)) (setq i 0) (repeat n (setq b1 (entget (ssname a i))) (setq i (1+ i)) (setq c (assoc 1 b1)) (setq d (cons (car c) ht)) (setq b2 (subst d c b1)) (entmod b2) (PRINC) );fecha defun ) (princ "\nNenhum texto foi selecionado !") ) (princ) ) (princ)
Mensagem 5 de 16
gesieloliveira
em resposta a: hmsilva

""Estou postando a mesma mensagem, porém numa melhor formatação"" Olá hmsilva, antes de tudo obrigado pelo post! Na realidade eu preciso que o resultado seja colocado em um texto existente e com a mesma quantidade de casas decimais do texto a qual estamos subtraindo. EX: 5.813 - 2.813 = 3.000 Também estou enviando a lisp a qual eu uso para somar: (defun c:QST ( / AR_TOTAL OBJS GR QUANT TEXTO VALOR a ht n i b1 b c d b2 ) (setvar "luprec" 2) (setq AR_TOTAL 0) (princ "\nSelecione os textos com os valores a serem somados...") (setq OBJS (ssget '((0 . "TEXT")))) (if (/= OBJS nil) (progn (princ "\nAguarde...") (setq gr (ssadd)) (setq QUANT (sslength OBJS)) (setq POSICAO 0 valor 0.0) (repeat QUANT (setq TEXTO (cdr (assoc 1 (entget (ssname OBJS POSICAO))))) (setq VALOR (+ VALOR (atof TEXTO))) (setq POSICAO (+ POSICAO 1)) );fecha progn (princ (strcat "\nSoma dos valores : " (rtos VALOR 2))) (prompt "\nA SELECCIONE O VALOR DE SOMA A SER ACTUALIZADO") (setvar "cmdecho" 0) (setq a (ssget)) (setq ht (rtos VALOR 2)) (setq n (sslength a)) (setq i 0) (repeat n (setq b1 (entget (ssname a i))) (setq i (1+ i)) (setq c (assoc 1 b1)) (setq d (cons (car c) ht)) (setq b2 (subst d c b1)) (entmod b2) (PRINC) );fecha defun ) (princ "\nNenhum texto foi selecionado !") ) (princ) ) (princ)
Mensagem 6 de 16
hmsilva
em resposta a: gesieloliveira

Uma modificação rápida...

(defun c:test (/      A	     ADI    AR_TOTAL	  B1	 B2	C      D
	       HT     I	     N	    OBJS   OLDECHO	 POSICAO       QUANT
	       SS     TEXTO  VALOR
	      )
  (if (and (not (prompt "\nSelecione o texto Aditivo: "))
	   (setq ss (ssget "_+.:E:S" '((0 . "TEXT"))))
	   (not (prompt "\nSelecione os textos Subtrativos: "))
	   (setq OBJS (ssget '((0 . "TEXT"))))
      );; and
    (progn
      (princ "\nAguarde...")
      (setvar "luprec" 2)
      (setq AR_TOTAL 0.
	    adi	     (entget (ssname ss 0))
	    valor    (atof (cdr (assoc 1 adi)))
	    QUANT    (sslength OBJS)
	    POSICAO  0
      );; setq
      (repeat QUANT
	(setq TEXTO   (cdr (assoc 1 (entget (ssname OBJS POSICAO))))
	      VALOR   (- VALOR (atof TEXTO))
	      POSICAO (+ POSICAO 1)
	);; setq
      );; repeat
      (princ (strcat "\nSubtração dos valores : " (rtos VALOR 2)))
      (prompt "\nSELECCIONE O VALOR DA SUBTRAÇÃO A SER ACTUALIZADO: ")
      (if (setq a (ssget))
	(progn
	  (setq oldecho (getvar 'CMDECHO))
	  (setvar "cmdecho" 0)
	  (setq	ht (rtos VALOR 2)
		n  (sslength a)
		i  0
	  );; setq
	  (repeat n
	    (setq b1 (entget (ssname a i))
		  i  (1+ i)
		  c  (assoc 1 b1)
		  d  (cons (car c) ht)
		  b2 (subst d c b1)
	    );; setq
	    (entmod b2)
	  );; repeat
	  (setvar "cmdecho" oldecho)
	);; progn
	(prompt "\nNão foi selecionado texto para actualizar o valor! ")
      );; if
    );; progn
    (princ "\nNenhum texto foi selecionado! ")
  );; if
  (princ)
);; defun

 

É apenas uma ajuda, o código tinha que ser escrito de principio para cobrir todos os possiveis erros, mas não tenho muito tempo livre...

 

Henrique

EESignature

Mensagem 7 de 16
gesieloliveira
em resposta a: hmsilva

Agora funcionou perfeitamente! Muito obrigado!
Mensagem 8 de 16
hmsilva
em resposta a: gesieloliveira

Fico feliz por ter podido ajudar, gesieloliveira.
Henrique

EESignature

Mensagem 9 de 16
jedersonlobo
em resposta a: hmsilva

Bom dia, estava procurando uma lisp justamente como essa, e ela me atendeu muito bem.
Gostaria de saber se é possível fazer uma modificação para permitir o resutado ter 3 casas decimais depois da vírgula.
Pois estou calculando cotas, e o resultado sai arredondado.
Parabéns pela lisp e obrigado.

Mensagem 10 de 16
hmsilva
em resposta a: jedersonlobo

Olá Jederson, e bem vindo à Comunidade Autodesk!

 

O código respeita o numero de casas decimais definidos em 'UNITS'.

 

Para teres três casas decimais, muda

(rtos VALOR 2)

para

(rtos VALOR 2 3)

 

se for o código que postei primeiro, muda

(cons 1 (rtos txtval3 2 2))

para

(cons 1 (rtos txtval3 2 3))

 

espero que ajude

Henrique

 

 

EESignature

Mensagem 11 de 16
jedersonlobo
em resposta a: hmsilva

Bom dia Henrique.

Corrigi o código com (rtos VALOR 2 3), e funcionou perfeitamente!

Enquanto eu postei a dúvida aqui, fui tentar procurar em outros lugares, e vi que a alteração do código
(setvar "luprec" 2)
para
(setvar "luprec" 3)
também faz o texto resultante ter 3 casas decimais após a virgula.

Existe alguma diferença ou ambas as alterações são válidas?

Agradeço a recepção e a presteza para responder!
Mensagem 12 de 16
hmsilva
em resposta a: jedersonlobo


jedersonlobo escreveu:
Bom dia Henrique.

Corrigi o código com (rtos VALOR 2 3), e funcionou perfeitamente!

Enquanto eu postei a dúvida aqui, fui tentar procurar em outros lugares, e vi que a alteração do código
(setvar "luprec" 2)
para
(setvar "luprec" 3)
também faz o texto resultante ter 3 casas decimais após a virgula.

Existe alguma diferença ou ambas as alterações são válidas?

Agradeço a recepção e a presteza para responder!

'LUPREC' é a variavel de sistema que define o numero de casas decimais para a distancia, volume e área.

 

Se escreveres na linha de comando UNITS, vai abrir um quadro com a configuração da unidades, o numero de casas decimais é a 'LUPREC'....

 

Como tinha anteriormente dito, com (rtos VALOR 2),  não estamos a expecificar o numero de casas decimais, portanto vai usar as que estiverem definidas no commando units (em luprec), mas com (rtos VALOR 2 3),  está a definir o resultado com três casas decimais...

 

Henrique

 

EESignature

Mensagem 13 de 16
alexlibrelon
em resposta a: hmsilva

Tem esta:

 

Simples e coloca o resultado entre parênteses e outra, onde você clicar, o resultado é inserido.

 

(defun c:sb ( / Txt1 Txt2 Txt3 Pkt1 )
(setq Txt1 (entsel "Selecione o primeiro valor : " ) )
(setq Txt2 (entsel "Selecione o segundo : " ) )
(setq Txt3
(strcat
"("
(rtos (- (atof (cdr (assoc 1 (entget (car Txt1 ))))) (atof (cdr (assoc 1 (entget (car Txt2 ))))) ) 2 2 )
")"
)
)
(setq Pkt1 (getpoint "Clique no ponto para inserir o resultado: ") )
(command "._text" Pkt1 "" "" Txt3 "" ) 
(princ)
)

 

Att,

Alex Librelon
www.digitalcursos.net
www.alexlibrelon.blogspot.com
www.youtube.com/alexlibrelon


--

Att,

Alex Librelon
www.digitalcursos.net
http://alexlibrelon.blogspot.com/
http://www.youtube.com/alexlibrelon
Mensagem 14 de 16
hmsilva
em resposta a: alexlibrelon


alexlibrelon escreveu:

Tem esta:

 

Simples e coloca o resultado entre parênteses e outra, onde você clicar, o resultado é inserido.

  


Olá Alex, e obrigado por partlhares o teu código conosco!

 

Espero que não te importes que faça algumas sugestões em relação ao código, aqui vão...

 

Em relação ao 'Simples', eu concordo, mas por vezes os codigos não podem ser tão simples como nós pretendiamos.

 

Convem garantir a seleção da entidade correta (TEXTm MTEXT), caso contrario vai dar um erro como:


Command: sb Selecione o primeiro valor : Selecione o segundo : ; error: bad
argument type: stringp nil

 

Quando corres o teu código, recebes um 'echo' na linha de comandos
Command: SB Unknown command "SB".  Press F1 for help.


A causa disso é um 'enter' a mais em
(command "._text" Pkt1 "" "" Txt3 "" )
se utilizares
(command "._text" Pkt1 "" "" Txt3)
o 'echo' desaparece.

 

Ao utilizar o comando 'text' na rotina, e se o 'Current Text Style' tiver altura definida no 'Style' o comando vai dar um erro como:

 

Command: sb
Selecione o primeiro valor : Selecione o segundo : Clique no ponto para inserir
o resultado: ._text
Current text style:  "style1"  Text height:  2.5000  Annotative:  No
Specify start point of text or [Justify/Style]:
Specify rotation angle of text <0>:
Enter text:
Command: (82) LISP command is not available.

 

Para não acontecer isto, substitui
(command "._text" Pkt1 "" "" Txt3)
por
(if (zerop (cdr (assoc 40 (tblsearch "STYLE" (getvar "TEXTSTYLE")))))
  (command "_.text" Pkt1 "" "" Txt3)
  (command "_text" Pkt1 "" Txt3)
  )

 

Mas eu perfiro utilizar a função 'entmake' na criação do texto.


O que eu sugiro não é assim tão 'Simples', mas é algo assim:

(defun c:sb (/ pt s s1)
  (if (and (princ "\nSelecione o primeiro valor : ")
           (setq s (ssget "_+.:E:S" '((0 . "TEXT,MTEXT") (1 . "#*"))))
           (princ "\nSelecione o segundo : ")
           (setq s1 (ssget "_+.:E:S" '((0 . "TEXT,MTEXT") (1 . "#*"))))
           (setq pt (getpoint "Clique no ponto para inserir o resultado: "))
      );; and
    (entmake
      (list
        (cons 0 "TEXT")
        (cons 100 "AcDbText")
        (cons 10 (trans pt 1 0))
        (cons 40 (getvar 'TEXTSIZE))
        (cons 1
              (strcat "("
                      (rtos (- (atof (cdr (assoc 1 (entget (ssname s 0)))))
                               (atof (cdr (assoc 1 (entget (ssname s1 0)))))
                            )
                            2
                            2
                      )
                      ")"
              )
        )
        (cons 50 (angle (list 0 0) (getvar "ucsxdir")))
      )
    );; entmake
  );; if
  (princ)
)

 

Espero que ajude

Henrique

EESignature

Mensagem 15 de 16
alexlibrelon
em resposta a: hmsilva

Henrique (hmsilva) e demais colegas, bom dia.

 

Sempre vejo seus posts e você não apenas responde o que os colegas precisam mas ensina com detalhes o que está ajudando.

 

Muito obrigado pela explicação e dicas sobre a rotina e por nos ensinar algo bacana a cada post. Isso enriquece e muito nosso forum.

 

Grande abraço.

 

 


--

Att,

Alex Librelon
www.digitalcursos.net
http://alexlibrelon.blogspot.com/
http://www.youtube.com/alexlibrelon
Mensagem 16 de 16
hmsilva
em resposta a: alexlibrelon

Alex,

muito obrigado pelas simpaticas palavras!

 

É com prazer que tento ajudar.

 

Abraço

Henrique

EESignature

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

Postar nos fóruns  

Autodesk Design & Make Report