Проверка файла и dimpost

На днях всю голову сломал, пытаясь разобраться, почему AutoCAD 2009 x64 (eng / rus) + SP3, при проверке обычного файла через не менее обычный _.audit вываливает сообщение о том, что "При проверке обнаружены неустранимые ошибки, надо перезапустить AutoCAD". То же самое было и при vla-auditinfo...

Как оказалось, проблема была в нестандартном значении системной переменной dimpost (суффикс размерного стиля): как только она становилась не пустой строкой, так моментально и появлялось это сообщение. Поэтому пришлось писать некоторую "обертку": командный реактор _.audit и "замену" vla-auditinfo.

Понадобились две несложные функции - сохранения и восстановления значений системных переменных. По старой привычке сделал их универсальными :)

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
(defun _lispru-error-sysvar-save-by-list (lst / res)
                                         ;|
*    Сохранение состояния системных переменных для документа. Возможна
* одновременная установка
*    Параметры вызова:
  lst список системных переменных вида
      '((<sysvar> <value>) <...>)
*    Возвращает список
|;

  (foreach item lst
    (if (getvar (car item))
      (progn
        (setq res (cons (list (car item) (getvar (car item))) res))
        (if (cdr item)
          (setvar (car item)
                  (if (= (type (cdr item)) 'list)
                    (cadr item)
                    (cdr item)
                    ) ;_ end of if
                  ) ;_ end of setvar
          ) ;_ end of if
        ) ;_ end of progn
      ) ;_ end of if
    ) ;_ end of foreach
  res
  ) ;_ end of defun

(defun _lispru-error-sysvar-restore-by-list (lst)
                                            ;|
*    Восстановление состояния системных переменных.
*    Параметры вызова:
  lst список системных переменных, значения которых надо
    восстаналивать вида:
      '((<sysvar> . <value>) <...>)
|;

  (foreach item lst
    (if (getvar (car item))
      (setvar (car item) (cdr item))
      ) ;_ end of if
    ) ;_ end of foreach
  ) ;_ end of defun

Теперь вместо стандартного (vla-auditinfo ... используем такую конструкцию:

1
2
3
(setq sysvar (_lispru-error-sysvar-save-by-list '(("dimpost" . ""))))
(vla-auditinfo (vla-get-activedocument (vlax-get-acad-object)) :vlax-true)
(_lispru-error-sysvar-restore-by-list sysvar)

C реактором будет немного посложнее и понекрасивее :)

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
(if *lispru-vlr-cmd*
  (progn
    (setq *lispru-vlr-cmd* nil)
    (vlr-remove-all :vlr-command-reactor)
    ) ;_ end of progn
  ) ;_ end of if

(if (not *lispru-vlr-cmd*)
  (setq *lispru-vlr-cmd*
         (vlr-command-reactor
           ("LispRu-command-reactor")
           '(
             (:vlr-commandwillstart . _lispru-vlr-command-start)
             (:vlr-commandended . _lispru-vlr-command-end)
             (:vlr-commandcancelled . _lispru-vlr-command-cancel)
             (:vlr-commandfailed . _lispru-vlr-command-fail)
             )
           ) ;_ end of VLR-Command-Reactor
        ) ;_ end of setq
  ) ;_ end of if

(defun _lispru-vlr-command-start (react cmd)
  (setq cmd (strcase (car cmd) t))
  (cond
    ((= cmd "audit")
     (setq *lispru-audit-sysvar* (_lispru-error-sysvar-save-by-list '(("dimpost" . ""))))
     )
    ) ;_ end of cond
  ) ;_ end of defun

(defun _lispru-vlr-command-end (react cmd / ext old_menu loc_menu)
  (setq cmd (vl-string-trim "_." (strcase (car cmd) t)))
  (cond
    ((= cmd "audit")
     (_lispru-error-sysvar-restore-by-list *lispru-audit-sysvar*)
     (setq *lispru-audit-sysvar* nil)
     )
    ) ;_ end of cond
  ) ;_ end of defun

(defun _lispru-vlr-command-fail (react cmd)
  (_lispru-error-sysvar-restore-by-list *lispru-audit-sysvar*)
  (setq *lispru-audit-sysvar* nil)
  ) ;_ end of defun

(defun _lispru-vlr-command-cancel (react cmd)
  (_lispru-error-sysvar-restore-by-list *lispru-audit-sysvar*)
  (setq *lispru-audit-sysvar* nil)
  ) ;_ end of defun

К сожалению, обойтись без глобальных переменных в данном случае мне не удалось.
---
Хочу добавить, что эта ошибка была обнаружена только в 2009 версии; в 2010-2014 ее уже не нашел.

Размещено в Код LISP, Функции LISP · Метки: , ,



Комментарии

Есть 1 комментарий к “Проверка файла и dimpost”

Трэкбэки

Узнайте, что другие говорят про эту заметку...
  1. [...] версиях будет работать лисп!) приходится учитывать варианты обработки системной переменной dimpost (код функции _lispru-error-sysvar-save-by-list доступен по [...]



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


Я не робот.