Selection sets

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

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

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

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Selection sets
« Ответ #75 : 19-02-2020, 22:36:13 »
А можно ли без наборов Copy и Move?
Можно, почему нет... И даже необязательно использовать командные методы - ну так, для справки ;)
Все, что сказано - личное мнение.

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

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

Оффлайн SergLPN

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Selection sets
« Ответ #76 : 20-02-2020, 21:53:05 »
Доброе время суток! В связи с риском получить ошибку "maximum number of selection sets" хочу уйти в программе  от наборов. Как работать вез наборов с командами overkill,  copy, move



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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #77 : 21-02-2020, 00:37:24 »
Как работать вез наборов с командами overkill,  copy, move
Передавать по одному объекту.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Selection sets
« Ответ #78 : 21-02-2020, 07:57:13 »
Как работать вез наборов с командами overkill,  copy, move
Я бы по максимуму вообще от команд ушел.
Все, что сказано - личное мнение.

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

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

Оффлайн SergLPN

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Selection sets
« Ответ #79 : 21-02-2020, 13:52:21 »
Я бы по максимуму вообще от команд ушел.
Мне очень интересно,как. Хоть какой-нибудь пример,очень прошу. Заранее благодарен.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #80 : 21-02-2020, 14:08:47 »
Я бы по максимуму вообще от команд ушел.
Мне очень интересно,как. Хоть какой-нибудь пример,очень прошу. Заранее благодарен.
По возможности переписать код команд средствами VisualLisp. Для Copy и Move это вообще не представляет проблем.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Selection sets
« Ответ #81 : 21-02-2020, 14:35:46 »
Копирование любого количества примитивов из одной точки в другую:
Код - Auto/Visual Lisp [Выбрать]
  1. (defun copy-entites-list (ent-list base dest / copy res)
  2.   (setq base     (vlax-3d-point base)
  3.         dest     (vlax-3d-point dest)
  4.         ent-list (vl-remove nil
  5.                             (mapcar (function (lambda (x)
  6.                                                 (cond ((= (type x) 'ename) (vlax-ename->vla-object x))
  7.                                                       ((= (type x) 'vla-object) x)
  8.                                                       ((and (= (type x) 'str) (setq x (handent x))) (vlax-ename->vla-object x))
  9.                                                       ) ;_ end of cond
  10.                                                 ) ;_ end of LAMBDA
  11.                                               ) ;_ end of Function
  12.                                     ent-list
  13.                                     ) ;_ end of mapcar
  14.                             ) ;_ end of vl-remove
  15.         ) ;_ end of setq
  16.   (foreach iten ent-list (vla-move (setq copy (vla-copy ent)) base dest) (setq res (cons copy res)))
  17.   (reverse res)
  18.   ) ;_ end of defun
Код не проверял - пока других задач хватает
Все, что сказано - личное мнение.

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

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

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #82 : 21-02-2020, 14:40:33 »
Копирование любого количества примитивов из одной точки в другую:
А для простого переноса достаточно избавится от вызова (vla-copy).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Selection sets
« Ответ #83 : 21-02-2020, 14:53:30 »
Конечно! Для дублирования - избавиться от vla-move :)
Все, что сказано - личное мнение.

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

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

Оффлайн SergLPN

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Selection sets
« Ответ #84 : 25-02-2020, 14:26:02 »
Доброе время суток!
Помогите понять как определить количество наборов в чертеже.
я  определяю количество наборов, так
Код - Auto/Visual Lisp [Выбрать]
  1. (setq acad (vlax-get-acad-object)
  2.         doc  (vla-get-activedocument acad)
  3.         sels (vla-get-selectionsets doc)
  4.  )
и (vla-get-count sels) = 0, т.е. количество наборов в коллекции = 0.

Команда (atoms-family 0) может показать  несколько наборов . Выполнил команду
(setq ss (ssget)) получаю ошибку "exceeded maximum number of selection sets".
Пусть я не все переменные набора обнуляю, но их явно не 128! Как показывают выше указанные команды,почему тогда эта ошибка?
в посте #8 вы писали  ,цитата
   
А что в этом удивительного? Вообще-то это разные наборы - PICKSET и SelectionSet.
Тогда какие наборы переполняются?
Как определить количество наборов?
Извините за сумбур и эмоциональность. Под угрозой важный, большой проект.
никаких посторонних чертежей не включено
(Работаю в AutoСad 2020)
Заранее благодарен за любую помощь.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #85 : 25-02-2020, 14:51:42 »
Помогите понять как определить количество наборов в чертеже.
Ответ однозначный - НИКАК! Если посчитать SelectionSet (из COM/ActiveX) можно и этот код правильный:
   
Код - Auto/Visual Lisp [Выбрать]
  1. (setq acad (vlax-get-acad-object)
  2.             doc  (vla-get-activedocument acad)
  3.             sels (vla-get-selectionsets doc)
  4.      )
то посчитать количество использованных PICKSET нельзя. Они могут использоваться и в Lisp и в ObjectARX и в .NET. И нет методов, которые позволили бы получить их все. В лучшем случае только те из них, которые в (atoms-family).
Извините за сумбур и эмоциональность. Под угрозой важный, большой проект.
никаких посторонних чертежей не включено
При чем здесь чертежи? Судя по всему вы используете какие-то чужие программы, которые "сорят наборами".
Единственное решение, которое я вижу - переписать полностью код таким образом, чтобы:
1) не использовать наборы.
2) не использовать чужие программы.
Фактически мы толчем в этой теме воду в ступе.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Selection sets
« Ответ #86 : 25-02-2020, 15:01:30 »
Появилось немного свободного времени, и я переписал код из #48
Код - Auto/Visual Lisp [Выбрать]
  1. (defun objects-in-polygon (pt-list / cur_selset selset_name res)
  2.                           ;|
  3. (objects-in-polygon (list (setq p (getpoint "\nPoint: "))
  4.                           (setq p (getpoint p "\nNext point : "))
  5.                           (setq p (getpoint p "\nNext point : "))
  6.                           (getpoint p "\nNext point : ")
  7.                           ) ;_ end of list
  8.                     ) ;_ end of objects-in-polygon
  9. (objects-in-polygon '((2210.12 1294.7 0.0) (2696.88 1977.77 0.0) (3670.4 1735.79 0.0) (4152.12 1272.01 0.0)))
  10. |;
  11.   (if (setq pt-list (mapcar (function (lambda (x) (trans x 1 0))) pt-list))
  12.     (progn (setq selset_name "SelSetPolygon"
  13.                  pt-list     (apply (function append) pt-list)
  14.                  ) ;_ end of setq
  15.            (if (= (type
  16.                     (setq cur_selset (vl-catch-all-apply
  17.                                        (function
  18.                                          (lambda ()
  19.                                            (vla-item (vla-get-selectionsets (vla-get-activedocument (vlax-get-acad-object))) selset_name)
  20.                                            ) ;_ end of lambda
  21.                                          ) ;_ end of function
  22.                                        ) ;_ end of vl-catch-all-apply
  23.                           ) ;_ end of setq
  24.                     ) ;_ end of type
  25.                   'vla-object
  26.                   ) ;_ end of =
  27.              (vla-clear cur_selset)
  28.              (setq cur_selset (vla-add (vla-get-selectionsets (vla-get-activedocument (vlax-get-acad-object))) selset_name))
  29.              ) ;_ end of if
  30.            (vl-catch-all-apply
  31.              (function
  32.                (lambda ()
  33.                  (vla-selectbypolygon cur_selset
  34.                                       acselectionsetcrossingpolygon
  35.                                       (vlax-make-variant
  36.                                         (vlax-safearray-fill (vlax-make-safearray vlax-vbdouble (cons 0 (1- (length pt-list)))) pt-list)
  37.                                         ) ;_ end of vlax-make-variant
  38.                                       ) ;_ end of vla-selectbypolygon
  39.                  (if (> (vla-get-count cur_selset) 0)
  40.                    (vlax-for item cur_selset (setq res (cons item res)))
  41.                    ) ;_ end of if
  42.                  ) ;_ end of lambda
  43.                ) ;_ end of function
  44.              ) ;_ end of vl-catch-all-apply
  45.            (vla-delete cur_selset)
  46.            (setq cur_selset nil)
  47.            (reverse res)
  48.            ) ;_ end of progn
  49.     ) ;_ end of if
  50.   ) ;_ end of defun
После этого вызвал
Код - Auto/Visual Lisp [Выбрать]
  1. (repeat 1000 (objects-in-polygon '((2210.12 1294.7 0.0) (2696.88 1977.77 0.0) (3670.4 1735.79 0.0) (4152.12 1272.01 0.0))))
Ошибок не обнаружено.
После этого слегка доработал исходный вариант:
Код - Auto/Visual Lisp [Выбрать]
  1. (defun selsetpolygon (pt / acadobj doc ssets nset ptlist tmp ret ii item)
  2.   ;; (selsetpolygon '((2210.12 1294.7 0.0) (2696.88 1977.77 0.0) (3670.4 1735.79 0.0) (4152.12 1272.01 0.0)))
  3.   (setq acadobj (vlax-get-acad-object))
  4.   (setq doc (vla-get-activedocument acadobj))
  5.   (setq ssets (vla-get-selectionsets doc))
  6.   (setq nset (vla-add ssets "SS1"))
  7.   (setq ptlist pt)
  8.   (setq ptlist (apply 'append ptlist))
  9.   (if (= (rem (length ptlist) 3) 0)
  10.     (progn (setq tmp (vlax-make-safearray vlax-vbdouble (cons 0 (- (length ptlist) 1))))
  11.            (vlax-safearray-fill tmp ptlist)
  12.            ) ;_ end of progn
  13.     ) ;_ end of if
  14.   ;;if
  15.   (vla-selectbypolygon nset acselectionsetcrossingpolygon tmp)
  16.   (setq ret nil)
  17.   (setq ii 0)
  18.   (repeat (vla-get-count nset)
  19.     (setq item (vla-item nset ii))
  20.     (setq ret (append ret (list (vlax-vla-object->ename item))))
  21.     (setq ii (1+ ii))
  22.     ) ;_ end of repeat
  23.   ;;ret
  24.   (vla-clear (vla-item ssets "SS1"))
  25.   (vla-delete (vla-item ssets "SS1"))
  26.   ret
  27.   ) ;_ end of defun
И опять повторил 1000 раз вызов. Ошибок также не обнаружено.
ACAD2019x64, все обновления. Так что ошибка вряд ли именно в этом куске.
Уже много раз говорили - надо проверять и анализировать весь код, чуть ли не пошагово. И постарайся все же принять за правило - наборы примитивов создавать только в момент взаимодействия с пользователем, а дальше уже работать со списками указателей на объекты.
P.S. Кусок кода с аналогом overkill не проверял, не смотрел, не анализировал (там даже ни одного примера вызова нет, а из головы их придумывать - увольте).
Все, что сказано - личное мнение.

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

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

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #87 : 25-02-2020, 15:15:33 »
P.S. Кусок кода с аналогом overkill не проверял, не смотрел, не анализировал (там даже ни одного примера вызова нет, а из головы их придумывать - увольте).
Там код команды overkill размазан по нескольким lisp-файлам и еще используются функции из arx-файла, который в данном случае как черный ящик. Как я понимаю эта команда рассчитана на ручной запуск и максимум пару раз в одном чертеже. Поэтому нет отслеживания появляющихся наборов. Вряд ли еще кто-то использует эту команду таким образом, как SergLPN и поэтому на такие ошибки не нарывается...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 118
  • Карма: 2
Re: Selection sets
« Ответ #88 : 02-03-2020, 17:36:34 »
Проблему решили след. образом:
после того, как проверили\перепроверили всю программу и все сторонние модули  (в местах, где было возможно отказаться от (ssget)-отказались и переделали) и не поучили никакого положительного результата стали методом "тыка" проверять команды одну за другой. И нашли! Оказывается, что комада _hideobjects создат наборы, которые невозможно ни проследить ни обнулить... Причем, если изолировать списком, то кажый объект это один дополнительный набор, а т.к. программа изолирует много объектов, то и присходило превышение 128-и наборов.
Решили просто: объекты переводим в особый слой и этот слой гасим...
Очень надеемся, что наш опыт поможет кому-либо.
Всем огромное спасибо!
 

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #89 : 02-03-2020, 17:40:29 »
Оказывается, что комада _hideobjects создат наборы, которые невозможно ни проследить ни обнулить... Причем, если изолировать списком, то кажый объект это один дополнительный набор, а т.к. программа изолирует много объектов, то и присходило превышение 128-и наборов.
Нужно проверить. Если это действительно так, то это баг, который нужно передать в ADN DevHelp для передачи разработчикам.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение