Kibor |
Отправлено: 25 Апреля, 2021 - 19:05:38
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Обновил архив.
В нем 4 демонстрационных блока.
Визуальный редактор генерирует полностью исполняемый код.
Логика (связи) пока не рассчитываются.
Так же нет циклов, глобальных пользовательских переменных и прочего.
Тест на генерирование кода.
Должны корректно работать все блоки в шаблонах.
Код строится по такой первоочередности:
1 - #define в блоке [GLOBAL_SINGLE_CODE]
2 - #include в блоке [GLOBAL_SINGLE_CODE]
3 - Глобальные переменные, объявленные в блоке [GLOBAL_VAR]
4 - external в блоке [GLOBAL_SINGLE_CODE]
5 - Глобальный код в блоке [GLOBAL_SINGLE_CODE]
6 - Глобальный код в блоке [GLOBAL_REPEAT_CODE]
7 - Вызов функций (пока без логической связи)
8 - Тело вызываемых функций (если прописано в блоке [FUNCTION_BODY])
external в Визуальном редакторе не расчитан на глобальный код. В нем могут быть только функции без гобального кода, которые будут вызваны в шаблоне по необходимости.
Не должно быть повторов переменных и кода, который повторяться не должен.
На данный момент не должно быть одноименных переменных в разных блоках.
В блоке FindImage есть #include. Его надо закомментировать после получения кода, так как такого файла нет и будет ошибка. Это для теста.
Получаемый код (Отобразить)CODE:#define WM_COMMAND 273
#define NULL 0
#include"C:\Program Files (x86)\Kibor\liba.txt" //Это для демонстрации (Будет ошибка, так как нет файла) ЗАКОММЕНТИРОВАТЬ в полученном коде
int Color1[2] = {0,5};
int Kol1[2] = {2,2};
int X;
int Y;
int Color0[3] = {0,2, 5};
int Kol0[3] = {2,2, 1};
int K_kib;
int X_Kib[1000];
int Y_kib[1000];
int Image1[16][20];
win win0 = window("Калькулятор","CalcFrame",-1);
int Proc;
int Image0[40][100];
external(INT, "MessageBoxA", "MessageBoxA", "user32.dll");
messagebox("Будет использоваться FindImage");
beep(1000, 100);
loadimage(#Image1[0][0], "C:\Image_0.bmp");
loadimage(#Image0[0][0], "C:\3D Master\Textyr\pist_1.bmp");
if (FindHeapcolor(#Color1[0], #Kol1[0], 2, 2, #X, #Y)>0){}
if (FindHeapcolor(#Color0[0], #Kol0[0], 3, 3, #X, #Y)>0){}
if (FindImage(#Image1[0][0], 1, #K_kib, #X_Kib[0], #Y_kib[0], 0)>0){}
MessageBoxA(NULL, "Это подключенная Api функция", "Заголовок", NULL);
Proc=OpenProcess(#win0);
if (FindImage(#Image0[0][0], 1, #K_kib, #X_Kib[0], #Y_kib[0], 0)>0){}
function FindHeapcolor(int #col, int #kol, int k_col, int k_kol, int #x, int #y)
{
return findheapcolor(1, #col[0], #kol[0], k_col, k_kol, #x, #y, 15, 15, 50, 50, 0, 0, 1000, 1000, -1);
}
function FindImage(int #image, int kol, int #mK, int #mX, int #mY, int Mouse)
{
mK=findimage(kol, #image[0][0], -1, #mX[0], #mY[0], 0, 0, 1024, 768, -1);
if (mK<0)MessageBoxA(0, "Ошибка", "Окно", 0);
if (Mouse==0)mouse(LEFT, mX[0], mY[0]);
if (Mouse==1)mousedown(LEFT, mX[0], mY[0]);
if (Mouse==2)mouseup(LEFT, mX[0], mY[0]);
return mK;
}
function OpenProcess(win #w)
{
return openprocess(w);
}
Используемые шаблоны:
FindHeapcolor (Отобразить)CODE:[ESCAPE_CHAR]
^
[END]
[INTERFACE]
DIALOG, "Поиск findheapcolor", 408, 119;
STATIC, "Цвета", 8, 8, 100, 20;
EDIT, 116, 8, 276, 20, int D_Color;
STATIC, "Количества", 8, 32, 100, 20;
EDIT, 116, 32, 276, 20, int D_Kol;
BUTTON_OK, "Принять", 180, 64, 100, 20;
BUTTON_CANCEL, "Закрыть", 292, 64, 100, 20;
[END]
[ASSOC_NUMBER]
D_Color, D_Kol;
[END]
[ASSOC_VAR]
D_Color = 0, 5;
D_Kol = 2, 2;
V_color = #Color~*~;
V_kol = #Kol~*~;
V_k_color = ~GET(amtelement(~D_Color~))~;
V_k_kol = ~GET(amtelement(~D_Kol~))~;
V_X = #X;
V_Y = #Y;
[END]
[GLOBAL_VAR]
int Color~*~[~GET(amtelement(~D_Color~))~] = {~D_Color~};
int Kol~*~[~GET(amtelement(~D_Kol~))~] = {~D_Kol~};
int X, Y;
[END]
[FUNCTION_BODY]
function(int #col, int #kol, int k_col, int k_kol, int #x, int #y)
{
return findheapcolor(1, #col[0], #kol[0], k_col, k_kol, #x, #y, 15, 15, 50, 50, 0, 0, 1000, 1000, -1);
}
[END]
[FUNCTION_CALL]
(V_color[0], V_kol[0], V_k_color, V_k_kol, V_X, V_Y)
[END]
[FUNCTION_LOGIC]
>0
[END]
FindImage (Отобразить)CODE:[ESCAPE_CHAR]
^
[END]
[INTERFACE]
DIALOG, "Поиск изображения", 499, 139;
BUTTON_OK, "Принять", 284, 88, 100, 20;
BUTTON_CANCEL, "Закрыть", 388, 88, 100, 20;
STATIC, "Путь к файлу", 8, 8, 100, 20;
EDIT, 116, 8, 276, 20, string Path;
BUTTON_FILE, "Путь к файлу", 396, 8, 92, 20, Path;
STATIC, "Сколько искать", 8, 32, 100, 20;
EDIT, 116, 32, 52, 20, int Kol;
COMBO, "Мышь клик" "Мышь нажать" "Мышь отпустить", 172, 32, 220, 80, int M;
STATIC, "Количество", 8, 56, 100, 20;
EDIT, 116, 56, 52, 20, int K;
STATIC, "X", 176, 56, 24, 20;
STATIC, "Y", 288, 56, 24, 20;
EDIT, 208, 56, 72, 20, int X;
EDIT, 320, 56, 72, 20, int Y;
[END]
[ASSOC_NUMBER]
Path
[END]
[ASSOC_VAR]
Path="C:\Image_0.bmp";
Kol = 1;
X = #X_Kib;
Y = #Y_kib;
K = #K_kib;
M = 0;
Image = #Image~*~;
[END]
[GLOBAL_VAR]
int K_kib, X_Kib[1000], Y_kib[1000];
int Image~*~[~GET(imagewidth(~Path~))~][~GET(imageheight(~Path~))~];
[END]
[GLOBAL_SINGLE_CODE]
#define WM_COMMAND 0x111
#include"C:\Program Files (x86)\Kibor\liba.txt" //Это для демонстрации (Будет ошибка, так как нет файла) ЗАКОММЕНТИРОВАТЬ в полученном коде
external(INT, "MessageBoxA", "MessageBoxA", "UseR32.dlL");
messagebox ("Будет использоваться FindImage");
beep (1000, 100);
[END]
[GLOBAL_REPEAT_CODE]
loadimage(#Image~*~[0][0], ~Path~);
[END]
[FUNCTION_BODY]
function (int #image, int kol, int #mK, int #mX, int #mY, int Mouse)
{
mK=findimage(kol, #image[0][0], -1, #mX[0], #mY[0], 0, 0, 1024, 768, -1);
if (mK<0)MessageBoxA(0, "Ошибка", "Окно", 0);
if (Mouse==0)mouse(LEFT, mX[0], mY[0]);
if (Mouse==1)mousedown(LEFT, mX[0], mY[0]);
if (Mouse==2)mouseup(LEFT, mX[0], mY[0]);
return mK;
}
[END]
[FUNCTION_CALL]
(Image[0][0], Kol, K, X[0], Y[0], M)
[END]
[FUNCTION_LOGIC]
>0
[END]
MessageBoxA (Отобразить)CODE:[INTERFACE]
DIALOG, "MessageBox", 405, 111;
STATIC, "Заголовок", 8, 8, 100, 20;
EDIT, 116, 8, 276, 20, string Zag;
STATIC, "Текст", 8, 32, 100, 20;
EDIT, 116, 32, 276, 20, string Text;
BUTTON_OK, "Принять", 184, 60, 100, 20;
BUTTON_CANCEL, "Закрыть", 292, 60, 100, 20;
[END]
[ASSOC_VAR]
N1 = NULL;
Text ="Это подключенная Api функция";
Zag = "Заголовок";
N2 = NULL;
[END]
[GLOBAL_SINGLE_CODE]
#define NULL 0x0
external(INT, "MessageBoxA", "MessageBoxA", "User32.dll");
[END]
[FUNCTION_CALL]
(N1, Text, Zag, N2)
[END]
OpenProcess (Отобразить)CODE:[ESCAPE_CHAR]
^
[END]
[INTERFACE]
DIALOG, "Открсс", 370, 102;
BUTTON_OK, "Принять", 159, 50, 100, 25;
BUTTON_CANCEL, "Закрыть", 262, 50, 100, 25;
STATIC, "Указатель на окно", 10, 10, 120, 18;
EDIT, 135, 8, 220, 18, win Win;
STATIC, "Переменная", 10, 30, 90, 18;
EDIT_WRITE_RETURN, 100, 30, 70, 18, int Return;
[END]
[ASSOC_NUMBER]
Win
[END]
[ASSOC_VAR]
Win = window ("Калькулятор", "CalcFrame", -1);
Return = Proc;
W=#win~*~;
[END]
[GLOBAL_VAR]
win win~*~ = ~Win~;
int Proc;
[END]
[FUNCTION_BODY]
function (win #w)
{
return openprocess(w);
}
[END]
[FUNCTION_CALL]
(W)
[END]
Есть какие то предложения? Или задачи, которые нельзя реализовать данным методом? |
|
|
Kibor |
Отправлено: 25 Апреля, 2021 - 22:52:12
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Пример блока распознавания текста, который позволяет выбирать и использовать любую на выбор базу, отключая не нужные и подключая используемую.
Выбор символов NUM | RU | EN | MARK осуществляется галками (так же как и другие побитовые операции).
CODE:[INTERFACE]
DIALOG, "Диалог", 469, 140;
STATIC, "База", 8, 8, 36, 20;
EDIT, 52, 8, 292, 20, string base;
BUTTON_FILE, "Выбрать файл", 356, 8, 100, 20, base;
CHECK, "Рус", 8, 36, 40, 20, int G1;
CHECK, "En", 52, 36, 36, 20, int G2;
CHECK, "Цифры", 92, 36, 56, 20, int G3;
CHECK, "Знаки", 152, 36, 52, 20, int G4;
STATIC, "Текст будет в", 8, 64, 76, 20;
EDIT, 92, 64, 112, 20, string T;
BUTTON_OK, "Принять", 248, 88, 100, 20;
BUTTON_CANCEL, "Закрыть", 356, 88, 100, 20;
[END]
[ASSOC_NUMBER]
base
[END]
[ASSOC_VAR]
base="C:\basetext.sib";
G1 = 1;
G2 = 0;
G3 = 0;
G4 = 0;
text = #Text;
T = Text;
[END]
[GLOBAL_VAR]
string Text;
[END]
[GLOBAL_REPEAT_CODE]
loadsymbolbase (~base~);
[END]
[FUNCTION_BODY]
function (string base, string #text, int g1, int g2, int g3, int g4)
{
disablesymbolbase(ALL);
enablesymbolbase(base);
int G=0;
if (g1)G=G+RU;
if (g2)G=G+EN;
if (g3)G=G+NUM;
if (g4)G=G+MARK;
readtext (G, #text, 8, 1, -1, -1, -1, -1, -1, 0, -1, 73, 78, 77, 81, -1);
}
[END]
[FUNCTION_CALL]
(base, text, G1, G2, G3, G4)
[END]
Генерируемый код, который использует две разные базы и выводит MessageBoxA с распознанным текстом.
CODE:#define NULL 0
string Text;
external(INT, "MessageBoxA", "MessageBoxA", "user32.dll");
loadsymbolbase("C:\basetext.sib");
loadsymbolbase("C:\basetext2.sib");
ReadText("C:\basetext.sib", #Text, 0, 0, 1, 0);
MessageBoxA(NULL, Text, "Заголовок", NULL);
ReadText("C:\basetext2.sib", #Text, 1, 0, 0, 0);
function ReadText(string base, string #text, int g1, int g2, int g3, int g4)
{
disablesymbolbase(ALL);
enablesymbolbase(base);
int G=0;
if (g1)G=G+RU;
if (g2)G=G+EN;
if (g3)G=G+NUM;
if (g4)G=G+MARK;
readtext (G, #text, 8, 1, -1, -1, -1, -1, -1, 0, -1, 73, 78, 77, 81, -1);
}
|
|
|
Kibor |
Отправлено: 26 Апреля, 2021 - 09:39:48
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Zireael пишет: Блок FindImage, если изменить #X_Kib и #Y_Kib на #X_Kib1 и #Y_Kib1, то вызов функции сгенерируется верно:
CODE:if (FindImage(#Image0[0][0], 1, #K_kib, #X_Kib1[0], #Y_kib1[0], 0)>0){}
но массивы будут объявлены без изменений:
CODE:int X_Kib[1000];
int Y_kib[1000];
Обновил архив.
Устранил баг, который не давал видеть имя глобальной переменной если оно начиналось с ~
В архиве есть блок ReadText
В нем есть поле
"Текст будет в"
и Edit с именем переменной.
Если пользователь меняет в этом поле имя, будет объявлена глобальная переменная с этим именем и эта копия блока будет работать с этой переменной.
В разных блоках ReadText можно таким образом переименовывать переменные и они будут автоматически объявляться.
Реализация:
Цитата: [INTERFACE]
DIALOG, "Диалог", 469, 140;
STATIC, "База", 8, 8, 36, 20;
EDIT, 52, 8, 292, 20, string base;
BUTTON_FILE, "Выбрать файл", 356, 8, 100, 20, base;
CHECK, "Рус", 8, 36, 40, 20, int G1;
CHECK, "En", 52, 36, 36, 20, int G2;
CHECK, "Цифры", 92, 36, 56, 20, int G3;
CHECK, "Знаки", 152, 36, 52, 20, int G4;
STATIC, "Текст будет в", 8, 64, 76, 20;
EDIT, 92, 64, 112, 20, string T;
BUTTON_OK, "Принять", 248, 88, 100, 20;
BUTTON_CANCEL, "Закрыть", 356, 88, 100, 20;
[END]
[ASSOC_VAR]
base="C:\basetext.sib";
G1 = 1;
G2 = 0;
G3 = 0;
G4 = 0;
text = #~T~;
T = Text;
[END]
[GLOBAL_VAR]
string ~T~;
[END]
[FUNCTION_CALL]
(base, text, G1, G2, G3, G4)
[END]
Полный код ReadText
ReadText (Отобразить)CODE:[INTERFACE]
DIALOG, "Диалог", 469, 140;
STATIC, "База", 8, 8, 36, 20;
EDIT, 52, 8, 292, 20, string base;
BUTTON_FILE, "Выбрать файл", 356, 8, 100, 20, base;
CHECK, "Рус", 8, 36, 40, 20, int G1;
CHECK, "En", 52, 36, 36, 20, int G2;
CHECK, "Цифры", 92, 36, 56, 20, int G3;
CHECK, "Знаки", 152, 36, 52, 20, int G4;
STATIC, "Текст будет в", 8, 64, 76, 20;
EDIT, 92, 64, 112, 20, string T;
BUTTON_OK, "Принять", 248, 88, 100, 20;
BUTTON_CANCEL, "Закрыть", 356, 88, 100, 20;
[END]
[ASSOC_NUMBER]
base
[END]
[ASSOC_VAR]
base="C:\basetext.sib";
G1 = 1;
G2 = 0;
G3 = 0;
G4 = 0;
text = #~T~;
T = Text;
[END]
[GLOBAL_VAR]
string ~T~;
[END]
[GLOBAL_REPEAT_CODE]
loadsymbolbase (~base~);
[END]
[FUNCTION_BODY]
function (string base, string #text, int g1, int g2, int g3, int g4)
{
disablesymbolbase(ALL);
enablesymbolbase(base);
int G=0;
if (g1)G=G+RU;
if (g2)G=G+EN;
if (g3)G=G+NUM;
if (g4)G=G+MARK;
readtext (G, #text, 8, 1, -1, -1, -1, -1, -1, 0, -1, 73, 78, 77, 81, -1);
}
[END]
[FUNCTION_CALL]
(base, text, G1, G2, G3, G4)
[END]
(Добавление)
С указателями на переменные это тоже работает, но надо немного доработать, так как переменная объявляется с #.
Или оставить как есть..
Тогда пользователю не надо будет ставить # что бы указать что это указатель на переменную..
На примере FindImage так можно изменить переменную K_kib.
CODE:[ESCAPE_CHAR]
^
[END]
[INTERFACE]
DIALOG, "Поиск изображения", 499, 139;
BUTTON_OK, "Принять", 284, 88, 100, 20;
BUTTON_CANCEL, "Закрыть", 388, 88, 100, 20;
STATIC, "Путь к файлу", 8, 8, 100, 20;
EDIT, 116, 8, 276, 20, string Path;
BUTTON_FILE, "Путь к файлу", 396, 8, 92, 20, Path;
STATIC, "Сколько искать", 8, 32, 100, 20;
EDIT, 116, 32, 52, 20, int Kol;
COMBO, "Мышь клик" "Мышь нажать" "Мышь отпустить", 172, 32, 220, 80, int M;
STATIC, "Количество", 8, 56, 100, 20;
EDIT, 116, 56, 52, 20, int K;
STATIC, "X", 176, 56, 24, 20;
STATIC, "Y", 288, 56, 24, 20;
EDIT, 208, 56, 72, 20, int X;
EDIT, 320, 56, 72, 20, int Y;
[END]
[ASSOC_NUMBER]
Path
[END]
[ASSOC_VAR]
Path="C:\Image_0.bmp";
Kol = 1;
X = #X_Kib;
Y = #Y_kib;
tK = #~K~;
K = K_kib;
M = 0;
Image = #Image~*~;
[END]
[GLOBAL_VAR]
int ~K~, X_Kib[1000], Y_kib[1000];
int Image~*~[~GET(imagewidth(~Path~))~][~GET(imageheight(~Path~))~];
[END]
[GLOBAL_SINGLE_CODE]
#define WM_COMMAND 0x111
#include "C:\Program Files (x86)\Kibor\liba.txt" //Это для демонстрации (Будет ошибка, так как нет файла) ЗАКОММЕНТИРОВАТЬ в полученном коде
external(INT, "MessageBoxA", "MessageBoxA", "UseR32.dlL");
messagebox ("Будет использоваться FindImage");
beep (1000, 100);
[END]
[GLOBAL_REPEAT_CODE]
loadimage(#Image~*~[0][0], ~Path~);
[END]
[FUNCTION_BODY]
function (int #image, int kol, int #mK, int #mX, int #mY, int Mouse)
{
mK=findimage(kol, #image[0][0], -1, #mX[0], #mY[0], 0, 0, 1024, 768, -1);
if (mK<0)MessageBoxA(0, "Ошибка", "Окно", 0);
if (Mouse==0)mouse(LEFT, mX[0], mY[0]);
if (Mouse==1)mousedown(LEFT, mX[0], mY[0]);
if (Mouse==2)mouseup(LEFT, mX[0], mY[0]);
return mK;
}
[END]
[FUNCTION_CALL]
(Image[0][0], Kol, tK, X[0], Y[0], M)
[END]
[FUNCTION_LOGIC]
>0
[END]
|
|
|
|