Selection sets

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

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

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

  • ADN OPEN
  • ***
  • Сообщений: 118
  • Карма: 2
Selection sets
« : 23-10-2019, 21:54:53 »
Добрый день
Как лиспом можно посчитать наборы, которе скопились в чертеже и как их правильно чистить.
Корифеи сейчас начнут рассказывать про глобльне переменные и обнуление сетов руками...не получается так...
Нашел на форуме лисп CLR_SEL.lsp, который якобы чистит (purge) эти наборы и выводит в ком. строку результат, сколько почитил, однако чистит не все, все равно акад ругается на превышение количества наборов.
Можно получить толковый ответ на эту тему?
Большое спасибо!

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #1 : 23-10-2019, 22:22:06 »
altver,
Приветствую на форуме!
Нашел на форуме лисп CLR_SEL.lsp
Хотелось бы на него посмотреть. С идентификацией открытых наборов всё очень плохо. Особенно из lisp.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Александр Ривилис 30-01-2020, 10:14:18

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #2 : 24-10-2019, 00:34:43 »
Ничего лучше я не придумал:
Код - 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. )
  20.  
Только никакие наборы, созданные в ObjectARX и .NET так чистится не будут. И вообще не существует ни в каком виде списка созданных наборов, которые можно было бы закрыть.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 118
  • Карма: 2
Re: Selection sets
« Ответ #3 : 24-10-2019, 12:02:35 »
Большое спасибо,  буду пробовать.
Кстати, я обратил вимание на такой факт: 128 наборов мах. это не в чертеже, а сумма наборов во все открытых чертежах. Т.е. если есть открытые файлы  и, ко весму, они тяжелые и не почищены, то на рабочий файл поти ничего не остается.
И еще один факт, по которому я пришл  выводу, что чистится не все: если после сбоя (превышене наборов) перегрузить чертеж, то он очищается и можно продолжать рботать. Может эта инфа поможет в чем-то!
Еще раз спасибо!

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #4 : 24-10-2019, 12:04:56 »
И еще один факт, по которому я пришл  выводу, что чистится не все: если после сбоя (превышене наборов) перегрузить чертеж, то он очищается и можно продолжать рботать.
Именно так и это было всегда - еще с DOS-овских версий AutoCAD. Только чертеж конечно не очищается, а очищается список открытых наборов.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #5 : 24-10-2019, 12:26:20 »
По большому счету нужно найти источник незакрытых наборов. Чаще всего это какая-то не вполне корректная lisp-программа, которая не чистит набор. Вполне возможно, что она не обрабатывает ситуацию аварийного завершения (например, по нажатию ESC).
С arx/dll-приложениями легче. Вероятность появления проблем с ними меньше, хотя если проблема связанна именно с ними (а такое было в одной из первых версий Express Tools), то исправить это может только автор.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 118
  • Карма: 2
Re: Selection sets
« Ответ #6 : 30-10-2019, 22:35:58 »
Больое спасибо!

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

  • ADN OPEN
  • ***
  • Сообщений: 118
  • Карма: 2
Re: Selection sets
« Ответ #7 : 28-01-2020, 22:28:36 »
Добрый день, Александр!
Столкнулся со следующей проблемой:
при помощи следующего кода создаю 128 наборов.

Код - Auto/Visual Lisp [Выбрать]
  1. (setq i 0)
  2.     (repeat 128
  3.         (setq i (1+ i))
  4.         (set (read (strcat "ss" (itoa i))) (ssget "X"))
  5.     )

при помощи следующего кода проверяю колиство наборов в чертеже.

Код - Auto/Visual Lisp [Выбрать]
  1. (setq acada (vlax-get-acad-object)
  2.         doc  (vla-get-activedocument acada)
  3.         sels (vla-get-selectionsets doc)
  4.     )

 Код возвраает 0.
Где ошибка? Что делеся не верно?
Заранее спасибо!
« Последнее редактирование: 28-01-2020, 23:01:55 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #8 : 28-01-2020, 23:06:05 »
altver,
Не забывайте правило форматирования кода на форуме (у меня в подписи).

А что в этом удивительного? Вообще-то это разные наборы - PICKSET и SelectionSet.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 118
  • Карма: 2
Re: Selection sets
« Ответ #9 : 30-01-2020, 08:36:43 »
Спасибо большое!
Вы правы!
Еще вопрос:
а кроме PICKSET и SelectionSet
существуют ли еще другие виды наборов в автокаде?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #10 : 30-01-2020, 10:12:42 »
а кроме PICKSET и SelectionSet
существуют ли еще другие виды наборов в автокаде?
Нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 118
  • Карма: 2
Re: Selection sets
« Ответ #11 : 30-01-2020, 16:12:00 »
Большое спасибо!

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

  • ADN OPEN
  • ***
  • Сообщений: 118
  • Карма: 2
Re: Selection sets
« Ответ #12 : 30-01-2020, 21:29:06 »
Добрый день, Александр.
Ползуемся Вашим лиспом (ответ  на наш  вопрос) чистка наборов. Обнуляем все наборы (setq set nil) и все переменные наборов делаем локальными. Но при обработке сравнительно большого чертежа появляется сообщение "exceeded maximum number of selection sets".
почему не работает очистка?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #13 : 30-01-2020, 21:33:46 »
Но при обработке сравнительно большого чертежа появляется сообщение "exceeded maximum number of selection sets".
почему не работает очистка?
Программа никак не зависит от размера чертежа...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 118
  • Карма: 2
Re: Selection sets
« Ответ #14 : 30-01-2020, 21:41:05 »
Да, Вы правы, размер ни причем, однако наборы накапливаются и никакая чистка не помогает...Чистим почти после каждого обнуления наборов...

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #15 : 30-01-2020, 21:42:26 »
Чистим почти после каждого обнуления наборов...
Вообще-то чистка - это и есть обнуление наборов. Еще раз. Нужно разбираться с программами, которые вы используете.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 118
  • Карма: 2
Re: Selection sets
« Ответ #16 : 30-01-2020, 21:45:28 »
Чистим почти после каждого обюнуления наборов...и в какой то момент-бац...и все!  Интересно, что этот "бац" сразу посе обнуления...

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #17 : 30-01-2020, 21:48:14 »
Чистим почти после каждого обюнуления наборов...и в какой то момент-бац...и все!  Интересно, что этот "бац" сразу посе обнуления...
Я предупреждал, что этот алгоритм может не помочь. И более того другого алгоритма нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Selection sets
« Ответ #18 : 31-01-2020, 10:08:40 »
Без исходных кодов используемых lisp решения может и не быть. Я подозреваю, что просто не очень качественно написаны программы.
Все, что сказано - личное мнение.

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

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

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

  • ADN OPEN
  • ***
  • Сообщений: 118
  • Карма: 2
Re: Selection sets
« Ответ #19 : 31-01-2020, 13:45:54 »
Когда-то, очень давно на прсторах интернета нашел вот этот лисп. Импирическим путем понял, что он накапливает наборы. Хотя может я и не прав...


