_.etransmit и командные реакторы
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > _.etransmit и командные реакторы

_.etransmit и командные реакторы

Ответ
Поиск в этой теме
Непрочитано 24.03.2011, 10:36 #1
_.etransmit и командные реакторы
Лиспер
 
Регистрация: 11.10.2010
Сообщений: 979

Доброго времени суток!
Ситуация следующая: AutoCAD 2008 + СПДС GraphiCS 4, использую командные реакторы, в том числе и на процесс сохранения файла (выполняется очистка и аудит файла). Возникла проблема при выполнении _.etransmit: требуется выполнить сохранение файла, жму ОК, файл сохраняется, срабатывает реактор сохранения, и - все сначала.
Анализ показал, что сначала запускается команда _.etransmit, потом она завершается (причем завершение идет по реактору корректного окончания), запускается _.qsave, и после выполнения _.qsave снова вызывается _.etransmit, которое опять требует сохранения (хотя никаких изменений в файл ни пользователь, ни мой код - не вносят.). Предварительное принудительное сохранение файла почему-то не оказывает на ситуацию никакого влияния.
Если выполнять _etransmit либо только с СПДС, либо только с моими дополнениями - все работает "на ура", вместе же - ну никак. Собственно вопрос: можно ли "выйти" из этого замкнутого круга?
Если надо, предоставлю весь код, касающийся этой задачи.
__________________
(/= RegDate StartReadDate)
Просмотров: 4909
 
Непрочитано 29.03.2011, 11:11
#2
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Цитата:
Сообщение от Лиспер Посмотреть сообщение
Если надо, предоставлю весь код, касающийся этой задачи.
Лиспер, у меня чистый AutoCAD2008 без СПДС GraphiCS 4, повторить описанное тобой не получилось. Выложи код.
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 30.03.2011, 12:04
#3
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 979


Вот код:
Код:
[Выделить все]
 (vl-load-com)
(setq *lisper-regname*   "Lisper"
     *lisper-activedoc* (vla-get-activedocument (vlax-get-acad-object))
     ) ;_ end of setq

(if *vlr-cmd*
 (progn
   (setq *vlr-cmd* nil)
   (vlr-remove-all :vlr-command-reactor)
   ) ;_ end of progn
 ) ;_ end of if

(if (not *vlr-cmd*)
 (setq *vlr-cmd*
        (vlr-command-reactor
          (strcat (vl-princ-to-string *lisper-regname*) "-command-reactor")
          '(
            (:vlr-commandwillstart . _lisper-vlr-command-start)
            (:vlr-commandended . _lisper-vlr-command-end)
            (:vlr-commandcancelled . _lisper-vlr-command-cancel)
            (:vlr-commandfailed . _lisper-vlr-command-fail)
            )
          ) ;_ end of vlr-command-reactor
       ) ;_ end of setq
 ) ;_ end of if

