Что нового

[Автоматизация] PixelChecksum, функция сравнения, логика

Irlandec

Новичок
Сообщения
21
Репутация
0
Здравствуйте, в моём проекте понадобилось использовать Pixelcheсksum, и если с Pixelsearch всё относительно просто, потому как он возвращает либо 1 либо 0, то с Pixelchecksum мне не хватает ума построить логику, вот такая фигня точно не работает:

Постоянно выбивает в Case Else хотя точно известно,что эта сумма есть в тех координатах, осознаю что написал логику криво, но не доходит как правильно написать не засовывая в ещё один оператор типа if.

нам заранее известно, что PixelChecksum(1803, 36,1810, 46) = 1265705201, либо может быть любым другим, но в тестах я заранее знал сумму пикселей.

Код:
Func c_station()
  While $c_station <= 5
  Sleep(50)
Local $c_station_p = PixelChecksum(1803, 36,1810, 46)
Local $c_station_p1 = 1265705201
   Select
	  Case $c_station_p = $c_station_p1
		 $c_station = $c_station + 1
			ToolTip("Проверка пройдена, мы на станции" & @CRLF & "Ok" & @CRLF & "$c_station = " & $c_station,25,35,"Датчик Станции",1,4)
			   sleep(500)
	  Case $c_station_p <> $c_station_p1
		 $c_station =  $c_station + 0
			ToolTip("Проверка НЕ пройдена, мы НЕ на станции" & @CRLF & @CRLF & "$c_station = " & $c_station,25,35,"Датчик Станции",1,4)
			   sleep(500)
	  Case Else
		 $c_station = $c_station -1
			ToolTip("Стыковочный режим неисправен" & @CRLF  & @CRLF & "$c_station = " & $c_station,25,35,"Датчик Станции",1,4)
			   sleep(500)
   EndSelect
 sleep(2000)
 WEnd
EndFunc
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
В моём понимании $c_station_p = $c_station_p1 либо истина, либо ложь. Можно проверять одним If. Если же хотите так как у вас, то сделайте правильной проверку
Код:
Case $c_station_p <> $c_station_p1
 
Автор
I

Irlandec

Новичок
Сообщения
21
Репутация
0
Если кто-то столкнется с моей проблемой, то логика работает нормально)). просто помните, что для правильного выведения чек суммы надо чтобы были правильно выставлены параметры PixelCoordMode . я выставил вот так:

Код:
Opt("PixelCoordMode",2) ;Отсчет координат пикселей от левого верхнего угла клиентской части окна


то есть он считает координаты от открытого окна (игры, программы), а не от верхнего левого угла монитора.

и благополучно забыл об этом. Извиняюсь за лишнюю тему, можно вообще удалить.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Irlandec
PixelChecksum() возвращает определённое число. Следовательно, вывод нужно делать просто сравнивая это число с заранее известным.
Код:
Func c_station()
  For $i = 1 To 5
    Sleep(50)
    If PixelChecksum(1803, 36, 1810, 46) = 1265705201 Then
      ToolTip("Проверка пройдена, мы на станции")
    Else
      ToolTip("Проверка НЕ пройдена, мы НЕ на станции")
    EndIf
    Sleep(2500)
  Next
EndFunc


если с Pixelsearch всё относительно просто, потому как он возвращает либо 1 либо 0
Когда вы уже запомните, что PixelSearch() возвращает МАССИВ.
 
Автор
I

Irlandec

Новичок
Сообщения
21
Репутация
0
InnI сказал(а):
Irlandec
PixelChecksum() возвращает определённое число. Следовательно, вывод нужно делать просто сравнивая это число с заранее известным.
Код:
Func c_station()
  For $i = 1 To 5
    Sleep(50)
    If PixelChecksum(1803, 36, 1810, 46) = 1265705201 Then
      ToolTip("Проверка пройдена, мы на станции")
    Else
      ToolTip("Проверка НЕ пройдена, мы НЕ на станции")
    EndIf
    Sleep(2500)
  Next
EndFunc


если с Pixelsearch всё относительно просто, потому как он возвращает либо 1 либо 0
Когда вы уже запомните, что PixelSearch() возвращает МАССИВ.

Почему то просто сложилось впечатление что Case лучше и удобнее чем If.. не знаю почему.


P.S. да я знаю что массив)))), но когда я делал через макрос @error, в том случае у меня было либо ДА либо НЕТ )), то есть либо есть такой цвет в квадрате 100 на 100, либо такого цвета нет))

в моём проекте понадобилось использовать Pixelcheсksum, и если с Pixelsearch всё относительно просто, потому как он возвращает либо 1 либо 0

Речь как раз шла о том проекте где я спрашивал про @error :smile:), поэтому и там я сказал про 1 и 0 ))))), ну типа или error, или NOT error, либо 0 либо 1 ))).

"моя функция с помощью Pixelseach() возвращала в моём проекте либо 1(NOT @error) либо 0(@error)" - надо было так написать )), согласен.




P.S.S. А если теперь работает и Case структура, то лучше в таких случаях использовать If, или если рабоатет то не важно, что использовать?

Меня просто смущает вот это место:

Код:
Local $c_station_p = PixelChecksum(1803, 36,1810, 46)
Local $c_station_p1 = 1265705201
   Select
      Case $c_station_p = $c_station_p1


выглядит как то не нормально, или это нормально?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Irlandec,
Предупреждение За нарушение общих правил (пункт В.2):
Старайтесь избегать “Over quoting” (преувеличенное цитирование) - цитируйте только необходимую часть сообщения, которая наилучшим образом подчеркнёт суть цитируемого.


С уважением, ваш Глобальный модератор.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Irlandec [?]
смущает вот это место
А если так?
Код:
Func c_station()
 While $c_station <= 5
   Sleep(50)
   Switch PixelChecksum(1803, 36, 1810, 46)
      Case 1265705201
         ToolTip("Проверка пройдена, мы на станции" & @CRLF & "Ok" & @CRLF & "$c_station = " & $c_station,25,35,"Датчик Станции",1,4)
         sleep(500)
      Case Else
         ToolTip("Проверка НЕ пройдена, мы НЕ на станции" & @CRLF & @CRLF & "$c_station = " & $c_station,25,35,"Датчик Станции",1,4)
         sleep(500)
   EndSwitch
   $c_station += 1
   sleep(2000)
 WEnd
EndFunc
 
Автор
I

Irlandec

Новичок
Сообщения
21
Репутация
0
Спасибо большое, наверное это хороший вариант, без запутанных цепочек переменных, а то все эти приравнивания как то странно выглядели. Надо бы почитать матчасть касательно условных выражений, где какое применять и где какое быстрее будет работать.

P.S. thx
 
Верх