Тема: проверка наличия SelectioSet

Как можно проверить имелись ли выделенные объекты на чертеже в момент запуска функции? Почему-то в (vla-get-count(vla-get-SelectionSets *activedoc*)) все время одинаковое значение о_О

Re: проверка наличия SelectioSet

(ssget "_I") тоже возвращает одно и то же?

Re: проверка наличия SelectioSet

Нужно предварительно проверять таким образом

(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)))))

Re: проверка наличия SelectioSet

fixo, работает очень криво. Да, у вас axss не определен. То есть смысл в том, чтобы удалить все SelectionSet из SelectionSets и то, что останется будет выбранными объектами? Я правильно понял?

(изменено: ghost, 22 апреля 2013г. 16:48:32)

Re: проверка наличия SelectioSet

Кулик Алексей aka kpblc пишет:

(ssget "_I") тоже возвращает одно и то же?

  :D
А слона то я и не заметил! Совершенно забыл, что у ssget есть этот параметр! Все отлично работает!

(изменено: Yuriy, 23 апреля 2013г. 09:02:42)

Re: проверка наличия SelectioSet

+

Command: (ssgetfirst)
(nil <Selection set: f>)
- есть выделенные объекты


Command: (ssgetfirst)
(nil nil)
- нет выделенных объектов

(изменено: Anatoly, 27 мая 2013г. 00:18:35)

Re: проверка наличия SelectioSet

fixo,

(vlax-for axss axsets
  (vl-catch-all-apply 'vla-delete (list axss)))  
  ) 

Чистит SelectionSets, но заканчивается ошибкой:
error: Exception occurred: 0xC0000005 (Access Violation)

(изменено: fixo, 28 мая 2013г. 10:23:00)

Re: проверка наличия SelectioSet

ghost пишет:

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,
попробуй их тоже менять, обычно я ставлю у себя по единице
Успехов