Очистка фильтров слоев

Понадобилось мне тут для нетекущего документа вычистить фильтры слоев. Вообще все. Точно помню, что было программное решение. Точно помню, что было оно универсальным.

Наконец - эврика! Есть!

Мне чужой славы не надо: 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
                                            DataVa­lue
                                            (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



Поделитесь своим мнением


Я не робот.