Author Topic: автоматизация в Давинчи  (Read 7284 times)

0 Members and 1 Guest are viewing this topic.

Ivankak

  • Освоившийся
  • **
  • Posts: 37
    • View Profile
автоматизация в Давинчи
« on: September 11, 2021, 05:53:23 PM »
Здравствуйте.
Если вы использовали Dasvinchi resolv, то знаете, что у него есть вот такая панель цветокорекции и нету шоткатов длят упраления ей.
Вместо этого Блек мэджик продет за несколько тысяч долларов специальный девайс.


есть вот такой девайс


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

То есть я себе работу скрипта представляю так
определяем кнопки на клавиатуре (или сочетания) например в соответствии с названиями кругов на картинке
1 -sadow
2-Midtone
3-Highlights
4-offset

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

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

Я честно прочитал хэлп к кликерману, но не понял, как это запрограмировать. У меня вообще очень маленький опыт программирования.

Вообще можно сделать, чтобы кликерман удерживал лкм нажатой и при этом давал двигать курсор пользователю?
как указать в каком окне скрипт должен работать?
Каким оператором лучше распознавать нажатие клавиши или клавиатурного сочетания?
Можно ли сделать, чтобы в каком-то случае нажатия клавиш не доходили до Давнчи и он не отрабатывал их, как свои шоткаты?
Как правильно организовать цикл для такой задачи?


« Last Edit: September 11, 2021, 05:57:00 PM by Ivankak »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: автоматизация в Давинчи
« Reply #1 on: September 13, 2021, 10:31:46 AM »
Шар трекбола - это то же самое что и перемещение мыши? А колесо - это колесо мыши? Просто никогда не было трекбола в пользовании.

Тогда
если пользователь тронул шарик
Это можно отследить. Отследить положение курсора. Только шар трекбола и мышь это одно и то же. От движений мышью не отделить.

если пользователь крутанул колесо
А это - нет. В кликере нельзя отследить вращение колеса мыши. Так сложилось. Думаю само кручение отследить было просто, но само использование в скриптах было бы сложным в настройке и неправильным в записях. Потому, что работа колеса может зависеть от активного окна и от положения курсора.
Нужно искать другой выход, горячие кнопки для переключения или перемещение в указанную область. Короче, надо думать.


Вообще можно сделать, чтобы кликерман удерживал лкм нажатой и при этом давал двигать курсор пользователю?
Можно. Просто команда на зажатие кнопки.

как указать в каком окне скрипт должен работать?
Лучше пока этого не касаться, эта тема сложнее и с кучей ограничений, да и не нужно это здесь.

Каким оператором лучше распознавать нажатие клавиши или клавиатурного сочетания?
Есть два оператора ISKEYDOWN и GETKEYSDOWN. Что из них лучше, зависит от ситуации. В большинстве, без разницы.

Можно ли сделать, чтобы в каком-то случае нажатия клавиш не доходили до Давнчи и он не отрабатывал их, как свои шоткаты?
Нет. Можно только отключить/включить на время всю клавиатуру и все кнопки для всех программ. При этом программные нажатия кнопок будут работать.

Как правильно организовать цикл для такой задачи?
Обычный бесконечный цикл WHILE

P.S. Пока гуглил трекболы... Kensington Expert Mouse Trackball
« Last Edit: September 13, 2021, 03:20:01 PM by Vint »


Ivankak

  • Освоившийся
  • **
  • Posts: 37
    • View Profile
Re: автоматизация в Давинчи
« Reply #2 on: September 16, 2021, 01:33:31 AM »

получилась такая блок - схема. скачать PDF
Я пока очень плохо ориентируюсь возможностях языка. подскажите пожалуйста конкретные операторы.
какой механизм лучше использовать для опроса клавиш, чтобы меньше нагружать процессор?
если нажата "А" сделатть то-то..
Если нажата "Б" сделать другое..
И так 10 или больше вариантов
Оптимально ли будет использоватб  IF ... END_IF?
Или SWITCH ... END_SWITCH?
или другую конструкцию?

