1

Тема: AHK: Обход бага диалога в Illustrator

Я полный чайник в АХК с не очень большим опытом в программирования вообще.
Но я надеюсь, что он мне поможет не только в автозамене и горячих клавишах под сложные комбинации, но и для обхода очень назойливого бага в IllustratorCC, в котором я работаю.

С версии CS4 разработчики сменили направление y-координаты, очевидно, чтобы унифицировать её в контексте других программ семейства. После 15 лет автоматизированной привычки мне совершенно не хотелось переучиваться, поэтому я быстро нашёл вполне легальный способ обойти нововведение. Для этого достаточно заменить "1" на "0" для строк "isRulerOriginTopLeft" и "isRulerIn4thQuad" в Prefs-файле программы.

К сожалению, такая правка вызывает проблему с диалоговым окном Move (уже проверял, именно поэтому).
Когда я вручную вбиваю значения дл вертикального сдвига в этом окне, Илюстратор оставляет его при следующем запуске диалога (это пока не баг). А вот если я поменяю знак этого значения на противоположный, он его проигнорирует (это баг).
Например, я набираю "10" и жму Enter. При следующем вызове окна я меняю подставленные "10" на "-10". Жму ли я Tab после этого или сразу Enter — Illustrator всё равно сделает сдвиг плюс десять, а не минус десять. В обратную сторону то же самое, и только для вертикального сдвига.

Такое происходит только для пары зеркальных значений. Может показаться редкостью, но в моей работе это одна из самых частых операций. Мне приходится либо вписывать для сдвига значение больше по модулю, потом делать повторный сдвиг, чтобы компенсировать перелёт,  либо вручную менять "90" на "-90" (и наоборот) в том же окне — тогда Иллюстратор понимает. И про то и другое надо вовремя вспомнить, что неудобно.

Итак, я пытаюсь выполнить следующий алгоритм:
Когда определённое окно с "Move" в заголовке и ahk_class "Illustrator" появляется, скрипт (уже с #Persistent, там другие вещи дописаны) должен запомнить значение в текстовом поле "Edit 3" (если оно там есть) сравнить его с новым после нажатия Tab или Enter, и если оно зеркально — перехватить нажатие клавиш, перейти в поле "Edit 1", сделать зеркальным число в нём и далее либо перейти"Edit 2" (если был нажат Tab) или симулировать Enter, если он и был нажат.

Но у меня ничего не выходит :(
Моя попытки настолько жалки, что показывать решительно стыдно и нечего (всё танцы с WinGetActiveTitle, Loop и MsgBox).

Помогите, пожалуйста. Я убеждён, что AHK может и похлеще вещи (тут их тьма).

2 (изменено: Irbis, 2013-08-13 17:26:47)

Re: AHK: Обход бага диалога в Illustrator

Не проверял на искомой программе, но с самодельным GUI, имеющим 3 поля Edit, работает:

SetTitleMatchMode 2
loop {
   WinWaitActive, Move ahk_class Illustrator
   sleep 100
   ControlGetText, E3, Edit3, A
   WinWaitNotActive, Move ahk_class Illustrator
}

#If WinActive("Move ahk_class Illustrator")
Tab::
Enter::
   ControlGetText, E3New, Edit3, A
   if !(E3+E3New) {
      ControlGetText, E1, Edit1, A
      E1 := -1*E1
      ControlSetText, Edit1, %E1%, A
   }
   If (A_ThisHotkey = "Enter")
      SendInput {Enter}
   else
      ControlFocus, Edit2, A
Return
#If

Это если дословно следовать алгоритму , описанному ниже слов "Итак, я пытаюсь выполнить следующий алгоритм"
C другой стороны, если поставить задачу проще - повесить на хоткей синхронную смену знака в двух полях ввода, то и скрипт получается короче. В данно примере хоткей - Win & Минус (на основной клавиатуре)

SetTitleMatchMode 2
#If WinActive("Move ahk_class Illustrator")
#vkBD::
   ControlGetText, E, Edit3, A
   E := -1*E
   ControlSetText, Edit3, %E%, A
   ControlGetText, E, Edit1, A
   E := -1*E
   ControlSetText, Edit1, %E%, A
Return
#If

3

Re: AHK: Обход бага диалога в Illustrator

Я было возрадовался, но увы. Даже тени не промелькнуло.
Полагаю, я мог по своей неосведомлённости чего-то недосообщить, либо перепутать в описании алгоритма.
Надо было сразу сделать и прекрепить к теме вот эту картинку:
http://www.ljplus.ru/img4/c/h/chegr/chegr_ahk_win.png
ahk_class для всех диалоговых окон Иллюстратора одинаков.
Порядок текстовых полей идёт почему-то снизу вверх.
Что-нибудь меняется? Попробую пока поковырять текущий код.
Что касается замены по Win+-, то этот вариант тоже требует от меня вспомнить, что новое значение зеркально, и в целом переучиться. Тот же костыль, но в стразах И этот вариант почему-то тоже не работает.

4 (изменено: Irbis, 2013-08-13 17:34:05)

Re: AHK: Обход бага диалога в Illustrator

chegr пишет:

...
Когда определённое окно с "Move" в заголовке и ahk_class "Illustrator" появляется...

На скрине WinSpy видно, что ahk_class #32770, это во-первых.
Во-вторых, у вас текст контролов не отображается в Visible Window Text, а только при включенном режиме Slow.
Я проверял скрипт на программе, где текст контролов отображается обычным образом.

Подставьте в скрипт правильный класс окна и проверьте работу скрипта.
Если не поможет, исправьте первую строку скрипта на

SetTitleMatchMode Slow

5 (изменено: chegr, 2013-08-14 03:53:30)

Re: AHK: Обход бага диалога в Illustrator

Виноват, спасибо. Сейчас не понимаю, как я не сообразил, что они в связке работают, Title и ahk_class.
Всё исправил, режим поменял в обоих местах. Скрипт стал видеть окно и пытаться в нём что-то делать. Но что-то идёт не так.
Описываю, что происходит:

По умолчанию фокус в окне ставится в поле справа от Horizontal (это нормально).
Когда я нажимаю Tab, чтобы перейти в поле Vertical, скрипт перебрасывает фокус в поле Distance (это ненормально) — перехват Tab должен происходить только из поля Vertical (или Shift+Tab, если переход идёт из поля Distance — не подумал об этом ранее). Поле Angle при этом сбрасывается вообще, там пусто (круговой индикатор слева от поля показывает направление 0).
Если фокус мышкой поставить в поле Distance, то перейти из него с помощью Tab нельзя (только по Shift+Tab). При нажатии Tab, кроме того, сбрасывается поле Angle.
Если перейти мышкой в поле Vertical и поставить зеркальное предыдущему значение, смены угла в соответствующем поле не происходит ни в одном из вариантов.
Если выставить угол вручную, то при переходе из поля Tab-ом значение сбрасывается на бывшее до исправления.
Вот такие симптомы.