コード例 #1
0
ファイル: bee.py プロジェクト: woto/EPC
def goto_main_menu_toyota_epc():
  logging.debug("goto_main_menu_toyota_epc")
  sleep = 0.1

  while True:
    try:
      logging.debug('Ищем любое окно TOYOTA...')
      wmgr = WindowMgr()
      wmgr.find_window_wildcard(".*TOYOTA ELECTRONIC PARTS CATALOG(.*)")
      logging.debug('Переходим в цикл перебора всех окон TOYOTA... и смешиваем их')
      random.shuffle(wmgr._handle)
      for i, element in enumerate(wmgr._handle):
        logging.debug('Работаем с окном ' + wmgr._title[i] + " внутри цикла перебора всех окон Toyota...")
        wmgr.set_foreground(False, False, False, i)

        logging.debug('Сделали его активным')
        time.sleep(sleep) # Обязательно
        wsh.SendKeys("{ESC}")
        logging.debug('Отправили в него Esc')

      logging.debug('Ищем кнопку TMC...')
      main_wnd = find_match(None, ['images/Toyota EPC/TMC Part Number Translation/1.png', 'images/Toyota EPC/TMC Part Number Translation/2.png'], (178, 142, 184, 151), 100, False)

      if main_wnd:
        logging.debug('Нашли кнопку TMC Part Number Translation, далее считается, что окно находится на самом верху и мы находимся в главном меню')
        break
      else:
        logging.debug('Не нашли кнопку TMC')
        raise
    except Exception, exc:
      print exc
      sleep = sleep + 0.1
      logging.debug("Exception. Спим " + str(sleep) + " с. перед следущей итерацией goto_main_menu_toyota_epc")
      time.sleep(sleep)
コード例 #2
0
ファイル: bee.py プロジェクト: woto/EPC
def choose_region(area):
  logging.debug('choose_region("' + area + '")')

  areas = {
    'Europe': {'blue_point_y': 148},
    'General': {'blue_point_y': 165},
    'USA, Canada': {'blue_point_y': 181},
    'Japan': {'blue_point_y': 200}
  }

  logging.debug("Вызываем метод выхода в главное меню")
  goto_main_menu_toyota_epc()
  logging.debug("Теперь мы точно знаем, что находимся в главном меню, обрабатываемый регион " + str(area))

  sleep = 0.1

  while True:
    try:
      logging.debug("Нахдимся внутри цикла щелканья на кнопку Area/Language и поиска Setup the necessary items")
      logging.debug("Щелкаем на Area/Language в главном меню")
      click(264, 344)
      logging.debug("Щелкнули на Area/Language в главном меню")
      time.sleep(sleep) # Обязтаельно
      logging.debug('Ищем любое окно TOYOTA...Area')
      time.sleep(sleep) # Обязательно
      wmgr = WindowMgr()
      wmgr.find_window_wildcard(".*TOYOTA ELECTRONIC PARTS CATALOG(.*Area).*")
      wmgr.set_foreground(False, False, False)
      logging.debug('Нашли окно TOYOTA...Area, сделали его активным')

      logging.debug('Ищем Setup the necessary items')
      coords = find_match(False, ['images/Toyota EPC/Setup the necessary items.png'], (182, 350, 190, 361), 100, False)
      if coords:
        logging.debug('Теперь мы точно уверены, что окно выбора регионов открыто, т.к. нашли Setup the necessary items')
        break
      else:
        logging.debug("Генерируем исключение. Не удалось найти 'Setup the necessary items'")
        raise
    except:
      sleep = sleep + 0.1
      logging.debug("Exception. Спим " + str(sleep) + " с. перед следущей итерацией поиска окна регионов с Setup the necessary items")
      time.sleep(sleep)

  sleep = 0.1

  while True:
    logging.debug("Зашли в цикл проверки факта выделения и соответствующего поиска синенькой полоски")
    try:
      time.sleep(sleep) # Обязательно
      click(130, areas[area]['blue_point_y'])
      time.sleep(sleep) # Обязательно
      img = ImageGrab.grab((158, 135, 159, 252))
      img = img.convert("RGBA")
      pixdata = img.load()

      if(pixdata[0, areas[area]['blue_point_y'] - 135] == (10, 36, 106, 255)):
        logging.debug('Проверка синей полоски прошла успешно, регион действительно выбран')
        break
      else:
        logging.debug('В процессе клика на конкретном регионе и последующей проверкой синей полоски произошла ошибка')
        raise
    except:
      sleep = sleep + 0.1
      logging.debug("Спим " + str(sleep) + " с. перед следущей итерацией проверки факта того что мы щелкнули на базе заранее известных координат синих точек")
      time.sleep(sleep)

  logging.debug("Отправляем F8 - выбор и закрытие окна выбора региона")
  wsh.SendKeys("{F8}")
  time.sleep(0.1)
  #TODO пока что это в зависимости от нужды и работоспособности, (потому что кажется можно обойтись банальным слипом) оставлю или изменю позже сейчас же разбираюсь с корректностью открытия поиска подходящих модеделей по детали и видимо окно не успевает закрыться до того момента, как мы уже пытаемся щелкнуть на кнопке вызывающем окно поиска подходящих моделей

  logging.debug("Вызываем метод выхода в главное меню непосредственно после выбора региона")
  goto_main_menu_toyota_epc()