Код - Auto/Visual Lisp [Выбрать]
  1. ;;  
  2.  
  3. (defun My-overkill2 ( alst Tolerance / lst ss fuz ignore no-plines n-partial no-EndtoEnd
  4.                               ss2 n na plst na2 vlst j k
  5.                      )
  6.  
  7. ; (acet-autoload '("pljoin.lsp" "(acet-pljoin ss st fuz)"))
  8.  (C:clr_sel)
  9.  
  10.  ;; extract the arguments from the arg list
  11.  (setq lst '(ss fuz ignore no-plines no-partial no-EndtoEnd))
  12.  (setq n 0)
  13.  (repeat (min (length alst) (length lst))
  14.   (set (nth n lst) (nth n alst))
  15.  (setq n (+ n 1));setq
  16.  );repeat
  17.  (setq lst nil)
  18.  
  19.  
  20.  (acet-sysvar-set
  21.   '("highlight" 0
  22.       "ucsicon" 0
  23.     "pickstyle" 0
  24.        "osmode" 0
  25.    )
  26.  )
  27.  
  28.  (if (not no-plines)
  29.      (progn
  30.       ;; Break plines down to individual objects and re-assemble what's left over later
  31.       (setq plst (acet-plines-explode ss)
  32.               ss (car plst)                     ;; new selection set with plines removed and new objects added
  33.             plst (cadr plst)                    ;; data used to re-build the plines later
  34.       );setq
  35.      );progn then ok to optimize plines
  36.  );if
  37.  
  38.  ;; Delete the perfect matches first
  39.  (setq ss2 (acet-ss-remove-dups ss fuz ignore)
  40.         ss (car ss2)
  41.        ss2 (cadr ss2)
  42.  );setq
  43.  (if ss2
  44.      (progn
  45.       ;(command "_.erase" ss2 "")
  46.       (princ (acet-str-format "\n%1 duplicate(s) deleted.\n" (itoa (sslength ss2))))
  47.      );progn then
  48.      (setq ss2 (ssadd));setq else create an empty selection set
  49.  );if
  50.  
  51.  (if (not (and no-partial       ; don't do overlappers and don't do endtoend means exact
  52.                no-endtoend      ; dups only so we're done if both of these are true
  53.           )
  54.      );not
  55.      (progn
  56.       ;;;;;;;;;;(setq vlst (acet-overkill-ss->primitives2 ss 0.0000001 ignore)      **********************************************************
  57.                (setq vlst (my-overk-primitives2 ss tolerance ignore)
  58.                j 0
  59.       );setq then ok to combine at least some parallel segments
  60.      );progn then
  61.  );if
  62.  
  63.  (acet-ui-progress-init "Optimizing objects" (length vlst))
  64.  (setq n 1)
  65.  (foreach lst vlst
  66.    (if (> (length lst) 2)
  67.        (progn
  68.         (if (= 0 (car (car lst)))
  69.             (setq k (my-over2 lst ss2 fuz no-partial no-endtoend)); lines
  70.             (setq k (my-over-arcs2 lst ss2 fuz no-partial no-endtoend)); arcs
  71.         );if
  72.         (setq ss2 (cadr k)
  73.                 k (car k)
  74.                 j (+ j k)
  75.         );setq
  76.         (princ "                                                      ")
  77.         (princ "\r")
  78.         (princ (acet-str-format "%1 object(s) deleted." (itoa j)))
  79.        );progn then more than one object in the list
  80.    );if
  81.   (acet-ui-progress-safe n)
  82.   (setq n (+ n 1));setq
  83.  );foreach list of potential over-lapers
  84.  (acet-ui-progress-done)
  85.  
  86.  (setq na (entlast))
  87.  
  88.  (if (and ss2
  89.           (> (sslength ss2) 0)
  90.      );and
  91.      (acet-ss-entdel ss2) ;then delete this stuff before pline re-build
  92.  );if
  93.  
  94.  (if plst
  95.      (acet-plines-rebuild plst)
  96.  );if
  97.  
  98.  (if (and ss2
  99.           (> (sslength ss2) 0)
  100.      );and
  101.      (progn
  102.       (acet-ss-entdel ss2)                              ;; bring it back and then use erase
  103.       (acet-safe-command T T (list "_.erase" ss2 ""))   ;; so that can be oops'd back
  104.      );progn then
  105.      (acet-ss-clear-prev)
  106.  );if
  107.  
  108.  (acet-sysvar-restore)
  109.  (princ "\n")
  110.  ss2
  111. );defun my-overkill
  112.  
  113.  
  114. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  115.  
  116. ;;
  117. (defun my-over2 ( lst ss2 fuz no-partial no-endtoend /
  118.                                      index m m2 n x na na2 p1 p2 p3 p4 mod j a b e1
  119.                                    )
  120.  
  121.  (setq   a (car lst)
  122.        lst (cdr lst)
  123.          m (nth 1 a)    ;; xy slope
  124.         m2 (nth 3 a)    ;; yz slope
  125.  );setq
  126.  
  127.  ;; if the lines are not vertical then set index x else set it to y
  128.  (cond
  129.   (m (setq index 0))    ;; slope is defined in xy plane so use x coord
  130.   (m2 (setq index 1))   ;; slope is defined in yz plane so use y coord
  131.   (T (setq index 2))    ;; the lines is parallel to the z axis so use the z coord.
  132.  );cond close
  133.  
  134. ;(print a)
  135. ;(print lst)
  136. ;(print index)
  137. ;(getstring "hey")
  138.  
  139.  ;; Get the lines in a left to right configuration
  140.  ;; then sort the list of lines from left to right
  141.  ;;
  142.  (setq lst (mapcar '(lambda ( x / a b )
  143.                       (if (< (nth index (car x))
  144.                              (nth index (cadr x))
  145.                           )
  146.                           (setq a (car x)
  147.                                 b (cadr x)
  148.                           );setq then
  149.                           (setq b (car x)
  150.                                 a (cadr x)
  151.                           );setq else
  152.                       );if
  153.                       (list a b (caddr x))
  154.                     )
  155.                     lst
  156.            );mapcar
  157.        lst (vl-sort lst
  158.                     '(lambda (a b)
  159.                       (< (nth index (car a)) (nth index (car b)))
  160.                      )
  161.            );vl-sort
  162.          x (car lst)
  163.         p1 (car x)
  164.         p2 (cadr x)
  165.         na (caddr x)
  166.          j 0
  167.  );setq
  168.  
  169.  (setq n 1)
  170.  (repeat (- (length lst) 1)
  171.  (setq   x (nth n lst)
  172.         p3 (car x)
  173.         p4 (cadr x)
  174.        na2 (caddr x)
  175.  );setq
  176.  (cond
  177.   ((equal (nth index p3) (nth index p2) fuz)
  178.    (if (not no-endtoend)
  179.        (progn
  180.         (if (> (nth index p4) (nth index p2))
  181.             (setq  p2 p4
  182.                   mod T
  183.             );setq then partial overlap
  184.         );if
  185.         (setq ss2 (ssadd na2 ss2))
  186.         ;(entdel na2)
  187.         (setq j (+ j 1))
  188.        );progn then ok to combine endtoend
  189.    );if
  190.   );cond #1 end to end
  191.  
  192.   ((< (nth index p3) (nth index p2))
  193.    (if (not no-partial)
  194.        (progn
  195.         (if (> (nth index p4) (nth index p2))
  196.             (setq  p2 p4
  197.                   mod T
  198.             );setq then partial overlap
  199.         );if
  200.         (setq ss2 (ssadd na2 ss2))
  201.         ;(entdel na2)
  202.         (setq j (+ j 1))
  203.        );progn then ok to combine partially overlaping objects
  204.    );if
  205.   );cond #2 overlap-age
  206.   (T
  207.    (if mod
  208.        (progn
  209.         (setq e1 (entget na)
  210.               e1 (subst (cons 10 p1) (assoc 10 e1) e1)
  211.               e1 (subst (cons 11 p2) (assoc 11 e1) e1)
  212.         );setq
  213.         (entmod e1)
  214.        );progn then modify the first ent before moving on to the next non-overlaper
  215.    );if
  216.    (setq p1 p3
  217.          p2 p4
  218.          na na2
  219.    );setq
  220.    (setq mod nil)
  221.   );cond #3 no overlap
  222.  );cond close
  223.  (setq n (+ n 1))
  224.  );repeat
  225.  (if mod
  226.      (progn
  227.       (setq e1 (entget na)
  228.             e1 (subst (cons 10 p1) (assoc 10 e1) e1)
  229.             e1 (subst (cons 11 p2) (assoc 11 e1) e1)
  230.       );setq
  231.       (entmod e1)
  232.      );progn then modify
  233.  );if
  234.  
  235.  
  236.  ;; Return the number of objects deleted and the update selection set
  237.  (list j ss2)
  238. );defun my-overkill-resolve-lines
  239.  
  240.  
  241. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  242. ;
  243. ;;
  244. (defun my-over-arcs2 ( lst ss2 fuz no-partial no-endtoend /
  245.                                     index slope n x na na2 a b a2 b2 mod j e1
  246.                                   )
  247.  
  248.  (setq lst (cdr lst)
  249.        lst (mapcar '(lambda ( x / a b )
  250.                       (setq a (acet-angle-format (nth 2 x))
  251.                             b (acet-angle-format (nth 3 x))
  252.                       )
  253.                       (if (<= b a)
  254.                           (setq b (+ b pi pi))
  255.                       );if
  256.                       (list (nth 0 x) (nth 1 x) a b (nth 4 x))
  257.                     )
  258.                     lst
  259.            );mapcar
  260.        lst (vl-sort lst
  261.                     '(lambda (a b)
  262.                       (< (nth 2 a) (nth 2 b))
  263.                      )
  264.            );vl-sort
  265.          x (car lst)
  266.          a (nth 2 x) ;start angle
  267.          b (nth 3 x) ;end angle
  268.         na (nth 4 x)
  269.          j 0
  270.  );setq
  271.  (setq n 1)
  272.  (repeat (- (length lst) 1)
  273.  (setq   x (nth n lst)
  274.         a2 (nth 2 x)
  275.         b2 (nth 3 x)
  276.        na2 (nth 4 x)
  277.  );setq
  278.  
  279.  (cond
  280.   ((equal a2 b 0.00000001)
  281.    (if (not no-endtoend)
  282.        (progn
  283.         (if (> b2 b)
  284.              (setq   b b2
  285.                    mod T
  286.              );setq then
  287.         );if
  288.         (setq ss2 (ssadd na2 ss2))
  289.         ;(entdel na2)
  290.         (setq j (+ j 1))
  291.        );progn ok to combine end to end
  292.    );if
  293.   );cond #1 end to end
  294.  
  295.   ((< a2 b)
  296.    (if (not no-partial)
  297.        (progn
  298.         (if (> b2 b)
  299.             (setq   b b2
  300.                   mod T
  301.             );setq then
  302.         );if
  303.         (setq ss2 (ssadd na2 ss2))
  304.         ;(entdel na2)
  305.         (setq j (+ j 1))
  306.        );progn then ok to combine partial overlap
  307.    );if
  308.   );cond #2 overlap
  309.  
  310.   (T
  311.       (if mod
  312.           (progn
  313.            (setq e1 (entget na))
  314.            (if (acet-angle-equal a b 0.00000001)
  315.                (progn
  316.                 (setq e1 (subst '(0 . "CIRCLE") (assoc 0 e1) e1)
  317.                       e1 (vl-remove (assoc 50 e1) e1)
  318.                       e1 (vl-remove (assoc 51 e1) e1)
  319.                 );setq
  320.                 (while (assoc 100 e1)
  321.                   (setq e1 (vl-remove (assoc 100 e1) e1));setq
  322.                 );while
  323.                 (entmake e1)
  324.                 (entdel na)
  325.                 (setq na (entlast))
  326.                );progn then change it to a circle by entmaking a new circle and deleting the arc
  327.                (progn
  328.                 (setq e1 (subst (cons 50 a) (assoc 50 e1) e1)
  329.                       e1 (subst (cons 51 b) (assoc 51 e1) e1)
  330.                 );setq
  331.                 (entmod e1)
  332.                );progn else just entmod the arc
  333.            );if
  334.           );progn then modify the first ent before moving on to the next non-overlaper
  335.       );if
  336.       (setq  a a2
  337.              b b2
  338.             na na2
  339.       );setq
  340.       (setq mod nil)
  341.   );cond #3 no overlap
  342.  );cond close
  343.  (setq n (+ n 1))
  344.  );repeat
  345.  (if mod
  346.      (progn
  347.       (setq e1 (entget na))
  348.       (if ;;;(acet-angle-equal a b 0.00000001);;********************************************
  349.           (acet-angle-equal a b tolerance)
  350.           (progn
  351.            (setq e1 (subst '(0 . "CIRCLE") (assoc 0 e1) e1)
  352.                  e1 (vl-remove (assoc 50 e1) e1)
  353.                  e1 (vl-remove (assoc 51 e1) e1)
  354.            );setq
  355.            (while (assoc 100 e1)
  356.             (setq e1 (vl-remove (assoc 100 e1) e1));setq
  357.            );while
  358.            (entmake e1)
  359.            (entdel na)
  360.            (setq na (entlast))
  361.           );progn then change it to a circle by entmaking a new circle and deleting the arc
  362.           (progn
  363.            (setq e1 (subst (cons 50 a) (assoc 50 e1) e1)
  364.                  e1 (subst (cons 51 b) (assoc 51 e1) e1)
  365.            );setq
  366.            (entmod e1)
  367.           );progn else just entmod the arc
  368.       );if
  369.      );progn then modify the first ent before moving on to the next non-overlaper
  370.  );if
  371.  
  372.  ;; Return the number of objects deleted and the update selection set
  373.  (list j ss2)
  374. );defun my-overkill-resolve-arcs
  375.  
  376. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  377. (defun my-over-data2 ( e1 fuz genprops / p1 p2 dx dy dz m b m2 b2 xv th )
  378.  
  379.  (setq p1 (cdr (assoc 10 e1))
  380.        p2 (cdr (assoc 11 e1))
  381.        dx (- (car p2) (car p1))
  382.        dy (- (cadr p2) (cadr p1))
  383.        dz (- (caddr p2) (caddr p1))
  384.  );setq
  385.  ;; first get the slope and y intercept in the xy plane.
  386.  (if (and (/= dx 0.0)
  387.           (setq m (/ dy dx))            ;slope
  388.           (< (abs m) 1.0e+010)
  389.      );and
  390.      (progn
  391.       (setq b (- (cadr p1)      ;y-intercept -> b=y-m*x
  392.                  (* m (car p1))
  393.               )
  394.       );setq
  395.      );progn then
  396.      (setq m nil      ;undefined slope
  397.            b (car p1) ;x-intercept
  398.      );setq else
  399.  );if
  400.  ;; Now get the slope and z intercept in a different plane
  401.  (if (and m
  402.           ;;(equal m 0.0 0.00000001)
  403.           (equal m 0.0 tolerance)
  404.      );and
  405.      (progn
  406.       ;; then use the xz plane because the slope is undefined in the yz
  407.       (if (and (/= dx 0.0)
  408.                (setq m2 (/ dz dx))              ;slope
  409.                (< (abs m2) 1.0e+010)
  410.           );and
  411.           (setq b2 (- (caddr p1)        ;z-intercept -> b2=z-m2*x
  412.                       (* m2 (car p1))
  413.                    )
  414.           );setq then
  415.           (setq m2 nil       ;undefined slope
  416.                 b2 (car p1) ;z-intercept
  417.           );setq else
  418.       );if
  419.      );progn then use xz plane
  420.      (progn
  421.       ;; else use yz plane
  422.       (if (and (/= dy 0.0)
  423.                (setq m2 (/ dz dy))              ;slope
  424.                (< (abs m2) 1.0e+010)
  425.           );and
  426.           (setq b2 (- (caddr p1)        ;z-intercept -> b2=z-m2*y
  427.                       (* m2 (cadr p1))
  428.                    )
  429.           );setq then
  430.           (setq m2 nil       ;undefined slope
  431.                 b2 (cadr p1) ;z-intercept
  432.           );setq else
  433.       );if
  434.      );progn else use yz plane
  435.  );if
  436.  (if m
  437.      ;;(setq m (acet-calc-round m 0.00000001))  ;; xy plane slope
  438.        (setq m (acet-calc-round m tolerance))
  439.  );if
  440.  (if m2
  441.    ;;  (setq m2 (acet-calc-round m2 0.00000001))        ;; yz slope
  442.    (setq m2 (acet-calc-round m2 tolerance))
  443.  );if
  444.  (setq  b (acet-calc-round b fuz)                       ;; y intercept
  445.        b2 (acet-calc-round b2 fuz)                      ;; z intercept
  446.  );setq
  447.  (if (setq th (cdr (assoc 39 e1)))
  448.      (setq xv (cdr (assoc 210 e1))
  449.            ;;xv (mapcar '(lambda (x) (acet-calc-round x 0.00000001)) xv)
  450.            xv (mapcar '(lambda (x) (acet-calc-round x tolerance)) xv)
  451.      );setq then it has thickness so we need to bring the extrusion vector along for the ride
  452.  );if
  453.  (if xv
  454.      (list 0 m b m2 b2
  455.            xv
  456.            (my-over-get2 e1 genprops)   ;; general data
  457.      );list
  458.      (list 0 m b m2 b2
  459.            (my-over-get2 e1 genprops)   ;; general data
  460.      );list
  461.  );if
  462. );defun my-overkill-line-data
  463.  
  464. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  465. ;Takes an elist and a list of group codes and returns a list of dotted pairs for that entity.
  466. ;
  467. (defun my-over-get2 ( e1 genprops / a lst )
  468.  (foreach gcode genprops
  469.   (if (not (setq a (assoc gcode e1)))
  470.       (setq a (list gcode))
  471.   );if
  472.   (setq lst (cons a lst))
  473.  );foreach
  474.  lst
  475. );defun my-overkill-gen-prop-get
  476.  
  477. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  478. ;similar to ai_utils version except more precision is allowed for small floating point numbers
  479. (defun my-rtos2 (val / a b units old_dimzin)
  480.   (setq units (getvar "lunits"))
  481.   ;; No fiddling if units are Architectural or Fractional
  482.   (if (or (= units 4) (= units 5))
  483.     (rtos val)
  484.     ;; Otherwise work off trailing zeros
  485.     (progn
  486.       (setq old_dimzin (getvar "dimzin"))
  487.       ;; Turn off bit 8
  488.       (setvar "dimzin" (logand old_dimzin (~ 8)))
  489.       (setq a (rtos val))
  490.       ;; Turn on bit 8
  491.       (setvar "dimzin" (logior old_dimzin 8))
  492.       (setq b (rtos val units 15))
  493.       ;; Restore dimzin
  494.       (setvar "dimzin" old_dimzin)
  495.       ;; Fuzz factor used in equality check.
  496.       (if (equal (distof a) (distof b) 0.00000000000001) a b)
  497.     )
  498.   )
  499. );defun my-rtos2
  500.  
  501. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  502.  
  503. (defun my-overk-primitives2 ( ss fuz ignore /
  504.                                       flt lst gcode genprops n na e1 tp a b gen c d xv
  505.                                       vlst tmp alst lst2 lst3 j len k
  506.                                     )
  507.  
  508.  (acet-ss-clear-prev)
  509.  (command "_.select" ss)
  510.  (while (wcmatch (getvar "cmdnames") "*SELECT*") (command ""))
  511.  (setq flt '((-4 . "<OR")
  512.               (0 . "LINE") (0 . "ARC") (0 . "CIRCLE") (0 . "LWPOLYLINE")
  513.               (-4 . "<AND")
  514.                (0 . "POLYLINE")
  515.               (-4 . "<NOT") (-4 . "&") (70 . 88) (-4 . "NOT>") ;8 16 64 not 3dpoly mesh or pface mesh
  516.               (-4 . "AND>")
  517.              (-4 . "OR>")
  518.             )
  519.         ss (ssget "_p" flt)
  520.  );setq
  521.  (if (not ss)
  522.      (setq ss (ssadd))
  523.  );if
  524.  
  525.  
  526.  ;; build a general props list of group codes the does not include any gcs from the ignore list
  527.  ;; layer       8
  528.  ;; linetype    6
  529.  ;; thickness   39
  530.  ;; color       62
  531.  ;; lweight     370
  532.  ;; plotstyle   390
  533.  
  534.  (setq lst '(8 6 39 62 370 390));setq   ;; general properties
  535.  (foreach gcode lst
  536.   (if (not (member gcode ignore))
  537.       (setq genprops (cons gcode genprops))
  538.   );if
  539.  );foreach
  540.  (setq lst nil)
  541.  
  542.  (setq len (sslength ss)
  543.          k (/ len 5)
  544.          j 1
  545.  )
  546.  (acet-ui-progress-init "Gathering line, arc and circle data " len)
  547.  
  548.  (setq n 0)
  549.  (repeat (sslength ss)
  550.   (setq  na (ssname ss n)
  551.         lst nil
  552.   );setq
  553.  
  554.   (cond
  555.    ((and (setq e1 (entget na)
  556.                tp (cdr (assoc 0 e1))
  557.          );setq
  558.          (= tp "LINE")
  559.     );and
  560.     (setq     a (cdr (assoc 10 e1))
  561.               b (cdr (assoc 11 e1))
  562.             lst (list a b na)
  563.             gen (my-over-data2 e1 fuz genprops)
  564.     );setq
  565.    );cond #1
  566.  
  567.    ((or (= tp "ARC")
  568.         (= tp "CIRCLE")
  569.     );or
  570.     (setq   a (cdr (assoc 50 e1))
  571.             b (cdr (assoc 51 e1))
  572.             c (cdr (assoc 10 e1))                       ;; center
  573.             d (cdr (assoc 40 e1))                       ;; radius
  574.             c (list (acet-calc-round (car c) fuz)
  575.                     (acet-calc-round (cadr c) fuz)
  576.                     (acet-calc-round (caddr c) fuz)
  577.               );list
  578.             d (acet-calc-round d fuz)
  579.            xv (cdr (assoc 210 e1))
  580.            xv (list (acet-calc-round (car xv) 0.00000001)
  581.                     (acet-calc-round (cadr xv) 0.00000001)
  582.                     (acet-calc-round (caddr xv) 0.00000001)
  583.               );list
  584.           gen (list 1                                           ;; arc type
  585.                     c                                           ;; center
  586.                     d                                           ;; radius
  587.                     xv                                          ;; extrusion vector (slightly rounded)
  588.                     (my-over-get2 e1 genprops)  ;; general props
  589.               );list
  590.     );setq
  591.     (if (not a)
  592.         (setq a 0.0
  593.               b (+ pi pi)
  594.         );setq then circle
  595.     );if
  596.     (setq lst (list (cdr (assoc 10 e1))         ;; real center
  597.                     (cdr (assoc 40 e1))         ;; real radius
  598.                     a                           ;; start angle
  599.                     b                           ;; end angle
  600.                     na
  601.               );list
  602.     );setq
  603.    );cond #2
  604.   );cond close
  605.  
  606.   (if (= j k)
  607.       (progn
  608.        (acet-ui-progress-safe (fix (* 0.5 n)))
  609.        (setq j 1)
  610.       );progn then
  611.       (setq j (+ j 1))
  612.   );if
  613.  
  614.   (if lst
  615.       (setq vlst (cons (list gen lst);list
  616.                        vlst
  617.                  );cons
  618.       );setq then
  619.   );if
  620.  (setq n (+ n 1));setq
  621.  );repeat
  622.  
  623.  (setq j (/ len 2));setq
  624.  (acet-ui-progress-safe j)
  625.  
  626.  ;;The approach:
  627.  ;; -split in two: lines and arcs
  628.  ;; for lines:
  629.  ;; -sort by y-intercept
  630.  ;; for arcs:
  631.  ;; - sort by radius
  632.  ;; -lines...
  633.  ;;  - Use a while loop to group the lines with identical y-intercept
  634.  ;;  - Then foreach group use acet-list-group-by-assoc to split into
  635.  ;;    truly unique groups.
  636.  ;;    Assemble the main list along the way using cons for length of 1
  637.  ;;    and append for greater length.
  638.  ;; - arcs...
  639.  ;;   Handle arcs in same as lines but use radius instead of y-int.
  640.  ;;
  641.  
  642.  
  643.  (setq vlst (vl-sort vlst
  644.                      '(lambda ( a b )
  645.                        (> (car (car a)) (car (car b)))  ;0 or 1 (line or arc respectively)
  646.                       )
  647.             )
  648.  );setq
  649.  (while (and (setq a (car vlst))
  650.              (= (car (car a)) 1)
  651.         );and
  652.   (setq alst (cons a alst)
  653.         vlst (cdr vlst)
  654.   );setq
  655.  );while
  656.  
  657.  
  658.  (setq j (+ j (fix (* 0.05 len))))
  659.  (acet-ui-progress-safe j)
  660.  
  661.  (setq vlst (vl-sort vlst                       ;; sort the line list
  662.                      '(lambda ( a b )
  663.                        (setq a (car a)
  664.                              b (car b)
  665.                        )
  666.                        (< (nth 2 a) (nth 2 b))  ;0 slope y-int  
  667.                       )
  668.             )
  669.  );setq
  670.  
  671.  (setq j (+ j (fix (* 0.2 len))))
  672.  (acet-ui-progress-safe j)
  673.  
  674.  (setq alst (vl-sort alst                       ;; sort the arc list
  675.                      '(lambda ( a b )
  676.                        (setq a (car a)
  677.                              b (car b)
  678.                        )
  679.                        (< (nth 2 a) (nth 2 b))  ;1 center radius  
  680.                       )
  681.             )
  682.  );setq
  683.  
  684.  (setq j (+ j (fix (* 0.1 len))))
  685.  (acet-ui-progress-safe j)
  686.  
  687.  (while (setq lst (car vlst))                   ;; group by items that have save y-int
  688.   (setq vlst (cdr vlst)
  689.            a (nth 2 (car lst))  ;y-int
  690.         lst2 (list lst)
  691.   );setq
  692.   (while (and (setq b (car vlst))
  693.               (equal a
  694.                      (nth 2 (car b))
  695.               );equal
  696.          );and
  697.    (setq vlst (cdr vlst)
  698.          lst2 (cons b lst2)
  699.    );setq
  700.   );while
  701.   (setq lst3 (cons lst2 lst3));setq
  702.  );while
  703.  
  704.  (setq j (+ j (fix (* 0.05 len))))
  705.  (acet-ui-progress-safe j)
  706.  
  707.  (setq vlst nil
  708.        lst2 nil
  709.  );setq
  710.  (foreach lst lst3                              ;; for each group of equal y-int, group by identical car
  711.   (setq lst2 (acet-list-group-by-assoc lst))
  712.   (if (equal 1 (length lst2))
  713.       (setq vlst (cons (car lst2) vlst))
  714.       (setq vlst (append lst2 vlst))
  715.   );if
  716.  );foreach
  717.  
  718.  (setq lst3 nil)
  719.  (while (setq lst (car alst))
  720.   (setq alst (cdr alst)
  721.            a (nth 2 (car lst))  ;radius
  722.         lst2 (list lst)
  723.   );setq
  724.   (while (and (setq b (car alst))
  725.               (equal a
  726.                      (nth 2 (car b))
  727.               );equal
  728.          );and
  729.    (setq alst (cdr alst)
  730.          lst2 (cons b lst2)
  731.    );setq
  732.   );while
  733.   (setq lst3 (cons lst2 lst3));setq
  734.  );while
  735.  
  736.  (setq j (+ j (fix (* 0.05 len))))
  737.  (acet-ui-progress-safe j)
  738.  
  739.  (setq alst nil
  740.        lst2 nil
  741.  );setq
  742.  (foreach lst lst3
  743.   (setq lst2 (acet-list-group-by-assoc lst))
  744.   (if (equal 1 (length lst2))
  745.       (setq alst (cons (car lst2) alst))
  746.       (setq alst (append lst2 alst))
  747.   );if
  748.  );foreach
  749.  
  750.  (acet-ui-progress-done)
  751.  
  752.  (append vlst alst)
  753. );defun my-overkill-ss->primitives
  754.  
  755.        
  756. (princ)
  757.  

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

  • ADN OPEN
  • ***
  • Сообщений: 118
  • Карма: 2
Re: Selection sets
« Ответ #20 : 31-01-2020, 13:56:55 »
Примите извинения за его размер... :)

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #21 : 31-01-2020, 14:03:49 »
Импирическим путем понял, что он накапливает наборы. Хотя может я и не прав...
Разбирайся с этим кодом, а не пытайся чистить наборы моим кодом. Тем более, что большинство функций с префиксом (acet-ss-*) - это функции, написанные на ObjectARX и работают с наборами они по-своему.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 118
  • Карма: 2
Re: Selection sets
« Ответ #22 : 31-01-2020, 14:09:18 »
Спасибо!

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

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Selection sets
« Ответ #23 : 31-01-2020, 14:49:56 »
В качестве первого приближения:
my-overk-primitives2 - зачем выбирать набор? Причем дважды - один раз командным методом, второй - через ssget.
Все, что сказано - личное мнение.

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

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

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

  • ADN OPEN
  • ***
  • Сообщений: 118
  • Карма: 2
Re: Selection sets
« Ответ #24 : 31-01-2020, 21:37:01 »
В процессе работы нобходимо узнать, что находится под полилинией.(таких полилиний сотни). При помощи QSelect создаем наборы и их анаилзируем. Однако даже если наборам присваивать одинаковые имена, они накапливатся и Вашим методом не удаяются...
прилагаю лисп

Код - Auto/Visual Lisp [Выбрать]
  1. ;;-------------------------------------------------------------  EntForKontur -------------------------------------------------------------  
  2. ;;    EntForKontur - определяет объекты лежащие полностью под колнтуром
  3.   ;;  Org -  контур определенмия
  4.   ;;  spisLay - список слоев вида :   ((-4 . "<OR") (8 . "CALBLOCK") (8 . "WALL 10") (8 . "WALL 20") (8 . "columns") (-4 . "OR>"))
  5. (defun EntForKontur (Ogr spisLay / lstent1 lstograda ss11 lstSs11 pt1E pt2E pt0E   r ang ang1
  6.                                       ob  pt1aE pt2aE param pt51)
  7.  
  8.  
  9.     (setq obOgrada (vlax-ename->vla-object Ogr ))
  10.                        
  11.     (setq pointsnewECO  (pl-get-coors&width&bulge Ogr)
  12.             pointECO (append (car pointsnewECO) (list (car (car pointsnewECO ))))
  13.             KrivECO (cadr pointsnewECO))
  14.  
  15.  
  16.     (setq lstPost nil)
  17.     (setq    lstEnt1 nil
  18.                lstOgrada nil)
  19.  
  20.     (setq ss11 (ssget "cp" pointEco spisLay))   ;;sekushij
  21.     (setq lstSs11 ( pl:selset-to-enamelist ss11))
  22.   (setq ss11 nil)
  23.   (setq ss11 (ssget "WP" pointEco spisLay))  ;mnogougolnikom
  24.     (setq lstSs22 ( pl:selset-to-enamelist ss11))
  25.   (setq ss11 nil)
  26.  
  27.  
  28.   (foreach item1 lstSS11
  29.       (if (null (member item1 lstss22))
  30.           (setq lstograda (append lstOgrada (list item1)))
  31.       )
  32.   )  
  33. (setq ss11 ni)
  34.  
  35.  (command "HIDEOBJECTS" ogr "")
  36.     (setq lstOgrada1 nil)        
  37.      ;;==================================== выбрать тока те что лежат на контуре или хотябы частично лежат ================================================
  38.     (setq ij 0)
  39.     (foreach item1 lstOgrada
  40.       (if (> ij 6)(setq aa 2))
  41.       (if (and item1 (entget item1)) (progn
  42.       (setq item item1)
  43.       (setq ob (vlax-ename->vla-object item ))
  44.       (if (= (cdr (assoc 0 (entget item))) "LINE")
  45.           (setq pt1a (cdr (assoc 10 (entget item)))
  46.                 pt2a (cdr (assoc 11 (entget item)))
  47.                 pt51 (polar pt1a (angle pt1a pt2a) (/ (distance pt1a pt2a) 2.0)))
  48.  
  49.           (setq pt51 (vlax-curve-getPointAtDist  ob (/ (vlax-curve-getDistAtPoint ob (vlax-curve-getEndPoint ob)) 2.0))
  50.                 pt1a (vlax-curve-getStartPoint  ob)
  51.                 pt2a (vlax-curve-getEndPoint  ob))
  52.          
  53.       );;if    
  54.        
  55.    
  56.       (cond
  57.         ( (= (strcase (cdr (assoc 0 (entget item)))) "LINE")
  58.              (setq pt1a (cdr (assoc 10 (entget item)))
  59.                       pt2a (cdr (assoc 11 (entget item))))
  60.        
  61.           (if (and (equal pt1a (vlax-curve-getclosestpointto Ogr pt1a) 1.0)
  62.                    (equal pt2a (vlax-curve-getclosestpointto Ogr pt2a) 1.0))
  63.               (progn  ;; лежит полностью на ЕСО
  64.                         (setq lstOgrada1 (append   lstOgrada1 (list (list item pt1a pt2a pt51))))
  65.                      
  66.               );;prg лежит полностью на ЕСО
  67.            
  68.               (progn      ;; не лежит полностью на есо
  69.                           (setq obj (entlast)
  70.                                 lstObj nil)
  71.                           ;(BreakObject item Ogr )
  72.                 (if (>= (read (substr (getvar "ACADVER") 1 4)) 23.1)  ;; >=2020
  73.                           (setq lstObj (BreakNew20 item  Ogr))
  74.                           (setq lstObj (BreakNew20 item  Ogr))
  75.                 )
  76.                        (if (null lstObj)(progn
  77.                           ;;Процедура деления примитива item  полилинией Org          
  78.                               (BreakObject item Ogr )        
  79.                               (setq     oo    (entnext obj))
  80.                               (while (not (null oo))
  81.                                    (if (and (/= (cdr (assoc 0 (entget oo))) "ATTRIB")
  82.                                             (/= (cdr (assoc 0 (entget oo))) "SEQEND"))
  83.                                        (setq lstObj (append lstObj (list oo)))
  84.                                    )  
  85.                                    (setq  oo    (entnext oo))
  86.                               );;whil
  87.                               (setq lstObj (append lstObj (list item)))
  88.                            ))
  89.                
  90.                           (foreach it lstobj
  91.                             (setq itt1 it)
  92.                             (if (and itt1 (entget itt1))(progn
  93.                                 (setq pt1a (cdr (assoc 10 (entget itt1)))
  94.                                      pt2a (cdr (assoc 11 (entget itt1))))
  95.                                (command "point" pt1a)
  96.                                (setq ww1 (entlast))
  97.                                (command "point" pt2a)
  98.                                (setq ww2 (entlast))
  99.                                (entdel ww1) (entdel ww2)
  100.                                    
  101.                               (if (and (equal pt1a (vlax-curve-getclosestpointto Ogr pt1a) 1.0)
  102.                                      (equal pt2a (vlax-curve-getclosestpointto Ogr pt2a) 1.0))
  103.                                 (progn  ;; лежит полностью на ЕСО
  104.                                     (setq lstOgrada1 (append   lstOgrada1 (list (list itt1 pt1a pt2a pt51))))
  105.                        
  106.                                 );;prg
  107.                                 (setq lstPost (append lstPost (list itt1)))
  108.                               );;if
  109.                            ));;if
  110.                            
  111.  
  112.                            
  113.                           );;for
  114.               ;       |;
  115.                           (if (and itt1 (entget itt1))(progn
  116.                                 (setq pt1a (cdr (assoc 10 (entget itt1)))
  117.                                       pt2a (cdr (assoc 11 (entget itt1))))
  118.                            
  119.                               (if (and (equal pt1a (vlax-curve-getclosestpointto Ogr pt1a) 1.0)
  120.                                        (equal pt2a (vlax-curve-getclosestpointto Ogr pt2a) 1.0))
  121.                                   (progn  ;; лежит полностью на ЕСО
  122.                                     (setq lstOgrada1 (append   lstOgrada1 (list (list itt1 pt1a pt2a pt51))))
  123.                                  
  124.                                   );;prg
  125.                               );;if    
  126.                              
  127.                              
  128.                           ));;if
  129.                           (setq lstPost (append lstPost  itNo))
  130.  
  131.               );;prg
  132.           );;if  
  133.         );;LINe
  134.         ( (= (strcase (cdr (assoc 0 (entget item)))) "ARC")
  135.           (setq cent (cdr (assoc 10 (entget item)))
  136.                  R (cdr (assoc 40 (entget item))))
  137.           (setq  pt1a (polar cent (cdr (assoc 50 (entget item))) R)
  138.                  pt2a (polar cent (cdr (assoc 51 (entget item))) R)
  139.           )      
  140.            
  141.           (if (and (equal pt1a (vlax-curve-getclosestpointto Ogr pt1a) 0.01)
  142.                    (equal pt2a (vlax-curve-getclosestpointto Ogr pt2a) 0.01))
  143.                  (progn  ;;
  144.                     (setq param (fix (setq par (vlax-curve-getparamatpoint item pt51))))
  145.                     (if (setq info (assoc param lstEnt1))(progn
  146.                         (setq pos (position info lstEnt1))
  147.                         (if (null (member item (cdr info)))
  148.                             (setq   info (append info (list (list  par  item )))
  149.                                     lstEnt1 (lp_changeList lstEnt1  pos Info))
  150.                         );;if  
  151.                         );;prg
  152.                         (setq lstEnt1 (append lstEnt1 (list (list param    (list  par item )))))
  153.                     );;if
  154.                     (setq lstOgrada1 (append   lstOgrada1 (list (list item pt1a pt2a pt51))))
  155.                    ;(setq lstOgrada1 (append   lstOgrada1  (list item)))
  156.            )
  157.            (setq lstPost (append lstPost (list it)))
  158.             );;if
  159.           ;));;if  
  160.         );;arc
  161.         ( T
  162.           (setq lstOgrada1 (append   lstOgrada1 (list (list item pt1a pt2a pt51))))
  163.           ;(setq lstOgrada1 (append   lstOgrada1  (list item)))
  164.         )
  165.       );;cond
  166.       ));if
  167.       (setq ij (1+ ij))
  168.     );;for
  169.     lstOgrada1
  170. );;  end fun  EntForKontur     

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

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Selection sets
« Ответ #25 : 31-01-2020, 22:04:07 »
Советую напрочь забыть про наборы и формировать списки примитивов чисто программно. Это усложнит код раз эдак в дцать, но зато работать будет.
Все, что сказано - личное мнение.

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

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

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

  • ADN OPEN
  • ***
  • Сообщений: 118
  • Карма: 2
