Как сделать чтобы после ВКЛЮЧЕНИЯ слоев по фильтру этот фильтр применялся в существующем падающем меню "Слои"?
Я пока на этот вопрос тоже не нашел ответа :(
Включение All Used Layers
И на этот тоже :((
тк кнопок много(уже 6, а будет больше ;))
Модифицировал ф-цию layer-filters-status-change, чтобы могла принимать список фильтров для изменения. Плюс добавилась команда LFSC для запроса фильтров в командной строке (если они короткие, чтобы не плодить кнопки.)
Действие ф-ции не изменилось: Если хотя бы один слой группового фильтра выключен, то слои фильтра (ов) включаются
Сам код
;|=====================================================================================
* Ф-ция layer-filters-status-change
* На основе https://www.caduser.ru/forum/topic1194.html
* Для https://www.caduser.ru/forum/topic20414.html
* Arguments [Type]:
lstnames = String — имя группового фильтра. Например "ONOFF"
Строка имен групповых фильтров, разделенных <,>
Например "ONOFF,AT" или "AT*"
или
lstnames = List of String - список имен групповых слоевю Например ("ONOFF" "AT")
* Возвращает [Type]:
nil
* Принцип работы
* Если хотя бы один слой группового фильтра выключен, то слои фильтра (ов) включаются
=======================================================================================|;
(defun layer-filters-status-change
(lstnames / vla:lrs vla:xdic vla:dic vla:spsc name datatype datavalue onoff sps)
(defun massoc (key alist / x nlist)(foreach x alist
(if (eq key (car x))(setq nlist (cons (cdr x) nlist))))(reverse nlist))
(vl-load-com)(if (= (type lstnames) 'STR)(setq lstnames (list lstnames)))
(if (= (type lstnames) 'LIST)(setq lstnames(apply 'strcat(mapcar '(lambda(x)(strcase(strcat x ","))) lstnames))))
(setq vla:lrs (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))))
(if (= (vla-get-hasextensiondictionary vla:lrs) :vlax-true)
;; при наличии словаря требуется детальная проверка
(progn (setq vla:xdic (vla-getextensiondictionary vla:lrs))
(setq vla:dic nil)
;; поиск фильтров версии 2005
(if (progn (vlax-for item vla:xdic
(if (= (vla-get-name item) "ACLYDICTIONARY")(setq vla:dic item))) ;_ vlax-for
vla:dic) ;_ progn
(progn (vlax-for vla:spsc vla:dic (if (progn (setq name (vla-get-name vla:spsc))
(vla-getxrecorddata vla:spsc 'datatype 'datavalue)
(wcmatch (strcase (vlax-variant-value (vlax-safearray-get-element datavalue
(vl-position 300 (vlax-safearray->list datatype)))))
lstnames);_ wcmatch
) ;_ progn
(progn (setq sps (entget(vlax-vla-object->ename vla:spsc))
sps (massoc 330 (member (assoc 300 sps) sps))
sps (vl-remove-if 'null (mapcar 'entget sps))
sps (mapcar '(lambda (x)(cons (cdr(assoc 2 x))(cdr(assoc 62 x)))) sps))
(if (vl-member-if '(lambda (x)(minusp (cdr x))) sps)(setq onoff :vlax-true) ;_Хотя бы один слой выключен
(setq onoff :vlax-false))
(setq sps (mapcar '(lambda (x)(vla-Item vla:lrs x)) (mapcar 'car sps)))
(mapcar '(lambda (x)(vla-put-layeron x onoff)) sps)))) ;_ vlax-for
(vlax-release-object vla:dic))) ;_ if
(vlax-release-object vla:xdic))) ;_ if
(vlax-release-object vla:lrs)(princ))
(defun C:LFSC ( / fname )
(setq fname (getstring "\nИмена групповых фильтров, разделенных запятой(,) <выход>: "))
(if (/= Fname "")(layer-filters-status-change fname))
(princ))
;|Возможные макросы на кнопку
Если в чертеже есть групповые фильтры с именами AT и ONOFF
^C^C(layer-filters-status-change "AT,ONOFF")
^C^CLFSC;AT,ONOFF
^C^CLFSC;AT
С запросом в командной строке имени фильтра (фильтров)
^C^CLFSC;
|;
Пояснения.
1. Не рассматривается вопрос загрузки кода. Считается, что ф-ция layer-filters-status-change и команда C:LFSC Загружены.
2. Предположим в рисунке есть групповые фильтры с именами AT, AT1, AT2, ONOFF
3.
- Кнопка ^C^CLFSC;AT,ONOFF - изменит видимость слоев фильтров AT и ONOFF
- Кнопка ^C^CLFSC;AT* - изменит видимость слоев фильтров AT AT1 AT2
4. Использование кнопки без ^C^C позволит применять команду прозрачно
- Кнопка 'LFSC;AT* - изменит видимость слоев фильтров AT AT1 AT2 не прерывая текущую команду (например ваполнение команды отрезок)
- Кнопка 'LFSC; - приостановит действие текущей команды, запросит перечень фильтров, изменит видимость слоев, продолжит выполнение команды.