Uma função complementar a "vl-princ-to-string", "itoa", "rtos":
(defun tostring (v / tp spc tmp)
(SETQ tp (type v))
(cond ((= tp 'STR) (strcat "\"" v "\""))
((= tp 'REAL) (rtos v 2 16))
((= tp 'INT) (itoa v))
((null v) "nil")
((listp v)
(setq spc "")
(setq tmp "")
(foreach x v
(setq tmp
(strcat tmp
spc
(if (listp x)
(if (listp (cdr x))
(tostring x)
(strcat "("
(tostring (car x))
" . "
(tostring (cdr x))
")"))
(strcat (tostring x))))
spc " "))
(strcat "(" tmp ")"))
(t (vl-princ-to-string v))))
Uso: (tostring qualquer_coisa)
isso irá transformar qualquer coisa que seja passado a ela em string, num formato que possa ser usado pela função "write-line", preservando a forma como aparece a no vlide
pode ser qualquer coisa, lista, numero, texto...
Na realidade não é comentário, mais uma dúvida.
ResponderExcluiro "v" é a variavel que eu preciso tranformar?
acho que sim, não entendi direito a sua dúvida....
ResponderExcluirdigamos qe vc tenha:
(setq lst '(1 2 "a 4 bb"))
vc faz:
(setq str (tostring lst))
e obtem:
"(1 2 \"a 4 bb\")"
que poderá ser escrito para um arquivo com o write-line:
(setq file (open "c:/teste.txt" "w"))
(write-line str file)
(close file)
funcionou legal, porém quando eu capturo o dxf de um line por ex.
ResponderExcluiro ponto inicial está assim
(10 20.8 11.9 0.0)
e eu desejava que ficasse com 3 casas decimais, o que eu tenho que alterar?
cara, se vc quer mesmo isso, basta alterar esta linha:
ResponderExcluir((= tp 'REAL) (rtos v 2 16))
para
((= tp 'REAL) (rtos v 2 3))
isso irá arredondar para três casas decimais, mas tenha em mente que o ponto não será mais tão preciso, ok?
usei 16 pois é o máximo que é suportado na precisão
se bem que em muitos casos é uma preciosidade desnecessária