Блокировка курсора мышки в границах рабочей области Blender

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

Самый простой способ добиться нужного поведения указателя мышки – добавить в параметр bl_options оператора значения GRAB_CURSOR и BLOCKING:

Теперь, если сделать оператор модальным, при его выполнении курсор будет ограничен только той рабочей областью, из которой оператор был вызван.

Определим модальный оператор с блокировкой указателя мышки через параметры оператора:

Теперь, если выполнить данный оператор командой

курсор мышки нельзя будет увести за пределы текущей рабочей области.

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

Такой способ блокировки курсора прост и удобен, однако он включает, так называемый “продолжительный граб” – в тот момент, когда указатель мышки выходит за границу рабочей области с одной стороны, он сразу же возвращается в эту рабочую область, но – с противоположной стороны.

Такое поведение удобно, например, при перетаскивании объектов или изменении масштаба. Однако иногда бывает нужно просто остановить курсор на границе рабочей области, никуда больше его не перемещая.

Реализовать такое поведение для указателя мышки можно установив постоянный контроль за координатами курсора, чтобы при приближении значения этих координат к границам рабочей области “замораживать” их.

Изменим код нашего модального оператора следующим образом:

Здесь мы убрали установленные ранее значения в параметре bl_options оператора и добавили контроль события MOUSEMOVE – контроль за перемещением курсора мышки  в функции modal.

Обработка события MOUSEMOVE позволяет нам получить координаты курсора мышки внутри текущей рабочей области через переменные event.mouse_region_x – X координата курсора и event.mouse_region_y – Y координата курсора мышки.

Размеры текущей рабочей области изменяются от 0 до context.region.width по ширине, и до context.region.height по высоте.

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

Координаты курсора можно сравнивать с нулем и с точными значениями ширины и высоты рабочей области, или же, как в данном примере, оставив отступ в 10 пикселей от края.

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

Например, вызов функции cursor_warp с параметрами (0, 0)

установит курсор в точку на текущей рабочей области с координатами (0, 0).

В нашем же случае мы устанавливаем для курсора координаты на границе рабочей области, к которой он приближается меньше чем на 10 пикселей.

Если мы выполним данный оператор командой

курсор, при приближении к границам области, будет всегда оставаться внутри и, в отличие от первого варианта, не будет перескакивать на противоположную сторону.

Вернуть курсору стандартное поведение можно все так же, нажав на правую кнопку мышки или клавишу ESC на клавиатуре.

0 0 голоса
Article Rating
Подписаться
Уведомить о
guest
0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии