Коллбэки Callbacks

Callbacks (коллбэки, коллбэк - обратный вызов) это механизм, который устанавливает моменты, во время которых происходят некие события в среде 3ds Max или с объектами сцены.

Коллбэки используются для регистрации функций 3ds Max, которые вызываются в моменты, когда в 3ds Max происходят определенные события. С помощью коллбэков можно отслеживать события изменения времени через time slider и перерисовки видовых экранов. Коллбэки не сохраняются в сцене 3ds Max. Но в MAXScript существует несколько методов, которые автоматически присоединяются к системе коллбэков Max. Эти методы из механизма обратного вызова основного события (General Event Callback Mechanism) используются для внесения в систему и удаления из нее скриптов, вызванных из ряда событий 3ds Max. К тому же эти скрипты могут быть сохранены вместе с открытым в данный момент файлом сцены и оставаться с ним постоянно, запускаясь каждый раз при его загрузке, до тех пор, пока не будут явно удалены (т.е. вручную).

MAXScript позволяет вам задавать скрипты коллбэков для всех зарегистрированных событий, поддерживаемых 3ds Max, таких как открытие файла сцены (непосредственно перед открытием и сразу после открытия), создание файла, обновление (reset), сохранение, визуализация (перед и после нее), выделение объектов и многих других. Вы можете задать любое число скриптов коллбэков на событие. Скрипты можно объединять в наборы по идентификатору ID и удалять либо индивидуально, либо сразу вместе со всем набором (все скрипты с заданным ID). Можно задавать скрипты как постоянные (persistent) и тогда они будут сохраняться и загружаться вместе с открытым в данный момент файлом сцены.


Добавление коллбэков
Коллбэки добавляются с использованием следующего синтаксиса:

callbacks.addScript <callback_type_name> ( <script_string> | <script_stringstream> | \
fileName:<filename_string> ) [id:<name>] [ persistent:<boolean> ]

Данный метод используется для регистрации нового скрипта коллбэка. Первым аргументом должно быть имя, задающее тип события с которым будет связан этот скрипт. Список допустимых имен callback_type_name просто огромный, я его описывать не буду, найти можно в хелпе на этой главе: General Event Callback Mechanism.

Скриптом может быть непосредственно строка String или величина StringStream, содержащая текст скрипта для запуска, либо можно через аргумент fileName: задать файл, который будет загружен и запущен во время события коллбэка. Можно задать либо строку, либо файл, но не два эти параметра одновременно.

Дополнительный параметр id: позволяет вам пометить один коллбэк или группу коллбэков уникальным именем, и вы можете удалить всю группу без пересечения с другими коллбэками, которые, например, могут быть зарегестрированы другими скриптовыми инструментами.

Дополнительный параметр persistent: позволяет вам задать постоянный (persistent) скрипт который будет храниться в текущей сцене или глобальный (global) скрипт коллбэка, который работает не обращая внимания на то, какой файл открывается или закрывается. Значение true для данного параметра задает состояние, при котором скрипт будет храниться в текущем файле, загружаться и регистрироваться для коллбэка каждый раз, когда файл снова открывается. Постоянные скрипты коллбэков всегда удаляются при загрузке нового файла или при обновлении (резете) сцены, так что они не могут сами по себе скопироваться в другой файл. Значение по умолчанию для данного параметра false, определяющее скрипт как глобальный, а не как постоянный.

Пример:
callbacks.addScript #preRender "setUpRenderGeom()" id:#jbwRender

Регистрируется новый скрипт коллбэка, который будет вызываться непосредственно перед стартом рендера. Скрипт запускает функцию (которая уже должна быть создана и готова к работе). Также на скрипт назначен уникальный ID идентификатор для дальнейшего выборочного удаления.


Удаление коллбэков

callbacks.removeScripts [ <callback_type_name> ] [ id:<name> ]
Этот метод используется для отмены регистрации и удаления одного или нескольких скриптов коллбэков. Если задать только имя типа события коллбэка, то удалятся все скрипты коллбэки для этого события. Если задать только название идентификатора id:<name> - удалятся все скрипты коллбэки во всех событиях с этим ID. Задание обоих параметров удалит коллбэки для указанного типа события с заданным ID.


Просмотр коллбэков

callbacks.show()
Метод выводит список текущих скриптов коллбэков в окно Listener.

callbacks.broadcastCallback <callback_type_name>
Этот метод дает возможность симулировать одно из событий и запустить все скрипты коллбэки, назначенные на него. В среде 3ds Max коллбэки #preRenderFrame и #preRenderFrame могут вызываться только визуализатором (renderer). Поэтому эти два коллбэка данным методом вызвать нельзя.


Дополнительная справочная информация о коллбэке:
callbacks.notificationParam()

Этот метод может быть вызван из скрипта коллбэка для вывода дополнительной информации о коллбэке. Значения, которые возвращает метод, различны и зависят от типа коллбэка. Если дополнительной информации о коллбэке не существует, возвращается значение 'undefined'.

Пример:
--УДАЛИТЬ ВСЕ СУЩЕСТВУЮЩИЕ КОЛЛБЭКИ С ЭТИМ ID.
callbacks.removeScripts id:#MXSHelp

--ДОБАВИТЬ НОВЫЙ КОЛЛБЭК СКРИПТ callbacks.notificationParam() КОТОРЫЙ БУДЕТ ВЫЗЫВАТЬСЯ ПЕРЕД УДАЛЕНИЕМ ВЫДЕЛЕННЫХ ОБЪЕКТОВ СЦЕНЫ
--И НАПЕЧАТАТЬ ИНФОРМАЦИЮ ОБ УДАЛЕННЫХ ОБЪЕКТАХ В Listener:
callbacks.addScript #selectedNodesPreDelete "print (callbacks.notificationParam())" id:#MXSHelp