Мне надо следить за тем была ли сдвинута мышь, было ли повернуто колесо мыши и за тем не была ли нажата одна из нужных клавиш.
Не могу найти оператор, который отдает координаты мыши.
Не могу найти оператор, который сообщает о повороте колеса мыши.
можно ли использовать что-то вроде функции win API mouse_event MOUSEEVENTF_WHEEL (Кнопка колеса повернута)или MOUSEEVENTF_MOVE(Произошло движение) ?
может есть готовый плагин, который дополняет язык этими возможностями?
Вижу, что есть работа с массивами, но не могу найти, как задать массив, как обратиться к  элементу по строке и столбцу. Или массив это всегда строка?
Есть оператор INIREAD Функция. Считывает параметр из файла конфгурации (*.ini) Можно ли задать массив в таком ini файле? (как?)

« Last Edit: September 16, 2021, 02:09:06 AM by Ivankak »

Ivankak

  • Освоившийся
  • **
  • Posts: 37
    • View Profile
Re: автоматизация в Давинчи
« Reply #3 on: September 16, 2021, 01:37:29 AM »
Да, трекбол и мышь одинаково управляют курсором.

Не нашел оператора для получения координат курсора. Как узнать, что пользователь тронул мышь?
« Last Edit: September 24, 2021, 04:45:26 AM by Ivankak »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: автоматизация в Давинчи
« Reply #4 on: September 16, 2021, 04:38:02 PM »
Справка -- >> Язык сценариев -->> Введение -> Перечень служебных переменных
$_xmouse Текущие координаты мыши по оси Х
$_ymouse Текущие координаты мыши по оси Y

Примерный сценарий
Code: (clickermann) [Select]
// запоминаем текущее положение курсора
$xm_old = $_xmouse
$ym_old = $_ymouse

WHILE(1)
    // основной скрипт
   
    // когда нужно проверить сместился ли курсор, проверяем так
    IF(($_xmouse != $xm_old) | ($_ymouse != $ym_old))
        LOGWRITE("Курсор сместился")   
    END_IF
    WAITMS(50)
END_CYC


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: автоматизация в Давинчи
« Reply #5 on: September 16, 2021, 05:57:20 PM »
Я пока очень плохо ориентируюсь возможностях языка. подскажите пожалуйста конкретные операторы.
какой механизм лучше использовать для опроса клавиш, чтобы меньше нагружать процессор?
если нажата "А" сделатть то-то..
Если нажата "Б" сделать другое..
И так 10 или больше вариантов
Оптимально ли будет использоватб  IF ... END_IF?
Или SWITCH ... END_SWITCH?
или другую конструкцию?
Без разницы

Раскидал по всем темам, теперь отследить не успеваешь.

Не могу найти оператор, который отдает координаты мыши.
http://crapware.aidf.org/forum/index.php?topic=5603.msg36707#msg36707

Мне надо следить за тем была ли сдвинута мышь, было ли повернуто колесо мыши и за тем не была ли нажата одна из нужных клавиш.
Не могу найти оператор, который сообщает о повороте колеса мыши.
Всё рассказывал здесь http://crapware.aidf.org/forum/index.php?topic=5603.msg36703#msg36703

Вижу, что есть работа с массивами, но не могу найти, как задать массив, как обратиться к  элементу по строке и столбцу. Или массив это всегда строка?
В справке же есть всё. Есть операторы. Есть в разделе "Введение" внизу часть про массивы. Там же есть ссылка
http://crapware.aidf.org/forum/index.php?topic=319.0

Про многомерные массивы
http://crapware.aidf.org/forum/index.php?topic=321.msg2686#msg2686
http://crapware.aidf.org/forum/index.php?topic=1138.msg5115#msg5115
http://crapware.aidf.org/forum/index.php?topic=2909.msg19070#msg19070

Есть оператор INIREAD Функция. Считывает параметр из файла конфгурации (*.ini) Можно ли задать массив в таком ini файле? (как?)
Формат ini файлов подразумевает секции и в них параметр=значение
Никаких массивов там нет. Можешь хранить одномерный массив объединив значения через разделитель при записи и так же разделяя при чтении.
Не проблема так хранить
Code: (clickermann) [Select]
var1=значение_1,значение_2,значение_3
$str = INIREAD("config.ini", "var1")
STRSEPARATE($str, ",", $arr)

Можно хранить массив в отдельном файле,  каждое значение массива на новой строке. Есть операторы для чтения записи TFREADARR, TFWRITEARR.


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: автоматизация в Давинчи
« Reply #6 on: September 16, 2021, 06:21:44 PM »
По блок схеме набросок
Code: (clickermann) [Select]
$N = 0
$xm_old = $_xmouse
$ym_old = $_ymouse