コード例 #3
0
ファイル: bee.py プロジェクト: woto/EPC
def search_applicability_in_current_area(catalog_number, data):

  # TODO этот блок скопирован с блока открытия окна выбора регионов

  sleep = 0.1

  while True:
    try:
      logging.debug("Нахдимся внутри цикла щелканья на кнопку Part Number Application to Models")
      logging.debug("Щелкаем на Part Number Application to Models в главном меню")
      click(254, 175)
      logging.debug("Щелкнули на Part Number Application to Models в главном меню")
      time.sleep(sleep) # Обязтаельно
      logging.debug('Ищем любое окно TOYOTA...Part Number Application to Models')
      time.sleep(sleep) # Обязательно
      wmgr = WindowMgr()
      wmgr.find_window_wildcard(".*TOYOTA ELECTRONIC PARTS CATALOG(.*Part Number Application to Models).*")
      wmgr.set_foreground(False, False, False)
      logging.debug('Нашли окно TOYOTA...Part Number Application to Models, сделали его активным')


      logging.debug('Ищем Enter part numbers and press F10 key')
      coords = find_match(False, ['images/Toyota EPC/Enter part numbers and press F10 key.png'], (389, 692, 397, 703), 100, False)
      if coords:
        logging.debug('Теперь мы точно уверены, что окно поиска моделей по каталожному номеру открыто, т.к. нашли Enter part numbers and press F10 key')
        break
      else:
        logging.debug("Генерируем исключение. Не удалось найти 'Enter part numbers and press F10 key'")
        raise
    except:
      sleep = sleep + 0.1
      logging.debug("Exception. Спим " + str(sleep) + " с. перед следущей итерацией поиска окна поиска моделей по каталожному номеру")
      time.sleep(sleep)


  # Этот workaround нужен для обработки номеров от нерадивых поставщиков,
  # которые указывают, производителя как Toyota, а номер совсем не Toyot'ы

  old_catalog_number = catalog_number

  if len(catalog_number) < 10:
    catalog_number = 'WRONG_NUMBER'

  # TODO опять же, этот блок скопирован с старого раздела поиска по вин коду, потом возможно вынесу просто в метод.
  logging.debug("Магия с раскладкой")
  win32api.SendMessage(0xFFFF, 0x50, 1, 0x4090409)
  logging.debug("Спим перед набором каталожного номера")
  time.sleep(0.2)
  logging.debug("Печатаем каталожный номер " + str(catalog_number))
  wsh.SendKeys(str(catalog_number))
  logging.debug("Спим перед нажатием на Entrer")
  time.sleep(0.2)
  logging.debug("Жмем Enter")
  wsh.SendKeys("{ENTER}")
  logging.debug("Жмем F10")
  wsh.SendKeys("{F10}")
  logging.debug("Вбили каталожный номер, нажали Enter и F10")

  catalog_number = old_catalog_number


  sended_models = []
  uniq_catalog_code = []
  scroll_avaliable_first_check = True
  scroll_avaliable = False
  bottom_counter = 0

  while True:
    time.sleep(0.3)
    logging.debug("Вертимся в цикле поиска подходящих моделей.")
    # TODO херня какая-то, должно быть 702, а работает только с 703 :\
    # выяснил, ошибки в размерах нет, это так работает метод opencv, обязательно потом хочу попробовать
    # выяснить проблему и решить. Пока можно обходить ситуацию заданием чуть большего размера.
    # Кстати интересно, что с буквами у меня такой ситуации не возникало

    coords = find_match(False, ['images/Toyota EPC/Select the next function by pressing an approriate PF key.png'], (326, 691, 334, 703), 100, False)
    if coords:
      logging.debug("Получили список подходящих моделей")

      time.sleep(0.1)
      logging.debug("Поспали 0.1")

      logging.debug("Грабим область экрана с результатом списка моделей")
      img = pil2gray(ImageGrab.grab((16, 351, 1014, 673)))

      logging.debug("Ищем серые точки")
      cv.SetImageROI(img, (0, 0, 1, img.height))
      tpl = cv.LoadImage('images/Toyota EPC/Search result delimiter point.png', cv.CV_LOAD_IMAGE_GRAYSCALE)
      res = cv.CreateImage((cv.GetImageROI(img)[2] - tpl.width + 1, cv.GetImageROI(img)[3] - tpl.height + 1), cv.IPL_DEPTH_32F, 1)
      cv.MatchTemplate(img, tpl, res, cv.CV_TM_SQDIFF)
      cv.ResetImageROI(img)

      lines = []
      for y in range(0, res.height):
        s = cv.Get2D(res, y, 0)
        if s[0] <= 10:
          lines.append(y)

      logging.debug("Далее проверяем количество полосок, более 1 или нет (другими словами есть ли результаты поиска)")

      # Единичка видимо потому что одна верхняя полоска всегда присутствует в области
      if len(lines) > 1:

        logging.debug("Найденные полоски " + str(lines) + ". Заходим в цикл перебора полосок")

        for y1, y2 in pairwise(lines):
          logging.debug("Крутимся в цилке прохода по полоскам")
          logging.debug("y1: " + str(y1) + " y2: " + str(y2))

          accumulator = []

          #a
          # Могу отсекать прямо здесь для начала
          #if (y1+4+16 >= y2):
          #  #pdb.set_trace()
          #  continue

          #b
          # Получается, что я закрашиваю соседнюю строку (решение) Ошибка возникает из-за того, что я беру top и независимо от всего
          # прибавляю к нему 11 (ниже)
          #if (y1+11 < 11):
          #  continue

          for top in range(y1 + 4, y2, 16):
            logging.debug("Крутимся в цилке прохода по строкам внутри полоски, текущий верх: " + str(top))
            cv.SetImageROI(img, (0, top, 998, 11))

            if (float(y2-y1)/16 != (y2-y1)/16):
              continue

            # 1
            #cv.NamedWindow('image', cv.CV_WINDOW_AUTOSIZE)
            #cv.ShowImage('image', img)
            #cv.WaitKey(0)
            #pdb.set_trace()
            # 1

            for element, first in pairs((('0', '0'), ('1', '1'), ('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('6', '6'), ('7', '7'), ('8', '8'), ('9', '9'), ('A', 'A'), ('B', 'B'), ('C', 'C'), ('D', 'D'), ('E', 'E'), ('F', 'F'), ('G', 'G'), ('H', 'H'), ('I', 'I'), ('J', 'J'), ('K', 'K'), ('L', 'L'), ('M', 'M'), ('N', 'N'), ('O', 'O'), ('P', 'P'), ('Q', 'Q'), ('R', 'R'), ('S', 'S'), ('T', 'T'), ('U', 'U'), ('V', 'V'), ('W', 'W'), ('X', 'X'), ('Y', 'Y'), ('Z', 'Z'), ('(', 'Open Bracket'), (')', 'Close Bracket'), (',', 'Comma'), ('#', 'Octothorpe'), ('-', 'Hyphen'), ('/', 'Slash'), ('&', 'And'), ('+', 'Plus'), (' | ', 'Delimiter'), ('.', 'Point'))):
              tpl = cv.LoadImage('images/Toyota EPC/Fonts/Main Font/' + str(element[1]) + '.png', cv.CV_LOAD_IMAGE_GRAYSCALE)

              res = cv.CreateImage((cv.GetImageROI(img)[2] - tpl.width + 1, cv.GetImageROI(img)[3] - tpl.height + 1), cv.IPL_DEPTH_32F, 1)
              cv.MatchTemplate(img, tpl, res, cv.CV_TM_SQDIFF)

              for y in range(0, res.height):
                for x in range(0, res.width):
                  s = cv.Get2D(res, y, x)
                  if s[0] <= 20:
                    accumulator.append({'x': x, 'y': top, 'letter': element[0]})
                    cv.Rectangle(img,
                        (x, y),
                        (x+tpl.width-1, y+tpl.height-1),
                    cv.Scalar(255, 255, 255, 255), cv.CV_FILLED)
                  x = x + tpl.width
                y = y + tpl.width

          if len(accumulator) > 0:
            tmp = ['']
            idx = 0
            accumulator = sorted(sorted(accumulator, key=lambda k: k['x']), key=lambda k: k['y'])
            #accumulator = sorted(accumulator, key=lambda k: k['x'])
            for i, letter in enumerate(accumulator):
              if((letter['x'] - accumulator[i-1]['x']) >= 15):
                tmp[idx] += " "
                #sys.stdout.write('\t')
              if((letter['y'] > accumulator[i-1]['y'])):
                idx = 0
              if(letter['letter'] == ' | '):
                #pdb.set_trace()
                tmp[idx] += '<br />'
                idx += 1
                tmp.append('')
                continue

              tmp[idx] += letter['letter']
              #sys.stdout.write(letter['letter'])


            # Этот способ возник после того, как я обнаружил, что полоска сверху рисуется всвегда, значит, вверху всегда будет
            # половинчатая полоска, если конечно на неё так попадет скролл, а следовательно мы получим только часть данных,
            # этого можно избежать, если убедиться в том, что в нулевом столбце присутствует порядковый номер, т.е. не пусто
            tmp = [x.strip() for x in tmp]
            if (tmp[0] != ''):
              if tmp[0] not in sended_models:
                #pdb.set_trace()
                sended_models.append(tmp[0])

                tmp[6] = tmp[6].replace(' ', '')
                tmp = filter(len, tmp)
                tmp = [x for x in tmp]

                if tmp[4] not in uniq_catalog_code:
                  if local_stub == False:
                    rs.publish('bee', json.dumps({
                      'caps': 'Toyota EPC',
                      'manufacturer': data['manufacturer'],
                      'area': data['area'],
                      'command': 'get_precisely_info_by_car_catalog',
                      'catalog_number': data['catalog_number'],
                      'data': tmp
                    }))
                  uniq_catalog_code.append(tmp[4])

                if local_stub == False:
                  rs.publish('queen', json.dumps({
                    'caps': 'Toyota EPC',
                    'manufacturer': data['manufacturer'],
                    'area': data['area'],
                    'command': 'part_number_application_to_models',
                    'catalog_number': data['catalog_number'],
                    'data': tmp
                  }))


        if scroll_avaliable_first_check:
          logging.debug("Единоразовая проверка наличия скролла на 1 запрос каталожного(ых) номера(ов)")
          scroll_avaliable_first_check = False
          logging.debug("Проверяем, а нет ли случайно скролла в результатах поиска")
          if (find_match(False, ['images/Toyota EPC/Scroll down.png'], (1005, 653, 1006, 673), 100, False)):
            logging.debug("Скролл обнаружен")
            scroll_avaliable = True
          else:
            logging.debug("Скролл не обнаружен")

        if scroll_avaliable:

          if bottom_counter < 2:

            # Уменьшил правый x на 1. Было 997
            logging.debug("Запоминаем нижнюю часть экрана")
            tpl_gray = pil2gray(ImageGrab.grab((16, 351+lines[-2], 996, 673)))

            #cv.NamedWindow('image', cv.CV_WINDOW_AUTOSIZE)
            #cv.ShowImage('image', tpl_gray)
            #cv.WaitKey(0)

            logging.debug("Нажимаем на скролл вниз")
            click(1005, 656)
            time.sleep(0.1)
            logging.debug("Поспали 0.1")

            logging.debug("Проверяем не находимся ли мы в самому низу")
            coords = find_match(False, ['images/Toyota EPC/Scroll at bottom.png'], (993, 647, 1018, 673), 100, False)

            if not coords:
              logging.debug("Нет, не находимся")
            else:
              bottom_counter += 1
              logging.debug("Да, находимся, прибавили bottom_counter и стало: " + str(bottom_counter))

            if bottom_counter == 2:
              logging.debug("bottom_counte == 2, это значит, что мы уже опускались вниз один раз, сейчас мы опустились второй, следовательно, необходимо просто распознать последнюю часть экрана и выйти, т.к. ЛОЖЬ == (bottom_counter < 2).")
              continue

            logging.debug("Следующим шагом заходим в цикл, в котором будем подниматься постепенно вверх, пока не найдем нижнюю область, запомненную ранее")

            # TODO DIRTY BUG WORKAROUND Необходим в том случае, когда три полоски с применимостью детали не помещаются в одно окно, позже буду переделывать склейкой скриншотов, эта проблема устранится.
            global_lock_counter_when_line_very_high = 0

            while True:
              global_lock_counter_when_line_very_high += 1
              if(global_lock_counter_when_line_very_high >= 10):
                continue_iteration = True
                break

              #print global_lock_counter_when_line_very_high
              logging.debug("Возвращаемся назад щелчком на стрелку верхнего скролла")
              click(1005, 340)
              time.sleep(0.1)
              logging.debug("Поспали 0.1")

              img_gray = pil2gray(ImageGrab.grab((16, 351, 1014, 673)))

              res = cv.CreateImage((img_gray.width - tpl_gray.width + 1, img_gray.height - tpl_gray.height + 1), cv.IPL_DEPTH_32F, 1)
              cv.MatchTemplate(img_gray, tpl_gray, res, cv.CV_TM_SQDIFF)

              (minval, maxval, minloc, maxloc) = cv.MinMaxLoc(res)

              previous_roi = cv.GetImageROI(img_gray)
              cv.SetImageROI(img_gray, (minloc[0], minloc[1], tpl_gray.width, tpl_gray.height))

              #img_gray_copy = cv.CreateImage((cv.GetImageROI(img_gray)[2] - cv.GetImageROI(img_gray)[0], cv.GetImageROI(img_gray)[3] - cv.GetImageROI(img_gray)[1]), cv.IPL_DEPTH_8U, 1)
              #pdb.set_trace()
              #cv.Copy(img_gray, img_gray_copy)
              norm = -1
              norm = cv.Norm( img_gray, tpl_gray );

              cv.SetImageROI(img_gray, previous_roi)

              ## 2
              #cv.Rectangle(img_gray,
              #  (minloc[0], minloc[1]),
              #  (minloc[0] + tpl_gray.width, minloc[1] + tpl_gray.height),
              #cv.Scalar(0, 1, 0, 0))
              #
              #
              #cv.NamedWindow('image', cv.CV_WINDOW_AUTOSIZE)
              #cv.ShowImage('image', img_gray)
              #
              #cv.NamedWindow('tpl', cv.CV_WINDOW_AUTOSIZE)
              #cv.ShowImage('tpl', tpl_gray)
              #
              #cv.WaitKey(0)
              #
              #cv.DestroyWindow('image')
              #cv.DestroyWindow('tpl')
              ## 2

              #print "minval: " + str(minval)
              #print "norm: " + str(norm)

              if (norm == 0):
                logging.debug("Нашли интересующую область, запомненную ранее")
                continue_iteration = True
                break

            if continue_iteration:
              logging.debug("Переходим к следующей итерации цикла по полоскам")
              continue

      else:
        logging.debug("Результаты поиска не найдены. Отправили пустышку, что в данном регионе поискали")
        if local_stub == False:
          rs.publish('queen', json.dumps({
            'caps': 'Toyota EPC',
            'manufacturer': data['manufacturer'],
            'area': data['area'],
            'command': 'part_number_application_to_models',
            'catalog_number': data['catalog_number'],
            'data': None
          }))

      logging.debug("Осуществляем возврат из метода")
      return
コード例 #4
0
ファイル: bee.py プロジェクト: woto/EPC
def search_in_tecdoc(catalog_number, manufacturer, data):

  if(catalog_number == None or len(catalog_number) <= 0):
    catalog_number = 'WRONG_CATALOG_NUMBER'

  if(manufacturer == None or len(manufacturer) <= 0):
    manufacturer = 'WRONG_MANUFACTURER'

  check_or_start_tecdoc()
  sleep = 0

  while True:
    try:
      logging.debug('Сейчас мы ищем TECDOC, мы уже знаем, что он точно запущен, ищем его')
      wmgr = WindowMgr()
      wmgr.find_window_wildcard(".*TECDOC(.*)")

      logging.debug('Спим ' + str(sleep) + 'с. перед тем как сделать активным TECDOC')
      time.sleep(sleep)
      wmgr.set_foreground(True, True, True)
      logging.debug('Считаем, что сделали TECDOC активным')

      logging.debug('Спим ' + str(sleep) + 'с. перед щелчком на увеличительном стекле (как выяснилось из внутренних разделов меню {а так же если не ошибаюсь при запуске}) мы не выходим на начальное требуемое состояние.')
      time.sleep(sleep)
      click(219, 53)

      logging.debug('Спим ' + str(sleep) + 'с. перед отправкой в него ESC')
      time.sleep(sleep)
      logging.debug('Нажимаем ESC')
      wsh.SendKeys("{ESC}")
      time.sleep(0.1) # Обязательно!

      logging.debug('Ищем поставленную галочку на "Любой номер"')
      coords = find_match(None, ['images/Tecdoc/Check Box - Checked.png'], (749, 104, 767, 121), 10, False)

      if coords:
        logging.debug('Нашли поставленную галочку на "Любой номер"')

        logging.debug('Спим ' + str(sleep) + 'с. перед перед снятием галочки с "Любой номер"')
        time.sleep(sleep)
        click(757, 113)
        time.sleep(0.1) # Обязательно!

        logging.debug('Спим ' + str(sleep) + 'с. перед проверкой, что мы действительно сняли галочку с "Любой номер"')
        time.sleep(sleep)
        coords = find_match(None, ['images/Tecdoc/Check Box - Unchecked.png'], (749, 104, 767, 121), 10, False)
        if coords:

          comparing_area = (209, 203, 1249, 877)
          logging.debug('Сохраняем предыдущий экран будь то результаты поиска или что-то другое...')
          previous_image = ImageGrab.grab(comparing_area)
          #previous_image.save('image_1.png')

          logging.debug('Убедились, что галочка "Любой номер снята", нажатием на кнопку поиска запчастей (Увеличительное стекло)')
          click(209, 43)

          logging.debug('Спим ' + str(sleep) + 'с. перед вводом каталожного номера')
          logging.debug('Вводим каталожный номер.')
          wsh.SendKeys(catalog_number)
          time.sleep(0.2)
          logging.debug('Нажимаем Enter.')
          wsh.SendKeys("{ENTER}")

          while True:
            logging.debug('Снимаем опять скриншот с результата поиска')
            current_image = ImageGrab.grab(comparing_area)
            diff = ImageChops.difference(previous_image, current_image)
            time.sleep(0.1)
            if (diff.getbbox() != None):
              logging.debug('Сравниваемые изображения разные, выходим из цикла')
              #current_image.save('image_2.png')
              #diff.save('diff.png')
              break

          #for i in range(1):
          if True:
            logging.debug('Ищем наличие, либо отсутсвтие информации по запчасти')

            logging.debug('Ищем окно, сообщающее, что каталожный номер не найден')
            coords = find_match(None, ['images/Tecdoc/Not Found.png'], (564, 466, 732, 584), 100, False)
            if coords:
              logging.debug('Нашли окно окно, сообщающее, что каталожный номер не найден')
              while True:
                logging.debug('Отправили в него ESC')
                wsh.SendKeys("{ESC}")
                time.sleep(0.1)
                logging.debug('Проверяем, чтобы окно скрылось')
                coords = find_match(None, ['images/Tecdoc/Not Found.png'], (564, 466, 732, 584), 100, False)
                if not coords:
                  logging.debug("Окно закрылось")
                  logging.debug("Отправляем пустые данные")
                  rs.publish('queen', json.dumps({
                    'caps': 'Tecdoc',
                    'manufacturer': data['manufacturer'],
                    'command': 'specifically_number_info',
                    'catalog_number': data['catalog_number'],
                    'data': None
                  }))
                  return
                else:
                  logging.debug("Окно не закрылось")

            logging.debug('Ищем увеличительное стекло, означающее, что каталожный номер найден')
            coords = find_match(None, ['images/Tecdoc/Magnifier.png'], (224, 239, 243, 258), 100, False)
            if coords:
              logging.debug('Нашли увеличительное стекло')
              break_outer = False
              sleep = 0.1

              while True:

                logging.debug('Спим ' + str(sleep))
                time.sleep(sleep)
                logging.debug('Кликаем на выпадающем списке для просмотра всех найденных производителей')
                click(1252, 916)
                logging.debug('Кликнули, спим ' + str(sleep))
                time.sleep(sleep)
                im = ImageGrab.grab((875, 905, 876, 906))
                im = im.convert("RGBA")
                pixdata = im.load()

                logging.debug('Проверяем наличие нужного пикселя, т.е. что список действительно выпал')
                if(pixdata[0, 0] == (0, 0, 0, 255)):
                  logging.debug("Список отобразился, выходим из цикла, щелканья и нахождения выпадающего списка")
                  break

                logging.debug('Выход из цикла не произошел, прибавляем время, повторяем бесконечную итерацию по поиску выпавшего списка')
                sleep += 0.3

              if (tecdoc_manufacturer_alias.has_key(manufacturer)):
                tecdoc_manufacturer = tecdoc_manufacturer_alias[manufacturer]
              else:
                tecdoc_manufacturer = manufacturer

              logging.debug("Печатаем производителя в поле")
              #for char in tecdoc_manufacturer:
              #  wsh.SendKeys(char)
              wsh.SendKeys(tecdoc_manufacturer)
              # TODO не успевает! надо делать на проверках?!
              logging.debug("Спим")
              time.sleep(0.1)
              logging.debug("Нажимаем Enter")
              wsh.SendKeys("{Enter}")
              logging.debug("Спим")
              time.sleep(0.1)
              logging.debug("Копируем выделение")
              wsh.SendKeys("^c", 0)
              logging.debug("Спим")
              time.sleep(0.1)
              win32clipboard.OpenClipboard()
              #win32clipboard.EmptyClipboard()
              clipboard_data = win32clipboard.GetClipboardData()
              #win32clipboard.SetClipboardText(text)
              win32clipboard.CloseClipboard()
              logging.debug("Щелкаем в сторонке")
              click(868, 916)
              if(tecdoc_manufacturer != clipboard_data):
                logging.debug("Искомый и ни один из найденных производителей не совпали")
                # TODO тут тоже сделать возврат пустышки
                #print ''
                #print catalog_number
                #print tecdoc_manufacturer
                #print ''
                #pdb.set_trace()

                rs.publish('queen', json.dumps({
                  'caps': 'Tecdoc',
                  'manufacturer': data['manufacturer'],
                  'command': 'specifically_number_info',
                  'catalog_number': data['catalog_number'],
                  'data': None
                }))

              else:
                logging.debug("Искомый и доступный среди найденных производителей совпали")
                logging.debug("Делаем двойной клик на оранжевой полоске детали")
                click(391, 212)
                time.sleep(0.2)
                click(391, 212)

                # Порно
                
                tab_area = (192, 173, 1277, 225)

                time.sleep(2)                               
                
                rs.publish('queen', json.dumps({
                  'caps': 'Tecdoc',
                  'manufacturer': data['manufacturer'],
                  'command': 'specifically_number_info',
                  'catalog_number': data['catalog_number'],
                  'data': put_screenshot_to_webdis(data['catalog_number'], data['manufacturer'])
                }))
                
                time.sleep(0.5)                  
                  
                check_or_start_text_catch()
                prepare_textcatch()
                time.sleep(1)
                click(600, 600)
                time.sleep(1)
                win32clipboard.OpenClipboard()
                time.sleep(1)                
                #win32clipboard.EmptyClipboard()
                clipboard_data = win32clipboard.GetClipboardData()
                time.sleep(1)                
                #win32clipboard.SetClipboardText(text)
                win32clipboard.CloseClipboard()                
                time.sleep(1)                
                
                #pdb.set_trace()                
                
                time.sleep(0.5)                                  
                
                rs.publish('queen', json.dumps({
                  'caps': 'Tecdoc',
                  'manufacturer': data['manufacturer'],
                  'command': 'specifically_number_info_text',
                  'catalog_number': data['catalog_number'],
                  'data': cgi.escape(unicode(clipboard_data.decode('cp1251')))
                }))                
                
                time.sleep(0.5)                  
                  
                wmgr = WindowMgr()
                wmgr.find_window_wildcard(".*TECDOC(.*)")

                logging.debug('Спим ' + str(sleep) + 'с. перед тем как сделать активным TECDOC')
                time.sleep(sleep)
                wmgr.set_foreground(True, True, True)                
                
                time.sleep(0.5)                  


                try:
                  coords = find_match(None, ['images/Tecdoc/Contact Address Tab.png'], tab_area, 500, False)
                  click(coords[0]+tab_area[0], coords[1]+tab_area[1])
                  time.sleep(2)
                  rs.publish('queen', json.dumps({
                    'caps': 'Tecdoc',
                    'manufacturer': data['manufacturer'],
                    'command': 'specifically_number_info',
                    'catalog_number': data['catalog_number'],
                    'data': put_screenshot_to_webdis(data['catalog_number'], data['manufacturer'])
                  }))
                  
                  time.sleep(0.5)                  
                  
                except:
                  pass

                try:
                  coords = find_match(None, ['images/Tecdoc/Construct Numbers Tab.png'], tab_area, 500, False)
                  click(coords[0]+tab_area[0], coords[1]+tab_area[1])
                  time.sleep(2)
                  rs.publish('queen', json.dumps({
                    'caps': 'Tecdoc',
                    'manufacturer': data['manufacturer'],
                    'command': 'specifically_number_info',
                    'catalog_number': data['catalog_number'],
                    'data': put_screenshot_to_webdis(data['catalog_number'], data['manufacturer'])
                  }))

                  time.sleep(0.5)                  
                  
                  check_or_start_text_catch()
                  prepare_textcatch()
                  time.sleep(1)
                  click(600, 600)
                  time.sleep(1)
                  win32clipboard.OpenClipboard()
                  time.sleep(1)                
                  #win32clipboard.EmptyClipboard()
                  clipboard_data = win32clipboard.GetClipboardData()
                  time.sleep(1)                
                  #win32clipboard.SetClipboardText(text)
                  win32clipboard.CloseClipboard()                
                  time.sleep(1)                
                  
                  #pdb.set_trace()                
                  
                  time.sleep(0.5)                  
                  
                  rs.publish('queen', json.dumps({
                    'caps': 'Tecdoc',
                    'manufacturer': data['manufacturer'],
                    'command': 'specifically_number_info_text',
                    'catalog_number': data['catalog_number'],
                    'data': cgi.escape(unicode(clipboard_data.decode('cp1251')))
                  }))                
                  
                  time.sleep(0.5)                  
                  
                  wmgr = WindowMgr()
                  wmgr.find_window_wildcard(".*TECDOC(.*)")

                  logging.debug('Спим ' + str(sleep) + 'с. перед тем как сделать активным TECDOC')
                  time.sleep(sleep)
                  wmgr.set_foreground(True, True, True)   
                  
                  time.sleep(0.5)                                    
                  
                except:
                  pass
                  

                try:
                  time.sleep(0.5)                                  
                  coords = find_match(None, ['images/Tecdoc/Use in Autos Tab.png'], tab_area, 500, False)
                  click(coords[0]+tab_area[0], coords[1]+tab_area[1])
                  time.sleep(2)
                  rs.publish('queen', json.dumps({
                    'caps': 'Tecdoc',
                    'manufacturer': data['manufacturer'],
                    'command': 'specifically_number_info',
                    'catalog_number': data['catalog_number'],
                    'data': put_screenshot_to_webdis(data['catalog_number'], data['manufacturer'])
                  }))
                  
                  time.sleep(0.5)                                    
                  
                  check_or_start_text_catch()
                  prepare_textcatch()
                  time.sleep(1)
                  click(600, 600)
                  time.sleep(1)
                  win32clipboard.OpenClipboard()
                  time.sleep(1)                
                  #win32clipboard.EmptyClipboard()
                  clipboard_data = win32clipboard.GetClipboardData()
                  time.sleep(1)                
                  #win32clipboard.SetClipboardText(text)
                  win32clipboard.CloseClipboard()                
                  time.sleep(1)                
                  
                  #pdb.set_trace()                
                  
                  time.sleep(0.5)                  
                  
                  rs.publish('queen', json.dumps({
                    'caps': 'Tecdoc',
                    'manufacturer': data['manufacturer'],
                    'command': 'specifically_number_info_text',
                    'catalog_number': data['catalog_number'],
                    'data': cgi.escape(unicode(clipboard_data.decode('cp1251')))
                  }))                
                  
                  time.sleep(0.5)                  
                  
                  wmgr = WindowMgr()
                  wmgr.find_window_wildcard(".*TECDOC(.*)")

                  logging.debug('Спим ' + str(sleep) + 'с. перед тем как сделать активным TECDOC')
                  time.sleep(sleep)
                  wmgr.set_foreground(True, True, True)                    
                  
                  time.sleep(0.5)                                    
                  
                except:
                  pass
                  
                  time.sleep(0.5)                  
                  
                try:
                  coords = find_match(None, ['images/Tecdoc/Photo Tab.png'], tab_area, 500, False)
                  click(coords[0]+tab_area[0], coords[1]+tab_area[1])
                  time.sleep(2)
                  rs.publish('queen', json.dumps({
                    'caps': 'Tecdoc',
                    'manufacturer': data['manufacturer'],
                    'command': 'specifically_number_info',
                    'catalog_number': data['catalog_number'],
                    'data': put_screenshot_to_webdis(data['catalog_number'], data['manufacturer'])
                  }))
                except:
                  pass
                  
                  time.sleep(0.5)                  
                  
                try:
                  coords = find_match(None, ['images/Tecdoc/Pitcure Tab.png'], (192, 173, 1277, 225), 500, False)
                  click(coords[0]+tab_area[0], coords[1]+tab_area[1])
                  time.sleep(2)
                  rs.publish('queen', json.dumps({
                    'caps': 'Tecdoc',
                    'manufacturer': data['manufacturer'],
                    'command': 'specifically_number_info',
                    'catalog_number': data['catalog_number'],
                    'data': put_screenshot_to_webdis(data['catalog_number'], data['manufacturer'])
                  }))
                except:
                  pass
                  
                  time.sleep(0.5)                  
                  
                try:
                  coords = find_match(None, ['images/Tecdoc/Use in Engines Tab.png'], tab_area, 500, False)
                  click(coords[0]+tab_area[0], coords[1]+tab_area[1])
                  time.sleep(2)
                  rs.publish('queen', json.dumps({
                    'caps': 'Tecdoc',
                    'manufacturer': data['manufacturer'],
                    'command': 'specifically_number_info',
                    'catalog_number': data['catalog_number'],
                    'data': put_screenshot_to_webdis(data['catalog_number'], data['manufacturer'])
                  }))
                  
                  time.sleep(0.5)                                    
                  
                  check_or_start_text_catch()
                  prepare_textcatch()
                  time.sleep(1)
                  click(600, 600)
                  time.sleep(1)
                  win32clipboard.OpenClipboard()
                  time.sleep(1)                
                  #win32clipboard.EmptyClipboard()
                  clipboard_data = win32clipboard.GetClipboardData()
                  time.sleep(1)                
                  #win32clipboard.SetClipboardText(text)
                  win32clipboard.CloseClipboard()                
                  time.sleep(1)                
                  
                  #pdb.set_trace()                
                  time.sleep(0.5)                  
                  
                  rs.publish('queen', json.dumps({
                    'caps': 'Tecdoc',
                    'manufacturer': data['manufacturer'],
                    'command': 'specifically_number_info_text',
                    'catalog_number': data['catalog_number'],
                    'data': cgi.escape(unicode(clipboard_data.decode('cp1251')))
                  }))  

                  time.sleep(0.5)                  
                  
                  wmgr = WindowMgr()
                  wmgr.find_window_wildcard(".*TECDOC(.*)")

                  logging.debug('Спим ' + str(sleep) + 'с. перед тем как сделать активным TECDOC')
                  time.sleep(sleep)
                  wmgr.set_foreground(True, True, True)                    
                  
                  time.sleep(0.5)
                  
                except:
                  pass

                try:
                  coords = find_match(None, ['images/Tecdoc/Techincal Image Tab.png'], tab_area, 500, False)
                  click(coords[0]+tab_area[0], coords[1]+tab_area[1])
                  time.sleep(2)
                  rs.publish('queen', json.dumps({
                    'caps': 'Tecdoc',
                    'manufacturer': data['manufacturer'],
                    'command': 'specifically_number_info',
                    'catalog_number': data['catalog_number'],
                    'data': put_screenshot_to_webdis(data['catalog_number'], data['manufacturer'])
                  }))
                except:
                  pass

                try:
                  coords = find_match(None, ['images/Tecdoc/Picture Tab.png'], tab_area, 500, False)
                  click(coords[0]+tab_area[0], coords[1]+tab_area[1])
                  time.sleep(2)
                  rs.publish('queen', json.dumps({
                    'caps': 'Tecdoc',
                    'manufacturer': data['manufacturer'],
                    'command': 'specifically_number_info',
                    'catalog_number': data['catalog_number'],
                    'data': put_screenshot_to_webdis(data['catalog_number'], data['manufacturer'])
                  }))
                except:
                  pass

                try:
                  coords = find_match(None, ['images/Tecdoc/Specification Tab.png'], tab_area, 500, False)
                  click(coords[0]+tab_area[0], coords[1]+tab_area[1])
                  time.sleep(2)
                  rs.publish('queen', json.dumps({
                    'caps': 'Tecdoc',
                    'manufacturer': data['manufacturer'],
                    'command': 'specifically_number_info',
                    'catalog_number': data['catalog_number'],
                    'data': put_screenshot_to_webdis(data['catalog_number'], data['manufacturer'])
                  }))
                  
                  time.sleep(0.5)
                  
                  check_or_start_text_catch()
                  prepare_textcatch()
                  time.sleep(1)
                  click(600, 600)
                  time.sleep(1)
                  win32clipboard.OpenClipboard()
                  time.sleep(1)                
                  #win32clipboard.EmptyClipboard()
                  clipboard_data = win32clipboard.GetClipboardData()
                  time.sleep(1)                
                  #win32clipboard.SetClipboardText(text)
                  win32clipboard.CloseClipboard()                
                  time.sleep(1)                
                  
                  #pdb.set_trace()                
                  
                  rs.publish('queen', json.dumps({
                    'caps': 'Tecdoc',
                    'manufacturer': data['manufacturer'],
                    'command': 'specifically_number_info_text',
                    'catalog_number': data['catalog_number'],
                    'data': cgi.escape(unicode(clipboard_data.decode('cp1251')))
                  }))                
                  
                  wmgr = WindowMgr()
                  wmgr.find_window_wildcard(".*TECDOC(.*)")

                  logging.debug('Спим ' + str(sleep) + 'с. перед тем как сделать активным TECDOC')
                  time.sleep(sleep)
                  wmgr.set_foreground(True, True, True)                    
                  
                  time.sleep(0.5)
                  
                except:
                  pass

                #time.sleep(1)
                #
                #logging.debug("Отправляем пока что пустышку")
                #
                #rs.publish('queen', json.dumps({
                #  'caps': 'Tecdoc',
                #  'manufacturer': data['manufacturer'],
                #  'command': 'specifically_number_info',
                #  'catalog_number': data['catalog_number'],
                #  'data': collector
                #}))

              logging.debug("Возврат из метода")
              return
            else:
              logging.debug("Иконка увеличительного стекла, означающее, что каталожный номер найден, не найдена")

            time.sleep(0.1)

          logging.debug('По видимому столкнулись с проблематичной деталью')
          raise
        else:
          logging.debug('Не смогли убедиться, что снята галочка с "Любой номер"')
          raise
      else:
        logging.debug('Не нашли поставленную галочку на "Любой номер"')
        raise
    except Exception as exc:
      exc_type, exc_object, exc_tb = sys.exc_info()
      fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
      print (exc, exc_type, fname, exc_tb.tb_lineno)
      sleep = sleep + 0.3
コード例 #5
0
ファイル: 1_febest.py プロジェクト: woto/EPC
#coding=UTF-8

from window_mgr import WindowMgr
from functions import *

check_or_start_febest()

wmgr = WindowMgr()
wmgr.find_window_wildcard("Каталог(.*)Febest")
wmgr.set_foreground(False, True, True)

time.sleep(0.5)
drag_drop((784, 96), (1050, 96))
img = ImageGrab.grab((272, 106, 1262, 322))
img.save('1.png')