Группы пользователей Autodesk

Функции отклика


Использование реакторов

 

Использование реакторов 
 

Функции отклика



Каждому событию, которому назначен реактор, должна соответствовать функция, вызываемая при наступлении события. Логическая последовательность событий, наступающих при перетаскивании пользователем одной из вершин полилинии, описывается следующим алгоритмом.

Описание функции gp:outline-changed

Удалить плитки.

Определить, как изменилась граница.

Исправить границу.

Перерисовать новые плитки.

Конец функции

Но при этом возникает одна сложность. О перетаскивании вершины полилинии AutoCAD сообщает приложению с помощью события :vlr?modified. Однако, пусть пользователь только начал перетаскивать одну из вершин полилинии. Если немедленно вызвать функцию gp:outline-changed, действие пользователя будет прервано на середине. Где именно будет располагаться вершина — еще неизвестно, так как пользователь пока не указал ее новое положение. И, наконец, AutoCAD не позволяет изменять полилинию в то время, когда пользователь перетаскивает какую-либо из ее вершин. Полилиния открыта в AutoCAD для редактирования и будет оставаться в этом состоянии, пока пользователь не закончит перемещение.

В связи с этим подход к программе следует изменить. Приведем обновленный алгоритм:

Когда пользователь начинает перемещение вершины полилинии,

Вызвать функцию gp:outline-changed

Описание функции gp:outline-changed

Описать глобальную переменную, сохраняющую указатель на полилинию,

изменяемую пользователем.

Конец функции

После завершения команды

Вызвать функцию gp:command-ended

Описание функции gp:command-ended

Удалить плитки

Получить информацию о предыдущем расположении вершин полилинии

Получить информацию о новом расположении вершин полилинии

Переопределить полилинию (выпрямить ее)

Перерисовать плитки

Конец функции

О завершении изменения контура дорожки AutoCAD сообщает приложению с помощью события :vlr?commandEnded, если был назначен реактор редактора.

Использование глобальной переменной для идентификации измененной пользователем полилинии необходимо, так как между функциями gp:outline-changed и gp:command-ended нет связи.
В нашем приложении обе функции вызываются и выполняются независимо друг от друга. Глобальная переменная хранит важную информацию, определенную одной функцией и доступную для другой.

Теперь надо подумать о том, что должно происходить, если пользователь удалит границу дорожки. В конечном счете, должны удалиться все плитки. Этот случай описывается следующим алгоритмом:

Когда пользователь начинает удалять границу,

Вызвать функцию gp:outline-erased

Описание функции gp:outline-erased

Описать глобальную переменную, сохраняющую указатель на реактор,

назначенный удаляемой полилинии

Конец функции

После завершения удаления

Вызвать функцию gp:command-ended

Описание функции gp:command-ended

Удалить плитки, принадлежавшие только что удаленной полилинии

Конец функции

 


Содержание раздела