(defun _lisper-vlr-command-start (react cmd / selset)
                                ;|
*    Общая функция обработки начала команд
|;
 (setq cmd (strcase (car cmd) t)
       *vlr-entlast* (entlast)
       ) ;_ end of setq
 (cond
   ((member cmd '("qsave" "save" "saveas"))
    (_lisper-vlr-command-save-start)
    )
   ) ;_ end of cond
 ) ;_ end of defun

(defun _lisper-vlr-command-end (react cmd)
                              ;|
*    Функция успешного окончания команды
|;
 (setq cmd (strcase (car cmd) t))
 (setq *vlr-entlast* nil)
 ) ;_ end of defun

(defun _lisper-vlr-command-cancel (react cmd / cmd_name entn)
 (setq cmd_name (strcase (car cmd) t))
 (setq *vlr-entlast* nil)
 ) ;_ end of defun

(defun _lisper-vlr-command-fail (react cmd / cmd_name)
 (setq cmd_name      (strcase (car cmd) t)
       *vlr-entlast* nil
       ) ;_ end of setq
 ) ;_ end of defun

(defun _lisper-vlr-command-save-start (/)
                                     ;|
*    Функция начала команд *save, _quit, _exit, _close
|;
 (vla-auditinfo *lisper-activedoc* :vlax-true)
 (vlax-for blk_def (vla-get-blocks *lisper-activedoc*)
   (if (equal (vla-get-isxref blk_def) :vlax-false)
     (explodeallproxyinblock (vla-get-name blk_def))
     ) ;_ end of if
   ) ;_ end of vlax-for
 (vla-purgeall *lisper-activedoc*)
 (vlax-for app (vla-get-registeredapplications *lisper-activedoc*)
   (vl-catch-all-apply
     (function
       (lambda ()
         (vla-erase app)
         ) ;_ end of lambda
       ) ;_ end of function
     ) ;_ end of vl-catch-all-apply
   ) ;_ end of vlax-for
 ) ;_ end of defun
Вроде лишнее выкинул.
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 30.03.2011, 13:30
#4
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Лиспер, с Твоим кодом у меня получилось так:

1). Запустили команду _.etransmit
2). Сработал реактор, вызвал _lisper-vlr-command-start (для "_.etransmit"), отрабоал корректно
3). Появилось окно "eTransmit - Сохранение изменений", нажали "OK"
4). Сработал реактор, вызвал _lisper-vlr-command-end (для "_.etransmit"), отрабоал корректно
5). _lisper-vlr-command-start (для "_.qsave"), внутри вызвал _lisper-vlr-command-save-start, отрабоал корректно
6). _lisper-vlr-command-end (для "_.qsave"), отрабоал корректно

7). _lisper-vlr-command-start (для "_.etransmit")
8). Появилось окно "Формирование комплектов файлов" -> "ОК"
9). _lisper-vlr-command-end (для "_.etransmit")

10). И все нормально завершилось!


В Твоем коде, в функции _lisper-vlr-command-save-start есть вызов функции explodeallproxyinblock, а её описание Ты видимо не стал выкладывать, поэтому я сделал "пустышку" с таким именем.

Замечание:
Строчкой (vla-purgeall *lisper-activedoc*) Ты удалаешь неиспользуемые блоки, слои и т. д. из чертежа. Так вот если у нас есть блок A и блок B, а блок С состоит из блока А и блока В (вхождений которого уже нет в чертеже), то после (vla-purgeall *lisper-activedoc*) блок C удалиться, зато в утилите очистки чержежа появяться блоки А и В.
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 30.03.2011, 13:36
#5
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 979


TararykovDG, спасибо
Про explodeallproxy - эта функция появляется в lisp'e после загрузки ExplodeAllProxy от А.Ривилиса.
Насчет purge - спасибо, учту.
---
Так вот, проблема, похоже, все-таки не в коде моем и не в СПДС, т.к. _.etransmit нормально срабатывает, если загружено и то, и другое. Неужели дело действительно в их совместном существовании? Неужели придется отключать реакторы, если СПДС загружена? Это ж вилы
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 31.03.2011, 21:30
#6
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Цитата:
Сообщение от Лиспер Посмотреть сообщение
Неужели придется отключать реакторы, если СПДС загружена?
Наверное Ты уже это проверял, но все-таки скажу. А если в функции _lisper-vlr-command-save-start убрать все строки, а потом добовлять по одной, т. е. сначала только аудит файла, потом добавить удаление внешних ссылок и т. д. Это только предположение, но меня настораживает удаление зарегистрированных приложений при загруженном СПДС. Я просто не знаю что он там (СПДС) может встраивать в ACAD
__________________
cadtools
TararykovDG вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > _.etransmit и командные реакторы



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Etransmit и ADT favorite Прочее. Программное обеспечение 3 05.04.2007 08:32
Реакторы, что это??? DANZZ AutoCAD 3 30.08.2006 08:14
Лисп: реакторы Torino LISP 4 03.03.2005 11:49
eTransmit вырубается! В чем может быть дело? Maps AutoCAD 2 22.01.2004 17:12