error: exceeded maximum number of selection sets
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > error: exceeded maximum number of selection sets

error: exceeded maximum number of selection sets

Ответ
Поиск в этой теме
Непрочитано 07.08.2007, 09:34 #1
error: exceeded maximum number of selection sets
Ax3
 
Programming, automation, CADs, GISs. СибМИР
 
Россия, Санкт-Петербург
Регистрация: 02.02.2007
Сообщений: 315

Всем привет!
В продолжение старой темы "Непонятное происходит с selection set"
http://dwg.ru/forum/viewtopic.php?t=2578
У меня есть цикл такого вида:
Код:
[Выделить все]
(foreach x_ y_
	(if (setq xx_ (ssadd en_to_add_ ss_))
		(setq ss_ xx_)
		(setq xx_ nil)
	)
)
Каждый раз после запуска программы (достаточно большом количесве выбранных объектов) выскакивает ошибка, обозначенная в заголовке.
Заметил, что каждый раз то ли после ssadd, то ли после (setq ss_ xx_) набору ss_ присваивается новый номер. А как удалить набор с предыдущим номером?
__________________
На LISPе можно мыслить!
Просмотров: 3301
 
Непрочитано 07.08.2007, 09:39
#2
Кулик Алексей aka kpblc
Moderator

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


повредничаю и постебусь, пока работать невозможно
Йес! Еще один товарищ наступил на эти грабли! Я могу себя поздравить, теперь я не один такой
Суть в том, что в acad'e есть ограничение на количество selection set'ов, о чем оно честно и говорит (их может быть не больше 128). Мораль - selection set надо об"nil"ять, тогда все будет корректно. Переводи переменные в локальные.
Покажи код пополнее, потому что я, например, сделал бы списками - это может оказаться выходом более простым. Что делает твой вариант, непонятно совершенно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 07.08.2007, 09:54
#3
Ax3

Programming, automation, CADs, GISs. СибМИР
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 315



