From 8bbc9bb27760a82257328b92ed932a3628394c54 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Sat, 11 May 2024 18:22:54 +0800 Subject: [PATCH] Add: Parse planner results --- .../share/planner/result/CALCULATE_TITLE.png | Bin 0 -> 7881 bytes assets/share/planner/result/DETAIL_TITLE.png | Bin 0 -> 8749 bytes .../share/planner/result/MATERIAL_TITLE.png | Bin 0 -> 8411 bytes assets/share/planner/result/OCR_RESULT.png | Bin 0 -> 7235 bytes .../planner/result/RESULT_CHECK.SEARCH.png | Bin 0 -> 6996 bytes assets/share/planner/result/RESULT_CHECK.png | Bin 0 -> 7623 bytes assets/share/planner/result/RESULT_SCROLL.png | Bin 0 -> 8164 bytes tasks/planner/assets/assets_planner_result.py | 65 ++++++ tasks/planner/result.py | 202 ++++++++++++++++++ 9 files changed, 267 insertions(+) create mode 100644 assets/share/planner/result/CALCULATE_TITLE.png create mode 100644 assets/share/planner/result/DETAIL_TITLE.png create mode 100644 assets/share/planner/result/MATERIAL_TITLE.png create mode 100644 assets/share/planner/result/OCR_RESULT.png create mode 100644 assets/share/planner/result/RESULT_CHECK.SEARCH.png create mode 100644 assets/share/planner/result/RESULT_CHECK.png create mode 100644 assets/share/planner/result/RESULT_SCROLL.png create mode 100644 tasks/planner/assets/assets_planner_result.py create mode 100644 tasks/planner/result.py diff --git a/assets/share/planner/result/CALCULATE_TITLE.png b/assets/share/planner/result/CALCULATE_TITLE.png new file mode 100644 index 0000000000000000000000000000000000000000..5850f57a11dbd050569c5fcc35c64f8c568f677a GIT binary patch literal 7881 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 literal 0 HcmV?d00001 diff --git a/assets/share/planner/result/DETAIL_TITLE.png b/assets/share/planner/result/DETAIL_TITLE.png new file mode 100644 index 0000000000000000000000000000000000000000..f4386bf44fef7b98e7471f670728ff2b84b43ee1 GIT binary patch literal 8749 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 Cn~YQd literal 0 HcmV?d00001 diff --git a/assets/share/planner/result/MATERIAL_TITLE.png b/assets/share/planner/result/MATERIAL_TITLE.png new file mode 100644 index 0000000000000000000000000000000000000000..a60a04717b1a76f423e5ec01a5a8bb6c4f81ead3 GIT binary patch literal 8411 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 literal 0 HcmV?d00001 diff --git a/assets/share/planner/result/OCR_RESULT.png b/assets/share/planner/result/OCR_RESULT.png new file mode 100644 index 0000000000000000000000000000000000000000..14f8d7fe356bf1165235d0cc6f45bbea4f3b1693 GIT binary patch literal 7235 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 literal 0 HcmV?d00001 diff --git a/assets/share/planner/result/RESULT_CHECK.png b/assets/share/planner/result/RESULT_CHECK.png new file mode 100644 index 0000000000000000000000000000000000000000..6b183abbd2fae376e535d6cd11545ffcaa180822 GIT binary patch literal 7623 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 Byt)7Y literal 0 HcmV?d00001 diff --git a/tasks/planner/assets/assets_planner_result.py b/tasks/planner/assets/assets_planner_result.py new file mode 100644 index 000000000..46dc97ab0 --- /dev/null +++ b/tasks/planner/assets/assets_planner_result.py @@ -0,0 +1,65 @@ +from module.base.button import Button, ButtonWrapper + +# This file was auto-generated, do not modify it manually. To generate: +# ``` python -m dev_tools.button_extract ``` + +CALCULATE_TITLE = ButtonWrapper( + name='CALCULATE_TITLE', + share=Button( + file='./assets/share/planner/result/CALCULATE_TITLE.png', + area=(264, 187, 346, 207), + search=(244, 167, 366, 227), + color=(141, 143, 161), + button=(264, 187, 346, 207), + ), +) +DETAIL_TITLE = ButtonWrapper( + name='DETAIL_TITLE', + share=Button( + file='./assets/share/planner/result/DETAIL_TITLE.png', + area=(263, 402, 346, 422), + search=(243, 382, 366, 442), + color=(144, 146, 164), + button=(263, 402, 346, 422), + ), +) +MATERIAL_TITLE = ButtonWrapper( + name='MATERIAL_TITLE', + share=Button( + file='./assets/share/planner/result/MATERIAL_TITLE.png', + area=(263, 194, 346, 214), + search=(243, 174, 366, 234), + color=(135, 136, 156), + button=(263, 194, 346, 214), + ), +) +OCR_RESULT = ButtonWrapper( + name='OCR_RESULT', + share=Button( + file='./assets/share/planner/result/OCR_RESULT.png', + area=(331, 104, 1201, 592), + search=(311, 84, 1221, 612), + color=(254, 254, 254), + button=(331, 104, 1201, 592), + ), +) +RESULT_CHECK = ButtonWrapper( + name='RESULT_CHECK', + share=Button( + file='./assets/share/planner/result/RESULT_CHECK.png', + area=(263, 128, 324, 148), + search=(255, 103, 355, 593), + color=(132, 119, 92), + button=(263, 128, 324, 148), + ), +) +RESULT_SCROLL = ButtonWrapper( + name='RESULT_SCROLL', + share=Button( + file='./assets/share/planner/result/RESULT_SCROLL.png', + area=(1238, 104, 1245, 592), + search=(1218, 84, 1265, 612), + color=(33, 44, 62), + button=(1238, 104, 1245, 592), + ), +) diff --git a/tasks/planner/result.py b/tasks/planner/result.py new file mode 100644 index 000000000..e4725e3aa --- /dev/null +++ b/tasks/planner/result.py @@ -0,0 +1,202 @@ +import cv2 +from pponnxcr.predict_system import BoxedResult +from pydantic import BaseModel + +from module.base.utils import area_center, area_in_area +from module.logger import logger +from module.ocr.ocr import OcrWhiteLetterOnComplexBackground +from module.ui.scroll import AdaptiveScroll +from tasks.daily.synthesize import SynthesizeUI +from tasks.planner.assets.assets_planner_result import * +from tasks.planner.keywords import ITEM_CLASSES +from tasks.planner.keywords.classes import ItemBase, ItemCurrency + +CALCULATE_TITLE.load_search(RESULT_CHECK.search) +MATERIAL_TITLE.load_search(RESULT_CHECK.search) +DETAIL_TITLE.load_search(RESULT_CHECK.search) + + +class PlannerResultRow(BaseModel): + item: ItemBase + total: int + synthesize: int + demand: int + + def __eq__(self, other): + return self.item == other.item + + +class OcrPlannerResult(OcrWhiteLetterOnComplexBackground): + def __init__(self): + # Planner currently CN only + super().__init__(OCR_RESULT, lang='cn') + self.limited_area = OCR_RESULT.area + self.limit_y = 720 + + def filter_detected(self, result: BoxedResult) -> bool: + if not area_in_area(result.box, self.limited_area, threshold=0): + return False + if area_center(result.box)[1] > self.limit_y: + return False + return True + + def detect_and_ocr(self, image, *args, **kwargs): + # Remove rows below DETAIL_TITLE + if DETAIL_TITLE.match_template(image): + self.limit_y = DETAIL_TITLE.button[3] + else: + self.limit_y = 720 + return super().detect_and_ocr(image, *args, **kwargs) + + def pre_process(self, image): + r, g, b = cv2.split(image) + cv2.max(r, g, dst=r) + cv2.max(r, b, dst=r) + image = cv2.merge([r, r, r]) + return image + + +class PlannerResult(SynthesizeUI): + def is_in_planner_result(self): + if self.appear(RESULT_CHECK): + return True + if self.appear(CALCULATE_TITLE): + return True + if self.appear(MATERIAL_TITLE): + return True + if self.appear(DETAIL_TITLE): + return True + return False + + def parse_planner_result_page(self) -> list[PlannerResultRow]: + """ + Pages: + in: planner result + """ + ocr = OcrPlannerResult() + results = ocr.detect_and_ocr(self.device.image) + + x_total = 842 + x_synthesize = 965 + x_demand = 1129 + + def x_match(result: BoxedResult, x): + rx = area_center(result.box)[0] + return x - 50 <= rx <= x + 50 + + def y_match(result: BoxedResult, y): + rx = area_center(result.box)[1] + return y - 15 <= rx <= y + 15 + + # Split columns + list_item = [r for r in results + if not r.ocr_text.isdigit() and ocr._match_result(r.ocr_text, keyword_classes=ITEM_CLASSES)] + list_number = [r for r in results if r.ocr_text.isdigit()] + list_total = [r for r in list_number if x_match(r, x_total)] + list_synthesize = [r for r in list_number if x_match(r, x_synthesize)] + list_demand = [r for r in list_number if x_match(r, x_demand)] + + # Structure + out: list[PlannerResultRow] = [] + for item in list_item: + y_item = area_center(item.box)[1] + total = -1 + for number in list_total: + if y_match(number, y_item): + total = int(number.ocr_text) + break + synthesize = -1 + for number in list_synthesize: + if y_match(number, y_item): + synthesize = int(number.ocr_text) + break + demand = -1 + for number in list_demand: + if y_match(number, y_item): + demand = int(number.ocr_text) + break + item = ocr._match_result(item.ocr_text, keyword_classes=ITEM_CLASSES) + row = PlannerResultRow( + item=item, + total=total, + synthesize=synthesize, + demand=demand + ) + # Validate item + # print(row) + if row.total <= 0: + logger.warning(f'Planner row with total <= 0, {row}') + continue + if row.synthesize < 0: + # Credits always have synthesize="-" + if row.item.__class__ != ItemCurrency: + logger.warning(f'Planner row with synthesize < 0, {row}') + continue + if row.demand < 0: + logger.warning(f'Planner row with demand < 0, {row}') + continue + # Add + out.append(row) + + logger.info(f'parse_planner_result_page: {out}') + return out + + def parse_planner_result(self, skip_first_screenshot=True) -> list[PlannerResultRow]: + """ + Pages: + in: planner result + """ + logger.hr('Parse planner result') + scroll = AdaptiveScroll(RESULT_SCROLL.button, name=RESULT_SCROLL.name) + scroll.drag_threshold = 0.1 + scroll.edge_threshold = 0.1 + scroll.parameters = { + 'height': 50, + 'prominence': 15, + 'width': 5, + } + if not skip_first_screenshot: + self.device.screenshot() + skip_first_screenshot = False + if not scroll.at_top(main=self): + scroll.set_top(main=self) + + out = [] + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() + + # Skip first page + if self.appear(CALCULATE_TITLE): + scroll.next_page(main=self, page=0.75) + continue + + # Parse + rows = self.parse_planner_result_page() + for row in rows: + if row not in out: + out.append(row) + logger.attr('PlannerResult', len(rows)) + + # Scroll + if scroll.at_bottom(main=self): + logger.info('Reached scroll end, stop') + break + elif self.appear(DETAIL_TITLE): + logger.info('Reached DETAIL_TITLE, stop') + break + else: + scroll.next_page(main=self, page=0.8) + + logger.hr('Planner Result') + for row in out: + logger.info(f'Item: {row.item.name}, {row.total}, {row.synthesize}, {row.demand}') + return out + + +if __name__ == '__main__': + self = PlannerResult('src') + self.device.screenshot() + self.parse_planner_result()