ADN Open CIS
Сообщество программистов Autodesk в СНГ

29/10/2016

Стоит ли использовать постоянные объектные реакторы?

Стоит ли использовать постоянные объектные реакторы?


Тот факт, что в AutoCAD можно "прописать" собственные реакции на какие-либо действия ACAD'a, не секрет. В LISP эти элементы называются реакторами. Типов реакторов существует всего 18 штук. Перечислять их я не стану - нудное это дело, а, если кто-то заинтересуется, то информацию найти труда не составит.


Но есть одно "но": есть еще и виды реакторов (уж простите мне некоторую вольность в обращении с терминологией). Реактор может быть постоянным и непостоянным. Понятно, что срабатывать и те, и другие будут только в том случае, если загружены соответствующие коды. Но вот какая штука - постоянные (persistent) реакторы прописываются в чертеже достаточно хитро и глубоко.


Попался мне тут чертеж - не такой уж и большой, всего-то около 500 кб, количество объектов далеко не запредельное. Но попытка его элементарного сохранения превращалась в пытку: длительное ожидание с возможностью "вылета" AutoCAD. Но работать-то с файлом все равно надо!


Попробовал я выполнить стандартную _.-purge с ключом _a, и в логе выполнения увидел интересную информацию:

Код - Auto/Visual LISP: [Выделить]
  1. Command: _.-PURGE
  2.  
  3. Enter type of unused objects to purge [Blocks/DEtailviewstyles/Dimstyles/Groups/LAyers/LTypes/MAterials/MUltileaderstyles/Plotstyles/SHapes/textSTyles/Mlinestyles/SEctionviewstyles/Tablestyles/Visualstyles/Regapps/Zero-length geometry/Empty text objects/Orphaned data/All]: _a
  4. Enter name(s) to purge <*>:
  5. Verify each name to be purged? [Yes/No] : _n
  6. Deleting block "a0".
  7. ...
  8. ; error: no function definition: USER-CALLBACK-FUNCTION
  9. ; error: no function definition: USER-CALLBACK-FUNCTION
  10. Deleting block "b1".
  11. 21 blocks deleted.


Это уже становится интересно - что за USER-CALLBACK-FUNCTION? Да еще и упоминается два раза?


"А если выполнить _.audit?" - подумал я и на всякий случай включил ведение лога (LOGFILEMODE = 1). И не пожалел: сообщений типа

Код - Auto/Visual LISP: [Выделить]
  1. ; error: no function definition USER-CALLBACK-FUNCTION

было аж на 6 печатных листов. Сообщение выводится, но ошибкой не считается - и, соответственно, не исправляется.


Пообщавшись с автором файла, удалось выяснить, что он почти на каждый объект "повесил" свой реактор. Добро бы просто "повесил", но он сделал реакторы постоянными. Т.е., грубо говоря, AutoCAD "прописал" внутри каждого объекта указание: "при выполнении таких-то действий вызывать такую-то функцию (в данном случае - USER-CALLBACK-FUNCTION)". Учитывая, что объекты очень часто подвергаются изменениям, скрытым от конечного пользователя, AutoCAD и пытается обратиться к USER-CALLBACK-FUNCTION. А это время. А это лишние вычисления. Отсюда и "тормоза".


Удалять эти указания "поодиночке", рискуя что-либо пропустить, я не стал. Вместо этого я удалил вообще все реакторы через


Да, я порушил систему. Да, теперь автор, если получит от меня этот файл обратно, не сможет делать массу вещей, к которым привык. Но зато файл можно будет сохранять, копировать, клонировать из него объекты и т.д. без риска получить нерабочий AutoCAD.


Какой из этой ситуации я сделал вывод: если есть малейшая вероятность (а она есть всегда), что файл попадет куда-то, где нет моих дополнений, постоянные реакторы использовать нельзя. Намного удобнее и безопаснее продумать систему, которая обойдется без постоянных реакторов.


Что самое интересное - продолжив общение, я выяснил, что, скорее всего, можно было обойтись и без постоянных реакторов. Вполне достаточно загружаемых (или командных, или объектных).

Автор: Алексей Кулик

Обсуждение: http://adn-cis.org/forum/index.php?topic=

Опубликовано 29.10.2016