AutoCAD - Português

AutoCAD - Português

Responder
Active Member
gesieloliveira
Envios: 9
Registrado: ‎10-01-2012
Mensagem 1 de 16 (383 Exibições)
Solução aceita

Lisp de subtração

383 Exibições, 15 Respostas
03-14-2014 11:34 AM
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

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

*Expert Elite*
hmsilva
Envios: 3.191
Registrado: ‎12-17-2004
Mensagem 2 de 16 (363 Exibições)

Re: Lisp de subtração

03-16-2014 08:56 AM 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

*Expert Elite*
hmsilva
Envios: 3.191
Registrado: ‎12-17-2004
Mensagem 3 de 16 (357 Exibições)

Re: Lisp de subtração

[ Editado ]
03-16-2014 09:38 AM 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

Active Member
gesieloliveira
Envios: 9
Registrado: ‎10-01-2012
Mensagem 4 de 16 (343 Exibições)

Re: Lisp de subtração

03-17-2014 06:12 AM 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)
Active Member
gesieloliveira
Envios: 9
Registrado: ‎10-01-2012
Mensagem 5 de 16 (342 Exibições)

Re: Lisp de subtração

03-17-2014 06:15 AM 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)
*Expert Elite*
hmsilva
Envios: 3.191
Registrado: ‎12-17-2004
Mensagem 6 de 16 (333 Exibições)

Re: Lisp de subtração

03-17-2014 08:08 AM 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

Active Member
gesieloliveira
Envios: 9
Registrado: ‎10-01-2012
Mensagem 7 de 16 (329 Exibições)

Re: Lisp de subtração

03-17-2014 09:00 AM em resposta a: hmsilva
Agora funcionou perfeitamente! Muito obrigado!
*Expert Elite*
hmsilva
Envios: 3.191
Registrado: ‎12-17-2004
Mensagem 8 de 16 (324 Exibições)

Re: Lisp de subtração

03-17-2014 09:22 AM em resposta a: gesieloliveira
Fico feliz por ter podido ajudar, gesieloliveira.
Henrique
New Member
jedersonlobo
Envios: 2
Registrado: ‎08-29-2014
Mensagem 9 de 16 (71 Exibições)

Re: Lisp de subtração

08-29-2014 06:13 AM 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.

*Expert Elite*
hmsilva
Envios: 3.191
Registrado: ‎12-17-2004
Mensagem 10 de 16 (68 Exibições)

Re: Lisp de subtração

08-29-2014 06:20 AM 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

 

 

Post to the Community

Have questions about Autodesk products? Ask the community.

New Post
Comunicados
Are You Going To Be @ AU 2014? Feel free to drop by our AU topic post and share your plans, plug a class that you're teaching, or simply check out who else from the community might be in attendance. Ohh and don't forgot to stop by the Autodesk Help | Learn | Collaborate booths in the Exhibit Hall and meet our community team if you get a chance!