Re: Selection sets
« Ответ #26 : 31-01-2020, 22:40:32 »
Да уж, обрадовал...

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

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Selection sets
« Ответ #27 : 31-01-2020, 23:45:41 »
Так что надо в результате? По каким-то хитрым и особым условиям выполнить overkill?
Определить, лежит ли примитив в каком-либо контуре можно и без использования наборов, как мне кажется.
Проблема будет при обработке блоков, но не думаю, что это нерешаемая проблема (можно хоть новый документ создавать, в него копировать элементы, разбивать как хочется - и анализировать результаты. И это всего лишь один из возможных способов).
Может быть, я ошибаюсь - это запросто.
Все, что сказано - личное мнение.

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

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

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

  • ADN OPEN
  • ***
  • Сообщений: 118
  • Карма: 2
Re: Selection sets
« Ответ #28 : 01-02-2020, 09:56:16 »
Ну, и каким способом Вы предлагаете определить, что находится под полилинией или внутри замкнутого контура без QSelect? Точнее без ssget?
« Последнее редактирование: 01-02-2020, 10:46:58 от altver »

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

  • ADN OPEN
  • ***
  • Сообщений: 118
  • Карма: 2
Re: Selection sets
« Ответ #29 : 01-02-2020, 11:07:03 »
По большому счету нужно найти источник незакрытых наборов. Чаще всего это какая-то не вполне корректная lisp-программа, которая не чистит набор.