Значит таким образом. Написал реактор изменения набора pickfirst.
Смысл программы в том, что при обнаружении в предварительном наборе объекта с расширенными данными автоматом выделяются другие объекты с такими же расширенными данными. В основном все делается операциями над ss_. Переполнение происходит именно внутри реактора, все переменные локальные кроме ss_prev_
Код:
[Выделить все]
;Реактор выделения камер.
;Версия 1.1_rE (работает некорректно)
;Автор: (c)Danilov_AS_aka_`Hawk`/Ax3@forum.dwg.ru/
;Дата публикации версии: 2007.08.07
(defun select_cams_reactor (calling-reactor commandinfo
	/ ss_ ss_length_ ss_prev_length_
	ss_to_add_ ss_to_add_length_ ss_to_del_ ss_to_del_length_
	en_lst_ en_prev_lst_ en_added_lst_ en_deleted_lst_ en_to_add_
	ename_ i_ einf_ exd_ num_ pt_ x_)
	(if (not scractive_); - блокировка повторного входа в реактор во время обработки набора
		(progn
		(setq scractive_ t
			en_lst_ nil en_prev_lst_ nil
			en_added_lst_ nil en_deleted_lst_ nil
			ss_to_add_ (ssadd) ss_to_del_ (ssadd)
			ename_ nil
		)
		(setq ss_ (cadr (ssgetfirst)))
		(print ss_)
		(if (not ss_) (setq ss_ (ssadd)))
		(print ss_)
		(setq ss_length_ (sslength ss_))
		(if (not ss_prev_) (setq ss_prev_ (ssadd)))
		(setq ss_prev_length_ (sslength ss_prev_))
		(setq i_ 0)
		(repeat ss_length_
			(progn
			(setq en_lst_ (cons (ssname ss_ i_) en_lst_))
			(setq i_ (1+ i_))
			)
		)
		(setq i_ 0)
		(repeat ss_prev_length_
			(progn
			(setq en_prev_lst_ (cons (ssname ss_prev_ i_) en_prev_lst_))
			(setq i_ (1+ i_))
			)
		)
		;Составляем список примитивов, добавленных в набор
		(foreach ename_ en_lst_
			(if (not (member ename_ en_prev_lst_))
				(setq en_added_lst_ (cons ename_ en_added_lst_))
			)
		)
		;Составляем список примитивов, удаленных из набора
		(foreach ename_ en_prev_lst_
			(if (not (member ename_ en_lst_))
				(setq en_deleted_lst_ (cons ename_ en_deleted_lst_))
			)
		)
		;Добавление не выделенных пользователем примитивов, расширенные данные которых
		;совпадают с расширенными данными текущего объекта из числа выделенных пользователем, в набор
		(foreach ename_ en_added_lst_
			(progn
			(setq einf_ (entget ename_ (list app_)))
			(if (setq exd_ (cdr (cadr (assoc -3 einf_))))
				(progn
				(setq pt_ (cdr (assoc 1010 exd_)))
				(if (setq num_ (cdr (assoc 1070 exd_)))
					(progn
					(setq ss_to_add_ (ssget "_X" (list (list -3 (list app_ (cons 1070 num_) (cons 1010 pt_))))))
					(setq ss_to_add_length_ (sslength ss_to_add_))
					(setq i_ 0)
					(repeat ss_to_add_length_
						(progn
						(setq en_to_add_ (ssname ss_to_add_ i_))
						(if (not (member en_to_add_ en_lst_))
							(progn
							(setq x_ nil)
							(if (setq x_ (ssadd en_to_add_ ss_))
								(progn
								(setq ss_ nil)
								(setq ss_ x_)
								(setq x_ nil)
								(setq en_lst_ (cons en_to_add_ en_lst_))
								)
							)
							)
							
						)
						(if (not (member en_to_add_ en_prev_lst_))
							(if (setq x_ (ssadd en_to_add_ ss_prev_))
								(progn
								(setq ss_prev_ x_)
								(setq x_ nil)
								(setq en_prev_lst_ (cons en_to_add_ en_prev_lst_))
								(if 	(vlax-ldata-get (vlax-ename->vla-object en_to_add_) "angh")
									(print (vlax-ldata-get (vlax-ename->vla-object (ssname ss_to_add_ i_)) "angh"))
								)
								)
							)
						)
						(setq i_ (1+ i_))
						)
					)
					)
				)
				)
			);_end if
			);_end progn
		);end foreach
		;(prompt "\n_add: success");diagnostic message
		;Удаление ранее выделенных пользователем примитивов, расширенные данные которых
		;совпадают с расширенными данными текущего объекта из числа "девыделенных" (deselected) пользователем, из набора
		(foreach ename_ en_deleted_lst_
			(progn
			(setq einf_ (entget ename_ (list app_)))
			(if (setq exd_ (cdr (cadr (assoc -3 einf_))))
				(progn
				(setq pt_ (cdr (assoc 1010 exd_)))
				(if (setq num_ (cdr (assoc 1070 exd_)))
					(progn
					(setq ss_to_del_ (ssget "_X" (list (list -3 (list app_ (cons 1070 num_) (cons 1010 pt_))))))
					(setq ss_to_del_length_ (sslength ss_to_del_))
					(setq i_ 0)
					(repeat ss_to_del_length_
						(progn
						(if (setq x_ (ssdel (ssname ss_to_del_ i_) ss_)) (setq ss_ x_))
						(setq i_ (1+ i_))
						)
					)
					)
				)
				)
			);_end if
			);_end progn
		);end foreach
		;(prompt "\n_del: success");diagnostic message
		(setq scractive_ nil)
		(sssetfirst nil ss_)
		(setq ss_prev_ (cadr (ssgetfirst)))
		);_end progn
	);end if
)
(vlr-miscellaneous-reactor nil '((:vlr-pickfirstModified . select_cams_reactor)))
Хотя работа со списками, очевидно, предпочтительнее.
__________________
На LISPе можно мыслить!
Ax3 вне форума  
 
Автор темы   Непрочитано 07.08.2007, 09:57
#4
Ax3

Programming, automation, CADs, GISs. СибМИР
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 315


Ах да! Чуть не забыл - чертеж, в котором испытывался код:
[ATTACH]1186466227.dwg[/ATTACH]
__________________
На LISPе можно мыслить!
Ax3 вне форума  
 
Автор темы   Непрочитано 07.08.2007, 10:25
#5
Ax3

Programming, automation, CADs, GISs. СибМИР
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 315


Е мое!!!!!!! :shock: :shock: :shock: :shock:
С нервным смехом я смотрю на последние строчки реактора и понимаю, что (sssetfirst nil ss_) делается после снятия блокировки повторного входа в реактор (setq scractive_ nil). Ну не мудак ли я? (простите за лексику )
Получался вложенный вызов. Вот работающий реактор
Код:
[Выделить все]
;Реактор выделения камер.
;Версия 1.2
;Автор: (c)Danilov_AS_aka_`Hawk`/Ax3@forum.dwg.ru/
;Дата публикации версии: 2007.08.07
(defun select_cams_reactor (calling-reactor commandinfo
	/ ss_ ss_length_ ss_prev_length_
	ss_to_add_ ss_to_add_length_ ss_to_del_ ss_to_del_length_
	en_lst_ en_prev_lst_ en_added_lst_ en_deleted_lst_ en_to_add_
	ename_ i_ einf_ exd_ num_ pt_ x_)
	(if (not scractive_); - блокировка повторного входа в реактор во время обработки набора
		(progn
		(setq scractive_ t
			en_lst_ nil en_prev_lst_ nil
			en_added_lst_ nil en_deleted_lst_ nil
			ss_to_add_ (ssadd) ss_to_del_ (ssadd)
			ename_ nil
		)
		(setq ss_ (cadr (ssgetfirst)))
		(if (not ss_) (setq ss_ (ssadd)))
		(setq ss_length_ (sslength ss_))
		(if (not ss_prev_) (setq ss_prev_ (ssadd)))
		(setq ss_prev_length_ (sslength ss_prev_))
		(setq i_ 0)
		(repeat ss_length_
			(progn
			(setq en_lst_ (cons (ssname ss_ i_) en_lst_))
			(setq i_ (1+ i_))
			)
		)
		(setq i_ 0)
		(repeat ss_prev_length_
			(progn
			(setq en_prev_lst_ (cons (ssname ss_prev_ i_) en_prev_lst_))
			(setq i_ (1+ i_))
			)
		)
		;Составляем список примитивов, добавленных в набор
		(foreach ename_ en_lst_
			(if (not (member ename_ en_prev_lst_))
				(setq en_added_lst_ (cons ename_ en_added_lst_))
			)
		)
		;Составляем список примитивов, удаленных из набора
		(foreach ename_ en_prev_lst_
			(if (not (member ename_ en_lst_))
				(setq en_deleted_lst_ (cons ename_ en_deleted_lst_))
			)
		)
		;Добавление не выделенных пользователем примитивов, расширенные данные которых
		;совпадают с расширенными данными текущего объекта из числа выделенных пользователем, в набор
		(foreach ename_ en_added_lst_
			(progn
			(setq einf_ (entget ename_ (list app_)))
			(if (setq exd_ (cdr (cadr (assoc -3 einf_))))
				(progn
				(setq pt_ (cdr (assoc 1010 exd_)))
				(if (setq num_ (cdr (assoc 1070 exd_)))
					(progn
					(setq ss_to_add_ nil)
					(setq ss_to_add_ (ssget "_X" (list (list -3 (list app_ (cons 1070 num_) (cons 1010 pt_))))))
					(setq ss_to_add_length_ (sslength ss_to_add_))
					(setq i_ 0)
					(repeat ss_to_add_length_
						(progn
						(setq en_to_add_ (ssname ss_to_add_ i_))
						(if (not (member en_to_add_ en_lst_))
							(progn
							(setq x_ nil)
							(if (setq x_ (ssadd en_to_add_ ss_))
								(progn
								(setq ss_ nil)
								(setq ss_ x_)
								(setq x_ nil)
								(setq en_lst_ (cons en_to_add_ en_lst_))
								)
							)
							)
							
						)
						(if (not (member en_to_add_ en_prev_lst_))
							(progn
							(setq x_ nil)
							(if (setq x_ (ssadd en_to_add_ ss_prev_))
								(progn
								(setq ss_prev_ nil)
								(setq ss_prev_ x_)
								(setq x_ nil)
								(setq en_prev_lst_ (cons en_to_add_ en_prev_lst_))
								(if 	(vlax-ldata-get (vlax-ename->vla-object en_to_add_) "angh")
									(print (vlax-ldata-get (vlax-ename->vla-object (ssname ss_to_add_ i_)) "angh"))
								)
								)
							)
							)
						)
						(setq i_ (1+ i_))
						)
					)
					)
				)
				)
			);_end if
			);_end progn
		);end foreach
		(prompt "\n_add: success");diagnostic message
		;Удаление ранее выделенных пользователем примитивов, расширенные данные которых
		;совпадают с расширенными данными текущего объекта из числа "девыделенных" (deselected) пользователем, из набора
		(foreach ename_ en_deleted_lst_
			(progn
			(setq einf_ (entget ename_ (list app_)))
			(if (setq exd_ (cdr (cadr (assoc -3 einf_))))
				(progn
				(setq pt_ (cdr (assoc 1010 exd_)))
				(if (setq num_ (cdr (assoc 1070 exd_)))
					(progn
					(setq ss_to_del_ nil)
					(setq ss_to_del_ (ssget "_X" (list (list -3 (list app_ (cons 1070 num_) (cons 1010 pt_))))))
					(setq ss_to_del_length_ (sslength ss_to_del_))
					(setq i_ 0)
					(repeat ss_to_del_length_
						(progn
						(setq x_ nil)
						(if (setq x_ (ssdel (ssname ss_to_del_ i_) ss_))
							(progn
							(setq ss_ nil)
							(setq ss_ x_)
							(setq x_ nil)
							)
						)
						(setq i_ (1+ i_))
						)
					)
					)
				)
				)
			);_end if
			);_end progn
		);end foreach
		(prompt "\n_del: success");diagnostic message
		(sssetfirst nil ss_)
		(setq ss_prev_ (cadr (ssgetfirst)))
		(setq scractive_ nil)
		);_end progn
	);end if
)
(vlr-miscellaneous-reactor nil '((:vlr-pickfirstModified . select_cams_reactor)))
Обнуления ss_ и прочего я все-таки ввел на всякий случай.
Все, кажись тема закрыта, большое спасибо и прошу меня простить за пустое беспокойство.
__________________
На LISPе можно мыслить!
Ax3 вне форума  
 
Непрочитано 07.08.2007, 10:38
#6
Кулик Алексей aka kpblc
Moderator

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


Я далеко не уверен, что такое прокатит (код практически не тестировал):
Код:
[Выделить все]
(vl-load-com)
(or *adoc* (setq *adoc* (vla-get-activedocument (vlax-get-acad-object))))
(or *appname* (setq *appname* "_cam"))

(if *vlr-misc*
  (progn
    (setq *vlr-misc* nil)
    (vlr-remove-all :vlr-miscellaneous-reactor)
    ) ;_ end of progn
  ) ;_ end of if

(if (/= (type *vlr-misc*) 'vlr-miscellaneous-reactor)
  (setq *vlr-misc*
         (vlr-miscellaneous-reactor
           "ax3misc"
           '((:vlr-pickfirstmodified . _ax3-sel-cam-reactor))
           ) ;_ end of VLR-Miscellaneous-Reactor
        ) ;_ end of setq
  ) ;_ end of if

(if (not (vlr-added-p *vlr-misc*))
  (vlr-add *vlr-misc*)
  ) ;_ end of if

(defun _ax3-sel-cam-reactor (reactor cmd / selset_pref selset_add)
  (if (not *selsetmod*)
    (progn
      (setq *selsetmod* t
            selset_pref (cadr (ssgetfirst))
            selset_add  (ssget
                          "_X"
                          (list
                            (cons 410
                                  (cdr (assoc 410 (entget (ssname selset_pref 0))))
                                  ) ;_ end of cons
                            (list -3 (list *appname*))
                            ) ;_ end of list
                          ) ;_ end of ssget
            ) ;_ end of setq
      (foreach item (vl-remove-if 'listp (mapcar 'cadr (ssnamex selset_add)))
        (if (not (ssmemb item selset_pref))
          (setq selset_pref (ssadd item selset_pref))
          ) ;_ end of if
        ) ;_ end of foreach
      (sssetfirst selset_pref selset_pref)
      (setq *selsetmod* nil)
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
P.S. Ну вот, и сам разобрался
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 07.08.2007, 10:48
#7
Ax3

Programming, automation, CADs, GISs. СибМИР
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 315


Гм... :shock:
Коллега, с вами интересно общаться !
Щас попробую. Только предлагаю перенести обсуждение в тему "Проектирование видеонаблюдения", а то оффтопик получится
__________________
На LISPе можно мыслить!
Ax3 вне форума  
 
Непрочитано 07.08.2007, 11:09
#8
Кулик Алексей aka kpblc
Moderator

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


Ну там-то было просто решение, а здесь больше о программных вариантах рассуждается-то Оставим как есть, ладушки?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 07.08.2007, 11:19
#9
Ax3

Programming, automation, CADs, GISs. СибМИР
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 315


ок
__________________
На LISPе можно мыслить!
Ax3 вне форума  
 
Непрочитано 07.08.2007, 11:48
#10
Кулик Алексей aka kpblc
Moderator

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


Ха, идея! Точнее, сначала вопрос, а потом "идея".
Вопрос: а зачем ты собираешься выделять? Может, проще с реакторами не заморачиваться, а отдельный лиспик накатать, аналог LISP. Аналог Isolate objects (ADT) для AutoCAD?
А если тебе надо удалять, например, "такие же" документы, то тут (ИМХО, конечно) проще будет делать командные реакторы. И в реакторе на окончание команды erase пройтись по всем примитивам текущего пространства и поудалять их нафих. Как тебе вариант?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 07.08.2007, 12:42
#11
Ax3

Programming, automation, CADs, GISs. СибМИР
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 315


ммм, даже не знаю...
Цитата:
аналог LISP. Аналог Isolate objects (ADT) для AutoCAD
- не понял, о чем речь
Цитата:
командные реакторы
- в таком случае получится не совсем эстетично в том смысле, что неожиданно будут пропадать объекты, которые пользователь не выделял. А так они выделяются и выглядят для пользователя как блоки.
__________________
На LISPе можно мыслить!
Ax3 вне форума  
 
Непрочитано 07.08.2007, 12:56
#12
Кулик Алексей aka kpblc
Moderator

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


Тьфу ты, не ту ссылку дал. Забудь про нее.
Можно сделать аналог Select Similar (выбрать аналог) - аналогичные объекты и выделятся тут же. Только надо выработать критерии "аналога".
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > error: exceeded maximum number of selection sets

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

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