Zireael |
Отправлено: 30 Апреля, 2023 - 21:00:43
|
Эксперт
Покинул форум
Сообщений всего: 4468
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: Каждый промежуток считается за один символ. Даже если он имеет несколько пробелов.
Это тут причём если удаляем пробелы.
Да, в X_S и Y_S записались координаты правильные. Дальше удаляем пробелы.
CODE:if (dp) regexreplace(-1, #text, text, " ", "");
Сколько пробелов при этом удалилось неизвестно. И что получилось, теперь символ находится в другой позиции, если перед ним удалились пробелы.
К примеру, был символ 10й, в массивах X_S и Y_S тоже 10й элемент, но мы же удалили пробелы, допустим 3 пробела, теперь символ в строке не 10й, а 7й. А вот в массивах X_S и Y_S его координаты так и остались на том же месте.
Кстати, обычно функции замены возвращают количество замен, а не 1 или 0. |
|
|
Kibor |
Отправлено: 30 Апреля, 2023 - 21:58:52
|
Эксперт
Покинул форум
Сообщений всего: 8226
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Zireael пишет: удалить пробелы
Вы намешали одно с другим.
readtext сам удаляет не нужные пробелы, при этом правильно составляя массив координат для каждого экранного символа. Давая нам понять что любой промежуток - один символ.
Если вы произвели какую то деформацию текста, то деформацию координат относительно деформации текста вы тоже должны произвести сами.
Если вы не будете делать не нужную операцию
CODE:regexreplace(-1, #text, text, " ", ""); // удалить пробелы
то ДА начнется с 7 индекса.
Когда то я снимал видео где был перенос координат в вашем случае. Но зачем оно тут? Найдите свое Да без вашего удаления пробелов. За вас то сделал readtext. И по найденной позиции кликайте.
То есть текст на экране
123 45 да
будет для программы
123пробел45пробелда
Этот текст будет в результате в text
text = "123 45 да";
И как на экране, так и для регулярного выражения
CODE:string text = "123 45 да";
regexsearch(1, #text, text, "да"); // найти слово да
messagebox (regexstart(0));//7
это будет седьмой символ.
Зачем что то еще деформировать?
Код распознает текст 123 45 да и кликнет ровно перед Д. В нижний левый его угол.
Цитата: string Text;
loadsymbolbase ("C:\Program Files (x86)\Kibor\basetext.sib");
readtext (NUM | RU, #Text, 2, 1, -1, -1, -1, -1, -1, 0, 50, 53, 346, 135, 361, -1);
//messagebox (Text);//тест
regexsearch(1, #Text, Text, "да"); // найти слово да
mousemove(53+symbolxpos(regexstart(0)), 346+symbolypos(regexstart(0)));
messagebox (regexstart(0));//7
И не надо никаких своих regexreplace
В визуальном редакторе это только удаляет пробелы в выводе текста в переменную.
Проверяйте этот код (или код с виз редактора) на блокноте с поиском слова ДА или другого в строке с любым количеством пробелов между словами.
Короче.. Посмотрели на экран, увидели что Д является 7 индексом (учитывая пробелы) и учитывая что первый символ - 0. Распознали текст с помощью readtext. Он сам сделает текст что Д будет как и выглядит - 7. Нашли его позицию с помощью regexsearch. Она и вернет на 7.
И по седьмому и кликнули.
(Добавление)
Можно конечно сделать в виз редакторе, что бы при этой галке не учитывались пробелы для координат..
А пока можно найти ДА с помощью регулярки, учитывающей что Могут быть пробелы между буквами Д и А.. Но не удаляя их.
(Добавление)
CODE:string Text="Код распознает текст 123 45 да и кликнет ровно перед Д. В нижний левый его угол.";//да слитно
//string Text="Код распознает текст 123 45 д а и кликнет ровно перед Д. В нижний левый его угол.";//да раздельно
messagebox (Text);//тест
regexsearch(1, #Text, Text, "д(\s|)а"); // найти слово да или д а
messagebox (regexstart(0));//28 |
|
|
Kibor |
Отправлено: 01 Мая, 2023 - 07:10:57
|
Эксперт
Покинул форум
Сообщений всего: 8226
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Код рас ает текст 123 45 да и кликнет ровно п и это нужноедане В ни его угол.
К многодададаслитно распознает т ст 123 45 д а и кликнет ровно перед Д. В нижний лев угол.
И если удалить все пробелы, то начнутся проблемы, которые приведут что найдутся слова входящие в состав других слов.
Красные тоже найдутся. А должны найтись только зеленые.
Указать свою зону поиска надо...
Цитата: string Text;
loadsymbolbase ("C:\Program Files (x86)\Kibor\basetext.sib");
readtext (NUM | RU | MARK, #Text, 2, 1, -1, -1, -1, -1, -1, 0, 50, 221, 286, 897, 330, -1);
messagebox (Text);//тест
//Буквы в составе числа на цифры
loop(5)
{
while(regexreplace(-1, #Text, Text, "(?<=\d)о", "0", MULTILINE)){}
while(regexreplace(-1, #Text, Text, "о(?=\d)", "0", MULTILINE)){}
while(regexreplace(-1, #Text, Text, "(?<=\d)з", "3", MULTILINE)){}
while(regexreplace(-1, #Text, Text, "з(?=\d)", "3", MULTILINE)){}
}
//Цифры в составе слова на буквы
loop(5)
{
while(regexreplace(-1, #Text, Text, "(?<=[а-я|А-Я])0", "о", MULTILINE)){}
while(regexreplace(-1, #Text, Text, "0(?=[а-я|А-Я])", "о", MULTILINE)){}
while(regexreplace(-1, #Text, Text, "(?<=[а-я|А-Я])3", "з", MULTILINE)){}
while(regexreplace(-1, #Text, Text, "3(?=[а-я|А-Я])", "з", MULTILINE)){}
}
messagebox (Text);//тест
string Texts[2];
regexsearch(2, #Texts[0], Text, "(?<=\s)д(\s|)а(?=\s)"); // найти слово да или д а
mousemove(221+symbolxpos(regexstart(0)), 286+symbolypos(regexstart(0)));
messagebox ("Мышь на первом настоящем ДА "+format(regexstart(0)));
mousemove(221+symbolxpos(regexstart(1)), 286+symbolypos(regexstart(1)));
messagebox ("Мышь на втором настоящем ДА "+format(regexstart(1))); |
|
|
Zireael |
Отправлено: 01 Мая, 2023 - 11:22:46
|
Эксперт
Покинул форум
Сообщений всего: 4468
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Можно подправить ReadText в виз. редакторе, добавив смещение координат и остальных параметров при удалении пробелов. Пример:
CODE:// допустим это координаты символов
int x_sim[99]={10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
int y_sim[99]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
string text = "ab cd e fg"; // распознаая строка
// удаление пробелов
string temp;
int Pos, i;
while(regexsearch(1, #temp, text, " ")) // пока найден пробел
{
regexstart(#Pos);
//messagebox(Pos);
int Len = size(text);
for(i=Pos; i<Len; i++)
{
x_sim[i] = x_sim[i+1]; // сдвигаем координаты
y_sim[i] = y_sim[i+1];
}
regexreplace(1, #text, text, " ", ""); // удаляем пробел
}
///////////
Len = size(text);
string result = "";
for(i=0; i<Len; i++)result = result +format(x_sim[i])+" "+format(y_sim[i])+"^r^n";
messagebox(text+"^r^n^r^n"+result);
Пробелы удалены, координаты в массивах x_sim и y_sim соответствуют позиции символа в строке. |
|
|
konctantin777 |
Отправлено: 03 Мая, 2023 - 19:35:46
|
Эксперт
Покинул форум
Сообщений всего: 1152
Дата рег-ции: Окт. 2017
Откуда: Архангельск
Репутация: 6
|
Kibor пишет: Если вы произвели какую то деформацию текста, то деформацию координат относительно деформации текста вы тоже должны произвести сами
Так узнаю, что нужное слово естьCODE:if (regexsearch(1, #text_KIB2, text_KIB, "да")) // если слово найдено
А как правильно, чтобы текст не деформировался ? |
|
|
|