У меня есть сотня замкнутых контуров (полилнии). В цикле я определяю, каке объекты находятся внутри контура, какие под ним и какие пересекают его. Естественно я создаю наборы (ssget), присваиваю им одно и тоже имя и в каждом цикле я их обнуляю... в этом месте в коде происходит обвал... (exceeded maximum number of selection sets). Что я неправильно длаю? Где ошибаюсь?
 Заранее огромное спасибо!

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

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Selection sets
« Ответ #30 : 01-02-2020, 11:44:59 »
vla-intersectwith покажет пересечения объектов. Проверить вхождение точки объекта внутрь определенной области можно, алгоритмы и их реализации существуют (прошу прощения, но заниматься поиском сейчас не хочу). Проверить совпадение примитивов - сложно, но можно. Проверить совпадение нескольких точек примитивов (при частичном наложении) тоже не особо проблема, как мне кажется.
Другой вопрос, что на больших чертежах плохо реализованный алгоритм будет работать отвратительно.
Я бы, наверное, сначала прошелся по пространству модели, получил все обрабатываемые примитивы, отсортировал их, например, по площади (или по длине - не столь суть важно) по убыванию и проверял - кто с кем и как совпадает, формируя отдельные списки данных. А вот потом уже начнется самое веселье - объединение примитивов, удаление лишних вершин и т.п.
Естественно я создаю наборы (ssget),
ИМХО вот это как раз и неестественно.
Все, что сказано - личное мнение.

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

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

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

  • ADN OPEN
  • ***
  • Сообщений: 118
  • Карма: 2
Re: Selection sets
« Ответ #31 : 01-02-2020, 11:56:39 »
Т.е. ответа на вопрос "почему накапливаются наборы" не существует?

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

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Selection sets
« Ответ #32 : 01-02-2020, 12:06:53 »
У меня - нет.
Все, что сказано - личное мнение.

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

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

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #33 : 01-02-2020, 13:48:52 »
Естественно я создаю наборы (ssget), присваиваю им одно и тоже имя и в каждом цикле я их обнуляю... в этом месте в коде происходит обвал... (exceeded maximum number of selection sets).
Или баг в AutoCAD, или ты их не обнуляешь.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 118
  • Карма: 2
Re: Selection sets
« Ответ #34 : 01-02-2020, 14:13:16 »
Периодически использую этот лтсп (это Ваш лисп), и после использования любого набора ss сразу же обнуляю его вот так (setq SS nil)
Где ошибка? Что я делаю неверно?

Код - Auto/Visual Lisp [Выбрать]
  1. (defun C:CLR_SEL ( / e n w lstt lst acad doc sels)
  2.    
  3.      
  4.     (setq n 0)
  5.  
  6.     (foreach e (atoms-family 0)
  7.        (if (= (type (vl-symbol-value e)) 'PICKSET) (progn
  8.      
  9.           (princ "\n") (princ e)
  10.            (set  e nil)
  11.            (setq n (1+ n))
  12.         ))
  13.        
  14.     );;for
  15.  
  16.     (setq acada (vlax-get-acad-object)
  17.         doc  (vla-get-activedocument acada)
  18.         sels (vla-get-selectionsets doc)
  19.     )
  20.  
  21.     (foreach sel  lst
  22.        (vla-delete sel)
  23.     )  
  24.     (princ "\n clear sets: ") (princ n)
  25.     (gc)
  26.     (princ)
  27.   )


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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #35 : 01-02-2020, 14:18:13 »
altver,
Еще раз:
Или баг в AutoCAD, или ты их не обнуляешь.
Возможно не обнуляются наборы не в твоём коде, а в коде Express Tools, который ты используешь. Мой код чистит только наборы, которые имеют имена в глобальном пространстве имён. Он не может чистить локальные переменные.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Selection sets
« Ответ #36 : 01-02-2020, 14:21:59 »
Александр Ривилис, а для vla-get-selectionsets точно надо foreach использовать, а не vlax-for? Проверял примерно таким кодом:
Код - Auto/Visual Lisp [Выбрать]
  1. (defun t1 ()
  2.   (setq i 0)
  3.   (repeat 5
  4.     (vla-add (vla-get-selectionsets (vla-get-activedocument (vlax-get-acad-object)))
  5.              (strcat "SelSet" (itoa (setq i (1+ i))))
  6.              ) ;_ end of vla-add
  7.     ) ;_ end of repeat
  8.   ) ;_ end of defun
  9. (defun t2 ()
  10.   (setq selset_coll (vla-get-selectionsets (vla-get-activedocument (vlax-get-acad-object))))
  11.   (princ (strcat "\nSelectionSets:" (itoa (vla-get-count selset_coll))))
  12.   (vlax-for item selset_coll (princ (strcat "\nSelset Name " (vla-get-name item))) (vla-delete item))
  13.   (princ)
  14.   ) ;_ end of defun
