ToString

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

4 comentários:

  1. Na realidade não é comentário, mais uma dúvida.

    o "v" é a variavel que eu preciso tranformar?

    ResponderExcluir
  2. acho que sim, não entendi direito a sua dúvida....

    digamos 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)

    ResponderExcluir
  3. funcionou legal, porém quando eu capturo o dxf de um line por ex.
    o 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?

    ResponderExcluir
  4. cara, se vc quer mesmo isso, basta alterar esta linha:
    ((= 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

    ResponderExcluir