Проверка файла и 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 ее уже не нашел.
Комментарии
Есть 1 комментарий к “Проверка файла и dimpost”Трэкбэки
Узнайте, что другие говорят про эту заметку...[...] версиях будет работать лисп!) приходится учитывать варианты обработки системной переменной dimpost (код функции _lispru-error-sysvar-save-by-list доступен по [...]