Все, что сказано - личное мнение.

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

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

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

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Selection sets
« Ответ #37 : 01-02-2020, 14:23:42 »
altver, в приведенном тобой коде не выполняется проход по SelectionSets, сформированных через ActiveX, насколько я вижу.
Все, что сказано - личное мнение.

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

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

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

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Selection sets
« Ответ #38 : 01-02-2020, 14:24:59 »
Блин, только сейчас посмотрел на исходник кода... altver, у тебя код отличается от исходника.
Все, что сказано - личное мнение.

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

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

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

  • ADN OPEN
  • ***
  • Сообщений: 118
  • Карма: 2
Re: Selection sets
« Ответ #39 : 01-02-2020, 14:33:21 »
Я очень извиняюсь! Поспешил...
Вот код, который я использую.

Код - Auto/Visual Lisp [Выбрать]
  1. (defun C:CLR_SEL ( / e n w lstt lst acad doc sels)
  2.    
  3.    
  4.  
  5.     (setq n 0)
  6.  
  7.     (foreach e (atoms-family 0)
  8.        (if (= (type (vl-symbol-value e)) 'PICKSET) (progn
  9.      
  10.           (princ "\n") (princ e)
  11.            (set  e nil)
  12.            (setq n (1+ n))
  13.         ))
  14.        
  15.     );;for
  16.  
  17.     (setq acada (vlax-get-acad-object)
  18.         doc  (vla-get-activedocument acada)
  19.         sels (vla-get-selectionsets doc)
  20.     )
  21.  
  22.    (vlax-for sel sels (vla-clear sel))
  23.  
  24.     (princ "\n clear sets: ") (princ n)
  25.     (gc)
  26.     (princ)
  27.   )

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

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

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

  • ADN OPEN
  • ***
  • Сообщений: 118
  • Карма: 2
Re: Selection sets
« Ответ #41 : 01-02-2020, 14:55:06 »
Я заменил на (vlax-for sel sels (vla-delete sel)), но все равно не работает...

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #42 : 01-02-2020, 14:57:41 »
Я заменил на (vlax-for sel sels (vla-delete sel)), но все равно не работает...
В принципе, так как в приведенном тобой коде ты не работаешь с SelectionSet через ActiveX, то оно и не могло помочь.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 118
  • Карма: 2
Re: Selection sets
« Ответ #43 : 01-02-2020, 15:01:23 »
Как не работаю? А это разве не через ActiveX?

Код - Auto/Visual Lisp [Выбрать]
  1. (setq acada (vlax-get-acad-object)
  2.         doc  (vla-get-activedocument acada)
  3.         sels (vla-get-selectionsets doc)
  4.     )
  5.  
  6.    (vlax-for sel sels (vla-clear sel))

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #44 : 01-02-2020, 15:04:51 »
Как не работаю? А это разве не через ActiveX?
Это код очистки, а не основной код. Он не имеет отношения к твоим проблемам.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Selection sets
« Ответ #45 : 01-02-2020, 15:05:57 »
altver, vla-clear очищает, но не удаляет набор.
Все, что сказано - личное мнение.

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

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

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

  • ADN OPEN
  • ***
  • Сообщений: 118
  • Карма: 2
Re: Selection sets
« Ответ #46 : 01-02-2020, 15:17:45 »
Это код очистки, а не основной код. Он не имеет отношения к твоим проблемам.


в основном коде я делаю например 
(setq ssetPo (ssget "_X" (list (cons 8  "StrojTemp"))))
Потом использую этот набор и сразу же делаю (setq ssetPo nil)

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

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Selection sets
« Ответ #47 : 01-02-2020, 16:37:08 »
Мне уже становится любопытно :)
Образец файла dwg в студию и какую функцию из #24 запускаешь :)
Все, что сказано - личное мнение.

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

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

Оффлайн SergLPN

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Selection sets
« Ответ #48 : 03-02-2020, 23:04:29 »
Доброе время суток!
Я формирую набор в ActiveX. В конце программы я удаляю объекты.
Но в процессе выполнения большой программы все равно возникает ошибка "Превыщшено
 максимальное количество наборов"
Что я делаю не так? Почему не удаляются наборы? Почему переполняетя кроличество
 наборов?