SUB(Will)
    LUP($_xmouse, $_ymouse)
    WAITMS(100)
    LDOWN($X[$N], $Y[$N])
    WAITMS(100)
END_SUB

WHILE(1)
    IF(($_xmouse != $xm_old) | ($_ymouse != $ym_old))
        // LOGWRITE("Курсор сместился")
        IF($N != 0)
            Will()
            $xm_old = $_xmouse
            $ym_old = $_ymouse
        END_IF
    END_IF
   
   
    GETKEYSDOWN($keys)
    IF(ARRSIZE($keys) > 0)
        $key_code = $keys[0]
        IF($key_code >= 48) & ($key_code <= 57)
            $key = $key_code - 48
            $N = $key
            print("Нажата кнопка ", $key)
           
            IF($key > 0)
                Will()
            END_IF
           
        END_IF
    END_IF
   
    // С колесом нужно что-то делать
    WAITMS(20)
END_CYC

HALT

Непонятно что за куча массивов справа.

В начале схемы, кажется сделано плохо. Сначала нужно определить если N не равно 0, тогда только определять сместился ли курсор.

С колесом не знаю что делать. Нет функции его определения.


Ivankak

  • Освоившийся
  • **
  • Posts: 37
    • View Profile
Re: автоматизация в Давинчи
« Reply #7 on: September 17, 2021, 02:54:59 AM »
сори, не могу понять синтаксис
вы писали
Quote
Формат ini файлов подразумевает секции и в них параметр=значение
Никаких массивов там нет. Можешь хранить одномерный массив объединив значения через разделитель при записи и так же разделяя при чтении.
Не проблема так хранить
Код: Clickermann

Code: (clickermann) [Select]
var1=значение_1,значение_2,значение_3
$str = INIREAD("config.ini", "var1")
STRSEPARATE($str, ",", $arr)


Не очень понимаю, что значит" никаких массивов там нет"
1. как хранить данные в ini файле
из описания в хэлпе я понял, что одна строка - одно значение, обращаться по номеру строки. А тут вы описываете другую конструкцию. Не могли бы вы прояснить:
как выглядят секции?
Первая строка в в этом примере и есть секция из ini файла и сам файл будет иметь следующее содержание?
var1=значение_1,значение_2,значение_3
var2=значение_1,значение_2,значение_3
.....
varN=значение_1,значение_2,значение_3

Будут ли проигнорированы пробелы и знаки табуляции? (например "12 , 34 , 5 ")
Можно ли таким образом в одном ini файле задать весь двумерный массив (по строкам) или надо все же отдельный ini на каждую строку?
(было бы удобно задавать массив прямо из csv файла с разделителями - запятыми)
Правильно ли я понимаю, что надо будет в программе записать столько операторов INIREAD, сколько строк в массиве или можно в одном операторе прочитать весь массив?



Пытаюсь также понять, как задавать массив в теле программы. скопировал код из хелпа.

Code: (clickermann) [Select]
$str = "12,45,56" // без кавычек не работает. Как язык отличает это строковые значения или числовые? Если стоят кавычки, то в массиве все равно числа?
strseparate($str, ",", $arr)
print($x[1])

я вижу две переменных $str и $arr, но не очень понимаю, как их использовать
str - входная строка / что это за переменная? она появляется только для объявления строки?
$arr - выходной массив / в этом месте происходит объявление массива? А если мне надо 2 строки, то strseparate писать после каждой строки? А если одномерный массив, то зачем 2 переменных и str и arr?

Как задать несколько строк в двумерном массиве?
Если не сложно, пожалуйста напишите пример, как задать одномерный и двухмерный массив.


« Last Edit: September 17, 2021, 04:33:57 AM by Ivankak »

Ivankak

  • Освоившийся
  • **
  • Posts: 37
    • View Profile
Re: автоматизация в Давинчи
« Reply #8 on: September 17, 2021, 04:19:12 AM »
Спасибо за код.
Массив это координаты органов управления Давинчи, на которые надо позиционировать курсор.
N - это переменная, условный номер органа управления для удобства она номер элемента в массиве, где хранятся координаты.
Вот картинка - номера не обязательно в таком порядке, просто для ясности.

« Last Edit: September 17, 2021, 04:23:01 AM by Ivankak »

Ivankak

  • Освоившийся
  • **
  • Posts: 37
    • View Profile
