From d25688083c92eba6d930b8b57e882d4830760db7 Mon Sep 17 00:00:00 2001 From: Ivan Maslov Date: Thu, 14 Jul 2022 17:25:30 +0300 Subject: [PATCH] Fixes + new defs --- Sources/GuideSphinx/Robot/07_screen.rst | 3 ++ Sources/pyOpenRPA/Robot/Keyboard.py | 16 +++++++++ Sources/pyOpenRPA/Robot/Mouse.py | 3 +- Sources/pyOpenRPA/Robot/Screen.py | 44 +++++++++++++++++-------- 4 files changed, 51 insertions(+), 15 deletions(-) diff --git a/Sources/GuideSphinx/Robot/07_screen.rst b/Sources/GuideSphinx/Robot/07_screen.rst index 2df970bd..18607164 100644 --- a/Sources/GuideSphinx/Robot/07_screen.rst +++ b/Sources/GuideSphinx/Robot/07_screen.rst @@ -64,6 +64,9 @@ LD|CD|RD - "RD" - правый край по горизонтали, нижний край по вертикали - "RU" - правый край по горизонтали, верхний край по вертикали +X-10 - корректировка координаты по оси X на 10 пикселей влево +Y+20 - корректировка координаты по оси Y на 20 пикселей вниз + ************************************************ Символьное указание области (inAnchorRuleStr) diff --git a/Sources/pyOpenRPA/Robot/Keyboard.py b/Sources/pyOpenRPA/Robot/Keyboard.py index d6cbacc5..d44b7f1d 100644 --- a/Sources/pyOpenRPA/Robot/Keyboard.py +++ b/Sources/pyOpenRPA/Robot/Keyboard.py @@ -225,6 +225,22 @@ def HotkeyCombination(*inKeyList, inDelaySecFloat = 0.3,inWaitAfterSecFloat:floa time.sleep(inDelaySecFloat) time.sleep(inWaitAfterSecFloat) +def HotkeyCtrlV(inWaitAfterSecFloat:float=0.4) -> None: + """Выполнить вставку текста из буфера обмена + ВНИМАНИЕ! НЕ ЗАВИСИТ ОТ ТЕКУЩЕЙ РАСКЛАДКИ КЛАВИАТУРЫ + + .. code-block:: python + + # Keyboard: Взаимодействие с клавиатурой + from pyOpenRPA.Robot import Keyboard + Keyboard.HotkeyCtrlV() + + :param inWaitAfterSecFloat: Количество секунд, которые ожидать после выполнения операции. По умолчанию установлено в настройках модуля Keyboard (базовое значение 0.4) + :type inWaitAfterSecFloat: float, опциональный + """ + HotkeyCombination(KEY_HOT_CTRL_LEFT,KEY_ENG_V) # Ctrl + v + time.sleep(inWaitAfterSecFloat) + def HotkeyCtrlA_CtrlC(inWaitAfterSecFloat:float=0.4) -> None: """Выполнить выделение текста, после чего скопировать его в буфер обмена ВНИМАНИЕ! НЕ ЗАВИСИТ ОТ ТЕКУЩЕЙ РАСКЛАДКИ КЛАВИАТУРЫ diff --git a/Sources/pyOpenRPA/Robot/Mouse.py b/Sources/pyOpenRPA/Robot/Mouse.py index 446053c4..8641750b 100644 --- a/Sources/pyOpenRPA/Robot/Mouse.py +++ b/Sources/pyOpenRPA/Robot/Mouse.py @@ -48,8 +48,6 @@ def ClickDouble(inXInt:int=None, inYInt:int=None, inWaitAfterSecFloat:float=WAIT :type inXInt: int, опциональный :param inYInt: Целевая позиция указателя мыши по оси Y (вертикальная ось). :type inYInt: int, опциональный - :param inButtonStr: Номер кнопки, которую требуется нажать. Возможные варианты: 'left', 'middle', 'right' или 1, 2, 3. В остальных случаях инициирует исключение ValueError. По умолчанию 'left' - :type inButtonStr: str, опциональный :param inWaitAfterSecFloat: Количество секунд, которые ожидать после выполнения операции. По умолчанию установлено в настройках модуля Mouse (базовое значение 0.4) :type inWaitAfterSecFloat: float, опциональный """ @@ -151,6 +149,7 @@ def ScrollVertical(inScrollClickCountInt, inXInt=None, inYInt=None, inWaitAfterS :type inWaitAfterSecFloat: float, опциональный """ if inWaitAfterSecFloat == None: inWaitAfterSecFloat = WAIT_AFTER_SEC_FLOAT + inScrollClickCountInt = inScrollClickCountInt*-1 vscroll(inScrollClickCountInt, x=inXInt, y=inYInt) time.sleep(inWaitAfterSecFloat) diff --git a/Sources/pyOpenRPA/Robot/Screen.py b/Sources/pyOpenRPA/Robot/Screen.py index dcf22871..dc02d73e 100644 --- a/Sources/pyOpenRPA/Robot/Screen.py +++ b/Sources/pyOpenRPA/Robot/Screen.py @@ -315,7 +315,7 @@ def BoxOverlay(inBox1, inBox2) -> bool: """ return not ((inBox1.left>inBox2.left + inBox2.width or inBox2.left>inBox1.left + inBox1.width) or (inBox1.top>inBox2.top + inBox2.height or inBox2.top>inBox1.top + inBox1.height)) - +import re def BoxGetPoint(inBox, inPointRuleStr="CC") -> pyscreeze.Point: """Получить точку pyscreeze.Point по заданной прямоугольной области pyscreeze.Box и строковому параметру расположения inPointRuleStr. @@ -333,17 +333,27 @@ def BoxGetPoint(inBox, inPointRuleStr="CC") -> pyscreeze.Point: :return: Точка на экране :rtype: pyscreeze.Point """ + lPoint = None inPointRuleStr = inPointRuleStr.upper() - if "CC" in inPointRuleStr: return pyscreeze.Point(x=inBox.left + inBox.width/2,y=inBox.top + inBox.height/2) - elif "LU" in inPointRuleStr: return pyscreeze.Point(x=inBox.left,y=inBox.top) - elif "RU" in inPointRuleStr: return pyscreeze.Point(x=inBox.left + inBox.width,y=inBox.top) - elif "CU" in inPointRuleStr: return pyscreeze.Point(x=inBox.left + inBox.width/2,y=inBox.top) - elif "LC" in inPointRuleStr: return pyscreeze.Point(x=inBox.left,y=inBox.top + inBox.height/2) - elif "RC" in inPointRuleStr: return pyscreeze.Point(x=inBox.left + inBox.width,y=inBox.top + inBox.height/2) - elif "LD" in inPointRuleStr: return pyscreeze.Point(x=inBox.left,y=inBox.top + inBox.height) - elif "CD" in inPointRuleStr: return pyscreeze.Point(x=inBox.left + inBox.width/2,y=inBox.top + inBox.height) - elif "RD" in inPointRuleStr: return pyscreeze.Point(x=inBox.left + inBox.width,y=inBox.top + inBox.height) - + if "CC" in inPointRuleStr: lPoint = pyscreeze.Point(x=inBox.left + inBox.width/2,y=inBox.top + inBox.height/2) + elif "LU" in inPointRuleStr: lPoint = pyscreeze.Point(x=inBox.left,y=inBox.top) + elif "RU" in inPointRuleStr: lPoint = pyscreeze.Point(x=inBox.left + inBox.width,y=inBox.top) + elif "CU" in inPointRuleStr: lPoint = pyscreeze.Point(x=inBox.left + inBox.width/2,y=inBox.top) + elif "LC" in inPointRuleStr: lPoint = pyscreeze.Point(x=inBox.left,y=inBox.top + inBox.height/2) + elif "RC" in inPointRuleStr: lPoint = pyscreeze.Point(x=inBox.left + inBox.width,y=inBox.top + inBox.height/2) + elif "LD" in inPointRuleStr: lPoint = pyscreeze.Point(x=inBox.left,y=inBox.top + inBox.height) + elif "CD" in inPointRuleStr: lPoint = pyscreeze.Point(x=inBox.left + inBox.width/2,y=inBox.top + inBox.height) + elif "RD" in inPointRuleStr: lPoint = pyscreeze.Point(x=inBox.left + inBox.width,y=inBox.top + inBox.height) + # Корректировка при необходимости + lDXInt=0 + lDYInt=0 + lMatchY = re.search(r'.*Y([-+]?\d*).*', inPointRuleStr) + if lMatchY is not None: lDYInt=int(lMatchY.group(1)) + lMatchX = re.search(r'.*X([-+]?\d*).*', inPointRuleStr) + if lMatchX is not None: lDXInt=int(lMatchX.group(1)) + lPoint = PointModify(inPoint=lPoint,inDXInt=lDXInt,inDYInt=lDYInt) + return lPoint + def PointModify(inPoint, inDXInt, inDYInt) -> pyscreeze.Point: """Скорректировать точку pyscreeze.Point. @@ -589,7 +599,7 @@ def ImageWaitDisappear(inImgPathStr:str, inWaitSecFloat:float=IMAGE_WAIT_SEC_FLO time.sleep(inWaitIntervalSecFloat) return lResultList -def ImageClick(inImgPathStr:str,inBoxIndexInt:int = 0, inPointRuleStr:str="CC", inIsGrayModeBool:bool=False, inConfidenceFloat:float=1.0): +def ImageClick(inImgPathStr:str,inBoxIndexInt:int = 0, inPointRuleStr:str="CC", inIsGrayModeBool:bool=False, inConfidenceFloat:float=1.0, inWaitSecFloat:float=0, inWaitIntervalSecFloat:float = 0): """Выполнить поиск прямоугольной области по изображению. .. code-block:: python @@ -608,5 +618,13 @@ def ImageClick(inImgPathStr:str,inBoxIndexInt:int = 0, inPointRuleStr:str="CC", :type inIsGrayModeBool: bool, опционально :param inConfidenceFloat: Показатель точности. 1.0 - идентичное соответствие, 0.0 - полное несоответствие. По умолчанию 1.0 :type inConfidenceFloat: float, опционально + :param inWaitSecFloat: Время ожидания появления изображения в сек. По умолчанию 0 + :type inWaitSecFloat: float, опциональный + :param inWaitIntervalSecFloat: Интервал повторной проверки наличия изображения. По умолчанию 0 + :type inWaitIntervalSecFloat: float, опциональный """ - PointClick(BoxGetPoint(inBox=ImageLocateAll(inImgPathStr=inImgPathStr,inIsGrayModeBool=inIsGrayModeBool,inConfidenceFloat=inConfidenceFloat)[inBoxIndexInt],inPointRuleStr=inPointRuleStr)) + if inWaitSecFloat > 0: + lBoxList = ImageWaitAppear(inImgPathStr=inImgPathStr,inWaitSecFloat=inWaitSecFloat,inWaitIntervalSecFloat=inWaitIntervalSecFloat,inIsGrayModeBool=inIsGrayModeBool,inConfidenceFloat=inConfidenceFloat) + if len(lBoxList)>0: PointClick(inPoint=BoxGetPoint(lBoxList[inBoxIndexInt],inPointRuleStr=inPointRuleStr)) + else: + PointClick(BoxGetPoint(inBox=ImageLocateAll(inImgPathStr=inImgPathStr,inIsGrayModeBool=inIsGrayModeBool,inConfidenceFloat=inConfidenceFloat)[inBoxIndexInt],inPointRuleStr=inPointRuleStr))