Очистка словарей. Просто для напоминания самому себе

Меня достало каждый раз писать одно и то же по очистке словарей. Засуну сюда лисповой код, который будет работать и под наной, и под кадом. Если что - сам его буду тырить по мере надобности.

Что сайт есть шпаргалка, надеюсь, никто не забыл? )))

Код оставляет "в живых" словари ACAD (включая словарь стандартов) и служебные словари NC. Под ACAD словари NC, скорее всего, будут снесены. Заодно выполняет чистку, аудит и очистку от зарегистрированных приложений. На полноценную и всестороннюю очистку, конечно, не тянет, но в качестве костыля - может, и подойдет.

Настоятельно советую код гонять на страховых копиях файлов. Под NC получить в результате абсолютно нерабочий файл шансы далеко ненулевые. С чем это связано - не представляю (( NC24.1 в любой момент и при любом телодвижении может поломать файл до состояния нестояния. Такой файл уже не открывается ни через NC, ни через ACAD.

Короче, я предупредил ;)

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
(vl-load-com)

(defun c:clear-dicts (/ adoc dict_list reg_apps_count)
  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  (repeat 3
    (vla-purgeall adoc)
  ) ;_ end of repeat
  (vlax-for item (vla-get-dictionaries adoc)
    (if (or (not (vlax-property-available-p item 'name))
            (= (vla-get-name item) "ACAD_DGNLINESTYLECOMP")
            (not (wcmatch (vla-get-name item) "ACAD*,AcDb*,AcSt*,HOST_DOC_*,MC*"))
        ) ;_ end of or
      (vl-catch-all-apply
        (function
          (lambda (/ name)
            (if (vlax-property-available-p item 'name)
              (setq name (vla-get-name item))
            ) ;_ end of if
            (vla-delete item)
            (if name
              (setq dict_list (cons name dict_list))
            ) ;_ end of if
          ) ;_ end of lambda
        ) ;_ end of function
      ) ;_ end of vl-catch-all-apply
    ) ;_ end of if
  ) ;_ end of vlax-for
  (vla-auditinfo adoc :vlax-true)

  (setq reg_apps_count (vla-get-count (vla-get-registeredapplications adoc)))
  (if (> reg_apps_count 500)
    (vl-cmdf "_.-purge" "_r" "_n" "*")
    (vlax-for app (vla-get-registeredapplications adoc)
      (vl-catch-all-apply
        (function
          (lambda ()
            (vla-delete app)
          ) ;_ end of lambda
        ) ;_ end of function
      ) ;_ end of vl-catch-all-apply
    ) ;_ end of vlax-for
  ) ;_ end of if
  (princ (strcat "\nPurged regapps : "
                 (itoa (- reg_apps_count (vla-get-count (vla-get-registeredapplications adoc))))
         ) ;_ end of strcat
  ) ;_ end of princ

  (repeat 3
    (vla-purgeall adoc)
  ) ;_ end of repeat

  (if dict_list
    (princ (strcat "\nErased dictionaries : "
                   (apply (function strcat)
                          (mapcar
                            (function
                              (lambda (x)
                                (strcat "\n\t" x)
                              ) ;_ end of lambda
                            ) ;_ end of function
                            (vl-sort dict_list (function <))
                          ) ;_ end of mapcar
                   ) ;_ end of apply
           ) ;_ end of strcat
    ) ;_ end of princ
  ) ;_ end of if

  (vla-endundomark adoc)
  (princ)
) ;_ end of defun

Может оставлять следы в ком.строке. Дело в том, что при большом количестве зарегистрированных приложений командный метод их чистки оказывается кратно быстрее, чем лиспом проходиться.



Комментарии

Есть 1 комментарий к “Очистка словарей. Просто для напоминания самому себе”
  1. drz пишет:

    Давно эта статья просилась!
    Потестю

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


Я не робот.