Код - Auto/Visual Lisp [Выбрать]
  1. (defun selSetPolygon ( /  )
  2.      (vl-load-com)
  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.  
  8.     (setq ptlist (list  (getpoint) (getpoint)  (getpoint)  (getpoint)))
  9.     (setq ptlist (apply 'append ptlist))
  10.     (if (= (rem (length ptlist) 3) 0)
  11.         (progn
  12.           (setq  tmp (vlax-make-safearray    vlax-vbDouble     (cons 0 (- (length ptlist) 1))  )     )
  13.           (vlax-safearray-fill tmp ptlist)
  14.        )
  15.    );;if
  16.    (vla-SelectByPolygon Nset acSelectionSetCrossingPolygon tmp )
  17.    (setq ret nil)
  18.    (setq ii 0)
  19.    (repeat (vla-get-count Nset)
  20.          (setq item (vla-item Nset ii))
  21.          (setq ret (append ret (list (vlax-vla-object->ename item))))
  22.          (setq ii (1+ ii))
  23.   );;ret
  24.   (vla-clear (vla-item Ssets "SS1"))
  25.   (vla-delete (vla-item Ssets "SS1"))
  26.   ret  )

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #49 : 03-02-2020, 23:32:52 »
А если вместо
Код - Auto/Visual Lisp [Выбрать]
  1. (vla-clear (vla-item Ssets "SS1"))
  2. (vla-delete (vla-item Ssets "SS1"))
использовать
Код - Auto/Visual Lisp [Выбрать]
  1. (vla-delete nSet)
?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн SergLPN

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Selection sets
« Ответ #50 : 07-02-2020, 17:10:55 »
Доброе время суток!
Я в просессе выполнения больщой программы  неоднократно формирую  наборы в ActiveX с помощью такого
 лиспа.

Код - Auto/Visual Lisp [Выбрать]
  1. (defun selSetPolygon (Typ Points   / acadObj doc one  lsts kol a lstSB )
  2.      (vl-load-com)
  3.      (setq acadObj (vlax-get-acad-object))
  4.      (setq doc (vla-get-ActiveDocument acadObj  ))
  5.      (setq sets (vla-get-SelectionSets doc))
  6.  
  7.      (If (> (vla-get-count sets )  0)
  8.          (vla-delete (vla-item sets "SS1"))
  9.      )  
  10.  
  11.      (setq Nset (vla-Add sets "SS1"))
  12.      (cond
  13.         ( (= Typ "F")
  14.           (setq REgim acSelectionSetFence)
  15.         )
  16.         ( (= Typ "CP")
  17.           (setq REgim acSelectionSetCrossingPolygon)
  18.         )
  19.         ( (= Typ "WP")
  20.           (setq REgim acSelectionSetWindowPolygon)
  21.         )
  22.      )    
  23.    
  24.      (setq ptlist nil)
  25.      (if Points (progn
  26.         (setq pt (car Points))
  27.         (setq ptlist (cons pt ptlist))
  28.         (foreach pt (cdr Points)
  29.             (setq ptlist (cons pt ptlist))
  30.         );for
  31.         (setq ptlist (apply 'append ptlist))
  32.         (if (= (rem (length ptlist) 3) 0)
  33.             (progn
  34.                (setq  tmp (vlax-make-safearray    vlax-vbDouble     (cons 0 (- (length ptlist) 1))  )     )
  35.                 (vlax-safearray-fill tmp ptlist)
  36.             );;prg
  37.            (setq tmp nil)
  38.         );;if
  39.       );;pg
  40.     ) ;;if
  41.      (vla-SelectByPolygon Nset Regim tmp )
  42.      (setq ret nil  ii 0)
  43.      (repeat (vla-get-count Nset)
  44.          (setq item (vla-item Nset ii))
  45.          (setq ret (append ret (list (vlax-vla-object->ename item))))
  46.          (setq ii (1+ ii))
  47.    );;ret
  48.      (vla-Delete Nset)
  49.      ret  
  50. )
  51.  
В конце программы я делаю UNDO  в начало. И этот лисп перестает работать.
Выдает ошибку "Automation Error. Description was not provided."
Однако,если сохранить чертеж,перегрузить его и запустить программу с того
места чертежа, где получил вышеуказанную ошибку,то ошибки нет.
Почему это протсходит? Что произошло с ActiveX в акаде?
(Работаю в Avtocad 2020)

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #51 : 07-02-2020, 17:14:02 »
Выдает ошибку "Automation Error. Description was not provided."
На какой строке кода?
P.S.: По большому счету в этом коде совершенно не нужен COM/ActiveX. Есть функции (ssget) (sslength) (ssname) ...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн SergLPN

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Selection sets
« Ответ #52 : 07-02-2020, 20:06:05 »
При использовании функции (ssget)  у меня возникает ошибка
"exceeded maximum number of selection sets", и оказывается ,
 что есть проблема очистки наборов. Поэтому я использую com/ActiveX>,
к тому же я тут же удаляю набор.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #53 : 07-02-2020, 20:24:56 »
SergLPN,
Ошибка не в приведённом тобой коде. Это где-то глубже.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн SergLPN

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Selection sets
« Ответ #54 : 09-02-2020, 17:33:30 »
Доброе время суток!
Помогите разобратся. Неоднократно формирую  наборы с помощью комнды,возможно с фильтрами
Код - Auto/Visual Lisp [Выбрать]
  1. (setq ss (ssget))
  и тут же делаю
Код - Auto/Visual Lisp [Выбрать]
  1. (setq ss nil)
Кажется соблюдаю все провила обработки наборов. Но в процессе  впыполнения
большого лиспа Автокад выдает ошибку ""exceeded maximum number of selection sets""
связанную с превышением количества наборов 128. Постороних лиспов не использую.
Как избежать такой ошибки, как уменьшить количество наборов?
(Работаю в Avtocad 2020)
Благодарен за любую помощь.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #55 : 09-02-2020, 17:45:43 »
Совершенно нормальный код, если так. Если не было прерывания выполнения команды без очистки набора...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #56 : 09-02-2020, 17:47:58 »
(Работаю в Avtocad 2020)
Такой программы не знаю. Знаю AutoCAD.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #57 : 09-02-2020, 17:54:11 »
Вообще тема создана 15 лет назад: https://www.caduser.ru/forum/topic17828.html
За это время ничего нового не появилось.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн SergLPN

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Selection sets
« Ответ #58 : 09-02-2020, 18:02:02 »
Извините за "Avtocad" . Очистки набора, если вы имеете ввиду
Код - Auto/Visual Lisp [Выбрать]
  1. (setq ss nil)
, у меня происходит через 1-3 строки после создания набора. Так эта очистка достаточна для НЕ увеличения количества наборов?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #59 : 09-02-2020, 18:35:32 »
Так эта очистка достаточна для НЕ увеличения количества наборов?
Вполне. если какой-нибудь другой код не создаёт наборы (не обязательно ваш, но используемый в вашей программе).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн 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?

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

  • 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 видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 118
  • Карма: 2
Re: Selection sets
« Ответ #90 : 02-03-2020, 17:46:03 »
Факт, программа зарботала прекрасно!  Переполнея наборов нет! 

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

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

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

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Selection sets
« Ответ #92 : 02-03-2020, 21:03:18 »
Проблему решили след. образом:
после того, как проверили\перепроверили всю программу и все сторонние модули  (в местах, где было возможно отказаться от (ssget)-отказались и переделали) и не поучили никакого положительного результата стали методом "тыка" проверять команды одну за другой. И нашли! Оказывается, что комада _hideobjects создат наборы, которые невозможно ни проследить ни обнулить... Причем, если изолировать списком, то кажый объект это один дополнительный набор, а т.к. программа изолирует много объектов, то и присходило превышение 128-и наборов.
Решили просто: объекты переводим в особый слой и этот слой гасим...
Очень надеемся, что наш опыт поможет кому-либо.
Всем огромное спасибо!
Быть того не может! Как же она в таком случае может изолировать овердофига объектов? Только что проверил - больше 1500 отрезков отработаны корректно.
Может, все же передавались аргументы в команду не совсем корректно? И вообще, зачем было ее использовать? Не проще ли было поменять свойство Visible для примитивов (ну или 60, кажется, DXF-код)?
Все, что сказано - личное мнение.

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

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

Оффлайн Lemieux

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
Re: Selection sets
« Ответ #93 : 05-03-2020, 14:30:53 »
Советую напрочь забыть про наборы и формировать списки примитивов чисто программно. Это усложнит код раз эдак в дцать, но зато работать будет.
А как можно формировать код программно? Допустим у меня имеется линия и над ней текст. Как мне получить доступ к тексту, зная координаты линии, но при этом не использовать наборы?

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

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Selection sets
« Ответ #94 : 05-03-2020, 14:49:47 »
Во-первых, я говорил не о формировании кода программно :)
Во-вторых, что значит "над"? Z другая? Линия горизонтально с Y= (например) 100, а точка вставки текста (кстати, какого текста - однострочного? Многострочного?) равна 105?
Все, что сказано - личное мнение.

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

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

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #95 : 05-03-2020, 14:50:15 »
Как мне получить доступ к тексту, зная координаты линии, но при этом не использовать наборы?
Придется (если не использовать наборы) пройтись по всем текстам в чертеже и найти ближайший к линии.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Selection sets
« Ответ #96 : 05-03-2020, 14:52:36 »
Это если не выяснится, что объект текста тупо пересекается отрезком :)
Все, что сказано - личное мнение.

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

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

Оффлайн Lemieux

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
Re: Selection sets
« Ответ #97 : 05-03-2020, 15:09:35 »
Линия горизонтально с Y= (например) 100, а точка вставки текста (кстати, какого текста - однострочного? Многострочного?) равна 105?
Алексей, Вы верно меня поняли. Речь идёт о 2D пространстве.

Придется (если не использовать наборы) пройтись по всем текстам в чертеже и найти ближайший к линии.
А это разве будет не медленнее чем использовать набор с фильтром?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #98 : 05-03-2020, 15:44:13 »
А это разве будет не медленнее чем использовать набор с фильтром?
Будет медленнее. Но если область с текстом за пределами экрана, то фильтр типа (ssget "_C" ...) не сработает.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Lemieux

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
Re: Selection sets
« Ответ #99 : 05-03-2020, 15:49:29 »
Но если область с текстом за пределами экрана, то фильтр типа (ssget "_C" ...) не сработает.
Эту особенность наборов я знаю, как и особенность когда слишком сильно удаляешь, то флаг "_C" не работает корректно. Указываешь одни координаты, а выбирает как карта ляжет. Приходится пользоваться "_CP".
А как дела обстоят с этим на .NET?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #100 : 05-03-2020, 16:16:43 »
А как дела обстоят с этим на .NET?
С этим точно так же - отбор примитивов проходит по одной и той же схеме и в .NET и в ObjectARX и в VisualLisp.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Lemieux

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
Re: Selection sets
« Ответ #101 : 05-03-2020, 16:19:50 »
А как дела обстоят с этим на .NET?
С этим точно так же - отбор примитивов проходит по одной и той же схеме и в .NET и в ObjectARX и в VisualLisp.
То есть для скорости лучше делать так?
1. Zoom:Extends
2. Использовать SSet.
3. Делать то, что нужно.
4. Удалять SSet.
5. Возвращать зум к исходному значению.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Selection sets
« Ответ #102 : 05-03-2020, 16:22:02 »
То есть для скорости лучше делать так?
1. Zoom:Extends
2. Использовать SSet.
3. Делать то, что нужно.
4. Удалять SSet.
5. Возвращать зум к исходному значению.
Это далеко не всегда будет самый быстрый способ, так как возможная регенерация чертежа можсть съесть всю выгоду от наборов.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Selection sets
« Ответ #103 : 05-03-2020, 16:23:46 »
А как дела обстоят с этим на .NET?
С этим точно так же - отбор примитивов проходит по одной и той же схеме и в .NET и в ObjectARX и в VisualLisp.
То есть для скорости лучше делать так?
1. Zoom:Extends
2. Использовать SSet.
3. Делать то, что нужно.
4. Удалять SSet.
5. Возвращать зум к исходному значению.
ИМХО все зависит от частоты подобных "поисков" и реализации алгоритма. А заодно и тонкостей критерия "что-то над чем-то".
Все, что сказано - личное мнение.

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

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

Оффлайн Lemieux

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
Re: Selection sets
« Ответ #104 : 05-03-2020, 16:24:38 »
То есть для скорости лучше делать так?
1. Zoom:Extends
2. Использовать SSet.
3. Делать то, что нужно.
4. Удалять SSet.
5. Возвращать зум к исходному значению.
Это далеко не всегда будет самый быстрый способ, так как возможная регенерация чертежа можсть съесть всю выгоду от наборов.
В будущем попробую реализовать метод перебора.