Re: автоматизация в Давинчи
« Reply #9 on: September 17, 2021, 04:53:51 AM »
по поводу колеса мыши.
http://crapware.aidf.org/forum/index.php?topic=33.msg562#msg562
Quote
"Количество функций Clickermann`а неуклонно продолжает расти, но необходимо очень много времени, чтоб можно было сделать свои обертки на все функции Windows. А теперь, когда появилась эта функция мы можем на прямую работать с интерфейсами окошек. И использовать максимум функционала."
далее по ссылке говорится, что можно использовать напрямую коды winapi из windows для команды POSTMESSAGE

означает ли это, что можно для команды GETMESSAGE также использовать коды?
тут https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-mouse_event
код для события поворот колеса
MOUSEEVENTF_WHEEL
0x0800
Колесо было перемещено, если у мыши есть колесо. Величина движения указывается в dwData

аналогично для проверки движения мыши можно использовать событие
MOUSEEVENTF_MOVE
0x0001
Произошло движение.
« Last Edit: September 17, 2021, 04:59:07 AM by Ivankak »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: автоматизация в Давинчи
« Reply #10 on: September 17, 2021, 09:53:15 AM »
по поводу колеса мыши.
http://crapware.aidf.org/forum/index.php?topic=33.msg562#msg562
Quote
"Количество функций Clickermann`а неуклонно продолжает расти, но необходимо очень много времени, чтоб можно было сделать свои обертки на все функции Windows. А теперь, когда появилась эта функция мы можем на прямую работать с интерфейсами окошек. И использовать максимум функционала."
далее по ссылке говорится, что можно использовать напрямую коды winapi из windows для команды POSTMESSAGE

означает ли это, что можно для команды GETMESSAGE также использовать коды?
тут https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-mouse_event
код для события поворот колеса
Нет, нельзя. В справке же написано что POSTMESSAGE "Посылает окну системное сообщение". Только посылает, никакие ответы не получает.
По ссылке и нет никаких кодов. Это функция на C++ которую можно вызвать и получить значения. Кликером это не сделать в стандартном функционале. Может можно на dll? но это к другим.


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: автоматизация в Давинчи
« Reply #11 on: September 17, 2021, 10:39:56 AM »
сори, не могу понять синтаксис
Не очень понимаю, что значит" никаких массивов там нет"
1. как хранить данные в ini файле
из описания в хэлпе я понял, что одна строка - одно значение, обращаться по номеру строки. А тут вы описываете другую конструкцию. Не могли бы вы прояснить:
как выглядят секции?
Первая строка в в этом примере и есть секция из ini файла и сам файл будет иметь следующее содержание?
var1=значение_1,значение_2,значение_3
var2=значение_1,значение_2,значение_3
.....
varN=значение_1,значение_2,значение_3
Вот так и нет. Одна строка - одно значение. Обращаться не по номеру строки, нет там такого. Обращение идёт по имени секции и имени параметра.

Формат ini
Code: (php) [Select]
[Section1]
par1=значение1
par2=значение2
par3=значение3

[Section2]
par1=значение4
par5=значение5
par6=значение6

Имена параметров в одной секции уникальные. Определённое имя - только одно. В разных секциях могут быть одинаковые имена параметров.
Кодировка файла ini win1251.

Читаем параметр "par1" из одной секции 1 и из секции 2
Code: (clickermann) [Select]
$var1 = INIREAD("config.ini", "par1", "Section1")
$var2 = INIREAD("config.ini", "par1", "Section2")

Массивов здесь нет. Можно кликером собрать массив в строку через разделитель и записать эту строку как значение. На выходе разделив обратно.

Будут ли проигнорированы пробелы и знаки табуляции? (например "12 , 34 , 5 ")
Не будут. Всё перейдёт в значение. Но при извлечении из массива это не помешает их переводу в числа (пробелы точно). В более старых версиях мешало. Поэтому я привык пробелы не оставлять если строка будет биться по разделителю.
« Last Edit: September 17, 2021, 10:54:59 AM by Vint »


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: автоматизация в Давинчи
« Reply #12 on: September 17, 2021, 11:00:51 AM »
Code: (clickermann) [Select]
$str = "12,45,56" // без кавычек не работает. Как язык отличает это строковые значения или числовые?
Конечно не работает. Все строки должны быть заключены в кавычки.
Если значение можно перевести в число, то переведёт, если нельзя - останется строкой.

