Очистка фильтров слоев
Понадобилось мне тут для нетекущего документа вычистить фильтры слоев. Вообще все. Точно помню, что было программное решение. Точно помню, что было оно универсальным.
Наконец - эврика! Есть!
Мне чужой славы не надо: http://www.caduser.ru/forum/index.php?PAGE_NAME=read&FID=2&TID=1194
Собственно код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | ;; Удаление лишних фильтров слоев из чертежа ;; имена фильтров, которые требуется оставить передаются списком ;; Функция переписана с учетом особенностей версии 2005, где появился новый словарь (defun all_filters_del (lstnames / vla:lrs vla:xdic vla:dic vla:xrec name DataType DataValue num) (setq vla:lrs (vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))) (if (= (vla-get-hasextensiondictionary vla:lrs) :vlax-true) ;; при наличии словаря требуется детальная проверка (progn (setq lstnames (mapcar 'strcase lstnames)) (setq vla:xdic (vla-getextensiondictionary vla:lrs)) (setq num 0) ;; поиск и удаление фильтров версий пре-2005 (if (progn (vlax-for item vla:xdic (if (= (vla-get-name item) "ACAD_LAYERFILTERS") (setq vla:dic item) ) ;_ if ) ;_ vlax-for vla:dic ) ;_ progn (progn (vlax-for vla:xrec vla:dic (if (not (member (strcase (setq name (vla-get-name vla:xrec))) lstnames)) (progn (vla-remove vla:dic name) (vlax-release-object vla:xrec) (setq num (1+ num)) ) ;_ progn ) ;_ if ) ;_ vlax-for (vlax-release-object vla:dic) (if (zerop num) (princ "\nЛишних фильтров 2002 в рисунке не обнаружено.") (princ "\nЛишние фильтры 2002 из рисунка удалены.") ) ;_ if ) ;_ progn ) ;_ if (setq vla:dic nil) (setq num 0) ;; поиск и удаление фильтров версии 2005 (if (progn (vlax-for item vla:xdic (if (= (vla-get-name item) "ACLYDICTIONARY") (setq vla:dic item) ) ;_ if ) ;_ vlax-for vla:dic ) ;_ progn (progn (vlax-for vla:xrec vla:dic (if (progn (setq name (vla-get-name vla:xrec)) (vla-getxrecorddata vla:xrec 'DataType 'DataValue) (not (member (strcase (vlax-variant-value (vlax-safearray-get-element DataValue (vl-position 300 (vlax-safearray->list DataType)) ) ;_ vlax-safearray-get-element ) ;_ vlax-variant-value ) ;_ strcase lstnames ) ;_ member ) ;_ not ) ;_ progn (progn (vla-remove vla:dic name) (vlax-release-object vla:xrec) (setq num (1+ num)) ) ;_ progn ) ;_ if ) ;_ vlax-for (vlax-release-object vla:dic) (if (zerop num) (princ "\nЛишних фильтров 2005 в рисунке не обнаружено.") (princ "\nЛишние фильтры 2005 из рисунка удалены.") ) ;_ if ) ;_ progn ) ;_ if (vlax-release-object vla:xdic) ) ;_ progn (princ "\nФильтров в рисунке не обнаружено.") ) ;_ if (vlax-release-object vla:lrs) (princ) ) ;_ defun (vl-load-com) ;;; (all_filters_del '("MyFilter1" "MyFilter2" "MyFilter3")) ;_ автозапуск программы для удаления только лишних ;;; (all_filters_del '()) ;_ автозапуск программы для удаления ВСЕХ фильтров |
P.S. Специально привел исходный вариант.
P.P.S. При копировании кода можно получить ошибку. Так что забираем исходник: all_filters_del