Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- СТАНДАРТНЫЕ БИБЛИОТЕКИ --
- -- https://github.com/unifiedremote/Docs/tree/master/libs
- local win = require("win"); -- https://github.com/unifiedremote/Docs/blob/master/libs/win.md
- local keyboard = require("keyboard"); -- https://github.com/unifiedremote/Docs/blob/master/libs/keyboard.md
- local timer = libs.timer; -- https://github.com/unifiedremote/Docs/blob/master/libs/timer.md
- local os = require("os"); -- https://github.com/unifiedremote/Docs/blob/master/libs/os.md
- local ffi = require("ffi"); -- https://github.com/unifiedremote/Docs/blob/master/libs/ffi.md
- local log = require("log"); -- https://github.com/unifiedremote/Docs/blob/master/libs/log.md
- -- ПОЛЕЗНЫЕ ПЕРЕМЕННЫЕ --
- local sProcessName = "NCStudio.exe"; -- имя исполняемого файла
- local sMDICommandText = ""; -- буфер для хранения текста MDI команды
- local nMainWindowHandler = 0; -- ID главного окна программы
- local nMainWindowScanInterval = 1000; -- интервал в миллисекундах между проверками на существование главного окна программы
- local nAxisPosChangeInterval = 250; -- интервал в миллисекундах между чтениями координат осей с главного окна
- local nButtonsCount = 69; -- кол-во кнопок в главном окне программы
- local tButtonHandler = {}; -- таблица с ID нужных кнопок главного окна
- local nSlidersCount = 3; -- кол-во слайдеров для регулировки в главном окне программы
- local tSliderHandler = {}; -- таблица с ID нужных слайдеров главного окна
- local nPercentStaticsCount = 2; -- кол-во статичных текстовых полей в главном окне, содержащих знак %
- local tPercentStaticHandler = {}; -- таблица с ID статичных текстовых полей, содержащих знак %
- -- ПОЛЕЗНЫЕ С++ ФУНКЦИИ --
- ffi.cdef[[
- int SendMessageA( int hWnd, int Msg, int wParam, int lParam );
- ]]
- local WM_LBUTTONDOWN = 0x0201;
- local WM_LBUTTONUP = 0x0202;
- local BM_CLICK = 0x00F5;
- local BM_GETCHECK = 0x00F0;
- local BST_CHECKED = 0x0001;
- -- функция эмулирует левый клик мыши по кнопке с указанным ID
- function fButtonClick ( nHandler )
- ffi.C.SendMessageA( nHandler, BM_CLICK, 0, 0 ); -- нажимаем левую кнопку мыши
- end
- -- функция проверяет нажата ли кнопка с указанным ID
- function fButtonPressed ( nHandler )
- return ( ffi.C.SendMessageA( nHandler, BM_GETCHECK, 0, 0 ) == BST_CHECKED );
- end
- -- функция передвигает курсор указанного слайдера вправо/влево
- function fSliderMove ( nHandler, sDirection )
- -- если sDirection не указано или имеет неверное значение
- if sDirection ~= "right" and sDirection ~= "left" then
- sDirection = "left"; -- сделаем направление - влево
- end
- -- сделаем слайдер в фокусе
- ffi.C.SendMessageA( nHandler, WM_LBUTTONDOWN, 0, 0 ); -- нажимаем левую кнопку мыши на слайдере
- ffi.C.SendMessageA( nHandler, WM_LBUTTONUP, 0, 0 ); -- отжимаем левую кнопку мыши
- keyboard.stroke( sDirection ); -- нажимаем кнопку влево / вправо
- end
- -- ПОЛЕЗНЫЕ ФУНКЦИИ --
- -- функция находит в главном окне программы нужные элементы
- -- для последующего чтения данных и правки значений
- function fFindAllWindowsHandlers()
- -- если нет главного окна программы, то делать ничего не будем
- if nMainWindowHandler < 1 then return end
- -- найдем все элементы главного окна
- local tAllSubWindows = win.findall( nMainWindowHandler, nil, nil, true );
- -- создадим таблицы для хранения ID элементов главного окна
- local tAllButtons = {}; -- таблица с ID всех кнопок главного окна
- local tAllSliders = {}; -- таблица с ID всех слайдеров главного окна
- local tAllStatic = {}; -- таблица с ID всех статичных текстовых полей главного окна
- -- пробежимся по общему списку ID всех элементов главного окна
- for k,v in pairs(tAllSubWindows) do
- local sClass = win.class(v); -- узнаем класс текущего элемента
- -- если текущий элемент это "Button", то кладем его ID в соотв. таблицу
- if sClass == "Button" then
- table.insert( tAllButtons, v );
- -- если текущий элемент это "msctls_trackbar32", то кладем его ID в соотв. таблицу
- elseif sClass == "msctls_trackbar32" then
- table.insert( tAllSliders, v );
- -- если текущий элемент это "Static", то кладем его ID в соотв. таблицу
- elseif sClass == "Static" then
- table.insert( tAllStatic, v );
- end
- end
- -- если кол-во кнопок окна совпадает с заданным в настройках
- if #tAllButtons == nButtonsCount then
- -- из общего списка всех кнопок окна нам нужны только эти
- -- X: 60, Y: 61, Z: 62, Feed: 64, Speed: 67, Spindle ON: 65
- tButtonHandler.X = tAllButtons[60];
- tButtonHandler.Y = tAllButtons[61];
- tButtonHandler.Z = tAllButtons[62];
- tButtonHandler.F = tAllButtons[64];
- tButtonHandler.S = tAllButtons[67];
- tButtonHandler.SpindleON = tAllButtons[65];
- end
- -- если кол-во слайдеров окна совпадает с заданным в настройках
- if #tAllSliders == nSlidersCount then
- -- из общего списка всех слайдеров окна нам нужны только эти
- -- Feed: 1, Speed: 3
- tSliderHandler.F = tAllSliders[1];
- tSliderHandler.S = tAllSliders[3];
- end
- -- выберем из всех статичных текстовых полей только те, что содержат знак %
- local tStaticWithPercent = {};
- for k,v in pairs(tAllStatic) do
- if string.find( win.title(v), "%", 1, true) then
- table.insert( tStaticWithPercent, v );
- end
- end
- -- если кол-во статичных текстовых полей окна совпадает с заданным в настройках
- if #tStaticWithPercent == nPercentStaticsCount then
- -- из общего списка всех статичных текстовых полей окна нам нужны только эти
- -- Feedrate Percent: 2
- tPercentStaticHandler.FeedPercent = tStaticWithPercent[2];
- end
- end
- -- функция выводит главное окно программы на передний план
- function fFocusMainWindow()
- -- если нет главного окна программы, то делать ничего не будем
- if nMainWindowHandler < 1 then return end
- -- переключаемся на окно процесса прораммы и ждем пока полностью покажется окно
- win.switchtowait(sProcessName);
- end
- -- функция отображает указанный текст в инфо блоке пульта
- function fShowInfo ( sInfo )
- -- проверяем существует ли в пульте элемент infoLabel и меняем его текст
- if layout.infoLabel ~= nil then
- layout.infoLabel.text = sInfo;
- end
- end
- -- ДЕЙСТВИЯ --
- -- функция вызывается при нажатии кнопки "-" рядом с пунктом "F"
- actions.feedrateDown = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- fSliderMove( tSliderHandler.F, "left" ); -- двигаем слайдер скорости подачи влево
- end
- -- функция вызывается при нажатии кнопки "+" рядом с пунктом "F"
- actions.feedrateUp = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- fSliderMove( tSliderHandler.F, "right" ); -- двигаем слайдер скорости подачи вправо
- end
- -- функция вызывается при нажатии кнопки "-" рядом с пунктом "S"
- actions.spindleSpeedDown = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- fSliderMove( tSliderHandler.S, "left" ); -- двигаем слайдер скорости вращения шпинделя влево
- end
- -- функция вызывается при нажатии кнопки "+" рядом с пунктом "S"
- actions.spindleSpeedUp = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- fSliderMove( tSliderHandler.S, "right" ); -- двигаем слайдер скорости вращения шпинделя вправо
- end
- -- функция вызывается при нажатии на кнопку SPINDLE
- actions.toggleSpindle = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- fButtonClick( tButtonHandler.SpindleON ); -- делаем левый клик по кнопке ON рядом со скоростью шпинделя
- end
- -- функция вызывается при нажатии на кнопку "X" (e-stop)
- actions.estop = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- keyboard.stroke("leftctrl","F12"); -- нажимаем комбинацию кнопок CTRL + F12
- end
- -- функция вызывается при нажатии на кнопку ">" (play)
- actions.play = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- keyboard.stroke("F9"); -- эмулируем нажатие кнопки F9
- end
- -- функция вызывается при нажатии на кнопку "||" (pause)
- actions.pause = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- keyboard.stroke("F10"); -- эмулируем нажатие кнопки F10
- end
- -- функция вызывается при нажатии на кнопку "[]" (stop)
- actions.stop = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- keyboard.stroke("F11"); -- эмулируем нажатие кнопки F11
- end
- -- функция вызывается при нажатии на кнопку HOME
- actions.refAllHome = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- keyboard.stroke("F7"); -- эмулируем нажатие кнопки F11
- end
- -- функция вызывается при нажатии на кнопку "X=0"
- actions.xZero = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- fButtonClick( tButtonHandler.X ); -- делаем левый клик по кнопке координаты X
- end
- -- функция вызывается при нажатии на кнопку "Y=0"
- actions.yZero = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- fButtonClick( tButtonHandler.Y ); -- делаем левый клик по кнопке координаты Y
- end
- -- функция вызывается при нажатии на кнопку "Z=0"
- actions.zZero = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- fButtonClick( tButtonHandler.Z ); -- делаем левый клик по кнопке координаты Z
- end
- -- функция вызывается при нажатии на кнопку "--X"
- actions.xFastMinusStart = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- keyboard.stroke("leftctrl","2"); -- нажимаем комбинацию кнопок CTRL + 2, чтобы перейти на закладку JOG
- keyboard.down("leftctrl","num4");-- нажимаем комбинацию кнопок CTRL + num4
- end
- -- функция вызывается при отжатии кнопки "--X"
- actions.xFastMinusEnd = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- keyboard.up("leftctrl","num4"); -- отжимаем комбинацию кнопок CTRL + num4
- end
- -- функция вызывается при нажатии на кнопку "-X"
- actions.xSlowMinusStart = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- keyboard.stroke("leftctrl","2"); -- нажимаем комбинацию кнопок CTRL + 2, чтобы перейти на закладку JOG
- keyboard.down("num4"); -- нажимаем на кнопку num4
- end
- -- функция вызывается при отжатии кнопки "-X"
- actions.xSlowMinusEnd = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- keyboard.up("num4"); -- отжимаем кнопку num4
- end
- -- функция вызывается при нажатии на кнопку "X+"
- actions.xSlowPlusStart = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- keyboard.stroke("leftctrl","2"); -- нажимаем комбинацию кнопок CTRL + 2, чтобы перейти на закладку JOG
- keyboard.down("num6"); -- нажимаем на кнопку num4
- end
- -- функция вызывается при отжатии кнопки "X+"
- actions.xSlowPlusEnd = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- keyboard.up("num6"); -- отжимаем кнопку num4
- end
- -- функция вызывается при нажатии на кнопку "X++"
- actions.xFastPlusStart = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- keyboard.stroke("leftctrl","2"); -- нажимаем комбинацию кнопок CTRL + 2, чтобы перейти на закладку JOG
- keyboard.down("leftctrl","num6");-- нажимаем комбинацию кнопок CTRL + num6
- end
- -- функция вызывается при отжатии кнопки "X++"
- actions.xFastPlusEnd = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- keyboard.up("leftctrl","num6"); -- отжимаем комбинацию кнопок CTRL + num6
- end
- -- функция вызывается при нажатии на кнопку "--Y"
- actions.yFastMinusStart = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- keyboard.stroke("leftctrl","2"); -- нажимаем комбинацию кнопок CTRL + 2, чтобы перейти на закладку JOG
- keyboard.down("leftctrl","num2");-- нажимаем комбинацию кнопок CTRL + num2
- end
- -- функция вызывается при отжатии кнопки "--Y"
- actions.yFastMinusEnd = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- keyboard.up("leftctrl","num2"); -- отжимаем комбинацию кнопок CTRL + num2
- end
- -- функция вызывается при нажатии на кнопку "-Y"
- actions.ySlowMinusStart = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- keyboard.stroke("leftctrl","2"); -- нажимаем комбинацию кнопок CTRL + 2, чтобы перейти на закладку JOG
- keyboard.down("num2"); -- нажимаем на кнопку num2
- end
- -- функция вызывается при отжатии кнопки "-Y"
- actions.ySlowMinusEnd = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- keyboard.up("num2"); -- отжимаем кнопку num2
- end
- -- функция вызывается при нажатии на кнопку "Y+"
- actions.ySlowPlusStart = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- keyboard.stroke("leftctrl","2"); -- нажимаем комбинацию кнопок CTRL + 2, чтобы перейти на закладку JOG
- keyboard.down("num8"); -- нажимаем на кнопку num4
- end
- -- функция вызывается при отжатии кнопки "Y+"
- actions.ySlowPlusEnd = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- keyboard.up("num8"); -- отжимаем кнопку num4
- end
- -- функция вызывается при нажатии на кнопку "Y++"
- actions.yFastPlusStart = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- keyboard.stroke("leftctrl","2"); -- нажимаем комбинацию кнопок CTRL + 2, чтобы перейти на закладку JOG
- keyboard.down("leftctrl","num8");-- нажимаем комбинацию кнопок CTRL + num8
- end
- -- функция вызывается при отжатии кнопки "Y++"
- actions.yFastPlusEnd = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- keyboard.up("leftctrl","num8"); -- отжимаем комбинацию кнопок CTRL + num8
- end
- -- функция вызывается при нажатии на кнопку "--Z"
- actions.zFastMinusStart = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- keyboard.stroke("leftctrl","2"); -- нажимаем комбинацию кнопок CTRL + 2, чтобы перейти на закладку JOG
- keyboard.down("leftctrl","num1");-- нажимаем комбинацию кнопок CTRL + num1
- end
- -- функция вызывается при отжатии кнопки "--Z"
- actions.zFastMinusEnd = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- keyboard.up("leftctrl","num1"); -- отжимаем комбинацию кнопок CTRL + num1
- end
- -- функция вызывается при нажатии на кнопку "-Z"
- actions.zSlowMinusStart = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- keyboard.stroke("leftctrl","2"); -- нажимаем комбинацию кнопок CTRL + 2, чтобы перейти на закладку JOG
- keyboard.down("num1"); -- нажимаем на кнопку num1
- end
- -- функция вызывается при отжатии кнопки "-Z"
- actions.zSlowMinusEnd = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- keyboard.up("num1"); -- отжимаем кнопку num1
- end
- -- функция вызывается при нажатии на кнопку "Z+"
- actions.zSlowPlusStart = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- keyboard.stroke("leftctrl","2"); -- нажимаем комбинацию кнопок CTRL + 2, чтобы перейти на закладку JOG
- keyboard.down("num9"); -- нажимаем на кнопку num4
- end
- -- функция вызывается при отжатии кнопки "Z+"
- actions.zSlowPlusEnd = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- keyboard.up("num9"); -- отжимаем кнопку num4
- end
- -- функция вызывается при нажатии на кнопку "Z++"
- actions.zFastPlusStart = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- keyboard.stroke("leftctrl","2"); -- нажимаем комбинацию кнопок CTRL + 2, чтобы перейти на закладку JOG
- keyboard.down("leftctrl","num9");-- нажимаем комбинацию кнопок CTRL + num9
- end
- -- функция вызывается при отжатии кнопки "Z++"
- actions.zFastPlusEnd = function()
- fFocusMainWindow(); -- выводим главное окно программы на передний план
- keyboard.up("leftctrl","num9"); -- отжимаем комбинацию кнопок CTRL + num9
- end
- -- функция вызывается при любом изменении текста элемента пульта для ввода MDI команд
- actions.MDItextChanged = function ( sText )
- -- в переменной sMDICommandText всегда будет хранится текущая версия текста
- -- элемента пульта для ввода MDI команд
- sMDICommandText = sText;
- end
- -- функция вызывается при нажатии кнопки SEND рядом с полем ввода MDI команд
- -- и выполняет указанную в MDI поле команду
- actions.MDIrun = function()
- -- если главное окно программы НЕ найдено или длина строки команды слишком мала
- if nMainWindowHandler < 1 or string.len(sMDICommandText) < 1 then
- -- просто завершим функцию
- return;
- end
- -- выводим главное окно программы на передний план
- fFocusMainWindow();
- -- открываем окно ввода MDI команд - нажимаем комбинацию кнопок CTRL + SHIFT + F9
- keyboard.stroke("leftctrl","leftshift","F9");
- -- делаем небольшую паузу (0.2 сек), чтобы окно полностью открылось
- os.sleep(200);
- -- вводим текст команды
- keyboard.text(sMDICommandText);
- -- жмем ENTER
- keyboard.stroke("enter");
- -- выводим инфо о последней команде
- fShowInfo("Last command: "..sMDICommandText);
- -- очищаем форму для ввода MDI команд в пульте
- layout.MDIinput.text = "";
- -- очищаем буфер c текстом команды
- sMDICommandText = "";
- end
- -- функция вызывается перед выполнением любого действия пульта
- events.preaction = function ( name, extras )
- -- если нет главного окна программы, то действие выполнять не надо
- if nMainWindowHandler < 1 then
- return false;
- -- а если окно есть - выполним
- else
- return true;
- end
- end
- -- ИНИЦИАЛИЗАЦИЯ --
- -- этот блок кода выполняется сразу же при обработке текущего файла сервером
- do
- -- получим и сохраним ID главного окна программы в переменную
- nMainWindowHandler = win.window(sProcessName);
- -- найдем ID всех нужных элементов главного окна
- fFindAllWindowsHandlers();
- -- запустим повтор указанной функции каждые nMainWindowScanInterval микросекунд
- timer.interval(
- -- Функция проверяет существование главного окна программы,
- -- и, если нужно, находит новые ID главного окна и всех его нужных элементов.
- -- Также проверяется работает ли шпиндель и, в звисимости от этого,
- -- может менятся кнопка для запуска шпинделя в пульте
- function()
- -- получим и сохраним ID главного окна программы в локальную переменную
- local nHandler = win.window(sProcessName);
- -- если найдено новое главное окно программы
- if nHandler > 0 and nMainWindowHandler ~= nHandler then
- -- сохраним ID главного окна программы в глобальную переменную
- nMainWindowHandler = nHandler;
- -- найдем ID всех нужных элементов главного окна
- fFindAllWindowsHandlers();
- -- выведем оповещение в инфо блоке о том, что главное окно программы найдено
- fShowInfo("Remote works fine");
- -- если главное окно программы НЕ найдено
- elseif nHandler < 1 then
- -- выведем оповещение в инфо блоке о том, что главное окно программы НЕ найдено
- fShowInfo("Program "..sProcessName.." isn't running");
- -- ID главного окна теперь нет
- nMainWindowHandler = 0;
- end
- -- если главное окно программы найдено
- if nHandler > 0 then
- -- если шпиндель включён
- if fButtonPressed( tButtonHandler.SpindleON ) then
- -- поменяем текст и цвет кнопки пульта для запуска шпинделя
- layout.toggleSpindle.text = "SPINDLE : ON";
- layout.toggleSpindle.light = "normal:#FF8000;focus:#FFCC99;active:#FFCC99;color:#800000;";
- layout.toggleSpindle.dark = "normal:#FF8000;focus:#FFCC99;active:#FFCC99;color:#800000;";
- -- если шпиндель не работает
- else
- -- вернём обычный текст и цвет кнопки пульта для запуска шпинделя
- layout.toggleSpindle.text = "SPINDLE";
- layout.toggleSpindle.light = "normal:orange;focus:#FFCC99;active:#FFCC99;color:#FFFFFF;";
- layout.toggleSpindle.dark = "normal:orange;focus:#FFCC99;active:#FFCC99;color:#FFFFFF;";
- end
- end
- end,
- nMainWindowScanInterval -- значение этой переменной смотрите в начале файла
- );
- -- запустим повтор указанной функции каждые nAxisPosChangeInterval микросекунд
- timer.interval(
- -- функция обновляет значения позиций координат, скоростей и прочего в пульте
- function()
- -- если нет главного окна или элемента с позицие X, то делать ничего не будем
- if nMainWindowHandler < 1 or tButtonHandler.X < 1 then return end
- -- обновление координат осей
- layout.xPos.text = win.title( tButtonHandler.X ); -- Work X, рабочая позиция координаты X
- layout.yPos.text = win.title( tButtonHandler.Y ); -- Work Y, рабочая позиция координаты Y
- layout.zPos.text = win.title( tButtonHandler.Z ); -- Work Z, рабочая позиция координаты Z
- -- обновление скорости подачи
- layout.fValue.text = win.title( tButtonHandler.F ); -- FeedPercent, процент скорости подачи
- layout.fPercent.text = win.title( tPercentStaticHandler.FeedPercent ); -- Feedrate, скорость подачи
- -- обновление скорости вращения шпинделя
- layout.sValue.text = win.title( tButtonHandler.S ); -- Speed, скорость вращения шпинделя
- end,
- nAxisPosChangeInterval -- значение этой переменной смотрите в начале файла
- );
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement