Тема: Отмена выделенных объектов

Как выполнить сброс текущих выделенных объектов? Т.е. пользователь натыкал объектов (они выделились - отображаются пунктировм с грип точками), теперь программно я хочу это выделение снять.

Re: Отмена выделенных объектов

acedSSSetFirst(NULL, NULL);

Re: Отмена выделенных объектов

А ты не пробовал послать код "Esc" ?
acDocManager->sendStringToExecute(acDocManager->curDocument(), "\x3", false, true, false);

Re: Отмена выделенных объектов

По-моему, проще использовать acedSSSetFirst(NULL,NULL). Только для того, чтобы это работало, нужно, чтобы команда была с флагами ACRX_CMD_USEPICKSET и ACRX_CMD_REDRAW.

Re: Отмена выделенных объектов

Да как и любая проблема все решается.
просто была такая фишка - выделяю объект на экране. После этого вызываю свою команду в которой выделенный обект удаляется через erase(true).
Все бы хорошо и работает и удаляется. Но как всегда и бывает есть подводный камушек - если выделить два объекта, убить только один, то на экране остается один объект выделенный, второй эрейзица. Если оставшийся объект потащить (move), то Акад умирает с предсметным воплем что "обжект воз эразед" т.к. в мозгах акада этот объект остался в селекшен сете.
Решением является убивать все объекты не ручками, а вызовом метода acdbEntDel (правда приходится дополнительно тоже сделать ряд ритуальных танцев), в этом случае селекшен сет можно не отменять.

Re: Отмена выделенных объектов

Определяем реактор

(Setq *change-layout*
       (VLR-Miscellaneous-Reactor
     "Change Layout"
     '((:vlr-layoutswitched . change-layout))
       )
)

Непосредственно сама функция обработки

(defun change-layout
             (a Layout_Name / Vla_layers vla_layer Layer_name)
  (Setq    Layout_Name (car Layout_Name)
    Vla_layers
            (vla-get-Layers
              (vla-get-ActiveDocument (vlax-get-acad-object))
            )
  )
  (vlax-for vla_layer Vla_layers
    (setq Layer_name (vla-get-name vla_layer))
    (If    (equal (substr Layer_name 1 17) "Program_sections_")
      (Progn
      (If (equal (substr Layer_name 18) Layout_Name)
    (vl-catch-all-apply
      'vlax-put-property
      (list vla_layer 'LayerOn :vlax-True)
    )
    (vl-catch-all-apply
      'vlax-put-property
      (list vla_layer 'LayerOn :vlax-false)
    )
      )
      )
    )
  )
)

В моём случае я принял, что если слой называется   Program_sections_Layout_Name - то этот слой нужно включать на листе с названием Layout_Name, а все остальные слои, название которых начинается на Program_sections_ - выключать.
Например, если у нас есть 3 листа: "1", "2", "3"
И 4 слоя: "Program_sections_1", "Program_sections_2", "Program_sections_3", "Program_sections_4",
то слой "Program_sections_1" будет включен на листе "1"
"Program_sections_2" будет включен на листе "2"
"Program_sections_3" будет включен на листе "3"
, а слой "Program_sections_4" нигде включатся не будет.