Тема: проверка наличия SelectioSet
Как можно проверить имелись ли выделенные объекты на чертеже в момент запуска функции? Почему-то в (vla-get-count(vla-get-SelectionSets *activedoc*)) все время одинаковое значение о_О
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → LISP → проверка наличия SelectioSet
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Как можно проверить имелись ли выделенные объекты на чертеже в момент запуска функции? Почему-то в (vla-get-count(vla-get-SelectionSets *activedoc*)) все время одинаковое значение о_О
(ssget "_I") тоже возвращает одно и то же?
Нужно предварительно проверять таким образом
(setq adoc (vla-get-activedocument (setq acapp (vlax-get-acad-object)))) (setq axsets (vla-get-SelectionSets adoc)) (if (not (zerop (vla-get-count axsets))) ;;delete SelectionSets (vlax-for axss axsets (vl-catch-all-apply 'vla-delete (list axss))) ) ;; check nuber of ssets (alert (strcat "Number Of SelectionSets is: " (itoa(vla-get-count axsets)))) ;; then, add pickfirst selectionset (setq pfs (vla-get-pickfirstselectionset adoc)) ;; check again (vlax-for axss axsets (vl-catch-all-apply 'vla-get-name (list axss))) (alert (strcat "Number Of SelectionSets is: " (itoa(vla-get-count axsets)))) ;; clear selectionset (if pfs (vla-clear pfs)) ;; ds,bhftv xtuj yb,elm yf 'rhfyt ;; select some objects on screen (vla-selectonscreen pfs nil nil) ;; check what is selected: (if (not (zerop (vla-get-count pfs))) (vlax-for obj pfs (princ (strcat "\n" (vla-get-objectname obj)))))
fixo, работает очень криво. Да, у вас axss не определен. То есть смысл в том, чтобы удалить все SelectionSet из SelectionSets и то, что останется будет выбранными объектами? Я правильно понял?
(ssget "_I") тоже возвращает одно и то же?
:D
А слона то я и не заметил! Совершенно забыл, что у ssget есть этот параметр! Все отлично работает!
+
Command: (ssgetfirst)
(nil <Selection set: f>)
- есть выделенные объекты
Command: (ssgetfirst)
(nil nil)
- нет выделенных объектов
fixo,
(vlax-for axss axsets (vl-catch-all-apply 'vla-delete (list axss))) )
Чистит SelectionSets, но заканчивается ошибкой:
error: Exception occurred: 0xC0000005 (Access Violation)
fixo, работает очень криво. Да, у вас axss не определен. То есть смысл в том, чтобы удалить все SelectionSet из SelectionSets и то, что останется будет выбранными объектами? Я правильно понял?
Извини упустил эту ветку из вида,
Код написан наспех без проверки
Надежней проверять количество наборов в чертеже
чтобы не превышать общее число выше 127 это факт
Для теста:
;;______________________________________________________________________;; (defun C:stest(/ *error* adoc axsets axss cnt itemset nmb num obj_count pfs setname) (defun *error* (s) ;|(vl-bt)|; (if s (princ s)(princ "\nMy bad...")) ) (setq adoc (vla-get-activedocument (vlax-get-acad-object))) (setq axsets (vla-get-SelectionSets adoc)) (setq num 0 cnt (- (vla-get-count axsets) 2));<-- PICKFIRST (1) & CURRENT (2) are already exist (repeat cnt (if (not (vl-catch-all-error-p(setq axss (vla-item axsets num))))(progn (if (vlax-method-applicable-p axss 'delete)(progn (vl-catch-all-apply 'vlax-invoke-method (list axss 'delete))(setq axss nil)))) (setq num (1+ num) ) ) ) (setq cnt 0) (while (< (vla-get-count axsets) 127) (setq axss (vl-catch-all-apply 'vlax-invoke-method (list axsets 'add (strcat "$Select_" (itoa(setq cnt (1+ cnt))))))) (vl-catch-all-apply 'vlax-invoke-method (list axss 'select acselectionsetall nil nil )) ) (alert (strcat "Number Of Created SelectionSets is: " (itoa(vla-get-count axsets)))) (setq obj_count 0) (vlax-for axss axsets (setq obj_count (+ obj_count (vl-catch-all-apply 'vla-get-count (list axss)))) ) (alert (strcat "Number Of All Selected objects are: " (itoa obj_count))) (setq num 0 cnt (- (vla-get-count axsets) 2)) (repeat cnt (if (not (vl-catch-all-error-p(setq axss (vla-item axsets num))))(progn (if (vlax-method-applicable-p axss 'delete)(progn (vl-catch-all-apply 'vlax-invoke-method (list axss 'delete))(setq axss nil)))) (setq num (1+ num) ) ) ) (alert (strcat "Number Of SelectionSets is: " (itoa(vla-get-count axsets)))) ;; check what is selected: (setq obj_count 0) (vlax-for axss axsets (setq obj_count (+ obj_count (vl-catch-all-apply 'vla-get-count (list axss)))) ) (alert (strcat "Number Of All Selected objects are: " (itoa obj_count))) (setq pfs (vla-get-pickfirstselectionset adoc)) (vl-catch-all-apply 'vlax-invoke-method (list pfs 'select acselectionsetall nil nil )) (alert (strcat "Number Of Selected objects in PICKFIRST are: " (itoa(vla-get-count pfs)))) ;; check what is selected: (if (not (zerop (vla-get-count pfs))) (vlax-for obj pfs (princ (strcat "\n" (vla-get-objectname obj)))) ) (alert (strcat "Now Number Of SelectionSets in Drawing is: " (itoa(vla-get-count axsets)))) (vlax-release-object axsets) (princ) ) (or (vl-load-com)(princ)) ;;______________________________________________________________________;;
Можешь теперь самостоятельно проверить имена наборов которые остаются
в рисунке, еще нужно иметь в виду значения PICKADD, PICKFIRST,
попробуй их тоже менять, обычно я ставлю у себя по единице
Успехов
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → LISP → проверка наличия SelectioSet
Форум работает на PunBB, при поддержке Informer Technologies, Inc