Если стоят кавычки, то в массиве все равно числа?
Если можно перевести в число - то будут число.

Вот тест
Code: (clickermann) [Select]
$str = "12, 45, 56"
strseparate($str, ",", $arr)
print("==", $arr[2], "==")  // == в начале и конце чтобы видны были пробелы
print($arr[2] + 10, "   сложение выполняется")

IF($arr[2] = 56)
    print("равно")
ELSE
    print("НЕ равно")
END_IF

HALT

Вывод:
Quote
11:00:04 == 56==
11:00:04 66   сложение выполняется
11:00:04 равно


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: автоматизация в Давинчи
« Reply #13 on: September 17, 2021, 12:03:36 PM »
$str - входная строка / что это за переменная? она появляется только для объявления строки?
$arr - выходной массив / в этом месте происходит объявление массива?
Да.
Да.
$str можно не задавать и писать строку прямо в
Code: (clickermann) [Select]
strseparate("12,45,56" ",", $arr)Но это неудобно если строка длянная или получается откуда-то извне.

А если одномерный массив, то зачем 2 переменных и str и arr?
Непереводимая игра слов  :)


Code: (clickermann) [Select]
$str = "12,45,56" // без кавычек не работает. Как язык отличает это строковые значения или числовые? Если стоят кавычки, то в массиве все равно числа?
strseparate($str, ",", $arr)
print($x[1])

Как задать несколько строк в двумерном массиве?
Если не сложно, пожалуйста напишите пример, как задать одномерный и двухмерный массив.
Это и есть пример задания одномерного массива. Только принт неправильный

Code: (clickermann) [Select]
// одномерный
STRSEPARATE("12,45,56", ",", $one_dimensional_array)

LOGWRITE("Одномерный массив")
LOGWRITE("Размер массива: ", ARRSIZE($one_dimensional_array))
FOR($i=0, $i < ARRSIZE($one_dimensional_array))
    LOGWRITE("[", $i, "] = ", $one_dimensional_array[$i])
END_CYC
LOGWRITE(" ")


// псевдо-двумерный
STRSEPARATE("1,2,3,4", ",", $two_dimensional_array)
STRSEPARATE("10,20,30,40", ",", $two_dimensional_array)
STRSEPARATE("100,200,300,400", ",", $two_dimensional_array)


// выводим все элементы массива  $two_dimensional_array
LOGWRITE("Двумерный массив")
LOGWRITE("Размер массива: ", ARRSIZE($two_dimensional_array))
FOR($i=0, $i < ARRSIZE($two_dimensional_array))
    LOGWRITE("[", $i, "] = ", $two_dimensional_array[$i])
END_CYC
LOGWRITE(" ")

// выводим в двумерном виде  $two_dimensional_array
LOGWRITE("Двумерный вид")
$size = 4
FOR($row=0, $row < ARRSIZE($two_dimensional_array) / $size)
    $line = ""
    FOR($col=0, $col < $size)
        $n = $row * $size + $col
       
        // это для красивого вывода
        FOR($i=0, $i < (3 - $row))
            $line = STRCONCAT($line, " ")
        END_CYC
       
        $line = STRCONCAT($line, $two_dimensional_array[$n])
    END_CYC
    LOGWRITE($line)
END_CYC

HALT

Вывод:
Code: [Select]
12:00:52 Одномерный массив
12:00:52 Размер массива: 3
12:00:52 [0] = 12
12:00:52 [1] = 45
12:00:52 [2] = 56
12:00:52 
12:00:52 Двумерный массив
12:00:52 Размер массива: 12
12:00:52 [0] = 1
12:00:52 [1] = 2
12:00:52 [2] = 3
12:00:52 [3] = 4
12:00:52 [4] = 10
12:00:52 [5] = 20
12:00:52 [6] = 30
12:00:52 [7] = 40
12:00:53 [8] = 100
12:00:53 [9] = 200
12:00:53 [10] = 300
12:00:53 [11] = 400
12:00:53 
12:00:53 Двумерный вид
12:00:53    1   2   3   4
12:00:53   10  20  30  40
12:00:53  100 200 300 400


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: автоматизация в Давинчи
« Reply #14 on: September 17, 2021, 12:06:45 PM »
Перенесу посты из темы "IF_PICTURE_IN - Для новичков" сюда. Нечего им там делать