Тема: Отмена выделенных объектов
Как выполнить сброс текущих выделенных объектов? Т.е. пользователь натыкал объектов (они выделились - отображаются пунктировм с грип точками), теперь программно я хочу это выделение снять.
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → ObjectARX → Отмена выделенных объектов
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Как выполнить сброс текущих выделенных объектов? Т.е. пользователь натыкал объектов (они выделились - отображаются пунктировм с грип точками), теперь программно я хочу это выделение снять.
А ты не пробовал послать код "Esc" ?
acDocManager->sendStringToExecute(acDocManager->curDocument(), "\x3", false, true, false);
По-моему, проще использовать acedSSSetFirst(NULL,NULL). Только для того, чтобы это работало, нужно, чтобы команда была с флагами ACRX_CMD_USEPICKSET и ACRX_CMD_REDRAW.
Да как и любая проблема все решается.
просто была такая фишка - выделяю объект на экране. После этого вызываю свою команду в которой выделенный обект удаляется через erase(true).
Все бы хорошо и работает и удаляется. Но как всегда и бывает есть подводный камушек - если выделить два объекта, убить только один, то на экране остается один объект выделенный, второй эрейзица. Если оставшийся объект потащить (move), то Акад умирает с предсметным воплем что "обжект воз эразед" т.к. в мозгах акада этот объект остался в селекшен сете.
Решением является убивать все объекты не ручками, а вызовом метода acdbEntDel (правда приходится дополнительно тоже сделать ряд ритуальных танцев), в этом случае селекшен сет можно не отменять.
Определяем реактор
(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" нигде включатся не будет.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → ObjectARX → Отмена выделенных объектов
Форум работает на PunBB, при поддержке Informer Technologies, Inc