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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Разбор объектов набора(ssget) по группам их выбора при интерактивном выборе

LISP. Разбор объектов набора(ssget) по группам их выбора при интерактивном выборе

Ответ
Поиск в этой теме
Непрочитано 09.01.2012, 07:33 #1
LISP. Разбор объектов набора(ssget) по группам их выбора при интерактивном выборе
Disney
 
Геодезист
 
Сибирь (где медведи по улицам ходят)
Регистрация: 12.03.2009
Сообщений: 860

Возникла такая задача, по любому где-то уже решалась, но поиском ничего похожего не нашёл.
Стало интересно решить самому, получилось вот такое:
Код:
[Выделить все]
 
;;;  (group_ssget_rec (ssnamex (ssget)) nil)



(defun group_ssget_rec (ss_list flag / item)
  (setq	temp_list ss_list
	item	  (car ss_list)
  )
  (cond
    ((and (> (car item) 1)
	  (eq flag (car (reverse item)))
     )
     (cons (cadr item) (group_ssget_rec (cdr ss_list) flag))
    )
    (flag
     (setq flag nil)
    )
    ((> (car item) 1)
     (setq flag (car (reverse item)))
     (cons (group_ssget_rec ss_list flag)
	   (group_ssget_rec temp_list nil)
     )
    )
    ((eq (car item) 1)
     (cons (list (cadr item))
	   (group_ssget_rec (cdr ss_list) nil)
     )
    )
  )
)

Хотелось бы выслушать критику или посмотреть другие решения, моё работает но самому как-то не очень нравиться...
__________________
Почему все вдруг становятся умными, когда уже не надо?
Просмотров: 3001
 
Непрочитано 09.01.2012, 12:43
#2
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


temp_list не локализован.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 09.01.2012, 13:08
#3
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


Цитата:
Сообщение от Дима_ Посмотреть сообщение
temp_list не локализован.
А тогда работать не будет.
Это локальная функция программы, поэтому temp_list я локализую уже в самой программе.
Как раз вот этот момент мне и не нравиться, почему и создал тему.
Ну и уже потом заменил (car(reverse на (last
__________________
Почему все вдруг становятся умными, когда уже не надо?
Disney вне форума  
 
Непрочитано 09.01.2012, 13:39
1 | #4
Oliver_88

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


Сильно не проверял.
Код:
[Выделить все]
 ;(test (ssnamex (ssget)))
      (defun test (lst)
	(if lst
	  (cons
	    (mapcar 'cadr (vl-remove-if
			    (function
			      (lambda (a)
				(/= (last a) (last (car lst)))
				)
			      )
			    lst
			    )
		    )
	    (test
	      (vl-remove-if
		(function
		  (lambda (a)
		    (or
		      (= (last a) (last (car lst)))
		      (listp (cadr a))
		      )
		    )
		  )
		lst
		)
	      )
	    )
	  )
	)
Oliver_88 вне форума  
 
Непрочитано 09.01.2012, 15:47
#5
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от Disney Посмотреть сообщение
А тогда работать не будет.
Это локальная функция программы, поэтому temp_list я локализую уже в самой программе.
Ну про этож не было сказанно, но в любом случае - тогда сама group_ssget_rec в "большой" программе должна быть локализированна - в автолиспе нет связывания и вызывая эту функцию "из вне" мы "портим" чей-то temp_list (возможно другой такой-же group_ssget_rec) - то есть при таком подходе мы не можем "смело" использовать ее в "рекурсивной" задаче - т.к. функция "не чистая" - это одна из причин почему я использую лямбды - не надо ничего "локализировать" и 100% можно вызывать все объявленные имена откуда хочешь - если присваивания нет, никто ничего не испортит, но это, что называется, на любителя.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 09.01.2012, 19:18
#6
Li6-D


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


Непонятно назначение переменной flag, когда она не nil.
Если flag=0,1,2,3,4 (способ выбора объектов), то почему flag сравнивается с (last item), a не (car item)?
Или нечто более экзотическое, например, flag=-1,-2,-3...(номер многоугольника выбора)?
Li6-D вне форума  
 
Автор темы   Непрочитано 10.01.2012, 05:43
#7
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


Цитата:
Сообщение от Li6-D Посмотреть сообщение
Или нечто более экзотическое, например, flag=-1,-2,-3...(номер многоугольника выбора)?
Да именно так, разобрать по группам, один многоугольник - одна группа.
__________________
Почему все вдруг становятся умными, когда уже не надо?

Последний раз редактировалось Disney, 10.01.2012 в 05:49.
Disney вне форума  
 
Непрочитано 10.01.2012, 18:58
#8
Li6-D


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


Простите великодушно, что без рекурсии и лямбды
Код:
[Выделить все]
(defun test2 (ss_list / a s sN s1N)
  (foreach item (reverse ss_list)
    (cond
      ((> (car item) 1) 
        (setq a (list (last item) (cadr item))
              s (assoc (car a) sN)
              sN (if s
                   (subst (append a (cdr s)) s sN)
                   (cons a sN)
      ) )        )
      ((eq (car item) 1)
        (setq s1N (cons (list (cadr item)) s1N))
  ) ) )
  (append s1N (mapcar 'cdr sN))
)
Li6-D вне форума  
 
Автор темы   Непрочитано 11.01.2012, 07:50
#9
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


Li6-D, Не пойдёт , я сразу не упомянул, но порядок выбора также очень важен!
в твоём варианте как-то так:
Код:
[Выделить все]
 (defun test2 (ss_list / a s sN)
  (foreach item	(reverse ss_list)
    (cond
      ((> (car item) 1)
       (setq a	(list (last item) (cadr item))
	     s	(assoc (car a) sN)
	     sN	(if s
		  (subst (append a (cdr s)) s sN)
		  (cons a sN)
		)
       )
      )
      ((eq (car item) 1)
       (setq sN (cons (list "привет!" (cadr item)) sN))
      )
    )
  )  
  (mapcar 'cdr sN)
)
Цитата:
Сообщение от Дима_ Посмотреть сообщение
я использую лямбды
можно примерчик, в целях повышения образованности ©
__________________
Почему все вдруг становятся умными, когда уже не надо?
Disney вне форума  
 
Непрочитано 11.01.2012, 10:26
#10
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Да этих примеров в моем каждом 10-ом сообщении, если что-то непонятно - пиши отвечу (если сам знаю конечно).
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 11.01.2012 в 11:57.
Дима_ вне форума  
 
Непрочитано 11.01.2012, 22:32
#11
Li6-D


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


Цитата:
Сообщение от Disney Посмотреть сообщение
Li6-D, Не пойдёт , я сразу не упомянул, но порядок выбора также очень важен!
в твоём варианте как-то так:
Ну да, с "приветом" даже проще получилось

Последний раз редактировалось Li6-D, 11.01.2012 в 22:38.
Li6-D вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Разбор объектов набора(ssget) по группам их выбора при интерактивном выборе

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
FILTER / фильтр BM60 Справочник команд 0 08.07.2008 15:35
Рамка выбора объектов и USC. vn AutoCAD 12 21.10.2006 18:41