From 8376dba4174b15a3e6036c6019e0ff8ee2b05d5a Mon Sep 17 00:00:00 2001 From: Thaloria Date: Tue, 11 Oct 2022 17:22:46 +0200 Subject: [PATCH] added ui support to farm bot --- farm/Field_Representation.py | 4 ++- farm/artisent.jpg | Bin 0 -> 8921 bytes farm/farm_overlay.py | 66 +++++++++++++++++++++++++++++++++++ farm/main_farm_ui.py | 35 +++++++++++++++++++ utils.py | 19 ++++++++++ 5 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 farm/artisent.jpg create mode 100644 farm/farm_overlay.py create mode 100644 farm/main_farm_ui.py diff --git a/farm/Field_Representation.py b/farm/Field_Representation.py index f47d98f..9906942 100644 --- a/farm/Field_Representation.py +++ b/farm/Field_Representation.py @@ -51,6 +51,7 @@ class Field: colors.append(CHEMTRANT) colors.append(TENESENT) colors.append(CIBUTRANT) + colors.append(ARTISENT) def __init__(self): @@ -92,7 +93,8 @@ class Field: MAGINENT: cv.imread("maginent.jpg", cv.IMREAD_COLOR), CHEMTRANT: cv.imread("chemtrant.jpg", cv.IMREAD_COLOR), TENESENT: cv.imread("tenesent.jpg", cv.IMREAD_COLOR), - CIBUTRANT: cv.imread("cibutrant.jpg", cv.IMREAD_COLOR) + CIBUTRANT: cv.imread("cibutrant.jpg", cv.IMREAD_COLOR), + ARTISENT: cv.imread("artisent.jpg", cv.IMREAD_COLOR) } def reset(self): diff --git a/farm/artisent.jpg b/farm/artisent.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c6e40d507c4df6fb2fd7b7857be321dff2b6a947 GIT binary patch literal 8921 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 a#$QE>MQ2Y*=3N?6q>ditGG6Oq;XeSaZ?E(K literal 0 HcmV?d00001 diff --git a/farm/farm_overlay.py b/farm/farm_overlay.py new file mode 100644 index 0000000..ebc753d --- /dev/null +++ b/farm/farm_overlay.py @@ -0,0 +1,66 @@ +# Run tkinter code in another thread +import threading +import tkinter as tk +from tkinter import ttk + + +class FarmOverlay(threading.Thread): + + def __init__(self): + threading.Thread.__init__(self) + + self.run_mode = 'init' + + self.root = tk.Tk + + self.ButtonFrame = tk.Frame + + self.StartButton = tk.Button + self.StopButton = tk.Button + self.TkPosition = '133x52+60+600' + + self.StatusLabel = tk.Label + + self.start() + + def run(self): + self.root = tk.Tk() + self.ButtonFrame = tk.Frame(self.root) + self.StartButton = tk.Button(self.ButtonFrame, text="Start", command=self.start_button_callback, width='8') + self.StartButton.grid(row=0, column=0) + self.StopButton = tk.Button(self.ButtonFrame, text="Stop", command=self.stop_button_callback, width='8', + state=tk.DISABLED) + self.StopButton.grid(row=0, column=1) + + self.ButtonFrame.grid(row=3, column=0, columnspan=2) + + self.StatusLabel = tk.Label(self.root, text="", font=("Helvetica", 10, "bold"), + background="grey") + self.StatusLabel.grid(row=4, column=0, columnspan=2) + + # self.ClearButton.pack(side="top") + self.root.geometry(self.TkPosition) + self.root.overrideredirect(1) # fenster ohne aussen rum :-) + # self.root.attributes('-alpha', 0.7) # fenster transparent + self.root.attributes('-topmost', 1) # fenster immer im vordergrund + # self.root.wm_attributes("-disabled", True) + self.root.configure(background='black') + self.root.mainloop() + + def start_button_callback(self): + self.StartButton.configure(state=tk.DISABLED) + self.StopButton.configure(state=tk.NORMAL) + self.StatusLabel.configure(text='') + self.run_mode = 'started' + + def stop_button_callback(self): + self.StartButton.configure(state=tk.NORMAL) + self.StopButton.configure(state=tk.DISABLED) + self.run_mode = 'stopped' + + def get_run_mode(self): + return self.run_mode + + def update_status_label(self, mode, energy_to_go): + text = mode + ": " + str(energy_to_go) + self.StatusLabel.configure(text=text) diff --git a/farm/main_farm_ui.py b/farm/main_farm_ui.py new file mode 100644 index 0000000..93be0af --- /dev/null +++ b/farm/main_farm_ui.py @@ -0,0 +1,35 @@ +from Field_Representation import Field +from time import time +import cv2 as cv +import keyboard +from farm_overlay import FarmOverlay + + +def run(): + field = Field() + overlay = FarmOverlay() + + while True: + if overlay.run_mode == 'stopped': + overlay.update_status_label("stopped", "0") + overlay.run_mode = 'init' + continue + elif overlay.run_mode == 'started': + cv.waitKey(500) + elif overlay.run_mode == 'init': + continue + else: + # boelk + pass + + while True: + if overlay.run_mode == 'stopped': + break + + cords = field.assess_playfield_and_make_move() + print(cords) + cv.waitKey(1000) + + +if __name__ == "__main__": + run() diff --git a/utils.py b/utils.py index 6d77d82..1eb06af 100644 --- a/utils.py +++ b/utils.py @@ -12,6 +12,7 @@ import cv2 as cv import pydirectinput import keyboard + def mse(imageA, imageB): # the 'Mean Squared Error' between the two images is the # sum of the squared difference between the two images; @@ -173,3 +174,21 @@ def check_for_ok_button(cap_win, vis, conf): for pointi in pointis: dig_point(pointi[0] + offset_left, pointi[1] + offset_down, 150) +def check_for_craft_button(cap_win, vis, conf): + screenshot = cap_win.get_screenshot() + needle = cv.imread("play.jpg", cv.IMREAD_UNCHANGED) + rectangles = vis.find(screenshot, needle, 0.7, 1) + if len(rectangles) == 1: + pointis = vis.get_click_points(rectangles) + for pointi in pointis: + dig_point(pointi[0], pointi[1], 150) + + +def get_click_point(rectangle): + # Loop over all the rectangles + x, y, w, h = rectangle + # Determine the center position + center_x = x + int(w / 2) + center_y = y + int(h / 2) + # Save the points + return int(center_x), int(center_y)