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

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

как обработать список из нескольких уровней

Ответ
Поиск в этой теме
Непрочитано 13.11.2011, 14:24 #1
как обработать список из нескольких уровней
mamuk
 
Сургут
Регистрация: 06.05.2010
Сообщений: 248

Доброго вечера всем! помогите разобраться с обработкой списка!
по порядку
1. создаю набор из полилиний
Код:
[Выделить все]
 (setq set_*POLYLINE (ssget "_X" (list  (cons 8 "Рельеф суши Л" )  (cons 0 "*POLYLINE"))))
2. Форимирую список
Код:
[Выделить все]
 (setq a_*POLYLINE -1)
(repeat (sslength set_*POLYLINE)
		  (setq a_*POLYLINE (1+ a_*POLYLINE))
		  (setq name_*POLYLINE  (ssname set_*POLYLINE a_*POLYLINE))
		  (setq list_coord_*POLYLINE (append list_coord_*POLYLINE (list (vl-remove-if-not '(lambda(x)(=(car x) 10))(entget name_*POLYLINE)))))
		  )
на выходе должен получится список групп списков по каждой полилинии (((10 294.69 183.127) (10 314.695 171.104)) ((10 300.428 188.302) (10 320.434 176.28)))
Далее хочу обработать список таким образом чтоб
по каждой полилинии в текством файле была создана запись ввиде
Pline 7
3551984.84 968727.36
3551998.69 968730.07
3552005.1 968723.92
3552017.35 968721.88
3552025.85 968733.46
3552008.43 968744.92
3552012.55 968749.41
Pen (14,2,11556864)
Pline 7
3551984.84 968727.36
3551998.69 968730.07
3552005.1 968723.92
3552017.35 968721.88
3552025.85 968733.46
3552008.43 968744.92
3552012.55 968749.41
Pen (14,2,11556864)
Честно непонимаю как это сделать. пробовал через foreach не получается. Просто ни как не соображу помогите пожалуйста!
Просмотров: 3901
 
Непрочитано 13.11.2011, 14:59
1 | #2
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


По-быстрому и без наворотов:

Код:
[Выделить все]
(setq ss (ssget	"_X"
		(list (cons 8 "Ðåëüåô ñóøè Ë") (cons 0 "*POLYLINE"))))
(while (setq pline (ssname ss 0))
  (setq	records	(append	records
			(list (vl-remove-if-not
				'(lambda (x) (= (car x) 10))
				(entget pline)))))
  (ssdel pline ss)
  )
(setq cnt 0)
(setq records (mapcar (function
			(lambda	(x)
			  (append
			    (append (list (strcat "Pline " (itoa (setq cnt (1+ cnt)))))
				    x
				    (list "Pen(1,2,3)")))))
		      records)
      )
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 13.11.2011, 15:09
#3
mamuk


 
Регистрация: 06.05.2010
Сургут
Сообщений: 248


спасибо! я попробую ваш выриант
mamuk вне форума  
 
Непрочитано 13.11.2011, 17:26
1 | #4
Oliver_88

"ценный кадр"
 
Регистрация: 02.12.2010
Сообщений: 115
<phrase 1=


Код:
[Выделить все]
 (defun test ( / bes-selectionset->list test1 ssl lst1)
  (defun bes-selectionset->list (ssl)
    (mapcar
      (function
	(lambda (x)
	  (cadr x)
	  )
	)
      (vl-remove-if
	(function
	  (lambda (x)
	    (listp (cadr x))
	    )
	  )
	(ssnamex ssl)
	)
      )
    )
  (defun test1 (lst)
    (cond
      (
       (= (caar lst) 10)
       (cons
	 (cdar lst)
	 (test1 (cdr lst))
	 )
       )
      (
       lst
       (test1 (cdr lst))
       )
      )
    )
  (setq ssl (ssget "_X" (list (cons 0 "*POLYLINE"))))
  (setq lst1 (bes-selectionset->list ssl))
  (mapcar
    (function
      (lambda (b)
	(cons
	  (strcat "Pline " (vl-princ-to-string
			     (1+ (vl-position b lst1))
			     )
		  )
	  (reverse
	    (cons
	      "Pen (14,2,11556864)"
	      (reverse (test1 (entget b)))
	      )
	    )
	  )
	)
      )
    lst1
    )
  )
Oliver_88 вне форума  
 
Автор темы   Непрочитано 22.11.2011, 10:52
#5
mamuk


 
Регистрация: 06.05.2010
Сургут
Сообщений: 248


пробовал я обрабатывать список полученный в ваших кодах, но увы мозгов не хватает, что бы на выходе получить строки записанные в файл
Pline 7
3551984.84 968727.36
3551998.69 968730.07
3552005.1 968723.92
3552017.35 968721.88
3552025.85 968733.46
3552008.43 968744.92
3552012.55 968749.41
Pen (14,2,11556864)
как же все это можно осуществить!?
по решения не нашел......
mamuk вне форума  
 
Непрочитано 22.11.2011, 18:44
1 | #6
Oliver_88

"ценный кадр"
 
Регистрация: 02.12.2010
Сообщений: 115
<phrase 1=


Обрати внимание на коментарий.
Код:
[Выделить все]
 (defun test ( / bes-selectionset->list ssl lst1 test1 f str1 str2)
  
  (defun bes-selectionset->list (ssl)
    (mapcar
      (function
	(lambda (x)
	  (cadr x)
	  )
	)
      (vl-remove-if
	(function
	  (lambda (x)
	    (listp (cadr x))
	    )
	  )
	(ssnamex ssl)
	)
      )
    )
  
  (defun test1 (lst)
    (cond
      (
       (= (caar lst) 10)
       (cons
	 (cdar lst)
	 (test1 (cdr lst))
	 )
       )
      (
       lst
       (test1 (cdr lst))
       )
      )
    )
  
  (setq ssl (ssget "_X" (list (cons 0 "*POLYLINE"))))
  (setq lst1 (bes-selectionset->list ssl))
  
  (setq f (open "D:\\doc\\имя_файла.txt" "W"));здесь вместо "D:\\doc\\файл.txt" напиши свои путь и имя файла. Путь должен быть существующим (диск, папки). При отсутствии файла имя_файла.txt он будет создан автоматом.
   
  (setq str1 "Pline 7"
	str2 "Pen (14,2,11556864)"
	)
  
  (mapcar
    (function
      (lambda (d)
	(princ "\n" f)
	(princ str1 f)
	(mapcar
	  (function
	    (lambda (s)
	      (princ "\n" f)
	      (princ
		(vl-string-trim "( )"
		  (vl-princ-to-string s)
		  )
		f
		)
	      )
	    )
	  d
	  )
	(princ "\n" f)
	(princ str2 f)
	)
      )
    (mapcar
      (function
	(lambda (b)
	  (test1 (entget b))
	  )
	)
      lst1
      )
    )

  ;;;  (mapcar
  ;;;    (function
  ;;;      (lambda (u)
  ;;;	(mapcar
  ;;;	  (function
  ;;;	    (lambda (e)
  ;;;	      (princ "\n" f)
  ;;;	      (princ e f)
  ;;;	      )
  ;;;	    )
  ;;;	  u
  ;;;	  )
  ;;;	)
  ;;;      )
  ;;;    (mapcar
  ;;;      (function
  ;;;	(lambda (b)
  ;;;	  (cons
  ;;;	    (strcat "Pline " (vl-princ-to-string
  ;;;			       (1+ (vl-position b lst1))
  ;;;			       )
  ;;;		    )
  ;;;	    (reverse
  ;;;	      (cons
  ;;;		"Pen (14,2,11556864)"
  ;;;		(reverse
  ;;;		  (mapcar
  ;;;		    (function
  ;;;		      (lambda (g)
  ;;;			(vl-string-trim "( )"
  ;;;			  (vl-princ-to-string g)
  ;;;			  )
  ;;;			)
  ;;;		      )
  ;;;		    (test1 (entget b))
  ;;;		    )
  ;;;		  )
  ;;;		)
  ;;;	      )
  ;;;	    )
  ;;;	  )
  ;;;	)
  ;;;      lst1
  ;;;      )
  ;;;    )
  
  (close f)
  
  )

Последний раз редактировалось Oliver_88, 22.11.2011 в 19:25. Причина: дополнение по №7
Oliver_88 вне форума  
 
Непрочитано 22.11.2011, 18:55
#7
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Цитата:
Сообщение от Oliver_88 Посмотреть сообщение
Обрати внимание на коментарий.
Код:
[Выделить все]
  ...
  (setq f (open "D:\\doc\\имя_файла.txt" "W"));здесь вместо "D:\\doc\\файл.txt" напиши свои путь и имя файла. Путь должен быть существующим.
  ...
Необязательно, если аргумент <файл> указывает на несуществующий файл в режимах "W", "A", то он создается
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 23.11.2011, 20:02
#8
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от TararykovDG Посмотреть сообщение
то он создается
У меня под буквой "D" - DVD-привод... Интересно, создаст он в нем этот txt?
Do$ вне форума  
 
Непрочитано 23.11.2011, 21:10
1 | #9
Кулик Алексей aka kpblc
Moderator

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


Ну можно по-разному заморачиваться, вплоть до http://autolisp.ru/2011/04/07/drivetype_define/
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.11.2011, 21:15
#10
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от TararykovDG Посмотреть сообщение
Необязательно, если аргумент <файл> указывает на несуществующий файл в режимах "W", "A", то он создается
ты точно уверен, что создается полный путь, включая папки?
попробуй:
Код:
[Выделить все]
(setq f (open "c:\\1\\1\\1\\1.txt" "w"))
(close f)
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 24.11.2011, 09:47
#11
mamuk


 
Регистрация: 06.05.2010
Сургут
Сообщений: 248


Oliver_88, спасибо!
но у меня только список формируется , а записи в файл не происходит! конструкция кода для меня честно сложновата я пока не могу понять как там все происходит.
Извиняюсь! получилось! Спасибо и буду разбираться как тут все работает!!!!

Последний раз редактировалось mamuk, 24.11.2011 в 11:30.
mamuk вне форума  
 
Непрочитано 24.11.2011, 11:20
#12
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Цитата:
Сообщение от Do$ Посмотреть сообщение
Цитата:
Сообщение от TararykovDG Посмотреть сообщение
то он создается
У меня под буквой "D" - DVD-привод... Интересно, создаст он в нем этот txt?
Цитата:
Сообщение от Елпанов Евгений Посмотреть сообщение
ты точно уверен, что создается полный путь, включая папки?
попробуй:
Код:
[Выделить все]
(setq f (open "c:\\1\\1\\1\\1.txt" "w"))
(close f)
Да елы-палы, понятно что не создаст ни папки, ни файл на DVD-приводе. Я же говорил, что файл может не существовать, а путь, конечно должен существовать и быть корректным.
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 24.11.2011, 12:16
1 | #13
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от TararykovDG Посмотреть сообщение
а путь, конечно должен существовать и быть корректным.
Даже если пути нет, никто не мешает его создать. Устал я чего-то читать, как вы спорите по поводу несоздания каталога
Линк - то, что лично у меня работает. По крайней мере, пока.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > как обработать список из нескольких уровней

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
lisp помогите обработать список Apelsinov LISP 33 16.07.2021 15:56
SCAD Office 11.1 Новые возможности EUDGEN SCAD 632 20.02.2013 17:13
Как передать функции (getkword) Список ключевых слов из списка? Kostinok Программирование 31 31.05.2012 13:08
Помогите новичку! Параметаризация детали на AutoLISPe!!! Nica_019 LISP 21 04.02.2011 19:56
Помощь по Лире Серега М Лира / Лира-САПР 52 28.05.2007 02:47