Selection sets

Автор Тема: Selection sets  (Прочитано 31359 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн altverАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 118
  • Карма: 2
Re: Selection sets
« Ответ #60 : 17-02-2020, 20:52:07 »
В проессе работы лиспом создаю наборы при момощи (ssget). в каой-то моент получаю извещение автокда exceeded maximum number of selection sets, хотя посоянно обнуляю все наборы.
Удаляю ВСЕ из чертежа,
делаю на чертеж Purge, оставлю только слой 0
Этим лиспом очищаю чертеж:

Код - Auto/Visual Lisp [Выбрать]
  1. (defun C:CLR_SELS ( / e n acad doc sels)
  2.   (setq n 0)
  3.   (foreach e (atoms-family 0)
  4.     (if (= (type (vl-symbol-value e)) 'PICKSET) (progn
  5.       (set e nil)
  6.       (princ "\n") (princ e)
  7.       (setq n (1+ n))
  8.     ))
  9.   )
  10.   (setq acad (vlax-get-acad-object)
  11.         doc  (vla-get-activedocument acad)
  12.         sels (vla-get-selectionsets doc)
  13.   )
  14.  
  15.   (vlax-for sel sels (vla-clear sel))
  16.  
  17.   (princ "\nОчищено наборов: ") (princ n)
  18.   (princ)
  19. )

Возвращает 0 наборов очищено

Черчу одну линию в слое 0
создаю набор (ssget), указыаю линию и опять получаю exceeded maximum number of selection sets
Что не верно? почему чертеж не чистится?  Где хранятся эти наборы?


Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Selection sets
« Ответ #61 : 17-02-2020, 21:11:01 »
Выгружай вообще все свои (и чужие тоже) коды. Раньше уже было сказано: проблема лежит где-то в другом месте. Чистить наборы в данный момент уже поздно, надо искать причину.
Я бы выгрузил вообще все стороннее и последовательно каждый модуль проверял и тестировал. Может, и долго - но зато контролируемо.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #62 : 17-02-2020, 21:34:03 »
Удаляю ВСЕ из чертежа,
делаю на чертеж Purge, оставлю только слой 0
Это никакого отношения к наборам не имеет. Только одно может после этого сообщения помочь - закрыть чертеж и открыть его по новой (или перезапустить AutoCAD).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн altverАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 118
  • Карма: 2
Re: Selection sets
« Ответ #63 : 17-02-2020, 22:04:53 »
Выгружай вообще все свои (и чужие тоже) коды
что имеется виду?

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Selection sets
« Ответ #64 : 17-02-2020, 22:14:37 »
Если я правильно понимаю, то в чертеже работает несколько модулей. Вот их и надо выгрузить, проверить работу своего кода, потом загружать по одному модулю - и опять на тестирование.
Ну или вскрывать код и внимательно его анализировать.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #65 : 17-02-2020, 22:17:06 »
altver,
Имеется в виду запустить чистый AutoCAD без каких-либо дополнительных приложений (lisp/arx/vba/dll), в том числе и SPDS Extension, СПДС Graphics и т.д. И провести проверку в таком состоянии.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн altverАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 118
  • Карма: 2
Re: Selection sets
« Ответ #66 : 18-02-2020, 17:31:10 »
Доброе время суток!
Помогите понять. Неоднократно в большой программе применяю лисп для
 нахождения объекта проходящего через точку ,возможно с фильтром

Код - Auto/Visual Lisp [Выбрать]
  1. (defun PoiskEntLstNew ( ptP lstLay / )
  2.            ; Находит объекты лежащие под точкой
  3.            ; - точка
  4.            ; - список слоев в виде ((-4 . "<OR") (8 . "CALZ20") (8 . "CALZ10") (8 . "CALZ30") (8 . "CalBlock") (-4 . "OR>"))
  5.        
  6.                 (setq stp1 (polar (polar ptP pi 0.01(/ pi 2.0) 0.01
  7.                       stp2 (polar (polar ptP 0 0.01) (/ pi 2.0) 0.01
  8.                       stp3 (polar (polar ptP 0 0.01(- 0 (/ pi 2.0)) 0.01
  9.                       stp4 (polar (polar ptP pi 0.01(- 0 (/ pi 2.0)) 0.01
  10.                 )      
  11.                 (setq   ret nil)
  12.    
  13.                 (setq  ss     (ssget  "_C" stp1 stp3 lstlay))
  14.  
  15.                 (setq   lst1  ( pl:selset-to-enamelist ss))
  16.                 (setq ss nil)
  17.                 (foreach itP lst1
  18.                     (if (or (= (cdr (assoc 0 (entget itP))) "LINE")
  19.                             (= (cdr (assoc 0 (entget itP))) "LWPOLYLINE")
  20.                             (= (cdr (assoc 0 (entget itP))) "POLYLINE")
  21.                             (= (cdr (assoc 0 (entget itP))) "CIRCLE")
  22.                             (= (cdr (assoc 0 (entget itP))) "ARC"))
  23.                         (setq ret(append (list ret)))
  24.                 );;for
  25.                 ret
  26. );;PoiskEntLstNew

Экспериментально выяснили, что в некоторый момент использования этого лиспа
происходит переполнение наборов ("exceeded maximum number of selection sets").
 (Идея лиспа, находящего объекты под точкой взята с ваших, Александр, постов).
Посторонних модулей нет, всю программу пересмотрел, все наборы обнуляю сразу же после использования.
Как избежать такой ошибки, как уменьшить количество наборов?
(Работаю в AutoСad 2020)
Благодарен за любую помощь.


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #67 : 18-02-2020, 17:49:07 »
Несколько замечаний:
1) Если в фильтре только слои, то фильтр можно значительно упростить, заменив на
Код - Auto/Visual Lisp [Выбрать]
  1. ; - список слоев в виде '((8 . "CALZ20,CALZ10,CALZ30,CalBlock"))
2. Перенеси код функции pl:selset-to-enamelist в тело функции PoiskEntLstNew
3. Мы уже неоднократно говорили, что в том коде, который ты демонстрируешь не видно явных проблем и что скорее всего проблема в другом (вполне возможно не твоём) коде.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Selection sets
« Ответ #68 : 18-02-2020, 17:52:32 »
Тут проблема как минимум в том, что все точки должны быть на экране. Да и вообще, я бы делал, к примеру, так:
Код - Auto/Visual Lisp [Выбрать]
  1. (defun test (pt layer-mask prec / closest lst) ;|
  2. (test (getpoint) "CALZ#*,CALBLOCK" 1e-3)
  3.  
  4. (mapcar (function (lambda(x) (vla-put-color x 1))) (test (getpoint) "*" 1e-2))
  5. |;
  6.   (vlax-for item (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
  7.     (if (and (wcmatch (strcase (vla-get-objectname item)) "*LINE,*ARC")
  8.              (wcmatch (strcase (vla-get-layer item)) layer-mask)
  9.              (setq closest (vlax-curve-getclosestpointtoprojection item pt '(0. 0. 1.)))
  10.              (< (distance closest pt) prec)
  11.              ) ;_ end of and
  12.       (setq lst (cons item lst))
  13.       ) ;_ end of if
  14.     ) ;_ end of vlax-for
  15.   (reverse lst)
  16.   ) ;_ end of defun
P.S. А какова конечная цель подобной обработки?
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн altverАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 118
  • Карма: 2
Re: Selection sets
« Ответ #69 : 19-02-2020, 21:02:15 »
Добрый всем день!
И все таки я продожаю спрашивать о превышении наборов.
Я нашел то место, где у меня в программе превышались наборы (я честно и скурпулезно обнулял все наборы в этом месте) и заменил на процедуру без наборов. Теперь это место проходит без ошибки, однако ошибается уже в другом месте. Тут я использую _Overkill, а в его работе без наборов никак нельзя.
Процедура следующая: функцией

Код - Auto/Visual Lisp [Выбрать]
  1. vla-IntersectWith

определяю, какие линии пересекаются с данной полинией, создаю список. Теперь мне необходимо сделать_Overkill.

Вопрос: работает ли _Overkill со списками или же только с наборами?

 Вот часть кода с _Overkill, который я использую:

Код - Auto/Visual Lisp [Выбрать]
  1. (setq setVx1 (pl:enamelist-to-selset lstOgr1))
  2. (if lstOgr1 (progn
  3.     (command "_.-overkill" setVx1 "" "_O" 0.001 "_I" "_ALL" "_P" "_D" "_Y" "_B" "_Y" "_Y" "_T" "_Y" "_E" "_N"  "")
  4.                  
  5.     (setq setVx1 nil)
  6.                  
  7.     (setq lstStairsMarsh (lp_ChangeList  lstStairsMarsh ii  (append item1 (list lstOgr1))))
  8.  ))  
  9.  

Как видно я сразу обнуляю набор...

Заранее благодарен!

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Selection sets
« Ответ #70 : 19-02-2020, 21:29:19 »
А если передавать не набор, а нечто типа:
(apply (function vl-cmdf) (append '("_.-overkill") (mapcar (function (lambda(x)(cdr(assoc 5 (entget x))))) lstorg1) '("" "_o" <...>)))
Код пишу "насухую", без проверок.
P.S. Не помню, открыт ли код overkill или нет...
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн altverАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 118
  • Карма: 2
Re: Selection sets
« Ответ #71 : 19-02-2020, 21:29:34 »
Еще вопрос:
в моей программе я НЕ использую никаке сторонние модули, однако неоднократно создаю наборы следующим образом:

Код - Auto/Visual Lisp [Выбрать]
  1. (setq setVx1 (pl:enamelist-to-selset lstOgr1))
  2. (if lstOgr1 (progn
  3.     (command " Стандартная команда Автокада типа_.-overkill" )
  4.                  
  5.     (setq setVx1 nil)
       
   

Одако в определенный момент превышается количество наборов......
Что еще может быть? Где еще искать?
Спасибо.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Selection sets
« Ответ #72 : 19-02-2020, 21:32:06 »
Между прочим - поищи разницу между command, command-s, vl-cmdf - массу интересного увидишь ;)
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #73 : 19-02-2020, 21:38:16 »
Еще вопрос:
в моей программе я НЕ использую никаке сторонние модули, однако неоднократно создаю наборы следующим образом:

Код - Auto/Visual Lisp [Выбрать]
  1. (setq setVx1 (pl:enamelist-to-selset lstOgr1))
  2. (if lstOgr1 (progn
  3.     (command " Стандартная команда Автокада типа_.-overkill" )
  4.                  
  5.     (setq setVx1 nil)
       
   

Одако в определенный момент превышается количество наборов......
Что еще может быть? Где еще искать?
Спасибо.
Вот тут ты ошибаешься. overkill - наследие Express Tools. Не исключаю, что она внутри себя создаёт и не чистит наборы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн altverАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 118
  • Карма: 2
Re: Selection sets
« Ответ #74 : 19-02-2020, 21:41:02 »
(apply (function vl-cmdf) (append '("_.-overkill") (mapcar (function (lambda(x)(cdr(assoc 5 (entget x))))) lstorg1) '("" "_o" <...>)))

Круто!!!
А можно ли без наборов Copy и Move?