Манипуляции со списками Autolisp

Я борюсь с Autolisp и не могу найти ответ, который ищу.

У меня есть пустой список, и я заполняю его координатами точек, которые я превратил в строки. Список, который создается, выглядит примерно так:

(12.5484,7.6054,0.0000 17.0626,8.1782,0.0000 17.5642,10.7199,0.0000 12.0110,11.4716,0.0000)

Есть ли способ сделать заполнение списка вертикальным и получить что-то вроде:

(12.5484,7.6054,0.0000
17.0626,8.1782,0.0000
17.5642,10.7199,0.0000
12.0110,11.4716,0.0000)

Код, который я использую:

(setq lst()) ;create empty list named lst

    (while
        (setq a (getpoint "\nTick the Point")) ;select points

        (setq x (rtos(car a))) ;get as X the x of a point (as string)
        (setq y (rtos(cadr a))) ;get as Y the y of a point (as string)
        (setq z (rtos(caddr a))) ;get as Z the z of a point (as string)
        (setq pnt (strcat x "," y ","z))

        (setq lst (cons pnt lst)) ;start filling the empty list with the coordinates of the points


    )

person Tony    schedule 06.05.2014    source источник
comment
Список не имеет направления, ни горизонтального, ни вертикального.   -  person ceving    schedule 06.05.2014
comment
Я думаю, что я использую список неправильно. Я мог бы просто записать строку pnt в текстовый файл, может быть ??? Я могу признать, что я запутался. Если вы можете помочь с этим...   -  person Tony    schedule 06.05.2014
comment
Ваш вопрос касается конкретного решения, но вы не сообщаете нам, в чем проблема и почему вы считаете это правильным решением. Пожалуйста, начните свой вопрос с описания основной проблемы, которую вы пытаетесь решить. Я подозреваю, что решение не будет иметь ничего общего с форматированием списка.   -  person Owen Wengerd    schedule 14.05.2014


Ответы (2)


Я думаю, что проблема, с которой вы столкнулись, связана только с печатью значений, которые вы сохранили в списке. Сохраняемые значения абсолютно прекрасны.

Поэтому я думаю, что вы должны просто добавить эти строки в свой существующий код (если вы хотите получить вывод, как показано выше):

  1. Для записи в текстовый файл:

    (prompt "\n* Text file written to directory of current drawing *")(terpri)
    (setq fname(getstring "\n Enter a valid file name: "))  
    
    ;if the user doesn't provide a filename, use the drawing name
    (if (= fname "")        
        (setq fname (substr (getvar "dwgname") 1 (- (strlen (getvar "dwgname")) 4)))
    )
    ;open the file
    (setq txt (open (strcat (getvar "dwgprefix") fname ".txt") "w"))
    
    ;loop to write data to the file
    (foreach item lst
        (write-line item txt)
    )
    
    ;close the file
    (close txt) 
    (princ (strcat "\n* Text file " (getvar "dwgprefix") fname " has been created *\n"))
    
  2. Чтобы напечатать в командной строке (с начальными и конечными скобками, по запросу):

    (setq counter 0)
    (princ "\n(")
    (while (> (length lst)  (+ counter 1))
        (progn
            (princ (strcat (nth counter lst) "\n"))     
            (setq counter (1+ counter))
        )
    )
    (princ (strcat (last lst) ")"))
    (princ)
    
  3. Для печати в командной строке (без скобок):

    (terpri)
    (foreach item lst 
        (progn
            (princ item)
            (terpri)
        )
    )
    (princ)
    

Дайте мне знать, если вы столкнетесь с какой-либо другой проблемой. Кстати: я тоже новичок :)

person Govinda    schedule 02.09.2014

(setq ptlist '())
(mapcar '(lambda (pt) 
        (strcat (rtos (car pt)) "," (rtos (cadr pt)) "," (rtos (caddr pt))))
        (reverse (while (setq pttemp(getpoint "Your point:"))
           (if pttemp (cons pttemp ptlist))
        ))
)

Выражение mapcar вернет вам список строк, преобразованных из точек. Если вам нужно преобразовать этот список в строку, используйте функцию (apply 'strcat (list-of-string))

person P.Buzko    schedule 05.12.2017