Как преобразовать список в строку
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как преобразовать список в строку

Как преобразовать список в строку

Ответ
Поиск в этой теме
Непрочитано 08.12.2005, 11:29 #1
Как преобразовать список в строку
ivspec
 
Регистрация: 08.12.2005
Сообщений: 17

Народ подскажите как преобразовать список в строку.
Или как записать список в файл. При записи в файл у меня пишет ошибку.
Просмотров: 7520
 
Непрочитано 08.12.2005, 11:53
#2
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 627


Привет!

А печатать список поэлементно в файл не пробовал?
Что-то вроде того:

(foreach p твой_список
(princ p f)(princ " " f)
)

f - дескриптор открытого на запись файла,
"пробел" - разделитель элементов списка.
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 08.12.2005, 11:58
#3
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431


ну вот универсальная функция преобразования почти чего угодно в строку
Код:
[Выделить все]
;|=============================================================================
*    конвертация значения в строку. Для VLA-объектов возвращается nil.
*    Точечные списки не обрабатываются.
=============================================================================|;
(defun _kpblc-conv-value-to-string (value / item result)
  (cond
    ((= (type value) 'str) value)
    ((= (type value) 'int) (itoa value))
    ((= (type value) 'real) (rtos value 2 16))
    ((= (type value) 'list)
     (progn
       (setq result "")
       (foreach	item value
	 (setq result (strcat result (_kpblc-conv-value-to-string item) " "))
	 ) ;_ end of foreach
       (setq result (strcat "(" (vl-string-trim " " result) ")"))
       result
       ) ;_ end of progn
     )
    ((= (type value) 'sym)
     (vl-symbol-value 'value)
     )
    (t "")
    ) ;_ end of cond
  ) ;_ end of defun
После передачи списка, например, такого (1 2 3), вернет "(1 2 3)".
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 08.12.2005, 13:20 Спасибо
#4
ivspec


 
Регистрация: 08.12.2005
Сообщений: 17
<phrase 1=


Спасибо мужики ща попробую

А то чтото я даже недогодался
ivspec вне форума  
 
Непрочитано 08.12.2005, 13:23
1 | #5
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,291


Вот вариант попроще:
Код:
[Выделить все]
(defun LtoT (l1 div1 / t1 v1)
(if (not div1)(setq div1 " "))
(if (> (length l1) 1)
   (progn (setq t1 (car l1))
        (foreach v1 (cdr l1)
            (setq t1 (strcat t1 div1 v1))
        );end foreach
   );end progn
   (car l1)
);end if
);end LtoT
Где:
l1 - список, каждый элемент которого - строка
div1 - символ-разделитель

Если div1="" - то результирующий список соберется в строку без пробелов.
Если div1=" " или div1=nil (по-умолчанию) - то через пробелы.
Если div1="-" - то через дефис.
Если div1="abcd" - то через "abcd".
Ну и т.д.

Сама функция возвращает строку.
Pilot вне форума  
 
Непрочитано 08.12.2005, 13:51
#6
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


А почему не так:
Код:
[Выделить все]
Command: (vl-princ-to-string '(1 (2 3) (4 (5 6 7 "A")))) "(1 (2 3) (4 (5 6 7 A)))"
или так:
Код:
[Выделить все]
Command: (vl-prin1-to-string '(1 (2 3) (4 (5 6 7 "A")))) "(1 (2 3) (4 (5 6 7 \"A\")))"
:?:
Александр Ривилис вне форума  
 
Непрочитано 08.12.2005, 13:58
#7
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431


> Александр Ривилис : Ну просто эта функция у меня практически библиотечная - вместо того чтобы вызывать itoa rtos и прочая, я использую всего одну. А так пошел ну от незнания, наверное. Я ж все-таки не профи Вашего уровня Теперь переделаю. Спасибо.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 08.12.2005, 14:29
#8
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,291


2 Александр Ривилис

Я - по похожей причине, что и kpblc - своя библиотека.
Вдобавок я в современном алиспе подотстал, vl- и vla- функции до сих пор не изучил. Потому ими почти не пользуюсь.
Pilot вне форума  
 
Автор темы   Непрочитано 08.12.2005, 15:45 Так и неполучается
#9
ivspec


 
Регистрация: 08.12.2005
Сообщений: 17
<phrase 1=


Короче тема такая. Я получаю характеристики примитива при помощи функции entget (возвращается примерно такая штука):

((-1 . <Entity name: 7ef62a18>) (0 . "CIRCLE") (330 . <Entity name: 7ef5ccf8>)
(5 . "3313") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "стена") (100 .
"AcDbCircle") (10 67548.3 44861.5 0.0) (40 . 350.0) (210 0.0 0.0 1.0)) ((-1 .
<Entity name: 7ef62a18>) (0 . "CIRCLE") (330 . <Entity name: 7ef5ccf8>) (5 .
"3313") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "ñòåíà") (100 .
"AcDbCircle") (10 67548.3 44861.5 0.0) (40 . 350.0) (210 0.0 0.0 1.0))

Длаее я выбираю допустим название объекта функцией assoc
(setq obj (assoc 0 entobj))

Затем мне нужно преобразовать в строку и записать файл
ну пусть будет так
(setq e (vl-princ-to-string obj))

Все нормально. Записали в файл а когда хочу создать набор с помощью функции ssget и прописываю фильтр которая нахоится в переменной e то вылезает ошибка т.к. это не список
Пробую так
(setq o (list e))


весь код:
(defun c:con()

(setq lst1 nil)
(setq res "")

(setq obj (nth 0 (entsel "Выбор объекта: "))) //выбираем объект и получаем его имя
(setq entobj (entget obj)) //получаем список характеристик объекта
(setq lst1 (vl-princ-to-string (assoc 0 entobj)) //записываем список в переменную lst1 как текст

;;сдесь я будем считать записал занчение переменной lst1 в файл
;;в нужный момент я в переменную lst1 записал значение из файла
(setq lst1 (list lst1))

(ssget "_X" lst1) //сдесь возникает ошибка
(print)
)

Подскажите в чем дело?
ivspec вне форума  
 
Непрочитано 08.12.2005, 15:59
#10
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Код:
[Выделить все]
(defun c:con() 

(setq lst1 nil) 
(setq res "") 

(setq obj (car (entsel "Выбор объекта: "))) ;;выбираем объект и получаем его имя 
(setq entobj (entget obj)) ;;получаем список характеристик объекта 
(setq lst1 (vl-prin1-to-string (assoc 0 entobj)) ;;записываем список в переменную lst1 как текст 

;;сдесь я будем считать записал занчение переменной lst1 в файл 
;;в нужный момент я в переменную lst1 записал значение из файла 
(setq lst1 (list (read lst1)))

(ssget "_X" lst1) ;; Ошибки не должно быть! 
(print) 
)
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 08.12.2005, 16:01
#11
ivspec


 
Регистрация: 08.12.2005
Сообщений: 17
<phrase 1=


Цитата:
Сообщение от Александр Ривилис
Код:
[Выделить все]
(defun c:con() 

(setq lst1 nil) 
(setq res "") 

(setq obj (car (entsel "Выбор объекта: "))) ;;выбираем объект и получаем его имя 
(setq entobj (entget obj)) ;;получаем список характеристик объекта 
(setq lst1 (vl-[b]prin1[/b]-to-string (assoc 0 entobj)) ;;записываем список в переменную lst1 как текст 

;;сдесь я будем считать записал занчение переменной lst1 в файл 
;;в нужный момент я в переменную lst1 записал значение из файла 
[b](setq lst1 (list (read lst1)) [/b]

(ssget "_X" lst1) ;; Ошибки не должно быть! 
(print) 
)
А возникемет всеже . В чем дело?
ivspec вне форума  
 
Непрочитано 18.03.2015, 10:18
#12
tujn08


 
Регистрация: 26.12.2013
Сообщений: 283


Почти такая же проблема была- решил.

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

И такой вопрос:
1) (vlax-ename->vla-object pl) обратно преобразовывать надо?- у меня выдает ошибку почему-то
2) обнулил переменные правильно?- у меня сомнения почему-то.
Код:
[Выделить все]
 (defun	c:dlina (/)	
(textscr)
(vl-load-com)
	 (setq 	pl (car(entsel "Выберите объект")))
;(setq 	pl (entnext pl)) ;(car(entsel "Выберите объект"))

  (if (and (equal (cdr(assoc '0  (entget pl))) "LWPOLYLINE" ) ; сразу два условия (первое)
           (equal (cdr(assoc '8 (entget pl))) "pro" )) ; сразу два условия (второе)
	  (progn ; выполнит в случае успеха
		;(princ "в слое и  полилиния")(princ pl)(princ "       ")(terpri)
		(setq d_pl (vlax-curve-getDistAtParam (vlax-ename->vla-object pl) (vlax-curve-getEndParam pl)))
		(setq p2 (rtos d_pl))
		(type p2)
		;(setq p3 (list(cdr(assoc '-1  (entget pl)))))
		(setq p3 (vl-prin1-to-string (cdr(assoc '-1  (entget pl)))));(assoc -1 p1)))
		(setq p3 (strcat "Длина выбранной полилинии:   " p2 "\nИмя:   " p3 ))
		(alert p3)
		;(setq d_pl ())
		;(setq d_pl (vlax-vla-object->ename pl))
		;(setq pl d_pl)
		(setq pl () p2 () p3 () d_pl ())
	  )
	  (progn ; выполнит в случае провала
		(alert "Не выполняется условие AND")
		;(princ "не выполняется условие AND \n")(princ pl);(princ "       ")(terpri)
	  ) 
   )
)

Последний раз редактировалось tujn08, 18.03.2015 в 10:24.
tujn08 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как преобразовать список в строку

Реклама i
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск